@forgecharts/sdk 1.1.23 → 1.1.28
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/__tests__/backwardCompatibility.test.d.ts +14 -0
- package/dist/__tests__/backwardCompatibility.test.d.ts.map +1 -0
- package/dist/__tests__/backwardCompatibility.test.js +159 -0
- package/dist/__tests__/backwardCompatibility.test.js.map +1 -0
- package/dist/__tests__/candleInvariant.test.d.ts +20 -0
- package/dist/__tests__/candleInvariant.test.d.ts.map +1 -0
- package/dist/__tests__/candleInvariant.test.js +415 -0
- package/dist/__tests__/candleInvariant.test.js.map +1 -0
- package/dist/__tests__/public-api-surface.d.ts +13 -0
- package/dist/__tests__/public-api-surface.d.ts.map +1 -0
- package/{src/__tests__/public-api-surface.ts → dist/__tests__/public-api-surface.js} +4 -42
- package/dist/__tests__/public-api-surface.js.map +1 -0
- package/dist/__tests__/timeframeBoundary.test.d.ts +17 -0
- package/dist/__tests__/timeframeBoundary.test.d.ts.map +1 -0
- package/dist/__tests__/timeframeBoundary.test.js +452 -0
- package/dist/__tests__/timeframeBoundary.test.js.map +1 -0
- package/dist/api/DrawingManager.d.ts +20 -0
- package/dist/api/DrawingManager.d.ts.map +1 -0
- package/dist/api/DrawingManager.js +190 -0
- package/dist/api/DrawingManager.js.map +1 -0
- package/dist/api/EventBus.d.ts +19 -0
- package/dist/api/EventBus.d.ts.map +1 -0
- package/dist/api/EventBus.js +44 -0
- package/dist/api/EventBus.js.map +1 -0
- package/dist/api/IndicatorDAG.d.ts +85 -0
- package/dist/api/IndicatorDAG.d.ts.map +1 -0
- package/dist/api/IndicatorDAG.js +316 -0
- package/dist/api/IndicatorDAG.js.map +1 -0
- package/dist/api/IndicatorRegistry.d.ts +22 -0
- package/dist/api/IndicatorRegistry.d.ts.map +1 -0
- package/dist/api/IndicatorRegistry.js +39 -0
- package/dist/api/IndicatorRegistry.js.map +1 -0
- package/dist/api/LayoutManager.d.ts +30 -0
- package/dist/api/LayoutManager.d.ts.map +1 -0
- package/dist/api/LayoutManager.js +51 -0
- package/dist/api/LayoutManager.js.map +1 -0
- package/dist/api/PaneManager.d.ts +42 -0
- package/dist/api/PaneManager.d.ts.map +1 -0
- package/dist/api/PaneManager.js +119 -0
- package/dist/api/PaneManager.js.map +1 -0
- package/dist/api/ReferenceAPI.d.ts +78 -0
- package/dist/api/ReferenceAPI.d.ts.map +1 -0
- package/dist/api/ReferenceAPI.js +153 -0
- package/dist/api/ReferenceAPI.js.map +1 -0
- package/dist/api/TChart.d.ts +345 -0
- package/dist/api/TChart.d.ts.map +1 -0
- package/dist/api/TChart.js +765 -0
- package/dist/api/TChart.js.map +1 -0
- package/{src/api/createChart.ts → dist/api/createChart.d.ts} +2 -7
- package/dist/api/createChart.d.ts.map +1 -0
- package/dist/api/createChart.js +42 -0
- package/dist/api/createChart.js.map +1 -0
- package/dist/api/drawing tools/fib gann menu/fibRetracement.d.ts +4 -0
- package/dist/api/drawing tools/fib gann menu/fibRetracement.d.ts.map +1 -0
- package/dist/api/drawing tools/fib gann menu/fibRetracement.js +22 -0
- package/dist/api/drawing tools/fib gann menu/fibRetracement.js.map +1 -0
- package/dist/api/drawing tools/lines menu/crossLine.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/crossLine.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/crossLine.js +16 -0
- package/dist/api/drawing tools/lines menu/crossLine.js.map +1 -0
- package/dist/api/drawing tools/lines menu/disjointChannel.d.ts +17 -0
- package/dist/api/drawing tools/lines menu/disjointChannel.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/disjointChannel.js +59 -0
- package/dist/api/drawing tools/lines menu/disjointChannel.js.map +1 -0
- package/dist/api/drawing tools/lines menu/extendedLine.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/extendedLine.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/extendedLine.js +17 -0
- package/dist/api/drawing tools/lines menu/extendedLine.js.map +1 -0
- package/dist/api/drawing tools/lines menu/flatTopBottom.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/flatTopBottom.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/flatTopBottom.js +41 -0
- package/dist/api/drawing tools/lines menu/flatTopBottom.js.map +1 -0
- package/dist/api/drawing tools/lines menu/horizontal.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/horizontal.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/horizontal.js +19 -0
- package/dist/api/drawing tools/lines menu/horizontal.js.map +1 -0
- package/dist/api/drawing tools/lines menu/horizontalRay.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/horizontalRay.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/horizontalRay.js +20 -0
- package/dist/api/drawing tools/lines menu/horizontalRay.js.map +1 -0
- package/dist/api/drawing tools/lines menu/infoLine.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/infoLine.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/infoLine.js +107 -0
- package/dist/api/drawing tools/lines menu/infoLine.js.map +1 -0
- package/dist/api/drawing tools/lines menu/insidePitchfork.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/insidePitchfork.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/insidePitchfork.js +31 -0
- package/dist/api/drawing tools/lines menu/insidePitchfork.js.map +1 -0
- package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.js +15 -0
- package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.js.map +1 -0
- package/dist/api/drawing tools/lines menu/parallelChannel.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/parallelChannel.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/parallelChannel.js +43 -0
- package/dist/api/drawing tools/lines menu/parallelChannel.js.map +1 -0
- package/dist/api/drawing tools/lines menu/pitchfork.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/pitchfork.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/pitchfork.js +12 -0
- package/dist/api/drawing tools/lines menu/pitchfork.js.map +1 -0
- package/dist/api/drawing tools/lines menu/ray.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/ray.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/ray.js +23 -0
- package/dist/api/drawing tools/lines menu/ray.js.map +1 -0
- package/dist/api/drawing tools/lines menu/regressionTrend.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/regressionTrend.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/regressionTrend.js +127 -0
- package/dist/api/drawing tools/lines menu/regressionTrend.js.map +1 -0
- package/dist/api/drawing tools/lines menu/schiffPitchfork.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/schiffPitchfork.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/schiffPitchfork.js +15 -0
- package/dist/api/drawing tools/lines menu/schiffPitchfork.js.map +1 -0
- package/dist/api/drawing tools/lines menu/trendAngle.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/trendAngle.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/trendAngle.js +51 -0
- package/dist/api/drawing tools/lines menu/trendAngle.js.map +1 -0
- package/dist/api/drawing tools/lines menu/trendline.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/trendline.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/trendline.js +11 -0
- package/dist/api/drawing tools/lines menu/trendline.js.map +1 -0
- package/dist/api/drawing tools/lines menu/vertical.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/vertical.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/vertical.js +11 -0
- package/dist/api/drawing tools/lines menu/vertical.js.map +1 -0
- package/dist/api/drawing tools/pointers menu/crosshair.d.ts +16 -0
- package/dist/api/drawing tools/pointers menu/crosshair.d.ts.map +1 -0
- package/{src/api/drawing tools/pointers menu/crosshair.ts → dist/api/drawing tools/pointers menu/crosshair.js } +6 -7
- package/dist/api/drawing tools/pointers menu/crosshair.js.map +1 -0
- package/dist/api/drawing tools/pointers menu/cursor.d.ts +15 -0
- package/dist/api/drawing tools/pointers menu/cursor.d.ts.map +1 -0
- package/{src/api/drawing tools/pointers menu/cursor.ts → dist/api/drawing tools/pointers menu/cursor.js } +7 -8
- package/dist/api/drawing tools/pointers menu/cursor.js.map +1 -0
- package/dist/api/drawing tools/pointers menu/demonstration.d.ts +30 -0
- package/dist/api/drawing tools/pointers menu/demonstration.d.ts.map +1 -0
- package/{src/api/drawing tools/pointers menu/demonstration.ts → dist/api/drawing tools/pointers menu/demonstration.js } +9 -14
- package/dist/api/drawing tools/pointers menu/demonstration.js.map +1 -0
- package/dist/api/drawing tools/pointers menu/dot.d.ts +23 -0
- package/dist/api/drawing tools/pointers menu/dot.d.ts.map +1 -0
- package/{src/api/drawing tools/pointers menu/dot.ts → dist/api/drawing tools/pointers menu/dot.js } +8 -11
- package/dist/api/drawing tools/pointers menu/dot.js.map +1 -0
- package/dist/api/drawing tools/shapes menu/rectangle.d.ts +4 -0
- package/dist/api/drawing tools/shapes menu/rectangle.d.ts.map +1 -0
- package/dist/api/drawing tools/shapes menu/rectangle.js +19 -0
- package/dist/api/drawing tools/shapes menu/rectangle.js.map +1 -0
- package/dist/api/drawing tools/shapes menu/text.d.ts +4 -0
- package/dist/api/drawing tools/shapes menu/text.d.ts.map +1 -0
- package/dist/api/drawing tools/shapes menu/text.js +25 -0
- package/dist/api/drawing tools/shapes menu/text.js.map +1 -0
- package/dist/api/drawingUtils.d.ts +22 -0
- package/dist/api/drawingUtils.d.ts.map +1 -0
- package/dist/api/drawingUtils.js +83 -0
- package/dist/api/drawingUtils.js.map +1 -0
- package/dist/core/CanvasLayer.d.ts +26 -0
- package/dist/core/CanvasLayer.d.ts.map +1 -0
- package/dist/core/CanvasLayer.js +56 -0
- package/dist/core/CanvasLayer.js.map +1 -0
- package/dist/core/Chart.d.ts +164 -0
- package/dist/core/Chart.d.ts.map +1 -0
- package/dist/core/Chart.js +839 -0
- package/dist/core/Chart.js.map +1 -0
- package/dist/core/CoordTransform.d.ts +168 -0
- package/dist/core/CoordTransform.d.ts.map +1 -0
- package/dist/core/CoordTransform.js +224 -0
- package/dist/core/CoordTransform.js.map +1 -0
- package/dist/core/Crosshair.d.ts +30 -0
- package/dist/core/Crosshair.d.ts.map +1 -0
- package/dist/core/Crosshair.js +186 -0
- package/dist/core/Crosshair.js.map +1 -0
- package/dist/core/IndicatorEngine.d.ts +51 -0
- package/dist/core/IndicatorEngine.d.ts.map +1 -0
- package/dist/core/IndicatorEngine.js +181 -0
- package/dist/core/IndicatorEngine.js.map +1 -0
- package/dist/core/InteractionManager.d.ts +197 -0
- package/dist/core/InteractionManager.d.ts.map +1 -0
- package/dist/core/InteractionManager.js +698 -0
- package/dist/core/InteractionManager.js.map +1 -0
- package/dist/core/PriceScale.d.ts +27 -0
- package/dist/core/PriceScale.d.ts.map +1 -0
- package/dist/core/PriceScale.js +113 -0
- package/dist/core/PriceScale.js.map +1 -0
- package/dist/core/Series.d.ts +40 -0
- package/dist/core/Series.d.ts.map +1 -0
- package/dist/core/Series.js +114 -0
- package/dist/core/Series.js.map +1 -0
- package/dist/core/TimeScale.d.ts +43 -0
- package/dist/core/TimeScale.d.ts.map +1 -0
- package/dist/core/TimeScale.js +150 -0
- package/dist/core/TimeScale.js.map +1 -0
- package/dist/datafeed/DatafeedConnector.d.ts +89 -0
- package/dist/datafeed/DatafeedConnector.d.ts.map +1 -0
- package/dist/datafeed/DatafeedConnector.js +268 -0
- package/dist/datafeed/DatafeedConnector.js.map +1 -0
- package/dist/engine/CandleEngine.d.ts +207 -0
- package/dist/engine/CandleEngine.d.ts.map +1 -0
- package/dist/engine/CandleEngine.js +318 -0
- package/dist/engine/CandleEngine.js.map +1 -0
- package/dist/engine/__tests__/CandleEngine.test.d.ts +2 -0
- package/dist/engine/__tests__/CandleEngine.test.d.ts.map +1 -0
- package/dist/engine/__tests__/CandleEngine.test.js +300 -0
- package/dist/engine/__tests__/CandleEngine.test.js.map +1 -0
- package/dist/engine/candleInvariants.d.ts +66 -0
- package/dist/engine/candleInvariants.d.ts.map +1 -0
- package/dist/engine/candleInvariants.js +134 -0
- package/dist/engine/candleInvariants.js.map +1 -0
- package/{src/engine/mergeUtils.ts → dist/engine/mergeUtils.d.ts} +15 -52
- package/dist/engine/mergeUtils.d.ts.map +1 -0
- package/dist/engine/mergeUtils.js +64 -0
- package/dist/engine/mergeUtils.js.map +1 -0
- package/dist/engine/timeframeUtils.d.ts +80 -0
- package/dist/engine/timeframeUtils.d.ts.map +1 -0
- package/{src/engine/timeframeUtils.ts → dist/engine/timeframeUtils.js} +30 -48
- package/dist/engine/timeframeUtils.js.map +1 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/internal.d.ts +29 -0
- package/dist/internal.d.ts.map +1 -0
- package/{src/internal.ts → dist/internal.js} +2 -11
- package/dist/internal.js.map +1 -0
- package/dist/licensing/ChartRuntimeResolver.d.ts +233 -0
- package/dist/licensing/ChartRuntimeResolver.d.ts.map +1 -0
- package/dist/licensing/ChartRuntimeResolver.js +310 -0
- package/dist/licensing/ChartRuntimeResolver.js.map +1 -0
- package/dist/licensing/LicenseManager.d.ts +55 -0
- package/dist/licensing/LicenseManager.d.ts.map +1 -0
- package/dist/licensing/LicenseManager.js +114 -0
- package/dist/licensing/LicenseManager.js.map +1 -0
- package/dist/licensing/__tests__/ChartRuntimeResolver.test.d.ts +13 -0
- package/dist/licensing/__tests__/ChartRuntimeResolver.test.d.ts.map +1 -0
- package/dist/licensing/__tests__/ChartRuntimeResolver.test.js +177 -0
- package/dist/licensing/__tests__/ChartRuntimeResolver.test.js.map +1 -0
- package/dist/licensing/__tests__/LicenseManager.test.d.ts +12 -0
- package/dist/licensing/__tests__/LicenseManager.test.d.ts.map +1 -0
- package/dist/licensing/__tests__/LicenseManager.test.js +153 -0
- package/dist/licensing/__tests__/LicenseManager.test.js.map +1 -0
- package/dist/licensing/licenseTypes.d.ts +18 -0
- package/dist/licensing/licenseTypes.d.ts.map +1 -0
- package/dist/licensing/licenseTypes.js +2 -0
- package/dist/licensing/licenseTypes.js.map +1 -0
- package/dist/pine/PineCompiler.d.ts +35 -0
- package/dist/pine/PineCompiler.d.ts.map +1 -0
- package/dist/pine/PineCompiler.js +44 -0
- package/dist/pine/PineCompiler.js.map +1 -0
- package/dist/pine/diagnostics.d.ts +20 -0
- package/dist/pine/diagnostics.d.ts.map +1 -0
- package/dist/pine/diagnostics.js +11 -0
- package/dist/pine/diagnostics.js.map +1 -0
- package/{src/pine/index.ts → dist/pine/index.d.ts} +4 -3
- package/dist/pine/index.d.ts.map +1 -0
- package/dist/pine/index.js +5 -0
- package/dist/pine/index.js.map +1 -0
- package/dist/pine/pine-ast.d.ts +142 -0
- package/dist/pine/pine-ast.d.ts.map +1 -0
- package/dist/pine/pine-ast.js +19 -0
- package/dist/pine/pine-ast.js.map +1 -0
- package/dist/pine/pine-lexer.d.ts +41 -0
- package/dist/pine/pine-lexer.d.ts.map +1 -0
- package/dist/pine/pine-lexer.js +249 -0
- package/dist/pine/pine-lexer.js.map +1 -0
- package/dist/pine/pine-parser.d.ts +51 -0
- package/dist/pine/pine-parser.d.ts.map +1 -0
- package/dist/pine/pine-parser.js +416 -0
- package/dist/pine/pine-parser.js.map +1 -0
- package/dist/pine/pine-transpiler.d.ts +33 -0
- package/dist/pine/pine-transpiler.d.ts.map +1 -0
- package/dist/pine/pine-transpiler.js +260 -0
- package/dist/pine/pine-transpiler.js.map +1 -0
- package/dist/pixi/LayerName.d.ts +18 -0
- package/dist/pixi/LayerName.d.ts.map +1 -0
- package/dist/pixi/LayerName.js +35 -0
- package/dist/pixi/LayerName.js.map +1 -0
- package/dist/pixi/PixiCandlestickRenderer.d.ts +23 -0
- package/dist/pixi/PixiCandlestickRenderer.d.ts.map +1 -0
- package/dist/pixi/PixiCandlestickRenderer.js +107 -0
- package/dist/pixi/PixiCandlestickRenderer.js.map +1 -0
- package/dist/pixi/PixiChart.d.ts +72 -0
- package/dist/pixi/PixiChart.d.ts.map +1 -0
- package/dist/pixi/PixiChart.js +367 -0
- package/dist/pixi/PixiChart.js.map +1 -0
- package/dist/pixi/PixiCrosshairRenderer.d.ts +29 -0
- package/dist/pixi/PixiCrosshairRenderer.d.ts.map +1 -0
- package/dist/pixi/PixiCrosshairRenderer.js +110 -0
- package/dist/pixi/PixiCrosshairRenderer.js.map +1 -0
- package/dist/pixi/PixiDrawingRenderer.d.ts +17 -0
- package/dist/pixi/PixiDrawingRenderer.d.ts.map +1 -0
- package/dist/pixi/PixiDrawingRenderer.js +111 -0
- package/dist/pixi/PixiDrawingRenderer.js.map +1 -0
- package/dist/pixi/PixiGridRenderer.d.ts +22 -0
- package/dist/pixi/PixiGridRenderer.d.ts.map +1 -0
- package/dist/pixi/PixiGridRenderer.js +114 -0
- package/dist/pixi/PixiGridRenderer.js.map +1 -0
- package/dist/pixi/PixiLayerManager.d.ts +56 -0
- package/dist/pixi/PixiLayerManager.d.ts.map +1 -0
- package/dist/pixi/PixiLayerManager.js +92 -0
- package/dist/pixi/PixiLayerManager.js.map +1 -0
- package/dist/react/canvas/ChartCanvas.d.ts +85 -0
- package/dist/react/canvas/ChartCanvas.d.ts.map +1 -0
- package/dist/react/canvas/ChartCanvas.js +604 -0
- package/dist/react/canvas/ChartCanvas.js.map +1 -0
- package/dist/react/canvas/ChartContextMenu.d.ts +18 -0
- package/dist/react/canvas/ChartContextMenu.d.ts.map +1 -0
- package/dist/react/canvas/ChartContextMenu.js +5 -0
- package/dist/react/canvas/ChartContextMenu.js.map +1 -0
- package/dist/react/canvas/ChartSettingsDialog.d.ts +25 -0
- package/dist/react/canvas/ChartSettingsDialog.d.ts.map +1 -0
- package/dist/react/canvas/ChartSettingsDialog.js +28 -0
- package/dist/react/canvas/ChartSettingsDialog.js.map +1 -0
- package/dist/react/canvas/IndicatorLabel.d.ts +21 -0
- package/dist/react/canvas/IndicatorLabel.d.ts.map +1 -0
- package/dist/react/canvas/IndicatorLabel.js +196 -0
- package/dist/react/canvas/IndicatorLabel.js.map +1 -0
- package/dist/react/canvas/IndicatorPane.d.ts +32 -0
- package/dist/react/canvas/IndicatorPane.d.ts.map +1 -0
- package/dist/react/canvas/IndicatorPane.js +395 -0
- package/dist/react/canvas/IndicatorPane.js.map +1 -0
- package/dist/react/canvas/PointerOverlay.d.ts +23 -0
- package/dist/react/canvas/PointerOverlay.d.ts.map +1 -0
- package/dist/react/canvas/PointerOverlay.js +61 -0
- package/dist/react/canvas/PointerOverlay.js.map +1 -0
- package/dist/react/canvas/toolbars/LeftToolbar.d.ts +19 -0
- package/dist/react/canvas/toolbars/LeftToolbar.d.ts.map +1 -0
- package/dist/react/canvas/toolbars/LeftToolbar.js +407 -0
- package/dist/react/canvas/toolbars/LeftToolbar.js.map +1 -0
- package/dist/react/hooks/useChartCapabilities.d.ts +21 -0
- package/dist/react/hooks/useChartCapabilities.d.ts.map +1 -0
- package/dist/react/hooks/useChartCapabilities.js +66 -0
- package/dist/react/hooks/useChartCapabilities.js.map +1 -0
- package/dist/react/index.d.ts +30 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +28 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/internal.d.ts +38 -0
- package/dist/react/internal.d.ts.map +1 -0
- package/dist/react/internal.js +44 -0
- package/dist/react/internal.js.map +1 -0
- package/dist/react/shell/ManagedAppShell.d.ts +91 -0
- package/dist/react/shell/ManagedAppShell.d.ts.map +1 -0
- package/dist/react/shell/ManagedAppShell.js +440 -0
- package/dist/react/shell/ManagedAppShell.js.map +1 -0
- package/dist/react/trading/TradingBridge.d.ts +86 -0
- package/dist/react/trading/TradingBridge.d.ts.map +1 -0
- package/dist/react/trading/TradingBridge.js +73 -0
- package/dist/react/trading/TradingBridge.js.map +1 -0
- package/dist/react/workspace/ChartWorkspace.d.ts +73 -0
- package/dist/react/workspace/ChartWorkspace.d.ts.map +1 -0
- package/dist/react/workspace/ChartWorkspace.js +42 -0
- package/dist/react/workspace/ChartWorkspace.js.map +1 -0
- package/dist/react/workspace/FloatingPanel.d.ts +18 -0
- package/dist/react/workspace/FloatingPanel.d.ts.map +1 -0
- package/dist/react/workspace/FloatingPanel.js +82 -0
- package/dist/react/workspace/FloatingPanel.js.map +1 -0
- package/dist/react/workspace/IndicatorsDialog.d.ts +8 -0
- package/dist/react/workspace/IndicatorsDialog.d.ts.map +1 -0
- package/dist/react/workspace/IndicatorsDialog.js +121 -0
- package/dist/react/workspace/IndicatorsDialog.js.map +1 -0
- package/dist/react/workspace/LayoutMenu.d.ts +33 -0
- package/dist/react/workspace/LayoutMenu.d.ts.map +1 -0
- package/dist/react/workspace/LayoutMenu.js +113 -0
- package/dist/react/workspace/LayoutMenu.js.map +1 -0
- package/dist/react/workspace/SymbolSearchDialog.d.ts +10 -0
- package/dist/react/workspace/SymbolSearchDialog.d.ts.map +1 -0
- package/dist/react/workspace/SymbolSearchDialog.js +245 -0
- package/dist/react/workspace/SymbolSearchDialog.js.map +1 -0
- package/dist/react/workspace/TabBar.d.ts +17 -0
- package/dist/react/workspace/TabBar.d.ts.map +1 -0
- package/dist/react/workspace/TabBar.js +29 -0
- package/dist/react/workspace/TabBar.js.map +1 -0
- package/dist/react/workspace/toolbars/BottomToolbar.d.ts +19 -0
- package/dist/react/workspace/toolbars/BottomToolbar.d.ts.map +1 -0
- package/dist/react/workspace/toolbars/BottomToolbar.js +236 -0
- package/dist/react/workspace/toolbars/BottomToolbar.js.map +1 -0
- package/dist/react/workspace/toolbars/RightToolbar.d.ts +8 -0
- package/dist/react/workspace/toolbars/RightToolbar.d.ts.map +1 -0
- package/dist/react/workspace/toolbars/RightToolbar.js +18 -0
- package/dist/react/workspace/toolbars/RightToolbar.js.map +1 -0
- package/dist/react/workspace/toolbars/TopToolbar.d.ts +41 -0
- package/dist/react/workspace/toolbars/TopToolbar.d.ts.map +1 -0
- package/dist/react/workspace/toolbars/TopToolbar.js +82 -0
- package/dist/react/workspace/toolbars/TopToolbar.js.map +1 -0
- package/dist/renderers/CandlestickRenderer.d.ts +13 -0
- package/dist/renderers/CandlestickRenderer.d.ts.map +1 -0
- package/dist/renderers/CandlestickRenderer.js +98 -0
- package/dist/renderers/CandlestickRenderer.js.map +1 -0
- package/dist/renderers/HistogramRenderer.d.ts +11 -0
- package/dist/renderers/HistogramRenderer.d.ts.map +1 -0
- package/dist/renderers/HistogramRenderer.js +50 -0
- package/dist/renderers/HistogramRenderer.js.map +1 -0
- package/dist/renderers/LineRenderer.d.ts +12 -0
- package/dist/renderers/LineRenderer.d.ts.map +1 -0
- package/dist/renderers/LineRenderer.js +64 -0
- package/dist/renderers/LineRenderer.js.map +1 -0
- package/dist/theme/colors.d.ts +4 -0
- package/dist/theme/colors.d.ts.map +1 -0
- package/dist/theme/colors.js +19 -0
- package/dist/theme/colors.js.map +1 -0
- package/dist/tools/barDivergenceCheck.d.ts +120 -0
- package/dist/tools/barDivergenceCheck.d.ts.map +1 -0
- package/dist/tools/barDivergenceCheck.js +200 -0
- package/dist/tools/barDivergenceCheck.js.map +1 -0
- package/dist/trading/TradingOverlayStore.d.ts +86 -0
- package/dist/trading/TradingOverlayStore.d.ts.map +1 -0
- package/dist/trading/TradingOverlayStore.js +139 -0
- package/dist/trading/TradingOverlayStore.js.map +1 -0
- package/dist/trading/UnmanagedIngestion.d.ts +91 -0
- package/dist/trading/UnmanagedIngestion.d.ts.map +1 -0
- package/dist/trading/UnmanagedIngestion.js +114 -0
- package/dist/trading/UnmanagedIngestion.js.map +1 -0
- package/dist/trading/__tests__/ManagedTradingController.test.d.ts +18 -0
- package/dist/trading/__tests__/ManagedTradingController.test.d.ts.map +1 -0
- package/dist/trading/__tests__/ManagedTradingController.test.js +271 -0
- package/dist/trading/__tests__/ManagedTradingController.test.js.map +1 -0
- package/dist/trading/__tests__/TradingOverlayStore.test.d.ts +16 -0
- package/dist/trading/__tests__/TradingOverlayStore.test.d.ts.map +1 -0
- package/dist/trading/__tests__/TradingOverlayStore.test.js +267 -0
- package/dist/trading/__tests__/TradingOverlayStore.test.js.map +1 -0
- package/dist/trading/__tests__/UnmanagedIngestion.test.d.ts +16 -0
- package/dist/trading/__tests__/UnmanagedIngestion.test.d.ts.map +1 -0
- package/dist/trading/__tests__/UnmanagedIngestion.test.js +170 -0
- package/dist/trading/__tests__/UnmanagedIngestion.test.js.map +1 -0
- package/dist/trading/managed/ManagedTradingController.d.ts +110 -0
- package/dist/trading/managed/ManagedTradingController.d.ts.map +1 -0
- package/dist/trading/managed/ManagedTradingController.js +247 -0
- package/dist/trading/managed/ManagedTradingController.js.map +1 -0
- package/dist/trading/managed/managedCapabilities.d.ts +45 -0
- package/dist/trading/managed/managedCapabilities.d.ts.map +1 -0
- package/dist/trading/managed/managedCapabilities.js +79 -0
- package/dist/trading/managed/managedCapabilities.js.map +1 -0
- package/dist/trading/managed/managedTypes.d.ts +122 -0
- package/dist/trading/managed/managedTypes.d.ts.map +1 -0
- package/dist/trading/managed/managedTypes.js +13 -0
- package/dist/trading/managed/managedTypes.js.map +1 -0
- package/dist/trading/tradingTypes.d.ts +89 -0
- package/dist/trading/tradingTypes.d.ts.map +1 -0
- package/dist/trading/tradingTypes.js +8 -0
- package/dist/trading/tradingTypes.js.map +1 -0
- package/dist/tscript/TScriptIndicator.d.ts +41 -0
- package/dist/tscript/TScriptIndicator.d.ts.map +1 -0
- package/dist/tscript/TScriptIndicator.js +47 -0
- package/dist/tscript/TScriptIndicator.js.map +1 -0
- package/dist/tscript/ast.d.ts +89 -0
- package/dist/tscript/ast.d.ts.map +1 -0
- package/dist/tscript/ast.js +22 -0
- package/dist/tscript/ast.js.map +1 -0
- package/dist/tscript/lexer.d.ts +36 -0
- package/dist/tscript/lexer.d.ts.map +1 -0
- package/dist/tscript/lexer.js +187 -0
- package/dist/tscript/lexer.js.map +1 -0
- package/dist/tscript/parser.d.ts +50 -0
- package/dist/tscript/parser.d.ts.map +1 -0
- package/dist/tscript/parser.js +318 -0
- package/dist/tscript/parser.js.map +1 -0
- package/dist/tscript/runtime.d.ts +123 -0
- package/dist/tscript/runtime.d.ts.map +1 -0
- package/dist/tscript/runtime.js +475 -0
- package/dist/tscript/runtime.js.map +1 -0
- package/dist/tscript/series.d.ts +49 -0
- package/dist/tscript/series.d.ts.map +1 -0
- package/dist/tscript/series.js +79 -0
- package/dist/tscript/series.js.map +1 -0
- package/dist/types/IChart.d.ts +48 -0
- package/dist/types/IChart.d.ts.map +1 -0
- package/dist/types/IChart.js +2 -0
- package/dist/types/IChart.js.map +1 -0
- package/{src/types/IRenderer.ts → dist/types/IRenderer.d.ts} +2 -8
- package/dist/types/IRenderer.d.ts.map +1 -0
- package/dist/types/IRenderer.js +2 -0
- package/dist/types/IRenderer.js.map +1 -0
- package/dist/types/ISeries.d.ts +26 -0
- package/dist/types/ISeries.d.ts.map +1 -0
- package/dist/types/ISeries.js +2 -0
- package/dist/types/ISeries.js.map +1 -0
- package/package.json +32 -4
- package/src/__tests__/backwardCompatibility.test.ts +0 -191
- package/src/__tests__/candleInvariant.test.ts +0 -500
- package/src/__tests__/timeframeBoundary.test.ts +0 -583
- package/src/api/DrawingManager.ts +0 -188
- package/src/api/EventBus.ts +0 -53
- package/src/api/IndicatorDAG.ts +0 -389
- package/src/api/IndicatorRegistry.ts +0 -47
- package/src/api/LayoutManager.ts +0 -72
- package/src/api/PaneManager.ts +0 -129
- package/src/api/ReferenceAPI.ts +0 -195
- package/src/api/TChart.ts +0 -881
- package/src/api/drawing tools/fib gann menu/fibRetracement.ts +0 -27
- package/src/api/drawing tools/lines menu/crossLine.ts +0 -21
- package/src/api/drawing tools/lines menu/disjointChannel.ts +0 -74
- package/src/api/drawing tools/lines menu/extendedLine.ts +0 -22
- package/src/api/drawing tools/lines menu/flatTopBottom.ts +0 -45
- package/src/api/drawing tools/lines menu/horizontal.ts +0 -24
- package/src/api/drawing tools/lines menu/horizontalRay.ts +0 -25
- package/src/api/drawing tools/lines menu/infoLine.ts +0 -127
- package/src/api/drawing tools/lines menu/insidePitchfork.ts +0 -21
- package/src/api/drawing tools/lines menu/modifiedSchiffPitchfork.ts +0 -18
- package/src/api/drawing tools/lines menu/parallelChannel.ts +0 -47
- package/src/api/drawing tools/lines menu/pitchfork.ts +0 -15
- package/src/api/drawing tools/lines menu/ray.ts +0 -28
- package/src/api/drawing tools/lines menu/regressionTrend.ts +0 -157
- package/src/api/drawing tools/lines menu/schiffPitchfork.ts +0 -18
- package/src/api/drawing tools/lines menu/trendAngle.ts +0 -64
- package/src/api/drawing tools/lines menu/trendline.ts +0 -16
- package/src/api/drawing tools/lines menu/vertical.ts +0 -16
- package/src/api/drawing tools/shapes menu/rectangle.ts +0 -24
- package/src/api/drawing tools/shapes menu/text.ts +0 -30
- package/src/api/drawingUtils.ts +0 -82
- package/src/core/CanvasLayer.ts +0 -77
- package/src/core/Chart.ts +0 -917
- package/src/core/CoordTransform.ts +0 -282
- package/src/core/Crosshair.ts +0 -207
- package/src/core/IndicatorEngine.ts +0 -216
- package/src/core/InteractionManager.ts +0 -899
- package/src/core/PriceScale.ts +0 -133
- package/src/core/Series.ts +0 -132
- package/src/core/TimeScale.ts +0 -175
- package/src/datafeed/DatafeedConnector.ts +0 -300
- package/src/engine/CandleEngine.ts +0 -458
- package/src/engine/__tests__/CandleEngine.test.ts +0 -402
- package/src/engine/candleInvariants.ts +0 -172
- package/src/index.ts +0 -190
- package/src/licensing/ChartRuntimeResolver.ts +0 -380
- package/src/licensing/LicenseManager.ts +0 -131
- package/src/licensing/__tests__/ChartRuntimeResolver.test.ts +0 -207
- package/src/licensing/__tests__/LicenseManager.test.ts +0 -180
- package/src/licensing/licenseTypes.ts +0 -19
- package/src/pine/PineCompiler.ts +0 -68
- package/src/pine/diagnostics.ts +0 -30
- package/src/pine/pine-ast.ts +0 -163
- package/src/pine/pine-lexer.ts +0 -265
- package/src/pine/pine-parser.ts +0 -439
- package/src/pine/pine-transpiler.ts +0 -301
- package/src/pixi/LayerName.ts +0 -35
- package/src/pixi/PixiCandlestickRenderer.ts +0 -125
- package/src/pixi/PixiChart.ts +0 -425
- package/src/pixi/PixiCrosshairRenderer.ts +0 -134
- package/src/pixi/PixiDrawingRenderer.ts +0 -121
- package/src/pixi/PixiGridRenderer.ts +0 -136
- package/src/pixi/PixiLayerManager.ts +0 -102
- package/src/renderers/CandlestickRenderer.ts +0 -130
- package/src/renderers/HistogramRenderer.ts +0 -63
- package/src/renderers/LineRenderer.ts +0 -77
- package/src/theme/colors.ts +0 -21
- package/src/tools/barDivergenceCheck.ts +0 -305
- package/src/trading/TradingOverlayStore.ts +0 -161
- package/src/trading/UnmanagedIngestion.ts +0 -156
- package/src/trading/__tests__/ManagedTradingController.test.ts +0 -338
- package/src/trading/__tests__/TradingOverlayStore.test.ts +0 -323
- package/src/trading/__tests__/UnmanagedIngestion.test.ts +0 -205
- package/src/trading/managed/ManagedTradingController.ts +0 -292
- package/src/trading/managed/managedCapabilities.ts +0 -98
- package/src/trading/managed/managedTypes.ts +0 -151
- package/src/trading/tradingTypes.ts +0 -135
- package/src/tscript/TScriptIndicator.ts +0 -54
- package/src/tscript/ast.ts +0 -105
- package/src/tscript/lexer.ts +0 -190
- package/src/tscript/parser.ts +0 -334
- package/src/tscript/runtime.ts +0 -525
- package/src/tscript/series.ts +0 -84
- package/src/types/IChart.ts +0 -56
- package/src/types/ISeries.ts +0 -30
- package/tsconfig.json +0 -22
- package/tsup.config.ts +0 -15
- package/vitest.config.ts +0 -25
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ISymbolResolver } from '@forgecharts/types';
|
|
2
|
+
type Props = {
|
|
3
|
+
current: string;
|
|
4
|
+
onSelect: (symbol: string) => void;
|
|
5
|
+
onClose: () => void;
|
|
6
|
+
symbolResolver: ISymbolResolver;
|
|
7
|
+
};
|
|
8
|
+
export declare function SymbolSearchDialog({ current, onSelect, onClose, symbolResolver }: Props): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=SymbolSearchDialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SymbolSearchDialog.d.ts","sourceRoot":"","sources":["../../../src/react/workspace/SymbolSearchDialog.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAa,eAAe,EAAsB,MAAM,oBAAoB,CAAC;AAmEzF,KAAK,KAAK,GAAG;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,cAAc,EAAE,eAAe,CAAC;CACjC,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,KAAK,2CA6SvF"}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useEffect, useRef, useCallback } from 'react';
|
|
3
|
+
const PAGE_SIZE = 100;
|
|
4
|
+
const TABS = [
|
|
5
|
+
{ label: 'All', market: '' },
|
|
6
|
+
{ label: 'Stocks', market: 'stocks' },
|
|
7
|
+
{ label: 'Funds', market: 'etfs' },
|
|
8
|
+
{ label: 'Futures', market: 'futures' },
|
|
9
|
+
{ label: 'Forex', market: 'forex' },
|
|
10
|
+
{ label: 'Crypto', market: 'crypto' },
|
|
11
|
+
{ label: 'Indices', market: 'indices' },
|
|
12
|
+
{ label: 'Bonds', market: 'bonds' },
|
|
13
|
+
{ label: 'Economy', market: 'economy' },
|
|
14
|
+
{ label: 'Options', market: 'options' },
|
|
15
|
+
];
|
|
16
|
+
function refSymbolsToEntries(symbols) {
|
|
17
|
+
return symbols.map(s => ({
|
|
18
|
+
symbol: s.symbol,
|
|
19
|
+
name: s.displayName,
|
|
20
|
+
symbolKey: s.symbolKey,
|
|
21
|
+
exchange: s.exchange,
|
|
22
|
+
assetType: s.assetType,
|
|
23
|
+
market: s.market,
|
|
24
|
+
...(s.logoUrl ? { logoUrl: s.logoUrl } : {}),
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
27
|
+
function stringColor(str) {
|
|
28
|
+
const palette = [
|
|
29
|
+
'#f7931a', '#627eea', '#2775ca', '#26a17b', '#e84142',
|
|
30
|
+
'#00adef', '#e91e63', '#9945ff', '#00d4aa', '#ff6b35',
|
|
31
|
+
];
|
|
32
|
+
let h = 0;
|
|
33
|
+
for (let i = 0; i < str.length; i++)
|
|
34
|
+
h = (Math.imul(31, h) + str.charCodeAt(i)) | 0;
|
|
35
|
+
return palette[Math.abs(h) % palette.length] ?? '#888888';
|
|
36
|
+
}
|
|
37
|
+
function badgeLabel(assetType, market) {
|
|
38
|
+
const a = assetType?.toLowerCase() ?? '';
|
|
39
|
+
const m = market?.toLowerCase() ?? '';
|
|
40
|
+
if (a && m && a !== m)
|
|
41
|
+
return `${a} ${m}`;
|
|
42
|
+
return a || m || '';
|
|
43
|
+
}
|
|
44
|
+
function SymbolIcon({ logoUrl, letter, color }) {
|
|
45
|
+
const [failed, setFailed] = useState(false);
|
|
46
|
+
return (_jsx("span", { className: "sym-row-icon", style: { background: (logoUrl && !failed) ? 'transparent' : color }, children: logoUrl && !failed
|
|
47
|
+
? _jsx("img", { src: logoUrl, alt: "", className: "sym-logo-img", onError: () => setFailed(true) })
|
|
48
|
+
: letter }));
|
|
49
|
+
}
|
|
50
|
+
export function SymbolSearchDialog({ current, onSelect, onClose, symbolResolver }) {
|
|
51
|
+
const [query, setQuery] = useState('');
|
|
52
|
+
const [activeTab, setActiveTab] = useState(0);
|
|
53
|
+
const [tabSymbols, setTabSymbols] = useState([]);
|
|
54
|
+
const [tabLoading, setTabLoading] = useState(false);
|
|
55
|
+
const [tabLoadingMore, setTabLoadingMore] = useState(false);
|
|
56
|
+
const [tabOffset, setTabOffset] = useState(0);
|
|
57
|
+
const [tabHasMore, setTabHasMore] = useState(false);
|
|
58
|
+
const [searchResults, setSearchResults] = useState(null);
|
|
59
|
+
const [isSearching, setIsSearching] = useState(false);
|
|
60
|
+
const [searchingMore, setSearchingMore] = useState(false);
|
|
61
|
+
const [searchOffset, setSearchOffset] = useState(0);
|
|
62
|
+
const [searchHasMore, setSearchHasMore] = useState(false);
|
|
63
|
+
const inputRef = useRef(null);
|
|
64
|
+
const dialogRef = useRef(null);
|
|
65
|
+
const sentinelRef = useRef(null);
|
|
66
|
+
const searchTimer = useRef(null);
|
|
67
|
+
const queryRef = useRef(query);
|
|
68
|
+
const activeTabRef = useRef(activeTab);
|
|
69
|
+
queryRef.current = query;
|
|
70
|
+
activeTabRef.current = activeTab;
|
|
71
|
+
useEffect(() => { inputRef.current?.focus(); }, []);
|
|
72
|
+
useEffect(() => {
|
|
73
|
+
const h = (e) => { if (e.key === 'Escape')
|
|
74
|
+
onClose(); };
|
|
75
|
+
window.addEventListener('keydown', h);
|
|
76
|
+
return () => window.removeEventListener('keydown', h);
|
|
77
|
+
}, [onClose]);
|
|
78
|
+
// Tab browse: use getSymbols() for all tabs — supports offset pagination.
|
|
79
|
+
useEffect(() => {
|
|
80
|
+
const market = TABS[activeTab]?.market ?? '';
|
|
81
|
+
let cancelled = false;
|
|
82
|
+
setTabLoading(true);
|
|
83
|
+
setTabSymbols([]);
|
|
84
|
+
setTabOffset(0);
|
|
85
|
+
setTabHasMore(false);
|
|
86
|
+
symbolResolver.getSymbols({ ...(market ? { market } : {}), limit: PAGE_SIZE, offset: 0 })
|
|
87
|
+
.then((r) => {
|
|
88
|
+
if (!cancelled) {
|
|
89
|
+
setTabSymbols(refSymbolsToEntries(r.symbols));
|
|
90
|
+
setTabHasMore(r.symbols.length === PAGE_SIZE);
|
|
91
|
+
setTabOffset(PAGE_SIZE);
|
|
92
|
+
}
|
|
93
|
+
})
|
|
94
|
+
.catch(() => { })
|
|
95
|
+
.finally(() => { if (!cancelled)
|
|
96
|
+
setTabLoading(false); });
|
|
97
|
+
return () => { cancelled = true; };
|
|
98
|
+
}, [activeTab]);
|
|
99
|
+
const loadMoreTab = useCallback(async () => {
|
|
100
|
+
if (tabLoadingMore || !tabHasMore)
|
|
101
|
+
return;
|
|
102
|
+
const market = TABS[activeTabRef.current]?.market ?? '';
|
|
103
|
+
setTabLoadingMore(true);
|
|
104
|
+
try {
|
|
105
|
+
const r = await symbolResolver.getSymbols({ ...(market ? { market } : {}), limit: PAGE_SIZE, offset: tabOffset });
|
|
106
|
+
setTabSymbols(prev => [...prev, ...refSymbolsToEntries(r.symbols)]);
|
|
107
|
+
setTabHasMore(r.symbols.length === PAGE_SIZE);
|
|
108
|
+
setTabOffset(prev => prev + PAGE_SIZE);
|
|
109
|
+
}
|
|
110
|
+
catch { /* ignore */ }
|
|
111
|
+
finally {
|
|
112
|
+
setTabLoadingMore(false);
|
|
113
|
+
}
|
|
114
|
+
}, [tabLoadingMore, tabHasMore, tabOffset]);
|
|
115
|
+
const loadMoreSearch = useCallback(async () => {
|
|
116
|
+
if (searchingMore || !searchHasMore)
|
|
117
|
+
return;
|
|
118
|
+
const q = queryRef.current.trim();
|
|
119
|
+
if (!q)
|
|
120
|
+
return;
|
|
121
|
+
const market = TABS[activeTabRef.current]?.market;
|
|
122
|
+
setSearchingMore(true);
|
|
123
|
+
try {
|
|
124
|
+
const res = await symbolResolver.searchSymbols(q, {
|
|
125
|
+
limit: PAGE_SIZE, offset: searchOffset,
|
|
126
|
+
...(market ? { market } : {}),
|
|
127
|
+
});
|
|
128
|
+
setSearchResults(prev => prev ? [...prev, ...refSymbolsToEntries(res.symbols)] : refSymbolsToEntries(res.symbols));
|
|
129
|
+
setSearchHasMore(res.symbols.length === PAGE_SIZE);
|
|
130
|
+
setSearchOffset(prev => prev + PAGE_SIZE);
|
|
131
|
+
}
|
|
132
|
+
catch { /* ignore */ }
|
|
133
|
+
finally {
|
|
134
|
+
setSearchingMore(false);
|
|
135
|
+
}
|
|
136
|
+
}, [searchingMore, searchHasMore, searchOffset]);
|
|
137
|
+
// Stable refs so the IntersectionObserver callback always calls the latest version
|
|
138
|
+
const loadMoreTabRef = useRef(loadMoreTab);
|
|
139
|
+
const loadMoreSearchRef = useRef(loadMoreSearch);
|
|
140
|
+
loadMoreTabRef.current = loadMoreTab;
|
|
141
|
+
loadMoreSearchRef.current = loadMoreSearch;
|
|
142
|
+
// Sentinel IntersectionObserver — fires loadMore when the bottom of the list enters view
|
|
143
|
+
useEffect(() => {
|
|
144
|
+
const sentinel = sentinelRef.current;
|
|
145
|
+
if (!sentinel)
|
|
146
|
+
return;
|
|
147
|
+
const observer = new IntersectionObserver(entries => {
|
|
148
|
+
if (entries[0]?.isIntersecting) {
|
|
149
|
+
if (queryRef.current.trim()) {
|
|
150
|
+
void loadMoreSearchRef.current();
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
void loadMoreTabRef.current();
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}, { threshold: 0.1 });
|
|
157
|
+
observer.observe(sentinel);
|
|
158
|
+
return () => observer.disconnect();
|
|
159
|
+
}, []); // eslint-disable-line react-hooks/exhaustive-deps
|
|
160
|
+
const doSearch = useCallback((q, tab) => {
|
|
161
|
+
if (searchTimer.current)
|
|
162
|
+
clearTimeout(searchTimer.current);
|
|
163
|
+
if (!q.trim()) {
|
|
164
|
+
setSearchResults(null);
|
|
165
|
+
setSearchOffset(0);
|
|
166
|
+
setSearchHasMore(false);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
setIsSearching(true);
|
|
170
|
+
searchTimer.current = setTimeout(async () => {
|
|
171
|
+
try {
|
|
172
|
+
const market = TABS[tab]?.market;
|
|
173
|
+
const res = await symbolResolver.searchSymbols(q.trim(), {
|
|
174
|
+
limit: PAGE_SIZE, offset: 0,
|
|
175
|
+
...(market ? { market } : {}),
|
|
176
|
+
});
|
|
177
|
+
setSearchResults(refSymbolsToEntries(res.symbols));
|
|
178
|
+
setSearchHasMore(res.symbols.length === PAGE_SIZE);
|
|
179
|
+
setSearchOffset(PAGE_SIZE);
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
setSearchResults([]);
|
|
183
|
+
setSearchHasMore(false);
|
|
184
|
+
}
|
|
185
|
+
finally {
|
|
186
|
+
setIsSearching(false);
|
|
187
|
+
}
|
|
188
|
+
}, 180);
|
|
189
|
+
}, []);
|
|
190
|
+
const handleQueryChange = (value) => {
|
|
191
|
+
setQuery(value);
|
|
192
|
+
doSearch(value, activeTab);
|
|
193
|
+
};
|
|
194
|
+
const handleTabChange = (i) => {
|
|
195
|
+
setActiveTab(i);
|
|
196
|
+
if (queryRef.current.trim())
|
|
197
|
+
doSearch(queryRef.current, i);
|
|
198
|
+
};
|
|
199
|
+
const handleBackdrop = (e) => {
|
|
200
|
+
if (dialogRef.current && !dialogRef.current.contains(e.target))
|
|
201
|
+
onClose();
|
|
202
|
+
};
|
|
203
|
+
const isSearch = query.trim().length > 0;
|
|
204
|
+
const displayList = isSearch ? (searchResults ?? []) : tabSymbols;
|
|
205
|
+
// Use exchange:symbol format (strip market prefix from symbolKey) so the
|
|
206
|
+
// datafeed can pass it directly to the TV API, e.g. "BINANCE:BTCUSDT"
|
|
207
|
+
const toFeedSymbol = (entry) => {
|
|
208
|
+
if (!entry.symbolKey)
|
|
209
|
+
return entry.symbol;
|
|
210
|
+
const parts = entry.symbolKey.split(':');
|
|
211
|
+
// symbolKey is MARKET:EXCHANGE:SYMBOL → we want EXCHANGE:SYMBOL
|
|
212
|
+
return parts.length >= 3 ? parts.slice(1).join(':') : entry.symbolKey;
|
|
213
|
+
};
|
|
214
|
+
const pick = (entry) => { onSelect(toFeedSymbol(entry)); onClose(); };
|
|
215
|
+
const renderRow = (entry) => {
|
|
216
|
+
const iconColor = stringColor(entry.symbol);
|
|
217
|
+
const exchColor = stringColor(entry.exchange);
|
|
218
|
+
const letter = entry.symbol.charAt(0).toUpperCase();
|
|
219
|
+
const exchAbbr = entry.exchange.slice(0, 2).toUpperCase();
|
|
220
|
+
const badge = badgeLabel(entry.assetType, entry.market);
|
|
221
|
+
return (_jsxs("button", { className: `sym-row${entry.symbol === current ? ' active' : ''}`, onClick: () => pick(entry), children: [_jsx(SymbolIcon, { letter: letter, color: iconColor, ...(entry.logoUrl ? { logoUrl: entry.logoUrl } : {}) }), _jsxs("span", { className: "sym-row-info", children: [_jsx("span", { className: "sym-row-ticker", children: entry.symbol }), _jsx("span", { className: "sym-row-name", children: entry.name })] }), badge && _jsx("span", { className: "sym-row-badge", children: badge }), _jsx("span", { className: "sym-row-exchange", children: entry.exchange }), _jsx("span", { className: "sym-row-exch-icon", style: { background: exchColor }, children: exchAbbr })] }, entry.symbolKey ?? `${entry.exchange}:${entry.symbol}`));
|
|
222
|
+
};
|
|
223
|
+
const renderDirectRow = () => {
|
|
224
|
+
const q = query.trim();
|
|
225
|
+
if (!q)
|
|
226
|
+
return null;
|
|
227
|
+
return (_jsxs("button", { className: "sym-row", onClick: () => { onSelect(q.toUpperCase()); onClose(); }, style: { borderTop: '1px solid var(--sym-border, rgba(255,255,255,.08))', marginTop: 4 }, children: [_jsx("span", { className: "sym-row-icon", style: { background: '#444', fontSize: 11, fontWeight: 700 }, children: "\u2192" }), _jsxs("span", { className: "sym-row-info", children: [_jsx("span", { className: "sym-row-ticker", children: q.toUpperCase() }), _jsx("span", { className: "sym-row-name", children: "Use this symbol directly" })] })] }));
|
|
228
|
+
};
|
|
229
|
+
const renderBody = () => {
|
|
230
|
+
if (isSearch && isSearching)
|
|
231
|
+
return _jsx("div", { className: "sym-list", children: renderDirectRow() });
|
|
232
|
+
if (isSearch && searchResults !== null && searchResults.length === 0)
|
|
233
|
+
return _jsx("div", { className: "sym-list", children: renderDirectRow() });
|
|
234
|
+
if (!isSearch && tabLoading)
|
|
235
|
+
return _jsx("div", { className: "sym-empty", children: "Loading..." });
|
|
236
|
+
if (displayList.length === 0 && !isSearch && !tabLoading)
|
|
237
|
+
return _jsx("div", { className: "sym-empty", children: "No data \u2014 run a Symbol Sync from the Studio" });
|
|
238
|
+
const loadingMore = isSearch ? searchingMore : tabLoadingMore;
|
|
239
|
+
if (isSearch)
|
|
240
|
+
return (_jsxs("div", { className: "sym-list", children: [displayList.map(renderRow), renderDirectRow(), _jsx("div", { ref: sentinelRef, className: "sym-sentinel" }), loadingMore && _jsx("div", { className: "sym-loading-more", children: "Loading more\u2026" })] }));
|
|
241
|
+
return (_jsxs("div", { className: "sym-list", children: [displayList.map(renderRow), _jsx("div", { ref: sentinelRef, className: "sym-sentinel" }), loadingMore && _jsx("div", { className: "sym-loading-more", children: "Loading more\u2026" })] }));
|
|
242
|
+
};
|
|
243
|
+
return (_jsx("div", { className: "sym-backdrop", onMouseDown: handleBackdrop, children: _jsxs("div", { className: "sym-dialog", ref: dialogRef, role: "dialog", "aria-modal": "true", "aria-label": "Symbol Search", children: [_jsxs("div", { className: "sym-header", children: [_jsx("span", { className: "sym-header-title", children: "Symbol Search" }), _jsx("button", { className: "sym-header-close", onClick: onClose, "aria-label": "Close", children: _jsxs("svg", { viewBox: "0 0 14 14", width: "13", height: "13", stroke: "currentColor", strokeWidth: "2.2", strokeLinecap: "round", fill: "none", children: [_jsx("line", { x1: "2", y1: "2", x2: "12", y2: "12" }), _jsx("line", { x1: "12", y1: "2", x2: "2", y2: "12" })] }) })] }), _jsxs("div", { className: "sym-search-row", children: [_jsxs("svg", { className: "sym-search-icon", viewBox: "0 0 16 16", width: "15", height: "15", stroke: "currentColor", fill: "none", strokeWidth: "1.8", strokeLinecap: "round", children: [_jsx("circle", { cx: "6.5", cy: "6.5", r: "4.5" }), _jsx("line", { x1: "10.5", y1: "10.5", x2: "14", y2: "14" })] }), _jsx("input", { ref: inputRef, className: "sym-search-input", type: "text", value: query, onChange: (e) => handleQueryChange(e.target.value), placeholder: "Search symbols or names...", autoComplete: "off", spellCheck: false }), query && (_jsx("button", { className: "sym-search-clear", onClick: () => { setQuery(''); setSearchResults(null); }, "aria-label": "Clear", children: _jsxs("svg", { viewBox: "0 0 12 12", width: "11", height: "11", stroke: "currentColor", strokeWidth: "2.2", strokeLinecap: "round", fill: "none", children: [_jsx("line", { x1: "2", y1: "2", x2: "10", y2: "10" }), _jsx("line", { x1: "10", y1: "2", x2: "2", y2: "10" })] }) }))] }), _jsx("div", { className: "sym-tabs", children: TABS.map((tab, i) => (_jsx("button", { className: `sym-tab${i === activeTab ? ' active' : ''}`, onClick: () => handleTabChange(i), children: tab.label }, tab.label))) }), _jsx("div", { className: "sym-list-wrap", children: renderBody() }), _jsx("div", { className: "sym-footer", children: "Search using ISIN and CUSIP codes" })] }) }));
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=SymbolSearchDialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SymbolSearchDialog.js","sourceRoot":"","sources":["../../../src/react/workspace/SymbolSearchDialog.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type TabItem = {
|
|
2
|
+
id: string;
|
|
3
|
+
label: string;
|
|
4
|
+
/** Whether this tab has been saved to the DB (shows a saved indicator). */
|
|
5
|
+
isSaved?: boolean;
|
|
6
|
+
};
|
|
7
|
+
type Props = {
|
|
8
|
+
tabs: TabItem[];
|
|
9
|
+
activeId: string;
|
|
10
|
+
onSelect: (id: string) => void;
|
|
11
|
+
onAdd: () => void;
|
|
12
|
+
onClose: (id: string) => void;
|
|
13
|
+
onRename: (id: string, label: string) => void;
|
|
14
|
+
};
|
|
15
|
+
export declare function TabBar({ tabs, activeId, onSelect, onAdd, onClose, onRename }: Props): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=TabBar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabBar.d.ts","sourceRoot":"","sources":["../../../src/react/workspace/TabBar.tsx"],"names":[],"mappings":"AAEA,MAAM,MAAM,OAAO,GAAG;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,KAAK,KAAK,GAAG;IACX,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/C,CAAC;AAEF,wBAAgB,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,KAAK,2CAoEnF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useRef, useState } from 'react';
|
|
3
|
+
export function TabBar({ tabs, activeId, onSelect, onAdd, onClose, onRename }) {
|
|
4
|
+
const [editingId, setEditingId] = useState(null);
|
|
5
|
+
const [editValue, setEditValue] = useState('');
|
|
6
|
+
const inputRef = useRef(null);
|
|
7
|
+
function startEdit(tab, e) {
|
|
8
|
+
e.stopPropagation();
|
|
9
|
+
setEditingId(tab.id);
|
|
10
|
+
setEditValue(tab.label);
|
|
11
|
+
setTimeout(() => inputRef.current?.select(), 0);
|
|
12
|
+
}
|
|
13
|
+
function commitEdit() {
|
|
14
|
+
if (editingId && editValue.trim()) {
|
|
15
|
+
onRename(editingId, editValue.trim());
|
|
16
|
+
}
|
|
17
|
+
setEditingId(null);
|
|
18
|
+
}
|
|
19
|
+
return (_jsxs("div", { className: "tab-bar", children: [tabs.map((tab) => (_jsxs("div", { className: `tab-item${tab.id === activeId ? ' active' : ''}`, onClick: () => onSelect(tab.id), onDoubleClick: (e) => startEdit(tab, e), title: "Double-click to rename", children: [editingId === tab.id ? (_jsx("input", { ref: inputRef, className: "tab-rename-input", value: editValue, onChange: (e) => setEditValue(e.target.value), onBlur: commitEdit, onKeyDown: (e) => {
|
|
20
|
+
if (e.key === 'Enter')
|
|
21
|
+
commitEdit();
|
|
22
|
+
if (e.key === 'Escape')
|
|
23
|
+
setEditingId(null);
|
|
24
|
+
}, onClick: (e) => e.stopPropagation(), autoFocus: true })) : (_jsxs("span", { className: "tab-label", children: [tab.label, tab.isSaved && _jsx("span", { className: "tab-saved-dot", title: "Saved layout" })] })), tabs.length > 1 && (_jsx("button", { className: "tab-close", title: "Close tab", onClick: (e) => {
|
|
25
|
+
e.stopPropagation();
|
|
26
|
+
onClose(tab.id);
|
|
27
|
+
}, children: "\u00D7" }))] }, tab.id))), _jsx("button", { className: "tab-add", onClick: onAdd, title: "New chart tab", children: "+" })] }));
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=TabBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabBar.js","sourceRoot":"","sources":["../../../src/react/workspace/TabBar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type TimezoneOption = {
|
|
2
|
+
label: string;
|
|
3
|
+
value: string;
|
|
4
|
+
};
|
|
5
|
+
export declare const TIMEZONE_OPTIONS: TimezoneOption[];
|
|
6
|
+
export type TradingSession = 'regular' | 'extended';
|
|
7
|
+
export declare function symbolSupportsSession(symbol: string): boolean;
|
|
8
|
+
type Props = {
|
|
9
|
+
symbol: string;
|
|
10
|
+
timezone: string;
|
|
11
|
+
onTimezoneChange: (tz: string) => void;
|
|
12
|
+
session: TradingSession;
|
|
13
|
+
onSessionChange: (s: TradingSession) => void;
|
|
14
|
+
onToggleScriptDrawer: () => void;
|
|
15
|
+
scriptDrawerOpen: boolean;
|
|
16
|
+
};
|
|
17
|
+
export declare function BottomToolbar({ symbol, timezone, onTimezoneChange, session, onSessionChange, onToggleScriptDrawer, scriptDrawerOpen }: Props): import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=BottomToolbar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BottomToolbar.d.ts","sourceRoot":"","sources":["../../../../src/react/workspace/toolbars/BottomToolbar.tsx"],"names":[],"mappings":"AAIA,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,cAAc,EAqH5C,CAAC;AAoCF,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,UAAU,CAAC;AAwBpD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAG7D;AAED,KAAK,KAAK,GAAG;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,OAAO,EAAE,cAAc,CAAC;IACxB,eAAe,EAAE,CAAC,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC;IAC7C,oBAAoB,EAAE,MAAM,IAAI,CAAC;IACjC,gBAAgB,EAAE,OAAO,CAAC;CAC3B,CAAC;AAgCF,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,EAAE,KAAK,2CA4I5I"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef, useState } from 'react';
|
|
3
|
+
export const TIMEZONE_OPTIONS = [
|
|
4
|
+
{ label: 'UTC', value: 'UTC' },
|
|
5
|
+
{ label: 'Exchange', value: 'exchange' },
|
|
6
|
+
// Americas
|
|
7
|
+
{ label: '(UTC-10) Honolulu', value: 'Pacific/Honolulu' },
|
|
8
|
+
{ label: '(UTC-9) Anchorage', value: 'America/Anchorage' },
|
|
9
|
+
{ label: '(UTC-9) Juneau', value: 'America/Juneau' },
|
|
10
|
+
{ label: '(UTC-8) Los Angeles', value: 'America/Los_Angeles' },
|
|
11
|
+
{ label: '(UTC-8) Vancouver', value: 'America/Vancouver' },
|
|
12
|
+
{ label: '(UTC-7) Denver', value: 'America/Denver' },
|
|
13
|
+
{ label: '(UTC-7) Phoenix', value: 'America/Phoenix' },
|
|
14
|
+
{ label: '(UTC-6) Chicago', value: 'America/Chicago' },
|
|
15
|
+
{ label: '(UTC-6) Mexico City', value: 'America/Mexico_City' },
|
|
16
|
+
{ label: '(UTC-6) San Salvador', value: 'America/El_Salvador' },
|
|
17
|
+
{ label: '(UTC-5) Bogota', value: 'America/Bogota' },
|
|
18
|
+
{ label: '(UTC-5) Lima', value: 'America/Lima' },
|
|
19
|
+
{ label: '(UTC-5) New York', value: 'America/New_York' },
|
|
20
|
+
{ label: '(UTC-5) Toronto', value: 'America/Toronto' },
|
|
21
|
+
{ label: '(UTC-4) Caracas', value: 'America/Caracas' },
|
|
22
|
+
{ label: '(UTC-4) Halifax', value: 'America/Halifax' },
|
|
23
|
+
{ label: '(UTC-3) Buenos Aires', value: 'America/Argentina/Buenos_Aires' },
|
|
24
|
+
{ label: '(UTC-3) Santiago', value: 'America/Santiago' },
|
|
25
|
+
{ label: '(UTC-3) Sao Paulo', value: 'America/Sao_Paulo' },
|
|
26
|
+
{ label: '(UTC-2) Mid-Atlantic', value: 'Atlantic/South_Georgia' },
|
|
27
|
+
{ label: '(UTC-1) Azores', value: 'Atlantic/Azores' },
|
|
28
|
+
// Europe / Africa (UTC / UTC+0)
|
|
29
|
+
{ label: '(UTC) Casablanca', value: 'Africa/Casablanca' },
|
|
30
|
+
{ label: '(UTC) Dublin', value: 'Europe/Dublin' },
|
|
31
|
+
{ label: '(UTC) Lisbon', value: 'Europe/Lisbon' },
|
|
32
|
+
{ label: '(UTC) London', value: 'Europe/London' },
|
|
33
|
+
{ label: '(UTC) Reykjavik', value: 'Atlantic/Reykjavik' },
|
|
34
|
+
// UTC+1
|
|
35
|
+
{ label: '(UTC+1) Amsterdam', value: 'Europe/Amsterdam' },
|
|
36
|
+
{ label: '(UTC+1) Belgrade', value: 'Europe/Belgrade' },
|
|
37
|
+
{ label: '(UTC+1) Berlin', value: 'Europe/Berlin' },
|
|
38
|
+
{ label: '(UTC+1) Bratislava', value: 'Europe/Bratislava' },
|
|
39
|
+
{ label: '(UTC+1) Brussels', value: 'Europe/Brussels' },
|
|
40
|
+
{ label: '(UTC+1) Budapest', value: 'Europe/Budapest' },
|
|
41
|
+
{ label: '(UTC+1) Copenhagen', value: 'Europe/Copenhagen' },
|
|
42
|
+
{ label: '(UTC+1) Lagos', value: 'Africa/Lagos' },
|
|
43
|
+
{ label: '(UTC+1) Luxembourg', value: 'Europe/Luxembourg' },
|
|
44
|
+
{ label: '(UTC+1) Madrid', value: 'Europe/Madrid' },
|
|
45
|
+
{ label: '(UTC+1) Malta', value: 'Europe/Malta' },
|
|
46
|
+
{ label: '(UTC+1) Oslo', value: 'Europe/Oslo' },
|
|
47
|
+
{ label: '(UTC+1) Paris', value: 'Europe/Paris' },
|
|
48
|
+
{ label: '(UTC+1) Prague', value: 'Europe/Prague' },
|
|
49
|
+
{ label: '(UTC+1) Rome', value: 'Europe/Rome' },
|
|
50
|
+
{ label: '(UTC+1) Sarajevo', value: 'Europe/Sarajevo' },
|
|
51
|
+
{ label: '(UTC+1) Stockholm', value: 'Europe/Stockholm' },
|
|
52
|
+
{ label: '(UTC+1) Vienna', value: 'Europe/Vienna' },
|
|
53
|
+
{ label: '(UTC+1) Warsaw', value: 'Europe/Warsaw' },
|
|
54
|
+
{ label: '(UTC+1) Zurich', value: 'Europe/Zurich' },
|
|
55
|
+
// UTC+2
|
|
56
|
+
{ label: '(UTC+2) Athens', value: 'Europe/Athens' },
|
|
57
|
+
{ label: '(UTC+2) Bucharest', value: 'Europe/Bucharest' },
|
|
58
|
+
{ label: '(UTC+2) Cairo', value: 'Africa/Cairo' },
|
|
59
|
+
{ label: '(UTC+2) Helsinki', value: 'Europe/Helsinki' },
|
|
60
|
+
{ label: '(UTC+2) Istanbul', value: 'Europe/Istanbul' },
|
|
61
|
+
{ label: '(UTC+2) Jerusalem', value: 'Asia/Jerusalem' },
|
|
62
|
+
{ label: '(UTC+2) Johannesburg', value: 'Africa/Johannesburg' },
|
|
63
|
+
{ label: '(UTC+2) Kyiv', value: 'Europe/Kiev' },
|
|
64
|
+
{ label: '(UTC+2) Riga', value: 'Europe/Riga' },
|
|
65
|
+
{ label: '(UTC+2) Sofia', value: 'Europe/Sofia' },
|
|
66
|
+
{ label: '(UTC+2) Tallinn', value: 'Europe/Tallinn' },
|
|
67
|
+
{ label: '(UTC+2) Vilnius', value: 'Europe/Vilnius' },
|
|
68
|
+
// UTC+3
|
|
69
|
+
{ label: '(UTC+3) Baghdad', value: 'Asia/Baghdad' },
|
|
70
|
+
{ label: '(UTC+3) Kuwait', value: 'Asia/Kuwait' },
|
|
71
|
+
{ label: '(UTC+3) Moscow', value: 'Europe/Moscow' },
|
|
72
|
+
{ label: '(UTC+3) Nairobi', value: 'Africa/Nairobi' },
|
|
73
|
+
{ label: '(UTC+3) Qatar', value: 'Asia/Qatar' },
|
|
74
|
+
{ label: '(UTC+3) Riyadh', value: 'Asia/Riyadh' },
|
|
75
|
+
// UTC+3:30 / UTC+4
|
|
76
|
+
{ label: '(UTC+3:30) Tehran', value: 'Asia/Tehran' },
|
|
77
|
+
{ label: '(UTC+4) Abu Dhabi', value: 'Asia/Dubai' },
|
|
78
|
+
{ label: '(UTC+4) Baku', value: 'Asia/Baku' },
|
|
79
|
+
{ label: '(UTC+4) Dubai', value: 'Asia/Dubai' },
|
|
80
|
+
{ label: '(UTC+4) Muscat', value: 'Asia/Muscat' },
|
|
81
|
+
{ label: '(UTC+4) Tbilisi', value: 'Asia/Tbilisi' },
|
|
82
|
+
{ label: '(UTC+4:30) Kabul', value: 'Asia/Kabul' },
|
|
83
|
+
// UTC+5
|
|
84
|
+
{ label: '(UTC+5) Islamabad', value: 'Asia/Karachi' },
|
|
85
|
+
{ label: '(UTC+5) Karachi', value: 'Asia/Karachi' },
|
|
86
|
+
{ label: '(UTC+5) Tashkent', value: 'Asia/Tashkent' },
|
|
87
|
+
{ label: '(UTC+5:30) Chennai', value: 'Asia/Kolkata' },
|
|
88
|
+
{ label: '(UTC+5:30) Mumbai', value: 'Asia/Kolkata' },
|
|
89
|
+
{ label: '(UTC+5:30) New Delhi', value: 'Asia/Kolkata' },
|
|
90
|
+
{ label: '(UTC+5:45) Kathmandu', value: 'Asia/Kathmandu' },
|
|
91
|
+
// UTC+6
|
|
92
|
+
{ label: '(UTC+6) Almaty', value: 'Asia/Almaty' },
|
|
93
|
+
{ label: '(UTC+6) Dhaka', value: 'Asia/Dhaka' },
|
|
94
|
+
// UTC+7
|
|
95
|
+
{ label: '(UTC+7) Bangkok', value: 'Asia/Bangkok' },
|
|
96
|
+
{ label: '(UTC+7) Hanoi', value: 'Asia/Ho_Chi_Minh' },
|
|
97
|
+
{ label: '(UTC+7) Jakarta', value: 'Asia/Jakarta' },
|
|
98
|
+
// UTC+8
|
|
99
|
+
{ label: '(UTC+8) Beijing', value: 'Asia/Shanghai' },
|
|
100
|
+
{ label: '(UTC+8) Hong Kong', value: 'Asia/Hong_Kong' },
|
|
101
|
+
{ label: '(UTC+8) Kuala Lumpur', value: 'Asia/Kuala_Lumpur' },
|
|
102
|
+
{ label: '(UTC+8) Perth', value: 'Australia/Perth' },
|
|
103
|
+
{ label: '(UTC+8) Shanghai', value: 'Asia/Shanghai' },
|
|
104
|
+
{ label: '(UTC+8) Singapore', value: 'Asia/Singapore' },
|
|
105
|
+
{ label: '(UTC+8) Taipei', value: 'Asia/Taipei' },
|
|
106
|
+
// UTC+9
|
|
107
|
+
{ label: '(UTC+9) Osaka', value: 'Asia/Tokyo' },
|
|
108
|
+
{ label: '(UTC+9) Seoul', value: 'Asia/Seoul' },
|
|
109
|
+
{ label: '(UTC+9) Tokyo', value: 'Asia/Tokyo' },
|
|
110
|
+
{ label: '(UTC+9:30) Adelaide', value: 'Australia/Adelaide' },
|
|
111
|
+
{ label: '(UTC+9:30) Darwin', value: 'Australia/Darwin' },
|
|
112
|
+
// UTC+10
|
|
113
|
+
{ label: '(UTC+10) Brisbane', value: 'Australia/Brisbane' },
|
|
114
|
+
{ label: '(UTC+10) Canberra', value: 'Australia/Sydney' },
|
|
115
|
+
{ label: '(UTC+10) Melbourne', value: 'Australia/Melbourne' },
|
|
116
|
+
{ label: '(UTC+10) Sydney', value: 'Australia/Sydney' },
|
|
117
|
+
// UTC+12
|
|
118
|
+
{ label: '(UTC+12) Auckland', value: 'Pacific/Auckland' },
|
|
119
|
+
{ label: '(UTC+12) Fiji', value: 'Pacific/Fiji' },
|
|
120
|
+
];
|
|
121
|
+
// ─── DST-aware offset helpers ─────────────────────────────────────────────────
|
|
122
|
+
/**
|
|
123
|
+
* Returns the current UTC offset label for an IANA timezone, e.g. "(UTC-7)" or "(UTC+5:30)".
|
|
124
|
+
* Because it reads `new Date()` it is automatically DST-aware.
|
|
125
|
+
*/
|
|
126
|
+
function getUtcOffsetLabel(iana) {
|
|
127
|
+
try {
|
|
128
|
+
const parts = new Intl.DateTimeFormat('en', {
|
|
129
|
+
timeZone: iana,
|
|
130
|
+
timeZoneName: 'shortOffset',
|
|
131
|
+
}).formatToParts(new Date());
|
|
132
|
+
const tzName = parts.find((p) => p.type === 'timeZoneName')?.value ?? 'GMT';
|
|
133
|
+
const offset = tzName.replace(/^GMT/, '');
|
|
134
|
+
return offset ? `(UTC${offset})` : '(UTC)';
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return '(UTC)';
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Returns a DST-aware display string for a timezone option.
|
|
142
|
+
* For UTC / Exchange the label is returned unchanged.
|
|
143
|
+
* For all IANA entries the offset prefix is recomputed live.
|
|
144
|
+
*/
|
|
145
|
+
function getDisplayLabel(opt) {
|
|
146
|
+
if (opt.value === 'UTC' || opt.value === 'exchange')
|
|
147
|
+
return opt.label;
|
|
148
|
+
// Extract city name from static label like "(UTC-9) Anchorage" → "Anchorage"
|
|
149
|
+
const city = opt.label.replace(/^\(UTC[^)]*\)\s*/, '');
|
|
150
|
+
return `${getUtcOffsetLabel(opt.value)} ${city}`;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Returns true when the given symbol trades on a session-aware exchange
|
|
154
|
+
* (stocks, futures, forex) where RTH/ETH distinction makes sense.
|
|
155
|
+
* Crypto exchanges trade 24/7 and have no session concept.
|
|
156
|
+
*/
|
|
157
|
+
const CRYPTO_EXCHANGES = new Set([
|
|
158
|
+
'BINANCE', 'BINANCEUS', 'BINANCEUSDM', 'BINANCECOINM',
|
|
159
|
+
'COINBASE', 'COINBASEPRO',
|
|
160
|
+
'KRAKEN', 'KRAKENFX',
|
|
161
|
+
'BYBIT', 'BITGET',
|
|
162
|
+
'OKX', 'OKEX',
|
|
163
|
+
'HUOBI', 'HTX',
|
|
164
|
+
'KUCOIN',
|
|
165
|
+
'GEMINI',
|
|
166
|
+
'BITSTAMP',
|
|
167
|
+
'BITFINEX',
|
|
168
|
+
'MEXC',
|
|
169
|
+
'GATEIO', 'GATE',
|
|
170
|
+
'BITMEX',
|
|
171
|
+
'DERIBIT',
|
|
172
|
+
]);
|
|
173
|
+
export function symbolSupportsSession(symbol) {
|
|
174
|
+
const exchange = symbol.includes(':') ? symbol.split(':')[0].toUpperCase() : '';
|
|
175
|
+
return exchange !== '' && !CRYPTO_EXCHANGES.has(exchange);
|
|
176
|
+
}
|
|
177
|
+
function useClockTime(timezone) {
|
|
178
|
+
const [time, setTime] = useState(() => _formatClock(timezone));
|
|
179
|
+
useEffect(() => {
|
|
180
|
+
setTime(_formatClock(timezone));
|
|
181
|
+
const id = setInterval(() => setTime(_formatClock(timezone)), 1000);
|
|
182
|
+
return () => clearInterval(id);
|
|
183
|
+
}, [timezone]);
|
|
184
|
+
return time;
|
|
185
|
+
}
|
|
186
|
+
function _formatClock(timezone) {
|
|
187
|
+
const tz = timezone === 'exchange' ? 'UTC' : timezone;
|
|
188
|
+
try {
|
|
189
|
+
return new Intl.DateTimeFormat('en-GB', {
|
|
190
|
+
timeZone: tz,
|
|
191
|
+
hour: '2-digit',
|
|
192
|
+
minute: '2-digit',
|
|
193
|
+
second: '2-digit',
|
|
194
|
+
hour12: false,
|
|
195
|
+
}).format(new Date());
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
return new Intl.DateTimeFormat('en-GB', {
|
|
199
|
+
timeZone: 'UTC',
|
|
200
|
+
hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false,
|
|
201
|
+
}).format(new Date());
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
export function BottomToolbar({ symbol, timezone, onTimezoneChange, session, onSessionChange, onToggleScriptDrawer, scriptDrawerOpen }) {
|
|
205
|
+
const showSession = symbolSupportsSession(symbol);
|
|
206
|
+
const [open, setOpen] = useState(false);
|
|
207
|
+
const [sessionOpen, setSessionOpen] = useState(false);
|
|
208
|
+
const rootRef = useRef(null);
|
|
209
|
+
const sessionRef = useRef(null);
|
|
210
|
+
const clockTime = useClockTime(timezone);
|
|
211
|
+
const current = TIMEZONE_OPTIONS.find((o) => o.value === timezone) ?? TIMEZONE_OPTIONS[0];
|
|
212
|
+
// Close timezone dropdown on outside click
|
|
213
|
+
useEffect(() => {
|
|
214
|
+
if (!open)
|
|
215
|
+
return;
|
|
216
|
+
const handler = (e) => {
|
|
217
|
+
if (rootRef.current && !rootRef.current.contains(e.target))
|
|
218
|
+
setOpen(false);
|
|
219
|
+
};
|
|
220
|
+
document.addEventListener('mousedown', handler);
|
|
221
|
+
return () => document.removeEventListener('mousedown', handler);
|
|
222
|
+
}, [open]);
|
|
223
|
+
// Close session dropdown on outside click
|
|
224
|
+
useEffect(() => {
|
|
225
|
+
if (!sessionOpen)
|
|
226
|
+
return;
|
|
227
|
+
const handler = (e) => {
|
|
228
|
+
if (sessionRef.current && !sessionRef.current.contains(e.target))
|
|
229
|
+
setSessionOpen(false);
|
|
230
|
+
};
|
|
231
|
+
document.addEventListener('mousedown', handler);
|
|
232
|
+
return () => document.removeEventListener('mousedown', handler);
|
|
233
|
+
}, [sessionOpen]);
|
|
234
|
+
return (_jsxs("div", { className: "bottom-bar", children: [_jsx("div", { className: "bottom-bar-left", children: _jsxs("button", { className: `bottom-bar-btn${scriptDrawerOpen ? ' active' : ''}`, onClick: onToggleScriptDrawer, title: "Script Engine", children: [_jsxs("svg", { viewBox: "0 0 16 16", width: "11", height: "11", fill: "none", stroke: "currentColor", strokeWidth: "1.6", strokeLinecap: "round", children: [_jsx("polyline", { points: "4,6 2,8 4,10" }), _jsx("polyline", { points: "12,6 14,8 12,10" }), _jsx("line", { x1: "9", y1: "3", x2: "7", y2: "13" })] }), "Script"] }) }), _jsxs("div", { className: "bottom-bar-right", children: [_jsxs("div", { ref: rootRef, style: { position: 'relative', display: 'flex', alignItems: 'center' }, children: [_jsxs("button", { className: `bottom-bar-btn${open ? ' active' : ''}`, onClick: () => setOpen((o) => !o), title: "Chart timezone", children: [_jsxs("svg", { viewBox: "0 0 14 14", width: "11", height: "11", fill: "none", stroke: "currentColor", strokeWidth: "1.2", children: [_jsx("circle", { cx: "7", cy: "7", r: "5.5" }), _jsx("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" }), _jsx("line", { x1: "1.5", y1: "7", x2: "12.5", y2: "7" }), _jsx("line", { x1: "2", y1: "4.5", x2: "12", y2: "4.5" }), _jsx("line", { x1: "2", y1: "9.5", x2: "12", y2: "9.5" })] }), getDisplayLabel(current)] }), _jsx("span", { className: "bottom-bar-clock", title: `Current time in ${getDisplayLabel(current)}`, children: clockTime }), open && (_jsxs("div", { className: "bottom-bar-dropdown bottom-bar-dropdown--right", children: [_jsx("div", { className: "bottom-bar-dropdown-section", children: "Timezone" }), TIMEZONE_OPTIONS.map((opt) => (_jsxs("button", { className: `bottom-bar-dropdown-item${opt.value === timezone ? ' current' : ''}`, onClick: () => { onTimezoneChange(opt.value); setOpen(false); }, children: [opt.value === timezone && (_jsx("span", { className: "bottom-bar-check", children: "\u00E2\u0153\u201C" })), getDisplayLabel(opt)] }, opt.value + opt.label)))] }))] }), showSession && _jsxs("div", { ref: sessionRef, style: { position: 'relative', display: 'flex', alignItems: 'center' }, children: [_jsxs("button", { className: `bottom-bar-btn${sessionOpen ? ' active' : ''}`, onClick: () => setSessionOpen((o) => !o), title: "Trading session", children: [_jsxs("svg", { viewBox: "0 0 14 14", width: "11", height: "11", fill: "none", stroke: "currentColor", strokeWidth: "1.2", children: [_jsx("rect", { x: "1.5", y: "2.5", width: "11", height: "9", rx: "1" }), _jsx("line", { x1: "1.5", y1: "5.5", x2: "12.5", y2: "5.5" }), _jsx("line", { x1: "4.5", y1: "2.5", x2: "4.5", y2: "1" }), _jsx("line", { x1: "9.5", y1: "2.5", x2: "9.5", y2: "1" })] }), session === 'extended' ? 'Extended hours' : 'Regular hours'] }), sessionOpen && (_jsxs("div", { className: "bottom-bar-dropdown bottom-bar-dropdown--right", children: [_jsx("div", { className: "bottom-bar-dropdown-section", children: "Sessions" }), _jsxs("button", { className: `bottom-bar-dropdown-item${session === 'regular' ? ' current' : ''}`, onClick: () => { onSessionChange('regular'); setSessionOpen(false); }, children: [session === 'regular' && _jsx("span", { className: "bottom-bar-check", children: "\u00E2\u0153\u201C" }), _jsxs("span", { className: "bottom-bar-session-label", children: [_jsx("strong", { children: "Regular trading hours" }), _jsx("span", { children: "Exchange session only (RTH) \u00E2\u20AC\u201D cleaner signals, higher liquidity" })] })] }), _jsxs("button", { className: `bottom-bar-dropdown-item${session === 'extended' ? ' current' : ''}`, onClick: () => { onSessionChange('extended'); setSessionOpen(false); }, children: [session === 'extended' && _jsx("span", { className: "bottom-bar-check", children: "\u00E2\u0153\u201C" }), _jsxs("span", { className: "bottom-bar-session-label", children: [_jsx("strong", { children: "Extended / electronic hours" }), _jsx("span", { children: "Includes pre-market & after-hours (ETH) \u00E2\u20AC\u201D full price range" })] })] })] }))] })] })] }));
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=BottomToolbar.js.map
|