@363045841yyt/klinechart-core 0.8.11-alpha.0 → 0.8.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/alerts/createAlertController.d.ts +30 -0
- package/dist/alerts/createAlertController.d.ts.map +1 -0
- package/dist/alerts/createAlertController.js +261 -0
- package/dist/alerts/createAlertController.js.map +1 -0
- package/dist/alerts/index.d.ts +5 -0
- package/dist/alerts/index.d.ts.map +1 -0
- package/dist/alerts/index.js +4 -0
- package/dist/alerts/index.js.map +1 -0
- package/dist/alerts/predicates.d.ts +28 -0
- package/dist/alerts/predicates.d.ts.map +1 -0
- package/dist/alerts/predicates.js +211 -0
- package/dist/alerts/predicates.js.map +1 -0
- package/dist/alerts/rollingVolume.d.ts +15 -0
- package/dist/alerts/rollingVolume.d.ts.map +1 -0
- package/dist/alerts/rollingVolume.js +42 -0
- package/dist/alerts/rollingVolume.js.map +1 -0
- package/dist/alerts/ruleSchema.d.ts +42 -0
- package/dist/alerts/ruleSchema.d.ts.map +1 -0
- package/dist/alerts/ruleSchema.js +240 -0
- package/dist/alerts/ruleSchema.js.map +1 -0
- package/dist/alerts/types.d.ts +169 -0
- package/dist/alerts/types.d.ts.map +1 -0
- package/dist/alerts/types.js +24 -0
- package/dist/alerts/types.js.map +1 -0
- package/dist/chartTypes/heikinAshi.d.ts +49 -0
- package/dist/chartTypes/heikinAshi.d.ts.map +1 -0
- package/dist/chartTypes/heikinAshi.js +94 -0
- package/dist/chartTypes/heikinAshi.js.map +1 -0
- package/dist/chartTypes/index.d.ts +6 -0
- package/dist/chartTypes/index.d.ts.map +1 -0
- package/dist/chartTypes/index.js +5 -0
- package/dist/chartTypes/index.js.map +1 -0
- package/dist/chartTypes/pointAndFigure.d.ts +83 -0
- package/dist/chartTypes/pointAndFigure.d.ts.map +1 -0
- package/dist/chartTypes/pointAndFigure.js +159 -0
- package/dist/chartTypes/pointAndFigure.js.map +1 -0
- package/dist/chartTypes/rangeBars.d.ts +61 -0
- package/dist/chartTypes/rangeBars.d.ts.map +1 -0
- package/dist/chartTypes/rangeBars.js +181 -0
- package/dist/chartTypes/rangeBars.js.map +1 -0
- package/dist/chartTypes/renko.d.ts +94 -0
- package/dist/chartTypes/renko.d.ts.map +1 -0
- package/dist/chartTypes/renko.js +207 -0
- package/dist/chartTypes/renko.js.map +1 -0
- package/dist/chartTypes/types.d.ts +97 -0
- package/dist/chartTypes/types.d.ts.map +1 -0
- package/dist/chartTypes/types.js +39 -0
- package/dist/chartTypes/types.js.map +1 -0
- package/dist/components/anchoredVwap/computeAnchoredVwap.d.ts +76 -0
- package/dist/components/anchoredVwap/computeAnchoredVwap.d.ts.map +1 -0
- package/dist/components/anchoredVwap/computeAnchoredVwap.js +155 -0
- package/dist/components/anchoredVwap/computeAnchoredVwap.js.map +1 -0
- package/dist/components/anchoredVwap/createAnchoredVwapController.d.ts +28 -0
- package/dist/components/anchoredVwap/createAnchoredVwapController.d.ts.map +1 -0
- package/dist/components/anchoredVwap/createAnchoredVwapController.js +282 -0
- package/dist/components/anchoredVwap/createAnchoredVwapController.js.map +1 -0
- package/dist/components/anchoredVwap/index.d.ts +11 -0
- package/dist/components/anchoredVwap/index.d.ts.map +1 -0
- package/dist/components/anchoredVwap/index.js +10 -0
- package/dist/components/anchoredVwap/index.js.map +1 -0
- package/dist/components/anchoredVwap/types.d.ts +171 -0
- package/dist/components/anchoredVwap/types.d.ts.map +1 -0
- package/dist/components/anchoredVwap/types.js +25 -0
- package/dist/components/anchoredVwap/types.js.map +1 -0
- package/dist/components/crosshairSync/createCrosshairSync.d.ts +94 -0
- package/dist/components/crosshairSync/createCrosshairSync.d.ts.map +1 -0
- package/dist/components/crosshairSync/createCrosshairSync.js +118 -0
- package/dist/components/crosshairSync/createCrosshairSync.js.map +1 -0
- package/dist/components/crosshairSync/index.d.ts +2 -0
- package/dist/components/crosshairSync/index.d.ts.map +1 -0
- package/dist/components/crosshairSync/index.js +2 -0
- package/dist/components/crosshairSync/index.js.map +1 -0
- package/dist/components/footprint/aggressor.d.ts +89 -0
- package/dist/components/footprint/aggressor.d.ts.map +1 -0
- package/dist/components/footprint/aggressor.js +106 -0
- package/dist/components/footprint/aggressor.js.map +1 -0
- package/dist/components/footprint/createFootprintController.d.ts +29 -0
- package/dist/components/footprint/createFootprintController.d.ts.map +1 -0
- package/dist/components/footprint/createFootprintController.js +264 -0
- package/dist/components/footprint/createFootprintController.js.map +1 -0
- package/dist/components/footprint/index.d.ts +7 -0
- package/dist/components/footprint/index.d.ts.map +1 -0
- package/dist/components/footprint/index.js +4 -0
- package/dist/components/footprint/index.js.map +1 -0
- package/dist/components/footprint/perBarStats.d.ts +63 -0
- package/dist/components/footprint/perBarStats.d.ts.map +1 -0
- package/dist/components/footprint/perBarStats.js +123 -0
- package/dist/components/footprint/perBarStats.js.map +1 -0
- package/dist/components/footprint/types.d.ts +197 -0
- package/dist/components/footprint/types.d.ts.map +1 -0
- package/dist/components/footprint/types.js +23 -0
- package/dist/components/footprint/types.js.map +1 -0
- package/dist/components/mtfOverlay/alignToBaseIndex.d.ts +45 -0
- package/dist/components/mtfOverlay/alignToBaseIndex.d.ts.map +1 -0
- package/dist/components/mtfOverlay/alignToBaseIndex.js +92 -0
- package/dist/components/mtfOverlay/alignToBaseIndex.js.map +1 -0
- package/dist/components/mtfOverlay/createMtfController.d.ts +7 -0
- package/dist/components/mtfOverlay/createMtfController.d.ts.map +1 -0
- package/dist/components/mtfOverlay/createMtfController.js +134 -0
- package/dist/components/mtfOverlay/createMtfController.js.map +1 -0
- package/dist/components/mtfOverlay/index.d.ts +19 -0
- package/dist/components/mtfOverlay/index.d.ts.map +1 -0
- package/dist/components/mtfOverlay/index.js +18 -0
- package/dist/components/mtfOverlay/index.js.map +1 -0
- package/dist/components/mtfOverlay/resampleBars.d.ts +37 -0
- package/dist/components/mtfOverlay/resampleBars.d.ts.map +1 -0
- package/dist/components/mtfOverlay/resampleBars.js +93 -0
- package/dist/components/mtfOverlay/resampleBars.js.map +1 -0
- package/dist/components/mtfOverlay/types.d.ts +132 -0
- package/dist/components/mtfOverlay/types.d.ts.map +1 -0
- package/dist/components/mtfOverlay/types.js +22 -0
- package/dist/components/mtfOverlay/types.js.map +1 -0
- package/dist/components/orderBookHeatmap/createHeatmapController.d.ts +21 -0
- package/dist/components/orderBookHeatmap/createHeatmapController.d.ts.map +1 -0
- package/dist/components/orderBookHeatmap/createHeatmapController.js +234 -0
- package/dist/components/orderBookHeatmap/createHeatmapController.js.map +1 -0
- package/dist/components/orderBookHeatmap/createOrderBookState.d.ts +18 -0
- package/dist/components/orderBookHeatmap/createOrderBookState.d.ts.map +1 -0
- package/dist/components/orderBookHeatmap/createOrderBookState.js +102 -0
- package/dist/components/orderBookHeatmap/createOrderBookState.js.map +1 -0
- package/dist/components/orderBookHeatmap/deltaArchive.d.ts +25 -0
- package/dist/components/orderBookHeatmap/deltaArchive.d.ts.map +1 -0
- package/dist/components/orderBookHeatmap/deltaArchive.js +106 -0
- package/dist/components/orderBookHeatmap/deltaArchive.js.map +1 -0
- package/dist/components/orderBookHeatmap/index.d.ts +13 -0
- package/dist/components/orderBookHeatmap/index.d.ts.map +1 -0
- package/dist/components/orderBookHeatmap/index.js +12 -0
- package/dist/components/orderBookHeatmap/index.js.map +1 -0
- package/dist/components/orderBookHeatmap/logColorScale.d.ts +20 -0
- package/dist/components/orderBookHeatmap/logColorScale.d.ts.map +1 -0
- package/dist/components/orderBookHeatmap/logColorScale.js +71 -0
- package/dist/components/orderBookHeatmap/logColorScale.js.map +1 -0
- package/dist/components/orderBookHeatmap/snapshotRing.d.ts +16 -0
- package/dist/components/orderBookHeatmap/snapshotRing.d.ts.map +1 -0
- package/dist/components/orderBookHeatmap/snapshotRing.js +61 -0
- package/dist/components/orderBookHeatmap/snapshotRing.js.map +1 -0
- package/dist/components/orderBookHeatmap/types.d.ts +128 -0
- package/dist/components/orderBookHeatmap/types.d.ts.map +1 -0
- package/dist/components/orderBookHeatmap/types.js +16 -0
- package/dist/components/orderBookHeatmap/types.js.map +1 -0
- package/dist/components/volumeProfile/binning.d.ts +54 -0
- package/dist/components/volumeProfile/binning.d.ts.map +1 -0
- package/dist/components/volumeProfile/binning.js +123 -0
- package/dist/components/volumeProfile/binning.js.map +1 -0
- package/dist/components/volumeProfile/createVolumeProfileController.d.ts +31 -0
- package/dist/components/volumeProfile/createVolumeProfileController.d.ts.map +1 -0
- package/dist/components/volumeProfile/createVolumeProfileController.js +179 -0
- package/dist/components/volumeProfile/createVolumeProfileController.js.map +1 -0
- package/dist/components/volumeProfile/index.d.ts +6 -0
- package/dist/components/volumeProfile/index.d.ts.map +1 -0
- package/dist/components/volumeProfile/index.js +5 -0
- package/dist/components/volumeProfile/index.js.map +1 -0
- package/dist/components/volumeProfile/poc.d.ts +35 -0
- package/dist/components/volumeProfile/poc.d.ts.map +1 -0
- package/dist/components/volumeProfile/poc.js +51 -0
- package/dist/components/volumeProfile/poc.js.map +1 -0
- package/dist/components/volumeProfile/types.d.ts +138 -0
- package/dist/components/volumeProfile/types.d.ts.map +1 -0
- package/dist/components/volumeProfile/types.js +19 -0
- package/dist/components/volumeProfile/types.js.map +1 -0
- package/dist/components/volumeProfile/valueArea.d.ts +58 -0
- package/dist/components/volumeProfile/valueArea.d.ts.map +1 -0
- package/dist/components/volumeProfile/valueArea.js +172 -0
- package/dist/components/volumeProfile/valueArea.js.map +1 -0
- package/dist/controllers/createChartController.d.ts.map +1 -1
- package/dist/controllers/createChartController.js +22 -11
- package/dist/controllers/createChartController.js.map +1 -1
- package/dist/controllers/types.d.ts +3 -1
- package/dist/controllers/types.d.ts.map +1 -1
- package/dist/data-fetchers/baostock.d.ts.map +1 -1
- package/dist/data-fetchers/baostock.js +2 -1
- package/dist/data-fetchers/baostock.js.map +1 -1
- package/dist/data-fetchers/dataBuffer.effects.d.ts.map +1 -1
- package/dist/data-fetchers/dataBuffer.effects.js +2 -1
- package/dist/data-fetchers/dataBuffer.effects.js.map +1 -1
- package/dist/data-fetchers/fetcherDefinitionRegistry.d.ts.map +1 -1
- package/dist/data-fetchers/fetcherDefinitionRegistry.js +2 -1
- package/dist/data-fetchers/fetcherDefinitionRegistry.js.map +1 -1
- package/dist/data-fetchers/gotdx.js +4 -3
- package/dist/data-fetchers/gotdx.js.map +1 -1
- package/dist/data-fetchers/router.d.ts.map +1 -1
- package/dist/data-fetchers/router.js +4 -3
- package/dist/data-fetchers/router.js.map +1 -1
- package/dist/data-fetchers/tradingview.js +3 -2
- package/dist/data-fetchers/tradingview.js.map +1 -1
- package/dist/engine/chart.d.ts +13 -0
- package/dist/engine/chart.d.ts.map +1 -1
- package/dist/engine/chart.js +109 -0
- package/dist/engine/chart.js.map +1 -1
- package/dist/engine/data/chartDataManager.d.ts +1 -0
- package/dist/engine/data/chartDataManager.d.ts.map +1 -1
- package/dist/engine/data/chartDataManager.js +27 -4
- package/dist/engine/data/chartDataManager.js.map +1 -1
- package/dist/engine/drawing/toolConfig.d.ts.map +1 -1
- package/dist/engine/drawing/toolConfig.js +2 -1
- package/dist/engine/drawing/toolConfig.js.map +1 -1
- package/dist/engine/indicators/chartIndicatorManager.d.ts.map +1 -1
- package/dist/engine/indicators/chartIndicatorManager.js +2 -1
- package/dist/engine/indicators/chartIndicatorManager.js.map +1 -1
- package/dist/engine/indicators/indicatorDefinitionRegistry.d.ts.map +1 -1
- package/dist/engine/indicators/indicatorDefinitionRegistry.js +2 -1
- package/dist/engine/indicators/indicatorDefinitionRegistry.js.map +1 -1
- package/dist/engine/indicators/indicatorMetadata.d.ts.map +1 -1
- package/dist/engine/indicators/indicatorMetadata.js +2 -1
- package/dist/engine/indicators/indicatorMetadata.js.map +1 -1
- package/dist/engine/indicators/indicatorRegistry.d.ts.map +1 -1
- package/dist/engine/indicators/indicatorRegistry.js +6 -5
- package/dist/engine/indicators/indicatorRegistry.js.map +1 -1
- package/dist/engine/indicators/registerBuiltins.d.ts.map +1 -1
- package/dist/engine/indicators/registerBuiltins.js +2 -1
- package/dist/engine/indicators/registerBuiltins.js.map +1 -1
- package/dist/engine/indicators/scheduler.d.ts +6 -0
- package/dist/engine/indicators/scheduler.d.ts.map +1 -1
- package/dist/engine/indicators/scheduler.js +12 -0
- package/dist/engine/indicators/scheduler.js.map +1 -1
- package/dist/engine/indicators/soa.d.ts.map +1 -1
- package/dist/engine/indicators/soa.js +2 -1
- package/dist/engine/indicators/soa.js.map +1 -1
- package/dist/engine/indicators/stateComposer.d.ts.map +1 -1
- package/dist/engine/indicators/stateComposer.js +2 -1
- package/dist/engine/indicators/stateComposer.js.map +1 -1
- package/dist/engine/subPaneManager.d.ts.map +1 -1
- package/dist/engine/subPaneManager.js +2 -1
- package/dist/engine/subPaneManager.js.map +1 -1
- package/dist/engine/utils/chartZoomController.d.ts +2 -0
- package/dist/engine/utils/chartZoomController.d.ts.map +1 -1
- package/dist/engine/utils/chartZoomController.js +5 -1
- package/dist/engine/utils/chartZoomController.js.map +1 -1
- package/dist/errors-help.d.ts +72 -0
- package/dist/errors-help.d.ts.map +1 -0
- package/dist/errors-help.js +149 -0
- package/dist/errors-help.js.map +1 -0
- package/dist/errors.d.ts +64 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +61 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -1
- package/dist/indicators/alma.d.ts +27 -0
- package/dist/indicators/alma.d.ts.map +1 -0
- package/dist/indicators/alma.js +36 -0
- package/dist/indicators/alma.js.map +1 -0
- package/dist/indicators/awesomeOscillator.d.ts +19 -0
- package/dist/indicators/awesomeOscillator.d.ts.map +1 -0
- package/dist/indicators/awesomeOscillator.js +36 -0
- package/dist/indicators/awesomeOscillator.js.map +1 -0
- package/dist/indicators/dpo.d.ts +17 -0
- package/dist/indicators/dpo.d.ts.map +1 -0
- package/dist/indicators/dpo.js +24 -0
- package/dist/indicators/dpo.js.map +1 -0
- package/dist/indicators/fisherTransform.d.ts +26 -0
- package/dist/indicators/fisherTransform.d.ts.map +1 -0
- package/dist/indicators/fisherTransform.js +44 -0
- package/dist/indicators/fisherTransform.js.map +1 -0
- package/dist/indicators/frama.d.ts +25 -0
- package/dist/indicators/frama.d.ts.map +1 -0
- package/dist/indicators/frama.js +61 -0
- package/dist/indicators/frama.js.map +1 -0
- package/dist/indicators/index.d.ts +24 -0
- package/dist/indicators/index.d.ts.map +1 -0
- package/dist/indicators/index.js +26 -0
- package/dist/indicators/index.js.map +1 -0
- package/dist/indicators/lsma.d.ts +21 -0
- package/dist/indicators/lsma.d.ts.map +1 -0
- package/dist/indicators/lsma.js +37 -0
- package/dist/indicators/lsma.js.map +1 -0
- package/dist/indicators/schaffTrendCycle.d.ts +24 -0
- package/dist/indicators/schaffTrendCycle.d.ts.map +1 -0
- package/dist/indicators/schaffTrendCycle.js +70 -0
- package/dist/indicators/schaffTrendCycle.js.map +1 -0
- package/dist/indicators/stochRSI.d.ts +24 -0
- package/dist/indicators/stochRSI.d.ts.map +1 -0
- package/dist/indicators/stochRSI.js +86 -0
- package/dist/indicators/stochRSI.js.map +1 -0
- package/dist/indicators/t3.d.ts +31 -0
- package/dist/indicators/t3.d.ts.map +1 -0
- package/dist/indicators/t3.js +63 -0
- package/dist/indicators/t3.js.map +1 -0
- package/dist/indicators/ultimateOscillator.d.ts +26 -0
- package/dist/indicators/ultimateOscillator.d.ts.map +1 -0
- package/dist/indicators/ultimateOscillator.js +59 -0
- package/dist/indicators/ultimateOscillator.js.map +1 -0
- package/dist/indicators/vidya.d.ts +24 -0
- package/dist/indicators/vidya.d.ts.map +1 -0
- package/dist/indicators/vidya.js +54 -0
- package/dist/indicators/vidya.js.map +1 -0
- package/dist/indicators/zlema.d.ts +16 -0
- package/dist/indicators/zlema.d.ts.map +1 -0
- package/dist/indicators/zlema.js +26 -0
- package/dist/indicators/zlema.js.map +1 -0
- package/dist/input/gesture.d.ts +125 -0
- package/dist/input/gesture.d.ts.map +1 -0
- package/dist/input/gesture.js +249 -0
- package/dist/input/gesture.js.map +1 -0
- package/dist/input/index.d.ts +9 -0
- package/dist/input/index.d.ts.map +1 -0
- package/dist/input/index.js +9 -0
- package/dist/input/index.js.map +1 -0
- package/dist/input/keyboard.d.ts +140 -0
- package/dist/input/keyboard.d.ts.map +1 -0
- package/dist/input/keyboard.js +260 -0
- package/dist/input/keyboard.js.map +1 -0
- package/dist/mcp/chartBridge.d.ts +2 -2
- package/dist/mcp/chartBridge.d.ts.map +1 -1
- package/dist/mcp/chartBridge.js +27 -21
- package/dist/mcp/chartBridge.js.map +1 -1
- package/dist/plugin/PluginHost.d.ts +0 -3
- package/dist/plugin/PluginHost.d.ts.map +1 -1
- package/dist/plugin/PluginHost.js +7 -3
- package/dist/plugin/PluginHost.js.map +1 -1
- package/dist/plugin/PluginRegistry.d.ts +0 -3
- package/dist/plugin/PluginRegistry.d.ts.map +1 -1
- package/dist/plugin/PluginRegistry.js +5 -1
- package/dist/plugin/PluginRegistry.js.map +1 -1
- package/dist/render/Renderer.d.ts +116 -0
- package/dist/render/Renderer.d.ts.map +1 -0
- package/dist/render/Renderer.js +31 -0
- package/dist/render/Renderer.js.map +1 -0
- package/dist/render/SurfaceBackend.d.ts +83 -0
- package/dist/render/SurfaceBackend.d.ts.map +1 -0
- package/dist/render/SurfaceBackend.js +27 -0
- package/dist/render/SurfaceBackend.js.map +1 -0
- package/dist/render/index.d.ts +12 -0
- package/dist/render/index.d.ts.map +1 -0
- package/dist/render/index.js +11 -0
- package/dist/render/index.js.map +1 -0
- package/dist/renderer-tier/detectRendererTier.d.ts +57 -0
- package/dist/renderer-tier/detectRendererTier.d.ts.map +1 -0
- package/dist/renderer-tier/detectRendererTier.js +143 -0
- package/dist/renderer-tier/detectRendererTier.js.map +1 -0
- package/dist/renderer-tier/index.d.ts +12 -0
- package/dist/renderer-tier/index.d.ts.map +1 -0
- package/dist/renderer-tier/index.js +12 -0
- package/dist/renderer-tier/index.js.map +1 -0
- package/dist/renderer-tier/selectBackend.d.ts +106 -0
- package/dist/renderer-tier/selectBackend.d.ts.map +1 -0
- package/dist/renderer-tier/selectBackend.js +113 -0
- package/dist/renderer-tier/selectBackend.js.map +1 -0
- package/dist/renderer-tier/types.d.ts +50 -0
- package/dist/renderer-tier/types.d.ts.map +1 -0
- package/dist/renderer-tier/types.js +24 -0
- package/dist/renderer-tier/types.js.map +1 -0
- package/dist/replay/createReplayController.d.ts +3 -0
- package/dist/replay/createReplayController.d.ts.map +1 -0
- package/dist/replay/createReplayController.js +251 -0
- package/dist/replay/createReplayController.js.map +1 -0
- package/dist/replay/index.d.ts +5 -0
- package/dist/replay/index.d.ts.map +1 -0
- package/dist/replay/index.js +3 -0
- package/dist/replay/index.js.map +1 -0
- package/dist/replay/timeline.d.ts +50 -0
- package/dist/replay/timeline.d.ts.map +1 -0
- package/dist/replay/timeline.js +104 -0
- package/dist/replay/timeline.js.map +1 -0
- package/dist/replay/types.d.ts +94 -0
- package/dist/replay/types.d.ts.map +1 -0
- package/dist/replay/types.js +21 -0
- package/dist/replay/types.js.map +1 -0
- package/dist/scale/anchoredZoom.d.ts +64 -0
- package/dist/scale/anchoredZoom.d.ts.map +1 -0
- package/dist/scale/anchoredZoom.js +67 -0
- package/dist/scale/anchoredZoom.js.map +1 -0
- package/dist/scale/createPriceScale.d.ts +49 -0
- package/dist/scale/createPriceScale.d.ts.map +1 -0
- package/dist/scale/createPriceScale.js +175 -0
- package/dist/scale/createPriceScale.js.map +1 -0
- package/dist/scale/createTimeScale.d.ts +27 -0
- package/dist/scale/createTimeScale.d.ts.map +1 -0
- package/dist/scale/createTimeScale.js +139 -0
- package/dist/scale/createTimeScale.js.map +1 -0
- package/dist/scale/index.d.ts +6 -0
- package/dist/scale/index.d.ts.map +1 -0
- package/dist/scale/index.js +5 -0
- package/dist/scale/index.js.map +1 -0
- package/dist/scale/originShift.d.ts +69 -0
- package/dist/scale/originShift.d.ts.map +1 -0
- package/dist/scale/originShift.js +41 -0
- package/dist/scale/originShift.js.map +1 -0
- package/dist/scale/types.d.ts +90 -0
- package/dist/scale/types.d.ts.map +1 -0
- package/dist/scale/types.js +17 -0
- package/dist/scale/types.js.map +1 -0
- package/dist/scene/createScene.d.ts +22 -0
- package/dist/scene/createScene.d.ts.map +1 -0
- package/dist/scene/createScene.js +114 -0
- package/dist/scene/createScene.js.map +1 -0
- package/dist/scene/index.d.ts +13 -0
- package/dist/scene/index.d.ts.map +1 -0
- package/dist/scene/index.js +11 -0
- package/dist/scene/index.js.map +1 -0
- package/dist/scene/layerRegistry.d.ts +83 -0
- package/dist/scene/layerRegistry.d.ts.map +1 -0
- package/dist/scene/layerRegistry.js +43 -0
- package/dist/scene/layerRegistry.js.map +1 -0
- package/dist/scene/types.d.ts +128 -0
- package/dist/scene/types.d.ts.map +1 -0
- package/dist/scene/types.js +21 -0
- package/dist/scene/types.js.map +1 -0
- package/dist/scheduler/createFrameBudget.d.ts +91 -0
- package/dist/scheduler/createFrameBudget.d.ts.map +1 -0
- package/dist/scheduler/createFrameBudget.js +232 -0
- package/dist/scheduler/createFrameBudget.js.map +1 -0
- package/dist/scheduler/index.d.ts +2 -0
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +2 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/tokens/themeToCssVars.d.ts.map +1 -1
- package/dist/tokens/themeToCssVars.js +2 -28
- package/dist/tokens/themeToCssVars.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +1 -1
- package/src/__bench__/indicators.bench.ts +215 -0
- package/src/__bench__/orderBookHeatmap.bench.ts +68 -0
- package/src/__bench__/scale.bench.ts +80 -0
- package/src/__bench__/signal.bench.ts +41 -0
- package/src/__bench__/volumeProfile.bench.ts +66 -0
- package/src/__tests__/errors-help.test.ts +184 -0
- package/src/__tests__/errors.test.ts +187 -0
- package/src/alerts/__tests__/controller.test.ts +231 -0
- package/src/alerts/__tests__/predicates.test.ts +374 -0
- package/src/alerts/__tests__/ruleSchema.test.ts +180 -0
- package/src/alerts/createAlertController.ts +312 -0
- package/src/alerts/index.ts +18 -0
- package/src/alerts/predicates.ts +231 -0
- package/src/alerts/rollingVolume.ts +51 -0
- package/src/alerts/ruleSchema.ts +278 -0
- package/src/alerts/types.ts +177 -0
- package/src/chartTypes/__tests__/heikinAshi.test.ts +122 -0
- package/src/chartTypes/__tests__/pointAndFigure.test.ts +167 -0
- package/src/chartTypes/__tests__/rangeBars.test.ts +146 -0
- package/src/chartTypes/__tests__/renko.test.ts +160 -0
- package/src/chartTypes/heikinAshi.ts +116 -0
- package/src/chartTypes/index.ts +5 -0
- package/src/chartTypes/pointAndFigure.ts +278 -0
- package/src/chartTypes/rangeBars.ts +303 -0
- package/src/chartTypes/renko.ts +311 -0
- package/src/chartTypes/types.ts +99 -0
- package/src/components/anchoredVwap/__tests__/computeAnchoredVwap.test.ts +331 -0
- package/src/components/anchoredVwap/__tests__/controller.test.ts +430 -0
- package/src/components/anchoredVwap/computeAnchoredVwap.ts +174 -0
- package/src/components/anchoredVwap/createAnchoredVwapController.ts +358 -0
- package/src/components/anchoredVwap/index.ts +17 -0
- package/src/components/anchoredVwap/types.ts +187 -0
- package/src/components/crosshairSync/__tests__/crosshairSync.test.ts +261 -0
- package/src/components/crosshairSync/createCrosshairSync.ts +187 -0
- package/src/components/crosshairSync/index.ts +5 -0
- package/src/components/footprint/__tests__/aggressor.test.ts +127 -0
- package/src/components/footprint/__tests__/controller.test.ts +130 -0
- package/src/components/footprint/__tests__/perBarStats.test.ts +114 -0
- package/src/components/footprint/aggressor.ts +165 -0
- package/src/components/footprint/createFootprintController.ts +338 -0
- package/src/components/footprint/index.ts +21 -0
- package/src/components/footprint/perBarStats.ts +137 -0
- package/src/components/footprint/types.ts +232 -0
- package/src/components/mtfOverlay/__tests__/alignToBaseIndex.test.ts +103 -0
- package/src/components/mtfOverlay/__tests__/controller.test.ts +172 -0
- package/src/components/mtfOverlay/__tests__/resampleBars.test.ts +106 -0
- package/src/components/mtfOverlay/alignToBaseIndex.ts +108 -0
- package/src/components/mtfOverlay/createMtfController.ts +180 -0
- package/src/components/mtfOverlay/index.ts +26 -0
- package/src/components/mtfOverlay/resampleBars.ts +134 -0
- package/src/components/mtfOverlay/types.ts +148 -0
- package/src/components/orderBookHeatmap/__tests__/controller.test.ts +237 -0
- package/src/components/orderBookHeatmap/__tests__/deltaArchive.test.ts +88 -0
- package/src/components/orderBookHeatmap/__tests__/logColorScale.test.ts +69 -0
- package/src/components/orderBookHeatmap/__tests__/orderBookState.test.ts +113 -0
- package/src/components/orderBookHeatmap/__tests__/snapshotRing.test.ts +53 -0
- package/src/components/orderBookHeatmap/computeShader.wgsl.md +130 -0
- package/src/components/orderBookHeatmap/createHeatmapController.ts +273 -0
- package/src/components/orderBookHeatmap/createOrderBookState.ts +116 -0
- package/src/components/orderBookHeatmap/deltaArchive.ts +113 -0
- package/src/components/orderBookHeatmap/index.ts +25 -0
- package/src/components/orderBookHeatmap/logColorScale.ts +77 -0
- package/src/components/orderBookHeatmap/snapshotRing.ts +65 -0
- package/src/components/orderBookHeatmap/types.ts +168 -0
- package/src/components/volumeProfile/__tests__/binning.test.ts +133 -0
- package/src/components/volumeProfile/__tests__/poc.test.ts +44 -0
- package/src/components/volumeProfile/__tests__/valueArea.test.ts +177 -0
- package/src/components/volumeProfile/binning.ts +133 -0
- package/src/components/volumeProfile/createVolumeProfileController.ts +213 -0
- package/src/components/volumeProfile/index.ts +12 -0
- package/src/components/volumeProfile/poc.ts +53 -0
- package/src/components/volumeProfile/types.ts +148 -0
- package/src/components/volumeProfile/valueArea.ts +187 -0
- package/src/controllers/createChartController.ts +23 -10
- package/src/controllers/types.ts +5 -1
- package/src/data-fetchers/baostock.ts +2 -1
- package/src/data-fetchers/dataBuffer.effects.ts +3 -1
- package/src/data-fetchers/fetcherDefinitionRegistry.ts +2 -1
- package/src/data-fetchers/gotdx.ts +4 -3
- package/src/data-fetchers/router.ts +6 -3
- package/src/data-fetchers/tradingview.ts +3 -2
- package/src/engine/chart.ts +126 -3
- package/src/engine/data/chartDataManager.ts +26 -4
- package/src/engine/drawing/toolConfig.ts +2 -1
- package/src/engine/indicators/chartIndicatorManager.ts +2 -1
- package/src/engine/indicators/indicatorDefinitionRegistry.ts +2 -1
- package/src/engine/indicators/indicatorMetadata.ts +2 -1
- package/src/engine/indicators/indicatorRegistry.ts +6 -5
- package/src/engine/indicators/registerBuiltins.ts +2 -1
- package/src/engine/indicators/scheduler.ts +15 -0
- package/src/engine/indicators/soa.ts +2 -1
- package/src/engine/indicators/stateComposer.ts +2 -1
- package/src/engine/subPaneManager.ts +2 -1
- package/src/engine/utils/chartZoomController.ts +7 -1
- package/src/errors-help.ts +218 -0
- package/src/errors.ts +128 -0
- package/src/index.ts +37 -0
- package/src/indicators/__tests__/maFamily.test.ts +159 -0
- package/src/indicators/__tests__/oscillators.test.ts +150 -0
- package/src/indicators/alma.ts +61 -0
- package/src/indicators/awesomeOscillator.ts +54 -0
- package/src/indicators/dpo.ts +37 -0
- package/src/indicators/fisherTransform.ts +63 -0
- package/src/indicators/frama.ts +87 -0
- package/src/indicators/index.ts +39 -0
- package/src/indicators/lsma.ts +58 -0
- package/src/indicators/schaffTrendCycle.ts +92 -0
- package/src/indicators/stochRSI.ts +108 -0
- package/src/indicators/t3.ts +96 -0
- package/src/indicators/ultimateOscillator.ts +83 -0
- package/src/indicators/vidya.ts +80 -0
- package/src/indicators/zlema.ts +41 -0
- package/src/input/__tests__/gesture.test.ts +271 -0
- package/src/input/__tests__/keyboard.test.ts +317 -0
- package/src/input/gesture.ts +357 -0
- package/src/input/index.ts +26 -0
- package/src/input/keyboard.ts +373 -0
- package/src/mcp/chartBridge.ts +98 -72
- package/src/plugin/PluginHost.ts +4 -3
- package/src/plugin/PluginRegistry.ts +2 -1
- package/src/render/Renderer.ts +127 -0
- package/src/render/SurfaceBackend.ts +94 -0
- package/src/render/__tests__/contract.test.ts +176 -0
- package/src/render/index.ts +27 -0
- package/src/renderer-tier/__tests__/detectRendererTier.test.ts +180 -0
- package/src/renderer-tier/__tests__/selectBackend.test.ts +253 -0
- package/src/renderer-tier/detectRendererTier.ts +168 -0
- package/src/renderer-tier/index.ts +30 -0
- package/src/renderer-tier/selectBackend.ts +201 -0
- package/src/renderer-tier/types.ts +59 -0
- package/src/replay/__tests__/controller.test.ts +309 -0
- package/src/replay/__tests__/timeline.test.ts +99 -0
- package/src/replay/createReplayController.ts +302 -0
- package/src/replay/index.ts +15 -0
- package/src/replay/timeline.ts +106 -0
- package/src/replay/types.ts +107 -0
- package/src/scale/__tests__/anchoredZoom.test.ts +125 -0
- package/src/scale/__tests__/originShift.test.ts +97 -0
- package/src/scale/__tests__/priceScale.test.ts +219 -0
- package/src/scale/__tests__/timeScale.test.ts +119 -0
- package/src/scale/anchoredZoom.ts +104 -0
- package/src/scale/createPriceScale.ts +226 -0
- package/src/scale/createTimeScale.ts +150 -0
- package/src/scale/index.ts +9 -0
- package/src/scale/originShift.ts +111 -0
- package/src/scale/types.ts +100 -0
- package/src/scene/__tests__/layerRegistry.test.ts +207 -0
- package/src/scene/__tests__/scene.test.ts +411 -0
- package/src/scene/createScene.ts +117 -0
- package/src/scene/index.ts +29 -0
- package/src/scene/layerRegistry.ts +117 -0
- package/src/scene/types.ts +143 -0
- package/src/scheduler/__tests__/createFrameBudget.test.ts +315 -0
- package/src/scheduler/createFrameBudget.ts +316 -0
- package/src/scheduler/index.ts +7 -0
- package/src/tokens/themeToCssVars.ts +3 -1
- package/src/version.ts +1 -1
- package/dist/data-fetchers/gotdx/gotdx.d.ts +0 -7
- package/dist/data-fetchers/gotdx/gotdx.d.ts.map +0 -1
- package/dist/data-fetchers/gotdx/gotdx.js +0 -7
- package/dist/data-fetchers/gotdx/gotdx.js.map +0 -1
- package/src/data-fetchers/gotdx/gotdx.ts +0 -6
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scene factory — composition, ordered iteration, lifecycle.
|
|
3
|
+
*
|
|
4
|
+
* Design notes:
|
|
5
|
+
* - The layer list is stored in **registration order** in a private array.
|
|
6
|
+
* `paintPane` performs a stable sort by `z` at paint time. We do not
|
|
7
|
+
* maintain a sorted invariant on the array itself because:
|
|
8
|
+
* 1. Add/remove must remain O(n), and z is a number, so a sorted
|
|
9
|
+
* insert is O(n) anyway.
|
|
10
|
+
* 2. Stable sort by z gives the documented tie-breaker (registration
|
|
11
|
+
* order) "for free" without parallel arrays or registration counters.
|
|
12
|
+
* - The `layers` signal exposes a snapshot. Every mutation produces a NEW
|
|
13
|
+
* array via spread or filter — never mutate the previous value. This is
|
|
14
|
+
* the immutability contract framework adapters rely on.
|
|
15
|
+
* - After `dispose`, every public method becomes a no-op. The `disposed`
|
|
16
|
+
* flag is checked at the top of each method; this matches the renderer's
|
|
17
|
+
* "dispose freezes" semantic and prevents callers from leaking listeners
|
|
18
|
+
* into a torn-down scene.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { createSignal, type Signal } from '../reactivity/signal'
|
|
22
|
+
import type { Layer, PaintContext, Scene } from './types'
|
|
23
|
+
|
|
24
|
+
export function createScene(): Scene {
|
|
25
|
+
// ---- internal state ----------------------------------------------------
|
|
26
|
+
// Mutable list held outside the signal so that signal.set always receives
|
|
27
|
+
// a fresh frozen-shape snapshot. We never expose this array directly.
|
|
28
|
+
let layerList: Layer[] = []
|
|
29
|
+
let disposed = false
|
|
30
|
+
const layersSignal: Signal<ReadonlyArray<Layer>> = createSignal<ReadonlyArray<Layer>>([])
|
|
31
|
+
|
|
32
|
+
const publish = (): void => {
|
|
33
|
+
layersSignal.set(layerList.slice() as ReadonlyArray<Layer>)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// ---- public API --------------------------------------------------------
|
|
37
|
+
|
|
38
|
+
const addLayer = (layer: Layer): void => {
|
|
39
|
+
if (disposed) return
|
|
40
|
+
// Reject duplicate ids silently — protects against double-registration
|
|
41
|
+
// races where two systems (e.g. an indicator controller + a config
|
|
42
|
+
// restore) both attempt to add the same layer. The first wins.
|
|
43
|
+
if (layerList.some((existing) => existing.id === layer.id)) return
|
|
44
|
+
layerList = [...layerList, layer]
|
|
45
|
+
publish()
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const removeLayer = (id: string): boolean => {
|
|
49
|
+
if (disposed) return false
|
|
50
|
+
const next = layerList.filter((layer) => layer.id !== id)
|
|
51
|
+
if (next.length === layerList.length) return false
|
|
52
|
+
layerList = next
|
|
53
|
+
publish()
|
|
54
|
+
return true
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const getLayer = (id: string): Layer | null => {
|
|
58
|
+
if (disposed) return null
|
|
59
|
+
const hit = layerList.find((layer) => layer.id === id)
|
|
60
|
+
return hit ?? null
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const setLayerVisibility = (id: string, visible: boolean): boolean => {
|
|
64
|
+
if (disposed) return false
|
|
65
|
+
const layer = layerList.find((l) => l.id === id)
|
|
66
|
+
if (!layer) return false
|
|
67
|
+
// `visible` is a mutable field on the layer (per the interface);
|
|
68
|
+
// mutating it does not affect the `layers` signal's identity because
|
|
69
|
+
// subscribers care about membership, not field state. This matches
|
|
70
|
+
// how chart adapters batch visibility toggles (no re-render storm).
|
|
71
|
+
layer.visible = visible
|
|
72
|
+
return true
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const paintPane = (ctx: PaintContext): void => {
|
|
76
|
+
if (disposed) return
|
|
77
|
+
// Filter then stable-sort. Native Array.prototype.sort is required
|
|
78
|
+
// by ECMAScript 2019+ to be stable, so equal z values preserve the
|
|
79
|
+
// surviving registration order from the filter pass.
|
|
80
|
+
const candidates = layerList.filter(
|
|
81
|
+
(layer) => layer.paneRole === ctx.paneRole && layer.visible,
|
|
82
|
+
)
|
|
83
|
+
candidates.sort((a, b) => a.z - b.z)
|
|
84
|
+
for (const layer of candidates) {
|
|
85
|
+
layer.paint(ctx)
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const dispose = (): void => {
|
|
90
|
+
if (disposed) return
|
|
91
|
+
disposed = true
|
|
92
|
+
// Snapshot first because layer.dispose may attempt further mutations
|
|
93
|
+
// through a stale reference — we want predictable iteration here.
|
|
94
|
+
const snapshot = layerList
|
|
95
|
+
layerList = []
|
|
96
|
+
for (const layer of snapshot) {
|
|
97
|
+
try {
|
|
98
|
+
layer.dispose()
|
|
99
|
+
} catch {
|
|
100
|
+
// Swallow per-layer dispose errors so one broken layer can't
|
|
101
|
+
// strand the rest. A logger would go here in production; the
|
|
102
|
+
// headless core does not own a logger contract yet.
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
layersSignal.set([] as ReadonlyArray<Layer>)
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return {
|
|
109
|
+
layers: layersSignal,
|
|
110
|
+
addLayer,
|
|
111
|
+
removeLayer,
|
|
112
|
+
getLayer,
|
|
113
|
+
setLayerVisibility,
|
|
114
|
+
paintPane,
|
|
115
|
+
dispose,
|
|
116
|
+
}
|
|
117
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scene abstraction barrel.
|
|
3
|
+
*
|
|
4
|
+
* Exports the `Layer` / `Scene` types, the `createScene` factory, and the
|
|
5
|
+
* `LayerRegistry` mechanism + canonical built-in layer typeIds. This is the
|
|
6
|
+
* level above `render` and below `interaction` in the core dependency stack
|
|
7
|
+
* — see `docs/ROADMAP.md` §0.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
export type {
|
|
11
|
+
Layer,
|
|
12
|
+
LayerRole,
|
|
13
|
+
PaneRole,
|
|
14
|
+
PaintContext,
|
|
15
|
+
Scene,
|
|
16
|
+
} from './types'
|
|
17
|
+
|
|
18
|
+
export { createScene } from './createScene'
|
|
19
|
+
|
|
20
|
+
export {
|
|
21
|
+
createLayerRegistry,
|
|
22
|
+
BUILTIN_LAYER_TYPES,
|
|
23
|
+
} from './layerRegistry'
|
|
24
|
+
|
|
25
|
+
export type {
|
|
26
|
+
LayerFactory,
|
|
27
|
+
LayerRegistry,
|
|
28
|
+
BuiltinLayerType,
|
|
29
|
+
} from './layerRegistry'
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { KLineChartError } from '../errors'
|
|
2
|
+
/**
|
|
3
|
+
* Layer factory registry.
|
|
4
|
+
*
|
|
5
|
+
* The registry is a tiny lookup table from a stable string `typeId` to a
|
|
6
|
+
* factory function that builds a `Layer` instance. It exists so that:
|
|
7
|
+
*
|
|
8
|
+
* 1. Chart adapters can choose which built-in layer types to wire in,
|
|
9
|
+
* rather than the core forcing all of them on every consumer.
|
|
10
|
+
* 2. Component layers built by sibling agents (Volume Profile, Order Book
|
|
11
|
+
* Heatmap, Footprint) register their factories without touching the
|
|
12
|
+
* scene code itself — the registry is the integration point.
|
|
13
|
+
* 3. The registry is decoupled from `Scene`: a factory produces a `Layer`;
|
|
14
|
+
* the consumer is responsible for calling `scene.addLayer(layer)`. This
|
|
15
|
+
* avoids forcing every consumer through a single "register + auto-add"
|
|
16
|
+
* pipeline that would be hard to compose with config-driven scenes.
|
|
17
|
+
*
|
|
18
|
+
* This PR does NOT pre-register any factories — that's a follow-up PR
|
|
19
|
+
* once the legacy WebGL renderers have adapters that satisfy the `Layer`
|
|
20
|
+
* interface. This file ships the registry mechanism plus the canonical
|
|
21
|
+
* `typeId` constants so the rest of the codebase can reference layer types
|
|
22
|
+
* by symbol rather than magic string.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import type { Layer, LayerRole } from './types'
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* A layer factory turns a typed config into a `Layer`.
|
|
29
|
+
*
|
|
30
|
+
* `TConfig` is parameterised so factories can declare their own config
|
|
31
|
+
* shape (e.g. the Volume Profile factory takes `{ store, bins, modes }`).
|
|
32
|
+
* The registry stores factories with `unknown` config — callers know which
|
|
33
|
+
* factory they're calling and cast on retrieval.
|
|
34
|
+
*/
|
|
35
|
+
export interface LayerFactory<TConfig = unknown> {
|
|
36
|
+
/** Stable id for this layer TYPE (not instance) — e.g. 'volume-profile'. */
|
|
37
|
+
typeId: string
|
|
38
|
+
role: LayerRole
|
|
39
|
+
/** Create a Layer instance; consumers pass any config + their store ref. */
|
|
40
|
+
create(config: TConfig): Layer
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface LayerRegistry {
|
|
44
|
+
/**
|
|
45
|
+
* Register a factory. Returns nothing on success.
|
|
46
|
+
* Throws on duplicate `typeId` — duplicates are programmer errors
|
|
47
|
+
* (two systems trying to claim the same layer type id), not runtime
|
|
48
|
+
* conditions to be silently handled. The error message names the
|
|
49
|
+
* conflicting typeId so the caller can locate it.
|
|
50
|
+
*/
|
|
51
|
+
register(factory: LayerFactory): void
|
|
52
|
+
/**
|
|
53
|
+
* Remove a factory by typeId. Returns true if a factory was removed,
|
|
54
|
+
* false if no such typeId was registered.
|
|
55
|
+
*/
|
|
56
|
+
unregister(typeId: string): boolean
|
|
57
|
+
/** Look up a factory by typeId. Returns null when not registered. */
|
|
58
|
+
get(typeId: string): LayerFactory | null
|
|
59
|
+
/** Snapshot of all registered factories. Safe to iterate; do not mutate. */
|
|
60
|
+
list(): ReadonlyArray<LayerFactory>
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function createLayerRegistry(): LayerRegistry {
|
|
64
|
+
// Map preserves insertion order, which makes `list()` deterministic —
|
|
65
|
+
// useful for snapshot tests and for UI surfaces (e.g. an "available
|
|
66
|
+
// layers" picker) that render the list in registration order.
|
|
67
|
+
const factories = new Map<string, LayerFactory>()
|
|
68
|
+
|
|
69
|
+
const register = (factory: LayerFactory): void => {
|
|
70
|
+
if (factories.has(factory.typeId)) {
|
|
71
|
+
throw new KLineChartError(
|
|
72
|
+
'NOT_REGISTERED',
|
|
73
|
+
`LayerRegistry: typeId "${factory.typeId}" is already registered`,
|
|
74
|
+
)
|
|
75
|
+
}
|
|
76
|
+
factories.set(factory.typeId, factory)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const unregister = (typeId: string): boolean => factories.delete(typeId)
|
|
80
|
+
|
|
81
|
+
const get = (typeId: string): LayerFactory | null =>
|
|
82
|
+
factories.get(typeId) ?? null
|
|
83
|
+
|
|
84
|
+
const list = (): ReadonlyArray<LayerFactory> =>
|
|
85
|
+
Array.from(factories.values()) as ReadonlyArray<LayerFactory>
|
|
86
|
+
|
|
87
|
+
return { register, unregister, get, list }
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Canonical typeIds for the layer types this codebase intends to ship.
|
|
92
|
+
*
|
|
93
|
+
* Grouped into:
|
|
94
|
+
* - "builtin:" — layers backed by existing v0 WebGL renderers (will arrive
|
|
95
|
+
* via adapter factories in a follow-up PR).
|
|
96
|
+
* - "component:" — the three P1 differentiating components from ROADMAP §3.
|
|
97
|
+
*
|
|
98
|
+
* These are string constants (not enums) so external code can pass through
|
|
99
|
+
* string literal types without an enum import — useful for config blobs.
|
|
100
|
+
*/
|
|
101
|
+
export const BUILTIN_LAYER_TYPES = {
|
|
102
|
+
// Existing in v0 (handled by legacy renderers)
|
|
103
|
+
CANDLE: 'builtin:candle',
|
|
104
|
+
VOLUME: 'builtin:volume',
|
|
105
|
+
INDICATOR_MA: 'builtin:indicator:ma',
|
|
106
|
+
INDICATOR_BOLL: 'builtin:indicator:boll',
|
|
107
|
+
DRAWING: 'builtin:drawing',
|
|
108
|
+
CROSSHAIR: 'builtin:crosshair',
|
|
109
|
+
GRID: 'builtin:grid',
|
|
110
|
+
// P1 component layers (controllers from sibling agents will provide factories)
|
|
111
|
+
VOLUME_PROFILE: 'component:volume-profile',
|
|
112
|
+
ORDER_BOOK_HEATMAP: 'component:order-book-heatmap',
|
|
113
|
+
FOOTPRINT: 'component:footprint',
|
|
114
|
+
} as const
|
|
115
|
+
|
|
116
|
+
export type BuiltinLayerType =
|
|
117
|
+
(typeof BUILTIN_LAYER_TYPES)[keyof typeof BUILTIN_LAYER_TYPES]
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scene + Layer type definitions.
|
|
3
|
+
*
|
|
4
|
+
* The scene is the level above `render` in core's dependency stack
|
|
5
|
+
* (see `docs/ROADMAP.md` §0):
|
|
6
|
+
*
|
|
7
|
+
* interaction → store → scene → render
|
|
8
|
+
*
|
|
9
|
+
* A `Layer` is a self-contained drawing module — candles, volume bars,
|
|
10
|
+
* indicator plots, drawings, crosshair, and the P1 component layers
|
|
11
|
+
* (Volume Profile, Order Book Heatmap, Footprint) all conform to the same
|
|
12
|
+
* shape. The scene composes layers, owns ordering, and drives per-frame
|
|
13
|
+
* paint dispatch; it does NOT know which GPU backend is underneath
|
|
14
|
+
* because `paint()` only sees a `Renderer` reference via `PaintContext`.
|
|
15
|
+
*
|
|
16
|
+
* This file is **pure interface** — `createScene.ts` implements `Scene`,
|
|
17
|
+
* but the types here are zero-runtime so framework adapters and indicator
|
|
18
|
+
* controllers can compile against them without pulling in the implementation.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import type { Renderer } from '../render/Renderer'
|
|
22
|
+
import type { SurfaceRegion } from '../render/SurfaceBackend'
|
|
23
|
+
import type { Signal } from '../reactivity/signal'
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Roles let the scene group layers and let other systems target them
|
|
27
|
+
* (e.g. picking ignores `background`; drawings live above indicators).
|
|
28
|
+
*
|
|
29
|
+
* The ordering here is informational, not enforced — z-order is the
|
|
30
|
+
* authoritative paint order. Roles exist so a follow-up PR can build
|
|
31
|
+
* features like "hit-test only drawing + component layers" without
|
|
32
|
+
* peeking at layer ids.
|
|
33
|
+
*/
|
|
34
|
+
export type LayerRole =
|
|
35
|
+
| 'background' // grid, axes
|
|
36
|
+
| 'primary' // candles, volume bars
|
|
37
|
+
| 'indicator' // MA, BOLL, indicator-defined plots
|
|
38
|
+
| 'component' // Volume Profile, Heatmap, Footprint
|
|
39
|
+
| 'drawing' // user drawings
|
|
40
|
+
| 'overlay' // crosshair, hover, legends
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Which pane a layer belongs to. The chart has a main pane (candles +
|
|
44
|
+
* primary indicators) and zero-or-more sub panes (volume, RSI, MACD).
|
|
45
|
+
* Layers declare their pane statically; the scene's `paintPane` filters
|
|
46
|
+
* by this field so each pane's region only sees its own layers.
|
|
47
|
+
*
|
|
48
|
+
* NOTE for implementations: this PR uses a flat 'main' / 'sub' split.
|
|
49
|
+
* If a future iteration needs to address a specific sub-pane (e.g. the
|
|
50
|
+
* volume pane vs the RSI pane), extend this to a string id (e.g. 'sub:rsi')
|
|
51
|
+
* — the Layer / Scene contract here does not pre-commit a multi-sub-pane
|
|
52
|
+
* scheme on purpose.
|
|
53
|
+
*/
|
|
54
|
+
export type PaneRole = 'main' | 'sub'
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Stateless paint context handed to each layer per frame.
|
|
58
|
+
*
|
|
59
|
+
* The layer reads what it needs from the store via subscriptions
|
|
60
|
+
* (the store reference is held by the layer itself, set up at construction
|
|
61
|
+
* time by its factory); this context is the per-frame state.
|
|
62
|
+
*
|
|
63
|
+
* Invariants:
|
|
64
|
+
* - `renderer` MUST already be inside a `beginFrame` / `endFrame` pair
|
|
65
|
+
* when paint runs. The scene does not call beginFrame/endFrame itself —
|
|
66
|
+
* that's the chart engine's responsibility (see `docs/ROADMAP.md` §0
|
|
67
|
+
* for the layered call chain).
|
|
68
|
+
* - `region` is the surface region for the pane currently being painted.
|
|
69
|
+
* Layers MUST treat all coordinates as logical pixels relative to this
|
|
70
|
+
* region's origin (the renderer's surface handles DPR scaling).
|
|
71
|
+
* - `frameNumber` is monotonic across the chart's lifetime; layers can use
|
|
72
|
+
* it to drive animations or detect skipped frames.
|
|
73
|
+
* - `deltaMs` is the wall-clock delta since the previous paint of any pane,
|
|
74
|
+
* in milliseconds. May be `0` on the very first frame.
|
|
75
|
+
*/
|
|
76
|
+
export interface PaintContext {
|
|
77
|
+
renderer: Renderer
|
|
78
|
+
region: SurfaceRegion
|
|
79
|
+
paneRole: PaneRole
|
|
80
|
+
/** monotonically increasing frame counter for animation/timing */
|
|
81
|
+
frameNumber: number
|
|
82
|
+
/** time elapsed since last frame in ms (for animations) */
|
|
83
|
+
deltaMs: number
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* A Layer is a self-contained drawing module.
|
|
88
|
+
*
|
|
89
|
+
* The contract:
|
|
90
|
+
* - Pure function `paint()`: given context, produce GPU commands.
|
|
91
|
+
* - `paint()` MUST NOT mutate any shared state visible to other layers.
|
|
92
|
+
* Layer-private state (cached buffers, last-seen frame number) is fine.
|
|
93
|
+
* - `paint()` runs in scene-defined order; order matters for visual stacking
|
|
94
|
+
* (lower z paints first, so higher-z layers visually sit on top).
|
|
95
|
+
* - `dispose()` MUST release any renderer resources the layer allocated
|
|
96
|
+
* (buffers, pipelines). After dispose, the layer is dead — the scene
|
|
97
|
+
* removes it and will not call paint again.
|
|
98
|
+
* - `visible` is a runtime toggle. Invisible layers are skipped entirely
|
|
99
|
+
* (no paint() call); the layer keeps its allocated resources so a flip
|
|
100
|
+
* back to visible is cheap.
|
|
101
|
+
*/
|
|
102
|
+
export interface Layer {
|
|
103
|
+
readonly id: string
|
|
104
|
+
readonly role: LayerRole
|
|
105
|
+
/** which pane this layer belongs to */
|
|
106
|
+
readonly paneRole: PaneRole
|
|
107
|
+
/** lower z first; ties broken by registration order */
|
|
108
|
+
readonly z: number
|
|
109
|
+
/** quick toggle without removing the layer from the scene */
|
|
110
|
+
visible: boolean
|
|
111
|
+
|
|
112
|
+
paint(ctx: PaintContext): void
|
|
113
|
+
dispose(): void
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* The Scene composes layers and exposes them to subscribers via a Signal.
|
|
118
|
+
*
|
|
119
|
+
* Add/remove operations produce a NEW array on the `layers` signal — never
|
|
120
|
+
* mutate the previous value in place. This guarantees framework adapters
|
|
121
|
+
* (React, Vue, Angular) using `Object.is` equality detect changes correctly.
|
|
122
|
+
*
|
|
123
|
+
* `paintPane` is the only entry point that draws anything; it filters layers
|
|
124
|
+
* by `paneRole`, drops invisible layers, and dispatches in z order with ties
|
|
125
|
+
* broken by registration order (FIFO stable sort).
|
|
126
|
+
*
|
|
127
|
+
* `dispose` tears down every layer the scene currently owns and freezes the
|
|
128
|
+
* scene — subsequent add/remove/setLayerVisibility/paintPane calls are silent
|
|
129
|
+
* no-ops. This matches the renderer's "dispose freezes the object" semantics.
|
|
130
|
+
*/
|
|
131
|
+
export interface Scene {
|
|
132
|
+
readonly layers: Signal<ReadonlyArray<Layer>>
|
|
133
|
+
|
|
134
|
+
addLayer(layer: Layer): void
|
|
135
|
+
removeLayer(id: string): boolean
|
|
136
|
+
getLayer(id: string): Layer | null
|
|
137
|
+
setLayerVisibility(id: string, visible: boolean): boolean
|
|
138
|
+
|
|
139
|
+
/** paint layers for one pane in z-order, then by registration order */
|
|
140
|
+
paintPane(ctx: PaintContext): void
|
|
141
|
+
|
|
142
|
+
dispose(): void
|
|
143
|
+
}
|