@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.
- package/dist/index.js +8100 -48
- package/dist/index.js.map +1 -1
- package/dist/internal.js +8851 -31
- package/dist/internal.js.map +1 -1
- package/dist/react/index.js +11558 -27
- package/dist/react/index.js.map +1 -1
- package/dist/react/internal.js +12147 -43
- package/dist/react/internal.js.map +1 -1
- package/package.json +1 -1
- package/dist/__tests__/backwardCompatibility.test.js +0 -159
- package/dist/__tests__/backwardCompatibility.test.js.map +0 -1
- package/dist/__tests__/candleInvariant.test.js +0 -415
- package/dist/__tests__/candleInvariant.test.js.map +0 -1
- package/dist/__tests__/public-api-surface.js +0 -38
- package/dist/__tests__/public-api-surface.js.map +0 -1
- package/dist/__tests__/timeframeBoundary.test.js +0 -452
- package/dist/__tests__/timeframeBoundary.test.js.map +0 -1
- package/dist/api/DrawingManager.js +0 -190
- package/dist/api/DrawingManager.js.map +0 -1
- package/dist/api/EventBus.js +0 -44
- package/dist/api/EventBus.js.map +0 -1
- package/dist/api/IndicatorDAG.js +0 -316
- package/dist/api/IndicatorDAG.js.map +0 -1
- package/dist/api/IndicatorRegistry.js +0 -39
- package/dist/api/IndicatorRegistry.js.map +0 -1
- package/dist/api/LayoutManager.js +0 -51
- package/dist/api/LayoutManager.js.map +0 -1
- package/dist/api/PaneManager.js +0 -119
- package/dist/api/PaneManager.js.map +0 -1
- package/dist/api/ReferenceAPI.js +0 -153
- package/dist/api/ReferenceAPI.js.map +0 -1
- package/dist/api/TChart.js +0 -765
- package/dist/api/TChart.js.map +0 -1
- package/dist/api/createChart.js +0 -42
- package/dist/api/createChart.js.map +0 -1
- package/dist/api/drawing tools/fib gann menu/fibRetracement.js +0 -22
- package/dist/api/drawing tools/fib gann menu/fibRetracement.js.map +0 -1
- package/dist/api/drawing tools/lines menu/crossLine.js +0 -16
- package/dist/api/drawing tools/lines menu/crossLine.js.map +0 -1
- package/dist/api/drawing tools/lines menu/disjointChannel.js +0 -59
- package/dist/api/drawing tools/lines menu/disjointChannel.js.map +0 -1
- package/dist/api/drawing tools/lines menu/extendedLine.js +0 -17
- package/dist/api/drawing tools/lines menu/extendedLine.js.map +0 -1
- package/dist/api/drawing tools/lines menu/flatTopBottom.js +0 -41
- package/dist/api/drawing tools/lines menu/flatTopBottom.js.map +0 -1
- package/dist/api/drawing tools/lines menu/horizontal.js +0 -19
- package/dist/api/drawing tools/lines menu/horizontal.js.map +0 -1
- package/dist/api/drawing tools/lines menu/horizontalRay.js +0 -20
- package/dist/api/drawing tools/lines menu/horizontalRay.js.map +0 -1
- package/dist/api/drawing tools/lines menu/infoLine.js +0 -107
- package/dist/api/drawing tools/lines menu/infoLine.js.map +0 -1
- package/dist/api/drawing tools/lines menu/insidePitchfork.js +0 -31
- package/dist/api/drawing tools/lines menu/insidePitchfork.js.map +0 -1
- package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.js +0 -15
- package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.js.map +0 -1
- package/dist/api/drawing tools/lines menu/parallelChannel.js +0 -43
- package/dist/api/drawing tools/lines menu/parallelChannel.js.map +0 -1
- package/dist/api/drawing tools/lines menu/pitchfork.js +0 -12
- package/dist/api/drawing tools/lines menu/pitchfork.js.map +0 -1
- package/dist/api/drawing tools/lines menu/ray.js +0 -23
- package/dist/api/drawing tools/lines menu/ray.js.map +0 -1
- package/dist/api/drawing tools/lines menu/regressionTrend.js +0 -127
- package/dist/api/drawing tools/lines menu/regressionTrend.js.map +0 -1
- package/dist/api/drawing tools/lines menu/schiffPitchfork.js +0 -15
- package/dist/api/drawing tools/lines menu/schiffPitchfork.js.map +0 -1
- package/dist/api/drawing tools/lines menu/trendAngle.js +0 -51
- package/dist/api/drawing tools/lines menu/trendAngle.js.map +0 -1
- package/dist/api/drawing tools/lines menu/trendline.js +0 -11
- package/dist/api/drawing tools/lines menu/trendline.js.map +0 -1
- package/dist/api/drawing tools/lines menu/vertical.js +0 -11
- package/dist/api/drawing tools/lines menu/vertical.js.map +0 -1
- package/dist/api/drawing tools/pointers menu/crosshair.js +0 -16
- package/dist/api/drawing tools/pointers menu/crosshair.js.map +0 -1
- package/dist/api/drawing tools/pointers menu/cursor.js +0 -15
- package/dist/api/drawing tools/pointers menu/cursor.js.map +0 -1
- package/dist/api/drawing tools/pointers menu/demonstration.js +0 -30
- package/dist/api/drawing tools/pointers menu/demonstration.js.map +0 -1
- package/dist/api/drawing tools/pointers menu/dot.js +0 -23
- package/dist/api/drawing tools/pointers menu/dot.js.map +0 -1
- package/dist/api/drawing tools/shapes menu/rectangle.js +0 -19
- package/dist/api/drawing tools/shapes menu/rectangle.js.map +0 -1
- package/dist/api/drawing tools/shapes menu/text.js +0 -25
- package/dist/api/drawing tools/shapes menu/text.js.map +0 -1
- package/dist/api/drawingUtils.js +0 -83
- package/dist/api/drawingUtils.js.map +0 -1
- package/dist/core/CanvasLayer.js +0 -56
- package/dist/core/CanvasLayer.js.map +0 -1
- package/dist/core/Chart.js +0 -839
- package/dist/core/Chart.js.map +0 -1
- package/dist/core/CoordTransform.js +0 -224
- package/dist/core/CoordTransform.js.map +0 -1
- package/dist/core/Crosshair.js +0 -186
- package/dist/core/Crosshair.js.map +0 -1
- package/dist/core/IndicatorEngine.js +0 -181
- package/dist/core/IndicatorEngine.js.map +0 -1
- package/dist/core/InteractionManager.js +0 -698
- package/dist/core/InteractionManager.js.map +0 -1
- package/dist/core/PriceScale.js +0 -113
- package/dist/core/PriceScale.js.map +0 -1
- package/dist/core/Series.js +0 -114
- package/dist/core/Series.js.map +0 -1
- package/dist/core/TimeScale.js +0 -150
- package/dist/core/TimeScale.js.map +0 -1
- package/dist/datafeed/DatafeedConnector.js +0 -268
- package/dist/datafeed/DatafeedConnector.js.map +0 -1
- package/dist/engine/CandleEngine.js +0 -318
- package/dist/engine/CandleEngine.js.map +0 -1
- package/dist/engine/__tests__/CandleEngine.test.js +0 -300
- package/dist/engine/__tests__/CandleEngine.test.js.map +0 -1
- package/dist/engine/candleInvariants.js +0 -134
- package/dist/engine/candleInvariants.js.map +0 -1
- package/dist/engine/mergeUtils.js +0 -64
- package/dist/engine/mergeUtils.js.map +0 -1
- package/dist/engine/timeframeUtils.js +0 -100
- package/dist/engine/timeframeUtils.js.map +0 -1
- package/dist/licensing/ChartRuntimeResolver.js +0 -310
- package/dist/licensing/ChartRuntimeResolver.js.map +0 -1
- package/dist/licensing/LicenseManager.js +0 -114
- package/dist/licensing/LicenseManager.js.map +0 -1
- package/dist/licensing/__tests__/ChartRuntimeResolver.test.js +0 -177
- package/dist/licensing/__tests__/ChartRuntimeResolver.test.js.map +0 -1
- package/dist/licensing/__tests__/LicenseManager.test.js +0 -153
- package/dist/licensing/__tests__/LicenseManager.test.js.map +0 -1
- package/dist/licensing/licenseTypes.js +0 -2
- package/dist/licensing/licenseTypes.js.map +0 -1
- package/dist/pine/PineCompiler.js +0 -44
- package/dist/pine/PineCompiler.js.map +0 -1
- package/dist/pine/diagnostics.js +0 -11
- package/dist/pine/diagnostics.js.map +0 -1
- package/dist/pine/index.js +0 -5
- package/dist/pine/index.js.map +0 -1
- package/dist/pine/pine-ast.js +0 -19
- package/dist/pine/pine-ast.js.map +0 -1
- package/dist/pine/pine-lexer.js +0 -249
- package/dist/pine/pine-lexer.js.map +0 -1
- package/dist/pine/pine-parser.js +0 -416
- package/dist/pine/pine-parser.js.map +0 -1
- package/dist/pine/pine-transpiler.js +0 -260
- package/dist/pine/pine-transpiler.js.map +0 -1
- package/dist/pixi/LayerName.js +0 -35
- package/dist/pixi/LayerName.js.map +0 -1
- package/dist/pixi/PixiCandlestickRenderer.js +0 -107
- package/dist/pixi/PixiCandlestickRenderer.js.map +0 -1
- package/dist/pixi/PixiChart.js +0 -367
- package/dist/pixi/PixiChart.js.map +0 -1
- package/dist/pixi/PixiCrosshairRenderer.js +0 -110
- package/dist/pixi/PixiCrosshairRenderer.js.map +0 -1
- package/dist/pixi/PixiDrawingRenderer.js +0 -111
- package/dist/pixi/PixiDrawingRenderer.js.map +0 -1
- package/dist/pixi/PixiGridRenderer.js +0 -114
- package/dist/pixi/PixiGridRenderer.js.map +0 -1
- package/dist/pixi/PixiLayerManager.js +0 -92
- package/dist/pixi/PixiLayerManager.js.map +0 -1
- package/dist/react/canvas/ChartCanvas.js +0 -604
- package/dist/react/canvas/ChartCanvas.js.map +0 -1
- package/dist/react/canvas/ChartContextMenu.js +0 -5
- package/dist/react/canvas/ChartContextMenu.js.map +0 -1
- package/dist/react/canvas/ChartSettingsDialog.js +0 -28
- package/dist/react/canvas/ChartSettingsDialog.js.map +0 -1
- package/dist/react/canvas/IndicatorLabel.js +0 -196
- package/dist/react/canvas/IndicatorLabel.js.map +0 -1
- package/dist/react/canvas/IndicatorPane.js +0 -395
- package/dist/react/canvas/IndicatorPane.js.map +0 -1
- package/dist/react/canvas/PointerOverlay.js +0 -61
- package/dist/react/canvas/PointerOverlay.js.map +0 -1
- package/dist/react/canvas/toolbars/LeftToolbar.js +0 -407
- package/dist/react/canvas/toolbars/LeftToolbar.js.map +0 -1
- package/dist/react/hooks/useChartCapabilities.js +0 -66
- package/dist/react/hooks/useChartCapabilities.js.map +0 -1
- package/dist/react/shell/ManagedAppShell.js +0 -440
- package/dist/react/shell/ManagedAppShell.js.map +0 -1
- package/dist/react/trading/TradingBridge.js +0 -73
- package/dist/react/trading/TradingBridge.js.map +0 -1
- package/dist/react/workspace/ChartWorkspace.js +0 -42
- package/dist/react/workspace/ChartWorkspace.js.map +0 -1
- package/dist/react/workspace/FloatingPanel.js +0 -82
- package/dist/react/workspace/FloatingPanel.js.map +0 -1
- package/dist/react/workspace/IndicatorsDialog.js +0 -121
- package/dist/react/workspace/IndicatorsDialog.js.map +0 -1
- package/dist/react/workspace/LayoutMenu.js +0 -113
- package/dist/react/workspace/LayoutMenu.js.map +0 -1
- package/dist/react/workspace/SymbolSearchDialog.js +0 -245
- package/dist/react/workspace/SymbolSearchDialog.js.map +0 -1
- package/dist/react/workspace/TabBar.js +0 -29
- package/dist/react/workspace/TabBar.js.map +0 -1
- package/dist/react/workspace/toolbars/BottomToolbar.js +0 -236
- package/dist/react/workspace/toolbars/BottomToolbar.js.map +0 -1
- package/dist/react/workspace/toolbars/RightToolbar.js +0 -18
- package/dist/react/workspace/toolbars/RightToolbar.js.map +0 -1
- package/dist/react/workspace/toolbars/TopToolbar.js +0 -82
- package/dist/react/workspace/toolbars/TopToolbar.js.map +0 -1
- package/dist/renderers/CandlestickRenderer.js +0 -98
- package/dist/renderers/CandlestickRenderer.js.map +0 -1
- package/dist/renderers/HistogramRenderer.js +0 -50
- package/dist/renderers/HistogramRenderer.js.map +0 -1
- package/dist/renderers/LineRenderer.js +0 -64
- package/dist/renderers/LineRenderer.js.map +0 -1
- package/dist/theme/colors.js +0 -19
- package/dist/theme/colors.js.map +0 -1
- package/dist/tools/barDivergenceCheck.js +0 -200
- package/dist/tools/barDivergenceCheck.js.map +0 -1
- package/dist/trading/TradingOverlayStore.js +0 -139
- package/dist/trading/TradingOverlayStore.js.map +0 -1
- package/dist/trading/UnmanagedIngestion.js +0 -114
- package/dist/trading/UnmanagedIngestion.js.map +0 -1
- package/dist/trading/__tests__/ManagedTradingController.test.js +0 -271
- package/dist/trading/__tests__/ManagedTradingController.test.js.map +0 -1
- package/dist/trading/__tests__/TradingOverlayStore.test.js +0 -267
- package/dist/trading/__tests__/TradingOverlayStore.test.js.map +0 -1
- package/dist/trading/__tests__/UnmanagedIngestion.test.js +0 -170
- package/dist/trading/__tests__/UnmanagedIngestion.test.js.map +0 -1
- package/dist/trading/managed/ManagedTradingController.js +0 -247
- package/dist/trading/managed/ManagedTradingController.js.map +0 -1
- package/dist/trading/managed/managedCapabilities.js +0 -79
- package/dist/trading/managed/managedCapabilities.js.map +0 -1
- package/dist/trading/managed/managedTypes.js +0 -13
- package/dist/trading/managed/managedTypes.js.map +0 -1
- package/dist/trading/tradingTypes.js +0 -8
- package/dist/trading/tradingTypes.js.map +0 -1
- package/dist/tscript/TScriptIndicator.js +0 -47
- package/dist/tscript/TScriptIndicator.js.map +0 -1
- package/dist/tscript/ast.js +0 -22
- package/dist/tscript/ast.js.map +0 -1
- package/dist/tscript/lexer.js +0 -187
- package/dist/tscript/lexer.js.map +0 -1
- package/dist/tscript/parser.js +0 -318
- package/dist/tscript/parser.js.map +0 -1
- package/dist/tscript/runtime.js +0 -475
- package/dist/tscript/runtime.js.map +0 -1
- package/dist/tscript/series.js +0 -79
- package/dist/tscript/series.js.map +0 -1
- package/dist/types/IChart.js +0 -2
- package/dist/types/IChart.js.map +0 -1
- package/dist/types/IRenderer.js +0 -2
- package/dist/types/IRenderer.js.map +0 -1
- package/dist/types/ISeries.js +0 -2
- package/dist/types/ISeries.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internal.js","sourceRoot":"","sources":["../../src/react/internal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,kFAAkF;AAClF,cAAc,SAAS,CAAC;AAExB,iFAAiF;AACjF,oEAAoE;AACpE,2DAA2D;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAQ1D,gFAAgF;AAChF,8DAA8D;AAC9D,yCAAyC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAEnE,gFAAgF;AAChF,2EAA2E;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAG5D,sFAAsF;AACtF,6DAA6D;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,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/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/api/drawing%20tools/pointers%20menu/dot.ts","../../src/api/drawing%20tools/pointers%20menu/demonstration.ts","../../src/react/canvas/IndicatorLabel.tsx","../../src/react/canvas/IndicatorPane.tsx","../../src/react/canvas/toolbars/LeftToolbar.tsx","../../src/react/canvas/ChartContextMenu.tsx","../../src/react/canvas/ChartSettingsDialog.tsx","../../src/react/canvas/PointerOverlay.tsx","../../src/react/canvas/ChartCanvas.tsx","../../src/react/workspace/TabBar.tsx","../../src/react/workspace/LayoutMenu.tsx","../../src/react/workspace/SymbolSearchDialog.tsx","../../src/react/workspace/IndicatorsDialog.tsx","../../src/react/workspace/toolbars/TopToolbar.tsx","../../src/react/workspace/toolbars/RightToolbar.tsx","../../src/react/workspace/toolbars/BottomToolbar.tsx","../../src/react/workspace/ChartWorkspace.tsx","../../src/react/hooks/useChartCapabilities.ts","../../src/react/trading/TradingBridge.ts","../../src/react/shell/ManagedAppShell.tsx","../../src/react/workspace/FloatingPanel.tsx"],"names":["bar","m","_counter","nextId","timeframeToMs","result","uid","resolver","Series","pal","jsxs","jsx","useState","useRef","useEffect","Fragment","_TF_SECONDS","ChartCanvas","POINTER_TOOLS","subH","useCallback","forwardRef","ManagedAppShell","useImperativeHandle","config"],"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","/**\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 * 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 * IndicatorLabel — hover-menu label rendered over a chart pane.\n *\n * Shows the indicator display name in the top-left of a pane.\n * On hover a gear (configure) and × (remove) button appear inline, giving the\n * appearance that the menu is part of the label pill.\n */\n\nimport { useState } from 'react';\nimport type { IndicatorConfig, IndicatorInstance } from '@forgecharts/types';\n\n// ─── Script title extractor ────────────────────────────────────────────────────\n\nfunction _scriptTitle(src: string): string {\n const m = src.match(/indicator\\s*\\(\\s*[\"']([^\"']+)[\"']/);\n return m ? m[1]! : 'Script';\n}\n\n// ─── Display name helper ──────────────────────────────────────────────────────\n\nexport function indicatorDisplayName(config: IndicatorConfig): string {\n const p = (config.params ?? {}) as Record<string, unknown>;\n switch (config.type) {\n case 'sma': return `SMA(${p['period'] ?? 20})`;\n case 'ema': return `EMA(${p['period'] ?? 20})`;\n case 'wma': return `WMA(${p['period'] ?? 20})`;\n case 'rsi': return `RSI(${p['period'] ?? 14})`;\n case 'macd': return `MACD(${p['fast'] ?? 12},${p['slow'] ?? 26},${p['signal'] ?? 9})`;\n case 'bbands': return `BB(${p['period'] ?? 20},${p['multiplier'] ?? 2})`;\n case 'stochastic': return `Stoch(${p['k'] ?? 14},${p['d'] ?? 3})`;\n case 'atr': return `ATR(${p['period'] ?? 14})`;\n case 'obv': return 'OBV';\n case 'volume': return 'Volume';\n case 'script': return config.script ? _scriptTitle(config.script) : 'Script';\n default: return (config.type as string).toUpperCase();\n }\n}\n\n// ─── Param definitions for config dialog ─────────────────────────────────────\n\ntype ParamDef = { key: string; label: string; min?: number; step?: number };\n\nconst PARAM_DEFS: Record<string, ParamDef[]> = {\n sma: [{ key: 'period', label: 'Period', min: 1 }],\n ema: [{ key: 'period', label: 'Period', min: 1 }],\n wma: [{ key: 'period', label: 'Period', min: 1 }],\n rsi: [{ key: 'period', label: 'Period', min: 1 }],\n macd: [\n { key: 'fast', label: 'Fast', min: 1 },\n { key: 'slow', label: 'Slow', min: 1 },\n { key: 'signal', label: 'Signal', min: 1 },\n ],\n bbands: [\n { key: 'period', label: 'Period', min: 1 },\n { key: 'multiplier', label: 'Multiplier', min: 0.1, step: 0.1 },\n ],\n stochastic: [\n { key: 'k', label: 'K Period', min: 1 },\n { key: 'd', label: 'D Period', min: 1 },\n ],\n atr: [{ key: 'period', label: 'Period', min: 1 }],\n};\n\n// ─── IndicatorLabel ────────────────────────────────────────────────────────────\n\nexport function IndicatorLabel({\n indicator,\n color,\n onRemove,\n onConfigure,\n}: {\n indicator: IndicatorInstance;\n color?: string;\n onRemove: () => void;\n onConfigure: () => void;\n}) {\n const [hovered, setHovered] = useState(false);\n const name = indicatorDisplayName(indicator.config);\n const hasDefs = Boolean(PARAM_DEFS[indicator.config.type]);\n\n const btnStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 18,\n height: '100%',\n border: 'none',\n borderLeft: '1px solid rgba(255,255,255,0.08)',\n background: 'transparent',\n color: '#787b86',\n cursor: 'pointer',\n fontSize: 10,\n padding: 0,\n lineHeight: 1,\n flexShrink: 0,\n };\n\n return (\n <div\n style={{\n display: 'inline-flex',\n alignItems: 'stretch',\n height: 18,\n borderRadius: 3,\n overflow: 'hidden',\n background: 'rgba(0,0,0,0.5)',\n cursor: 'default',\n userSelect: 'none',\n }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n >\n {/* Name */}\n <span\n style={{\n color: color ?? '#d1d4dc',\n fontSize: 11,\n fontFamily: '-apple-system, BlinkMacSystemFont, sans-serif',\n fontWeight: 500,\n padding: '0 5px',\n display: 'flex',\n alignItems: 'center',\n }}\n >\n {name}\n </span>\n\n {/* Hover actions */}\n {hovered && (\n <>\n {hasDefs && (\n <button\n onClick={(e) => { e.stopPropagation(); onConfigure(); }}\n title=\"Configure\"\n style={btnStyle}\n >\n ⚙\n </button>\n )}\n <button\n onClick={(e) => { e.stopPropagation(); onRemove(); }}\n title=\"Remove\"\n style={{ ...btnStyle, borderRadius: '0 3px 3px 0' }}\n >\n ✕\n </button>\n </>\n )}\n </div>\n );\n}\n\n// ─── IndicatorConfigDialog ─────────────────────────────────────────────────────\n\nexport function IndicatorConfigDialog({\n indicator,\n onSave,\n onClose,\n}: {\n indicator: IndicatorInstance;\n onSave: (newConfig: IndicatorConfig) => void;\n onClose: () => void;\n}) {\n const defs = PARAM_DEFS[indicator.config.type] ?? [];\n const [values, setValues] = useState<Record<string, string>>(() => {\n const p = (indicator.config.params ?? {}) as Record<string, unknown>;\n return Object.fromEntries(defs.map((d) => [d.key, String(p[d.key] ?? '')]));\n });\n\n const handleSave = () => {\n const newParams: Record<string, number | string | boolean> = {\n ...(indicator.config.params ?? {}),\n };\n for (const def of defs) {\n const v = parseFloat(values[def.key] ?? '');\n if (!isNaN(v)) newParams[def.key] = v;\n }\n onSave({ ...indicator.config, params: newParams });\n };\n\n const name = indicatorDisplayName(indicator.config);\n\n return (\n <div\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 1000,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n {/* Backdrop */}\n <div\n onClick={onClose}\n style={{ position: 'absolute', inset: 0, background: 'rgba(0,0,0,0.55)' }}\n />\n\n {/* Panel */}\n <div\n style={{\n position: 'relative',\n background: '#1c2030',\n border: '1px solid #2a2e39',\n borderRadius: 8,\n padding: '20px 24px',\n minWidth: 280,\n zIndex: 1,\n boxShadow: '0 8px 32px rgba(0,0,0,0.6)',\n }}\n >\n {/* Header */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 20,\n }}\n >\n <span\n style={{\n color: '#d1d4dc',\n fontSize: 14,\n fontWeight: 600,\n fontFamily: '-apple-system, BlinkMacSystemFont, sans-serif',\n }}\n >\n {name}\n </span>\n <button\n onClick={onClose}\n style={{\n background: 'transparent',\n border: 'none',\n color: '#787b86',\n cursor: 'pointer',\n fontSize: 16,\n lineHeight: 1,\n padding: 0,\n }}\n >\n ✕\n </button>\n </div>\n\n {/* Fields */}\n {defs.map((def) => (\n <div key={def.key} style={{ marginBottom: 14 }}>\n <label\n style={{\n display: 'block',\n color: '#787b86',\n fontSize: 11,\n marginBottom: 4,\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n fontFamily: '-apple-system, BlinkMacSystemFont, sans-serif',\n }}\n >\n {def.label}\n </label>\n <input\n type=\"number\"\n value={values[def.key] ?? ''}\n min={def.min}\n step={def.step ?? 1}\n onChange={(e) =>\n setValues((v) => ({ ...v, [def.key]: e.target.value }))\n }\n style={{\n width: '100%',\n background: '#131722',\n border: '1px solid #2a2e39',\n borderRadius: 4,\n padding: '6px 8px',\n color: '#d1d4dc',\n fontSize: 13,\n outline: 'none',\n boxSizing: 'border-box',\n fontFamily: '-apple-system, BlinkMacSystemFont, sans-serif',\n }}\n />\n </div>\n ))}\n\n {defs.length === 0 && (\n <p\n style={{\n color: '#787b86',\n fontSize: 12,\n margin: '0 0 16px',\n fontFamily: '-apple-system, BlinkMacSystemFont, sans-serif',\n }}\n >\n No configurable parameters.\n </p>\n )}\n\n {/* Actions */}\n <div\n style={{\n display: 'flex',\n gap: 8,\n justifyContent: 'flex-end',\n marginTop: defs.length > 0 ? 8 : 0,\n }}\n >\n <button\n onClick={onClose}\n style={{\n background: 'transparent',\n border: '1px solid #2a2e39',\n borderRadius: 4,\n color: '#787b86',\n padding: '6px 16px',\n cursor: 'pointer',\n fontSize: 13,\n fontFamily: '-apple-system, BlinkMacSystemFont, sans-serif',\n }}\n >\n Cancel\n </button>\n {defs.length > 0 && (\n <button\n onClick={handleSave}\n style={{\n background: '#2962ff',\n border: 'none',\n borderRadius: 4,\n color: '#fff',\n padding: '6px 16px',\n cursor: 'pointer',\n fontSize: 13,\n fontWeight: 500,\n fontFamily: '-apple-system, BlinkMacSystemFont, sans-serif',\n }}\n >\n Apply\n </button>\n )}\n </div>\n </div>\n </div>\n );\n}\n","/**\n * IndicatorPane — Canvas 2D rendering of a single indicator sub-pane.\n *\n * Uses the main chart's CoordTransform for x-axis alignment, then computes\n * its own per-pane y-axis from indicator value ranges.\n */\n\nimport { useEffect, useRef } from 'react';\nimport type { OHLCV, IndicatorInstance, ChartTheme } from '@forgecharts/types';\nimport type { CoordTransform, DAGResult } from '../../';\nimport type { IndicatorPoint, MACDPoint } from '../../';\nimport { IndicatorLabel } from './IndicatorLabel';\n\n// ─── Constants ────────────────────────────────────────────────────────────────\n\n/** Width of the right-side price axis — must match the main chart's AXIS_WIDTH. */\nconst AXIS_W = 70;\n/** Vertical padding inside the pane (logical pixels). */\nconst PAD_T = 8;\nconst PAD_B = 8;\n\n// ─── Theme palettes ───────────────────────────────────────────────────────────\n\nconst PALETTE = {\n dark: {\n bg: '#131722',\n text: '#d1d4dc',\n muted: '#787b86',\n border: '#2a2e39',\n up: '#26a69a',\n down: '#ef5350',\n macdLine: '#2196f3',\n signalLine: '#ff9800',\n },\n light: {\n bg: '#ffffff',\n text: '#131722',\n muted: '#9098a1',\n border: '#e0e3eb',\n up: '#26a69a',\n down: '#ef5350',\n macdLine: '#1565c0',\n signalLine: '#e65100',\n },\n} as const;\n\ntype Pal = (typeof PALETTE)[keyof typeof PALETTE];\n\n// ─── Low-level draw helpers ───────────────────────────────────────────────────\n\nfunction _vy(value: number, min: number, max: number, topPad: number, plotH: number): number {\n if (max === min) return topPad + plotH / 2;\n return topPad + plotH * (1 - (value - min) / (max - min));\n}\n\nfunction _hline(\n ctx: CanvasRenderingContext2D,\n y: number,\n plotW: number,\n color: string,\n dash: number[] = [],\n): void {\n ctx.strokeStyle = color;\n ctx.lineWidth = 0.5;\n ctx.setLineDash(dash);\n ctx.beginPath();\n ctx.moveTo(0, y + 0.5);\n ctx.lineTo(plotW, y + 0.5);\n ctx.stroke();\n ctx.setLineDash([]);\n}\n\nfunction _axisLabels(\n ctx: CanvasRenderingContext2D,\n ticks: number[],\n min: number,\n max: number,\n topPad: number,\n plotH: number,\n canvasH: number,\n plotW: number,\n color: string,\n decimals = 0,\n): void {\n ctx.font = '9px -apple-system, BlinkMacSystemFont, sans-serif';\n ctx.fillStyle = color;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n for (const tick of ticks) {\n const y = _vy(tick, min, max, topPad, plotH);\n if (y < 2 || y > canvasH - 2) continue;\n ctx.fillText(tick.toFixed(decimals), plotW + 4, y);\n }\n}\n\n// ─── Per-indicator renderers ──────────────────────────────────────────────────\n\nfunction _renderRSI(\n ctx: CanvasRenderingContext2D,\n points: readonly IndicatorPoint[],\n transform: CoordTransform,\n plotW: number,\n h: number,\n lineColor: string,\n pal: Pal,\n): void {\n const plotH = h - PAD_T - PAD_B;\n const min = 0;\n const max = 100;\n const y70 = _vy(70, min, max, PAD_T, plotH);\n const y50 = _vy(50, min, max, PAD_T, plotH);\n const y30 = _vy(30, min, max, PAD_T, plotH);\n\n // Zone fills\n ctx.fillStyle = 'rgba(239,83,80,0.06)';\n ctx.fillRect(0, PAD_T, plotW, y70 - PAD_T);\n ctx.fillStyle = 'rgba(38,166,154,0.06)';\n ctx.fillRect(0, y30, plotW, h - PAD_B - y30);\n\n // Reference lines\n _hline(ctx, y70, plotW, pal.muted, [3, 3]);\n _hline(ctx, y50, plotW, pal.border);\n _hline(ctx, y30, plotW, pal.muted, [3, 3]);\n\n // Level labels inside plot area\n ctx.font = '9px sans-serif';\n ctx.fillStyle = pal.muted;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'bottom';\n ctx.fillText('70', 2, y70);\n ctx.textBaseline = 'top';\n ctx.fillText('30', 2, y30);\n\n // RSI line\n if (points.length > 0) {\n ctx.strokeStyle = lineColor;\n ctx.lineWidth = 1.5;\n ctx.beginPath();\n let started = false;\n for (const p of points) {\n const x = transform.timeToX(p.time);\n if (x < -20 || x > plotW + 20) { started = false; continue; }\n const y = _vy(p.value, min, max, PAD_T, plotH);\n if (!started) { ctx.moveTo(x, y); started = true; } else { ctx.lineTo(x, y); }\n }\n ctx.stroke();\n }\n\n _axisLabels(ctx, [0, 30, 50, 70, 100], min, max, PAD_T, plotH, h, plotW, pal.muted);\n}\n\nfunction _renderMACD(\n ctx: CanvasRenderingContext2D,\n points: readonly MACDPoint[],\n transform: CoordTransform,\n plotW: number,\n h: number,\n pal: Pal,\n): void {\n if (points.length === 0) return;\n const plotH = h - PAD_T - PAD_B;\n\n // Auto-scale to visible values\n let min = Infinity;\n let max = -Infinity;\n for (const p of points) {\n const x = transform.timeToX(p.time);\n if (x < -20 || x > plotW + 20) continue;\n min = Math.min(min, p.histogram, p.macd, p.signal);\n max = Math.max(max, p.histogram, p.macd, p.signal);\n }\n if (!isFinite(min)) { min = -0.01; max = 0.01; }\n const rangePad = (max - min) * 0.1 || 0.001;\n min -= rangePad; max += rangePad;\n\n // Zero line\n _hline(ctx, _vy(0, min, max, PAD_T, plotH), plotW, pal.border, [2, 2]);\n\n // Compute bar pixel width from consecutive timestamps\n let barPx = 5;\n if (points.length >= 2) {\n barPx = Math.max(1, Math.abs(transform.timeToX(points[1]!.time) - transform.timeToX(points[0]!.time)) * 0.7);\n }\n\n // Histogram bars\n const y0 = _vy(0, min, max, PAD_T, plotH);\n for (const p of points) {\n const x = transform.timeToX(p.time);\n if (x < -barPx || x > plotW + barPx) continue;\n const yH = _vy(p.histogram, min, max, PAD_T, plotH);\n ctx.fillStyle = p.histogram >= 0 ? `${pal.up}99` : `${pal.down}99`;\n ctx.fillRect(x - barPx / 2, Math.min(y0, yH), barPx, Math.abs(y0 - yH) || 1);\n }\n\n // MACD line\n ctx.strokeStyle = pal.macdLine;\n ctx.lineWidth = 1.5;\n ctx.beginPath();\n let started = false;\n for (const p of points) {\n const x = transform.timeToX(p.time);\n if (x < -20 || x > plotW + 20) { started = false; continue; }\n const y = _vy(p.macd, min, max, PAD_T, plotH);\n if (!started) { ctx.moveTo(x, y); started = true; } else { ctx.lineTo(x, y); }\n }\n ctx.stroke();\n\n // Signal line\n ctx.strokeStyle = pal.signalLine;\n ctx.lineWidth = 1;\n ctx.beginPath();\n started = false;\n for (const p of points) {\n const x = transform.timeToX(p.time);\n if (x < -20 || x > plotW + 20) { started = false; continue; }\n const y = _vy(p.signal, min, max, PAD_T, plotH);\n if (!started) { ctx.moveTo(x, y); started = true; } else { ctx.lineTo(x, y); }\n }\n ctx.stroke();\n\n const range = max - min;\n const dec = range < 0.1 ? 4 : range < 10 ? 2 : 0;\n _axisLabels(\n ctx,\n [min + range * 0.1, min + range * 0.5, min + range * 0.9],\n min, max, PAD_T, plotH, h, plotW, pal.muted, dec,\n );\n}\n\nfunction _renderVolume(\n ctx: CanvasRenderingContext2D,\n bars: readonly OHLCV[],\n points: readonly IndicatorPoint[],\n transform: CoordTransform,\n plotW: number,\n h: number,\n pal: Pal,\n): void {\n if (points.length === 0) return;\n const plotH = h - PAD_T - PAD_B;\n const min = 0;\n const max = Math.max(...points.map((p) => p.value));\n if (max === 0) return;\n\n const barMap = new Map(bars.map((b) => [b.time, b]));\n let barPx = 5;\n if (points.length >= 2) {\n barPx = Math.max(1, Math.abs(transform.timeToX(points[1]!.time) - transform.timeToX(points[0]!.time)) * 0.8);\n }\n\n const yBase = _vy(0, min, max, PAD_T, plotH);\n for (const p of points) {\n const x = transform.timeToX(p.time);\n if (x < -barPx || x > plotW + barPx) continue;\n const bar = barMap.get(p.time);\n const isUp = bar !== undefined ? bar.close >= bar.open : true;\n const yTop = _vy(p.value, min, max, PAD_T, plotH);\n ctx.fillStyle = isUp ? `${pal.up}99` : `${pal.down}99`;\n ctx.fillRect(x - barPx / 2, yTop, barPx, Math.abs(yBase - yTop) || 1);\n }\n\n _axisLabels(ctx, [max], min, max, PAD_T, plotH, h, plotW, pal.muted, 0);\n}\n\nfunction _renderLineIndicator(\n ctx: CanvasRenderingContext2D,\n points: readonly IndicatorPoint[],\n transform: CoordTransform,\n plotW: number,\n h: number,\n lineColor: string,\n pal: Pal,\n): void {\n if (points.length === 0) return;\n const plotH = h - PAD_T - PAD_B;\n\n // Auto-scale to visible values\n let min = Infinity;\n let max = -Infinity;\n for (const p of points) {\n const x = transform.timeToX(p.time);\n if (x < -20 || x > plotW + 20) continue;\n min = Math.min(min, p.value);\n max = Math.max(max, p.value);\n }\n if (!isFinite(min)) return;\n const rangePad = (max - min) * 0.1 || 1;\n min -= rangePad; max += rangePad;\n\n ctx.strokeStyle = lineColor;\n ctx.lineWidth = 1.5;\n ctx.beginPath();\n let started = false;\n for (const p of points) {\n const x = transform.timeToX(p.time);\n if (x < -20 || x > plotW + 20) { started = false; continue; }\n const y = _vy(p.value, min, max, PAD_T, plotH);\n if (!started) { ctx.moveTo(x, y); started = true; } else { ctx.lineTo(x, y); }\n }\n ctx.stroke();\n\n const range = max - min;\n const dec = range < 0.1 ? 4 : range < 10 ? 2 : 0;\n _axisLabels(ctx, [min + range * 0.25, min + range * 0.75], min, max, PAD_T, plotH, h, plotW, pal.muted, dec);\n}\n\n// ─── Label helper ─────────────────────────────────────────────────────────────\n\nfunction _indicatorLabel(type: string, params: Record<string, unknown> = {}): string {\n switch (type) {\n case 'rsi': return `RSI(${params['period'] ?? 14})`;\n case 'macd': return `MACD(${params['fast'] ?? 12},${params['slow'] ?? 26},${params['signal'] ?? 9})`;\n case 'volume': return 'Volume';\n case 'sma': return `SMA(${params['period'] ?? 20})`;\n case 'ema': return `EMA(${params['period'] ?? 20})`;\n case 'wma': return `WMA(${params['period'] ?? 20})`;\n default: return type.toUpperCase();\n }\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport type IndicatorPaneProps = {\n /** Indicators to render in this pane. */\n indicators: readonly IndicatorInstance[];\n /** Full bar dataset — still needed for volume bar up/down colouring. */\n bars: readonly OHLCV[];\n /** Shared coordinate transform from the main price chart. Null until chart mounts. */\n transform: CoordTransform | null;\n /** CSS height of this pane in pixels. */\n height: number;\n /** Colour theme — must match the main chart. */\n theme: ChartTheme;\n /** Pre-computed DAG results — keyed by indicator id. */\n computedResults: ReadonlyMap<string, DAGResult>;\n /** Called when the user clicks the × button on an indicator label. */\n onRemove?: (id: string) => void;\n /** Called when the user clicks the ⚙ button on an indicator label. */\n onConfigure?: (indicator: IndicatorInstance) => void;\n /** Ref to the current crosshair X pixel (from the price pane). Drawn as a synced vertical line. */\n crosshairXRef?: { current: number | null };\n};\n\nexport function IndicatorPane({\n indicators,\n bars,\n transform,\n height,\n theme,\n computedResults,\n crosshairXRef,\n onRemove,\n onConfigure,\n}: IndicatorPaneProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n // Stable ref to the draw function — rebuilt whenever data changes,\n // called each RAF frame to stay in sync with the candle layer.\n const drawFnRef = useRef<(() => void) | null>(null);\n\n useEffect(() => {\n drawFnRef.current = () => {\n const canvas = canvasRef.current;\n if (!canvas || !transform || indicators.length === 0) return;\n\n const dpr = window.devicePixelRatio ?? 1;\n const cssW = canvas.offsetWidth || (canvas.parentElement?.clientWidth ?? 800);\n const cssH = height;\n const physW = Math.round(cssW * dpr);\n const physH = Math.round(cssH * dpr);\n\n if (canvas.width !== physW || canvas.height !== physH) {\n canvas.width = physW;\n canvas.height = physH;\n }\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const pal = PALETTE[theme];\n\n ctx.save();\n ctx.scale(dpr, dpr);\n\n const w = cssW;\n const h = cssH;\n const plotW = w - AXIS_W;\n\n // Background\n ctx.fillStyle = pal.bg;\n ctx.fillRect(0, 0, w, h);\n\n // Top separator\n ctx.strokeStyle = pal.border;\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(0, 0.5);\n ctx.lineTo(w, 0.5);\n ctx.stroke();\n\n // Axis divider\n ctx.beginPath();\n ctx.moveTo(plotW + 0.5, 0);\n ctx.lineTo(plotW + 0.5, h);\n ctx.stroke();\n\n // Clip plot area so indicator lines don't bleed into axis\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, 0, plotW, h);\n ctx.clip();\n\n for (const indicator of indicators) {\n const result = computedResults.get(indicator.id);\n if (!result) continue;\n const color = indicator.config.color;\n\n switch (indicator.config.type) {\n case 'rsi':\n if (result.kind === 'series')\n _renderRSI(ctx, result.points, transform, plotW, h, color ?? '#7c4dff', pal);\n break;\n case 'macd':\n if (result.kind === 'macd')\n _renderMACD(ctx, result.points, transform, plotW, h, pal);\n break;\n case 'volume':\n if (result.kind === 'series')\n _renderVolume(ctx, bars, result.points, transform, plotW, h, pal);\n break;\n default:\n // sma, ema, wma, bbands, and any chained / custom indicators\n if (result.kind === 'series')\n _renderLineIndicator(ctx, result.points, transform, plotW, h, color ?? '#ffb300', pal);\n }\n }\n\n // ── Crosshair vertical line (synced from price pane) ────────────────\n const xhair = crosshairXRef?.current ?? null;\n if (xhair !== null && xhair >= 0 && xhair <= plotW) {\n ctx.strokeStyle = theme === 'dark' ? 'rgba(255,255,255,0.4)' : 'rgba(0,0,0,0.4)';\n ctx.lineWidth = 0.5;\n ctx.setLineDash([3, 3]);\n ctx.beginPath();\n ctx.moveTo(xhair + 0.5, 0);\n ctx.lineTo(xhair + 0.5, h);\n ctx.stroke();\n ctx.setLineDash([]);\n }\n\n ctx.restore(); // clip\n\n ctx.restore(); // dpr scale\n };\n // Draw immediately when data (not viewport) changes.\n drawFnRef.current();\n }, [computedResults, bars, height, indicators, transform, theme]);\n\n // RAF loop: redraw every frame so the pane tracks pan/zoom in the same\n // animation frame as the candle layer — no React state update needed.\n useEffect(() => {\n let rafId: number;\n const tick = () => {\n drawFnRef.current?.();\n rafId = requestAnimationFrame(tick);\n };\n rafId = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(rafId);\n }, []);\n\n const pal = PALETTE[theme];\n\n return (\n <div style={{ position: 'relative', width: '100%', height: `${height}px` }}>\n <canvas\n ref={canvasRef}\n style={{ width: '100%', height: `${height}px`, display: 'block' }}\n />\n {/* Indicator name labels — one per indicator in this pane */}\n <div\n style={{\n position: 'absolute',\n top: 4,\n left: 4,\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n pointerEvents: 'auto',\n zIndex: 2,\n }}\n >\n {indicators.map((ind) => (\n <IndicatorLabel\n key={ind.id}\n indicator={ind}\n color={pal.text}\n onRemove={() => onRemove?.(ind.id)}\n onConfigure={() => onConfigure?.(ind)}\n />\n ))}\n </div>\n </div>\n );\n}\n","import React, { useState, useEffect, useRef } from 'react';\nimport ReactDOM from 'react-dom';\nimport type { DrawingToolType, DrawingType, PointerToolType } from '../../../';\n\n// ─── Pointer tools ────────────────────────────────────────────────────────────\n\nconst POINTER_TOOLS: PointerToolType[] = ['cursor', 'crosshair', 'dot', 'demonstration'];\n\nconst POINTER_ICONS: Record<PointerToolType, React.ReactNode> = {\n cursor: (\n <svg viewBox=\"0 0 16 16\" width=\"15\" height=\"15\" fill=\"currentColor\">\n <path d=\"M4 1l8 7-4 1-2 5-2-13z\" />\n </svg>\n ),\n crosshair: (\n <svg viewBox=\"0 0 16 16\" width=\"15\" height=\"15\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.5\">\n {/* top arm */}\n <line x1=\"8\" y1=\"1\" x2=\"8\" y2=\"6\" />\n {/* bottom arm */}\n <line x1=\"8\" y1=\"10\" x2=\"8\" y2=\"15\" />\n {/* left arm */}\n <line x1=\"1\" y1=\"8\" x2=\"6\" y2=\"8\" />\n {/* right arm */}\n <line x1=\"10\" y1=\"8\" x2=\"15\" y2=\"8\" />\n </svg>\n ),\n dot: (\n <svg viewBox=\"0 0 16 16\" width=\"15\" height=\"15\" fill=\"currentColor\">\n <circle cx=\"8\" cy=\"8\" r=\"4\" />\n </svg>\n ),\n demonstration: (\n <svg viewBox=\"0 0 16 16\" width=\"15\" height=\"15\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.6\">\n <line x1=\"8\" y1=\"1\" x2=\"8\" y2=\"4.5\" />\n <line x1=\"8\" y1=\"11.5\" x2=\"8\" y2=\"15\" />\n <line x1=\"1\" y1=\"8\" x2=\"4.5\" y2=\"8\" />\n <line x1=\"11.5\" y1=\"8\" x2=\"15\" y2=\"8\" />\n <circle cx=\"8\" cy=\"8\" r=\"4\" />\n </svg>\n ),\n};\n\nconst POINTER_LABELS: Record<PointerToolType, string> = {\n cursor: 'Arrow',\n crosshair: 'Cross',\n dot: 'Dot',\n demonstration: 'Demonstration',\n};\n\n// ─── Lines menu data ──────────────────────────────────────────────────────────\n\ninterface LineItem {\n tool: string;\n label: string;\n shortcut?: string;\n icon: React.ReactNode;\n}\n\ninterface LineSection {\n heading: string;\n items: LineItem[];\n}\n\nconst LINES_SECTIONS: LineSection[] = [\n {\n heading: 'Lines',\n items: [\n {\n tool: 'trendline',\n label: 'Trendline',\n shortcut: 'Alt+T',\n icon: (\n <svg viewBox=\"0 0 18 18\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.8\">\n <line x1=\"2\" y1=\"14\" x2=\"16\" y2=\"4\" />\n <circle cx=\"2\" cy=\"14\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"16\" cy=\"4\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n ),\n },\n {\n tool: 'ray',\n label: 'Ray',\n icon: (\n <svg viewBox=\"0 0 18 18\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.8\">\n <line x1=\"2\" y1=\"13\" x2=\"16\" y2=\"5\" />\n <circle cx=\"2\" cy=\"13\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <polygon points=\"16,5 14,6.5 14.5,8.5\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n ),\n },\n {\n tool: 'infoLine',\n label: 'Info line',\n icon: (\n <svg viewBox=\"0 0 18 18\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.8\">\n <line x1=\"1\" y1=\"13\" x2=\"17\" y2=\"5\" />\n <polygon points=\"1,13 3,12 2.5,10\" fill=\"currentColor\" stroke=\"none\" />\n <polygon points=\"17,5 15,6.5 15.5,8.5\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n ),\n },\n {\n tool: 'extendedLine',\n label: 'Extended line',\n icon: (\n <svg viewBox=\"0 0 18 18\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.8\">\n <line x1=\"2\" y1=\"14\" x2=\"16\" y2=\"4\" />\n <circle cx=\"2\" cy=\"14\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <polygon points=\"16,4 14,5.5 14.5,7.5\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n ),\n },\n {\n tool: 'trendAngle',\n label: 'Trend angle',\n icon: (\n <svg viewBox=\"0 0 18 18\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.8\">\n <line x1=\"2\" y1=\"14\" x2=\"16\" y2=\"4\" />\n <path d=\"M 2 14 A 5 5 0 0 1 7.5 11.8\" strokeWidth=\"1.4\" />\n <text x=\"6.5\" y=\"16\" fontSize=\"5.5\" fill=\"currentColor\" stroke=\"none\" fontFamily=\"sans-serif\">θ</text>\n </svg>\n ),\n },\n {\n tool: 'horizontal',\n label: 'Horizontal line',\n shortcut: 'Alt+H',\n icon: (\n <svg viewBox=\"0 0 18 18\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.8\">\n <line x1=\"1\" y1=\"9\" x2=\"17\" y2=\"9\" />\n </svg>\n ),\n },\n {\n tool: 'horizontalRay',\n label: 'Horizontal ray',\n shortcut: 'Alt+J',\n icon: (\n <svg viewBox=\"0 0 18 18\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.8\">\n <line x1=\"3\" y1=\"9\" x2=\"17\" y2=\"9\" />\n <circle cx=\"3\" cy=\"9\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <polygon points=\"17,9 15,7.5 15,10.5\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n ),\n },\n {\n tool: 'vertical',\n label: 'Vertical line',\n shortcut: 'Alt+V',\n icon: (\n <svg viewBox=\"0 0 18 18\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.8\">\n <line x1=\"9\" y1=\"1\" x2=\"9\" y2=\"17\" />\n </svg>\n ),\n },\n {\n tool: 'crossLine',\n label: 'Cross line',\n shortcut: 'Alt+C',\n icon: (\n <svg viewBox=\"0 0 18 18\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.8\">\n <line x1=\"1\" y1=\"9\" x2=\"17\" y2=\"9\" />\n <line x1=\"9\" y1=\"1\" x2=\"9\" y2=\"17\" />\n </svg>\n ),\n },\n ],\n },\n {\n heading: 'Channels',\n items: [\n {\n tool: 'parallelChannel',\n label: 'Parallel channel',\n icon: (\n <svg viewBox=\"0 0 18 18\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.8\">\n <line x1=\"2\" y1=\"13\" x2=\"16\" y2=\"7\" />\n <line x1=\"2\" y1=\"9\" x2=\"16\" y2=\"3\" />\n </svg>\n ),\n },\n {\n tool: 'regressionTrend',\n label: 'Regression trend',\n icon: (\n <svg viewBox=\"0 0 18 18\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.8\">\n <line x1=\"2\" y1=\"13\" x2=\"16\" y2=\"5\" />\n <line x1=\"2\" y1=\"11\" x2=\"16\" y2=\"3\" strokeDasharray=\"2 2\" strokeWidth=\"1.2\" />\n <line x1=\"2\" y1=\"15\" x2=\"16\" y2=\"7\" strokeDasharray=\"2 2\" strokeWidth=\"1.2\" />\n </svg>\n ),\n },\n {\n tool: 'flatTopBottom',\n label: 'Flat top/bottom',\n icon: (\n <svg viewBox=\"0 0 18 18\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.8\">\n <line x1=\"2\" y1=\"5\" x2=\"16\" y2=\"5\" />\n <line x1=\"2\" y1=\"13\" x2=\"16\" y2=\"9\" />\n </svg>\n ),\n },\n {\n tool: 'disjointChannel',\n label: 'Disjoint channel',\n icon: (\n <svg viewBox=\"0 0 18 18\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.8\">\n <line x1=\"2\" y1=\"12\" x2=\"8\" y2=\"8\" />\n <line x1=\"10\" y1=\"10\" x2=\"16\" y2=\"6\" />\n <line x1=\"2\" y1=\"15\" x2=\"8\" y2=\"11\" strokeDasharray=\"2 2\" strokeWidth=\"1.2\" />\n <line x1=\"10\" y1=\"13\" x2=\"16\" y2=\"9\" strokeDasharray=\"2 2\" strokeWidth=\"1.2\" />\n </svg>\n ),\n },\n ],\n },\n {\n heading: 'Pitchforks',\n items: [\n {\n tool: 'pitchfork',\n label: 'Pitchfork',\n icon: (\n <svg viewBox=\"0 0 18 18\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.8\">\n <line x1=\"9\" y1=\"15\" x2=\"9\" y2=\"6\" />\n <line x1=\"9\" y1=\"6\" x2=\"4\" y2=\"2\" />\n <line x1=\"9\" y1=\"6\" x2=\"14\" y2=\"2\" />\n <line x1=\"4\" y1=\"2\" x2=\"14\" y2=\"2\" strokeWidth=\"1\" />\n </svg>\n ),\n },\n {\n tool: 'schiffPitchfork',\n label: 'Schiff pitchfork',\n icon: (\n <svg viewBox=\"0 0 18 18\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.8\">\n <line x1=\"9\" y1=\"15\" x2=\"9\" y2=\"7\" />\n <line x1=\"9\" y1=\"7\" x2=\"3.5\" y2=\"2\" />\n <line x1=\"9\" y1=\"7\" x2=\"14.5\" y2=\"2\" />\n <line x1=\"3.5\" y1=\"2\" x2=\"14.5\" y2=\"2\" strokeWidth=\"1\" />\n <circle cx=\"9\" cy=\"11\" r=\"1\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n ),\n },\n {\n tool: 'modifiedSchiffPitchfork',\n label: 'Modified Schiff pitchfork',\n icon: (\n <svg viewBox=\"0 0 18 18\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.8\">\n <line x1=\"9\" y1=\"16\" x2=\"9\" y2=\"8\" />\n <line x1=\"9\" y1=\"8\" x2=\"4\" y2=\"2\" />\n <line x1=\"9\" y1=\"8\" x2=\"14\" y2=\"2\" />\n <line x1=\"4\" y1=\"2\" x2=\"14\" y2=\"2\" strokeWidth=\"1\" />\n <line x1=\"6.5\" y1=\"5\" x2=\"11.5\" y2=\"5\" strokeWidth=\"1\" strokeDasharray=\"1.5 1.5\" />\n </svg>\n ),\n },\n {\n tool: 'insidePitchfork',\n label: 'Inside pitchfork',\n icon: (\n <svg viewBox=\"0 0 18 18\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.8\">\n <line x1=\"9\" y1=\"15\" x2=\"9\" y2=\"9\" />\n <line x1=\"4\" y1=\"2\" x2=\"14\" y2=\"2\" strokeWidth=\"1\" />\n <line x1=\"9\" y1=\"9\" x2=\"4\" y2=\"2\" />\n <line x1=\"9\" y1=\"9\" x2=\"14\" y2=\"2\" />\n </svg>\n ),\n },\n ],\n },\n];\n\nconst LINES_MENU_TOOLS = new Set<DrawingToolType>(\n LINES_SECTIONS.flatMap((s) => s.items.map((i) => i.tool as DrawingToolType)),\n);\n\nconst ALL_LINES_ITEMS = LINES_SECTIONS.flatMap((s) => s.items);\nconst LINES_ITEM_MAP = new Map<string, LineItem>(ALL_LINES_ITEMS.map((i) => [i.tool, i]));\nconst DEFAULT_LINES_TOOL = ALL_LINES_ITEMS[0]?.tool ?? 'trendline';\n\n// ─── Fibonacci & Gann menu data ───────────────────────────────────────────────\n\ntype FibGannTool =\n | 'fibRetracement'\n | 'trendBasedFibExtension'\n | 'fibChannel'\n | 'fibTimeZone'\n | 'fibSpeedResistanceFan'\n | 'trendBasedFibTime'\n | 'fibCircles'\n | 'fibSpiral'\n | 'fibSpeedResistanceArcs'\n | 'fibWedge'\n | 'pitchfan'\n | 'gannBox'\n | 'gannSquareFixed'\n | 'gannSquare'\n | 'gannFan';\n\ninterface FibGannItem {\n tool: FibGannTool;\n label: string;\n shortcut?: string;\n icon: React.ReactNode;\n}\n\ninterface FibGannSection {\n heading: string;\n items: FibGannItem[];\n}\n\nconst FIB_GANN_SECTIONS: FibGannSection[] = [\n {\n heading: 'Fibonacci',\n items: [\n {\n tool: 'fibRetracement',\n label: 'Fib retracement',\n shortcut: 'Alt+F',\n icon: (\n <svg viewBox=\"0 0 18 18\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.5\">\n <line x1=\"2\" y1=\"3\" x2=\"16\" y2=\"3\" />\n <line x1=\"2\" y1=\"6\" x2=\"16\" y2=\"6\" />\n <line x1=\"2\" y1=\"9\" x2=\"16\" y2=\"9\" />\n <line x1=\"2\" y1=\"12\" x2=\"16\" y2=\"12\" />\n <line x1=\"2\" y1=\"15\" x2=\"16\" y2=\"15\" />\n </svg>\n ),\n },\n {\n tool: 'trendBasedFibExtension',\n label: 'Trend-based fib extension',\n icon: (\n <svg viewBox=\"0 0 18 18\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.5\">\n <line x1=\"2\" y1=\"14\" x2=\"10\" y2=\"6\" />\n <line x1=\"10\" y1=\"6\" x2=\"16\" y2=\"3\" strokeDasharray=\"2 2\" strokeWidth=\"1.2\" />\n <line x1=\"10\" y1=\"9\" x2=\"16\" y2=\"9\" strokeWidth=\"1\" />\n <line x1=\"10\" y1=\"12\" x2=\"16\" y2=\"12\" strokeWidth=\"1\" />\n <line x1=\"10\" y1=\"14\" x2=\"16\" y2=\"14\" strokeWidth=\"1\" />\n <circle cx=\"2\" cy=\"14\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"10\" cy=\"6\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n ),\n },\n {\n tool: 'fibChannel',\n label: 'Fib channel',\n icon: (\n <svg viewBox=\"0 0 18 18\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.5\">\n <line x1=\"2\" y1=\"14\" x2=\"16\" y2=\"6\" />\n <line x1=\"2\" y1=\"11\" x2=\"16\" y2=\"3\" strokeWidth=\"1\" />\n <line x1=\"2\" y1=\"12.5\" x2=\"16\" y2=\"4.5\" strokeWidth=\"0.8\" strokeDasharray=\"2 2\" />\n <line x1=\"2\" y1=\"9\" x2=\"16\" y2=\"1\" strokeWidth=\"0.8\" strokeDasharray=\"2 2\" />\n </svg>\n ),\n },\n {\n tool: 'fibTimeZone',\n label: 'Fib time zone',\n icon: (\n <svg viewBox=\"0 0 18 18\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.5\">\n <line x1=\"3\" y1=\"2\" x2=\"3\" y2=\"16\" />\n <line x1=\"6\" y1=\"2\" x2=\"6\" y2=\"16\" strokeWidth=\"1\" />\n <line x1=\"10\" y1=\"2\" x2=\"10\" y2=\"16\" strokeWidth=\"1\" />\n <line x1=\"15\" y1=\"2\" x2=\"15\" y2=\"16\" strokeWidth=\"1\" />\n </svg>\n ),\n },\n {\n tool: 'fibSpeedResistanceFan',\n label: 'Fib speed resistance fan',\n icon: (\n <svg viewBox=\"0 0 18 18\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.5\">\n <line x1=\"2\" y1=\"15\" x2=\"16\" y2=\"2\" />\n <line x1=\"2\" y1=\"15\" x2=\"16\" y2=\"6\" strokeWidth=\"1\" />\n <line x1=\"2\" y1=\"15\" x2=\"16\" y2=\"10\" strokeWidth=\"1\" />\n <circle cx=\"2\" cy=\"15\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n ),\n },\n {\n tool: 'trendBasedFibTime',\n label: 'Trend-based fib time',\n icon: (\n <svg viewBox=\"0 0 18 18\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.5\">\n <line x1=\"2\" y1=\"13\" x2=\"9\" y2=\"5\" />\n <line x1=\"9\" y1=\"2\" x2=\"9\" y2=\"16\" strokeWidth=\"1\" />\n <line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"16\" strokeWidth=\"0.8\" />\n <line x1=\"15\" y1=\"2\" x2=\"15\" y2=\"16\" strokeWidth=\"0.8\" />\n </svg>\n ),\n },\n {\n tool: 'fibCircles',\n label: 'Fib circles',\n icon: (\n <svg viewBox=\"0 0 18 18\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.5\">\n <circle cx=\"5\" cy=\"13\" r=\"2\" />\n <circle cx=\"5\" cy=\"13\" r=\"4.5\" strokeWidth=\"1\" />\n <circle cx=\"5\" cy=\"13\" r=\"7.5\" strokeWidth=\"1\" />\n <circle cx=\"5\" cy=\"13\" r=\"1\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n ),\n },\n {\n tool: 'fibSpiral',\n label: 'Fib spiral',\n icon: (\n <svg viewBox=\"0 0 18 18\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.5\">\n <path d=\"M 9 9 Q 9 14 14 14 Q 14 4 4 4 Q 4 16 16 16\" />\n <circle cx=\"9\" cy=\"9\" r=\"1\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n ),\n },\n {\n tool: 'fibSpeedResistanceArcs',\n label: 'Fib speed resistance arcs',\n icon: (\n <svg viewBox=\"0 0 18 18\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.5\">\n <path d=\"M 2 15 A 4 4 0 0 1 6 11\" />\n <path d=\"M 2 15 A 8 8 0 0 1 10 7\" strokeWidth=\"1\" />\n <path d=\"M 2 15 A 13 13 0 0 1 15 2\" strokeWidth=\"1\" />\n <circle cx=\"2\" cy=\"15\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n ),\n },\n {\n tool: 'fibWedge',\n label: 'Fib wedge',\n icon: (\n <svg viewBox=\"0 0 18 18\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.5\">\n <line x1=\"2\" y1=\"15\" x2=\"16\" y2=\"3\" />\n <line x1=\"2\" y1=\"15\" x2=\"16\" y2=\"8\" />\n <line x1=\"2\" y1=\"15\" x2=\"16\" y2=\"12\" strokeWidth=\"1\" />\n <circle cx=\"2\" cy=\"15\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n ),\n },\n {\n tool: 'pitchfan',\n label: 'Pitchfan',\n icon: (\n <svg viewBox=\"0 0 18 18\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.5\">\n <line x1=\"2\" y1=\"15\" x2=\"16\" y2=\"3\" />\n <line x1=\"2\" y1=\"15\" x2=\"16\" y2=\"9\" strokeWidth=\"1\" />\n <line x1=\"2\" y1=\"15\" x2=\"16\" y2=\"15\" strokeWidth=\"1\" />\n <line x1=\"8\" y1=\"3\" x2=\"8\" y2=\"15\" strokeWidth=\"0.8\" strokeDasharray=\"2 2\" />\n <circle cx=\"2\" cy=\"15\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n ),\n },\n ],\n },\n {\n heading: 'Gann',\n items: [\n {\n tool: 'gannBox',\n label: 'Gann box',\n icon: (\n <svg viewBox=\"0 0 18 18\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.5\">\n <rect x=\"2\" y=\"3\" width=\"14\" height=\"12\" />\n <line x1=\"2\" y1=\"3\" x2=\"16\" y2=\"15\" strokeWidth=\"1\" />\n <line x1=\"2\" y1=\"15\" x2=\"16\" y2=\"3\" strokeWidth=\"1\" />\n </svg>\n ),\n },\n {\n tool: 'gannSquareFixed',\n label: 'Gann square fixed',\n icon: (\n <svg viewBox=\"0 0 18 18\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.5\">\n <rect x=\"3\" y=\"3\" width=\"12\" height=\"12\" />\n <line x1=\"3\" y1=\"9\" x2=\"15\" y2=\"9\" strokeWidth=\"0.8\" />\n <line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"15\" strokeWidth=\"0.8\" />\n <circle cx=\"9\" cy=\"9\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n ),\n },\n {\n tool: 'gannSquare',\n label: 'Gann square',\n icon: (\n <svg viewBox=\"0 0 18 18\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.5\">\n <rect x=\"3\" y=\"3\" width=\"12\" height=\"12\" />\n <line x1=\"3\" y1=\"3\" x2=\"15\" y2=\"15\" strokeWidth=\"1\" />\n <line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"15\" strokeWidth=\"0.8\" />\n <line x1=\"3\" y1=\"9\" x2=\"15\" y2=\"9\" strokeWidth=\"0.8\" />\n </svg>\n ),\n },\n {\n tool: 'gannFan',\n label: 'Gann fan',\n icon: (\n <svg viewBox=\"0 0 18 18\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.5\">\n <line x1=\"2\" y1=\"16\" x2=\"16\" y2=\"2\" />\n <line x1=\"2\" y1=\"16\" x2=\"16\" y2=\"6\" strokeWidth=\"1\" />\n <line x1=\"2\" y1=\"16\" x2=\"16\" y2=\"10\" strokeWidth=\"1\" />\n <line x1=\"2\" y1=\"16\" x2=\"16\" y2=\"16\" strokeWidth=\"0.8\" />\n <line x1=\"2\" y1=\"16\" x2=\"6\" y2=\"2\" strokeWidth=\"1\" />\n <circle cx=\"2\" cy=\"16\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n ),\n },\n ],\n },\n];\n\nconst FIB_GANN_TOOLS = new Set<DrawingToolType>(\n FIB_GANN_SECTIONS.flatMap((s) => s.items.map((i) => i.tool as DrawingToolType)),\n);\n\nconst FIB_GANN_ITEM_MAP = new Map<DrawingToolType, FibGannItem>(\n FIB_GANN_SECTIONS.flatMap((s) => s.items.map((i) => [i.tool as DrawingToolType, i])),\n);\n\n// ─── Other tools ──────────────────────────────────────────────────────────────\n\ntype OtherTool = 'rectangle' | 'text';\n\nconst OTHER_ICONS: Record<OtherTool, React.ReactNode> = {\n rectangle: (\n <svg viewBox=\"0 0 16 16\" width=\"15\" height=\"15\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"2\">\n <rect x=\"2\" y=\"4\" width=\"12\" height=\"8\" />\n </svg>\n ),\n text: (\n <svg viewBox=\"0 0 16 16\" width=\"15\" height=\"15\" fill=\"currentColor\">\n <text x=\"3\" y=\"13\" fontSize=\"13\" fontFamily=\"serif\" fontWeight=\"bold\">T</text>\n </svg>\n ),\n};\n\nconst OTHER_LABELS: Record<OtherTool, string> = {\n rectangle: 'Rectangle',\n text: 'Text',\n};\n\nconst OTHER_TOOL_ORDER: OtherTool[] = ['rectangle', 'text'];\n\n// ─── Unified drawing-tool item map (Lines + FibGann + Other) ─────────────────\n// Used by the floating favorites toolbar to look up icons/labels for any tool.\n\nconst ALL_DRAWING_ITEM_MAP = new Map<DrawingToolType, { label: string; icon: React.ReactNode }>([\n ...ALL_LINES_ITEMS.map((i) => [i.tool as DrawingToolType, i] as [DrawingToolType, { label: string; icon: React.ReactNode }]),\n ...FIB_GANN_SECTIONS.flatMap((s) => s.items).map((i) => [i.tool as DrawingToolType, i] as [DrawingToolType, { label: string; icon: React.ReactNode }]),\n ...OTHER_TOOL_ORDER.map((t) => [t as DrawingToolType, { label: OTHER_LABELS[t], icon: OTHER_ICONS[t] }] as [DrawingToolType, { label: string; icon: React.ReactNode }]),\n]);\n\n// ─── Star icon ────────────────────────────────────────────────────────────────\n\nfunction StarIcon({ filled }: { filled: boolean }): React.ReactElement {\n return (\n <svg\n viewBox=\"0 0 16 16\"\n width=\"13\"\n height=\"13\"\n fill={filled ? '#f5a623' : 'none'}\n stroke={filled ? '#f5a623' : 'currentColor'}\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M8 1.5l1.8 3.6 4 .58-2.9 2.83.68 3.99L8 10.35l-3.58 1.88.68-3.99L2.2 5.68l4-.58z\" />\n </svg>\n );\n}\n\n// ─── Pointer group ────────────────────────────────────────────────────────────\n\nfunction PointerGroup({\n activeTool,\n onSelectTool,\n}: {\n activeTool: DrawingToolType;\n onSelectTool: (tool: DrawingToolType) => void;\n}): React.ReactElement {\n const [flyoutOpen, setFlyoutOpen] = useState(false);\n const groupRef = useRef<HTMLDivElement>(null);\n\n const activePointer: PointerToolType = (POINTER_TOOLS as string[]).includes(activeTool)\n ? (activeTool as PointerToolType)\n : 'cursor';\n const isPointerActive = (POINTER_TOOLS as string[]).includes(activeTool);\n\n useEffect(() => {\n if (!flyoutOpen) return;\n const handler = (e: MouseEvent) => {\n if (groupRef.current && !groupRef.current.contains(e.target as Node)) setFlyoutOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [flyoutOpen]);\n\n return (\n <div ref={groupRef} className=\"dt-pointer-group\">\n <button\n className={`drawing-tool-btn dt-pointer-main${isPointerActive ? ' is-active' : ''}`}\n title={POINTER_LABELS[activePointer]}\n onClick={() => setFlyoutOpen((o) => !o)}\n >\n {POINTER_ICONS[activePointer]}\n </button>\n <button\n className={`dt-pointer-expand${flyoutOpen ? ' is-open' : ''}`}\n title=\"Pointer tools\"\n onClick={(e) => { e.stopPropagation(); setFlyoutOpen((o) => !o); }}\n >\n <svg viewBox=\"0 0 6 10\" width=\"5\" height=\"8\" fill=\"currentColor\">\n <path d=\"M1 1l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.4\" fill=\"none\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n {flyoutOpen && (\n <div className=\"dt-pointer-flyout\">\n <div className=\"dt-flyout-label\">Pointer</div>\n {POINTER_TOOLS.map((tool) => (\n <button\n key={tool}\n className={`dt-flyout-item${activeTool === tool ? ' is-active' : ''}`}\n onClick={() => { onSelectTool(tool); setFlyoutOpen(false); }}\n >\n <span className=\"dt-flyout-icon\">{POINTER_ICONS[tool]}</span>\n <span className=\"dt-flyout-name\">{POINTER_LABELS[tool]}</span>\n {activeTool === tool && <span className=\"dt-flyout-check\">✓</span>}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ─── Lines group ──────────────────────────────────────────────────────────────\n\nfunction LinesGroup({\n activeTool,\n favorites,\n onSelectTool,\n onFavoritesChange,\n}: {\n activeTool: DrawingToolType;\n favorites: DrawingToolType[];\n onSelectTool: (tool: DrawingToolType) => void;\n onFavoritesChange: (favs: DrawingToolType[]) => void;\n}): React.ReactElement {\n const [panelOpen, setPanelOpen] = useState(false);\n const groupRef = useRef<HTMLDivElement>(null);\n const isLinesActive = LINES_MENU_TOOLS.has(activeTool);\n const [lastTool, setLastTool] = useState<string>(DEFAULT_LINES_TOOL);\n\n const currentItem = (isLinesActive\n ? LINES_ITEM_MAP.get(activeTool as string)\n : LINES_ITEM_MAP.get(lastTool)) ?? LINES_ITEM_MAP.get(DEFAULT_LINES_TOOL)!;\n\n useEffect(() => {\n if (!panelOpen) return;\n const handler = (e: MouseEvent) => {\n if (groupRef.current && !groupRef.current.contains(e.target as Node)) setPanelOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [panelOpen]);\n\n const toggleFavorite = (tool: DrawingToolType, e: React.MouseEvent) => {\n e.stopPropagation();\n const next = favorites.includes(tool)\n ? favorites.filter((f) => f !== tool)\n : [...favorites, tool];\n onFavoritesChange(next);\n };\n\n return (\n <div ref={groupRef} className=\"dt-lines-group\">\n <button\n className={`drawing-tool-btn dt-lines-main${isLinesActive ? ' is-active' : ''}`}\n title={currentItem.label}\n onClick={() => setPanelOpen((o) => !o)}\n >\n {currentItem.icon}\n </button>\n <button\n className={`dt-pointer-expand${panelOpen ? ' is-open' : ''}`}\n title=\"Lines tools\"\n onClick={(e) => { e.stopPropagation(); setPanelOpen((o) => !o); }}\n >\n <svg viewBox=\"0 0 6 10\" width=\"5\" height=\"8\" fill=\"currentColor\">\n <path d=\"M1 1l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.4\" fill=\"none\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n {panelOpen && (\n <div className=\"dt-lines-panel\">\n {LINES_SECTIONS.map((section) => (\n <div key={section.heading} className=\"dt-lines-section\">\n <div className=\"dt-lines-heading\">{section.heading.toUpperCase()}</div>\n {section.items.map((item) => {\n const isFav = favorites.includes(item.tool as DrawingToolType);\n return (\n <button\n key={item.tool}\n className={`dt-lines-item dt-fibgann-item${activeTool === (item.tool as DrawingToolType) ? ' is-active' : ''}`}\n onClick={() => { setLastTool(item.tool); onSelectTool(item.tool as DrawingToolType); setPanelOpen(false); }}\n >\n <span className=\"dt-lines-icon\">{item.icon}</span>\n <span className=\"dt-lines-name\">{item.label}</span>\n {item.shortcut && <span className=\"dt-lines-shortcut\">{item.shortcut}</span>}\n <button\n className={`dt-star-btn${isFav ? ' is-starred' : ''}`}\n title={isFav ? 'Remove from favorites' : 'Add to favorites'}\n onClick={(e) => toggleFavorite(item.tool as DrawingToolType, e)}\n >\n <StarIcon filled={isFav} />\n </button>\n </button>\n );\n })}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ─── FibGann group ────────────────────────────────────────────────────────────\n\nfunction FibGannGroup({\n activeTool,\n favorites,\n onSelectTool,\n onFavoritesChange,\n}: {\n activeTool: DrawingToolType;\n favorites: DrawingToolType[];\n onSelectTool: (tool: DrawingToolType) => void;\n onFavoritesChange: (favs: DrawingToolType[]) => void;\n}): React.ReactElement {\n const [panelOpen, setPanelOpen] = useState(false);\n const groupRef = useRef<HTMLDivElement>(null);\n const isFibGannActive = FIB_GANN_TOOLS.has(activeTool);\n const [lastTool, setLastTool] = useState<DrawingToolType>('fibRetracement');\n\n const currentItem = (isFibGannActive\n ? FIB_GANN_ITEM_MAP.get(activeTool)\n : FIB_GANN_ITEM_MAP.get(lastTool)) ?? FIB_GANN_ITEM_MAP.get('fibRetracement')!;\n\n useEffect(() => {\n if (!panelOpen) return;\n const handler = (e: MouseEvent) => {\n if (groupRef.current && !groupRef.current.contains(e.target as Node)) setPanelOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [panelOpen]);\n\n const toggleFavorite = (tool: DrawingToolType, e: React.MouseEvent) => {\n e.stopPropagation();\n const next = favorites.includes(tool)\n ? favorites.filter((f) => f !== tool)\n : [...favorites, tool];\n onFavoritesChange(next);\n };\n\n return (\n <div ref={groupRef} className=\"dt-lines-group\">\n <button\n className={`drawing-tool-btn dt-lines-main${isFibGannActive ? ' is-active' : ''}`}\n title={currentItem.label}\n onClick={() => setPanelOpen((o) => !o)}\n >\n {currentItem.icon}\n </button>\n <button\n className={`dt-pointer-expand${panelOpen ? ' is-open' : ''}`}\n title=\"Fibonacci & Gann tools\"\n onClick={(e) => { e.stopPropagation(); setPanelOpen((o) => !o); }}\n >\n <svg viewBox=\"0 0 6 10\" width=\"5\" height=\"8\" fill=\"currentColor\">\n <path d=\"M1 1l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.4\" fill=\"none\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n {panelOpen && (\n <div className=\"dt-lines-panel dt-fibgann-panel\">\n {FIB_GANN_SECTIONS.map((section) => (\n <div key={section.heading} className=\"dt-lines-section\">\n <div className=\"dt-lines-heading\">{section.heading.toUpperCase()}</div>\n {section.items.map((item) => {\n const isFav = favorites.includes(item.tool as DrawingToolType);\n return (\n <button\n key={item.tool}\n className={`dt-lines-item dt-fibgann-item${activeTool === (item.tool as DrawingToolType) ? ' is-active' : ''}`}\n onClick={() => { setLastTool(item.tool as DrawingToolType); onSelectTool(item.tool as DrawingToolType); setPanelOpen(false); }}\n >\n <span className=\"dt-lines-icon\">{item.icon}</span>\n <span className=\"dt-lines-name\">{item.label}</span>\n {item.shortcut && <span className=\"dt-lines-shortcut\">{item.shortcut}</span>}\n <button\n className={`dt-star-btn${isFav ? ' is-starred' : ''}`}\n title={isFav ? 'Remove from favorites' : 'Add to favorites'}\n onClick={(e) => toggleFavorite(item.tool as DrawingToolType, e)}\n >\n <StarIcon filled={isFav} />\n </button>\n </button>\n );\n })}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ─── Favorites floating toolbar ───────────────────────────────────────────────\n\nfunction FavoritesFloatingToolbar({\n favorites,\n activeTool,\n onSelectTool,\n}: {\n favorites: DrawingToolType[];\n activeTool: DrawingToolType;\n onSelectTool: (tool: DrawingToolType) => void;\n}): React.ReactElement | null {\n const [pos, setPos] = useState({ x: 60, y: 60 });\n const [dragging, setDragging] = useState(false);\n const dragOffset = useRef({ x: 0, y: 0 });\n\n useEffect(() => {\n if (!dragging) return;\n const onMove = (e: MouseEvent) => {\n setPos({ x: e.clientX - dragOffset.current.x, y: e.clientY - dragOffset.current.y });\n };\n const onUp = () => setDragging(false);\n window.addEventListener('mousemove', onMove);\n window.addEventListener('mouseup', onUp);\n return () => {\n window.removeEventListener('mousemove', onMove);\n window.removeEventListener('mouseup', onUp);\n };\n }, [dragging]);\n\n const validFavs = favorites.filter((f) => ALL_DRAWING_ITEM_MAP.has(f));\n if (validFavs.length === 0) return null;\n\n return ReactDOM.createPortal(\n <div className=\"dt-favorites-toolbar\" style={{ left: pos.x, top: pos.y }}>\n <div\n className=\"dt-favorites-handle\"\n title=\"Drag to reposition\"\n onMouseDown={(e) => {\n dragOffset.current = { x: e.clientX - pos.x, y: e.clientY - pos.y };\n setDragging(true);\n e.preventDefault();\n }}\n >\n <svg viewBox=\"0 0 6 12\" width=\"4\" height=\"10\" fill=\"currentColor\" opacity=\"0.5\">\n <circle cx=\"1.5\" cy=\"2\" r=\"1.2\" />\n <circle cx=\"1.5\" cy=\"6\" r=\"1.2\" />\n <circle cx=\"1.5\" cy=\"10\" r=\"1.2\" />\n <circle cx=\"4.5\" cy=\"2\" r=\"1.2\" />\n <circle cx=\"4.5\" cy=\"6\" r=\"1.2\" />\n <circle cx=\"4.5\" cy=\"10\" r=\"1.2\" />\n </svg>\n </div>\n {validFavs.map((tool) => {\n const item = ALL_DRAWING_ITEM_MAP.get(tool)!;\n return (\n <button\n key={tool}\n className={`drawing-tool-btn dt-fav-btn${activeTool === tool ? ' is-active' : ''}`}\n title={item.label}\n onClick={() => onSelectTool(tool)}\n >\n {item.icon}\n </button>\n );\n })}\n </div>,\n document.body,\n );\n}\n\n// ─── Utility tools ────────────────────────────────────────────────────────────\n\nexport type VisibilityAction = 'hideDrawings' | 'hideIndicators' | 'hidePositions' | 'hideAll';\n\n// Reusable expand chevron SVG\nconst ExpandChevron = () => (\n <svg viewBox=\"0 0 6 10\" width=\"5\" height=\"8\" fill=\"currentColor\">\n <path d=\"M1 1l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.4\" fill=\"none\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\n// ─── Visibility tool ──────────────────────────────────────────────────────────\n\nfunction VisibilityTool({\n onAction,\n activeAction,\n onDeactivate,\n}: {\n onAction?: (action: VisibilityAction) => void;\n activeAction?: VisibilityAction | null;\n onDeactivate?: () => void;\n}): React.ReactElement {\n const [flyoutOpen, setFlyoutOpen] = useState(false);\n const groupRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!flyoutOpen) return;\n const handler = (e: MouseEvent) => {\n if (groupRef.current && !groupRef.current.contains(e.target as Node)) setFlyoutOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [flyoutOpen]);\n\n const VISIBILITY_ITEMS: { action: VisibilityAction; label: string }[] = [\n { action: 'hideDrawings', label: 'Hide drawings' },\n { action: 'hideIndicators', label: 'Hide indicators' },\n { action: 'hidePositions', label: 'Hide positions and orders' },\n { action: 'hideAll', label: 'Hide all' },\n ];\n\n return (\n <div ref={groupRef} className=\"dt-pointer-group\">\n <button\n className={`drawing-tool-btn dt-pointer-main${activeAction ? ' dt-vis-active' : ''}`}\n title={activeAction ? 'Restore visibility' : 'Visibility'}\n onClick={() => {\n if (activeAction) {\n onDeactivate?.();\n } else {\n setFlyoutOpen((o) => !o);\n }\n }}\n >\n {/* Eye with strikethrough */}\n <svg viewBox=\"0 0 16 16\" width=\"15\" height=\"15\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.6\" strokeLinecap=\"round\">\n <path d=\"M1 8 Q4 3 8 3 Q12 3 15 8 Q12 13 8 13 Q4 13 1 8\" />\n <circle cx=\"8\" cy=\"8\" r=\"2.2\" />\n <line x1=\"2.5\" y1=\"13.5\" x2=\"13.5\" y2=\"2.5\" strokeWidth=\"1.5\" />\n </svg>\n </button>\n <button\n className={`dt-pointer-expand${flyoutOpen ? ' is-open' : ''}`}\n title=\"Visibility options\"\n onClick={(e) => { e.stopPropagation(); setFlyoutOpen((o) => !o); }}\n >\n <ExpandChevron />\n </button>\n {flyoutOpen && (\n <div className=\"dt-pointer-flyout\">\n {VISIBILITY_ITEMS.map(({ action, label }) => (\n <button\n key={action}\n className={`dt-flyout-item${activeAction === action ? ' is-active' : ''}`}\n onClick={() => { onAction?.(action); setFlyoutOpen(false); }}\n >\n <span className=\"dt-flyout-name\">{label}</span>\n {activeAction === action && <span className=\"dt-flyout-check\">✓</span>}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ─── LeftToolbar ──────────────────────────────────────────────────────────────\n\ntype Props = {\n activeTool: DrawingToolType;\n onSelectTool: (tool: DrawingToolType) => void;\n /** Current drawing-tool favorites, controlled by the parent. */\n drawingFavorites?: DrawingToolType[];\n /** Called when the user stars/unstars a drawing tool. */\n onDrawingFavoritesChange?: (favs: DrawingToolType[]) => void;\n onVisibilityAction?: (action: VisibilityAction) => void;\n visibilityActiveAction?: VisibilityAction | null;\n onVisibilityDeactivate?: () => void;\n onLinkClick?: () => void;\n onDeleteClick?: () => void;\n};\n\nexport function LeftToolbar({ activeTool, onSelectTool, drawingFavorites, onDrawingFavoritesChange, onVisibilityAction, visibilityActiveAction, onVisibilityDeactivate, onLinkClick, onDeleteClick }: Props): React.ReactElement {\n const [favorites, setFavorites] = useState<DrawingToolType[]>(drawingFavorites ?? []);\n\n const handleFavoritesChange = (favs: DrawingToolType[]) => {\n setFavorites(favs);\n onDrawingFavoritesChange?.(favs);\n };\n\n return (\n <>\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: 2,\n padding: '6px 4px',\n background: 'var(--toolbar-bg)',\n borderRadius: 8,\n width: 40,\n flexShrink: 0,\n userSelect: 'none',\n }}\n >\n <PointerGroup activeTool={activeTool} onSelectTool={onSelectTool} />\n\n <LinesGroup\n activeTool={activeTool}\n favorites={favorites}\n onSelectTool={onSelectTool}\n onFavoritesChange={handleFavoritesChange}\n />\n\n <FibGannGroup\n activeTool={activeTool}\n favorites={favorites}\n onSelectTool={onSelectTool}\n onFavoritesChange={handleFavoritesChange}\n />\n\n {OTHER_TOOL_ORDER.map((tool) => {\n const isFav = favorites.includes(tool as DrawingToolType);\n return (\n <div key={tool} className=\"dt-other-tool-wrap\">\n <button\n title={OTHER_LABELS[tool]}\n onClick={() => onSelectTool(tool as DrawingType)}\n className={`drawing-tool-btn${activeTool === tool ? ' is-active' : ''}`}\n >\n {OTHER_ICONS[tool]}\n </button>\n <button\n className={`dt-star-btn dt-other-star${isFav ? ' is-starred' : ''}`}\n title={isFav ? 'Remove from favorites' : 'Add to favorites'}\n onClick={() => handleFavoritesChange(\n isFav\n ? favorites.filter((f) => f !== (tool as DrawingToolType))\n : [...favorites, tool as DrawingToolType]\n )}\n >\n <StarIcon filled={isFav} />\n </button>\n </div>\n );\n })}\n\n <VisibilityTool\n {...(onVisibilityAction ? { onAction: onVisibilityAction } : {})}\n activeAction={visibilityActiveAction ?? null}\n {...(onVisibilityDeactivate ? { onDeactivate: onVisibilityDeactivate } : {})}\n />\n\n {/* Link / sync */}\n <button\n className=\"drawing-tool-btn\"\n title=\"Link chart\"\n onClick={onLinkClick}\n >\n <svg viewBox=\"0 0 16 16\" width=\"15\" height=\"15\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.7\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M7 9 A3.5 3.5 0 0 0 9.5 5.5 L11 4 A2.5 2.5 0 1 1 14.5 7.5 L13 9 A3.5 3.5 0 0 1 9.5 10.5\" />\n <path d=\"M9 7 A3.5 3.5 0 0 0 6.5 10.5 L5 12 A2.5 2.5 0 1 1 1.5 8.5 L3 7 A3.5 3.5 0 0 1 6.5 5.5\" />\n </svg>\n </button>\n\n {/* Delete / trash */}\n <button\n className=\"drawing-tool-btn\"\n title=\"Remove selected drawing\"\n onClick={onDeleteClick}\n >\n <svg viewBox=\"0 0 16 16\" width=\"15\" height=\"15\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"2.5\" y1=\"4\" x2=\"13.5\" y2=\"4\" />\n <path d=\"M5.5 4 V13 A1 1 0 0 0 6.5 14 H9.5 A1 1 0 0 0 10.5 13 V4\" />\n <line x1=\"6\" y1=\"2\" x2=\"10\" y2=\"2\" />\n <line x1=\"7\" y1=\"6.5\" x2=\"7\" y2=\"11.5\" />\n <line x1=\"9\" y1=\"6.5\" x2=\"9\" y2=\"11.5\" />\n </svg>\n </button>\n </div>\n\n <FavoritesFloatingToolbar\n favorites={favorites}\n activeTool={activeTool}\n onSelectTool={onSelectTool}\n />\n </>\n );\n}\n","/**\n * ChartContextMenu — right-click context menu for the chart canvas.\n *\n * Placed at fixed (x, y) on screen. Clicking outside dismisses it via the\n * transparent backdrop. The parent is responsible for calling onClose.\n */\n\ntype Props = {\n x: number;\n y: number;\n onClose: () => void;\n onSettings: () => void;\n onClearDrawings: () => void;\n onClearIndicators: () => void;\n onResetView: () => void;\n};\n\nexport function ChartContextMenu({\n x,\n y,\n onClose,\n onSettings,\n onClearDrawings,\n onClearIndicators,\n onResetView,\n}: Props) {\n return (\n <>\n <div className=\"chart-ctx-backdrop\" onClick={onClose} onContextMenu={(e) => { e.preventDefault(); onClose(); }} />\n <div className=\"chart-ctx-menu\" style={{ left: x, top: y }}>\n <button\n className=\"chart-ctx-item\"\n onClick={() => { onSettings(); onClose(); }}\n >\n Settings…\n </button>\n <div className=\"chart-ctx-divider\" />\n <button\n className=\"chart-ctx-item\"\n onClick={() => { onResetView(); onClose(); }}\n >\n Reset Chart View\n </button>\n <div className=\"chart-ctx-divider\" />\n <button\n className=\"chart-ctx-item chart-ctx-item--danger\"\n onClick={() => { onClearIndicators(); onClose(); }}\n >\n Clear Indicators\n </button>\n <button\n className=\"chart-ctx-item chart-ctx-item--danger\"\n onClick={() => { onClearDrawings(); onClose(); }}\n >\n Clear Drawings\n </button>\n </div>\n </>\n );\n}\n","/**\n * ChartSettingsDialog — canvas settings modal.\n *\n * Sections (sidebar nav):\n * • Canvas — background color, grid visibility, grid color\n *\n * Additional sections can be added by extending SECTIONS and adding a matching\n * content renderer in renderContent().\n *\n * The parent passes `initialSettings` and receives the final values via `onApply`.\n * Nothing is persisted here; persistence (localStorage / DB) lives in the parent.\n */\n\nimport { useState } from 'react';\n\nexport type CanvasSettings = {\n background: string;\n gridColor: string;\n gridVisible: boolean;\n};\n\ntype Section = 'canvas';\n\nconst SECTIONS: { id: Section; label: string }[] = [\n { id: 'canvas', label: 'Canvas' },\n];\n\ntype Props = {\n initialSettings: CanvasSettings;\n onApply: (settings: CanvasSettings) => void;\n onClose: () => void;\n};\n\nexport function ChartSettingsDialog({ initialSettings, onApply, onClose }: Props) {\n const [activeSection, setActiveSection] = useState<Section>('canvas');\n const [settings, setSettings] = useState<CanvasSettings>(initialSettings);\n\n const update = <K extends keyof CanvasSettings>(key: K, value: CanvasSettings[K]) =>\n setSettings((prev) => ({ ...prev, [key]: value }));\n\n const handleApply = () => {\n onApply(settings);\n onClose();\n };\n\n return (\n <div className=\"csettings-backdrop\" onClick={onClose}>\n <div className=\"csettings-dialog\" onClick={(e) => e.stopPropagation()}>\n\n {/* ── Header ──────────────────────────────────────────────────── */}\n <div className=\"csettings-header\">\n <span className=\"csettings-title\">Chart Settings</span>\n <button className=\"csettings-close\" onClick={onClose} aria-label=\"Close\">✕</button>\n </div>\n\n <div className=\"csettings-body\">\n {/* ── Sidebar ─────────────────────────────────────────────── */}\n <nav className=\"csettings-sidebar\">\n {SECTIONS.map(({ id, label }) => (\n <button\n key={id}\n className={`csettings-nav-item${activeSection === id ? ' is-active' : ''}`}\n onClick={() => setActiveSection(id)}\n >\n {label}\n </button>\n ))}\n </nav>\n\n {/* ── Content ─────────────────────────────────────────────── */}\n <div className=\"csettings-content\">\n {activeSection === 'canvas' && (\n <div className=\"csettings-section\">\n\n <div className=\"csettings-row\">\n <label className=\"csettings-label\">Background</label>\n <div className=\"csettings-color-wrap\">\n <input\n type=\"color\"\n className=\"csettings-color-input\"\n value={settings.background}\n onChange={(e) => update('background', e.target.value)}\n />\n <span className=\"csettings-color-hex\">{settings.background}</span>\n </div>\n </div>\n\n <div className=\"csettings-row\">\n <label className=\"csettings-label\">Grid Lines</label>\n <label className=\"csettings-toggle\">\n <input\n type=\"checkbox\"\n checked={settings.gridVisible}\n onChange={(e) => update('gridVisible', e.target.checked)}\n />\n <span className=\"csettings-toggle-track\" />\n </label>\n </div>\n\n {settings.gridVisible && (\n <div className=\"csettings-row\">\n <label className=\"csettings-label\">Grid Color</label>\n <div className=\"csettings-color-wrap\">\n <input\n type=\"color\"\n className=\"csettings-color-input\"\n value={settings.gridColor}\n onChange={(e) => update('gridColor', e.target.value)}\n />\n <span className=\"csettings-color-hex\">{settings.gridColor}</span>\n </div>\n </div>\n )}\n\n </div>\n )}\n </div>\n </div>\n\n {/* ── Footer ──────────────────────────────────────────────────── */}\n <div className=\"csettings-footer\">\n <button className=\"csettings-btn csettings-btn--ghost\" onClick={onClose}>\n Cancel\n </button>\n <button className=\"csettings-btn csettings-btn--primary\" onClick={handleApply}>\n Apply\n </button>\n </div>\n\n </div>\n </div>\n );\n}\n","import React, { useEffect, useRef } from 'react';\nimport type { PointerToolType } from '../../';\nimport {\n DOT_RADIUS,\n DOT_COLOR,\n DEMONSTRATION_RADIUS,\n DEMONSTRATION_FILL,\n DEMONSTRATION_STROKE,\n DEMONSTRATION_COLOR,\n} from '../../';\n\n/**\n * PointerOverlay — a transparent `<div>` that covers the entire chart area and\n * renders tool-specific cursor visuals for the `dot` and `demonstration` modes.\n *\n * - **dot**: SVG crosshair lines + small filled circle at the intersection.\n * - **demonstration**: SVG crosshair + semi-transparent filled circle centred\n * on the cursor.\n *\n * The component does NOT intercept pointer events (`pointerEvents: none`), so\n * all mouse interactions pass through to the canvas layers beneath it.\n */\n\ntype Props = {\n mode: PointerToolType;\n /** Width of the container to size the SVG overlay. */\n width: number;\n /** Height of the container to size the SVG overlay. */\n height: number;\n};\n\nconst CROSSHAIR_COLOR = DEMONSTRATION_COLOR;\n\nexport function PointerOverlay({ mode, width, height }: Props): React.ReactElement | null {\n const svgRef = useRef<SVGSVGElement>(null);\n const hGroupRef = useRef<SVGGElement>(null); // translateY group → horizontal line\n const vGroupRef = useRef<SVGGElement>(null); // translateX group → vertical line\n const cursorGroup = useRef<SVGGElement>(null); // translate(x,y) group → dot/circle\n\n useEffect(() => {\n const svg = svgRef.current;\n if (!svg) return;\n const container = svg.parentElement;\n if (!container) return;\n\n // Cache the bounding rect so we never call getBoundingClientRect() inside the\n // hot move handler (it forces a synchronous reflow on every event).\n let cachedRect = container.getBoundingClientRect();\n const ro = new ResizeObserver(() => { cachedRect = container.getBoundingClientRect(); });\n ro.observe(container);\n\n const onMove = (e: MouseEvent) => {\n const x = e.clientX - cachedRect.left;\n const y = e.clientY - cachedRect.top;\n\n if (x < 0 || y < 0 || x > cachedRect.width || y > cachedRect.height) {\n svg.style.opacity = '0';\n return;\n }\n\n svg.style.opacity = '1';\n\n // CSS transforms are GPU-composited — no layout reflow, no paint.\n if (hGroupRef.current) hGroupRef.current.style.transform = `translateY(${y}px)`;\n if (vGroupRef.current) vGroupRef.current.style.transform = `translateX(${x}px)`;\n if (cursorGroup.current) cursorGroup.current.style.transform = `translate(${x}px,${y}px)`;\n };\n\n const hide = () => { svg.style.opacity = '0'; };\n\n // passive:true lets the browser skip asking us about preventDefault → lower latency\n container.addEventListener('mousemove', onMove, { passive: true });\n container.addEventListener('mouseleave', hide, { passive: true });\n return () => {\n container.removeEventListener('mousemove', onMove);\n container.removeEventListener('mouseleave', hide);\n ro.disconnect();\n };\n }, []);\n\n if (mode !== 'dot' && mode !== 'demonstration') return null;\n\n return (\n <svg\n ref={svgRef}\n width={width}\n height={height}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n pointerEvents: 'none',\n zIndex: 5,\n opacity: 0,\n overflow: 'visible',\n willChange: 'opacity',\n }}\n >\n {/* Horizontal crosshair line — spans ±∞ so width never matters */}\n <g ref={hGroupRef}>\n <line x1=\"-9999\" y1=\"0\" x2=\"9999\" y2=\"0\"\n stroke={CROSSHAIR_COLOR} strokeWidth=\"1\" strokeDasharray=\"4 3\" />\n </g>\n\n {/* Vertical crosshair line — spans ±∞ so height never matters */}\n <g ref={vGroupRef}>\n <line x1=\"0\" y1=\"-9999\" x2=\"0\" y2=\"9999\"\n stroke={CROSSHAIR_COLOR} strokeWidth=\"1\" strokeDasharray=\"4 3\" />\n </g>\n\n {/* Cursor element translated to (x, y) */}\n <g ref={cursorGroup}>\n {mode === 'dot' && (\n <circle r={DOT_RADIUS} fill={DOT_COLOR} />\n )}\n {mode === 'demonstration' && (\n <circle r={DEMONSTRATION_RADIUS}\n fill={DEMONSTRATION_FILL}\n stroke={DEMONSTRATION_STROKE}\n strokeWidth=\"1.5\"\n />\n )}\n </g>\n </svg>\n );\n}\n","/**\n * ChartCanvas — stacks the main price chart above one or more indicator panes.\n *\n * Features:\n * - Creates a TChart instance and attaches any `initialIndicators`.\n * - Each non-overlay indicator gets its own sub-pane (managed by TChart's PaneManager).\n * - Draggable dividers let the user resize panes; the price-split fraction is\n * reported via onPriceFractionChange (no localStorage in this package).\n * - A requestAnimationFrame loop forwards viewport changes (pan/zoom) to the\n * indicator canvases so they stay in sync with the main chart’s time axis.\n *\n * Previously exported as MultiPaneChart — that name is kept as an alias.\n */\n\nimport { useEffect, useRef, useState, useCallback, forwardRef, useImperativeHandle } from 'react';\nimport { TChart, IndicatorDAG } from '../../';\nimport type { TradingOverlayStore } from '../../';\nimport type { CoordTransform, DrawingToolType, DAGResult, PointerToolType } from '../../';\nimport type { OHLCV, PaneDescriptor, IndicatorConfig, IndicatorInstance, DrawingType, ChartLayout } from '@forgecharts/types';\nimport type { IDatafeed, Timeframe, ChartTheme } from '@forgecharts/types';\nimport type { TradingBridgeCallbacks } from '../trading/TradingBridge';\nimport { IndicatorPane } from './IndicatorPane';\nimport { LeftToolbar } from './toolbars/LeftToolbar';\nimport type { VisibilityAction } from './toolbars/LeftToolbar';\nimport { IndicatorLabel, IndicatorConfigDialog } from './IndicatorLabel';\nimport { ChartContextMenu } from './ChartContextMenu';\nimport { ChartSettingsDialog } from './ChartSettingsDialog';\nimport { PointerOverlay } from './PointerOverlay';\nimport type { CanvasSettings } from './ChartSettingsDialog';\n\n// ─── Defaults ──────────────────────────────────────────────────────────────────\n\nconst OVERLAY_COLORS = ['#2196f3', '#4caf50', '#ff9800', '#e040fb', '#00bcd4', '#f44336'] as const;\n\n/** Candle duration in seconds per timeframe — mirrors Chart.ts _TF_SECONDS. */\nconst _TF_SECONDS: 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 * Returns true if a hex background color is perceptually light (luminance > 0.5).\n * Used to derive a contrasting axis/text color automatically.\n */\nfunction _isLightBg(hex: string): boolean {\n const c = hex.replace('#', '');\n if (c.length < 6) return false;\n const r = parseInt(c.slice(0, 2), 16) / 255;\n const g = parseInt(c.slice(2, 4), 16) / 255;\n const b = parseInt(c.slice(4, 6), 16) / 255;\n // sRGB luminance (WCAG formula)\n const toLinear = (v: number) => v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n const L = 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);\n return L > 0.179;\n}\n\n// ─── Divider ──────────────────────────────────────────────────────────────────\n\ntype DividerProps = { onDrag: (dy: number) => void };\n\nfunction Divider({ onDrag }: DividerProps) {\n const lastY = useRef(0);\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n lastY.current = e.clientY;\n\n const onMove = (me: MouseEvent) => {\n onDrag(me.clientY - lastY.current);\n lastY.current = me.clientY;\n };\n const onUp = () => {\n window.removeEventListener('mousemove', onMove);\n window.removeEventListener('mouseup', onUp);\n };\n window.addEventListener('mousemove', onMove);\n window.addEventListener('mouseup', onUp);\n },\n [onDrag],\n );\n\n return (\n <div\n onMouseDown={handleMouseDown}\n style={{\n height: 4,\n cursor: 'ns-resize',\n background: 'var(--border, #2a2e39)',\n flexShrink: 0,\n userSelect: 'none',\n }}\n />\n );\n}\n\n// ─── Price helpers ───────────────────────────────────────────────────────────\n\nfunction _fmtPrice(v: number): string {\n const abs = Math.abs(v);\n const dec = abs >= 100 ? 2 : abs >= 1 ? 2 : abs >= 0.0001 ? 4 : 6;\n return v.toLocaleString('en-US', { minimumFractionDigits: dec, maximumFractionDigits: dec });\n}\n\nfunction _fmtVol(v: number): string {\n if (v >= 1_000_000) return `${(v / 1_000_000).toFixed(2)}M`;\n if (v >= 1_000) return `${(v / 1_000).toFixed(1)}K`;\n return v.toFixed(0);\n}\n\n// ─── PricePaneHeader ──────────────────────────────────────────────────────────\n\nfunction PricePaneHeader({\n symbol,\n timeframe,\n bars,\n theme,\n indicators,\n overlayColors,\n onRemove,\n onConfigure,\n getExchangeLogoUrl,\n}: {\n symbol: string;\n timeframe: string;\n bars: readonly OHLCV[];\n theme: import('@forgecharts/types').ChartTheme;\n indicators: readonly IndicatorInstance[];\n overlayColors: readonly string[];\n onRemove: (id: string) => void;\n onConfigure: (ind: IndicatorInstance) => void;\n getExchangeLogoUrl?: (exchange: string) => string | null | undefined;\n}) {\n const [collapsed, setCollapsed] = useState(false);\n const lastBar = bars[bars.length - 1];\n const prevBar = bars[bars.length - 2];\n const change = lastBar && prevBar ? lastBar.close - prevBar.close : 0;\n const pctChange = prevBar && prevBar.close !== 0 ? (change / prevBar.close) * 100 : 0;\n const isUp = change >= 0;\n const changeColor = isUp ? 'var(--up, #26a641)' : 'var(--down, #f85149)';\n const muted = theme === 'dark' ? 'rgba(255,255,255,0.42)' : 'rgba(0,0,0,0.38)';\n const textColor = theme === 'dark' ? 'rgba(255,255,255,0.82)' : 'rgba(0,0,0,0.82)';\n const overlayInds = indicators.filter((ind) => ind.config.overlay === true);\n\n return (\n <div\n style={{\n position: 'absolute',\n top: 6,\n left: 6,\n zIndex: 3,\n pointerEvents: 'auto',\n maxWidth: 'calc(100% - 80px)',\n fontFamily: '-apple-system, BlinkMacSystemFont, sans-serif',\n userSelect: 'none',\n }}\n >\n {/* ── Symbol + OHLCV row ─────────────────────────────────────────── */}\n <div style={{ display: 'flex', alignItems: 'baseline', flexWrap: 'wrap', gap: '0 5px', fontSize: 11.5, lineHeight: 1.7 }}>\n {(() => {\n const exchange = symbol.includes(':') ? symbol.split(':')[0]!.toUpperCase() : '';\n if (!exchange) return null;\n const logoUrl = getExchangeLogoUrl?.(exchange);\n if (!logoUrl) return null;\n return (\n <img\n src={logoUrl}\n alt={exchange}\n width={14}\n height={14}\n style={{ display: 'inline-block', verticalAlign: 'middle', marginBottom: 1, borderRadius: 2, flexShrink: 0 }}\n onError={(e) => { (e.currentTarget as HTMLImageElement).style.display = 'none'; }}\n />\n );\n })()}\n <span style={{ fontWeight: 700, color: textColor }}>{symbol}</span>\n <span style={{ color: muted }}>· {timeframe}</span>\n {lastBar && (\n <>\n <span>\n <span style={{ color: muted }}>O</span>\n <span style={{ color: muted }}> </span>\n <span style={{ color: textColor }}>{_fmtPrice(lastBar.open)}</span>\n </span>\n <span>\n <span style={{ color: '#26a641', fontWeight: 500 }}>H</span>\n <span style={{ color: muted }}> </span>\n <span style={{ color: textColor }}>{_fmtPrice(lastBar.high)}</span>\n </span>\n <span>\n <span style={{ color: '#f85149', fontWeight: 500 }}>L</span>\n <span style={{ color: muted }}> </span>\n <span style={{ color: textColor }}>{_fmtPrice(lastBar.low)}</span>\n </span>\n <span>\n <span style={{ color: muted }}>C</span>\n <span style={{ color: muted }}> </span>\n <span style={{ color: textColor }}>{_fmtPrice(lastBar.close)}</span>\n </span>\n <span style={{ color: changeColor }}>\n {isUp ? '+' : ''}{_fmtPrice(change)} ({isUp ? '+' : ''}{pctChange.toFixed(2)}%)\n </span>\n </>\n )}\n </div>\n\n {/* ── Overlay indicators ─────────────────────────────────────────── */}\n {overlayInds.length > 0 && (\n <>\n {!collapsed && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 1, marginTop: 2 }}>\n {overlayInds.map((ind, i) => (\n <IndicatorLabel\n key={ind.id}\n indicator={ind}\n color={ind.config.color ?? overlayColors[i % overlayColors.length] ?? '#2196f3'}\n onRemove={() => onRemove(ind.id)}\n onConfigure={() => onConfigure(ind)}\n />\n ))}\n </div>\n )}\n <button\n onClick={() => setCollapsed((c) => !c)}\n title={collapsed ? 'Show indicators' : 'Hide indicators'}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n marginTop: 3,\n width: 20,\n height: 14,\n background: 'rgba(100,100,100,0.25)',\n border: 'none',\n borderRadius: 3,\n color: muted,\n fontSize: 9,\n cursor: 'pointer',\n padding: 0,\n lineHeight: 1,\n }}\n >\n {collapsed ? '▾' : '▴'}\n </button>\n </>\n )}\n </div>\n );\n}\n\n// ─── ChartCanvas ──────────────────────────────────────────────────────────────────────\n\nexport type ChartCanvasHandle = {\n /** Returns the full current chart state (indicators, drawings, viewport). */\n getLayoutSnapshot: () => ChartLayout | null;\n /** Replaces the chart state with the supplied layout snapshot. */\n loadLayoutSnapshot: (layout: ChartLayout) => void;\n /** Adds an indicator to the live chart and returns its id. */\n addIndicator: (config: IndicatorConfig) => string | null;\n /** Captures the visible chart area as a PNG data-URL. */\n captureScreenshot: () => Promise<string | null>;\n /**\n * Returns the chart's internal TradingOverlayStore for Unmanaged mode.\n * Use this to push confirmed order / position state into the chart.\n * Returns null before the chart has mounted.\n */\n getOverlayStore: () => TradingOverlayStore | null;\n};\n\nexport type ChartCanvasProps = {\n symbol: string;\n timeframe: string;\n datafeed?: IDatafeed;\n theme?: ChartTheme;\n /** IANA timezone for axis labels (e.g. \"America/New_York\"). */\n timezone?: string | undefined;\n /** Indicators to add on mount. Non-overlay indicators each get a sub-pane. */\n initialIndicators?: IndicatorConfig[];\n /**\n * When provided the chart restores this snapshot on mount instead of\n * reading from localStorage. Pass a snapshot captured via getLayoutSnapshot()\n * or a ChartLayout loaded from the server.\n */\n layoutToRestore?: ChartLayout | undefined;\n /** Called whenever an indicator is added or removed, so the parent can trigger a workspace save. */\n onIndicatorsChanged?: () => void;\n /**\n * Initial price-pane fraction (0.3–0.85). Defaults to 0.6.\n * The parent controls persistence; changes are reported via onPriceFractionChange.\n */\n priceFraction?: number;\n /** Called when the user drags the price/sub-pane divider. */\n onPriceFractionChange?: (fraction: number) => void;\n /**\n * Optional callback to resolve an exchange logo URL.\n * Receives the exchange code (e.g. \"BINANCE\") and returns a URL string,\n * or undefined/null to suppress the logo image entirely.\n * If omitted, no exchange logo is rendered.\n */\n getExchangeLogoUrl?: (exchange: string) => string | null | undefined;\n /**\n * Optional trading bridge callbacks for Unmanaged mode.\n *\n * When provided the chart will invoke these callbacks when the user performs\n * a trading action (drag-to-place, cancel, bracket adjust, etc.).\n * The chart never self-confirms — the host must push confirmed state back\n * through `TradingOverlayStore` (via `upsertOrder` / `setOrders` etc.).\n *\n * Wrap with `createTradingBridgeLogger` during development for structured\n * console output of every emitted intent.\n */\n tradingBridge?: TradingBridgeCallbacks;\n};\n\n/** @deprecated Use ChartCanvasProps */\nexport type MultiPaneChartProps = ChartCanvasProps;\n/** @deprecated Use ChartCanvasHandle */\nexport type MultiPaneChartHandle = ChartCanvasHandle;\n\nexport const ChartCanvas = forwardRef<ChartCanvasHandle, ChartCanvasProps>(\nfunction ChartCanvas({\n symbol,\n timeframe,\n datafeed,\n theme = 'dark',\n timezone = 'UTC',\n initialIndicators = [],\n layoutToRestore,\n onIndicatorsChanged,\n priceFraction: priceFractionProp,\n onPriceFractionChange,\n getExchangeLogoUrl,\n tradingBridge,\n}: ChartCanvasProps, ref) {\n const outerRef = useRef<HTMLDivElement>(null);\n const priceRef = useRef<HTMLDivElement>(null);\n const overlayCanvasRef = useRef<HTMLCanvasElement>(null);\n /** Crosshair X pixel (relative to chart column) — updated via mousemove, no re-render needed. */\n const crosshairXRef = useRef<number | null>(null);\n const chartRef = useRef<TChart | null>(null);\n const transformRef = useRef<CoordTransform | null>(null);\n\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [bars, setBars] = useState<readonly OHLCV[]>([]);\n const [panes, setPanes] = useState<readonly PaneDescriptor[]>([]);\n const [indicators, setIndicators] = useState<readonly IndicatorInstance[]>([]);\n const [totalHeight, setTotalHeight] = useState(600);\n const [activeTool, setActiveTool] = useState<DrawingToolType>('cursor');\n const [ctxMenu, setCtxMenu] = useState<{ x: number; y: number; drawingId: string } | null>(null);\n const [chartCtxMenu, setChartCtxMenu] = useState<{ x: number; y: number } | null>(null);\n const [settingsOpen, setSettingsOpen] = useState(false);\n const [canvasSettings, setCanvasSettings] = useState<CanvasSettings>({\n background: '#000000',\n gridColor: '#2a2a2a',\n gridVisible: true,\n });\n const [configTarget, setConfigTarget] = useState<IndicatorInstance | null>(null);\n // Flag to suppress chart context menu when a drawing context menu was triggered\n const drawingCtxJustFired = useRef(false);\n\n const dagRef = useRef<IndicatorDAG | null>(null);\n const [computedResults, setComputedResults] = useState<ReadonlyMap<string, DAGResult>>(\n () => new Map(),\n );\n // Stable ref to the overlay draw function — rebuilt whenever data changes,\n // called directly from the RAF loop to stay in the same frame as candles.\n const drawOverlayRef = useRef<(() => void) | null>(null);\n\n const [priceFraction, setPriceFraction] = useState<number>(priceFractionProp ?? 0.6);\n\n // ── Imperative handle (tab snapshot save/load) ─────────────────────────────\n useImperativeHandle(ref, () => ({\n getLayoutSnapshot: () => chartRef.current?.saveLayout() ?? null,\n loadLayoutSnapshot: (layout: ChartLayout) => {\n chartRef.current?.loadLayout(layout);\n },\n addIndicator: (config: IndicatorConfig) => chartRef.current?.addIndicator(config) ?? null,\n getOverlayStore: () => chartRef.current?.getTradingOverlayStore() ?? null,\n captureScreenshot: async (): Promise<string | null> => {\n const container = outerRef.current;\n if (!container) return null;\n const containerRect = container.getBoundingClientRect();\n const { width, height } = containerRect;\n if (width === 0 || height === 0) return null;\n const dpr = window.devicePixelRatio || 1;\n const composite = document.createElement('canvas');\n composite.width = Math.round(width * dpr);\n composite.height = Math.round(height * dpr);\n const ctx = composite.getContext('2d');\n if (!ctx) return null;\n // Fill background colour from CSS variable\n const bgColor = getComputedStyle(document.documentElement)\n .getPropertyValue('--bg').trim() || '#000000';\n ctx.fillStyle = bgColor;\n ctx.fillRect(0, 0, composite.width, composite.height);\n // Composite every canvas element inside the chart container\n const canvases = container.querySelectorAll<HTMLCanvasElement>('canvas');\n for (const canvas of canvases) {\n const rect = canvas.getBoundingClientRect();\n const x = Math.round((rect.left - containerRect.left) * dpr);\n const y = Math.round((rect.top - containerRect.top) * dpr);\n const w = Math.round(rect.width * dpr);\n const h = Math.round(rect.height * dpr);\n try { ctx.drawImage(canvas, x, y, w, h); } catch { /* tainted canvas — skip */ }\n }\n return composite.toDataURL('image/png');\n },\n }));\n\n // ── Mount: create TChart ────────────────────────────────────────────────────\n useEffect(() => {\n const container = priceRef.current;\n if (!container) return;\n\n const chart = new TChart({\n container,\n symbol,\n interval: timeframe as import('@forgecharts/types').Timeframe,\n theme,\n ...(datafeed !== undefined ? { datafeed } : {}),\n });\n\n // Add initial indicators — non-overlay ones get sub-panes created automatically\n for (const config of initialIndicators) {\n chart.addIndicator(config);\n }\n\n transformRef.current = chart.getTransform();\n\n const syncChartState = () => {\n setBars(chart.getBars());\n setPanes(chart.getPanes());\n setIndicators(chart.getIndicators());\n };\n\n chart.on('dataLoading', () => {\n setLoading(true);\n setError(null);\n });\n chart.on('dataLoaded', ({ interval: loadedInterval }: { symbol: string; interval: string; count: number }) => {\n setLoading(false);\n syncChartState();\n // Only restore a saved viewport when it is genuinely valid for the current\n // timeframe. Two guards prevent stale data from locking the view:\n // 1. interval must match — compares the *loaded* interval (from event payload,\n // not a stale closure) against the saved layout's interval. This correctly\n // handles the case where the user switches timeframes after mount.\n // 2. span must be ≥ 50 candles — avoids restoring zoomed-in states.\n // In all other cases fall back to fitDefaultView() so the user always sees\n // a sensible ~150-candle window on first load or after a timeframe switch.\n const tfSec = _TF_SECONDS[loadedInterval] ?? 3600;\n const savedSpan = layoutToRestore?.viewport\n ? (layoutToRestore.viewport.timeRange.to - layoutToRestore.viewport.timeRange.from)\n : 0;\n const hasValidViewport =\n !!layoutToRestore?.viewport &&\n layoutToRestore.interval === loadedInterval &&\n savedSpan >= tfSec * 50; // require at least 50 candles visible — avoids restoring zoomed-in states\n if (hasValidViewport) {\n chart.restoreViewport(layoutToRestore!.viewport!);\n chart.resetPriceScale();\n } else {\n chart.fitDefaultView();\n }\n });\n chart.on('dataError', ({ error: msg }: { error: string }) => {\n setLoading(false);\n setError(msg);\n });\n chart.on('barsUpdated', syncChartState);\n chart.on('indicatorAdded', () => { syncChartState(); onIndicatorsChanged?.(); });\n chart.on('indicatorRemoved', () => { syncChartState(); onIndicatorsChanged?.(); });\n\n // Auto-revert to cursor after each drawing placement.\n chart.on('drawingCreated', () => {\n setActiveTool('cursor');\n chart.setCrosshairEnabled(false); // back to arrow — no crosshair\n });\n\n // Show context menu when user right-clicks a drawing.\n chart.on('drawingContextMenu', ({ id, x, y }: { id: string; x: number; y: number }) => {\n const canvas = priceRef.current;\n if (!canvas) return;\n const rect = canvas.getBoundingClientRect();\n drawingCtxJustFired.current = true;\n setTimeout(() => { drawingCtxJustFired.current = false; }, 0);\n setCtxMenu({ drawingId: id, x: rect.left + x, y: rect.top + y });\n });\n\n // Restore layout from the explicit snapshot when provided.\n // Without a snapshot the chart starts empty (no localStorage fallback —\n // persistence is handled by DB auto-save in App.tsx).\n if (layoutToRestore) {\n try {\n chart.loadLayout(layoutToRestore);\n } catch { /* invalid snapshot — ignore */ }\n }\n\n chartRef.current = chart;\n syncChartState(); // read panes added synchronously for initialIndicators\n\n return () => {\n chart.destroy();\n chartRef.current = null;\n transformRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // ── Symbol / timeframe propagation ──────────────────────────────────────────\n useEffect(() => { chartRef.current?.setSymbol(symbol); }, [symbol]);\n useEffect(() => { chartRef.current?.setInterval(timeframe as import('@forgecharts/types').Timeframe); }, [timeframe]);\n useEffect(() => { chartRef.current?.setTimezone(timezone); }, [timezone]);\n useEffect(() => { chartRef.current?.setTheme(theme); }, [theme]);\n // ── DAG: recompute indicators when bars or indicator list changes ────────────\n useEffect(() => {\n if (!dagRef.current) dagRef.current = new IndicatorDAG();\n const dag = dagRef.current;\n dag.sync(indicators);\n let changed = false;\n try {\n changed = dag.execute(bars);\n } catch (e) {\n console.error('[ForgeCharts] Indicator computation error:', e);\n }\n if (changed) setComputedResults(new Map(dag.getAllResults() as Map<string, DAGResult>));\n }, [bars, indicators]);\n\n // ── Overlay indicators: draw script/ema/etc lines on the price pane canvas ──\n // The draw function is stored in a ref so the RAF loop can call it directly\n // every frame — bypassing the React state update cycle and keeping the\n // indicator overlay pixel-perfect in sync with the candle layer.\n useEffect(() => {\n drawOverlayRef.current = () => {\n const canvas = overlayCanvasRef.current;\n const transform = transformRef.current;\n if (!canvas || !transform) return;\n\n const curPriceH = panes.length > 0 ? totalHeight * priceFraction : totalHeight;\n const dpr = window.devicePixelRatio ?? 1;\n const cssW = canvas.offsetWidth || (canvas.parentElement?.clientWidth ?? 800);\n const physW = Math.round(cssW * dpr);\n const physH = Math.round(curPriceH * dpr);\n\n if (canvas.width !== physW || canvas.height !== physH) {\n canvas.width = physW;\n canvas.height = physH;\n }\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n ctx.clearRect(0, 0, physW, physH);\n\n const overlayInds = indicators.filter((ind) => ind.config.overlay === true);\n if (overlayInds.length === 0) return;\n\n ctx.save();\n ctx.scale(dpr, dpr);\n\n const plotW = transform.plotWidth;\n let colorIdx = 0;\n\n for (const ind of overlayInds) {\n const result = computedResults.get(ind.id);\n if (!result || result.kind !== 'series' || result.points.length === 0) continue;\n\n const color = ind.config.color ?? OVERLAY_COLORS[colorIdx++ % OVERLAY_COLORS.length]!;\n ctx.strokeStyle = color;\n ctx.lineWidth = 1.5;\n ctx.beginPath();\n let started = false;\n for (const p of result.points) {\n const x = transform.timeToX(p.time);\n if (x < -20 || x > plotW + 20) { started = false; continue; }\n const y = transform.priceToY(p.value);\n if (!started) { ctx.moveTo(x, y); started = true; }\n else { ctx.lineTo(x, y); }\n }\n ctx.stroke();\n }\n\n ctx.restore();\n };\n // Trigger an immediate repaint whenever the data (bars, indicator config,\n // canvas size) changes — viewport-only changes are handled by the RAF loop.\n drawOverlayRef.current();\n }, [computedResults, totalHeight, priceFraction, panes, indicators]);\n // ── ResizeObserver for total container height ──────────────────────────────\n useEffect(() => {\n const el = outerRef.current;\n if (!el) return;\n const ro = new ResizeObserver(([entry]) => {\n if (entry) setTotalHeight(entry.contentRect.height);\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n // ── RAF loop: keep indicator overlay in sync with the candle layer ──────────\n // Calls the draw function directly every animation frame — no React state\n // update roundtrip — so indicators move in the exact same frame as candles.\n useEffect(() => {\n let rafId: number;\n const tick = () => {\n drawOverlayRef.current?.();\n rafId = requestAnimationFrame(tick);\n };\n rafId = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(rafId);\n }, []);\n\n // ── Chart-level right-click (canvas background, not a drawing) ────────────\n const handleCanvasContextMenu = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n if (drawingCtxJustFired.current) return;\n setChartCtxMenu({ x: e.clientX, y: e.clientY });\n }, []);\n\n const handleClearDrawings = useCallback(() => {\n chartRef.current?.clearDrawings();\n }, []);\n\n const [drawingsHidden, setDrawingsHidden] = useState(false);\n const [indicatorsHidden, setIndicatorsHidden] = useState(false);\n\n const handleVisibilityAction = useCallback((action: VisibilityAction) => {\n const chart = chartRef.current;\n if (!chart) return;\n if (action === 'hideDrawings') {\n const next = !drawingsHidden;\n setDrawingsHidden(next);\n chart.setAllDrawingsVisible(!next);\n } else if (action === 'hideIndicators') {\n const next = !indicatorsHidden;\n setIndicatorsHidden(next);\n chart.setIndicatorsVisible(!next);\n } else if (action === 'hideAll') {\n const nextD = !drawingsHidden;\n const nextI = !indicatorsHidden;\n setDrawingsHidden(nextD);\n setIndicatorsHidden(nextI);\n chart.setAllDrawingsVisible(!nextD);\n chart.setIndicatorsVisible(!nextI);\n }\n // hidePositions: positions system not yet implemented\n }, [drawingsHidden, indicatorsHidden]);\n\n const visibilityActiveAction: VisibilityAction | null =\n drawingsHidden && indicatorsHidden ? 'hideAll' :\n drawingsHidden ? 'hideDrawings' :\n indicatorsHidden ? 'hideIndicators' :\n null;\n\n const handleVisibilityDeactivate = useCallback(() => {\n const chart = chartRef.current;\n if (!chart) return;\n setDrawingsHidden(false);\n setIndicatorsHidden(false);\n chart.setAllDrawingsVisible(true);\n chart.setIndicatorsVisible(true);\n }, []);\n\n const handleClearIndicators = useCallback(() => {\n const chart = chartRef.current;\n if (!chart) return;\n for (const ind of chart.getIndicators()) {\n chart.removeIndicator(ind.id);\n }\n }, []);\n\n const handleResetView = useCallback(() => {\n chartRef.current?.scrollToEnd();\n }, []);\n\n const handleApplySettings = useCallback((settings: CanvasSettings) => {\n setCanvasSettings(settings);\n const light = _isLightBg(settings.background);\n chartRef.current?.applyOptions({\n colors: {\n background: settings.background,\n backgroundSecondary: light ? '#f5f5f5' : '#0a0a0a',\n text: light ? '#000000' : '#ffffff',\n textMuted: light ? '#666666' : '#888888',\n crosshair: light ? '#000000' : '#ffffff',\n border: light ? '#cccccc' : '#333333',\n ...(settings.gridVisible\n ? { grid: settings.gridColor }\n : { grid: 'transparent' }),\n },\n });\n }, []);\n\n // ── Indicator remove / configure ──────────────────────────────────────────\n const handleRemoveIndicator = useCallback((id: string) => {\n chartRef.current?.removeIndicator(id);\n }, []);\n\n const handleConfigureIndicator = useCallback((indicator: IndicatorInstance) => {\n setConfigTarget(indicator);\n }, []);\n\n const handleSaveConfig = useCallback(\n (newConfig: IndicatorConfig) => {\n const chart = chartRef.current;\n if (!chart || !configTarget) return;\n chart.removeIndicator(configTarget.id);\n chart.addIndicator(newConfig);\n setConfigTarget(null);\n },\n [configTarget],\n );\n\n // ── Drawing tool selection ─────────────────────────────────────────────────\n const POINTER_TOOLS: PointerToolType[] = ['cursor', 'crosshair', 'dot', 'demonstration'];\n\n const handleToolSelect = useCallback((tool: DrawingToolType) => {\n setActiveTool(tool);\n const chart = chartRef.current;\n if (!chart) return;\n\n const isPointerTool = (POINTER_TOOLS as string[]).includes(tool);\n if (isPointerTool) {\n chart.cancelDrawingTool();\n // Only the crosshair tool uses the SDK crosshair lines.\n // dot/demonstration use PointerOverlay for their own visuals.\n chart.setCrosshairEnabled(tool === 'crosshair');\n // Hide the native OS cursor for any tool that provides its own visual.\n chart.setNativeCursorHidden(tool !== 'cursor');\n } else {\n chart.setCrosshairEnabled(false); // drawing tool uses its own cursor\n chart.startDrawingTool(tool as DrawingType);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // ── Divider drag: price | sub-pane area split ──────────────────────────────\n const handlePriceDividerDrag = useCallback(\n (dy: number) => {\n if (totalHeight === 0) return;\n setPriceFraction((prev) => {\n const next = Math.min(0.85, Math.max(0.3, prev + dy / totalHeight));\n onPriceFractionChange?.(next);\n return next;\n });\n },\n [totalHeight],\n );\n\n // ── Divider drag: between two sub-panes ──────────────────────────────────\n const handleSubPaneDividerDrag = useCallback(\n (paneId: string, dy: number) => {\n const chart = chartRef.current;\n if (!chart || totalHeight === 0) return;\n const subH = totalHeight * (1 - priceFraction);\n if (subH === 0) return;\n const currentPanes = chart.getPanes();\n const pane = currentPanes.find((p: PaneDescriptor) => p.id === paneId);\n if (!pane) return;\n const newFraction = Math.min(0.9, Math.max(0.05, pane.heightFraction + dy / subH));\n chart.resizePane(paneId, newFraction);\n setPanes([...chart.getPanes()]);\n },\n [totalHeight, priceFraction],\n );\n\n // ── Derived layout dims ────────────────────────────────────────────────────\n const hasSubPanes = panes.length > 0;\n const priceH = hasSubPanes ? totalHeight * priceFraction : totalHeight;\n const subH = totalHeight * (1 - priceFraction);\n\n return (\n <div\n ref={outerRef}\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n display: 'flex',\n gap: 8,\n overflow: 'hidden',\n }}\n >\n {/* ── Drawing toolbar: full-height left column ─────────────────────── */}\n <LeftToolbar\n activeTool={activeTool}\n onSelectTool={handleToolSelect}\n onVisibilityAction={handleVisibilityAction}\n visibilityActiveAction={visibilityActiveAction}\n onVisibilityDeactivate={handleVisibilityDeactivate}\n onDeleteClick={() => chartRef.current?.deleteSelectedDrawing()}\n />\n\n {/* ── Chart content: price pane + sub-panes ─────────────────────────── */}\n <div\n className={activeTool === 'crosshair' ? 'chart-crosshair-mode' : undefined}\n style={{\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n position: 'relative',\n minWidth: 0,\n cursor:\n activeTool === 'crosshair' ? 'none' :\n activeTool === 'dot' || activeTool === 'demonstration' ? 'none' :\n activeTool === 'cursor' ? 'default' :\n 'crosshair', // drawing tools\n }}\n onMouseMove={(e) => {\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n crosshairXRef.current = e.clientX - rect.left;\n }}\n onMouseLeave={() => { crosshairXRef.current = null; }}\n >\n {/* ── Price pane ──────────────────────────────────────────────────── */}\n <div\n style={{ position: 'relative', height: `${priceH}px`, flexShrink: 0 }}\n onContextMenu={handleCanvasContextMenu}\n >\n <div ref={priceRef} style={{ width: '100%', height: '100%' }} />\n {/* Overlay canvas: script/indicator lines drawn on the price pane */}\n <canvas\n ref={overlayCanvasRef}\n style={{\n position: 'absolute', top: 0, left: 0,\n width: '100%', height: '100%',\n pointerEvents: 'none', zIndex: 2,\n }}\n /> {/* Pointer tool overlay: dot & demonstration visuals */}\n {(activeTool === 'dot' || activeTool === 'demonstration') && (\n <PointerOverlay\n mode={activeTool}\n width={priceRef.current?.clientWidth ?? 0}\n height={priceH}\n />\n )} {/* Price pane header: OHLCV + overlay indicator legend */}\n <PricePaneHeader\n symbol={symbol}\n timeframe={timeframe}\n bars={bars}\n theme={theme}\n indicators={indicators}\n overlayColors={OVERLAY_COLORS}\n onRemove={handleRemoveIndicator}\n onConfigure={handleConfigureIndicator}\n {...(getExchangeLogoUrl ? { getExchangeLogoUrl } : {})}\n />\n </div>\n\n {/* ── Loading / error overlays ───────────────────────────────────────── */}\n {loading && (\n <div\n style={{\n position: 'absolute',\n top: priceH / 2 - 12,\n left: '50%',\n transform: 'translateX(-50%)',\n color: 'var(--text-muted, #787b86)',\n fontSize: 13,\n pointerEvents: 'none',\n zIndex: 10,\n }}\n >\n Loading…\n </div>\n )}\n {error && (\n <div\n style={{\n position: 'absolute',\n top: priceH / 2 - 12,\n left: '50%',\n transform: 'translateX(-50%)',\n color: '#ef5350',\n fontSize: 13,\n pointerEvents: 'none',\n zIndex: 10,\n }}\n >\n {error}\n </div>\n )}\n\n {/* ── Indicator sub-panes ─────────────────────────────────────────────── */}\n {hasSubPanes && (\n <>\n <Divider onDrag={handlePriceDividerDrag} />\n {panes.map((pane, idx) => {\n const paneH = Math.max(60, Math.round(subH * pane.heightFraction));\n const paneIndicators = indicators.filter((ind) =>\n pane.indicatorIds.includes(ind.id),\n );\n return (\n <div\n key={pane.id}\n style={{ display: 'flex', flexDirection: 'column' }}\n >\n <IndicatorPane\n indicators={paneIndicators}\n bars={bars}\n transform={transformRef.current}\n height={paneH}\n theme={theme}\n computedResults={computedResults}\n crosshairXRef={crosshairXRef}\n onRemove={handleRemoveIndicator}\n onConfigure={handleConfigureIndicator}\n />\n {idx < panes.length - 1 && (\n <Divider onDrag={(dy) => handleSubPaneDividerDrag(pane.id, dy)} />\n )}\n </div>\n );\n })}\n </>\n )}\n </div>\n\n {/* ── Indicator config dialog ────────────────────────────────────────── */}\n {configTarget && (\n <IndicatorConfigDialog\n indicator={configTarget}\n onSave={handleSaveConfig}\n onClose={() => setConfigTarget(null)}\n />\n )}\n\n {/* ── Drawing context menu ──────────────────────────────────────────── */}\n {ctxMenu && (\n <>\n {/* Transparent backdrop to dismiss the menu on outside click */}\n <div\n className=\"drawing-ctx-backdrop\"\n onClick={() => setCtxMenu(null)}\n onContextMenu={(e) => { e.preventDefault(); setCtxMenu(null); }}\n />\n <div\n className=\"drawing-ctx-menu\"\n style={{ left: ctxMenu.x, top: ctxMenu.y }}\n >\n <button\n className=\"drawing-ctx-item\"\n onClick={() => {\n chartRef.current?.removeDrawing(ctxMenu.drawingId);\n setCtxMenu(null);\n }}\n >\n Remove\n </button>\n </div>\n </>\n )}\n\n {/* ── Chart canvas context menu ─────────────────────────────────────── */}\n {chartCtxMenu && (\n <ChartContextMenu\n x={chartCtxMenu.x}\n y={chartCtxMenu.y}\n onClose={() => setChartCtxMenu(null)}\n onSettings={() => setSettingsOpen(true)}\n onClearDrawings={handleClearDrawings}\n onClearIndicators={handleClearIndicators}\n onResetView={handleResetView}\n />\n )}\n\n {/* ── Chart settings dialog ─────────────────────────────────────────── */}\n {settingsOpen && (\n <ChartSettingsDialog\n initialSettings={canvasSettings}\n onApply={handleApplySettings}\n onClose={() => setSettingsOpen(false)}\n />\n )}\n </div>\n );\n});\n\n/** @deprecated Use ChartCanvas */\nexport const MultiPaneChart = ChartCanvas;\n","import React, { useRef, useState } from 'react';\n\nexport type TabItem = {\n id: string;\n label: string;\n /** Whether this tab has been saved to the DB (shows a saved indicator). */\n isSaved?: boolean;\n};\n\ntype Props = {\n tabs: TabItem[];\n activeId: string;\n onSelect: (id: string) => void;\n onAdd: () => void;\n onClose: (id: string) => void;\n onRename: (id: string, label: string) => void;\n};\n\nexport function TabBar({ tabs, activeId, onSelect, onAdd, onClose, onRename }: Props) {\n const [editingId, setEditingId] = useState<string | null>(null);\n const [editValue, setEditValue] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n\n function startEdit(tab: TabItem, e: React.MouseEvent) {\n e.stopPropagation();\n setEditingId(tab.id);\n setEditValue(tab.label);\n setTimeout(() => inputRef.current?.select(), 0);\n }\n\n function commitEdit() {\n if (editingId && editValue.trim()) {\n onRename(editingId, editValue.trim());\n }\n setEditingId(null);\n }\n\n return (\n <div className=\"tab-bar\">\n {tabs.map((tab) => (\n <div\n key={tab.id}\n className={`tab-item${tab.id === activeId ? ' active' : ''}`}\n onClick={() => onSelect(tab.id)}\n onDoubleClick={(e) => startEdit(tab, e)}\n title=\"Double-click to rename\"\n >\n {editingId === tab.id ? (\n <input\n ref={inputRef}\n className=\"tab-rename-input\"\n value={editValue}\n onChange={(e) => setEditValue(e.target.value)}\n onBlur={commitEdit}\n onKeyDown={(e) => {\n if (e.key === 'Enter') commitEdit();\n if (e.key === 'Escape') setEditingId(null);\n }}\n onClick={(e) => e.stopPropagation()}\n autoFocus\n />\n ) : (\n <span className=\"tab-label\">\n {tab.label}\n {tab.isSaved && <span className=\"tab-saved-dot\" title=\"Saved layout\" />}\n </span>\n )}\n {tabs.length > 1 && (\n <button\n className=\"tab-close\"\n title=\"Close tab\"\n onClick={(e) => {\n e.stopPropagation();\n onClose(tab.id);\n }}\n >\n ×\n </button>\n )}\n </div>\n ))}\n <button className=\"tab-add\" onClick={onAdd} title=\"New chart tab\">\n +\n </button>\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\n\nexport type LayoutRecord = {\n id: string;\n name: string;\n symbol: string;\n timeframe: string;\n config: Record<string, unknown>;\n is_default: boolean;\n created_at: string;\n updated_at: string;\n};\n\ntype Props = {\n /** Name of the currently loaded layout (if saved). */\n currentName?: string | undefined;\n /** DB id of the currently active layout — used to highlight it in the list. */\n currentLayoutId?: string | undefined;\n /** Whether auto-save is currently enabled for the active tab. */\n autoSave: boolean;\n /**\n * Called by LayoutMenu to fetch the current list of saved layouts when the\n * menu opens. Should return the full list from the server.\n */\n onFetchLayouts: () => Promise<LayoutRecord[]>;\n onSave: (name: string) => Promise<void>;\n onLoad: (layoutId: string) => Promise<void>;\n onRename: (newName: string) => Promise<void>;\n onCopy: (newName: string) => Promise<void>;\n onToggleAutoSave: (enabled: boolean) => void;\n onDelete: (id: string) => Promise<void>;\n onOpenInNewTab: (id: string) => Promise<void>;\n};\n\ntype View = 'menu' | 'save' | 'rename' | 'copy';\n\nexport function LayoutMenu({\n currentName,\n currentLayoutId,\n autoSave,\n onFetchLayouts,\n onSave,\n onLoad,\n onRename,\n onCopy,\n onToggleAutoSave,\n onDelete,\n onOpenInNewTab,\n}: Props) {\n const [open, setOpen] = useState(false);\n const [view, setView] = useState<View>('menu');\n const [inputVal, setInputVal] = useState('');\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [layouts, setLayouts] = useState<LayoutRecord[]>([]);\n const [loadError, setLoadError] = useState<string | null>(null);\n const [fetching, setFetching] = useState(false);\n const [confirmDelete, setConfirmDelete] = useState<{ id: string; name: string } | null>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n\n // Close on outside click\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\n setOpen(false);\n setView('menu');\n }\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [open]);\n\n // Fetch saved layouts when menu opens\n useEffect(() => {\n if (!open) return;\n setLoadError(null);\n setFetching(true);\n onFetchLayouts()\n .then(setLayouts)\n .catch((err: Error) => setLoadError(err.message))\n .finally(() => setFetching(false));\n }, [open]);\n\n const isSaved = !!currentLayoutId;\n\n function openMenu() {\n setError(null);\n setView('menu');\n setOpen((o) => !o);\n }\n\n function startView(v: View, prefill: string) {\n setInputVal(prefill);\n setError(null);\n setView(v);\n }\n\n async function handleSubmit(action: (name: string) => Promise<void>) {\n const name = inputVal.trim();\n if (!name) return;\n setBusy(true);\n setError(null);\n try {\n await action(name);\n setOpen(false);\n setView('menu');\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Action failed');\n } finally {\n setBusy(false);\n }\n }\n\n async function handleLoad(id: string) {\n setOpen(false);\n try {\n await onLoad(id);\n } catch (err: unknown) {\n // Silently ignore — App.tsx surfaces errors via tab state\n console.error('Load layout error:', err);\n }\n }\n\n async function handleOpenInNewTabLocal(id: string) {\n setOpen(false);\n try {\n await onOpenInNewTab(id);\n } catch (err: unknown) {\n console.error('Open layout in new tab error:', err);\n }\n }\n\n async function handleConfirmDelete() {\n if (!confirmDelete) return;\n try {\n await onDelete(confirmDelete.id);\n setLayouts((prev) => prev.filter((l) => l.id !== confirmDelete.id));\n setConfirmDelete(null);\n } catch {\n setConfirmDelete(null);\n }\n }\n\n function fmtError(msg: string) {\n return msg.includes('401') || msg.includes('Missing authorization')\n ? 'Sign in to use layouts'\n : msg;\n }\n\n function renderForm(\n label: string,\n placeholder: string,\n action: (name: string) => Promise<void>,\n note?: string,\n ) {\n return (\n <div className=\"layout-save-form\">\n <div className=\"layout-save-label\">{label}</div>\n {note && <div className=\"layout-dropdown-empty\" style={{ padding: '0 0 4px' }}>{note}</div>}\n <input\n className=\"layout-save-input\"\n value={inputVal}\n onChange={(e) => setInputVal(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleSubmit(action);\n if (e.key === 'Escape') setView('menu');\n }}\n placeholder={placeholder}\n autoFocus\n />\n {error && (\n <div className=\"layout-dropdown-error\" style={{ padding: 0, fontSize: 11 }}>\n {fmtError(error)}\n </div>\n )}\n <div className=\"layout-save-actions\">\n <button onClick={() => setView('menu')}>Cancel</button>\n <button\n className={inputVal.trim() && !busy ? 'active' : undefined}\n onClick={() => handleSubmit(action)}\n disabled={busy || !inputVal.trim()}\n >\n {busy ? 'Saving…' : 'Save'}\n </button>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"layout-menu-root\" ref={menuRef}>\n <button\n className={open ? 'active' : undefined}\n onClick={openMenu}\n title=\"Manage chart layouts\"\n style={{ display: 'flex', alignItems: 'center', gap: 4 }}\n >\n <svg viewBox=\"0 0 14 14\" width=\"12\" height=\"12\" fill=\"currentColor\">\n <rect x=\"1\" y=\"1\" width=\"5\" height=\"5\" rx=\"1\" />\n <rect x=\"8\" y=\"1\" width=\"5\" height=\"5\" rx=\"1\" />\n <rect x=\"1\" y=\"8\" width=\"5\" height=\"5\" rx=\"1\" />\n <rect x=\"8\" y=\"8\" width=\"5\" height=\"5\" rx=\"1\" />\n </svg>\n {currentName ?? 'Layout'} ▾\n {autoSave && isSaved && (\n <span className=\"layout-autosave-dot\" title=\"Auto-save enabled\" />\n )}\n </button>\n\n {open && (\n <div className=\"layout-dropdown\">\n {view === 'menu' && (\n <>\n {/* ── Auto-save toggle ──────────────────────────────────── */}\n <label className=\"layout-dropdown-item layout-autosave-row\">\n <svg className=\"layout-menu-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <polyline points=\"23 4 23 10 17 10\"/>\n <path d=\"M20.49 15a9 9 0 1 1-2.12-9.36L23 10\"/>\n </svg>\n Auto-save\n <span className=\"layout-autosave-status\">\n {autoSave && isSaved && <span style={{ color: 'var(--up)' }}>ON</span>}\n {autoSave && !isSaved && <span style={{ color: 'var(--text-muted)' }}>save first</span>}\n </span>\n <span\n className={`layout-toggle-switch${autoSave ? ' on' : ''}`}\n onClick={(e) => { e.preventDefault(); onToggleAutoSave(!autoSave); }}\n role=\"switch\"\n aria-checked={autoSave}\n >\n <span className=\"layout-toggle-thumb\" />\n </span>\n </label>\n\n <div className=\"layout-dropdown-divider\" />\n\n {/* ── Action buttons ────────────────────────────────────── */}\n <button\n className=\"layout-dropdown-item\"\n onClick={() => startView('save', currentName ?? '')}\n >\n <svg className=\"layout-menu-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z\"/>\n <polyline points=\"17 21 17 13 7 13 7 21\"/>\n <polyline points=\"7 3 7 8 15 8\"/>\n </svg>\n Save layout…\n </button>\n\n {isSaved && (\n <button\n className=\"layout-dropdown-item\"\n onClick={() => startView('rename', currentName ?? '')}\n >\n <svg className=\"layout-menu-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M12 20h9\"/>\n <path d=\"M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4 12.5-12.5z\"/>\n </svg>\n Rename…\n </button>\n )}\n\n <button\n className=\"layout-dropdown-item\"\n onClick={() => startView('copy', `${currentName ?? 'Layout'} copy`)}\n >\n <svg className=\"layout-menu-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"/>\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"/>\n </svg>\n Copy layout…\n </button>\n\n <div className=\"layout-dropdown-divider\" />\n\n {/* ── Saved layouts list ────────────────────────────────── */}\n {fetching && <div className=\"layout-dropdown-empty\">Loading…</div>}\n {!fetching && loadError && (\n <div className=\"layout-dropdown-error\">{fmtError(loadError)}</div>\n )}\n {!fetching && !loadError && layouts.length === 0 && (\n <div className=\"layout-dropdown-empty\">No saved layouts yet</div>\n )}\n {!fetching && !loadError && layouts.length > 0 && (\n <>\n <div className=\"layout-dropdown-section\">Saved layouts</div>\n {layouts.map((l) => (\n <div key={l.id} style={{ display: 'flex', alignItems: 'center' }}>\n <button\n className={`layout-dropdown-item${l.id === currentLayoutId ? ' layout-dropdown-item--current' : ''}`}\n onClick={() => l.id === currentLayoutId ? handleLoad(l.id) : handleOpenInNewTabLocal(l.id)}\n title={`${l.symbol} · ${l.timeframe} · ${new Date(l.updated_at).toLocaleDateString()}`}\n style={{ flex: 1, textAlign: 'left' }}\n >\n {l.id === currentLayoutId ? (\n <svg className=\"layout-menu-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <polyline points=\"20 6 9 17 4 12\"/>\n </svg>\n ) : (\n <svg className=\"layout-menu-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\"/>\n </svg>\n )}\n <span style={{ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', minWidth: 0 }}>{l.name}</span>\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); setConfirmDelete({ id: l.id, name: l.name }); }}\n title=\"Delete layout\"\n style={{ padding: '4px 8px', opacity: 0.45, flexShrink: 0, lineHeight: 1, width: 'auto' }}\n className=\"layout-dropdown-item\"\n >\n ✕\n </button>\n </div>\n ))}\n </>\n )}\n {confirmDelete && (\n <div style={{ padding: '8px 12px', borderTop: '1px solid var(--border)' }}>\n <div style={{ fontSize: 12, marginBottom: 8 }}>\n Delete <strong>{confirmDelete.name}</strong>? This cannot be undone.\n </div>\n <div style={{ display: 'flex', gap: 6, justifyContent: 'flex-end' }}>\n <button onClick={() => setConfirmDelete(null)}>Cancel</button>\n <button onClick={handleConfirmDelete} style={{ color: 'var(--down, #ef5350)' }}>Delete</button>\n </div>\n </div>\n )}\n </>\n )}\n\n {view === 'save' && renderForm('Layout name', 'My layout', onSave)}\n {view === 'rename' && renderForm('Rename layout', currentName ?? 'Layout', onRename)}\n {view === 'copy' && renderForm(\n 'Copy to new layout',\n `${currentName ?? 'Layout'} copy`,\n onCopy,\n 'Creates a copy of the current layout in a new tab.',\n )}\n </div>\n )}\n </div>\n );\n}\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport type { RefSymbol, ISymbolResolver, SymbolSearchResult } from '@forgecharts/types';\n\nconst PAGE_SIZE = 100;\n\nconst TABS = [\n { label: 'All', market: '' },\n { label: 'Stocks', market: 'stocks' },\n { label: 'Funds', market: 'etfs' },\n { label: 'Futures', market: 'futures' },\n { label: 'Forex', market: 'forex' },\n { label: 'Crypto', market: 'crypto' },\n { label: 'Indices', market: 'indices' },\n { label: 'Bonds', market: 'bonds' },\n { label: 'Economy', market: 'economy' },\n { label: 'Options', market: 'options' },\n];\n\ntype SymbolEntry = {\n symbol: string;\n name: string;\n symbolKey?: string;\n exchange: string;\n assetType: string;\n market: string;\n logoUrl?: string;\n};\n\nfunction refSymbolsToEntries(symbols: RefSymbol[]): SymbolEntry[] {\n return symbols.map(s => ({\n symbol: s.symbol,\n name: s.displayName,\n symbolKey: s.symbolKey,\n exchange: s.exchange,\n assetType: s.assetType,\n market: s.market,\n ...(s.logoUrl ? { logoUrl: s.logoUrl } : {}),\n }));\n}\n\nfunction stringColor(str: string): string {\n const palette = [\n '#f7931a','#627eea','#2775ca','#26a17b','#e84142',\n '#00adef','#e91e63','#9945ff','#00d4aa','#ff6b35',\n ];\n let h = 0;\n for (let i = 0; i < str.length; i++) h = (Math.imul(31, h) + str.charCodeAt(i)) | 0;\n return palette[Math.abs(h) % palette.length] ?? '#888888';\n}\n\nfunction badgeLabel(assetType: string, market: string): string {\n const a = assetType?.toLowerCase() ?? '';\n const m = market?.toLowerCase() ?? '';\n if (a && m && a !== m) return `${a} ${m}`;\n return a || m || '';\n}\n\nfunction SymbolIcon({ logoUrl, letter, color }: { logoUrl?: string; letter: string; color: string }) {\n const [failed, setFailed] = useState(false);\n return (\n <span className=\"sym-row-icon\" style={{ background: (logoUrl && !failed) ? 'transparent' : color }}>\n {logoUrl && !failed\n ? <img src={logoUrl} alt=\"\" className=\"sym-logo-img\" onError={() => setFailed(true)} />\n : letter}\n </span>\n );\n}\n\ntype Props = {\n current: string;\n onSelect: (symbol: string) => void;\n onClose: () => void;\n symbolResolver: ISymbolResolver;\n};\n\nexport function SymbolSearchDialog({ current, onSelect, onClose, symbolResolver }: Props) {\n const [query, setQuery] = useState('');\n const [activeTab, setActiveTab] = useState(0);\n const [tabSymbols, setTabSymbols] = useState<SymbolEntry[]>([]);\n const [tabLoading, setTabLoading] = useState(false);\n const [tabLoadingMore, setTabLoadingMore] = useState(false);\n const [tabOffset, setTabOffset] = useState(0);\n const [tabHasMore, setTabHasMore] = useState(false);\n const [searchResults, setSearchResults] = useState<SymbolEntry[] | null>(null);\n const [isSearching, setIsSearching] = useState(false);\n const [searchingMore, setSearchingMore] = useState(false);\n const [searchOffset, setSearchOffset] = useState(0);\n const [searchHasMore, setSearchHasMore] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const dialogRef = useRef<HTMLDivElement>(null);\n const sentinelRef = useRef<HTMLDivElement>(null);\n const searchTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const queryRef = useRef(query);\n const activeTabRef = useRef(activeTab);\n queryRef.current = query;\n activeTabRef.current = activeTab;\n\n useEffect(() => { inputRef.current?.focus(); }, []);\n\n useEffect(() => {\n const h = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); };\n window.addEventListener('keydown', h);\n return () => window.removeEventListener('keydown', h);\n }, [onClose]);\n\n // Tab browse: use getSymbols() for all tabs — supports offset pagination.\n useEffect(() => {\n const market = TABS[activeTab]?.market ?? '';\n let cancelled = false;\n setTabLoading(true);\n setTabSymbols([]);\n setTabOffset(0);\n setTabHasMore(false);\n symbolResolver.getSymbols({ ...(market ? { market } : {}), limit: PAGE_SIZE, offset: 0 })\n .then((r: SymbolSearchResult) => {\n if (!cancelled) {\n setTabSymbols(refSymbolsToEntries(r.symbols));\n setTabHasMore(r.symbols.length === PAGE_SIZE);\n setTabOffset(PAGE_SIZE);\n }\n })\n .catch(() => {})\n .finally(() => { if (!cancelled) setTabLoading(false); });\n return () => { cancelled = true; };\n }, [activeTab]);\n\n const loadMoreTab = useCallback(async () => {\n if (tabLoadingMore || !tabHasMore) return;\n const market = TABS[activeTabRef.current]?.market ?? '';\n setTabLoadingMore(true);\n try {\n const r = await symbolResolver.getSymbols({ ...(market ? { market } : {}), limit: PAGE_SIZE, offset: tabOffset });\n setTabSymbols(prev => [...prev, ...refSymbolsToEntries(r.symbols)]);\n setTabHasMore(r.symbols.length === PAGE_SIZE);\n setTabOffset(prev => prev + PAGE_SIZE);\n } catch { /* ignore */ }\n finally { setTabLoadingMore(false); }\n }, [tabLoadingMore, tabHasMore, tabOffset]);\n\n const loadMoreSearch = useCallback(async () => {\n if (searchingMore || !searchHasMore) return;\n const q = queryRef.current.trim();\n if (!q) return;\n const market = TABS[activeTabRef.current]?.market;\n setSearchingMore(true);\n try {\n const res = await symbolResolver.searchSymbols(q, {\n limit: PAGE_SIZE, offset: searchOffset,\n ...(market ? { market } : {}),\n });\n setSearchResults(prev => prev ? [...prev, ...refSymbolsToEntries(res.symbols)] : refSymbolsToEntries(res.symbols));\n setSearchHasMore(res.symbols.length === PAGE_SIZE);\n setSearchOffset(prev => prev + PAGE_SIZE);\n } catch { /* ignore */ }\n finally { setSearchingMore(false); }\n }, [searchingMore, searchHasMore, searchOffset]);\n\n // Stable refs so the IntersectionObserver callback always calls the latest version\n const loadMoreTabRef = useRef(loadMoreTab);\n const loadMoreSearchRef = useRef(loadMoreSearch);\n loadMoreTabRef.current = loadMoreTab;\n loadMoreSearchRef.current = loadMoreSearch;\n\n // Sentinel IntersectionObserver — fires loadMore when the bottom of the list enters view\n useEffect(() => {\n const sentinel = sentinelRef.current;\n if (!sentinel) return;\n const observer = new IntersectionObserver(entries => {\n if (entries[0]?.isIntersecting) {\n if (queryRef.current.trim()) {\n void loadMoreSearchRef.current();\n } else {\n void loadMoreTabRef.current();\n }\n }\n }, { threshold: 0.1 });\n observer.observe(sentinel);\n return () => observer.disconnect();\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n const doSearch = useCallback((q: string, tab: number) => {\n if (searchTimer.current) clearTimeout(searchTimer.current);\n if (!q.trim()) {\n setSearchResults(null);\n setSearchOffset(0);\n setSearchHasMore(false);\n return;\n }\n setIsSearching(true);\n searchTimer.current = setTimeout(async () => {\n try {\n const market = TABS[tab]?.market;\n const res = await symbolResolver.searchSymbols(q.trim(), {\n limit: PAGE_SIZE, offset: 0,\n ...(market ? { market } : {}),\n });\n setSearchResults(refSymbolsToEntries(res.symbols));\n setSearchHasMore(res.symbols.length === PAGE_SIZE);\n setSearchOffset(PAGE_SIZE);\n } catch {\n setSearchResults([]);\n setSearchHasMore(false);\n } finally {\n setIsSearching(false);\n }\n }, 180);\n }, []);\n\n const handleQueryChange = (value: string) => {\n setQuery(value);\n doSearch(value, activeTab);\n };\n\n const handleTabChange = (i: number) => {\n setActiveTab(i);\n if (queryRef.current.trim()) doSearch(queryRef.current, i);\n };\n\n const handleBackdrop = (e: React.MouseEvent) => {\n if (dialogRef.current && !dialogRef.current.contains(e.target as Node)) onClose();\n };\n\n const isSearch = query.trim().length > 0;\n const displayList = isSearch ? (searchResults ?? []) : tabSymbols;\n // Use exchange:symbol format (strip market prefix from symbolKey) so the\n // datafeed can pass it directly to the TV API, e.g. \"BINANCE:BTCUSDT\"\n const toFeedSymbol = (entry: SymbolEntry): string => {\n if (!entry.symbolKey) return entry.symbol;\n const parts = entry.symbolKey.split(':');\n // symbolKey is MARKET:EXCHANGE:SYMBOL → we want EXCHANGE:SYMBOL\n return parts.length >= 3 ? parts.slice(1).join(':') : entry.symbolKey;\n };\n const pick = (entry: SymbolEntry) => { onSelect(toFeedSymbol(entry)); onClose(); };\n\n const renderRow = (entry: SymbolEntry) => {\n const iconColor = stringColor(entry.symbol);\n const exchColor = stringColor(entry.exchange);\n const letter = entry.symbol.charAt(0).toUpperCase();\n const exchAbbr = entry.exchange.slice(0, 2).toUpperCase();\n const badge = badgeLabel(entry.assetType, entry.market);\n return (\n <button\n key={entry.symbolKey ?? `${entry.exchange}:${entry.symbol}`}\n className={`sym-row${entry.symbol === current ? ' active' : ''}`}\n onClick={() => pick(entry)}\n >\n <SymbolIcon\n letter={letter}\n color={iconColor}\n {...(entry.logoUrl ? { logoUrl: entry.logoUrl } : {})}\n />\n <span className=\"sym-row-info\">\n <span className=\"sym-row-ticker\">{entry.symbol}</span>\n <span className=\"sym-row-name\">{entry.name}</span>\n </span>\n {badge && <span className=\"sym-row-badge\">{badge}</span>}\n <span className=\"sym-row-exchange\">{entry.exchange}</span>\n <span className=\"sym-row-exch-icon\" style={{ background: exchColor }}>{exchAbbr}</span>\n </button>\n );\n };\n\n const renderDirectRow = () => {\n const q = query.trim();\n if (!q) return null;\n return (\n <button\n className=\"sym-row\"\n onClick={() => { onSelect(q.toUpperCase()); onClose(); }}\n style={{ borderTop: '1px solid var(--sym-border, rgba(255,255,255,.08))', marginTop: 4 }}\n >\n <span className=\"sym-row-icon\" style={{ background: '#444', fontSize: 11, fontWeight: 700 }}>→</span>\n <span className=\"sym-row-info\">\n <span className=\"sym-row-ticker\">{q.toUpperCase()}</span>\n <span className=\"sym-row-name\">Use this symbol directly</span>\n </span>\n </button>\n );\n };\n\n const renderBody = () => {\n if (isSearch && isSearching)\n return <div className=\"sym-list\">{renderDirectRow()}</div>;\n if (isSearch && searchResults !== null && searchResults.length === 0)\n return <div className=\"sym-list\">{renderDirectRow()}</div>;\n if (!isSearch && tabLoading)\n return <div className=\"sym-empty\">Loading...</div>;\n if (displayList.length === 0 && !isSearch && !tabLoading)\n return <div className=\"sym-empty\">No data — run a Symbol Sync from the Studio</div>;\n const loadingMore = isSearch ? searchingMore : tabLoadingMore;\n if (isSearch)\n return (\n <div className=\"sym-list\">\n {displayList.map(renderRow)}\n {renderDirectRow()}\n <div ref={sentinelRef} className=\"sym-sentinel\" />\n {loadingMore && <div className=\"sym-loading-more\">Loading more…</div>}\n </div>\n );\n return (\n <div className=\"sym-list\">\n {displayList.map(renderRow)}\n <div ref={sentinelRef} className=\"sym-sentinel\" />\n {loadingMore && <div className=\"sym-loading-more\">Loading more…</div>}\n </div>\n );\n };\n\n return (\n <div className=\"sym-backdrop\" onMouseDown={handleBackdrop}>\n <div className=\"sym-dialog\" ref={dialogRef} role=\"dialog\" aria-modal=\"true\" aria-label=\"Symbol Search\">\n\n {/* Header */}\n <div className=\"sym-header\">\n <span className=\"sym-header-title\">Symbol Search</span>\n <button className=\"sym-header-close\" onClick={onClose} aria-label=\"Close\">\n <svg viewBox=\"0 0 14 14\" width=\"13\" height=\"13\" stroke=\"currentColor\"\n strokeWidth=\"2.2\" strokeLinecap=\"round\" fill=\"none\">\n <line x1=\"2\" y1=\"2\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"2\" x2=\"2\" y2=\"12\" />\n </svg>\n </button>\n </div>\n\n {/* Search input */}\n <div className=\"sym-search-row\">\n <svg className=\"sym-search-icon\" viewBox=\"0 0 16 16\" width=\"15\" height=\"15\"\n stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.8\" strokeLinecap=\"round\">\n <circle cx=\"6.5\" cy=\"6.5\" r=\"4.5\" />\n <line x1=\"10.5\" y1=\"10.5\" x2=\"14\" y2=\"14\" />\n </svg>\n <input\n ref={inputRef}\n className=\"sym-search-input\"\n type=\"text\"\n value={query}\n onChange={(e) => handleQueryChange(e.target.value)}\n placeholder=\"Search symbols or names...\"\n autoComplete=\"off\"\n spellCheck={false}\n />\n {query && (\n <button className=\"sym-search-clear\" onClick={() => { setQuery(''); setSearchResults(null); }} aria-label=\"Clear\">\n <svg viewBox=\"0 0 12 12\" width=\"11\" height=\"11\" stroke=\"currentColor\"\n strokeWidth=\"2.2\" strokeLinecap=\"round\" fill=\"none\">\n <line x1=\"2\" y1=\"2\" x2=\"10\" y2=\"10\" />\n <line x1=\"10\" y1=\"2\" x2=\"2\" y2=\"10\" />\n </svg>\n </button>\n )}\n </div>\n\n {/* Category tabs */}\n <div className=\"sym-tabs\">\n {TABS.map((tab, i) => (\n <button\n key={tab.label}\n className={`sym-tab${i === activeTab ? ' active' : ''}`}\n onClick={() => handleTabChange(i)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* Results */}\n <div className=\"sym-list-wrap\">\n {renderBody()}\n </div>\n\n {/* Footer */}\n <div className=\"sym-footer\">Search using ISIN and CUSIP codes</div>\n\n </div>\n </div>\n );\n}","import { useState, useEffect, useRef } from 'react';\nimport type { IndicatorConfig } from '@forgecharts/types';\n\n// ── Indicator catalogue ───────────────────────────────────────────────────────\n\ntype CatalogEntry = {\n type: IndicatorConfig['type'];\n label: string;\n description: string;\n author: string;\n category: Category;\n defaultConfig: IndicatorConfig;\n};\n\ntype Category = 'All' | 'Trend' | 'Momentum' | 'Volume' | 'Volatility';\nconst CATEGORIES: Category[] = ['All', 'Trend', 'Momentum', 'Volume', 'Volatility'];\n\n// Sorted alphabetically by label\nconst CATALOGUE: CatalogEntry[] = [\n {\n type: 'atr',\n label: 'ATR',\n description: 'Average True Range — measures market volatility as the average of true ranges.',\n author: 'ForgeCharts',\n category: 'Volatility',\n defaultConfig: { type: 'atr', params: { period: 14 }, overlay: false },\n },\n {\n type: 'bbands',\n label: 'Bollinger Bands',\n description: 'Volatility bands placed above and below an SMA at ±N standard deviations.',\n author: 'ForgeCharts',\n category: 'Trend',\n defaultConfig: { type: 'bbands', params: { period: 20, multiplier: 2 }, overlay: true },\n },\n {\n type: 'ema',\n label: 'EMA',\n description: 'Exponential Moving Average — weights recent bars more heavily.',\n author: 'ForgeCharts',\n category: 'Trend',\n defaultConfig: { type: 'ema', params: { period: 20 }, overlay: true },\n },\n {\n type: 'macd',\n label: 'MACD',\n description: 'Moving Average Convergence/Divergence — trend-following momentum oscillator.',\n author: 'ForgeCharts',\n category: 'Momentum',\n defaultConfig: { type: 'macd', params: { fast: 12, slow: 26, signal: 9 }, overlay: false },\n },\n {\n type: 'obv',\n label: 'OBV',\n description: 'On-Balance Volume — running tally that adds/subtracts volume based on direction.',\n author: 'ForgeCharts',\n category: 'Volume',\n defaultConfig: { type: 'obv', overlay: false },\n },\n {\n type: 'rsi',\n label: 'RSI',\n description: 'Relative Strength Index — measures speed and magnitude of price changes (0–100).',\n author: 'ForgeCharts',\n category: 'Momentum',\n defaultConfig: { type: 'rsi', params: { period: 14 }, overlay: false },\n },\n {\n type: 'sma',\n label: 'SMA',\n description: 'Simple Moving Average — average closing price over N bars.',\n author: 'ForgeCharts',\n category: 'Trend',\n defaultConfig: { type: 'sma', params: { period: 20 }, overlay: true },\n },\n {\n type: 'stochastic',\n label: 'Stochastic',\n description: 'Stochastic Oscillator — compares closing price to high-low range over N bars.',\n author: 'ForgeCharts',\n category: 'Momentum',\n defaultConfig: { type: 'stochastic', params: { k: 14, d: 3 }, overlay: false },\n },\n {\n type: 'volume',\n label: 'Volume',\n description: 'Bar volume rendered as a histogram in a separate sub-pane.',\n author: 'ForgeCharts',\n category: 'Volume',\n defaultConfig: { type: 'volume', overlay: false },\n },\n {\n type: 'wma',\n label: 'WMA',\n description: 'Weighted Moving Average — linearly weighted toward recent bars.',\n author: 'ForgeCharts',\n category: 'Trend',\n defaultConfig: { type: 'wma', params: { period: 20 }, overlay: true },\n },\n];\n\n// ── Props ─────────────────────────────────────────────────────────────────────\n\ntype Props = {\n onAdd: (config: IndicatorConfig) => void;\n onClose: () => void;\n};\n\n// ── Component ─────────────────────────────────────────────────────────────────\n\nexport function IndicatorsDialog({ onAdd, onClose }: Props) {\n const [category, setCategory] = useState<Category>('All');\n const [query, setQuery] = useState('');\n const [added, setAdded] = useState<string | null>(null);\n const dialogRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => { inputRef.current?.focus(); }, []);\n\n useEffect(() => {\n const handler = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); };\n window.addEventListener('keydown', handler);\n return () => window.removeEventListener('keydown', handler);\n }, [onClose]);\n\n const handleBackdrop = (e: React.MouseEvent) => {\n if (dialogRef.current && !dialogRef.current.contains(e.target as Node)) onClose();\n };\n\n const q = query.trim().toLowerCase();\n const visible = CATALOGUE.filter((entry) => {\n const matchesCat = category === 'All' || entry.category === category;\n const matchesQ = !q || entry.label.toLowerCase().includes(q) || entry.description.toLowerCase().includes(q);\n return matchesCat && matchesQ;\n });\n\n const handleAdd = (entry: CatalogEntry) => {\n onAdd(entry.defaultConfig);\n setAdded(entry.type);\n setTimeout(() => setAdded(null), 1400);\n };\n\n return (\n <div className=\"ind-backdrop\" onMouseDown={handleBackdrop}>\n <div className=\"ind-dialog\" ref={dialogRef} role=\"dialog\" aria-modal=\"true\" aria-label=\"Indicators\">\n\n {/* Header */}\n <div className=\"ind-header\">\n <span className=\"ind-title\">Indicators</span>\n <button className=\"ind-close\" onClick={onClose} aria-label=\"Close\">\n <svg viewBox=\"0 0 14 14\" width=\"12\" height=\"12\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" fill=\"none\">\n <line x1=\"2\" y1=\"2\" x2=\"12\" y2=\"12\" /><line x1=\"12\" y1=\"2\" x2=\"2\" y2=\"12\" />\n </svg>\n </button>\n </div>\n\n {/* Search */}\n <div className=\"ind-search-row\">\n <svg viewBox=\"0 0 16 16\" width=\"13\" height=\"13\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.8\" strokeLinecap=\"round\" style={{ opacity: 0.5, flexShrink: 0 }}>\n <circle cx=\"6.5\" cy=\"6.5\" r=\"4.5\" /><line x1=\"10.5\" y1=\"10.5\" x2=\"14\" y2=\"14\" />\n </svg>\n <input\n ref={inputRef}\n className=\"ind-search-input\"\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Search indicators…\"\n autoComplete=\"off\"\n spellCheck={false}\n />\n {query && (\n <button className=\"ind-search-clear\" onClick={() => setQuery('')} aria-label=\"Clear\">\n <svg viewBox=\"0 0 12 12\" width=\"10\" height=\"10\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" fill=\"none\">\n <line x1=\"2\" y1=\"2\" x2=\"10\" y2=\"10\" /><line x1=\"10\" y1=\"2\" x2=\"2\" y2=\"10\" />\n </svg>\n </button>\n )}\n </div>\n\n {/* Category tabs */}\n <div className=\"ind-tabs\">\n {CATEGORIES.map((cat) => (\n <button\n key={cat}\n className={`ind-tab${cat === category ? ' active' : ''}`}\n onClick={() => setCategory(cat)}\n >\n {cat}\n </button>\n ))}\n </div>\n\n {/* Indicator list */}\n <div className=\"ind-list-wrap\">\n {visible.length === 0 ? (\n <div className=\"ind-empty\">No indicators match \"{query}\"</div>\n ) : (\n <>\n <div className=\"ind-section-hdr\">\n <span>Built-in</span>\n <span className=\"ind-section-count\">{visible.length}</span>\n </div>\n {visible.map((entry) => {\n const isAdded = added === entry.type;\n return (\n <button\n key={entry.type}\n className={`ind-list-row${isAdded ? ' added' : ''}`}\n onClick={() => handleAdd(entry)}\n >\n <div className=\"ind-list-info\">\n <span className=\"ind-list-name\">{entry.label}</span>\n <span className=\"ind-list-meta\">{entry.author} · {entry.category}</span>\n </div>\n <span className={`ind-list-badge${entry.defaultConfig.overlay ? ' overlay' : ' pane'}`}>\n {entry.defaultConfig.overlay ? 'Overlay' : 'Pane'}\n </span>\n <span className=\"ind-list-add\">\n {isAdded ? (\n <>\n <svg viewBox=\"0 0 12 10\" width=\"11\" height=\"10\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" fill=\"none\">\n <polyline points=\"1,5 4,8 11,1\" />\n </svg>\n Added\n </>\n ) : (\n <>\n <svg viewBox=\"0 0 12 12\" width=\"11\" height=\"11\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" fill=\"none\">\n <line x1=\"6\" y1=\"1\" x2=\"6\" y2=\"11\" /><line x1=\"1\" y1=\"6\" x2=\"11\" y2=\"6\" />\n </svg>\n Add to Chart\n </>\n )}\n </span>\n </button>\n );\n })}\n </>\n )}\n </div>\n\n </div>\n </div>\n );\n}\n","import { useState, useEffect, useRef } from 'react';\nimport type { ChartTheme, IndicatorConfig } from '@forgecharts/types';\nimport { LayoutMenu } from '../LayoutMenu';\nimport { SymbolSearchDialog } from '../SymbolSearchDialog';\nimport type { ISymbolResolver } from '@forgecharts/types';\nimport { IndicatorsDialog } from '../IndicatorsDialog';\n\n// ─── Timeframe data ───────────────────────────────────────────────────────────\n\nexport const DEFAULT_FAVORITES: string[] = ['1m', '5m', '15m', '30m', '1h', '4h', '1d', '1w'];\n\nconst TF_LABELS: Record<string, string> = {\n '1m': '1 minute', '2m': '2 minutes', '3m': '3 minutes', '4m': '4 minutes',\n '5m': '5 minutes', '10m': '10 minutes', '15m': '15 minutes', '20m': '20 minutes',\n '30m': '30 minutes', '45m': '45 minutes',\n '1h': '1 hour', '2h': '2 hours', '3h': '3 hours', '4h': '4 hours',\n '6h': '6 hours', '8h': '8 hours', '12h': '12 hours',\n '1d': '1 day', '2d': '2 days', '3d': '3 days', '1w': '1 week',\n '2w': '2 weeks', '1M': '1 month', '3M': '3 months', '6M': '6 months', '12M': '12 months',\n};\n\nconst TF_GROUPS_ALL: { label: string; items: string[] }[] = [\n { label: 'Minutes', items: ['1m', '2m', '3m', '4m', '5m', '10m', '15m', '20m', '30m', '45m'] },\n { label: 'Hours', items: ['1h', '2h', '3h', '4h', '6h', '8h', '12h'] },\n { label: 'Days', items: ['1d', '2d', '3d', '1w', '2w', '1M', '3M', '6M', '12M'] },\n];\n\n// ─── Timeframe dropdown ───────────────────────────────────────────────────────\n\nfunction TimeframeDropdown({\n timeframe,\n customTimeframes,\n favorites,\n onSelect,\n onToggleFavorite,\n onAddCustom,\n onClose,\n}: {\n timeframe: string;\n customTimeframes: string[];\n favorites: string[];\n onSelect: (tf: string) => void;\n onToggleFavorite: (tf: string) => void;\n onAddCustom: (tf: string) => void;\n onClose: () => void;\n}) {\n const [collapsed, setCollapsed] = useState<Record<string, boolean>>({});\n const [addingCustom, setAddingCustom] = useState(false);\n const [input, setInput] = useState('');\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) onClose();\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [onClose]);\n\n const commit = () => {\n const val = input.trim();\n if (!val) return;\n onAddCustom(val);\n onSelect(val);\n setInput('');\n onClose();\n };\n\n const toggleGroup = (label: string) =>\n setCollapsed((prev) => ({ ...prev, [label]: !prev[label] }));\n\n return (\n <div ref={ref} className=\"tf-dropdown\">\n <button\n className=\"tf-dropdown-add-custom\"\n onClick={() => setAddingCustom((a) => !a)}\n >\n + Add custom interval...\n </button>\n\n {addingCustom && (\n <div className=\"tf-dropdown-add-row\">\n <input\n className=\"tf-dropdown-input\"\n type=\"text\"\n value={input}\n placeholder=\"e.g. 2h, 45m\"\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') commit(); }}\n autoFocus\n />\n <button\n className=\"tf-dropdown-add-btn\"\n disabled={!input.trim()}\n onClick={commit}\n >\n Add\n </button>\n </div>\n )}\n\n {TF_GROUPS_ALL.map((group) => (\n <div key={group.label}>\n <button\n className=\"tf-dropdown-group-hdr\"\n onClick={() => toggleGroup(group.label)}\n >\n <span>{group.label}</span>\n <span className={`tf-dropdown-chevron${collapsed[group.label] ? ' collapsed' : ''}`}>∧</span>\n </button>\n {!collapsed[group.label] && group.items.map((tf) => (\n <button\n key={tf}\n className=\"tf-dropdown-row\"\n onClick={() => { onSelect(tf); onClose(); }}\n >\n <span>{TF_LABELS[tf] ?? tf}</span>\n <button\n className=\"tf-star-btn\"\n title={favorites.includes(tf) ? 'Remove from toolbar' : 'Add to toolbar'}\n onClick={(e) => { e.stopPropagation(); onToggleFavorite(tf); }}\n >\n <span className={`tf-star${favorites.includes(tf) ? ' favorited' : ''}`}>★</span>\n </button>\n </button>\n ))}\n </div>\n ))}\n\n {customTimeframes.length > 0 && (\n <div>\n <button\n className=\"tf-dropdown-group-hdr\"\n onClick={() => toggleGroup('Custom')}\n >\n <span>Custom</span>\n <span className={`tf-dropdown-chevron${collapsed['Custom'] ? ' collapsed' : ''}`}>∧</span>\n </button>\n {!collapsed['Custom'] && customTimeframes.map((tf) => (\n <button\n key={tf}\n className=\"tf-dropdown-row\"\n onClick={() => { onSelect(tf); onClose(); }}\n >\n <span>{tf}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ─── TopToolbar ─────────────────────────────────────────────────────────────\n\ntype Props = {\n symbol: string;\n timeframe: string;\n theme: ChartTheme;\n customTimeframes: string[];\n favorites: string[];\n onSymbolChange: (s: string) => void;\n onTimeframeChange: (tf: string) => void;\n onAddCustomTimeframe: (tf: string) => void;\n onFavoritesChange: (favs: string[]) => void;\n onAddIndicator: (config: IndicatorConfig) => void;\n onToggleTheme: () => void;\n onCopyScreenshot: () => void;\n onDownloadScreenshot: () => void;\n onFullscreen: () => void;\n isFullscreen: boolean;\n currentLayoutName?: string | undefined;\n currentLayoutId?: string | undefined;\n autoSave: boolean;\n onSaveLayout: (name: string) => Promise<void>;\n onLoadLayout: (layoutId: string) => Promise<void>;\n onRenameLayout: (newName: string) => Promise<void>;\n onCopyLayout: (newName: string) => Promise<void>;\n onToggleAutoSave: (enabled: boolean) => void;\n onDeleteLayout: (id: string) => Promise<void>;\n onOpenLayoutInNewTab: (id: string) => Promise<void>;\n /** Called to fetch current saved layouts. Passed through to LayoutMenu. */\n onFetchLayouts: () => Promise<import('../LayoutMenu').LayoutRecord[]>;\n /** Resolver used by the symbol search dialog. */\n symbolResolver: ISymbolResolver;\n /** Only rendered when a managed license is active */\n showTradeButton?: boolean;\n tradeDrawerOpen?: boolean;\n onToggleTradeDrawer?: () => void;\n};\n\nexport function TopToolbar({\n symbol, timeframe, theme, customTimeframes, favorites,\n onSymbolChange, onTimeframeChange, onAddCustomTimeframe, onFavoritesChange,\n onAddIndicator,\n onToggleTheme,\n onCopyScreenshot, onDownloadScreenshot, onFullscreen, isFullscreen,\n currentLayoutName, currentLayoutId, autoSave,\n onSaveLayout, onLoadLayout, onRenameLayout, onCopyLayout, onToggleAutoSave,\n onDeleteLayout, onOpenLayoutInNewTab, onFetchLayouts, symbolResolver,\n showTradeButton, tradeDrawerOpen, onToggleTradeDrawer,\n}: Props) {\n const [tfOpen, setTfOpen] = useState(false);\n const [symOpen, setSymOpen] = useState(false);\n const [indOpen, setIndOpen] = useState(false);\n const [ssOpen, setSsOpen] = useState(false);\n const ssRef = useRef<HTMLDivElement>(null);\n const tfRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!ssOpen) return;\n const handler = (e: MouseEvent) => {\n if (ssRef.current && !ssRef.current.contains(e.target as Node)) setSsOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [ssOpen]);\n\n // Close dropdown on outside click is handled inside TimeframeDropdown itself.\n\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '6px 12px',\n background: 'var(--toolbar-bg)',\n borderRadius: 8,\n flexShrink: 0,\n }}\n >\n {/* Logo */}\n <span style={{ fontWeight: 700, letterSpacing: '-0.5px', color: 'var(--accent)' }}>\n ForgeCharts\n </span>\n\n <div className=\"toolbar-sep\" />\n\n {/* Symbol picker */}\n <button\n className=\"sym-trigger\"\n onClick={() => setSymOpen(true)}\n title=\"Search symbols\"\n >\n <svg viewBox=\"0 0 14 14\" width=\"12\" height=\"12\" stroke=\"currentColor\"\n fill=\"none\" strokeWidth=\"1.8\" strokeLinecap=\"round\">\n <circle cx=\"5.5\" cy=\"5.5\" r=\"4\" />\n <line x1=\"9\" y1=\"9\" x2=\"13\" y2=\"13\" />\n </svg>\n <span>{symbol}</span>\n <svg viewBox=\"0 0 10 6\" width=\"8\" height=\"6\" fill=\"currentColor\">\n <path d=\"M0 0l5 6 5-6z\" />\n </svg>\n </button>\n\n {symOpen && (\n <SymbolSearchDialog\n current={symbol}\n onSelect={onSymbolChange}\n onClose={() => setSymOpen(false)}\n symbolResolver={symbolResolver}\n />\n )}\n\n <div className=\"toolbar-sep\" />\n\n {/* Timeframe buttons + dropdown */}\n <div ref={tfRef} style={{ display: 'flex', gap: 2, position: 'relative' }}>\n {favorites.map((tf) => (\n <button\n key={tf}\n className={tf === timeframe ? 'active' : undefined}\n onClick={() => onTimeframeChange(tf)}\n >\n {tf}\n </button>\n ))}\n\n {/* Extra button for active non-favorited timeframe */}\n {!favorites.includes(timeframe) && timeframe && (\n <button className=\"active\" style={{ fontStyle: 'italic' }}>\n {timeframe}\n </button>\n )}\n\n {/* More timeframes trigger */}\n <button\n className={tfOpen ? 'active' : undefined}\n onClick={() => setTfOpen((o) => !o)}\n title=\"More timeframes\"\n style={{ fontSize: 11, padding: '4px 7px' }}\n >\n ▾\n </button>\n\n {tfOpen && (\n <TimeframeDropdown\n timeframe={timeframe}\n customTimeframes={customTimeframes}\n favorites={favorites}\n onSelect={onTimeframeChange}\n onToggleFavorite={(tf) => {\n const next = favorites.includes(tf)\n ? favorites.filter((f) => f !== tf)\n : [...favorites, tf];\n onFavoritesChange(next);\n }}\n onAddCustom={onAddCustomTimeframe}\n onClose={() => setTfOpen(false)}\n />\n )}\n </div>\n\n <div className=\"toolbar-sep\" />\n\n {/* Indicators button */}\n <button\n className={`ind-trigger${indOpen ? ' active' : ''}`}\n onClick={() => setIndOpen((o) => !o)}\n title=\"Indicators\"\n >\n <svg viewBox=\"0 0 16 16\" width=\"13\" height=\"13\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.6\" strokeLinecap=\"round\">\n <polyline points=\"2,12 6,7 9,10 14,4\" />\n <line x1=\"11\" y1=\"2\" x2=\"14\" y2=\"2\" />\n <line x1=\"14\" y1=\"2\" x2=\"14\" y2=\"5\" />\n </svg>\n Indicators\n </button>\n\n {indOpen && (\n <IndicatorsDialog\n onAdd={(config: IndicatorConfig) => { onAddIndicator(config); }}\n onClose={() => setIndOpen(false)}\n />\n )}\n\n {/* Layout + theme toggle — pinned to right edge */}\n <div style={{ marginLeft: 'auto', display: 'flex', alignItems: 'center', gap: 4 }}>\n {showTradeButton && (\n <>\n <button\n className={`top-trade-btn${tradeDrawerOpen ? ' active' : ''}`}\n onClick={onToggleTradeDrawer}\n title=\"Trade — Connect your broker\"\n style={{ display: 'inline-flex', alignItems: 'center', gap: 5, padding: '4px 8px', fontSize: 12 }}\n >\n <svg viewBox=\"0 0 16 16\" width=\"11\" height=\"11\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\">\n <rect x=\"1.5\" y=\"3\" width=\"13\" height=\"10\" rx=\"1.5\" />\n <line x1=\"5\" y1=\"8\" x2=\"11\" y2=\"8\" />\n <line x1=\"8\" y1=\"5\" x2=\"8\" y2=\"11\" />\n </svg>\n Trade\n </button>\n <div className=\"toolbar-sep\" />\n </>\n )}\n <LayoutMenu\n currentName={currentLayoutName}\n currentLayoutId={currentLayoutId}\n autoSave={autoSave}\n onFetchLayouts={onFetchLayouts}\n onSave={onSaveLayout}\n onLoad={onLoadLayout}\n onRename={onRenameLayout}\n onCopy={onCopyLayout}\n onToggleAutoSave={onToggleAutoSave}\n onDelete={onDeleteLayout}\n onOpenInNewTab={onOpenLayoutInNewTab}\n />\n <button\n onClick={onToggleTheme}\n title={`Switch to ${theme === 'dark' ? 'light' : 'dark'} mode`}\n style={{ fontSize: 14, padding: '4px 8px' }}\n >\n {theme === 'dark' ? '☀' : '☾'}\n </button>\n {/* Screenshot */}\n <div ref={ssRef} style={{ position: 'relative' }}>\n <button\n className={ssOpen ? 'active' : undefined}\n onClick={() => setSsOpen((o) => !o)}\n title=\"Screenshot\"\n style={{ display: 'inline-flex', alignItems: 'center', padding: '4px 7px' }}\n >\n <svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.5\">\n <rect x=\"2\" y=\"4\" width=\"12\" height=\"9\" rx=\"1\" />\n <circle cx=\"8\" cy=\"8.5\" r=\"2.5\" />\n <path d=\"M6 4l1-2h2l1 2\" />\n </svg>\n </button>\n {ssOpen && (\n <div className=\"ss-dropdown\">\n <button className=\"ss-dropdown-item\" onClick={() => { setSsOpen(false); onCopyScreenshot(); }}>\n <svg viewBox=\"0 0 16 16\" width=\"13\" height=\"13\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.5\">\n <rect x=\"5\" y=\"5\" width=\"9\" height=\"9\" rx=\"1\" />\n <path d=\"M3 11H2a1 1 0 01-1-1V2a1 1 0 011-1h8a1 1 0 011 1v1\" />\n </svg>\n Copy to Clipboard\n </button>\n <button className=\"ss-dropdown-item\" onClick={() => { setSsOpen(false); onDownloadScreenshot(); }}>\n <svg viewBox=\"0 0 16 16\" width=\"13\" height=\"13\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.5\" strokeLinecap=\"round\">\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"11\" />\n <polyline points=\"4,7 8,11 12,7\" />\n <line x1=\"2\" y1=\"14\" x2=\"14\" y2=\"14\" />\n </svg>\n Download PNG\n </button>\n </div>\n )}\n </div>\n {/* Fullscreen */}\n <button\n onClick={onFullscreen}\n title={isFullscreen ? 'Exit Fullscreen' : 'Fullscreen'}\n style={{ display: 'inline-flex', alignItems: 'center', padding: '4px 7px' }}\n >\n {isFullscreen ? (\n <svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.5\">\n <path d=\"M6 2v4H2M10 2v4h4M10 14v-4h4M6 14v-4H2\" />\n </svg>\n ) : (\n <svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.5\">\n <path d=\"M2 6V2h4M10 2h4v4M14 10v4h-4M6 14H2v-4\" />\n </svg>\n )}\n </button>\n </div>\n </div>\n );\n}\n","import React from 'react';\n\nconst WatchListIcon = () => (\n <svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" strokeWidth=\"1.5\">\n <rect x=\"2\" y=\"3\" width=\"12\" height=\"1.5\" rx=\"0.5\" fill=\"currentColor\" stroke=\"none\" />\n <rect x=\"2\" y=\"7\" width=\"9\" height=\"1.5\" rx=\"0.5\" fill=\"currentColor\" stroke=\"none\" />\n <rect x=\"2\" y=\"11\" width=\"10\" height=\"1.5\" rx=\"0.5\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"13\" cy=\"11.75\" r=\"2.5\" />\n <line x1=\"13\" y1=\"10.75\" x2=\"13\" y2=\"12.75\" strokeWidth=\"1.2\" />\n <line x1=\"12\" y1=\"11.75\" x2=\"14\" y2=\"11.75\" strokeWidth=\"1.2\" />\n </svg>\n);\n\ntype Props = {\n watchlistOpen: boolean;\n onToggleWatchlist: () => void;\n};\n\n// ─── RightToolbar ────────────────────────────────────────────────────────────────────────────────\n\nexport function RightToolbar({ watchlistOpen, onToggleWatchlist }: Props): React.ReactElement {\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: 2,\n padding: '6px 4px',\n background: 'var(--toolbar-bg)',\n borderRadius: 8,\n width: 40,\n flexShrink: 0,\n userSelect: 'none',\n }}\n >\n <button\n title=\"Watch List\"\n className={`drawing-tool-btn${watchlistOpen ? ' is-active' : ''}`}\n onClick={onToggleWatchlist}\n >\n <WatchListIcon />\n </button>\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\n\n// ─── Timezone list ─────────────────────────────────────────────────────────────\n\nexport type TimezoneOption = {\n label: string;\n value: string; // IANA tz id, or 'UTC' / 'exchange'\n};\n\nexport const TIMEZONE_OPTIONS: TimezoneOption[] = [\n { label: 'UTC', value: 'UTC' },\n { label: 'Exchange', value: 'exchange' },\n // Americas\n { label: '(UTC-10) Honolulu', value: 'Pacific/Honolulu' },\n { label: '(UTC-9) Anchorage', value: 'America/Anchorage' },\n { label: '(UTC-9) Juneau', value: 'America/Juneau' },\n { label: '(UTC-8) Los Angeles', value: 'America/Los_Angeles' },\n { label: '(UTC-8) Vancouver', value: 'America/Vancouver' },\n { label: '(UTC-7) Denver', value: 'America/Denver' },\n { label: '(UTC-7) Phoenix', value: 'America/Phoenix' },\n { label: '(UTC-6) Chicago', value: 'America/Chicago' },\n { label: '(UTC-6) Mexico City', value: 'America/Mexico_City' },\n { label: '(UTC-6) San Salvador', value: 'America/El_Salvador' },\n { label: '(UTC-5) Bogota', value: 'America/Bogota' },\n { label: '(UTC-5) Lima', value: 'America/Lima' },\n { label: '(UTC-5) New York', value: 'America/New_York' },\n { label: '(UTC-5) Toronto', value: 'America/Toronto' },\n { label: '(UTC-4) Caracas', value: 'America/Caracas' },\n { label: '(UTC-4) Halifax', value: 'America/Halifax' },\n { label: '(UTC-3) Buenos Aires', value: 'America/Argentina/Buenos_Aires' },\n { label: '(UTC-3) Santiago', value: 'America/Santiago' },\n { label: '(UTC-3) Sao Paulo', value: 'America/Sao_Paulo' },\n { label: '(UTC-2) Mid-Atlantic', value: 'Atlantic/South_Georgia' },\n { label: '(UTC-1) Azores', value: 'Atlantic/Azores' },\n // Europe / Africa (UTC / UTC+0)\n { label: '(UTC) Casablanca', value: 'Africa/Casablanca' },\n { label: '(UTC) Dublin', value: 'Europe/Dublin' },\n { label: '(UTC) Lisbon', value: 'Europe/Lisbon' },\n { label: '(UTC) London', value: 'Europe/London' },\n { label: '(UTC) Reykjavik', value: 'Atlantic/Reykjavik' },\n // UTC+1\n { label: '(UTC+1) Amsterdam', value: 'Europe/Amsterdam' },\n { label: '(UTC+1) Belgrade', value: 'Europe/Belgrade' },\n { label: '(UTC+1) Berlin', value: 'Europe/Berlin' },\n { label: '(UTC+1) Bratislava', value: 'Europe/Bratislava' },\n { label: '(UTC+1) Brussels', value: 'Europe/Brussels' },\n { label: '(UTC+1) Budapest', value: 'Europe/Budapest' },\n { label: '(UTC+1) Copenhagen', value: 'Europe/Copenhagen' },\n { label: '(UTC+1) Lagos', value: 'Africa/Lagos' },\n { label: '(UTC+1) Luxembourg', value: 'Europe/Luxembourg' },\n { label: '(UTC+1) Madrid', value: 'Europe/Madrid' },\n { label: '(UTC+1) Malta', value: 'Europe/Malta' },\n { label: '(UTC+1) Oslo', value: 'Europe/Oslo' },\n { label: '(UTC+1) Paris', value: 'Europe/Paris' },\n { label: '(UTC+1) Prague', value: 'Europe/Prague' },\n { label: '(UTC+1) Rome', value: 'Europe/Rome' },\n { label: '(UTC+1) Sarajevo', value: 'Europe/Sarajevo' },\n { label: '(UTC+1) Stockholm', value: 'Europe/Stockholm' },\n { label: '(UTC+1) Vienna', value: 'Europe/Vienna' },\n { label: '(UTC+1) Warsaw', value: 'Europe/Warsaw' },\n { label: '(UTC+1) Zurich', value: 'Europe/Zurich' },\n // UTC+2\n { label: '(UTC+2) Athens', value: 'Europe/Athens' },\n { label: '(UTC+2) Bucharest', value: 'Europe/Bucharest' },\n { label: '(UTC+2) Cairo', value: 'Africa/Cairo' },\n { label: '(UTC+2) Helsinki', value: 'Europe/Helsinki' },\n { label: '(UTC+2) Istanbul', value: 'Europe/Istanbul' },\n { label: '(UTC+2) Jerusalem', value: 'Asia/Jerusalem' },\n { label: '(UTC+2) Johannesburg', value: 'Africa/Johannesburg' },\n { label: '(UTC+2) Kyiv', value: 'Europe/Kiev' },\n { label: '(UTC+2) Riga', value: 'Europe/Riga' },\n { label: '(UTC+2) Sofia', value: 'Europe/Sofia' },\n { label: '(UTC+2) Tallinn', value: 'Europe/Tallinn' },\n { label: '(UTC+2) Vilnius', value: 'Europe/Vilnius' },\n // UTC+3\n { label: '(UTC+3) Baghdad', value: 'Asia/Baghdad' },\n { label: '(UTC+3) Kuwait', value: 'Asia/Kuwait' },\n { label: '(UTC+3) Moscow', value: 'Europe/Moscow' },\n { label: '(UTC+3) Nairobi', value: 'Africa/Nairobi' },\n { label: '(UTC+3) Qatar', value: 'Asia/Qatar' },\n { label: '(UTC+3) Riyadh', value: 'Asia/Riyadh' },\n // UTC+3:30 / UTC+4\n { label: '(UTC+3:30) Tehran', value: 'Asia/Tehran' },\n { label: '(UTC+4) Abu Dhabi', value: 'Asia/Dubai' },\n { label: '(UTC+4) Baku', value: 'Asia/Baku' },\n { label: '(UTC+4) Dubai', value: 'Asia/Dubai' },\n { label: '(UTC+4) Muscat', value: 'Asia/Muscat' },\n { label: '(UTC+4) Tbilisi', value: 'Asia/Tbilisi' },\n { label: '(UTC+4:30) Kabul', value: 'Asia/Kabul' },\n // UTC+5\n { label: '(UTC+5) Islamabad', value: 'Asia/Karachi' },\n { label: '(UTC+5) Karachi', value: 'Asia/Karachi' },\n { label: '(UTC+5) Tashkent', value: 'Asia/Tashkent' },\n { label: '(UTC+5:30) Chennai', value: 'Asia/Kolkata' },\n { label: '(UTC+5:30) Mumbai', value: 'Asia/Kolkata' },\n { label: '(UTC+5:30) New Delhi', value: 'Asia/Kolkata' },\n { label: '(UTC+5:45) Kathmandu', value: 'Asia/Kathmandu' },\n // UTC+6\n { label: '(UTC+6) Almaty', value: 'Asia/Almaty' },\n { label: '(UTC+6) Dhaka', value: 'Asia/Dhaka' },\n // UTC+7\n { label: '(UTC+7) Bangkok', value: 'Asia/Bangkok' },\n { label: '(UTC+7) Hanoi', value: 'Asia/Ho_Chi_Minh' },\n { label: '(UTC+7) Jakarta', value: 'Asia/Jakarta' },\n // UTC+8\n { label: '(UTC+8) Beijing', value: 'Asia/Shanghai' },\n { label: '(UTC+8) Hong Kong', value: 'Asia/Hong_Kong' },\n { label: '(UTC+8) Kuala Lumpur', value: 'Asia/Kuala_Lumpur' },\n { label: '(UTC+8) Perth', value: 'Australia/Perth' },\n { label: '(UTC+8) Shanghai', value: 'Asia/Shanghai' },\n { label: '(UTC+8) Singapore', value: 'Asia/Singapore' },\n { label: '(UTC+8) Taipei', value: 'Asia/Taipei' },\n // UTC+9\n { label: '(UTC+9) Osaka', value: 'Asia/Tokyo' },\n { label: '(UTC+9) Seoul', value: 'Asia/Seoul' },\n { label: '(UTC+9) Tokyo', value: 'Asia/Tokyo' },\n { label: '(UTC+9:30) Adelaide', value: 'Australia/Adelaide' },\n { label: '(UTC+9:30) Darwin', value: 'Australia/Darwin' },\n // UTC+10\n { label: '(UTC+10) Brisbane', value: 'Australia/Brisbane' },\n { label: '(UTC+10) Canberra', value: 'Australia/Sydney' },\n { label: '(UTC+10) Melbourne', value: 'Australia/Melbourne' },\n { label: '(UTC+10) Sydney', value: 'Australia/Sydney' },\n // UTC+12\n { label: '(UTC+12) Auckland', value: 'Pacific/Auckland' },\n { label: '(UTC+12) Fiji', value: 'Pacific/Fiji' },\n];\n\n// ─── DST-aware offset helpers ─────────────────────────────────────────────────\n\n/**\n * Returns the current UTC offset label for an IANA timezone, e.g. \"(UTC-7)\" or \"(UTC+5:30)\".\n * Because it reads `new Date()` it is automatically DST-aware.\n */\nfunction getUtcOffsetLabel(iana: string): string {\n try {\n const parts = new Intl.DateTimeFormat('en', {\n timeZone: iana,\n timeZoneName: 'shortOffset',\n }).formatToParts(new Date());\n const tzName = parts.find((p) => p.type === 'timeZoneName')?.value ?? 'GMT';\n const offset = tzName.replace(/^GMT/, '');\n return offset ? `(UTC${offset})` : '(UTC)';\n } catch {\n return '(UTC)';\n }\n}\n\n/**\n * Returns a DST-aware display string for a timezone option.\n * For UTC / Exchange the label is returned unchanged.\n * For all IANA entries the offset prefix is recomputed live.\n */\nfunction getDisplayLabel(opt: TimezoneOption): string {\n if (opt.value === 'UTC' || opt.value === 'exchange') return opt.label;\n // Extract city name from static label like \"(UTC-9) Anchorage\" → \"Anchorage\"\n const city = opt.label.replace(/^\\(UTC[^)]*\\)\\s*/, '');\n return `${getUtcOffsetLabel(opt.value)} ${city}`;\n}\n\n// ─── BottomToolbar ──────────────────────────────────────────────────────────\n\nexport type TradingSession = 'regular' | 'extended';\n\n/**\n * Returns true when the given symbol trades on a session-aware exchange\n * (stocks, futures, forex) where RTH/ETH distinction makes sense.\n * Crypto exchanges trade 24/7 and have no session concept.\n */\nconst CRYPTO_EXCHANGES = new Set([\n 'BINANCE', 'BINANCEUS', 'BINANCEUSDM', 'BINANCECOINM',\n 'COINBASE', 'COINBASEPRO',\n 'KRAKEN', 'KRAKENFX',\n 'BYBIT', 'BITGET',\n 'OKX', 'OKEX',\n 'HUOBI', 'HTX',\n 'KUCOIN',\n 'GEMINI',\n 'BITSTAMP',\n 'BITFINEX',\n 'MEXC',\n 'GATEIO', 'GATE',\n 'BITMEX',\n 'DERIBIT',\n]);\n\nexport function symbolSupportsSession(symbol: string): boolean {\n const exchange = symbol.includes(':') ? symbol.split(':')[0]!.toUpperCase() : '';\n return exchange !== '' && !CRYPTO_EXCHANGES.has(exchange);\n}\n\ntype Props = {\n symbol: string;\n timezone: string;\n onTimezoneChange: (tz: string) => void;\n session: TradingSession;\n onSessionChange: (s: TradingSession) => void;\n onToggleScriptDrawer: () => void;\n scriptDrawerOpen: boolean;\n};\n\nfunction useClockTime(timezone: string): string {\n const [time, setTime] = useState(() => _formatClock(timezone));\n\n useEffect(() => {\n setTime(_formatClock(timezone));\n const id = setInterval(() => setTime(_formatClock(timezone)), 1000);\n return () => clearInterval(id);\n }, [timezone]);\n\n return time;\n}\n\nfunction _formatClock(timezone: string): string {\n const tz = timezone === 'exchange' ? 'UTC' : timezone;\n try {\n return new Intl.DateTimeFormat('en-GB', {\n timeZone: tz,\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hour12: false,\n }).format(new Date());\n } catch {\n return new Intl.DateTimeFormat('en-GB', {\n timeZone: 'UTC',\n hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false,\n }).format(new Date());\n }\n}\n\nexport function BottomToolbar({ symbol, timezone, onTimezoneChange, session, onSessionChange, onToggleScriptDrawer, scriptDrawerOpen }: Props) {\n const showSession = symbolSupportsSession(symbol);\n const [open, setOpen] = useState(false);\n const [sessionOpen, setSessionOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n const sessionRef = useRef<HTMLDivElement>(null);\n const clockTime = useClockTime(timezone);\n\n const current = TIMEZONE_OPTIONS.find((o) => o.value === timezone) ?? TIMEZONE_OPTIONS[0]!\n\n // Close timezone dropdown on outside click\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (rootRef.current && !rootRef.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [open]);\n\n // Close session dropdown on outside click\n useEffect(() => {\n if (!sessionOpen) return;\n const handler = (e: MouseEvent) => {\n if (sessionRef.current && !sessionRef.current.contains(e.target as Node)) setSessionOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [sessionOpen]);\n\n return (\n <div className=\"bottom-bar\">\n {/* ── Left side: script button ─────────────────────────────────────────────────── */}\n <div className=\"bottom-bar-left\">\n {/* Script Engine toggle */}\n <button\n className={`bottom-bar-btn${scriptDrawerOpen ? ' active' : ''}`}\n onClick={onToggleScriptDrawer}\n title=\"Script Engine\"\n >\n <svg viewBox=\"0 0 16 16\" width=\"11\" height=\"11\" fill=\"none\"\n stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\">\n <polyline points=\"4,6 2,8 4,10\" />\n <polyline points=\"12,6 14,8 12,10\" />\n <line x1=\"9\" y1=\"3\" x2=\"7\" y2=\"13\" />\n </svg>\n Script\n </button>\n {/* Trade button — managed license only */}\n </div>\n\n {/* ── Right side: timezone + clock + session picker ────────── */}\n <div className=\"bottom-bar-right\">\n {/* Timezone picker trigger */}\n <div ref={rootRef} style={{ position: 'relative', display: 'flex', alignItems: 'center' }}>\n <button\n className={`bottom-bar-btn${open ? ' active' : ''}`}\n onClick={() => setOpen((o) => !o)}\n title=\"Chart timezone\"\n >\n <svg viewBox=\"0 0 14 14\" width=\"11\" height=\"11\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.2\">\n <circle cx=\"7\" cy=\"7\" r=\"5.5\" />\n <path d=\"M7 1.5C7 1.5 9 4 9 7s-2 5.5-2 5.5M7 1.5C7 1.5 5 4 5 7s2 5.5 2 5.5\" />\n <line x1=\"1.5\" y1=\"7\" x2=\"12.5\" y2=\"7\" />\n <line x1=\"2\" y1=\"4.5\" x2=\"12\" y2=\"4.5\" />\n <line x1=\"2\" y1=\"9.5\" x2=\"12\" y2=\"9.5\" />\n </svg>\n {getDisplayLabel(current)}\n </button>\n\n {/* Live clock for the selected timezone */}\n <span className=\"bottom-bar-clock\" title={`Current time in ${getDisplayLabel(current)}`}>\n {clockTime}\n </span>\n\n {/* Timezone dropdown — opens upward, aligned to right */}\n {open && (\n <div className=\"bottom-bar-dropdown bottom-bar-dropdown--right\">\n <div className=\"bottom-bar-dropdown-section\">Timezone</div>\n {TIMEZONE_OPTIONS.map((opt) => (\n <button\n key={opt.value + opt.label}\n className={`bottom-bar-dropdown-item${opt.value === timezone ? ' current' : ''}`}\n onClick={() => { onTimezoneChange(opt.value); setOpen(false); }}\n >\n {opt.value === timezone && (\n <span className=\"bottom-bar-check\">✓</span>\n )}\n {getDisplayLabel(opt)}\n </button>\n ))}\n </div>\n )}\n </div>\n\n {/* Session picker (hidden for 24/7 assets like crypto) */}\n {showSession && <div ref={sessionRef} style={{ position: 'relative', display: 'flex', alignItems: 'center' }}>\n <button\n className={`bottom-bar-btn${sessionOpen ? ' active' : ''}`}\n onClick={() => setSessionOpen((o) => !o)}\n title=\"Trading session\"\n >\n <svg viewBox=\"0 0 14 14\" width=\"11\" height=\"11\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.2\">\n <rect x=\"1.5\" y=\"2.5\" width=\"11\" height=\"9\" rx=\"1\" />\n <line x1=\"1.5\" y1=\"5.5\" x2=\"12.5\" y2=\"5.5\" />\n <line x1=\"4.5\" y1=\"2.5\" x2=\"4.5\" y2=\"1\" />\n <line x1=\"9.5\" y1=\"2.5\" x2=\"9.5\" y2=\"1\" />\n </svg>\n {session === 'extended' ? 'Extended hours' : 'Regular hours'}\n </button>\n\n {sessionOpen && (\n <div className=\"bottom-bar-dropdown bottom-bar-dropdown--right\">\n <div className=\"bottom-bar-dropdown-section\">Sessions</div>\n <button\n className={`bottom-bar-dropdown-item${session === 'regular' ? ' current' : ''}`}\n onClick={() => { onSessionChange('regular'); setSessionOpen(false); }}\n >\n {session === 'regular' && <span className=\"bottom-bar-check\">✓</span>}\n <span className=\"bottom-bar-session-label\">\n <strong>Regular trading hours</strong>\n <span>Exchange session only (RTH) — cleaner signals, higher liquidity</span>\n </span>\n </button>\n <button\n className={`bottom-bar-dropdown-item${session === 'extended' ? ' current' : ''}`}\n onClick={() => { onSessionChange('extended'); setSessionOpen(false); }}\n >\n {session === 'extended' && <span className=\"bottom-bar-check\">✓</span>}\n <span className=\"bottom-bar-session-label\">\n <strong>Extended / electronic hours</strong>\n <span>Includes pre-market & after-hours (ETH) — full price range</span>\n </span>\n </button>\n </div>\n )}\n </div>}\n </div>\n </div>\n );\n}\n","/**\n * ChartWorkspace — structural layout assembly.\n *\n * Renders: TabBar + TopToolbar + (ChartCanvas slots + RightToolbar) + BottomToolbar.\n *\n * This component is intentionally stateless — all state lives in the parent\n * (ManagedAppShell). It provides the visual skeleton and prop routing only.\n */\n\nimport React from 'react';\nimport { TabBar } from './TabBar';\nimport type { TabItem } from './TabBar';\nimport { TopToolbar } from './toolbars/TopToolbar';\nimport { RightToolbar } from './toolbars/RightToolbar';\nimport { BottomToolbar } from './toolbars/BottomToolbar';\nimport type { TradingSession } from './toolbars/BottomToolbar';\nimport type { LayoutRecord } from './LayoutMenu';\nimport type { ChartTheme, IndicatorConfig, ISymbolResolver } from '@forgecharts/types';\n\nexport type { TradingSession };\n\nexport type ChartWorkspaceProps = {\n // ── TabBar ─────────────────────────────────────────────────────────────────\n tabs: Array<{ id: string; label: string; isSaved?: boolean }>;\n activeTabId: string;\n onSelectTab: (id: string) => void;\n onAddTab: () => void;\n onCloseTab: (id: string) => void;\n onRenameTab: (id: string, label: string) => void;\n // ── TopToolbar ─────────────────────────────────────────────────────────────\n symbol: string;\n timeframe: string;\n theme: ChartTheme;\n customTimeframes: string[];\n favoriteTfs: string[];\n onSymbolChange: (s: string) => void;\n onTimeframeChange: (tf: string) => void;\n onAddCustomTimeframe: (tf: string) => void;\n onFavoriteTfsChange: (favs: string[]) => void;\n onAddIndicator: (config: IndicatorConfig) => void;\n onToggleTheme: () => void;\n onCopyScreenshot: () => void;\n onDownloadScreenshot: () => void;\n onFullscreen: () => void;\n isFullscreen: boolean;\n currentLayoutName?: string;\n currentLayoutId?: string;\n autoSave: boolean;\n onFetchLayouts: () => Promise<LayoutRecord[]>;\n onSaveLayout: (name: string) => Promise<void>;\n onLoadLayout: (id: string) => Promise<void>;\n onRenameLayout: (name: string) => Promise<void>;\n onCopyLayout: (name: string) => Promise<void>;\n onToggleAutoSave: (enabled: boolean) => void;\n /** Resolver used by the symbol search dialog. */\n symbolResolver: ISymbolResolver;\n onDeleteLayout: (id: string) => Promise<void>;\n onOpenLayoutInNewTab: (id: string) => Promise<void>;\n // ── RightToolbar ────────────────────────────────────────────────────────────\n\n watchlistOpen: boolean;\n onToggleWatchlist: () => void;\n // ── BottomToolbar ───────────────────────────────────────────────────────────\n activeSymbol: string;\n timezone: string;\n onTimezoneChange: (tz: string) => void;\n session: TradingSession;\n onSessionChange: (s: TradingSession) => void;\n scriptDrawerOpen: boolean;\n onToggleScriptDrawer: () => void;\n // ── Trade button (TopToolbar) ────────────────────────────────────────────────\n showTradeButton?: boolean;\n tradeDrawerOpen?: boolean;\n onToggleTradeDrawer?: () => void;\n // ── Chart slot (parent renders all tab charts) ───────────────────────────────\n chartSlots: React.ReactNode;\n // ── Unlicensed overlay ───────────────────────────────────────────────────────\n isLicensed: boolean;\n // ── Loading overlay ──────────────────────────────────────────────────────────\n wsLoaded: boolean;\n // ── Drawers (passed through as assembled React nodes) ────────────────────────\n drawers?: React.ReactNode;\n};\n\n// ─── Re-export TabItem for consumers ─────────────────────────────────────────\nexport type { TabItem };\n\nexport function ChartWorkspace({\n // TabBar\n tabs, activeTabId, onSelectTab, onAddTab, onCloseTab, onRenameTab,\n // TopToolbar\n symbol, timeframe, theme, customTimeframes, favoriteTfs,\n onSymbolChange, onTimeframeChange, onAddCustomTimeframe, onFavoriteTfsChange,\n onAddIndicator, onToggleTheme, onCopyScreenshot, onDownloadScreenshot,\n onFullscreen, isFullscreen, currentLayoutName, currentLayoutId, autoSave,\n onFetchLayouts, onSaveLayout, onLoadLayout, onRenameLayout, onCopyLayout,\n onToggleAutoSave, onDeleteLayout, onOpenLayoutInNewTab,\n showTradeButton, tradeDrawerOpen, onToggleTradeDrawer, symbolResolver,\n // RightToolbar\n watchlistOpen, onToggleWatchlist,\n // BottomToolbar\n activeSymbol, timezone, onTimezoneChange, session, onSessionChange,\n scriptDrawerOpen, onToggleScriptDrawer,\n // Chart + state\n chartSlots, isLicensed, wsLoaded, drawers,\n}: ChartWorkspaceProps) {\n const tabItems: TabItem[] = tabs.map((t) => ({\n id: t.id,\n label: t.label,\n ...(t.isSaved !== undefined ? { isSaved: t.isSaved } : {}),\n }));\n\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n background: 'var(--shelf-bg)',\n padding: 6,\n gap: 4,\n }}\n >\n {/* ── Loading overlay ──────────────────────────────────────────────── */}\n {!wsLoaded && (\n <div style={{\n position: 'absolute', inset: 0, display: 'flex',\n alignItems: 'center', justifyContent: 'center',\n background: 'var(--bg)', zIndex: 1000,\n }}>\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" style={{ animation: 'spin 0.9s linear infinite' }}>\n <circle cx=\"16\" cy=\"16\" r=\"12\" fill=\"none\" stroke=\"var(--border)\" strokeWidth=\"3\" />\n <path d=\"M16 4 A12 12 0 0 1 28 16\" fill=\"none\" stroke=\"var(--primary)\" strokeWidth=\"3\" strokeLinecap=\"round\" />\n </svg>\n <style>{`@keyframes spin { to { transform: rotate(360deg); } }`}</style>\n </div>\n )}\n\n <TabBar\n tabs={tabItems}\n activeId={activeTabId}\n onSelect={onSelectTab}\n onAdd={onAddTab}\n onClose={onCloseTab}\n onRename={onRenameTab}\n />\n\n {/* ── Top toolbar ──────────────────────────────────────────────────── */}\n <TopToolbar\n symbol={symbol}\n timeframe={timeframe}\n theme={theme}\n customTimeframes={customTimeframes}\n favorites={favoriteTfs}\n onSymbolChange={onSymbolChange}\n onTimeframeChange={onTimeframeChange}\n onAddCustomTimeframe={onAddCustomTimeframe}\n onFavoritesChange={onFavoriteTfsChange}\n onAddIndicator={onAddIndicator}\n onToggleTheme={onToggleTheme}\n onCopyScreenshot={onCopyScreenshot}\n onDownloadScreenshot={onDownloadScreenshot}\n onFullscreen={onFullscreen}\n isFullscreen={isFullscreen}\n currentLayoutName={currentLayoutName}\n currentLayoutId={currentLayoutId}\n autoSave={autoSave}\n onFetchLayouts={onFetchLayouts}\n onSaveLayout={onSaveLayout}\n onLoadLayout={onLoadLayout}\n onRenameLayout={onRenameLayout}\n onCopyLayout={onCopyLayout}\n onToggleAutoSave={onToggleAutoSave}\n onDeleteLayout={onDeleteLayout}\n onOpenLayoutInNewTab={onOpenLayoutInNewTab}\n symbolResolver={symbolResolver}\n {...(showTradeButton !== undefined ? { showTradeButton } : {})}\n {...(tradeDrawerOpen !== undefined ? { tradeDrawerOpen } : {})}\n {...(onToggleTradeDrawer !== undefined ? { onToggleTradeDrawer } : {})}\n />\n\n {/* ── Chart area ───────────────────────────────────────────────────── */}\n <div style={{ flex: 1, display: 'flex', gap: 8, minHeight: 0, overflow: 'hidden' }}>\n <div style={{ position: 'relative', flex: 1, display: 'flex', gap: 8, minWidth: 0, minHeight: 0 }}>\n {/* Unlicensed overlay */}\n {!isLicensed && (\n <div style={{\n position: 'absolute', inset: 0, zIndex: 100,\n background: 'rgba(0,0,0,0.6)',\n backdropFilter: 'blur(4px)',\n display: 'flex', flexDirection: 'column',\n alignItems: 'center', justifyContent: 'center',\n gap: 12,\n }}>\n <svg viewBox=\"0 0 24 24\" width=\"40\" height=\"40\" fill=\"none\" stroke=\"rgba(255,255,255,0.7)\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" />\n <path d=\"M7 11V7a5 5 0 0110 0v4\" />\n </svg>\n <div style={{ color: '#fff', fontWeight: 700, fontSize: 18, letterSpacing: '0.01em' }}>Unlicensed</div>\n <div style={{ color: 'rgba(255,255,255,0.65)', fontSize: 13 }}>Please activate your license in the admin studio</div>\n </div>\n )}\n {/* Chart instance slots */}\n <div style={{ position: 'relative', flex: 1, minWidth: 0, minHeight: 0 }}>\n {chartSlots}\n </div>\n <RightToolbar\n watchlistOpen={watchlistOpen}\n onToggleWatchlist={onToggleWatchlist}\n />\n </div>\n {/* Drawer panels passed from parent (ScriptDrawer, WatchlistDrawer) */}\n {drawers}\n </div>\n\n {/* ── Bottom bar ───────────────────────────────────────────────────── */}\n <BottomToolbar\n symbol={activeSymbol}\n timezone={timezone}\n onTimezoneChange={onTimezoneChange}\n session={session}\n onSessionChange={onSessionChange}\n onToggleScriptDrawer={onToggleScriptDrawer}\n scriptDrawerOpen={scriptDrawerOpen}\n />\n </div>\n );\n}\n","import { useState, useEffect, useMemo } from 'react';\nimport { LicenseManager, getCapabilities } from '../../';\nimport type { ChartCapabilities } from '../../';\nimport type { ChartRuntimeConfig } from '@forgecharts/types';\n\n/**\n * Merges license-derived capabilities with optional host config overrides.\n *\n * A config flag explicitly set to `false` suppresses the feature even when\n * the license permits it. Omitting a field defers to the license.\n * Derived render flags are recalculated from the updated feature flags so\n * component-level gates remain consistent.\n */\nfunction applyRuntimeConfig(\n caps: ChartCapabilities,\n config: ChartRuntimeConfig | undefined,\n): ChartCapabilities {\n if (!config) return caps;\n\n const orderEntry = config.enableOrderEntry === false ? false : caps.orderEntry;\n const draggableOrders = config.enableDraggableOrders === false ? false : caps.draggableOrders;\n const bracketOrders = config.enableBracketOrders === false ? false : caps.bracketOrders;\n const managedTrading = config.enableManagedTrading === false ? false : caps.managedTrading;\n const indicators = config.enableIndicators === false ? false : caps.indicators;\n\n return {\n ...caps,\n orderEntry,\n draggableOrders,\n bracketOrders,\n managedTrading,\n indicators,\n // Recalculate derived render flags from the updated feature flags.\n renderOrderEntry: orderEntry,\n renderBuySellButtons: orderEntry,\n renderOrderTicket: orderEntry,\n renderBracketControls: orderEntry && bracketOrders,\n renderOrderModificationControls: orderEntry && draggableOrders,\n renderManagedTradingControls: managedTrading,\n renderIndicators: indicators,\n };\n}\n\n/**\n * useChartCapabilities\n *\n * Returns the current chart capability set derived from two independent layers\n * (both must allow a feature for it to be considered active):\n * 1. **License entitlement** — from the loaded `LicensePayload` via `LicenseManager`.\n * 2. **Host runtime config** — optional `ChartRuntimeConfig` passed by the consumer.\n *\n * The hook re-evaluates whenever the license changes and whenever the\n * `config` reference changes (use a stable/memoised object to avoid unnecessary\n * re-renders).\n *\n * Usage:\n * const caps = useChartCapabilities();\n * const caps = useChartCapabilities({ enableOrderEntry: false }); // suppress order entry\n * if (caps.renderOrderEntry) { ... }\n */\nexport function useChartCapabilities(config?: ChartRuntimeConfig): ChartCapabilities {\n const [licCaps, setLicCaps] = useState<ChartCapabilities>(() => getCapabilities());\n\n useEffect(() => {\n // Subscribe to license changes via LicenseManager only.\n // Cross-tab StorageEvent sync is intentionally omitted — that coupling\n // belongs at the app shell layer (ManagedAppShell reloads on auth change).\n const unsub = LicenseManager.getInstance().subscribe(() => {\n setLicCaps(getCapabilities());\n });\n return unsub;\n }, []);\n\n return useMemo(() => applyRuntimeConfig(licCaps, config), [licCaps, config]);\n}\n\n","/**\n * TradingBridge — host-side trading callback contract for Unmanaged mode.\n *\n * When a chart user performs a trading action (drag-to-place, cancel, bracket\n * adjust, etc.) the chart emits a typed Intent and defers all confirmation to\n * the host. The chart NEVER self-confirms order state. The host must push\n * the resulting confirmed ChartOrder back via TradingOverlayStore.\n *\n * Usage (consumer / host app):\n *\n * ```tsx\n * import type { TradingBridgeCallbacks } from '@forgecharts/sdk/react';\n *\n * const bridge: TradingBridgeCallbacks = {\n * onPlaceOrderIntent: (intent) => myBroker.placeOrder(intent),\n * onModifyOrderIntent: (intent) => myBroker.modifyOrder(intent),\n * onCancelOrderIntent: (intent) => myBroker.cancelOrder(intent),\n * onBracketAdjustIntent: (intent) => myBroker.adjustBracket(intent),\n * };\n *\n * <ChartCanvas\n * symbol=\"BTCUSDT\"\n * timeframe=\"1h\"\n * tradingBridge={bridge}\n * />\n * ```\n *\n * Debug logging:\n * Wrap your callbacks with `createTradingBridgeLogger` to get structured\n * console output in development:\n *\n * ```ts\n * tradingBridge={createTradingBridgeLogger(bridge, 'MyChart')}\n * ```\n */\n\nimport type {\n PlaceOrderIntent,\n ModifyOrderIntent,\n CancelOrderIntent,\n BracketAdjustIntent,\n} from '@forgecharts/types';\n\n// ─── Public callback contract ─────────────────────────────────────────────────\n\n/**\n * Injectable callback bag for the chart-to-host trading bridge.\n *\n * All callbacks are optional — omit any you do not handle. The chart will\n * still emit the intent but silently discard it if the corresponding callback\n * is not provided.\n *\n * The return types are `void | Promise<void>` so hosts can fire-and-forget or\n * await before side-effects. The chart does not await the returned promise —\n * confirmation always flows back through `TradingOverlayStore`.\n */\nexport interface TradingBridgeCallbacks {\n /**\n * Called when the user triggers a new order placement.\n * The host should validate, forward to the broker, and then call\n * `overlayStore.upsertOrder(confirmedOrder)` once acknowledged.\n */\n onPlaceOrderIntent?: (intent: PlaceOrderIntent) => void | Promise<void>;\n\n /**\n * Called when the user drags an order line to a new price or edits it via UI.\n * The host should send the modification to the broker and update the overlay\n * store with the modified order.\n */\n onModifyOrderIntent?: (intent: ModifyOrderIntent) => void | Promise<void>;\n\n /**\n * Called when the user clicks the cancel control on an order line.\n * The host should cancel at the venue and call `overlayStore.removeOrder(id)`.\n */\n onCancelOrderIntent?: (intent: CancelOrderIntent) => void | Promise<void>;\n\n /**\n * Called when the user drags a bracket leg (stop-loss or take-profit).\n * The host adjusts both legs atomically and updates the overlay store.\n */\n onBracketAdjustIntent?: (intent: BracketAdjustIntent) => void | Promise<void>;\n}\n\n// ─── Debug logger ─────────────────────────────────────────────────────────────\n\n/**\n * Wraps a `TradingBridgeCallbacks` object and logs all emitted intents to the\n * console. Only active when `process.env.NODE_ENV !== 'production'`.\n *\n * @param callbacks The real callbacks to delegate to after logging.\n * @param label Optional label prepended to log messages (e.g. chart id or symbol).\n * @returns A new `TradingBridgeCallbacks` that logs then delegates.\n *\n * @example\n * ```ts\n * tradingBridge={createTradingBridgeLogger(bridge, 'BTCUSDT')}\n * ```\n */\nexport function createTradingBridgeLogger(\n callbacks: TradingBridgeCallbacks,\n label?: string,\n): TradingBridgeCallbacks {\n if (process.env.NODE_ENV === 'production') return callbacks;\n\n const tag = label ? `[TradingBridge:${label}]` : '[TradingBridge]';\n\n return {\n onPlaceOrderIntent: (intent) => {\n console.debug(\n `${tag} PLACE side=%s type=%s qty=%s price=%s stopPrice=%s correlationId=%s`,\n intent.side,\n intent.orderType,\n intent.qty,\n intent.limitPrice ?? '—',\n intent.stopPrice ?? '—',\n intent.correlationId,\n intent,\n );\n return callbacks.onPlaceOrderIntent?.(intent);\n },\n\n onModifyOrderIntent: (intent) => {\n console.debug(\n `${tag} MODIFY orderId=%s limitPrice=%s stopPrice=%s qty=%s`,\n intent.orderId,\n intent.limitPrice ?? '—',\n intent.stopPrice ?? '—',\n intent.qty ?? '—',\n intent,\n );\n return callbacks.onModifyOrderIntent?.(intent);\n },\n\n onCancelOrderIntent: (intent) => {\n console.debug(\n `${tag} CANCEL orderId=%s symbol=%s`,\n intent.orderId,\n intent.symbol,\n intent,\n );\n return callbacks.onCancelOrderIntent?.(intent);\n },\n\n onBracketAdjustIntent: (intent) => {\n console.debug(\n `${tag} BRACKET_ADJUST entry=%s sl=%s tp=%s`,\n intent.entryOrderId,\n intent.stopLossPrice ?? '—',\n intent.takeProfitPrice ?? '—',\n intent,\n );\n return callbacks.onBracketAdjustIntent?.(intent);\n },\n };\n}\n","/**\n * ManagedAppShell — stateful chart application shell.\n *\n * Owns all workspace state (tabs, symbol, timeframe, layout persistence, etc.)\n * and wires injected API clients to ChartWorkspace. App-specific drawers (script,\n * watchlist, trade) are passed as render-prop factories so this shell never\n * imports from the app layer.\n */\n\nimport React, {\n useState,\n useEffect,\n useRef,\n useCallback,\n forwardRef,\n useImperativeHandle,\n} from 'react';\nimport { ChartCanvas } from '../canvas/ChartCanvas';\nimport type { ChartCanvasHandle } from '../canvas/ChartCanvas';\nimport { ChartWorkspace } from '../workspace/ChartWorkspace';\nimport { DEFAULT_FAVORITES } from '../workspace/toolbars/TopToolbar';\nimport type { LayoutRecord } from '../workspace/LayoutMenu';\nimport { useChartCapabilities } from '../hooks/useChartCapabilities';\nimport { LicenseManager } from '../../';\nimport type { LicensePayload } from '../../';\nimport type { IDatafeed, ChartTheme, ChartLayout, IndicatorConfig, ISymbolResolver, ChartRuntimeConfig } from '@forgecharts/types';\nimport type { TradingBridgeCallbacks } from '../trading/TradingBridge';\nimport type { TradingSession } from '../workspace/toolbars/BottomToolbar';\n\n// ─── API surface injected from the host app ───────────────────────────────────\n\nexport type LayoutsAPI = {\n list: () => Promise<LayoutRecord[]>;\n get: (id: string) => Promise<LayoutRecord>;\n create: (data: { name: string; symbol: string; timeframe: string; config: Record<string, unknown> }) => Promise<LayoutRecord>;\n update: (id: string, data: Partial<{ name: string; symbol: string; timeframe: string; config: Record<string, unknown> }>) => Promise<LayoutRecord>;\n remove: (id: string) => Promise<void>;\n};\n\nexport type PreferencesAPI = {\n get: <T = Record<string, unknown>>() => Promise<T>;\n put: (data: Record<string, unknown>) => Promise<void>;\n};\n\n// ─── Component props ──────────────────────────────────────────────────────────\n\nexport type ManagedAppShellProps = {\n datafeed: IDatafeed;\n layouts: LayoutsAPI;\n preferences: PreferencesAPI;\n /** Resolver used by the built-in symbol search dialog. */\n symbolResolver: ISymbolResolver;\n /**\n * Async callback that returns the current user's Bearer token.\n * Used to authenticate the internal `/api/license` fetch and can be\n * forwarded to `TChart` / `ReferenceAPI` instances that need auth.\n * If omitted, requests are sent without `Authorization` headers.\n */\n getAuthToken?: () => string | Promise<string>;\n /**\n * Base URL of the ForgeCharts API, e.g. `\"https://charts.myapp.com\"`.\n * Defaults to the current origin. Set this when the chart is embedded\n * on a different domain from the API server.\n */\n apiUrl?: string;\n /**\n * Optional callback to resolve an exchange logo image URL.\n * Receives the exchange code (e.g. \"BINANCE\") and returns a URL string or\n * null/undefined to suppress the logo. If omitted, no logo is shown.\n * ForgeCharts Studio sets this to the /api/logos/ endpoint.\n */\n getExchangeLogoUrl?: (exchange: string) => string | null | undefined;\n /**\n * Optional host-level feature overrides applied on top of the license.\n * Set a flag to `false` to suppress a feature even when the license permits\n * it. Omitting the prop (or individual fields) defers fully to the license.\n */\n config?: ChartRuntimeConfig;\n /**\n * Optional trading bridge callbacks threaded to every ChartCanvas instance.\n *\n * Provide this when `enableOrderEntry` / `enableDraggableOrders` etc. are\n * active so the chart can emit intents to your broker layer.\n * Use `createTradingBridgeLogger(bridge)` in dev for structured logging.\n */\n tradingBridge?: TradingBridgeCallbacks;\n renderScriptDrawer?: (props: { onClose: () => void; onAddIndicator: (c: IndicatorConfig) => void }) => React.ReactElement | null;\n renderWatchlistDrawer?: (props: { onClose: () => void; onSelectSymbol: (sym: string) => void }) => React.ReactElement | null;\n renderTradeDrawer?: (props: { onClose: () => void }) => React.ReactElement | null;\n};\n\n// ─── Imperative handle (optional — exposes active chart handle) ───────────────\n\nexport type ManagedAppShellHandle = {\n getActiveChartHandle: () => ChartCanvasHandle | null;\n};\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction uid() { return Math.random().toString(36).slice(2, 10); }\n\nconst DEFAULT_INDICATORS: IndicatorConfig[] = [];\n\n// ─── License loaders ──────────────────────────────────────────────────────────\n\n/**\n * Fetches the license payload from the API and loads it into LicenseManager.\n *\n * @param apiUrl Optional base URL (defaults to current origin).\n * @param getAuthToken Optional async callback to obtain a Bearer token.\n */\nasync function loadLicenseFromApi(\n apiUrl?: string,\n getAuthToken?: () => string | Promise<string>,\n): Promise<void> {\n try {\n const url = `${apiUrl ?? ''}/api/license`;\n const headers: Record<string, string> = {};\n if (getAuthToken) {\n try {\n const tok = await getAuthToken();\n if (tok) headers['Authorization'] = `Bearer ${tok}`;\n } catch { /* token fetch failed — continue unauthenticated */ }\n }\n const r = await fetch(url, { headers });\n const data = r.ok\n ? (await r.json() as { licensePayload: unknown })\n : { licensePayload: null };\n if (data.licensePayload && typeof data.licensePayload === 'object') {\n LicenseManager.getInstance().loadLicense(data.licensePayload as LicensePayload);\n }\n // If the endpoint returns no payload, leave LicenseManager in its current\n // state (unmanaged mode) rather than clearing a previously loaded license.\n } catch {\n // Network failure — leave LicenseManager in its current state.\n }\n}\n\n// ─── Tab type ─────────────────────────────────────────────────────────────────\n\ntype Tab = {\n id: string;\n label: string;\n symbol: string;\n timeframe: string;\n snapshot?: ChartLayout;\n savedLayoutId?: string;\n remountCount: number;\n};\n\nfunction makeTab(n: number): Tab {\n return { id: uid(), label: `Chart ${n}`, symbol: 'BINANCE:BTCUSDT', timeframe: '1h', remountCount: 0 };\n}\n\n// ─── Workspace persistence shape ─────────────────────────────────────────────\n\ntype PersistedTab = Omit<Tab, 'remountCount'>;\n\ntype WorkspacePrefs = {\n tabs: PersistedTab[];\n activeTabId: string;\n autoSave: boolean;\n timezone: string;\n customTimeframes: string[];\n favoriteTfs: string[];\n session: TradingSession;\n theme: ChartTheme;\n};\n\nconst DEFAULT_TAB = makeTab(1) satisfies Tab;\nconst DEFAULT_WORKSPACE: WorkspacePrefs = {\n tabs: [{ id: DEFAULT_TAB.id, label: DEFAULT_TAB.label, symbol: DEFAULT_TAB.symbol, timeframe: DEFAULT_TAB.timeframe }],\n activeTabId: DEFAULT_TAB.id,\n autoSave: false,\n timezone: 'UTC',\n customTimeframes: [],\n favoriteTfs: DEFAULT_FAVORITES,\n session: 'regular',\n theme: 'dark',\n};\n\nfunction workspaceFromPrefs(raw: unknown): WorkspacePrefs {\n if (!raw || typeof raw !== 'object') return DEFAULT_WORKSPACE;\n const p = raw as Record<string, unknown>;\n const tabs = Array.isArray(p['tabs']) && p['tabs'].length > 0\n ? (p['tabs'] as PersistedTab[])\n : DEFAULT_WORKSPACE.tabs;\n const activeTabId = typeof p['activeTabId'] === 'string' && tabs.some((t) => t.id === p['activeTabId'])\n ? p['activeTabId']\n : tabs[0]!.id;\n return {\n tabs,\n activeTabId,\n autoSave: typeof p['autoSave'] === 'boolean' ? p['autoSave'] : false,\n timezone: typeof p['timezone'] === 'string' ? p['timezone'] : 'UTC',\n customTimeframes: Array.isArray(p['customTimeframes']) ? p['customTimeframes'] : [],\n favoriteTfs: Array.isArray(p['favoriteTfs']) && p['favoriteTfs'].length > 0\n ? (p['favoriteTfs'] as string[])\n : DEFAULT_FAVORITES,\n session: p['session'] === 'extended' ? 'extended' : 'regular',\n theme: p['theme'] === 'light' ? 'light' : 'dark',\n };\n}\n\n// ─── ManagedAppShell ──────────────────────────────────────────────────────────\n\nexport const ManagedAppShell = forwardRef<ManagedAppShellHandle, ManagedAppShellProps>(\nfunction ManagedAppShell(\n { datafeed, layouts, preferences, symbolResolver, getExchangeLogoUrl, config,\n getAuthToken, apiUrl, tradingBridge, renderScriptDrawer, renderWatchlistDrawer, renderTradeDrawer },\n ref,\n) {\n const containerRef = useRef<HTMLDivElement>(null);\n\n const [theme, setTheme] = useState<ChartTheme>('dark');\n const [wsLoaded, setWsLoaded] = useState(false);\n const [timezone, setTimezone] = useState(DEFAULT_WORKSPACE.timezone);\n const [autoSave, setAutoSave] = useState(DEFAULT_WORKSPACE.autoSave);\n const [tabs, setTabs] = useState<Tab[]>(() =>\n DEFAULT_WORKSPACE.tabs.map((t) => ({ ...t, remountCount: 0 })),\n );\n const [activeTabId, setActiveTabId] = useState(DEFAULT_WORKSPACE.activeTabId);\n const [customTimeframes, setCustomTimeframes] = useState<string[]>(DEFAULT_WORKSPACE.customTimeframes);\n const [favoriteTfs, setFavoriteTfs] = useState<string[]>(DEFAULT_WORKSPACE.favoriteTfs);\n const [session, setSession] = useState<TradingSession>(DEFAULT_WORKSPACE.session);\n const [scriptDrawerOpen, setScriptDrawerOpen] = useState(false);\n const [watchlistOpen, setWatchlistOpen] = useState(false);\n const [tradeDrawerOpen, setTradeDrawerOpen] = useState(false);\n const [chartDirty, setChartDirty] = useState(0);\n const [isFullscreen, setIsFullscreen] = useState(false);\n\n const capabilities = useChartCapabilities(config);\n\n // ── Init warnings (dev only) ───────────────────────────────────────────────\n useEffect(() => {\n if (process.env.NODE_ENV === 'production') return;\n if (\n (capabilities.orderEntry || capabilities.draggableOrders || capabilities.renderManagedTradingControls) &&\n !renderTradeDrawer\n ) {\n console.warn(\n '[ManagedAppShell] Trading capabilities are active ' +\n '(orderEntry=%s, draggableOrders=%s, managedTrading=%s) but ' +\n 'renderTradeDrawer was not provided. Trading UI will be suppressed.',\n capabilities.orderEntry,\n capabilities.draggableOrders,\n capabilities.managedTrading,\n );\n }\n // Warn once on mount and whenever trading caps or the slot presence changes.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [capabilities.orderEntry, capabilities.draggableOrders, capabilities.managedTrading]);\n\n const [isLicensed, setIsLicensed] = useState(() => LicenseManager.getInstance().getLicense() !== null);\n useEffect(() => LicenseManager.getInstance().subscribe(() => {\n setIsLicensed(LicenseManager.getInstance().getLicense() !== null);\n }), []);\n\n // Per-tab chart instance registry — all tabs remain mounted simultaneously\n const chartInstancesRef = useRef<Map<string, ChartCanvasHandle>>(new Map());\n const chartHandleRef = useRef<ChartCanvasHandle | null>(null);\n\n useImperativeHandle(ref, () => ({\n getActiveChartHandle: () => chartHandleRef.current,\n }));\n\n useEffect(() => { document.documentElement.dataset.theme = theme; }, [theme]);\n\n // ── Load workspace from DB on startup ──────────────────────────────────────\n useEffect(() => {\n preferences.get<Record<string, unknown>>().then((data) => {\n const ws = workspaceFromPrefs(data);\n setTabs(ws.tabs.map((t) => ({ ...t, remountCount: 0 })));\n setActiveTabId(ws.activeTabId);\n setAutoSave(ws.autoSave);\n setTimezone(ws.timezone);\n setCustomTimeframes(ws.customTimeframes);\n setFavoriteTfs(ws.favoriteTfs);\n setSession(ws.session);\n setTheme(ws.theme);\n if (data['licensePayload'] && typeof data['licensePayload'] === 'object') {\n LicenseManager.getInstance().loadLicense(data['licensePayload'] as LicensePayload);\n } else {\n void loadLicenseFromApi(apiUrl, getAuthToken);\n }\n }).catch(() => {\n void loadLicenseFromApi(apiUrl, getAuthToken);\n }).finally(() => {\n setWsLoaded(true);\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []); // run once on mount\n\n // ── Debounced workspace save to DB ─────────────────────────────────────────\n const saveTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Stable refs so the debounced callback always sees latest values\n const activeTabIdRef = useRef(activeTabId);\n const autoSaveRef = useRef(autoSave);\n const timezoneRef = useRef(timezone);\n const customTimeframesRef = useRef(customTimeframes);\n const favoriteTfsRef = useRef(favoriteTfs);\n const sessionRef = useRef(session);\n const themeRef = useRef(theme);\n activeTabIdRef.current = activeTabId;\n autoSaveRef.current = autoSave;\n timezoneRef.current = timezone;\n customTimeframesRef.current = customTimeframes;\n favoriteTfsRef.current = favoriteTfs;\n sessionRef.current = session;\n themeRef.current = theme;\n\n const saveWorkspace = useCallback(() => {\n if (!wsLoaded) return;\n if (saveTimerRef.current) clearTimeout(saveTimerRef.current);\n saveTimerRef.current = setTimeout(() => {\n const snap = chartHandleRef.current?.getLayoutSnapshot();\n setTabs((prev) => {\n const persisted: PersistedTab[] = prev.map(({ remountCount: _r, ...rest }) =>\n rest.id === activeTabIdRef.current && snap ? { ...rest, snapshot: snap } : rest,\n );\n const ws: WorkspacePrefs = {\n tabs: persisted,\n activeTabId: activeTabIdRef.current,\n autoSave: autoSaveRef.current,\n timezone: timezoneRef.current,\n customTimeframes: customTimeframesRef.current,\n favoriteTfs: favoriteTfsRef.current,\n session: sessionRef.current,\n theme: themeRef.current,\n };\n const license = LicenseManager.getInstance().getLicense();\n preferences.put({ ...ws, ...(license ? { licensePayload: license } : {}) } as unknown as Record<string, unknown>)\n .catch(() => { /* silent — non-fatal */ });\n return prev;\n });\n }, 1_500);\n }, [wsLoaded, preferences]);\n\n // Keep chartHandleRef in sync with active tab\n useEffect(() => {\n chartHandleRef.current = chartInstancesRef.current.get(activeTabId) ?? null;\n }, [activeTabId]);\n\n // Trigger save whenever workspace state changes\n useEffect(() => { saveWorkspace(); }, [tabs, activeTabId, autoSave, timezone, customTimeframes, favoriteTfs, session, theme, chartDirty, saveWorkspace]);\n\n // Track browser fullscreen changes\n useEffect(() => {\n const handler = () => setIsFullscreen(!!document.fullscreenElement);\n document.addEventListener('fullscreenchange', handler);\n return () => document.removeEventListener('fullscreenchange', handler);\n }, []);\n\n const handleFullscreen = useCallback(() => {\n if (!document.fullscreenElement) {\n containerRef.current?.requestFullscreen().catch(() => {});\n } else {\n document.exitFullscreen().catch(() => {});\n }\n }, []);\n\n const handleCopyScreenshot = useCallback(async () => {\n const url = await chartHandleRef.current?.captureScreenshot();\n if (!url) return;\n try {\n const resp = await fetch(url);\n const blob = await resp.blob();\n await navigator.clipboard.write([new ClipboardItem({ 'image/png': blob })]);\n } catch { /* Clipboard API unavailable */ }\n }, []);\n\n const handleDownloadScreenshot = useCallback(async () => {\n const url = await chartHandleRef.current?.captureScreenshot();\n if (!url) return;\n const a = document.createElement('a');\n a.href = url;\n a.download = `forgecharts-${Date.now()}.png`;\n a.click();\n }, []);\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const activeTab = (tabs.find((t) => t.id === activeTabId) ?? tabs[0])!;\n\n const captureSnapshot = useCallback((): ChartLayout | null =>\n chartHandleRef.current?.getLayoutSnapshot() ?? null,\n []);\n\n // ── Tab management ─────────────────────────────────────────────────────────\n\n const selectTab = useCallback((id: string) => {\n const snap = captureSnapshot();\n setTabs((prev) =>\n prev.map((t): Tab => t.id === activeTabId ? { ...t, ...(snap !== null ? { snapshot: snap } : {}) } : t),\n );\n setActiveTabId(id);\n }, [activeTabId, captureSnapshot]);\n\n const addTab = useCallback(() => {\n const snap = captureSnapshot();\n setTabs((prev) => {\n const updated: Tab[] = prev.map((t): Tab =>\n t.id === activeTabId ? { ...t, ...(snap !== null ? { snapshot: snap } : {}) } : t,\n );\n const newTab = makeTab(updated.length + 1);\n setActiveTabId(newTab.id);\n return [...updated, newTab];\n });\n }, [activeTabId, captureSnapshot]);\n\n const closeTab = useCallback((id: string) => {\n setTabs((prev) => {\n if (prev.length <= 1) return prev;\n const remaining = prev.filter((t) => t.id !== id);\n if (id === activeTabId) {\n const closedIdx = prev.findIndex((t) => t.id === id);\n const next = remaining[Math.min(closedIdx, remaining.length - 1)];\n if (next) setActiveTabId(next.id);\n }\n return remaining;\n });\n }, [activeTabId]);\n\n const renameTab = useCallback((id: string, label: string) => {\n setTabs((prev) => prev.map((t) => (t.id === id ? { ...t, label } : t)));\n }, []);\n\n // ── Symbol / timeframe ─────────────────────────────────────────────────────\n\n const handleSymbolChange = useCallback((symbol: string) => {\n setTabs((prev) => prev.map((t) => (t.id === activeTabId ? { ...t, symbol } : t)));\n }, [activeTabId]);\n\n const handleTimeframeChange = useCallback((timeframe: string) => {\n setTabs((prev) => prev.map((t) => (t.id === activeTabId ? { ...t, timeframe } : t)));\n }, [activeTabId]);\n\n const handleAddCustomTimeframe = useCallback((tf: string) => {\n setCustomTimeframes((prev) => prev.includes(tf) ? prev : [...prev, tf]);\n }, []);\n\n const handleAddIndicator = useCallback((config: IndicatorConfig) => {\n chartHandleRef.current?.addIndicator(config);\n }, []);\n\n const toggleTheme = useCallback(() => setTheme((t) => (t === 'dark' ? 'light' : 'dark')), []);\n\n // ── Layout helpers ─────────────────────────────────────────────────────────\n\n const buildConfig = useCallback(\n (snap: ChartLayout): Record<string, unknown> => ({\n chartLayout: snap as unknown as Record<string, unknown>,\n customTimeframes,\n timezone,\n }),\n [customTimeframes, timezone],\n );\n\n const applyConfig = useCallback((cfg: Record<string, unknown>) => {\n const chartLayout = (\n cfg['chartLayout'] != null ? cfg['chartLayout'] : cfg\n ) as unknown as ChartLayout;\n if (Array.isArray(cfg['customTimeframes'])) {\n setCustomTimeframes(cfg['customTimeframes'] as string[]);\n }\n if (typeof cfg['timezone'] === 'string') {\n setTimezone(cfg['timezone']);\n }\n return chartLayout;\n }, []);\n\n // ── Layout save ────────────────────────────────────────────────────────────\n\n const handleSaveLayout = useCallback(async (name: string) => {\n const snap = captureSnapshot();\n if (!snap) throw new Error('No chart snapshot available');\n const config = buildConfig(snap);\n if (activeTab.savedLayoutId) {\n await layouts.update(activeTab.savedLayoutId, {\n name, symbol: activeTab.symbol, timeframe: activeTab.timeframe, config,\n });\n setTabs((prev) => prev.map((t) => (t.id === activeTabId ? { ...t, label: name } : t)));\n } else {\n const record = await layouts.create({ name, symbol: activeTab.symbol, timeframe: activeTab.timeframe, config });\n setTabs((prev) => prev.map((t) =>\n t.id === activeTabId ? { ...t, savedLayoutId: record.id, label: name } : t,\n ));\n }\n }, [activeTab, activeTabId, buildConfig, captureSnapshot, layouts]);\n\n // ── Layout load ────────────────────────────────────────────────────────────\n\n const handleLoadLayout = useCallback(async (layoutId: string) => {\n const record = await layouts.get(layoutId);\n const chartLayout = applyConfig(record.config);\n setTabs((prev) => prev.map((t) =>\n t.id === activeTabId\n ? { ...t, symbol: record.symbol, timeframe: record.timeframe, snapshot: chartLayout, savedLayoutId: record.id, label: record.name, remountCount: t.remountCount + 1 }\n : t,\n ));\n }, [activeTabId, applyConfig, layouts]);\n\n // ── Layout rename ──────────────────────────────────────────────────────────\n\n const handleRenameLayout = useCallback(async (newName: string) => {\n if (!activeTab.savedLayoutId) throw new Error('Layout is not saved yet');\n await layouts.update(activeTab.savedLayoutId, { name: newName });\n setTabs((prev) => prev.map((t) => (t.id === activeTabId ? { ...t, label: newName } : t)));\n }, [activeTab.savedLayoutId, activeTabId, layouts]);\n\n // ── Layout copy ────────────────────────────────────────────────────────────\n\n const handleCopyLayout = useCallback(async (copyName: string) => {\n const snap = captureSnapshot();\n if (!snap) throw new Error('No chart snapshot available');\n const record = await layouts.create({\n name: copyName, symbol: activeTab.symbol, timeframe: activeTab.timeframe, config: buildConfig(snap),\n });\n const chartLayout = applyConfig(record.config);\n const newTab: Tab = {\n id: uid(), label: record.name, symbol: record.symbol, timeframe: record.timeframe,\n snapshot: chartLayout, savedLayoutId: record.id, remountCount: 0,\n };\n setTabs((prev) => [\n ...prev.map((t): Tab => (t.id === activeTabId ? { ...t, snapshot: snap } : t)),\n newTab,\n ]);\n setActiveTabId(newTab.id);\n }, [activeTab, activeTabId, applyConfig, buildConfig, captureSnapshot, layouts]);\n\n // ── Layout delete ──────────────────────────────────────────────────────────\n\n const handleDeleteLayout = useCallback(async (layoutId: string) => {\n await layouts.remove(layoutId);\n setTabs((prev) => prev.map((t) => {\n if (t.savedLayoutId !== layoutId) return t;\n const { savedLayoutId: _removed, ...rest } = t;\n return rest as Tab;\n }));\n }, [layouts]);\n\n // ── Open layout in new tab ─────────────────────────────────────────────────\n\n const handleOpenLayoutInNewTab = useCallback(async (layoutId: string) => {\n const snap = captureSnapshot();\n const record = await layouts.get(layoutId);\n const chartLayout = applyConfig(record.config);\n const newTab: Tab = {\n id: uid(), label: record.name, symbol: record.symbol, timeframe: record.timeframe,\n snapshot: chartLayout, savedLayoutId: record.id, remountCount: 0,\n };\n setTabs((prev) => [\n ...prev.map((t): Tab => (t.id === activeTabId && snap ? { ...t, snapshot: snap } : t)),\n newTab,\n ]);\n setActiveTabId(newTab.id);\n }, [activeTabId, applyConfig, captureSnapshot, layouts]);\n\n // ── Auto-save ──────────────────────────────────────────────────────────────\n\n const handleToggleAutoSave = useCallback((enabled: boolean) => { setAutoSave(enabled); }, []);\n\n const autoSaveFnRef = useRef<() => void>(() => {});\n autoSaveFnRef.current = () => {\n if (!autoSave || !activeTab.savedLayoutId) return;\n const snap = chartHandleRef.current?.getLayoutSnapshot();\n if (!snap) return;\n layouts.update(activeTab.savedLayoutId, {\n name: activeTab.label, symbol: activeTab.symbol, timeframe: activeTab.timeframe, config: buildConfig(snap),\n }).catch(() => { /* silent */ });\n };\n\n useEffect(() => {\n if (!autoSave || !activeTab.savedLayoutId) return;\n const id = setInterval(() => autoSaveFnRef.current(), 5_000);\n return () => clearInterval(id);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [autoSave, activeTab.savedLayoutId, activeTab.id]);\n\n // ── Chart slot assembly ────────────────────────────────────────────────────\n\n const chartSlots = (\n <>\n {tabs.map((tab) => (\n <div\n key={tab.id}\n style={\n tab.id === activeTabId\n ? { position: 'absolute', inset: 0, display: 'flex' }\n : { position: 'absolute', inset: 0, visibility: 'hidden', pointerEvents: 'none' }\n }\n >\n <ChartCanvas\n key={`${tab.id}-${tab.remountCount}`}\n ref={(handle) => {\n if (handle) {\n chartInstancesRef.current.set(tab.id, handle);\n if (tab.id === activeTabId) chartHandleRef.current = handle;\n } else {\n chartInstancesRef.current.delete(tab.id);\n }\n }}\n symbol={tab.symbol}\n timeframe={tab.timeframe}\n theme={theme}\n timezone={timezone}\n datafeed={datafeed}\n initialIndicators={tab.snapshot ? [] : DEFAULT_INDICATORS}\n {...(tab.snapshot ? { layoutToRestore: tab.snapshot } : {})}\n {...(getExchangeLogoUrl ? { getExchangeLogoUrl } : {})}\n {...(tradingBridge ? { tradingBridge } : {})}\n onIndicatorsChanged={() => setChartDirty((d) => d + 1)}\n />\n </div>\n ))}\n </>\n );\n\n // ── Drawer assembly ────────────────────────────────────────────────────────\n\n const drawers = (\n <>\n {scriptDrawerOpen && renderScriptDrawer?.({\n onClose: () => setScriptDrawerOpen(false),\n onAddIndicator: handleAddIndicator,\n })}\n {watchlistOpen && renderWatchlistDrawer?.({\n onClose: () => setWatchlistOpen(false),\n onSelectSymbol: (sym) => { handleSymbolChange(sym); },\n })}\n </>\n );\n\n // ── Render ─────────────────────────────────────────────────────────────────\n\n return (\n <div ref={containerRef} style={{ height: '100%' }}>\n {tradeDrawerOpen && capabilities.renderManagedTradingControls && renderTradeDrawer?.({\n onClose: () => setTradeDrawerOpen(false),\n })}\n <ChartWorkspace\n // TabBar\n tabs={tabs.map((t) => ({ id: t.id, label: t.label, isSaved: !!t.savedLayoutId }))}\n activeTabId={activeTabId}\n onSelectTab={selectTab}\n onAddTab={addTab}\n onCloseTab={closeTab}\n onRenameTab={renameTab}\n // TopToolbar\n symbol={activeTab.symbol}\n timeframe={activeTab.timeframe}\n theme={theme}\n customTimeframes={customTimeframes}\n favoriteTfs={favoriteTfs}\n onSymbolChange={handleSymbolChange}\n onTimeframeChange={handleTimeframeChange}\n onAddCustomTimeframe={handleAddCustomTimeframe}\n onFavoriteTfsChange={setFavoriteTfs}\n onAddIndicator={handleAddIndicator}\n onToggleTheme={toggleTheme}\n onCopyScreenshot={handleCopyScreenshot}\n onDownloadScreenshot={handleDownloadScreenshot}\n onFullscreen={handleFullscreen}\n isFullscreen={isFullscreen}\n {...(activeTab.savedLayoutId ? { currentLayoutName: activeTab.label, currentLayoutId: activeTab.savedLayoutId } : {})}\n autoSave={autoSave}\n onFetchLayouts={() => layouts.list()}\n onSaveLayout={handleSaveLayout}\n onLoadLayout={handleLoadLayout}\n onRenameLayout={handleRenameLayout}\n onCopyLayout={handleCopyLayout}\n onToggleAutoSave={handleToggleAutoSave}\n onDeleteLayout={handleDeleteLayout}\n onOpenLayoutInNewTab={handleOpenLayoutInNewTab}\n symbolResolver={symbolResolver}\n showTradeButton={capabilities.renderManagedTradingControls}\n tradeDrawerOpen={tradeDrawerOpen}\n onToggleTradeDrawer={() => setTradeDrawerOpen((o) => !o)}\n // RightToolbar\n watchlistOpen={watchlistOpen}\n onToggleWatchlist={() => setWatchlistOpen((o) => !o)}\n // BottomToolbar\n activeSymbol={activeTab.symbol}\n timezone={timezone}\n onTimezoneChange={setTimezone}\n session={session}\n onSessionChange={setSession}\n scriptDrawerOpen={scriptDrawerOpen}\n onToggleScriptDrawer={() => setScriptDrawerOpen((o) => !o)}\n // State\n isLicensed={isLicensed}\n wsLoaded={wsLoaded}\n // Slots\n chartSlots={chartSlots}\n drawers={drawers}\n />\n </div>\n );\n});\n","/**\n * FloatingPanel — a draggable, resizable floating panel shell.\n *\n * Renders `position: fixed` with a title bar (drag to move) and 8 resize\n * handles (edges + corners). Pass panel content as `children`.\n */\n\nimport { useRef, useState } from 'react';\n\ntype Pos = { x: number; y: number };\ntype Size = { w: number; h: number };\n\ntype Props = {\n title: React.ReactNode;\n onClose: () => void;\n defaultWidth?: number;\n defaultHeight?: number;\n minWidth?: number;\n minHeight?: number;\n children: React.ReactNode;\n};\n\nexport function FloatingPanel({\n title,\n onClose,\n defaultWidth = 380,\n defaultHeight = 520,\n minWidth = 200,\n minHeight = 120,\n children,\n}: Props) {\n const [pos, setPos] = useState<Pos>(() => ({\n x: Math.max(0, window.innerWidth - defaultWidth - 24),\n y: 72,\n }));\n const [size, setSize] = useState<Size>({ w: defaultWidth, h: defaultHeight });\n\n // Refs capture drag-start values to avoid stale-closure accumulation\n const moveRef = useRef<{ ox: number; oy: number; px: number; py: number } | null>(null);\n const resizeRef = useRef<{\n edges: string;\n ox: number; oy: number;\n pw: number; ph: number;\n px: number; py: number;\n } | null>(null);\n\n // ── Drag to move ──────────────────────────────────────────────────────────\n const startMove = (e: React.MouseEvent) => {\n if ((e.target as HTMLElement).closest('.fp-close')) return;\n e.preventDefault();\n moveRef.current = { ox: e.clientX, oy: e.clientY, px: pos.x, py: pos.y };\n const onMove = (ev: MouseEvent) => {\n if (!moveRef.current) return;\n setPos({\n x: moveRef.current.px + ev.clientX - moveRef.current.ox,\n y: moveRef.current.py + ev.clientY - moveRef.current.oy,\n });\n };\n const onUp = () => {\n moveRef.current = null;\n window.removeEventListener('mousemove', onMove);\n window.removeEventListener('mouseup', onUp);\n };\n window.addEventListener('mousemove', onMove);\n window.addEventListener('mouseup', onUp);\n };\n\n // ── Resize from any edge/corner ───────────────────────────────────────────\n const startResize = (e: React.MouseEvent, edges: string) => {\n e.preventDefault();\n e.stopPropagation();\n resizeRef.current = {\n edges,\n ox: e.clientX, oy: e.clientY,\n pw: size.w, ph: size.h,\n px: pos.x, py: pos.y,\n };\n const onMove = (ev: MouseEvent) => {\n if (!resizeRef.current) return;\n const { edges: ed, ox, oy, pw, ph, px, py } = resizeRef.current;\n const dx = ev.clientX - ox;\n const dy = ev.clientY - oy;\n let nx = px, ny = py, nw = pw, nh = ph;\n if (ed.includes('e')) nw = Math.max(minWidth, pw + dx);\n if (ed.includes('s')) nh = Math.max(minHeight, ph + dy);\n if (ed.includes('w')) { nw = Math.max(minWidth, pw - dx); nx = px + pw - nw; }\n if (ed.includes('n')) { nh = Math.max(minHeight, ph - dy); ny = py + ph - nh; }\n setSize({ w: nw, h: nh });\n setPos({ x: nx, y: ny });\n };\n const onUp = () => {\n resizeRef.current = null;\n window.removeEventListener('mousemove', onMove);\n window.removeEventListener('mouseup', onUp);\n };\n window.addEventListener('mousemove', onMove);\n window.addEventListener('mouseup', onUp);\n };\n\n return (\n <div\n className=\"fp-shell\"\n style={{ left: pos.x, top: pos.y, width: size.w, height: size.h }}\n >\n {/* Title bar — drag handle */}\n <div className=\"fp-titlebar\" onMouseDown={startMove}>\n <span className=\"fp-title\">{title}</span>\n <button className=\"fp-close\" onClick={onClose} title=\"Close\">\n <svg viewBox=\"0 0 14 14\" width=\"12\" height=\"12\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\">\n <line x1=\"2\" y1=\"2\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"2\" x2=\"2\" y2=\"12\" />\n </svg>\n </button>\n </div>\n\n {/* Content */}\n <div className=\"fp-content\">{children}</div>\n\n {/* Edge resize handles */}\n <div className=\"fp-resize fp-resize-n\" onMouseDown={(e) => startResize(e, 'n')} />\n <div className=\"fp-resize fp-resize-s\" onMouseDown={(e) => startResize(e, 's')} />\n <div className=\"fp-resize fp-resize-e\" onMouseDown={(e) => startResize(e, 'e')} />\n <div className=\"fp-resize fp-resize-w\" onMouseDown={(e) => startResize(e, 'w')} />\n {/* Corner resize handles */}\n <div className=\"fp-resize fp-resize-nw\" onMouseDown={(e) => startResize(e, 'nw')} />\n <div className=\"fp-resize fp-resize-ne\" onMouseDown={(e) => startResize(e, 'ne')} />\n <div className=\"fp-resize fp-resize-sw\" onMouseDown={(e) => startResize(e, 'sw')} />\n <div className=\"fp-resize fp-resize-se\" onMouseDown={(e) => startResize(e, 'se')} />\n </div>\n );\n}\n"]}
|