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