@pibbl/core 0.0.1 → 0.0.3-alpha.109.1
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/README.md +1 -1
- package/THIRD_PARTY_NOTICES.txt +81 -0
- package/dist/features/machines/animation.d.ts +64 -0
- package/dist/features/machines/animation.js +55 -0
- package/dist/features/machines/animation.js.map +7 -0
- package/dist/features/machines/animation.mjs +1 -0
- package/dist/features/machines/assign.d.ts +16 -0
- package/dist/features/machines/assign.js +15 -0
- package/dist/features/machines/assign.js.map +7 -0
- package/dist/features/machines/callback.d.ts +9 -0
- package/dist/features/machines/callback.js +7 -0
- package/dist/features/machines/callback.js.map +7 -0
- package/dist/features/machines/hook.d.ts +30 -0
- package/dist/features/machines/hook.js +37 -0
- package/dist/features/machines/hook.js.map +7 -0
- package/dist/features/machines/index.d.ts +6 -0
- package/dist/features/machines/index.js +12 -0
- package/dist/features/machines/index.js.map +7 -0
- package/dist/features/machines/index.mjs +1 -0
- package/dist/features/machines/runtime.d.ts +18 -0
- package/dist/features/machines/runtime.js +363 -0
- package/dist/features/machines/runtime.js.map +7 -0
- package/dist/features/machines/types.d.ts +164 -0
- package/dist/features/physics/2d-geometry.d.ts +3 -3
- package/dist/features/physics/2d-geometry.js.map +1 -1
- package/dist/features/physics/2d-testing.d.ts +1 -1
- package/dist/features/physics/2d-testing.js +2 -2
- package/dist/features/physics/2d-testing.js.map +2 -2
- package/dist/features/physics/2d.d.ts +115 -62
- package/dist/features/physics/2d.js +59 -28
- package/dist/features/physics/2d.js.map +2 -2
- package/dist/features/physics/lib/2d/canvas/components.js +25 -21
- package/dist/features/physics/lib/2d/canvas/components.js.map +2 -2
- package/dist/features/physics/lib/2d/canvas/presentation.js +1 -2
- package/dist/features/physics/lib/2d/canvas/presentation.js.map +2 -2
- package/dist/features/physics/lib/2d/collision/casts.js +4 -2
- package/dist/features/physics/lib/2d/collision/casts.js.map +2 -2
- package/dist/features/physics/lib/2d/query-types.d.ts +6 -0
- package/dist/features/physics/lib/2d/runtime/controller.d.ts +7 -6
- package/dist/features/physics/lib/2d/runtime/controller.js +1 -1
- package/dist/features/physics/lib/2d/runtime/controller.js.map +2 -2
- package/dist/features/physics/lib/2d/runtime/obstacles.js +9 -11
- package/dist/features/physics/lib/2d/runtime/obstacles.js.map +2 -2
- package/dist/features/physics/lib/2d/shapes.js +8 -9
- package/dist/features/physics/lib/2d/shapes.js.map +2 -2
- package/dist/features/physics/lib/2d/types.d.ts +8 -30
- package/dist/features/physics/lib/2d/world/queries.d.ts +7 -6
- package/dist/features/physics/lib/2d/world/queries.js.map +2 -2
- package/dist/features/physics/lib/2d/world/rapier.js +22 -26
- package/dist/features/physics/lib/2d/world/rapier.js.map +2 -2
- package/dist/features/sprites/formats/aseprite.d.ts +5 -0
- package/dist/features/sprites/formats/texture-packer.d.ts +5 -0
- package/dist/features/sprites/index.d.ts +6 -0
- package/dist/features/sprites/loader.d.ts +25 -0
- package/dist/features/sprites/loader.js +6 -3
- package/dist/features/sprites/loader.js.map +2 -2
- package/dist/features/sprites/model.d.ts +75 -0
- package/dist/features/sprites/sprite.d.ts +22 -0
- package/dist/features/textures/index.d.ts +12 -2
- package/dist/features/textures/index.js +33 -1
- package/dist/features/textures/index.js.map +2 -2
- package/dist/features/textures/lib/chemical-field.d.ts +56 -0
- package/dist/features/textures/lib/chemical-field.js +154 -0
- package/dist/features/textures/lib/chemical-field.js.map +7 -0
- package/dist/features/textures/lib/chemical-recipes.d.ts +119 -0
- package/dist/features/textures/lib/chemical-recipes.js +275 -0
- package/dist/features/textures/lib/chemical-recipes.js.map +7 -0
- package/dist/features/textures/lib/definitions.d.ts +3 -18
- package/dist/features/textures/lib/definitions.js +17 -24
- package/dist/features/textures/lib/definitions.js.map +2 -2
- package/dist/features/textures/lib/geometric-patterns.d.ts +149 -0
- package/dist/features/textures/lib/geometric-patterns.js +305 -0
- package/dist/features/textures/lib/geometric-patterns.js.map +7 -0
- package/dist/features/textures/lib/gray-scott.d.ts +55 -0
- package/dist/features/textures/lib/gray-scott.js +37 -0
- package/dist/features/textures/lib/gray-scott.js.map +7 -0
- package/dist/features/textures/lib/palette.js +1 -3
- package/dist/features/textures/lib/palette.js.map +2 -2
- package/dist/features/textures/lib/patterns.d.ts +123 -0
- package/dist/features/textures/lib/patterns.js +344 -0
- package/dist/features/textures/lib/patterns.js.map +7 -0
- package/dist/features/textures/lib/rain-drops.js +2 -1
- package/dist/features/textures/lib/rain-drops.js.map +2 -2
- package/dist/features/textures/lib/reaction-diffusion.d.ts +3 -2
- package/dist/features/textures/lib/reaction-diffusion.js +9 -20
- package/dist/features/textures/lib/reaction-diffusion.js.map +2 -2
- package/dist/features/textures/lib/simulation.d.ts +10 -4
- package/dist/features/textures/lib/simulation.js +23 -13
- package/dist/features/textures/lib/simulation.js.map +2 -2
- package/dist/features/textures/lib/wasm/electric.js +8 -1
- package/dist/features/textures/lib/wasm/electric.js.map +2 -2
- package/dist/features/textures/lib/water-surface.js +1 -3
- package/dist/features/textures/lib/water-surface.js.map +2 -2
- package/dist/features/viz/index.d.ts +92 -5
- package/dist/features/viz/index.js +202 -4
- package/dist/features/viz/index.js.map +2 -2
- package/dist/features/viz/inspection/bar.d.ts +79 -0
- package/dist/features/viz/inspection/bar.js +49 -0
- package/dist/features/viz/inspection/bar.js.map +7 -0
- package/dist/features/viz/inspection/candle.d.ts +156 -0
- package/dist/features/viz/inspection/candle.js +120 -0
- package/dist/features/viz/inspection/candle.js.map +7 -0
- package/dist/features/viz/inspection/capture-types.d.ts +65 -0
- package/dist/features/viz/inspection/capture.d.ts +16 -0
- package/dist/features/viz/inspection/capture.js +49 -0
- package/dist/features/viz/inspection/capture.js.map +7 -0
- package/dist/features/viz/inspection/handler.d.ts +36 -0
- package/dist/features/viz/inspection/handler.js +91 -0
- package/dist/features/viz/inspection/handler.js.map +7 -0
- package/dist/features/viz/inspection/ohlc-bar.d.ts +132 -0
- package/dist/features/viz/inspection/ohlc-bar.js +118 -0
- package/dist/features/viz/inspection/ohlc-bar.js.map +7 -0
- package/dist/features/viz/inspection/owned-ref.d.ts +16 -0
- package/dist/features/viz/inspection/owned-ref.js +99 -0
- package/dist/features/viz/inspection/owned-ref.js.map +7 -0
- package/dist/features/viz/inspection/painted-point.d.ts +22 -0
- package/dist/features/viz/inspection/painted-point.js +29 -0
- package/dist/features/viz/inspection/painted-point.js.map +7 -0
- package/dist/features/viz/inspection/queries.d.ts +100 -0
- package/dist/features/viz/inspection/queries.js +192 -0
- package/dist/features/viz/inspection/queries.js.map +7 -0
- package/dist/features/viz/inspection/query-types.d.ts +177 -0
- package/dist/features/viz/inspection/volume.d.ts +104 -0
- package/dist/features/viz/inspection/volume.js +95 -0
- package/dist/features/viz/inspection/volume.js.map +7 -0
- package/dist/features/viz/inspection.d.ts +19 -0
- package/dist/features/viz/inspection.js +54 -0
- package/dist/features/viz/inspection.js.map +7 -0
- package/dist/features/viz/inspection.mjs +1 -0
- package/dist/features/viz/lib/area-series.d.ts +62 -0
- package/dist/features/viz/lib/area-series.js +120 -0
- package/dist/features/viz/lib/area-series.js.map +7 -0
- package/dist/features/viz/lib/axis-labels.d.ts +2 -0
- package/dist/features/viz/lib/axis-labels.js +41 -0
- package/dist/features/viz/lib/axis-labels.js.map +7 -0
- package/dist/features/viz/lib/axis-title.d.ts +23 -0
- package/dist/features/viz/lib/axis-title.js +24 -0
- package/dist/features/viz/lib/axis-title.js.map +7 -0
- package/dist/features/viz/lib/axis.d.ts +1 -1
- package/dist/features/viz/lib/axis.js +50 -50
- package/dist/features/viz/lib/axis.js.map +2 -2
- package/dist/features/viz/lib/bar-scale.d.ts +7 -0
- package/dist/features/viz/lib/bar-scale.js +34 -0
- package/dist/features/viz/lib/bar-scale.js.map +7 -0
- package/dist/features/viz/lib/bar-series.d.ts +3 -1
- package/dist/features/viz/lib/bar-series.js +21 -5
- package/dist/features/viz/lib/bar-series.js.map +2 -2
- package/dist/features/viz/lib/baseline-series.d.ts +55 -0
- package/dist/features/viz/lib/baseline-series.js +136 -0
- package/dist/features/viz/lib/baseline-series.js.map +7 -0
- package/dist/features/viz/lib/candlestick-series.d.ts +62 -0
- package/dist/features/viz/lib/candlestick-series.js +150 -0
- package/dist/features/viz/lib/candlestick-series.js.map +7 -0
- package/dist/features/viz/lib/censored-point-series.d.ts +71 -0
- package/dist/features/viz/lib/censored-point-series.js +129 -0
- package/dist/features/viz/lib/censored-point-series.js.map +7 -0
- package/dist/features/viz/lib/chart-lines.d.ts +41 -0
- package/dist/features/viz/lib/chart-lines.js +32 -0
- package/dist/features/viz/lib/chart-lines.js.map +7 -0
- package/dist/features/viz/lib/color-context.d.ts +4 -0
- package/dist/features/viz/lib/color-context.js +41 -0
- package/dist/features/viz/lib/color-context.js.map +7 -0
- package/dist/features/viz/lib/color-math.d.ts +4 -0
- package/dist/features/viz/lib/color-math.js +31 -0
- package/dist/features/viz/lib/color-math.js.map +7 -0
- package/dist/features/viz/lib/color-types.d.ts +53 -0
- package/dist/features/viz/lib/curve-definition.d.ts +49 -0
- package/dist/features/viz/lib/curve-definition.js +142 -0
- package/dist/features/viz/lib/curve-definition.js.map +7 -0
- package/dist/features/viz/lib/diverging-color-scale.d.ts +11 -0
- package/dist/features/viz/lib/diverging-color-scale.js +51 -0
- package/dist/features/viz/lib/diverging-color-scale.js.map +7 -0
- package/dist/features/viz/lib/domain-navigation.d.ts +40 -0
- package/dist/features/viz/lib/domain-navigation.js +77 -0
- package/dist/features/viz/lib/domain-navigation.js.map +7 -0
- package/dist/features/viz/lib/editable-chart-elements.d.ts +178 -0
- package/dist/features/viz/lib/editable-chart-elements.js +733 -0
- package/dist/features/viz/lib/editable-chart-elements.js.map +7 -0
- package/dist/features/viz/lib/financial-aggregation.d.ts +127 -0
- package/dist/features/viz/lib/financial-aggregation.js +116 -0
- package/dist/features/viz/lib/financial-aggregation.js.map +7 -0
- package/dist/features/viz/lib/financial-autoscale.d.ts +64 -0
- package/dist/features/viz/lib/financial-autoscale.js +61 -0
- package/dist/features/viz/lib/financial-autoscale.js.map +7 -0
- package/dist/features/viz/lib/financial-comparison.d.ts +62 -0
- package/dist/features/viz/lib/financial-comparison.js +98 -0
- package/dist/features/viz/lib/financial-comparison.js.map +7 -0
- package/dist/features/viz/lib/financial-geometry.d.ts +77 -0
- package/dist/features/viz/lib/financial-geometry.js +67 -0
- package/dist/features/viz/lib/financial-geometry.js.map +7 -0
- package/dist/features/viz/lib/financial-indicators.d.ts +114 -0
- package/dist/features/viz/lib/financial-indicators.js +135 -0
- package/dist/features/viz/lib/financial-indicators.js.map +7 -0
- package/dist/features/viz/lib/financial-oscillators.d.ts +171 -0
- package/dist/features/viz/lib/financial-oscillators.js +265 -0
- package/dist/features/viz/lib/financial-oscillators.js.map +7 -0
- package/dist/features/viz/lib/graph/bipartite.d.ts +14 -0
- package/dist/features/viz/lib/graph/bipartite.js +250 -0
- package/dist/features/viz/lib/graph/bipartite.js.map +7 -0
- package/dist/features/viz/lib/graph/chord.d.ts +44 -0
- package/dist/features/viz/lib/graph/chord.js +348 -0
- package/dist/features/viz/lib/graph/chord.js.map +7 -0
- package/dist/features/viz/lib/graph/dependency.d.ts +26 -0
- package/dist/features/viz/lib/graph/dependency.js +140 -0
- package/dist/features/viz/lib/graph/dependency.js.map +7 -0
- package/dist/features/viz/lib/graph/force.d.ts +28 -0
- package/dist/features/viz/lib/graph/force.js +580 -0
- package/dist/features/viz/lib/graph/force.js.map +7 -0
- package/dist/features/viz/lib/graph/hierarchy.d.ts +21 -0
- package/dist/features/viz/lib/graph/hierarchy.js +112 -0
- package/dist/features/viz/lib/graph/hierarchy.js.map +7 -0
- package/dist/features/viz/lib/graph/icicle.d.ts +16 -0
- package/dist/features/viz/lib/graph/icicle.js +153 -0
- package/dist/features/viz/lib/graph/icicle.js.map +7 -0
- package/dist/features/viz/lib/graph/matrix.d.ts +30 -0
- package/dist/features/viz/lib/graph/matrix.js +243 -0
- package/dist/features/viz/lib/graph/matrix.js.map +7 -0
- package/dist/features/viz/lib/graph/neighborhood.d.ts +11 -0
- package/dist/features/viz/lib/graph/neighborhood.js +281 -0
- package/dist/features/viz/lib/graph/neighborhood.js.map +7 -0
- package/dist/features/viz/lib/graph/routes.d.ts +35 -0
- package/dist/features/viz/lib/graph/routes.js +101 -0
- package/dist/features/viz/lib/graph/routes.js.map +7 -0
- package/dist/features/viz/lib/graph/sankey.d.ts +44 -0
- package/dist/features/viz/lib/graph/sankey.js +341 -0
- package/dist/features/viz/lib/graph/sankey.js.map +7 -0
- package/dist/features/viz/lib/graph/shared.d.ts +59 -0
- package/dist/features/viz/lib/graph/shared.js +301 -0
- package/dist/features/viz/lib/graph/shared.js.map +7 -0
- package/dist/features/viz/lib/graph/tree.d.ts +11 -0
- package/dist/features/viz/lib/graph/tree.js +232 -0
- package/dist/features/viz/lib/graph/tree.js.map +7 -0
- package/dist/features/viz/lib/graph/treemap.d.ts +20 -0
- package/dist/features/viz/lib/graph/treemap.js +227 -0
- package/dist/features/viz/lib/graph/treemap.js.map +7 -0
- package/dist/features/viz/lib/graph/types.d.ts +1097 -0
- package/dist/features/viz/lib/hover-card.js +8 -9
- package/dist/features/viz/lib/hover-card.js.map +2 -2
- package/dist/features/viz/lib/hover-data.d.ts +1 -1
- package/dist/features/viz/lib/hover-data.js +6 -3
- package/dist/features/viz/lib/hover-data.js.map +2 -2
- package/dist/features/viz/lib/hover-types.d.ts +5 -5
- package/dist/features/viz/lib/interval-band-series.d.ts +49 -0
- package/dist/features/viz/lib/interval-band-series.js +136 -0
- package/dist/features/viz/lib/interval-band-series.js.map +7 -0
- package/dist/features/viz/lib/interval-diamond-series.d.ts +43 -0
- package/dist/features/viz/lib/interval-diamond-series.js +122 -0
- package/dist/features/viz/lib/interval-diamond-series.js.map +7 -0
- package/dist/features/viz/lib/interval-series.d.ts +79 -0
- package/dist/features/viz/lib/interval-series.js +158 -0
- package/dist/features/viz/lib/interval-series.js.map +7 -0
- package/dist/features/viz/lib/layout-pie.js +9 -13
- package/dist/features/viz/lib/layout-pie.js.map +2 -2
- package/dist/features/viz/lib/line-series.d.ts +1 -1
- package/dist/features/viz/lib/line-series.js +47 -28
- package/dist/features/viz/lib/line-series.js.map +2 -2
- package/dist/features/viz/lib/linear-scale-component.d.ts +7 -0
- package/dist/features/viz/lib/linear-scale-component.js +18 -0
- package/dist/features/viz/lib/linear-scale-component.js.map +7 -0
- package/dist/features/viz/lib/linear-scale.js +1 -1
- package/dist/features/viz/lib/linear-scale.js.map +2 -2
- package/dist/features/viz/lib/log-scale-component.d.ts +7 -0
- package/dist/features/viz/lib/log-scale-component.js +19 -0
- package/dist/features/viz/lib/log-scale-component.js.map +7 -0
- package/dist/features/viz/lib/log-scale.d.ts +2 -0
- package/dist/features/viz/lib/log-scale.js +53 -0
- package/dist/features/viz/lib/log-scale.js.map +7 -0
- package/dist/features/viz/lib/monotone-curve.d.ts +11 -0
- package/dist/features/viz/lib/monotone-curve.js +63 -0
- package/dist/features/viz/lib/monotone-curve.js.map +7 -0
- package/dist/features/viz/lib/nearest.d.ts +9 -9
- package/dist/features/viz/lib/nearest.js.map +1 -1
- package/dist/features/viz/lib/numeric-range-interpolation.d.ts +15 -0
- package/dist/features/viz/lib/numeric-range-interpolation.js +36 -0
- package/dist/features/viz/lib/numeric-range-interpolation.js.map +7 -0
- package/dist/features/viz/lib/numeric-ticks.d.ts +38 -0
- package/dist/features/viz/lib/numeric-ticks.js +54 -0
- package/dist/features/viz/lib/numeric-ticks.js.map +7 -0
- package/dist/features/viz/lib/ohlc-bar-series.d.ts +55 -0
- package/dist/features/viz/lib/ohlc-bar-series.js +168 -0
- package/dist/features/viz/lib/ohlc-bar-series.js.map +7 -0
- package/dist/features/viz/lib/paired-series.d.ts +44 -0
- package/dist/features/viz/lib/paired-series.js +93 -0
- package/dist/features/viz/lib/paired-series.js.map +7 -0
- package/dist/features/viz/lib/pie-layout.js +2 -1
- package/dist/features/viz/lib/pie-layout.js.map +2 -2
- package/dist/features/viz/lib/plot-series.js +11 -6
- package/dist/features/viz/lib/plot-series.js.map +2 -2
- package/dist/features/viz/lib/plot-types.d.ts +4 -3
- package/dist/features/viz/lib/point-scale-component.d.ts +7 -0
- package/dist/features/viz/lib/point-scale-component.js +19 -0
- package/dist/features/viz/lib/point-scale-component.js.map +7 -0
- package/dist/features/viz/lib/point-scale.d.ts +2 -0
- package/dist/features/viz/lib/point-scale.js +45 -0
- package/dist/features/viz/lib/point-scale.js.map +7 -0
- package/dist/features/viz/lib/point-series.d.ts +1 -1
- package/dist/features/viz/lib/point-series.js +36 -9
- package/dist/features/viz/lib/point-series.js.map +2 -2
- package/dist/features/viz/lib/point-types.d.ts +5 -2
- package/dist/features/viz/lib/reference-band.d.ts +16 -0
- package/dist/features/viz/lib/reference-band.js +30 -0
- package/dist/features/viz/lib/reference-band.js.map +7 -0
- package/dist/features/viz/lib/scale-adjust.js +9 -4
- package/dist/features/viz/lib/scale-adjust.js.map +2 -2
- package/dist/features/viz/lib/scale-context.d.ts +5 -4
- package/dist/features/viz/lib/scale-context.js +15 -11
- package/dist/features/viz/lib/scale-context.js.map +2 -2
- package/dist/features/viz/lib/scale-provider.d.ts +2 -0
- package/dist/features/viz/lib/scale-provider.js +13 -0
- package/dist/features/viz/lib/scale-provider.js.map +7 -0
- package/dist/features/viz/lib/scale-ticks.d.ts +5 -0
- package/dist/features/viz/lib/scale-ticks.js +64 -0
- package/dist/features/viz/lib/scale-ticks.js.map +7 -0
- package/dist/features/viz/lib/scale-view.d.ts +4 -0
- package/dist/features/viz/lib/scale-view.js +21 -0
- package/dist/features/viz/lib/scale-view.js.map +7 -0
- package/dist/features/viz/lib/sequential-color-scale.d.ts +11 -0
- package/dist/features/viz/lib/sequential-color-scale.js +49 -0
- package/dist/features/viz/lib/sequential-color-scale.js.map +7 -0
- package/dist/features/viz/lib/series-position.d.ts +12 -0
- package/dist/features/viz/lib/series-position.js +44 -0
- package/dist/features/viz/lib/series-position.js.map +7 -0
- package/dist/features/viz/lib/step-curves.d.ts +19 -0
- package/dist/features/viz/lib/step-curves.js +53 -0
- package/dist/features/viz/lib/step-curves.js.map +7 -0
- package/dist/features/viz/lib/symlog-scale-component.d.ts +7 -0
- package/dist/features/viz/lib/symlog-scale-component.js +19 -0
- package/dist/features/viz/lib/symlog-scale-component.js.map +7 -0
- package/dist/features/viz/lib/symlog-scale.d.ts +2 -0
- package/dist/features/viz/lib/symlog-scale.js +38 -0
- package/dist/features/viz/lib/symlog-scale.js.map +7 -0
- package/dist/features/viz/lib/threshold-color-scale.d.ts +43 -0
- package/dist/features/viz/lib/threshold-color-scale.js +59 -0
- package/dist/features/viz/lib/threshold-color-scale.js.map +7 -0
- package/dist/features/viz/lib/trading-time-mapping.d.ts +32 -0
- package/dist/features/viz/lib/trading-time-mapping.js +89 -0
- package/dist/features/viz/lib/trading-time-mapping.js.map +7 -0
- package/dist/features/viz/lib/trading-time-scale.d.ts +83 -0
- package/dist/features/viz/lib/trading-time-scale.js +96 -0
- package/dist/features/viz/lib/trading-time-scale.js.map +7 -0
- package/dist/features/viz/lib/trajectory-series.d.ts +71 -0
- package/dist/features/viz/lib/trajectory-series.js +111 -0
- package/dist/features/viz/lib/trajectory-series.js.map +7 -0
- package/dist/features/viz/lib/types.d.ts +114 -21
- package/dist/features/viz/lib/use-bar-scale.d.ts +8 -0
- package/dist/features/viz/lib/use-bar-scale.js +9 -0
- package/dist/features/viz/lib/use-bar-scale.js.map +7 -0
- package/dist/features/viz/lib/use-continuous-scale.d.ts +8 -0
- package/dist/features/viz/lib/use-continuous-scale.js +14 -0
- package/dist/features/viz/lib/use-continuous-scale.js.map +7 -0
- package/dist/features/viz/lib/use-linear-scale.d.ts +8 -0
- package/dist/features/viz/lib/use-linear-scale.js +9 -0
- package/dist/features/viz/lib/use-linear-scale.js.map +7 -0
- package/dist/features/viz/lib/use-log-scale.d.ts +8 -0
- package/dist/features/viz/lib/use-log-scale.js +9 -0
- package/dist/features/viz/lib/use-log-scale.js.map +7 -0
- package/dist/features/viz/lib/use-point-scale.d.ts +8 -0
- package/dist/features/viz/lib/use-point-scale.js +9 -0
- package/dist/features/viz/lib/use-point-scale.js.map +7 -0
- package/dist/features/viz/lib/use-symlog-scale.d.ts +8 -0
- package/dist/features/viz/lib/use-symlog-scale.js +9 -0
- package/dist/features/viz/lib/use-symlog-scale.js.map +7 -0
- package/dist/features/viz/lib/use-utc-scale.d.ts +8 -0
- package/dist/features/viz/lib/use-utc-scale.js +9 -0
- package/dist/features/viz/lib/use-utc-scale.js.map +7 -0
- package/dist/features/viz/lib/utc-labels.d.ts +12 -0
- package/dist/features/viz/lib/utc-labels.js +27 -0
- package/dist/features/viz/lib/utc-labels.js.map +7 -0
- package/dist/features/viz/lib/utc-scale-component.d.ts +7 -0
- package/dist/features/viz/lib/utc-scale-component.js +18 -0
- package/dist/features/viz/lib/utc-scale-component.js.map +7 -0
- package/dist/features/viz/lib/utc-scale.d.ts +21 -0
- package/dist/features/viz/lib/utc-scale.js +124 -0
- package/dist/features/viz/lib/utc-scale.js.map +7 -0
- package/dist/features/viz/lib/volume-series.d.ts +59 -0
- package/dist/features/viz/lib/volume-series.js +117 -0
- package/dist/features/viz/lib/volume-series.js.map +7 -0
- package/dist/features/viz/lib/weighted-point-series.d.ts +71 -0
- package/dist/features/viz/lib/weighted-point-series.js +169 -0
- package/dist/features/viz/lib/weighted-point-series.js.map +7 -0
- package/dist/filters/backdrop-contrast-gpu.d.ts +5 -0
- package/dist/filters/backdrop-contrast-gpu.js +33 -0
- package/dist/filters/backdrop-contrast-gpu.js.map +7 -0
- package/dist/filters/backdrop-contrast.d.ts +21 -0
- package/dist/filters/backdrop-contrast.js +61 -0
- package/dist/filters/backdrop-contrast.js.map +7 -0
- package/dist/filters/displacement.js +1 -1
- package/dist/filters/displacement.js.map +2 -2
- package/dist/filters/emboss-gpu.d.ts +4 -0
- package/dist/filters/emboss-gpu.js +39 -0
- package/dist/filters/emboss-gpu.js.map +7 -0
- package/dist/filters/emboss.d.ts +32 -0
- package/dist/filters/emboss.js +104 -0
- package/dist/filters/emboss.js.map +7 -0
- package/dist/filters/filter-executor.d.ts +11 -4
- package/dist/filters/filter-executor.js +104 -49
- package/dist/filters/filter-executor.js.map +2 -2
- package/dist/filters/reflected-light.js +1 -1
- package/dist/filters/reflected-light.js.map +2 -2
- package/dist/filters/reflection-gpu.d.ts +3 -1
- package/dist/filters/reflection-gpu.js +5 -2
- package/dist/filters/reflection-gpu.js.map +2 -2
- package/dist/filters/render-backdrop-contrast-boundary.d.ts +31 -0
- package/dist/filters/render-backdrop-contrast-boundary.js +116 -0
- package/dist/filters/render-backdrop-contrast-boundary.js.map +7 -0
- package/dist/filters/render-emboss-boundary.d.ts +13 -0
- package/dist/filters/render-emboss-boundary.js +131 -0
- package/dist/filters/render-emboss-boundary.js.map +7 -0
- package/dist/filters.d.ts +9 -5
- package/dist/filters.js +4 -0
- package/dist/filters.js.map +2 -2
- package/dist/index.d.ts +10 -6
- package/dist/index.js +18 -2
- package/dist/index.js.map +2 -2
- package/dist/internal.d.ts +4 -0
- package/dist/internal.js +6 -0
- package/dist/internal.js.map +2 -2
- package/dist/layout-kernel.d.ts +12 -0
- package/dist/layout-kernel.js +11 -0
- package/dist/layout-kernel.js.map +7 -0
- package/dist/layout-kernel.mjs +1 -0
- package/dist/lib/animation/definition.d.ts +5 -3
- package/dist/lib/animation/definition.js +29 -4
- package/dist/lib/animation/definition.js.map +2 -2
- package/dist/lib/animation/playback.d.ts +8 -0
- package/dist/lib/animation/playback.js +33 -11
- package/dist/lib/animation/playback.js.map +2 -2
- package/dist/lib/animation/spring.d.ts +3 -1
- package/dist/lib/animation/spring.js.map +2 -2
- package/dist/lib/animation/types.d.ts +29 -73
- package/dist/lib/backend/types.d.ts +13 -1
- package/dist/lib/backend/types.js.map +2 -2
- package/dist/lib/components/arc-geometry.js +2 -1
- package/dist/lib/components/arc-geometry.js.map +2 -2
- package/dist/lib/components/g.js +2 -0
- package/dist/lib/components/g.js.map +2 -2
- package/dist/lib/components/html-box.js +2 -1
- package/dist/lib/components/html-box.js.map +2 -2
- package/dist/lib/components/img.js +3 -3
- package/dist/lib/components/img.js.map +2 -2
- package/dist/lib/components/layer.js +98 -16
- package/dist/lib/components/layer.js.map +3 -3
- package/dist/lib/components/text.d.ts +16 -0
- package/dist/lib/components/text.js +131 -24
- package/dist/lib/components/text.js.map +2 -2
- package/dist/lib/define-primitive.d.ts +4 -2
- package/dist/lib/define-primitive.js +3 -1
- package/dist/lib/define-primitive.js.map +2 -2
- package/dist/lib/element/metadata.d.ts +9 -0
- package/dist/lib/element/metadata.js +19 -0
- package/dist/lib/element/metadata.js.map +2 -2
- package/dist/lib/element/resolve-primitive-inputs.d.ts +2 -0
- package/dist/lib/element/resolve-primitive-inputs.js +17 -4
- package/dist/lib/element/resolve-primitive-inputs.js.map +2 -2
- package/dist/lib/events/event-facade.d.ts +18 -0
- package/dist/lib/events/event-facade.js +28 -2
- package/dist/lib/events/event-facade.js.map +2 -2
- package/dist/lib/events/hit-test.js +2 -1
- package/dist/lib/events/hit-test.js.map +2 -2
- package/dist/lib/events/propagation.d.ts +2 -1
- package/dist/lib/events/propagation.js +22 -16
- package/dist/lib/events/propagation.js.map +2 -2
- package/dist/lib/events/registrations.d.ts +10 -0
- package/dist/lib/events/registrations.js +160 -5
- package/dist/lib/events/registrations.js.map +2 -2
- package/dist/lib/execute-render.js +25 -1
- package/dist/lib/execute-render.js.map +2 -2
- package/dist/lib/filter/filter-region.js +3 -10
- package/dist/lib/filter/filter-region.js.map +2 -2
- package/dist/lib/focus/focus-manager.d.ts +8 -1
- package/dist/lib/focus/focus-manager.js +87 -43
- package/dist/lib/focus/focus-manager.js.map +2 -2
- package/dist/lib/focus/geometry.d.ts +2 -0
- package/dist/lib/focus/geometry.js +6 -0
- package/dist/lib/focus/geometry.js.map +2 -2
- package/dist/lib/geometry/path-bend-guide.js +1 -1
- package/dist/lib/geometry/path-bend-guide.js.map +2 -2
- package/dist/lib/geometry/path-geometry.js +12 -11
- package/dist/lib/geometry/path-geometry.js.map +2 -2
- package/dist/lib/geometry/path-transforms.js +17 -21
- package/dist/lib/geometry/path-transforms.js.map +2 -2
- package/dist/lib/geometry/path-warp-bezier.js +3 -1
- package/dist/lib/geometry/path-warp-bezier.js.map +2 -2
- package/dist/lib/geometry/path-warp.js +1 -1
- package/dist/lib/geometry/path-warp.js.map +2 -2
- package/dist/lib/global-state.js +2 -0
- package/dist/lib/global-state.js.map +2 -2
- package/dist/lib/hooks/use-animated-value.d.ts +11 -21
- package/dist/lib/hooks/use-animated-value.js +23 -70
- package/dist/lib/hooks/use-animated-value.js.map +3 -3
- package/dist/lib/hooks/use-playback.js +1 -0
- package/dist/lib/hooks/use-playback.js.map +2 -2
- package/dist/lib/html/html-events.d.ts +32 -0
- package/dist/lib/html/html-events.js +179 -0
- package/dist/lib/html/html-events.js.map +7 -0
- package/dist/lib/html/html-service.d.ts +8 -2
- package/dist/lib/html/html-service.js +198 -65
- package/dist/lib/html/html-service.js.map +2 -2
- package/dist/lib/html/overlay-config.js +7 -6
- package/dist/lib/html/overlay-config.js.map +2 -2
- package/dist/lib/html/types.d.ts +29 -2
- package/dist/lib/layout/absolute.d.ts +11 -5
- package/dist/lib/layout/absolute.js +329 -55
- package/dist/lib/layout/absolute.js.map +3 -3
- package/dist/lib/layout/allocation-checkpoint-owner.d.ts +11 -0
- package/dist/lib/layout/allocation-checkpoint-owner.js +86 -0
- package/dist/lib/layout/allocation-checkpoint-owner.js.map +7 -0
- package/dist/lib/layout/allocation-checkpoint.d.ts +53 -0
- package/dist/lib/layout/allocation-checkpoint.js +463 -0
- package/dist/lib/layout/allocation-checkpoint.js.map +7 -0
- package/dist/lib/layout/allocation-dependencies.d.ts +30 -0
- package/dist/lib/layout/allocation-dependencies.js +90 -0
- package/dist/lib/layout/allocation-dependencies.js.map +7 -0
- package/dist/lib/layout/allocation-revision.d.ts +13 -0
- package/dist/lib/layout/allocation-revision.js +67 -0
- package/dist/lib/layout/allocation-revision.js.map +7 -0
- package/dist/lib/layout/box-insets.d.ts +17 -0
- package/dist/lib/layout/box-insets.js +138 -0
- package/dist/lib/layout/box-insets.js.map +7 -0
- package/dist/lib/layout/box-sizing.d.ts +16 -0
- package/dist/lib/layout/box-sizing.js +77 -0
- package/dist/lib/layout/box-sizing.js.map +7 -0
- package/dist/lib/layout/box.js +42 -12
- package/dist/lib/layout/box.js.map +2 -2
- package/dist/lib/layout/canvas-measurement.d.ts +13 -0
- package/dist/lib/layout/canvas-measurement.js +57 -0
- package/dist/lib/layout/canvas-measurement.js.map +7 -0
- package/dist/lib/layout/context.d.ts +35 -6
- package/dist/lib/layout/context.js +72 -3
- package/dist/lib/layout/context.js.map +2 -2
- package/dist/lib/layout/define-layout-component.d.ts +23 -0
- package/dist/lib/layout/define-layout-component.js +84 -0
- package/dist/lib/layout/define-layout-component.js.map +7 -0
- package/dist/lib/layout/flex-allocation-cache.d.ts +42 -0
- package/dist/lib/layout/flex-baseline-mode.d.ts +2 -0
- package/dist/lib/layout/flex-baseline-mode.js +7 -0
- package/dist/lib/layout/flex-baseline-mode.js.map +7 -0
- package/dist/lib/layout/flex.d.ts +50 -15
- package/dist/lib/layout/flex.js +2124 -195
- package/dist/lib/layout/flex.js.map +3 -3
- package/dist/lib/layout/flow.js +225 -49
- package/dist/lib/layout/flow.js.map +2 -2
- package/dist/lib/layout/geometry-publication.d.ts +53 -0
- package/dist/lib/layout/geometry-publication.js +244 -0
- package/dist/lib/layout/geometry-publication.js.map +7 -0
- package/dist/lib/layout/grid-kernel.d.ts +63 -0
- package/dist/lib/layout/grid-kernel.js +168 -0
- package/dist/lib/layout/grid-kernel.js.map +7 -0
- package/dist/lib/layout/grid.d.ts +63 -4
- package/dist/lib/layout/grid.js +767 -171
- package/dist/lib/layout/grid.js.map +3 -3
- package/dist/lib/layout/measure.d.ts +55 -3
- package/dist/lib/layout/measure.js +448 -15
- package/dist/lib/layout/measure.js.map +2 -2
- package/dist/lib/layout/overlay.js +81 -23
- package/dist/lib/layout/overlay.js.map +2 -2
- package/dist/lib/layout/participation.d.ts +27 -0
- package/dist/lib/layout/participation.js +188 -0
- package/dist/lib/layout/participation.js.map +7 -0
- package/dist/lib/layout/place-child.js +1 -1
- package/dist/lib/layout/place-child.js.map +2 -2
- package/dist/lib/layout/positioning-diagnostics.d.ts +1 -1
- package/dist/lib/layout/positioning-diagnostics.js +13 -2
- package/dist/lib/layout/positioning-diagnostics.js.map +2 -2
- package/dist/lib/layout/prepared-root.d.ts +121 -0
- package/dist/lib/layout/prepared-root.js +360 -0
- package/dist/lib/layout/prepared-root.js.map +7 -0
- package/dist/lib/layout/standalone-kernel.d.ts +60 -0
- package/dist/lib/layout/standalone-kernel.js +722 -0
- package/dist/lib/layout/standalone-kernel.js.map +7 -0
- package/dist/lib/layout/topology.d.ts +21 -0
- package/dist/lib/layout/topology.js +113 -0
- package/dist/lib/layout/topology.js.map +7 -0
- package/dist/lib/layout/types.d.ts +5 -0
- package/dist/lib/layout/wasm/artifact.d.ts +1 -0
- package/dist/lib/layout/wasm/artifact.js +5 -0
- package/dist/lib/layout/wasm/artifact.js.map +7 -0
- package/dist/lib/layout/wasm/bytes.d.ts +1 -0
- package/dist/lib/layout/wasm/bytes.js +5 -0
- package/dist/lib/layout/wasm/bytes.js.map +7 -0
- package/dist/lib/layout/wasm/embedded.d.ts +2 -0
- package/dist/lib/layout/wasm/embedded.js +12 -0
- package/dist/lib/layout/wasm/embedded.js.map +7 -0
- package/dist/lib/layout/wasm/layout.wasm +0 -0
- package/dist/lib/layout/wasm/module.d.ts +8 -0
- package/dist/lib/layout/wasm/module.js +70 -0
- package/dist/lib/layout/wasm/module.js.map +7 -0
- package/dist/lib/layout/wasm/region.d.ts +267 -0
- package/dist/lib/layout/wasm/region.js +1018 -0
- package/dist/lib/layout/wasm/region.js.map +7 -0
- package/dist/lib/manipulation/controller.js +4 -7
- package/dist/lib/manipulation/controller.js.map +2 -2
- package/dist/lib/manipulation/frame.js +1 -1
- package/dist/lib/manipulation/frame.js.map +2 -2
- package/dist/lib/manipulation/handles.js +32 -33
- package/dist/lib/manipulation/handles.js.map +2 -2
- package/dist/lib/manipulation/solve.js +12 -10
- package/dist/lib/manipulation/solve.js.map +2 -2
- package/dist/lib/mount-pibbl.js +1 -0
- package/dist/lib/mount-pibbl.js.map +2 -2
- package/dist/lib/mount-prepared-pibbl.d.ts +5 -0
- package/dist/lib/mount-prepared-pibbl.js +29 -0
- package/dist/lib/mount-prepared-pibbl.js.map +7 -0
- package/dist/lib/mount-request.d.ts +8 -0
- package/dist/lib/mount-request.js +41 -0
- package/dist/lib/mount-request.js.map +7 -0
- package/dist/lib/pibbl.d.ts +21 -13
- package/dist/lib/pibbl.js +18 -16
- package/dist/lib/pibbl.js.map +2 -2
- package/dist/lib/recording/recording.d.ts +43 -0
- package/dist/lib/recording/recording.js +555 -0
- package/dist/lib/recording/recording.js.map +7 -0
- package/dist/lib/recording/types.d.ts +118 -0
- package/dist/lib/recording/wasm-bytes.d.ts +1 -0
- package/dist/lib/recording/wasm-bytes.js +5 -0
- package/dist/lib/recording/wasm-bytes.js.map +7 -0
- package/dist/lib/recording/worker-source.d.ts +1 -0
- package/dist/lib/recording/worker-source.js +5 -0
- package/dist/lib/recording/worker-source.js.map +7 -0
- package/dist/lib/render-layer/controller.d.ts +9 -3
- package/dist/lib/render-layer/controller.js +259 -110
- package/dist/lib/render-layer/controller.js.map +2 -2
- package/dist/lib/render-transaction.d.ts +12 -2
- package/dist/lib/render-transaction.js +69 -1
- package/dist/lib/render-transaction.js.map +2 -2
- package/dist/lib/render.js +32 -8
- package/dist/lib/render.js.map +2 -2
- package/dist/lib/scheduler/realm-scheduler.d.ts +2 -0
- package/dist/lib/scheduler/realm-scheduler.js +55 -26
- package/dist/lib/scheduler/realm-scheduler.js.map +2 -2
- package/dist/lib/scheduler/renderer-participant.js +1 -0
- package/dist/lib/scheduler/renderer-participant.js.map +2 -2
- package/dist/lib/series-inspection-frame.d.ts +18 -0
- package/dist/lib/series-inspection-frame.js +70 -0
- package/dist/lib/series-inspection-frame.js.map +7 -0
- package/dist/lib/signals/edge.d.ts +7 -4
- package/dist/lib/signals/edge.js +25 -3
- package/dist/lib/signals/edge.js.map +2 -2
- package/dist/lib/signals/graph.d.ts +16 -2
- package/dist/lib/signals/graph.js +54 -12
- package/dist/lib/signals/graph.js.map +2 -2
- package/dist/lib/signals/input-provision.d.ts +15 -0
- package/dist/lib/signals/input-provision.js +53 -3
- package/dist/lib/signals/input-provision.js.map +2 -2
- package/dist/lib/signals/render-consumer.d.ts +3 -0
- package/dist/lib/signals/render-consumer.js +22 -14
- package/dist/lib/signals/render-consumer.js.map +2 -2
- package/dist/lib/style/positioning.d.ts +50 -2
- package/dist/lib/style/positioning.js +28 -4
- package/dist/lib/style/positioning.js.map +2 -2
- package/dist/lib/style/resolve-built-in.d.ts +4 -3
- package/dist/lib/style/resolve-built-in.js +17 -3
- package/dist/lib/style/resolve-built-in.js.map +2 -2
- package/dist/lib/style/resolve-dispatch.d.ts +3 -0
- package/dist/lib/style/resolve-dispatch.js +77 -4
- package/dist/lib/style/resolve-dispatch.js.map +2 -2
- package/dist/lib/style/resolve-length.d.ts +2 -0
- package/dist/lib/style/resolve-length.js +13 -9
- package/dist/lib/style/resolve-length.js.map +2 -2
- package/dist/lib/style/sizing-length.d.ts +51 -0
- package/dist/lib/style/sizing-length.js +77 -0
- package/dist/lib/style/sizing-length.js.map +7 -0
- package/dist/lib/style/types.d.ts +63 -25
- package/dist/lib/surface/root-surface.js +10 -6
- package/dist/lib/surface/root-surface.js.map +2 -2
- package/dist/lib/textures/texture.js +10 -8
- package/dist/lib/textures/texture.js.map +2 -2
- package/dist/lib/transitions/capture.js +4 -1
- package/dist/lib/transitions/capture.js.map +2 -2
- package/dist/lib/transitions/embers-physics.js +17 -10
- package/dist/lib/transitions/embers-physics.js.map +2 -2
- package/dist/lib/types.d.ts +110 -1
- package/dist/sync.d.ts +16 -0
- package/dist/sync.js +13 -0
- package/dist/sync.js.map +7 -0
- package/dist/sync.mjs +1 -0
- package/package.json +43 -6
- package/dist/features/viz/lib/scale.d.ts +0 -11
- package/dist/features/viz/lib/scale.js +0 -80
- package/dist/features/viz/lib/scale.js.map +0 -7
- package/dist/features/viz/lib/use-scale.d.ts +0 -20
- package/dist/features/viz/lib/use-scale.js +0 -10
- package/dist/features/viz/lib/use-scale.js.map +0 -7
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/features/viz/lib/editable-chart-elements.tsx"],
|
|
4
|
+
"sourcesContent": ["import {\n Line,\n Rectangle,\n definePrimitive,\n resolveSignalValue,\n useRef,\n useSignal,\n type PibblNodeInput,\n type PibblRef,\n type SignalValue,\n} from \"@pibbl/core\";\nimport {\n pibblInternalCurrentWorldTransform,\n type SignalStyle,\n} from \"@pibbl/core/internal\";\nimport type {\n PibblEventTarget,\n PibblKeyboardEvent,\n PibblPointerEvent,\n} from \"@pibbl/core\";\nimport type { ScaleId } from \"./types.js\";\nimport { lookupScale } from \"./scale-context.js\";\n\n/** One numeric x/y domain anchor for {@link EditableTrendLine}. */\nexport interface ChartAnchor {\n /** X-scale domain value; an exact supplied timestamp for a trading-time x scale. */\n readonly x: number;\n /** Y-scale numeric domain value. */\n readonly y: number;\n}\n/** Paint and hit-area fields shared by {@link RangeNavigator} and editable annotations. */\nexport interface EditableChartStyle {\n /** Fill for navigator and reference-band interiors. */\n readonly fill?: string;\n /** Stroke color for visible annotation geometry. */\n readonly stroke?: string;\n /** Positive width of visible strokes. */\n readonly strokeWidth?: number;\n /** Annotation opacity from zero through one; handles remain fully opaque. */\n readonly opacity?: number;\n /** Fill color for visible drag handles. */\n readonly handleFill?: string;\n /** Stroke color for visible drag handles. */\n readonly handleStroke?: string;\n /** Positive square size of the painted handle. */\n readonly handleSize?: number;\n /** Positive width and height of each invisible pointer hit region. */\n readonly hitSize?: number;\n}\n/** {@link EditableChartStyle} accepted by {@link RangeNavigator}. */\nexport interface RangeNavigatorStyle extends EditableChartStyle {}\n/** {@link EditableChartStyle} accepted by {@link EditableReferenceLine}. */\nexport interface EditableReferenceLineStyle extends EditableChartStyle {}\n/** {@link EditableChartStyle} accepted by {@link EditableReferenceBand}. */\nexport interface EditableReferenceBandStyle extends EditableChartStyle {}\n/** {@link EditableChartStyle} accepted by {@link EditableTrendLine}. */\nexport interface EditableTrendLineStyle extends EditableChartStyle {}\ntype Pair = readonly [number, number];\ntype StyleInput<S extends EditableChartStyle> = SignalValue<SignalStyle<S>>;\ntype Change<T> = (value: T) => void;\n/** Controlled inputs and callbacks for {@link RangeNavigator}. */\nexport interface RangeNavigatorProps {\n /** ID of an ancestor invertible numeric continuous scale. */\n readonly scale: ScaleId;\n /** Controlled numeric interval in the scale domain. */\n readonly values: SignalValue<Pair>;\n /** Perpendicular local-coordinate start and end for the navigator strip. */\n readonly span: SignalValue<Pair>;\n /** Minimum numeric distance between interval endpoints; defaults to zero. */\n readonly minimumSpan?: number;\n /** Receives each synchronous controlled drag or keyboard interval. */\n readonly onChange: Change<Pair>;\n /** Receives the final interval after a completed pointer or keyboard edit. */\n readonly onCommit?: Change<Pair>;\n /** Runs after a cancelled interaction restores its starting interval. */\n readonly onCancel?: () => void;\n /** Optional annotation and handle paint inputs. */\n readonly style?: StyleInput<RangeNavigatorStyle>;\n}\n/** Controlled inputs and callbacks for {@link EditableReferenceLine}. */\nexport interface EditableReferenceLineProps {\n /** ID of an ancestor invertible numeric continuous scale. */\n readonly scale: ScaleId;\n /** Axis perpendicular to the drawn line and edited value. */\n readonly direction: \"horizontal\" | \"vertical\";\n /** Controlled numeric value in the scale domain. */\n readonly value: SignalValue<number>;\n /** Local-coordinate extent of the line along its non-edited axis. */\n readonly span: SignalValue<Pair>;\n /** Whether endpoint-independent handle geometry is drawn; defaults to true. */\n readonly selected?: SignalValue<boolean>;\n /** Finite positive numeric domain increment for arrow-key edits. */\n readonly keyboardStep: number;\n /** Runs when a pointer or keyboard interaction selects the line. */\n readonly onSelect?: () => void;\n /** Receives each synchronous controlled drag or keyboard value. */\n readonly onChange: Change<number>;\n /** Receives the final value after a completed pointer or keyboard edit. */\n readonly onCommit?: Change<number>;\n /** Runs after a cancelled interaction restores its starting value. */\n readonly onCancel?: () => void;\n /** Optional line and handle paint inputs. */\n readonly style?: StyleInput<EditableReferenceLineStyle>;\n}\n/** Controlled inputs and callbacks for {@link EditableReferenceBand}. */\nexport interface EditableReferenceBandProps {\n /** ID of an ancestor invertible numeric continuous scale. */\n readonly scale: ScaleId;\n /** Axis perpendicular to the band and edited interval. */\n readonly direction: \"horizontal\" | \"vertical\";\n /** Controlled numeric interval in the scale domain. */\n readonly values: SignalValue<Pair>;\n /** Local-coordinate extent of the band along its non-edited axis. */\n readonly span: SignalValue<Pair>;\n /** Whether resize handles are drawn; defaults to true. */\n readonly selected?: SignalValue<boolean>;\n /** Finite positive numeric domain increment for arrow-key panning. */\n readonly keyboardStep: number;\n /** Minimum numeric distance between interval endpoints; defaults to zero. */\n readonly minimumSpan?: number;\n /** Runs when a pointer or keyboard interaction selects the band. */\n readonly onSelect?: () => void;\n /** Receives each synchronous controlled drag or keyboard interval. */\n readonly onChange: Change<Pair>;\n /** Receives the final interval after a completed pointer or keyboard edit. */\n readonly onCommit?: Change<Pair>;\n /** Runs after a cancelled interaction restores its starting interval. */\n readonly onCancel?: () => void;\n /** Optional band and handle paint inputs. */\n readonly style?: StyleInput<EditableReferenceBandStyle>;\n}\n/** Controlled inputs and callbacks for {@link EditableTrendLine}. */\nexport interface EditableTrendLineProps {\n /** ID of an ancestor numeric or TradingTimeScale x mapping. */\n readonly xScale: ScaleId;\n /** ID of an ancestor invertible numeric y mapping. */\n readonly yScale: ScaleId;\n /** Controlled pair of domain anchors forming the line. */\n readonly anchors: SignalValue<readonly [ChartAnchor, ChartAnchor]>;\n /** Whether endpoint handles are drawn; defaults to true. */\n readonly selected?: SignalValue<boolean>;\n /** Finite positive x and y increments for arrow-key translation. */\n readonly keyboardStep: {\n /** Numeric-domain or timestamp increment for x translation. */\n readonly x: number;\n /** Numeric-domain increment for y translation. */\n readonly y: number;\n };\n /** Runs when a pointer or keyboard interaction selects the trend line. */\n readonly onSelect?: () => void;\n /** Receives each synchronous controlled drag or keyboard anchor pair. */\n readonly onChange: Change<readonly [ChartAnchor, ChartAnchor]>;\n /** Receives final anchors after a completed pointer or keyboard edit. */\n readonly onCommit?: Change<readonly [ChartAnchor, ChartAnchor]>;\n /** Runs after a cancelled interaction restores its starting anchors. */\n readonly onCancel?: () => void;\n /** Optional line and handle paint inputs. */\n readonly style?: StyleInput<EditableTrendLineStyle>;\n}\n\ntype Scale = {\n readonly type: string;\n readonly domain: readonly number[];\n readonly range: Pair;\n map(value: number): number;\n invert?(position: number): number;\n nearestTimeAtPosition?(position: number): number | undefined;\n slotAtTime?(time: number): number | undefined;\n timeAtSlot?(slot: number): number | undefined;\n};\ntype Point = Readonly<{ x: number; y: number }>;\ntype Draft<T, M extends string> = Readonly<{\n pointerId: number;\n target: PibblEventTarget;\n inverse: DOMMatrix;\n start: Point;\n original: T;\n last: T;\n mode: M;\n /** Resolved scale instances at pointer-down, stable for the transaction. */\n scales: readonly Scale[];\n}>;\ntype DraftSignal<T, M extends string> = ReturnType<\n typeof useSignal<Draft<T, M> | null>\n>;\ninterface TransformCaptureProps {\n readonly capture: PibblRef<DOMMatrix>;\n readonly children: PibblNodeInput;\n}\nconst TransformCapture = definePrimitive<TransformCaptureProps>(\n function TransformCapture(props) {\n props.capture.current = pibblInternalCurrentWorldTransform();\n return props.children;\n },\n { childInput: \"structural\" },\n);\n\nfunction pair(value: unknown, name: string): Pair {\n if (\n !Array.isArray(value) ||\n value.length !== 2 ||\n !value.every(Number.isFinite)\n )\n throw new RangeError(`${name} requires two finite values.`);\n return value as unknown as Pair;\n}\nfunction positive(value: number, name: string) {\n if (!Number.isFinite(value) || value <= 0)\n throw new RangeError(`${name} must be finite and positive.`);\n return value;\n}\nfunction nonnegative(value: number, name: string) {\n if (!Number.isFinite(value) || value < 0)\n throw new RangeError(`${name} must be finite and non-negative.`);\n return value;\n}\nfunction clamp(value: number, values: readonly number[]) {\n return Math.max(Math.min(...values), Math.min(Math.max(...values), value));\n}\nfunction clip(value: number, scale: Scale) {\n return clamp(value, scale.domain);\n}\nfunction range(\n first: number,\n second: number,\n viewport: Pair,\n): Pair | undefined {\n const low = Math.max(Math.min(first, second), Math.min(...viewport)),\n high = Math.min(Math.max(first, second), Math.max(...viewport));\n return high < low ? undefined : [low, high];\n}\nfunction style<S extends EditableChartStyle>(\n input: StyleInput<S> | undefined,\n): Required<EditableChartStyle> {\n const source = resolveSignalValue(input ?? {}) as SignalStyle<S>;\n const opacity = resolveSignalValue(source.opacity) ?? 1,\n strokeWidth = resolveSignalValue(source.strokeWidth) ?? 1.5,\n handleSize = resolveSignalValue(source.handleSize) ?? 8,\n hitSize = resolveSignalValue(source.hitSize) ?? 20;\n if (!Number.isFinite(opacity) || opacity < 0 || opacity > 1)\n throw new RangeError(\n \"Editable chart style opacity must be finite from zero through one.\",\n );\n positive(strokeWidth, \"Editable chart style strokeWidth\");\n positive(handleSize, \"Editable chart style handleSize\");\n positive(hitSize, \"Editable chart style hitSize\");\n const fill = resolveSignalValue(source.fill) ?? \"#2563eb\",\n stroke = resolveSignalValue(source.stroke) ?? \"#2563eb\",\n handleFill = resolveSignalValue(source.handleFill) ?? fill,\n handleStroke = resolveSignalValue(source.handleStroke) ?? stroke;\n for (const [name, value] of Object.entries({\n fill,\n stroke,\n handleFill,\n handleStroke,\n }))\n if (typeof value !== \"string\")\n throw new TypeError(`Editable chart style ${name} must be a string.`);\n return {\n fill,\n stroke,\n strokeWidth,\n opacity,\n handleFill,\n handleStroke,\n handleSize,\n hitSize,\n };\n}\nfunction scale(\n id: ScaleId,\n receiver: string,\n options: Readonly<{ allowTradingTime?: boolean }> = {},\n): Scale {\n const source = lookupScale(id, receiver);\n if (!source)\n throw new TypeError(`${receiver} requires an ancestor scale ID.`);\n const value = source.get() as Scale;\n if (value.type === \"point\" || value.type === \"band\")\n throw new TypeError(`${receiver} requires a continuous scale.`);\n if (value.type === \"trading-time\" && !options.allowTradingTime)\n throw new TypeError(\n `${receiver} requires an invertible numeric continuous scale, not TradingTimeScale.`,\n );\n if (\n !Array.isArray(value.domain) ||\n value.domain.length < 2 ||\n !value.domain.every(Number.isFinite) ||\n !Array.isArray(value.range) ||\n value.range.length !== 2 ||\n !value.range.every(Number.isFinite) ||\n typeof value.map !== \"function\"\n )\n throw new TypeError(`${receiver} requires a finite numeric scale.`);\n if (value.type !== \"trading-time\" && typeof value.invert !== \"function\")\n throw new TypeError(`${receiver} requires an invertible continuous scale.`);\n if (\n value.type === \"trading-time\" &&\n (!value.nearestTimeAtPosition || !value.slotAtTime || !value.timeAtSlot)\n )\n throw new TypeError(`${receiver} requires a TradingTimeScale mapping.`);\n return value;\n}\nfunction local(\n inverse: DOMMatrix,\n event: Pick<PibblPointerEvent, \"x\" | \"y\">,\n): Point {\n const point = inverse.transformPoint(new DOMPoint(event.x, event.y));\n if (!Number.isFinite(point.x) || !Number.isFinite(point.y))\n throw new RangeError(\n \"Editable chart interaction requires an invertible finite transform.\",\n );\n return point;\n}\nfunction begin<T, M extends string>(\n state: DraftSignal<T, M>,\n event: PibblPointerEvent,\n original: T,\n mode: M,\n world: DOMMatrix | undefined,\n scales: readonly Scale[],\n) {\n if (!world || state.get()) return;\n const inverse = world.inverse(),\n draft: Draft<T, M> = {\n pointerId: event.pointerId,\n target: event.currentTarget,\n inverse,\n start: local(inverse, event),\n original,\n last: original,\n mode,\n scales: [...scales],\n };\n state.set(draft);\n event.currentTarget.setPointerCapture(event.pointerId);\n event.stopPropagation();\n}\nfunction publish<T, M extends string>(\n state: DraftSignal<T, M>,\n active: Draft<T, M>,\n next: T,\n onChange: Change<T>,\n) {\n onChange(next);\n state.set({ ...active, last: next });\n}\nfunction release<T, M extends string>(\n state: DraftSignal<T, M>,\n active: Draft<T, M>,\n) {\n // Native release may synchronously dispatch lostpointercapture. Clear the\n // transaction first so an intentional release cannot roll itself back.\n state.set(null);\n if (active.target.hasPointerCapture(active.pointerId))\n active.target.releasePointerCapture(active.pointerId);\n}\nfunction keys(\n event: PibblKeyboardEvent,\n cancel: () => void,\n edit: (sign: number) => void,\n) {\n if (event.key === \"Escape\") {\n event.preventDefault();\n cancel();\n return;\n }\n const sign =\n event.key === \"ArrowLeft\" || event.key === \"ArrowDown\"\n ? -1\n : event.key === \"ArrowRight\" || event.key === \"ArrowUp\"\n ? 1\n : 0;\n if (sign) {\n event.preventDefault();\n edit(sign);\n }\n}\nfunction edge(\n values: Pair,\n which: \"first\" | \"second\",\n value: number,\n minimum: number,\n source: Scale,\n bounded: boolean,\n): Pair {\n const [first, second] = values;\n const domainLow = Math.min(...source.domain),\n domainHigh = Math.max(...source.domain);\n if (which === \"first\") {\n const limit = first <= second ? second - minimum : second + minimum;\n return [\n first <= second\n ? bounded\n ? clamp(value, [domainLow, limit])\n : Math.min(value, limit)\n : bounded\n ? clamp(value, [limit, domainHigh])\n : Math.max(value, limit),\n second,\n ];\n }\n const limit = first <= second ? first + minimum : first - minimum;\n return [\n first,\n first <= second\n ? bounded\n ? clamp(value, [limit, domainHigh])\n : Math.max(value, limit)\n : bounded\n ? clamp(value, [domainLow, limit])\n : Math.min(value, limit),\n ];\n}\nfunction pan(\n values: Pair,\n delta: number,\n source: Scale,\n bounded: boolean,\n): Pair {\n if (!bounded) return [values[0] + delta, values[1] + delta];\n const low = Math.min(...values),\n high = Math.max(...values),\n permitted = clamp(delta, [\n Math.min(...source.domain) - low,\n Math.max(...source.domain) - high,\n ]);\n return [values[0] + permitted, values[1] + permitted];\n}\nfunction minimumMappedDelta(\n points: Pair,\n requested: number,\n source: Scale,\n minimum: number,\n) {\n if (!minimum) return requested;\n const width = (delta: number) =>\n Math.abs(\n source.invert!(points[1] + delta) - source.invert!(points[0] + delta),\n );\n let previous = 0;\n for (let index = 1; index <= 64; index++) {\n const candidate = (requested * index) / 64;\n if (width(candidate) >= minimum) {\n previous = candidate;\n continue;\n }\n let low = previous,\n high = candidate;\n for (let iteration = 0; iteration < 40; iteration++) {\n const middle = (low + high) / 2;\n if (width(middle) >= minimum) low = middle;\n else high = middle;\n }\n return low;\n }\n return requested;\n}\nfunction panMapped(\n values: Pair,\n requested: number,\n source: Scale,\n bounded: boolean,\n minimum: number,\n): Pair {\n const positions: Pair = [source.map(values[0]), source.map(values[1])],\n viewportDelta = bounded\n ? sharedMappedDelta(positions, requested, source.range)\n : requested,\n delta = minimumMappedDelta(positions, viewportDelta, source, minimum);\n if (bounded)\n return [\n clip(source.invert!(positions[0] + delta), source),\n clip(source.invert!(positions[1] + delta), source),\n ];\n return [\n source.invert!(positions[0] + delta),\n source.invert!(positions[1] + delta),\n ];\n}\nfunction navigatorInterval(\n values: Pair,\n minimum: number,\n source: Scale,\n receiver: string,\n) {\n const domainLow = Math.min(...source.domain),\n domainHigh = Math.max(...source.domain),\n domainSpan = domainHigh - domainLow;\n if (minimum > domainSpan)\n throw new RangeError(\n `${receiver} minimumSpan cannot exceed its scale domain span.`,\n );\n if (values.some((value) => value < domainLow || value > domainHigh))\n throw new RangeError(\n `${receiver} values must lie within its scale domain.`,\n );\n if (Math.abs(values[1] - values[0]) < minimum)\n throw new RangeError(`${receiver} values must meet minimumSpan.`);\n}\nfunction annotationInterval(values: Pair, minimum: number, receiver: string) {\n if (Math.abs(values[1] - values[0]) < minimum)\n throw new RangeError(`${receiver} values must meet minimumSpan.`);\n}\nfunction handle(\n x: number,\n y: number,\n paint: Required<EditableChartStyle>,\n handlers: Record<string, unknown>,\n) {\n const visual = {\n left: x - paint.handleSize / 2,\n top: y - paint.handleSize / 2,\n width: paint.handleSize,\n height: paint.handleSize,\n },\n hit = {\n left: x - paint.hitSize / 2,\n top: y - paint.hitSize / 2,\n width: paint.hitSize,\n height: paint.hitSize,\n };\n return (\n <>\n <Rectangle\n pointerEvents=\"none\"\n style={{\n ...visual,\n fill: paint.handleFill,\n stroke: paint.handleStroke,\n strokeWidth: paint.strokeWidth,\n opacity: 1,\n }}\n />\n <Rectangle\n {...handlers}\n keyboardFocusable\n style={{ ...hit, fill: \"rgba(0,0,0,0)\", cursor: \"grab\" }}\n />\n </>\n );\n}\nfunction sharedMappedDelta(\n points: readonly number[],\n requested: number,\n viewport: Pair,\n) {\n return clamp(requested, [\n Math.min(...viewport) - Math.min(...points),\n Math.max(...viewport) - Math.max(...points),\n ]);\n}\n\n/**\n * Renders a controlled overview interval with pan and edge-resize handles.\n *\n * @param props - Controlled range inputs and callbacks; see {@link RangeNavigatorProps}.\n * @returns Navigator geometry, handles, or no geometry when outside the visible scale range.\n * @see {@link EditableReferenceBand} for a directional plot interval.\n */\nexport function RangeNavigator(props: RangeNavigatorProps) {\n const values = pair(\n resolveSignalValue(props.values),\n \"RangeNavigator values\",\n ),\n span = pair(resolveSignalValue(props.span), \"RangeNavigator span\"),\n source = scale(props.scale, \"RangeNavigator\"),\n paint = style(props.style),\n minimum = nonnegative(props.minimumSpan ?? 0, \"RangeNavigator minimumSpan\"),\n draft = useSignal<Draft<Pair, \"pan\" | \"first\" | \"second\"> | null>(null),\n transform = useRef<DOMMatrix>();\n navigatorInterval(values, minimum, source, \"RangeNavigator\");\n const first = source.map(values[0]),\n second = source.map(values[1]),\n visible = range(first, second, source.range);\n const cancel = () => {\n const active = draft.get();\n if (!active) return;\n props.onChange(active.original);\n release(draft, active);\n props.onCancel?.();\n };\n const down =\n (mode: \"pan\" | \"first\" | \"second\") => (event: PibblPointerEvent) =>\n begin(draft, event, values, mode, transform.current, [source]);\n const move = (event: PibblPointerEvent) => {\n const active = draft.get();\n if (!active || active.pointerId !== event.pointerId) return;\n const point = local(active.inverse, event),\n captured = active.scales[0]!,\n next =\n active.mode === \"pan\"\n ? panMapped(\n active.original,\n point.x - active.start.x,\n captured,\n true,\n minimum,\n )\n : edge(\n active.original,\n active.mode,\n captured.invert!(point.x),\n minimum,\n captured,\n true,\n );\n publish(draft, active, next, props.onChange);\n event.stopPropagation();\n };\n const up = (event: PibblPointerEvent) => {\n const active = draft.get();\n if (!active || active.pointerId !== event.pointerId) return;\n release(draft, active);\n props.onCommit?.(active.last);\n event.stopPropagation();\n };\n if (!visible) return null;\n const top = Math.min(...span),\n height = Math.abs(span[1] - span[0]),\n center = top + height / 2;\n const edit = (sign: number) => {\n const keyboardStep =\n minimum || Math.abs(source.domain[1]! - source.domain[0]!) * 0.01,\n next = pan(values, sign * keyboardStep, source, true);\n props.onChange(next);\n props.onCommit?.(next);\n };\n const handleKeys = (event: PibblKeyboardEvent) => keys(event, cancel, edit);\n return (\n <TransformCapture capture={transform}>\n <Rectangle\n keyboardFocusable\n onPointerDown={down(\"pan\")}\n onPointerMove={move}\n onPointerUp={up}\n onPointerCancel={cancel}\n onLostPointerCapture={cancel}\n onKeyDown={handleKeys}\n style={{\n left: visible[0],\n top,\n width: visible[1] - visible[0],\n height,\n fill: paint.fill,\n stroke: paint.stroke,\n strokeWidth: paint.strokeWidth,\n opacity: paint.opacity,\n cursor: \"grab\",\n }}\n />\n {handle(first, center, paint, {\n onPointerDown: down(\"first\"),\n onPointerMove: move,\n onPointerUp: up,\n onPointerCancel: cancel,\n onLostPointerCapture: cancel,\n onKeyDown: handleKeys,\n })}\n {handle(second, center, paint, {\n onPointerDown: down(\"second\"),\n onPointerMove: move,\n onPointerUp: up,\n onPointerCancel: cancel,\n onLostPointerCapture: cancel,\n onKeyDown: handleKeys,\n })}\n </TransformCapture>\n );\n}\n\n/**\n * Renders one controlled numeric-domain reference line.\n *\n * @param props - Controlled line inputs and callbacks; see {@link EditableReferenceLineProps}.\n * @returns The line and its selected handle, or no geometry when it is outside the visible range.\n * @see {@link EditableReferenceBand} for an editable interval.\n */\nexport function EditableReferenceLine(props: EditableReferenceLineProps) {\n if (props.direction !== \"horizontal\" && props.direction !== \"vertical\")\n throw new TypeError(\n \"EditableReferenceLine direction must be horizontal or vertical.\",\n );\n const value = resolveSignalValue(props.value),\n span = pair(resolveSignalValue(props.span), \"EditableReferenceLine span\"),\n source = scale(props.scale, \"EditableReferenceLine\"),\n step = positive(props.keyboardStep, \"EditableReferenceLine keyboardStep\"),\n paint = style(props.style),\n selected = resolveSignalValue(props.selected ?? true),\n draft = useSignal<Draft<number, \"line\"> | null>(null),\n transform = useRef<DOMMatrix>();\n if (!Number.isFinite(value))\n throw new RangeError(\"EditableReferenceLine value must be finite.\");\n const position = source.map(value),\n cancel = () => {\n const active = draft.get();\n if (!active) return;\n props.onChange(active.original);\n release(draft, active);\n props.onCancel?.();\n },\n down = (event: PibblPointerEvent) => {\n props.onSelect?.();\n begin(draft, event, value, \"line\", transform.current, [source]);\n };\n const move = (event: PibblPointerEvent) => {\n const active = draft.get();\n if (!active || active.pointerId !== event.pointerId) return;\n const point = local(active.inverse, event),\n captured = active.scales[0]!;\n publish(\n draft,\n active,\n captured.invert!(props.direction === \"horizontal\" ? point.y : point.x),\n props.onChange,\n );\n event.stopPropagation();\n },\n up = (event: PibblPointerEvent) => {\n const active = draft.get();\n if (!active || active.pointerId !== event.pointerId) return;\n release(draft, active);\n props.onCommit?.(active.last);\n event.stopPropagation();\n };\n if (!range(position, position, source.range)) return null;\n const coords: [number, number][] =\n props.direction === \"horizontal\"\n ? [\n [span[0], position],\n [span[1], position],\n ]\n : [\n [position, span[0]],\n [position, span[1]],\n ],\n x = props.direction === \"horizontal\" ? (span[0] + span[1]) / 2 : position,\n y = props.direction === \"horizontal\" ? position : (span[0] + span[1]) / 2;\n const edit = (sign: number) => {\n props.onSelect?.();\n const next = value + sign * step;\n props.onChange(next);\n props.onCommit?.(next);\n };\n const handleKeys = (event: PibblKeyboardEvent) => keys(event, cancel, edit);\n return (\n <TransformCapture capture={transform}>\n <Line\n keyboardFocusable\n onPointerDown={down}\n onPointerMove={move}\n onPointerUp={up}\n onPointerCancel={cancel}\n onLostPointerCapture={cancel}\n onKeyDown={handleKeys}\n style={{\n coords,\n stroke: paint.stroke,\n strokeWidth: paint.strokeWidth,\n opacity: paint.opacity,\n lineInteractionWidth: paint.hitSize,\n cursor: \"grab\",\n }}\n />\n {selected\n ? handle(x, y, paint, {\n onPointerDown: down,\n onPointerMove: move,\n onPointerUp: up,\n onPointerCancel: cancel,\n onLostPointerCapture: cancel,\n onKeyDown: handleKeys,\n })\n : null}\n </TransformCapture>\n );\n}\n\n/**\n * Renders a controlled numeric-domain interval with pan and edge-resize handles.\n *\n * @param props - Controlled band inputs and callbacks; see {@link EditableReferenceBandProps}.\n * @returns Band geometry and selected handles, or no geometry when outside the visible range.\n * @see {@link RangeNavigator} for an overview-strip interval.\n */\nexport function EditableReferenceBand(props: EditableReferenceBandProps) {\n if (props.direction !== \"horizontal\" && props.direction !== \"vertical\")\n throw new TypeError(\n \"EditableReferenceBand direction must be horizontal or vertical.\",\n );\n const values = pair(\n resolveSignalValue(props.values),\n \"EditableReferenceBand values\",\n ),\n span = pair(resolveSignalValue(props.span), \"EditableReferenceBand span\"),\n source = scale(props.scale, \"EditableReferenceBand\"),\n step = positive(props.keyboardStep, \"EditableReferenceBand keyboardStep\"),\n minimum = nonnegative(\n props.minimumSpan ?? 0,\n \"EditableReferenceBand minimumSpan\",\n ),\n paint = style(props.style),\n selected = resolveSignalValue(props.selected ?? true),\n draft = useSignal<Draft<Pair, \"pan\" | \"first\" | \"second\"> | null>(null),\n transform = useRef<DOMMatrix>();\n annotationInterval(values, minimum, \"EditableReferenceBand\");\n const first = source.map(values[0]),\n second = source.map(values[1]),\n visible = range(first, second, source.range);\n const cancel = () => {\n const active = draft.get();\n if (!active) return;\n props.onChange(active.original);\n release(draft, active);\n props.onCancel?.();\n };\n const down =\n (mode: \"pan\" | \"first\" | \"second\") => (event: PibblPointerEvent) => {\n props.onSelect?.();\n begin(draft, event, values, mode, transform.current, [source]);\n };\n const move = (event: PibblPointerEvent) => {\n const active = draft.get();\n if (!active || active.pointerId !== event.pointerId) return;\n const point = local(active.inverse, event),\n coordinate = props.direction === \"horizontal\" ? point.y : point.x,\n start =\n props.direction === \"horizontal\" ? active.start.y : active.start.x,\n captured = active.scales[0]!,\n next =\n active.mode === \"pan\"\n ? panMapped(\n active.original,\n coordinate - start,\n captured,\n false,\n minimum,\n )\n : edge(\n active.original,\n active.mode,\n captured.invert!(coordinate),\n minimum,\n captured,\n false,\n );\n publish(draft, active, next, props.onChange);\n event.stopPropagation();\n };\n const up = (event: PibblPointerEvent) => {\n const active = draft.get();\n if (!active || active.pointerId !== event.pointerId) return;\n release(draft, active);\n props.onCommit?.(active.last);\n event.stopPropagation();\n };\n const edit = (sign: number) => {\n props.onSelect?.();\n const next = pan(values, sign * step, source, false);\n props.onChange(next);\n props.onCommit?.(next);\n };\n if (!visible) return null;\n const rect =\n props.direction === \"horizontal\"\n ? {\n left: Math.min(...span),\n top: visible[0],\n width: Math.abs(span[1] - span[0]),\n height: visible[1] - visible[0],\n }\n : {\n left: visible[0],\n top: Math.min(...span),\n width: visible[1] - visible[0],\n height: Math.abs(span[1] - span[0]),\n };\n const firstHandle: Pair =\n props.direction === \"horizontal\"\n ? [Math.min(...span), first]\n : [first, Math.min(...span)],\n secondHandle: Pair =\n props.direction === \"horizontal\"\n ? [Math.max(...span), second]\n : [second, Math.max(...span)];\n const handleKeys = (event: PibblKeyboardEvent) => keys(event, cancel, edit);\n return (\n <TransformCapture capture={transform}>\n <Rectangle\n keyboardFocusable\n onPointerDown={down(\"pan\")}\n onPointerMove={move}\n onPointerUp={up}\n onPointerCancel={cancel}\n onLostPointerCapture={cancel}\n onKeyDown={handleKeys}\n style={{\n ...rect,\n fill: paint.fill,\n stroke: paint.stroke,\n strokeWidth: paint.strokeWidth,\n opacity: paint.opacity,\n cursor: \"grab\",\n }}\n />\n {selected ? (\n <>\n {handle(firstHandle[0], firstHandle[1], paint, {\n onPointerDown: down(\"first\"),\n onPointerMove: move,\n onPointerUp: up,\n onPointerCancel: cancel,\n onLostPointerCapture: cancel,\n onKeyDown: handleKeys,\n })}\n {handle(secondHandle[0], secondHandle[1], paint, {\n onPointerDown: down(\"second\"),\n onPointerMove: move,\n onPointerUp: up,\n onPointerCancel: cancel,\n onLostPointerCapture: cancel,\n onKeyDown: handleKeys,\n })}\n </>\n ) : null}\n </TransformCapture>\n );\n}\n\nfunction snap(source: Scale, position: number): number {\n const time = source.nearestTimeAtPosition?.(position);\n if (time === undefined)\n throw new RangeError(\n \"EditableTrendLine cannot edit an empty TradingTimeScale.\",\n );\n return time;\n}\nfunction mapped(source: Scale, position: number): number {\n return source.type === \"trading-time\"\n ? snap(source, position)\n : source.invert!(position);\n}\nfunction advanceTradingTime(\n source: Scale,\n value: number,\n sign: number,\n step: number,\n) {\n const target = value + sign * step,\n candidates = source.domain.filter((candidate) =>\n sign > 0 ? candidate >= target : candidate <= target,\n );\n return sign > 0\n ? (candidates[0] ?? Math.max(...source.domain))\n : (candidates[candidates.length - 1] ?? Math.min(...source.domain));\n}\nfunction translateTradingAnchors(\n source: Scale,\n anchors: readonly [ChartAnchor, ChartAnchor],\n sign: number,\n step: number,\n): readonly [ChartAnchor, ChartAnchor] {\n const slots = anchors.map((anchor) => source.slotAtTime!(anchor.x)!);\n const requested =\n source.slotAtTime!(advanceTradingTime(source, anchors[0].x, sign, step))! -\n slots[0]!;\n const delta = clamp(requested, [\n -Math.min(...slots),\n source.domain.length - 1 - Math.max(...slots),\n ]);\n return [\n { ...anchors[0], x: source.timeAtSlot!(slots[0]! + delta)! },\n { ...anchors[1], x: source.timeAtSlot!(slots[1]! + delta)! },\n ];\n}\n\n/**\n * Renders two controlled anchors as an editable trend line.\n *\n * Trading-time x values snap to supplied observations during pointer and keyboard edits.\n *\n * @param props - Controlled anchor inputs and callbacks; see {@link EditableTrendLineProps}.\n * @returns Line geometry and selected endpoint handles.\n * @see {@link ChartAnchor} for the controlled anchor shape.\n */\nexport function EditableTrendLine(props: EditableTrendLineProps) {\n const anchors = resolveSignalValue(props.anchors),\n x = scale(props.xScale, \"EditableTrendLine xScale\", {\n allowTradingTime: true,\n }),\n y = scale(props.yScale, \"EditableTrendLine yScale\"),\n stepX = positive(props.keyboardStep.x, \"EditableTrendLine keyboardStep.x\"),\n stepY = positive(props.keyboardStep.y, \"EditableTrendLine keyboardStep.y\"),\n paint = style(props.style),\n selected = resolveSignalValue(props.selected ?? true),\n draft = useSignal<Draft<\n readonly [ChartAnchor, ChartAnchor],\n \"line\" | \"first\" | \"second\"\n > | null>(null),\n transform = useRef<DOMMatrix>();\n if (\n !Array.isArray(anchors) ||\n anchors.length !== 2 ||\n !anchors.every(\n (anchor) => Number.isFinite(anchor.x) && Number.isFinite(anchor.y),\n )\n )\n throw new RangeError(\"EditableTrendLine requires two finite anchors.\");\n const positions: readonly [Point, Point] = [\n { x: x.map(anchors[0].x), y: y.map(anchors[0].y) },\n { x: x.map(anchors[1].x), y: y.map(anchors[1].y) },\n ];\n const cancel = () => {\n const active = draft.get();\n if (!active) return;\n props.onChange(active.original);\n release(draft, active);\n props.onCancel?.();\n };\n const down =\n (mode: \"line\" | \"first\" | \"second\") => (event: PibblPointerEvent) => {\n props.onSelect?.();\n begin(\n draft,\n event,\n anchors as readonly [ChartAnchor, ChartAnchor],\n mode,\n transform.current,\n [x, y],\n );\n };\n const move = (event: PibblPointerEvent) => {\n const active = draft.get();\n if (!active || active.pointerId !== event.pointerId) return;\n const point = local(active.inverse, event),\n dragX = active.scales[0]!,\n dragY = active.scales[1]!;\n let next: readonly [ChartAnchor, ChartAnchor];\n if (active.mode === \"line\") {\n const originalPositions: readonly [Point, Point] = [\n {\n x: dragX.map(active.original[0].x),\n y: dragY.map(active.original[0].y),\n },\n {\n x: dragX.map(active.original[1].x),\n y: dragY.map(active.original[1].y),\n },\n ];\n const yDelta = point.y - active.start.y;\n const slotDelta =\n dragX.type === \"trading-time\"\n ? clamp(\n Math.round(\n dragX.slotAtTime!(snap(dragX, point.x))! -\n dragX.slotAtTime!(snap(dragX, active.start.x))!,\n ),\n [\n -Math.min(\n dragX.slotAtTime!(active.original[0].x)!,\n dragX.slotAtTime!(active.original[1].x)!,\n ),\n dragX.domain.length -\n 1 -\n Math.max(\n dragX.slotAtTime!(active.original[0].x)!,\n dragX.slotAtTime!(active.original[1].x)!,\n ),\n ],\n )\n : 0;\n const xDelta =\n dragX.type === \"trading-time\" ? 0 : point.x - active.start.x;\n const translateX = (anchor: ChartAnchor, position: Point) =>\n dragX.type === \"trading-time\"\n ? dragX.timeAtSlot!(dragX.slotAtTime!(anchor.x)! + slotDelta)!\n : mapped(dragX, position.x + xDelta);\n next = [\n {\n x: translateX(active.original[0], originalPositions[0]),\n y: mapped(dragY, originalPositions[0].y + yDelta),\n },\n {\n x: translateX(active.original[1], originalPositions[1]),\n y: mapped(dragY, originalPositions[1].y + yDelta),\n },\n ];\n } else {\n const index = active.mode === \"first\" ? 0 : 1,\n changed = { x: mapped(dragX, point.x), y: mapped(dragY, point.y) };\n next =\n index === 0\n ? [changed, active.original[1]]\n : [active.original[0], changed];\n }\n publish(draft, active, next, props.onChange);\n event.stopPropagation();\n };\n const up = (event: PibblPointerEvent) => {\n const active = draft.get();\n if (!active || active.pointerId !== event.pointerId) return;\n release(draft, active);\n props.onCommit?.(active.last);\n event.stopPropagation();\n };\n const edit = (sign: number, axis: \"x\" | \"y\") => {\n props.onSelect?.();\n const translated =\n axis === \"y\"\n ? anchors\n : x.type === \"trading-time\"\n ? translateTradingAnchors(x, anchors, sign, stepX)\n : ([\n { ...anchors[0], x: anchors[0].x + sign * stepX },\n { ...anchors[1], x: anchors[1].x + sign * stepX },\n ] as const);\n const next: readonly [ChartAnchor, ChartAnchor] = [\n { ...translated[0], y: anchors[0].y + (axis === \"y\" ? sign * stepY : 0) },\n { ...translated[1], y: anchors[1].y + (axis === \"y\" ? sign * stepY : 0) },\n ];\n props.onChange(next);\n props.onCommit?.(next);\n };\n const coords: [number, number][] = positions.map((point) => [\n point.x,\n point.y,\n ]);\n const handleKeys = (event: PibblKeyboardEvent) =>\n keys(event, cancel, (sign) =>\n edit(\n sign,\n event.key === \"ArrowLeft\" || event.key === \"ArrowRight\" ? \"x\" : \"y\",\n ),\n );\n return (\n <TransformCapture capture={transform}>\n <Line\n keyboardFocusable\n onPointerDown={down(\"line\")}\n onPointerMove={move}\n onPointerUp={up}\n onPointerCancel={cancel}\n onLostPointerCapture={cancel}\n onKeyDown={handleKeys}\n style={{\n coords,\n stroke: paint.stroke,\n strokeWidth: paint.strokeWidth,\n opacity: paint.opacity,\n lineInteractionWidth: paint.hitSize,\n cursor: \"grab\",\n }}\n />\n {selected ? (\n <>\n {handle(positions[0].x, positions[0].y, paint, {\n onPointerDown: down(\"first\"),\n onPointerMove: move,\n onPointerUp: up,\n onPointerCancel: cancel,\n onLostPointerCapture: cancel,\n onKeyDown: handleKeys,\n })}\n {handle(positions[1].x, positions[1].y, paint, {\n onPointerDown: down(\"second\"),\n onPointerMove: move,\n onPointerUp: up,\n onPointerCancel: cancel,\n onLostPointerCapture: cancel,\n onKeyDown: handleKeys,\n })}\n </>\n ) : null}\n </TransformCapture>\n );\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["TransformCapture", "scale", "limit"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import type { LineAccessor } from "./types.js";
|
|
2
|
+
/** One half-open time interval used to group complete OHLCV records. See {@link AggregateOhlcvOptions}. */
|
|
3
|
+
export interface OhlcvBucket {
|
|
4
|
+
/** Inclusive finite start coordinate. */
|
|
5
|
+
readonly start: number;
|
|
6
|
+
/** Exclusive finite end coordinate after the start. */
|
|
7
|
+
readonly end: number;
|
|
8
|
+
}
|
|
9
|
+
/** Original source record that contributed to an aggregated OHLCV bar. See {@link AggregatedOhlcvPoint}. */
|
|
10
|
+
export interface OhlcvSource<D> {
|
|
11
|
+
/** Caller-owned complete contributing record. */
|
|
12
|
+
readonly datum: D;
|
|
13
|
+
/** Original source index. */
|
|
14
|
+
readonly sourceIndex: number;
|
|
15
|
+
}
|
|
16
|
+
/** One frozen OHLCV bar aggregated without sorting caller-owned records. See {@link aggregateOhlcv}. */
|
|
17
|
+
export interface AggregatedOhlcvPoint<D> extends OhlcvBucket {
|
|
18
|
+
/** Open from the first contributing record. */
|
|
19
|
+
readonly open: number;
|
|
20
|
+
/** Maximum high from contributing records. */
|
|
21
|
+
readonly high: number;
|
|
22
|
+
/** Minimum low from contributing records. */
|
|
23
|
+
readonly low: number;
|
|
24
|
+
/** Close from the last contributing record. */
|
|
25
|
+
readonly close: number;
|
|
26
|
+
/** Finite sum of non-negative contributing volumes. */
|
|
27
|
+
readonly volume: number;
|
|
28
|
+
/** Frozen references to contributing caller-owned records. */
|
|
29
|
+
readonly sources: readonly OhlcvSource<D>[];
|
|
30
|
+
}
|
|
31
|
+
/** Inputs for chronological OHLCV aggregation. See {@link aggregateOhlcv}. */
|
|
32
|
+
export interface AggregateOhlcvOptions<D> {
|
|
33
|
+
/** Numeric property or callback that supplies each record's time coordinate. */
|
|
34
|
+
readonly time: LineAccessor<D>;
|
|
35
|
+
/** Numeric property or callback that supplies open. */
|
|
36
|
+
readonly open: LineAccessor<D>;
|
|
37
|
+
/** Numeric property or callback that supplies high. */
|
|
38
|
+
readonly high: LineAccessor<D>;
|
|
39
|
+
/** Numeric property or callback that supplies low. */
|
|
40
|
+
readonly low: LineAccessor<D>;
|
|
41
|
+
/** Numeric property or callback that supplies close. */
|
|
42
|
+
readonly close: LineAccessor<D>;
|
|
43
|
+
/** Numeric property or callback that supplies non-negative volume. */
|
|
44
|
+
readonly volume: LineAccessor<D>;
|
|
45
|
+
/**
|
|
46
|
+
* Returns the half-open aggregate bucket for one eligible finite timestamp, or null to skip it.
|
|
47
|
+
* @param time - Eligible finite source timestamp.
|
|
48
|
+
* @returns A containing half-open bucket, or null when the record is not aggregated.
|
|
49
|
+
* @see {@link OhlcvBucket}
|
|
50
|
+
*/
|
|
51
|
+
readonly bucket: (time: number) => OhlcvBucket | null;
|
|
52
|
+
/**
|
|
53
|
+
* Excludes a record before its OHLCV and bucket accessors run.
|
|
54
|
+
* @param datum - Original source observation.
|
|
55
|
+
* @param index - Zero-based source index.
|
|
56
|
+
* @param data - Complete caller-supplied source array.
|
|
57
|
+
* @returns Whether this observation may contribute.
|
|
58
|
+
*/
|
|
59
|
+
readonly defined?: (datum: D, index: number, data: readonly D[]) => boolean;
|
|
60
|
+
}
|
|
61
|
+
/** A valid session identifier supplied to {@link sessionVwap}. */
|
|
62
|
+
export type SessionIdentifier = string | number;
|
|
63
|
+
/**
|
|
64
|
+
* A property or callback that supplies the session containing a source record.
|
|
65
|
+
* @param datum - Source observation under consideration.
|
|
66
|
+
* @param index - Zero-based source index.
|
|
67
|
+
* @param data - Complete caller-supplied source array.
|
|
68
|
+
* @returns The record's string or finite numeric session identifier.
|
|
69
|
+
* @see {@link SessionVwapOptions}
|
|
70
|
+
*/
|
|
71
|
+
export type SessionAccessor<D> = {
|
|
72
|
+
[K in keyof D]-?: D[K] extends SessionIdentifier ? K : never;
|
|
73
|
+
}[keyof D] | ((datum: D, index: number, data: readonly D[]) => SessionIdentifier);
|
|
74
|
+
/** Inputs for source-aligned session VWAP. See {@link sessionVwap}. */
|
|
75
|
+
export interface SessionVwapOptions<D> {
|
|
76
|
+
/** Numeric property or callback that supplies each record's price. */
|
|
77
|
+
readonly price: LineAccessor<D>;
|
|
78
|
+
/** Numeric property or callback that supplies non-negative volume. */
|
|
79
|
+
readonly volume: LineAccessor<D>;
|
|
80
|
+
/** Property or callback that supplies the current string or finite numeric session identifier. */
|
|
81
|
+
readonly session: SessionAccessor<D>;
|
|
82
|
+
/**
|
|
83
|
+
* Excludes a row before price and volume accessors run; its session still resets state.
|
|
84
|
+
* @param datum - Original source observation.
|
|
85
|
+
* @param index - Zero-based source index.
|
|
86
|
+
* @param data - Complete caller-supplied source array.
|
|
87
|
+
* @returns Whether this observation participates in VWAP calculation.
|
|
88
|
+
*/
|
|
89
|
+
readonly defined?: (datum: D, index: number, data: readonly D[]) => boolean;
|
|
90
|
+
}
|
|
91
|
+
/** One frozen source-aligned session VWAP point. See {@link sessionVwap}. */
|
|
92
|
+
export interface SessionVwapPoint<D> {
|
|
93
|
+
/** Caller-owned original record. */
|
|
94
|
+
readonly datum: D;
|
|
95
|
+
/** Original source index, including excluded and incomplete records. */
|
|
96
|
+
readonly sourceIndex: number;
|
|
97
|
+
/** Evaluated session, including for an excluded source record. */
|
|
98
|
+
readonly session: SessionIdentifier;
|
|
99
|
+
/** Finite volume accumulated for this session before or including this record. */
|
|
100
|
+
readonly cumulativeVolume: number;
|
|
101
|
+
/** Session VWAP after this valid record, null for incomplete or excluded records. */
|
|
102
|
+
readonly vwap: number | null;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Aggregates source-ordered complete OHLCV records into caller-defined chronological buckets.
|
|
106
|
+
*
|
|
107
|
+
* It never sorts or mutates source records. Missing, excluded, and null-bucket records are skipped;
|
|
108
|
+
* finite malformed candles, negative volume, noncontiguous bucket bounds, and time disorder reject.
|
|
109
|
+
* @param data - Caller-owned source observations in chronological order.
|
|
110
|
+
* @param options - OHLCV accessors, bucket definition, and optional participation callback.
|
|
111
|
+
* @returns Frozen anchored aggregate bars with frozen original source references.
|
|
112
|
+
* @see {@link AggregateOhlcvOptions}
|
|
113
|
+
* @see {@link AggregatedOhlcvPoint}
|
|
114
|
+
*/
|
|
115
|
+
export declare function aggregateOhlcv<D>(data: readonly D[], options: AggregateOhlcvOptions<D>): readonly AggregatedOhlcvPoint<D>[];
|
|
116
|
+
/**
|
|
117
|
+
* Derives source-aligned volume-weighted prices that reset whenever the session identifier changes.
|
|
118
|
+
*
|
|
119
|
+
* Missing prices or volumes and excluded rows produce null without changing the current accumulated
|
|
120
|
+
* state. Zero-volume complete records preserve the preceding VWAP; negative volumes reject.
|
|
121
|
+
* @param data - Caller-owned source observations in presentation order.
|
|
122
|
+
* @param options - Price, volume, session accessors, and optional participation callback.
|
|
123
|
+
* @returns Frozen source-aligned points with current cumulative volume and VWAP or null.
|
|
124
|
+
* @see {@link SessionVwapOptions}
|
|
125
|
+
* @see {@link SessionVwapPoint}
|
|
126
|
+
*/
|
|
127
|
+
export declare function sessionVwap<D>(data: readonly D[], options: SessionVwapOptions<D>): readonly SessionVwapPoint<D>[];
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { finiteCoordinate, pointAccessor, pointData } from "./point-data.js";
|
|
2
|
+
function validBucket(value, time) {
|
|
3
|
+
if (value === null) return null;
|
|
4
|
+
if (value === void 0 || typeof value !== "object" || Array.isArray(value))
|
|
5
|
+
throw new TypeError("aggregateOhlcv bucket must return an object or null.");
|
|
6
|
+
const { start, end } = value;
|
|
7
|
+
if (!finiteCoordinate(start) || !finiteCoordinate(end) || start >= end)
|
|
8
|
+
throw new RangeError("aggregateOhlcv bucket bounds must be finite and increasing.");
|
|
9
|
+
if (time < start || time >= end)
|
|
10
|
+
throw new RangeError("aggregateOhlcv bucket must contain its source time.");
|
|
11
|
+
return value;
|
|
12
|
+
}
|
|
13
|
+
function validateCandle(open, high, low, close, volume) {
|
|
14
|
+
if (volume < 0) throw new RangeError("aggregateOhlcv volume must be non-negative.");
|
|
15
|
+
if (low > high || open < low || open > high || close < low || close > high)
|
|
16
|
+
throw new RangeError("aggregateOhlcv high and low must contain open and close.");
|
|
17
|
+
}
|
|
18
|
+
function sessionAccessor(input) {
|
|
19
|
+
return typeof input === "function" ? input : (datum) => datum[input];
|
|
20
|
+
}
|
|
21
|
+
function validSession(value) {
|
|
22
|
+
if (typeof value === "string") return true;
|
|
23
|
+
if (typeof value === "number" && Number.isFinite(value)) return true;
|
|
24
|
+
throw new TypeError("sessionVwap session must be a string or finite number.");
|
|
25
|
+
}
|
|
26
|
+
function weightedAverage(previous, previousVolume, price, volume) {
|
|
27
|
+
const total = previousVolume + volume;
|
|
28
|
+
if (!Number.isFinite(total)) throw new RangeError("sessionVwap cumulative volume must be finite.");
|
|
29
|
+
const scale = Math.max(Math.abs(previous), Math.abs(price));
|
|
30
|
+
if (scale === 0) return 0;
|
|
31
|
+
const result = (previous / scale * (previousVolume / total) + price / scale * (volume / total)) * scale;
|
|
32
|
+
if (!Number.isFinite(result)) throw new RangeError("sessionVwap derived value must be finite.");
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
function aggregateOhlcv(data, options) {
|
|
36
|
+
const rows = pointData(data, "aggregateOhlcv");
|
|
37
|
+
const time = pointAccessor(options.time), open = pointAccessor(options.open), high = pointAccessor(options.high);
|
|
38
|
+
const low = pointAccessor(options.low), close = pointAccessor(options.close), volume = pointAccessor(options.volume);
|
|
39
|
+
const aggregates = [];
|
|
40
|
+
let previousTime;
|
|
41
|
+
let current;
|
|
42
|
+
for (let index = 0; index < rows.length; index++) {
|
|
43
|
+
const datum = rows[index];
|
|
44
|
+
if (!(options.defined?.(datum, index, rows) ?? true)) continue;
|
|
45
|
+
const timestamp = time(datum, index, rows);
|
|
46
|
+
if (!finiteCoordinate(timestamp)) continue;
|
|
47
|
+
if (previousTime !== void 0 && timestamp < previousTime)
|
|
48
|
+
throw new RangeError("aggregateOhlcv data must be chronological.");
|
|
49
|
+
previousTime = timestamp;
|
|
50
|
+
const interval = validBucket(options.bucket(timestamp), timestamp);
|
|
51
|
+
if (interval === null) continue;
|
|
52
|
+
const o = open(datum, index, rows), h = high(datum, index, rows), l = low(datum, index, rows);
|
|
53
|
+
const c = close(datum, index, rows), v = volume(datum, index, rows);
|
|
54
|
+
if (!finiteCoordinate(o) || !finiteCoordinate(h) || !finiteCoordinate(l) || !finiteCoordinate(c) || !finiteCoordinate(v)) continue;
|
|
55
|
+
validateCandle(o, h, l, c, v);
|
|
56
|
+
if (current === void 0 || current.start !== interval.start || current.end !== interval.end) {
|
|
57
|
+
if (current !== void 0) {
|
|
58
|
+
if (interval.start < current.end)
|
|
59
|
+
throw new RangeError("aggregateOhlcv buckets must be non-overlapping and source ordered.");
|
|
60
|
+
aggregates.push(Object.freeze({ ...current, sources: Object.freeze(current.sources) }));
|
|
61
|
+
}
|
|
62
|
+
current = { start: interval.start, end: interval.end, open: o, high: h, low: l, close: c, volume: v, sources: [Object.freeze({ datum, sourceIndex: index })] };
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const nextVolume = current.volume + v;
|
|
66
|
+
if (!Number.isFinite(nextVolume)) throw new RangeError("aggregateOhlcv volume must remain finite.");
|
|
67
|
+
current.high = Math.max(current.high, h);
|
|
68
|
+
current.low = Math.min(current.low, l);
|
|
69
|
+
current.close = c;
|
|
70
|
+
current.volume = nextVolume;
|
|
71
|
+
current.sources.push(Object.freeze({ datum, sourceIndex: index }));
|
|
72
|
+
}
|
|
73
|
+
if (current !== void 0)
|
|
74
|
+
aggregates.push(Object.freeze({ ...current, sources: Object.freeze(current.sources) }));
|
|
75
|
+
return Object.freeze(aggregates);
|
|
76
|
+
}
|
|
77
|
+
function sessionVwap(data, options) {
|
|
78
|
+
const rows = pointData(data, "sessionVwap");
|
|
79
|
+
const price = pointAccessor(options.price), volume = pointAccessor(options.volume), session = sessionAccessor(options.session);
|
|
80
|
+
const results = [];
|
|
81
|
+
let activeSession;
|
|
82
|
+
let cumulativeVolume = 0;
|
|
83
|
+
let average;
|
|
84
|
+
for (let index = 0; index < rows.length; index++) {
|
|
85
|
+
const datum = rows[index];
|
|
86
|
+
const currentSession = session(datum, index, rows);
|
|
87
|
+
validSession(currentSession);
|
|
88
|
+
if (activeSession !== currentSession) {
|
|
89
|
+
activeSession = currentSession;
|
|
90
|
+
cumulativeVolume = 0;
|
|
91
|
+
average = void 0;
|
|
92
|
+
}
|
|
93
|
+
if (!(options.defined?.(datum, index, rows) ?? true)) {
|
|
94
|
+
results.push(Object.freeze({ datum, sourceIndex: index, session: currentSession, cumulativeVolume, vwap: null }));
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
const currentPrice = price(datum, index, rows), currentVolume = volume(datum, index, rows);
|
|
98
|
+
if (!finiteCoordinate(currentPrice) || !finiteCoordinate(currentVolume)) {
|
|
99
|
+
results.push(Object.freeze({ datum, sourceIndex: index, session: currentSession, cumulativeVolume, vwap: null }));
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (currentVolume < 0) throw new RangeError("sessionVwap volume must be non-negative.");
|
|
103
|
+
if (currentVolume > 0) {
|
|
104
|
+
average = average === void 0 ? currentPrice : weightedAverage(average, cumulativeVolume, currentPrice, currentVolume);
|
|
105
|
+
cumulativeVolume += currentVolume;
|
|
106
|
+
if (!Number.isFinite(cumulativeVolume)) throw new RangeError("sessionVwap cumulative volume must be finite.");
|
|
107
|
+
}
|
|
108
|
+
results.push(Object.freeze({ datum, sourceIndex: index, session: currentSession, cumulativeVolume, vwap: average ?? null }));
|
|
109
|
+
}
|
|
110
|
+
return Object.freeze(results);
|
|
111
|
+
}
|
|
112
|
+
export {
|
|
113
|
+
aggregateOhlcv,
|
|
114
|
+
sessionVwap
|
|
115
|
+
};
|
|
116
|
+
//# sourceMappingURL=financial-aggregation.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/features/viz/lib/financial-aggregation.ts"],
|
|
4
|
+
"sourcesContent": ["import type { LineAccessor } from \"./types.js\";\nimport { finiteCoordinate, pointAccessor, pointData } from \"./point-data.js\";\n\n/** One half-open time interval used to group complete OHLCV records. See {@link AggregateOhlcvOptions}. */\nexport interface OhlcvBucket {\n /** Inclusive finite start coordinate. */\n readonly start: number;\n /** Exclusive finite end coordinate after the start. */\n readonly end: number;\n}\n\n/** Original source record that contributed to an aggregated OHLCV bar. See {@link AggregatedOhlcvPoint}. */\nexport interface OhlcvSource<D> {\n /** Caller-owned complete contributing record. */\n readonly datum: D;\n /** Original source index. */\n readonly sourceIndex: number;\n}\n\n/** One frozen OHLCV bar aggregated without sorting caller-owned records. See {@link aggregateOhlcv}. */\nexport interface AggregatedOhlcvPoint<D> extends OhlcvBucket {\n /** Open from the first contributing record. */\n readonly open: number;\n /** Maximum high from contributing records. */\n readonly high: number;\n /** Minimum low from contributing records. */\n readonly low: number;\n /** Close from the last contributing record. */\n readonly close: number;\n /** Finite sum of non-negative contributing volumes. */\n readonly volume: number;\n /** Frozen references to contributing caller-owned records. */\n readonly sources: readonly OhlcvSource<D>[];\n}\n\n/** Inputs for chronological OHLCV aggregation. See {@link aggregateOhlcv}. */\nexport interface AggregateOhlcvOptions<D> {\n /** Numeric property or callback that supplies each record's time coordinate. */\n readonly time: LineAccessor<D>;\n /** Numeric property or callback that supplies open. */\n readonly open: LineAccessor<D>;\n /** Numeric property or callback that supplies high. */\n readonly high: LineAccessor<D>;\n /** Numeric property or callback that supplies low. */\n readonly low: LineAccessor<D>;\n /** Numeric property or callback that supplies close. */\n readonly close: LineAccessor<D>;\n /** Numeric property or callback that supplies non-negative volume. */\n readonly volume: LineAccessor<D>;\n /**\n * Returns the half-open aggregate bucket for one eligible finite timestamp, or null to skip it.\n * @param time - Eligible finite source timestamp.\n * @returns A containing half-open bucket, or null when the record is not aggregated.\n * @see {@link OhlcvBucket}\n */\n readonly bucket: (time: number) => OhlcvBucket | null;\n /**\n * Excludes a record before its OHLCV and bucket accessors run.\n * @param datum - Original source observation.\n * @param index - Zero-based source index.\n * @param data - Complete caller-supplied source array.\n * @returns Whether this observation may contribute.\n */\n readonly defined?: (datum: D, index: number, data: readonly D[]) => boolean;\n}\n\n/** A valid session identifier supplied to {@link sessionVwap}. */\nexport type SessionIdentifier = string | number;\n\n/**\n * A property or callback that supplies the session containing a source record.\n * @param datum - Source observation under consideration.\n * @param index - Zero-based source index.\n * @param data - Complete caller-supplied source array.\n * @returns The record's string or finite numeric session identifier.\n * @see {@link SessionVwapOptions}\n */\nexport type SessionAccessor<D> =\n | { [K in keyof D]-?: D[K] extends SessionIdentifier ? K : never }[keyof D]\n | ((datum: D, index: number, data: readonly D[]) => SessionIdentifier);\n\n/** Inputs for source-aligned session VWAP. See {@link sessionVwap}. */\nexport interface SessionVwapOptions<D> {\n /** Numeric property or callback that supplies each record's price. */\n readonly price: LineAccessor<D>;\n /** Numeric property or callback that supplies non-negative volume. */\n readonly volume: LineAccessor<D>;\n /** Property or callback that supplies the current string or finite numeric session identifier. */\n readonly session: SessionAccessor<D>;\n /**\n * Excludes a row before price and volume accessors run; its session still resets state.\n * @param datum - Original source observation.\n * @param index - Zero-based source index.\n * @param data - Complete caller-supplied source array.\n * @returns Whether this observation participates in VWAP calculation.\n */\n readonly defined?: (datum: D, index: number, data: readonly D[]) => boolean;\n}\n\n/** One frozen source-aligned session VWAP point. See {@link sessionVwap}. */\nexport interface SessionVwapPoint<D> {\n /** Caller-owned original record. */\n readonly datum: D;\n /** Original source index, including excluded and incomplete records. */\n readonly sourceIndex: number;\n /** Evaluated session, including for an excluded source record. */\n readonly session: SessionIdentifier;\n /** Finite volume accumulated for this session before or including this record. */\n readonly cumulativeVolume: number;\n /** Session VWAP after this valid record, null for incomplete or excluded records. */\n readonly vwap: number | null;\n}\n\nfunction validBucket(value: OhlcvBucket | null, time: number): OhlcvBucket | null {\n if (value === null) return null;\n if (value === undefined || typeof value !== \"object\" || Array.isArray(value))\n throw new TypeError(\"aggregateOhlcv bucket must return an object or null.\");\n const { start, end } = value;\n if (!finiteCoordinate(start) || !finiteCoordinate(end) || start >= end)\n throw new RangeError(\"aggregateOhlcv bucket bounds must be finite and increasing.\");\n if (time < start || time >= end)\n throw new RangeError(\"aggregateOhlcv bucket must contain its source time.\");\n return value;\n}\n\nfunction validateCandle(\n open: number, high: number, low: number, close: number, volume: number,\n): void {\n if (volume < 0) throw new RangeError(\"aggregateOhlcv volume must be non-negative.\");\n if (low > high || open < low || open > high || close < low || close > high)\n throw new RangeError(\"aggregateOhlcv high and low must contain open and close.\");\n}\n\nfunction sessionAccessor<D>(input: SessionAccessor<D>): (datum: D, index: number, data: readonly D[]) => SessionIdentifier {\n return typeof input === \"function\"\n ? input\n : (datum) => datum[input] as SessionIdentifier;\n}\n\nfunction validSession(value: unknown): value is SessionIdentifier {\n if (typeof value === \"string\") return true;\n if (typeof value === \"number\" && Number.isFinite(value)) return true;\n throw new TypeError(\"sessionVwap session must be a string or finite number.\");\n}\n\nfunction weightedAverage(previous: number, previousVolume: number, price: number, volume: number): number {\n const total = previousVolume + volume;\n if (!Number.isFinite(total)) throw new RangeError(\"sessionVwap cumulative volume must be finite.\");\n const scale = Math.max(Math.abs(previous), Math.abs(price));\n if (scale === 0) return 0;\n const result = ((previous / scale) * (previousVolume / total) + (price / scale) * (volume / total)) * scale;\n if (!Number.isFinite(result)) throw new RangeError(\"sessionVwap derived value must be finite.\");\n return result;\n}\n\n/**\n * Aggregates source-ordered complete OHLCV records into caller-defined chronological buckets.\n *\n * It never sorts or mutates source records. Missing, excluded, and null-bucket records are skipped;\n * finite malformed candles, negative volume, noncontiguous bucket bounds, and time disorder reject.\n * @param data - Caller-owned source observations in chronological order.\n * @param options - OHLCV accessors, bucket definition, and optional participation callback.\n * @returns Frozen anchored aggregate bars with frozen original source references.\n * @see {@link AggregateOhlcvOptions}\n * @see {@link AggregatedOhlcvPoint}\n */\nexport function aggregateOhlcv<D>(data: readonly D[], options: AggregateOhlcvOptions<D>): readonly AggregatedOhlcvPoint<D>[] {\n const rows = pointData(data, \"aggregateOhlcv\");\n const time = pointAccessor(options.time), open = pointAccessor(options.open), high = pointAccessor(options.high);\n const low = pointAccessor(options.low), close = pointAccessor(options.close), volume = pointAccessor(options.volume);\n const aggregates: AggregatedOhlcvPoint<D>[] = [];\n let previousTime: number | undefined;\n let current: { start: number; end: number; open: number; high: number; low: number; close: number; volume: number; sources: OhlcvSource<D>[] } | undefined;\n for (let index = 0; index < rows.length; index++) {\n const datum = rows[index]!;\n if (!(options.defined?.(datum, index, rows) ?? true)) continue;\n const timestamp = time(datum, index, rows);\n if (!finiteCoordinate(timestamp)) continue;\n if (previousTime !== undefined && timestamp < previousTime)\n throw new RangeError(\"aggregateOhlcv data must be chronological.\");\n previousTime = timestamp;\n const interval = validBucket(options.bucket(timestamp), timestamp);\n if (interval === null) continue;\n const o = open(datum, index, rows), h = high(datum, index, rows), l = low(datum, index, rows);\n const c = close(datum, index, rows), v = volume(datum, index, rows);\n if (!finiteCoordinate(o) || !finiteCoordinate(h) || !finiteCoordinate(l)\n || !finiteCoordinate(c) || !finiteCoordinate(v)) continue;\n validateCandle(o, h, l, c, v);\n if (current === undefined || current.start !== interval.start || current.end !== interval.end) {\n if (current !== undefined) {\n if (interval.start < current.end)\n throw new RangeError(\"aggregateOhlcv buckets must be non-overlapping and source ordered.\");\n aggregates.push(Object.freeze({ ...current, sources: Object.freeze(current.sources) }));\n }\n current = { start: interval.start, end: interval.end, open: o, high: h, low: l, close: c, volume: v, sources: [Object.freeze({ datum, sourceIndex: index })] };\n continue;\n }\n const nextVolume = current.volume + v;\n if (!Number.isFinite(nextVolume)) throw new RangeError(\"aggregateOhlcv volume must remain finite.\");\n current.high = Math.max(current.high, h);\n current.low = Math.min(current.low, l);\n current.close = c;\n current.volume = nextVolume;\n current.sources.push(Object.freeze({ datum, sourceIndex: index }));\n }\n if (current !== undefined)\n aggregates.push(Object.freeze({ ...current, sources: Object.freeze(current.sources) }));\n return Object.freeze(aggregates);\n}\n\n/**\n * Derives source-aligned volume-weighted prices that reset whenever the session identifier changes.\n *\n * Missing prices or volumes and excluded rows produce null without changing the current accumulated\n * state. Zero-volume complete records preserve the preceding VWAP; negative volumes reject.\n * @param data - Caller-owned source observations in presentation order.\n * @param options - Price, volume, session accessors, and optional participation callback.\n * @returns Frozen source-aligned points with current cumulative volume and VWAP or null.\n * @see {@link SessionVwapOptions}\n * @see {@link SessionVwapPoint}\n */\nexport function sessionVwap<D>(data: readonly D[], options: SessionVwapOptions<D>): readonly SessionVwapPoint<D>[] {\n const rows = pointData(data, \"sessionVwap\");\n const price = pointAccessor(options.price), volume = pointAccessor(options.volume), session = sessionAccessor(options.session);\n const results: SessionVwapPoint<D>[] = [];\n let activeSession: SessionIdentifier | undefined;\n let cumulativeVolume = 0;\n let average: number | undefined;\n for (let index = 0; index < rows.length; index++) {\n const datum = rows[index]!;\n const currentSession = session(datum, index, rows);\n validSession(currentSession);\n if (activeSession !== currentSession) {\n activeSession = currentSession;\n cumulativeVolume = 0;\n average = undefined;\n }\n if (!(options.defined?.(datum, index, rows) ?? true)) {\n results.push(Object.freeze({ datum, sourceIndex: index, session: currentSession, cumulativeVolume, vwap: null }));\n continue;\n }\n const currentPrice = price(datum, index, rows), currentVolume = volume(datum, index, rows);\n if (!finiteCoordinate(currentPrice) || !finiteCoordinate(currentVolume)) {\n results.push(Object.freeze({ datum, sourceIndex: index, session: currentSession, cumulativeVolume, vwap: null }));\n continue;\n }\n if (currentVolume < 0) throw new RangeError(\"sessionVwap volume must be non-negative.\");\n if (currentVolume > 0) {\n average = average === undefined ? currentPrice : weightedAverage(average, cumulativeVolume, currentPrice, currentVolume);\n cumulativeVolume += currentVolume;\n if (!Number.isFinite(cumulativeVolume)) throw new RangeError(\"sessionVwap cumulative volume must be finite.\");\n }\n results.push(Object.freeze({ datum, sourceIndex: index, session: currentSession, cumulativeVolume, vwap: average ?? null }));\n }\n return Object.freeze(results);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { CandlestickSeries } from "./candlestick-series.js";
|
|
2
|
+
import type { LinearScale } from "./linear-scale-component.js";
|
|
3
|
+
import type { LineAccessor, LinearDomain } from "./types.js";
|
|
4
|
+
/** Inputs that identify complete OHLC candle values. See {@link visibleOhlcPriceExtent}. */
|
|
5
|
+
export interface VisibleOhlcPriceExtentOptions<D> {
|
|
6
|
+
/** UTC-millisecond property or callback. */
|
|
7
|
+
readonly time: LineAccessor<D>;
|
|
8
|
+
/** Opening-price property or callback. */
|
|
9
|
+
readonly open: LineAccessor<D>;
|
|
10
|
+
/** High-price property or callback. */
|
|
11
|
+
readonly high: LineAccessor<D>;
|
|
12
|
+
/** Low-price property or callback. */
|
|
13
|
+
readonly low: LineAccessor<D>;
|
|
14
|
+
/** Closing-price property or callback. */
|
|
15
|
+
readonly close: LineAccessor<D>;
|
|
16
|
+
/**
|
|
17
|
+
* Maps an exact timestamp into the coordinate system used by visibleRange.
|
|
18
|
+
* @param time - Finite UTC-millisecond timestamp from the current source row.
|
|
19
|
+
* @returns A finite position, or undefined to exclude the row.
|
|
20
|
+
* @see ResolvedTradingTimeScale
|
|
21
|
+
*/
|
|
22
|
+
readonly positionAtTime: (time: number) => number | undefined;
|
|
23
|
+
/** Two finite endpoints in the positionAtTime coordinate system; either order is accepted. */
|
|
24
|
+
readonly visibleRange: LinearDomain;
|
|
25
|
+
/**
|
|
26
|
+
* Excludes an original row before any accessor runs.
|
|
27
|
+
* @param datum - Original source row.
|
|
28
|
+
* @param index - Source index.
|
|
29
|
+
* @param data - Complete original source array.
|
|
30
|
+
* @returns Whether this row participates.
|
|
31
|
+
*/
|
|
32
|
+
readonly defined?: (datum: D, index: number, data: readonly D[]) => boolean;
|
|
33
|
+
}
|
|
34
|
+
/** Options for expanding a continuous numeric domain. See {@link padLinearDomain}. */
|
|
35
|
+
export interface PadLinearDomainOptions {
|
|
36
|
+
/** Fraction of the effective span added to each side; defaults to 0.1. */
|
|
37
|
+
readonly padding?: number;
|
|
38
|
+
/** Positive span floor before padding. Flat domains use a deterministic fallback when omitted. */
|
|
39
|
+
readonly minimumSpan?: number;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Finds the ascending low/high extent of complete OHLC rows whose mapped center is visible. See
|
|
43
|
+
* {@link CandlestickSeries}.
|
|
44
|
+
*
|
|
45
|
+
* The supplied position function keeps elapsed-time and fractional trading-slot visibility
|
|
46
|
+
* explicit. It does not sort or mutate data, interpolate timestamps, or use painted pixels.
|
|
47
|
+
* @param data - Original OHLC records in application-owned source order.
|
|
48
|
+
* @param options - Named accessors and one caller-defined visibility coordinate system.
|
|
49
|
+
* @returns Frozen ascending low/high endpoints, or undefined when no complete visible candle exists.
|
|
50
|
+
* @see CandlestickSeries
|
|
51
|
+
*/
|
|
52
|
+
export declare function visibleOhlcPriceExtent<D>(data: readonly D[], options: VisibleOhlcPriceExtentOptions<D>): LinearDomain | undefined;
|
|
53
|
+
/**
|
|
54
|
+
* Expands a finite numeric domain by equal proportional padding on both sides. See
|
|
55
|
+
* {@link LinearScale}.
|
|
56
|
+
*
|
|
57
|
+
* Flat domains first receive minimumSpan or max(abs(value) * 0.02, 1), then padding.
|
|
58
|
+
* Input direction is preserved and output endpoints are frozen.
|
|
59
|
+
* @param domain - Two finite numeric endpoints, including equal values.
|
|
60
|
+
* @param options - Padding fraction and optional positive effective-span floor.
|
|
61
|
+
* @returns A distinct finite padded domain in the input direction.
|
|
62
|
+
* @see LinearScale
|
|
63
|
+
*/
|
|
64
|
+
export declare function padLinearDomain(domain: LinearDomain, options?: PadLinearDomainOptions): LinearDomain;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { finiteCoordinate, pointAccessor, pointData } from "./point-data.js";
|
|
2
|
+
function pair(value, name) {
|
|
3
|
+
if (!Array.isArray(value) || value.length !== 2 || !value.every(Number.isFinite))
|
|
4
|
+
throw new RangeError(`${name} requires two finite endpoints.`);
|
|
5
|
+
return Object.freeze([value[0], value[1]]);
|
|
6
|
+
}
|
|
7
|
+
function visibleOhlcPriceExtent(data, options) {
|
|
8
|
+
const rows = pointData(data, "visibleOhlcPriceExtent");
|
|
9
|
+
if (typeof options.positionAtTime !== "function")
|
|
10
|
+
throw new TypeError("visibleOhlcPriceExtent positionAtTime must be a function.");
|
|
11
|
+
const visibleRange = pair(options.visibleRange, "visibleOhlcPriceExtent visibleRange");
|
|
12
|
+
const minimum = Math.min(...visibleRange), maximum = Math.max(...visibleRange);
|
|
13
|
+
const time = pointAccessor(options.time), open = pointAccessor(options.open), high = pointAccessor(options.high), low = pointAccessor(options.low), close = pointAccessor(options.close);
|
|
14
|
+
let minimumPrice = Infinity, maximumPrice = -Infinity;
|
|
15
|
+
for (let index = 0; index < rows.length; index++) {
|
|
16
|
+
const datum = rows[index];
|
|
17
|
+
if (options.defined && !options.defined(datum, index, rows)) continue;
|
|
18
|
+
const timestamp = time(datum, index, rows);
|
|
19
|
+
if (!finiteCoordinate(timestamp)) continue;
|
|
20
|
+
const position = options.positionAtTime(timestamp);
|
|
21
|
+
if (position === void 0) continue;
|
|
22
|
+
if (!finiteCoordinate(position))
|
|
23
|
+
throw new RangeError("visibleOhlcPriceExtent positionAtTime must return a finite number or undefined.");
|
|
24
|
+
if (position < minimum || position > maximum) continue;
|
|
25
|
+
const opening = open(datum, index, rows), highest = high(datum, index, rows), lowest = low(datum, index, rows), closing = close(datum, index, rows);
|
|
26
|
+
if (!finiteCoordinate(opening) || !finiteCoordinate(highest) || !finiteCoordinate(lowest) || !finiteCoordinate(closing)) continue;
|
|
27
|
+
if (lowest > Math.min(opening, closing) || highest < Math.max(opening, closing))
|
|
28
|
+
throw new RangeError(
|
|
29
|
+
`visibleOhlcPriceExtent: malformed OHLC at source index ${index}; require low <= open/close <= high.`
|
|
30
|
+
);
|
|
31
|
+
minimumPrice = Math.min(minimumPrice, lowest);
|
|
32
|
+
maximumPrice = Math.max(maximumPrice, highest);
|
|
33
|
+
}
|
|
34
|
+
return minimumPrice === Infinity ? void 0 : Object.freeze([minimumPrice, maximumPrice]);
|
|
35
|
+
}
|
|
36
|
+
function padLinearDomain(domain, options = {}) {
|
|
37
|
+
const input = pair(domain, "padLinearDomain domain");
|
|
38
|
+
const padding = options.padding ?? 0.1;
|
|
39
|
+
if (typeof padding !== "number" || !Number.isFinite(padding) || padding < 0)
|
|
40
|
+
throw new RangeError("padLinearDomain padding must be finite and nonnegative.");
|
|
41
|
+
const suppliedMinimum = options.minimumSpan;
|
|
42
|
+
if (suppliedMinimum !== void 0 && (typeof suppliedMinimum !== "number" || !Number.isFinite(suppliedMinimum) || suppliedMinimum <= 0))
|
|
43
|
+
throw new RangeError("padLinearDomain minimumSpan must be finite and positive.");
|
|
44
|
+
const ascending = input[0] <= input[1];
|
|
45
|
+
const lower = Math.min(...input), upper = Math.max(...input);
|
|
46
|
+
const rawSpan = upper - lower;
|
|
47
|
+
let span = rawSpan;
|
|
48
|
+
if (rawSpan === 0) span = suppliedMinimum ?? Math.max(Math.abs(lower) * 0.02, 1);
|
|
49
|
+
else if (suppliedMinimum !== void 0) span = Math.max(rawSpan, suppliedMinimum);
|
|
50
|
+
const midpoint = lower + rawSpan / 2;
|
|
51
|
+
const half = span / 2 + span * padding;
|
|
52
|
+
const start = midpoint - half, end = midpoint + half;
|
|
53
|
+
if (!Number.isFinite(start) || !Number.isFinite(end) || start === end)
|
|
54
|
+
throw new RangeError("padLinearDomain result must have distinct finite endpoints.");
|
|
55
|
+
return Object.freeze(ascending ? [start, end] : [end, start]);
|
|
56
|
+
}
|
|
57
|
+
export {
|
|
58
|
+
padLinearDomain,
|
|
59
|
+
visibleOhlcPriceExtent
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=financial-autoscale.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/features/viz/lib/financial-autoscale.ts"],
|
|
4
|
+
"sourcesContent": ["import type { LineAccessor, LinearDomain } from \"./types.js\";\nimport type { CandlestickSeries } from \"./candlestick-series.js\";\nimport type { LinearScale } from \"./linear-scale-component.js\";\nimport { finiteCoordinate, pointAccessor, pointData } from \"./point-data.js\";\n\n/** Inputs that identify complete OHLC candle values. See {@link visibleOhlcPriceExtent}. */\nexport interface VisibleOhlcPriceExtentOptions<D> {\n /** UTC-millisecond property or callback. */\n readonly time: LineAccessor<D>;\n /** Opening-price property or callback. */\n readonly open: LineAccessor<D>;\n /** High-price property or callback. */\n readonly high: LineAccessor<D>;\n /** Low-price property or callback. */\n readonly low: LineAccessor<D>;\n /** Closing-price property or callback. */\n readonly close: LineAccessor<D>;\n /**\n * Maps an exact timestamp into the coordinate system used by visibleRange.\n * @param time - Finite UTC-millisecond timestamp from the current source row.\n * @returns A finite position, or undefined to exclude the row.\n * @see ResolvedTradingTimeScale\n */\n readonly positionAtTime: (time: number) => number | undefined;\n /** Two finite endpoints in the positionAtTime coordinate system; either order is accepted. */\n readonly visibleRange: LinearDomain;\n /**\n * Excludes an original row before any accessor runs.\n * @param datum - Original source row.\n * @param index - Source index.\n * @param data - Complete original source array.\n * @returns Whether this row participates.\n */\n readonly defined?: (datum: D, index: number, data: readonly D[]) => boolean;\n}\n\n/** Options for expanding a continuous numeric domain. See {@link padLinearDomain}. */\nexport interface PadLinearDomainOptions {\n /** Fraction of the effective span added to each side; defaults to 0.1. */\n readonly padding?: number;\n /** Positive span floor before padding. Flat domains use a deterministic fallback when omitted. */\n readonly minimumSpan?: number;\n}\n\nfunction pair(value: readonly number[], name: string): LinearDomain {\n if (!Array.isArray(value) || value.length !== 2 || !value.every(Number.isFinite))\n throw new RangeError(`${name} requires two finite endpoints.`);\n return Object.freeze([value[0]!, value[1]!]);\n}\n\n/**\n * Finds the ascending low/high extent of complete OHLC rows whose mapped center is visible. See\n * {@link CandlestickSeries}.\n *\n * The supplied position function keeps elapsed-time and fractional trading-slot visibility\n * explicit. It does not sort or mutate data, interpolate timestamps, or use painted pixels.\n * @param data - Original OHLC records in application-owned source order.\n * @param options - Named accessors and one caller-defined visibility coordinate system.\n * @returns Frozen ascending low/high endpoints, or undefined when no complete visible candle exists.\n * @see CandlestickSeries\n */\nexport function visibleOhlcPriceExtent<D>(\n data: readonly D[],\n options: VisibleOhlcPriceExtentOptions<D>,\n): LinearDomain | undefined {\n const rows = pointData(data, \"visibleOhlcPriceExtent\");\n if (typeof options.positionAtTime !== \"function\")\n throw new TypeError(\"visibleOhlcPriceExtent positionAtTime must be a function.\");\n const visibleRange = pair(options.visibleRange, \"visibleOhlcPriceExtent visibleRange\");\n const minimum = Math.min(...visibleRange), maximum = Math.max(...visibleRange);\n const time = pointAccessor(options.time), open = pointAccessor(options.open),\n high = pointAccessor(options.high), low = pointAccessor(options.low), close = pointAccessor(options.close);\n let minimumPrice = Infinity, maximumPrice = -Infinity;\n for (let index = 0; index < rows.length; index++) {\n const datum = rows[index]!;\n if (options.defined && !options.defined(datum, index, rows)) continue;\n const timestamp = time(datum, index, rows);\n if (!finiteCoordinate(timestamp)) continue;\n const position = options.positionAtTime(timestamp);\n if (position === undefined) continue;\n if (!finiteCoordinate(position))\n throw new RangeError(\"visibleOhlcPriceExtent positionAtTime must return a finite number or undefined.\");\n if (position < minimum || position > maximum) continue;\n const opening = open(datum, index, rows), highest = high(datum, index, rows),\n lowest = low(datum, index, rows), closing = close(datum, index, rows);\n if (!finiteCoordinate(opening) || !finiteCoordinate(highest) ||\n !finiteCoordinate(lowest) || !finiteCoordinate(closing)) continue;\n if (lowest > Math.min(opening, closing) || highest < Math.max(opening, closing))\n throw new RangeError(\n `visibleOhlcPriceExtent: malformed OHLC at source index ${index}; require low <= open/close <= high.`,\n );\n minimumPrice = Math.min(minimumPrice, lowest);\n maximumPrice = Math.max(maximumPrice, highest);\n }\n return minimumPrice === Infinity\n ? undefined\n : Object.freeze([minimumPrice, maximumPrice]);\n}\n\n/**\n * Expands a finite numeric domain by equal proportional padding on both sides. See\n * {@link LinearScale}.\n *\n * Flat domains first receive minimumSpan or max(abs(value) * 0.02, 1), then padding.\n * Input direction is preserved and output endpoints are frozen.\n * @param domain - Two finite numeric endpoints, including equal values.\n * @param options - Padding fraction and optional positive effective-span floor.\n * @returns A distinct finite padded domain in the input direction.\n * @see LinearScale\n */\nexport function padLinearDomain(\n domain: LinearDomain,\n options: PadLinearDomainOptions = {},\n): LinearDomain {\n const input = pair(domain, \"padLinearDomain domain\");\n const padding = options.padding ?? 0.1;\n if (typeof padding !== \"number\" || !Number.isFinite(padding) || padding < 0)\n throw new RangeError(\"padLinearDomain padding must be finite and nonnegative.\");\n const suppliedMinimum = options.minimumSpan;\n if (suppliedMinimum !== undefined &&\n (typeof suppliedMinimum !== \"number\" || !Number.isFinite(suppliedMinimum) || suppliedMinimum <= 0))\n throw new RangeError(\"padLinearDomain minimumSpan must be finite and positive.\");\n const ascending = input[0] <= input[1];\n const lower = Math.min(...input), upper = Math.max(...input);\n const rawSpan = upper - lower;\n let span = rawSpan;\n if (rawSpan === 0) span = suppliedMinimum ?? Math.max(Math.abs(lower) * 0.02, 1);\n else if (suppliedMinimum !== undefined) span = Math.max(rawSpan, suppliedMinimum);\n const midpoint = lower + rawSpan / 2;\n const half = span / 2 + span * padding;\n const start = midpoint - half, end = midpoint + half;\n if (!Number.isFinite(start) || !Number.isFinite(end) || start === end)\n throw new RangeError(\"padLinearDomain result must have distinct finite endpoints.\");\n return Object.freeze(ascending ? [start, end] : [end, start]);\n}\n"],
|
|
5
|
+
"mappings": "AAGA,SAAS,kBAAkB,eAAe,iBAAiB;AAyC3D,SAAS,KAAK,OAA0B,MAA4B;AAClE,MAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,KAAK,CAAC,MAAM,MAAM,OAAO,QAAQ;AAC7E,UAAM,IAAI,WAAW,GAAG,IAAI,iCAAiC;AAC/D,SAAO,OAAO,OAAO,CAAC,MAAM,CAAC,GAAI,MAAM,CAAC,CAAE,CAAC;AAC7C;AAaO,SAAS,uBACd,MACA,SAC0B;AAC1B,QAAM,OAAO,UAAU,MAAM,wBAAwB;AACrD,MAAI,OAAO,QAAQ,mBAAmB;AACpC,UAAM,IAAI,UAAU,2DAA2D;AACjF,QAAM,eAAe,KAAK,QAAQ,cAAc,qCAAqC;AACrF,QAAM,UAAU,KAAK,IAAI,GAAG,YAAY,GAAG,UAAU,KAAK,IAAI,GAAG,YAAY;AAC7E,QAAM,OAAO,cAAc,QAAQ,IAAI,GAAG,OAAO,cAAc,QAAQ,IAAI,GACzE,OAAO,cAAc,QAAQ,IAAI,GAAG,MAAM,cAAc,QAAQ,GAAG,GAAG,QAAQ,cAAc,QAAQ,KAAK;AAC3G,MAAI,eAAe,UAAU,eAAe;AAC5C,WAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS;AAChD,UAAM,QAAQ,KAAK,KAAK;AACxB,QAAI,QAAQ,WAAW,CAAC,QAAQ,QAAQ,OAAO,OAAO,IAAI,EAAG;AAC7D,UAAM,YAAY,KAAK,OAAO,OAAO,IAAI;AACzC,QAAI,CAAC,iBAAiB,SAAS,EAAG;AAClC,UAAM,WAAW,QAAQ,eAAe,SAAS;AACjD,QAAI,aAAa,OAAW;AAC5B,QAAI,CAAC,iBAAiB,QAAQ;AAC5B,YAAM,IAAI,WAAW,iFAAiF;AACxG,QAAI,WAAW,WAAW,WAAW,QAAS;AAC9C,UAAM,UAAU,KAAK,OAAO,OAAO,IAAI,GAAG,UAAU,KAAK,OAAO,OAAO,IAAI,GACzE,SAAS,IAAI,OAAO,OAAO,IAAI,GAAG,UAAU,MAAM,OAAO,OAAO,IAAI;AACtE,QAAI,CAAC,iBAAiB,OAAO,KAAK,CAAC,iBAAiB,OAAO,KACzD,CAAC,iBAAiB,MAAM,KAAK,CAAC,iBAAiB,OAAO,EAAG;AAC3D,QAAI,SAAS,KAAK,IAAI,SAAS,OAAO,KAAK,UAAU,KAAK,IAAI,SAAS,OAAO;AAC5E,YAAM,IAAI;AAAA,QACR,0DAA0D,KAAK;AAAA,MACjE;AACF,mBAAe,KAAK,IAAI,cAAc,MAAM;AAC5C,mBAAe,KAAK,IAAI,cAAc,OAAO;AAAA,EAC/C;AACA,SAAO,iBAAiB,WACpB,SACA,OAAO,OAAO,CAAC,cAAc,YAAY,CAAC;AAChD;AAaO,SAAS,gBACd,QACA,UAAkC,CAAC,GACrB;AACd,QAAM,QAAQ,KAAK,QAAQ,wBAAwB;AACnD,QAAM,UAAU,QAAQ,WAAW;AACnC,MAAI,OAAO,YAAY,YAAY,CAAC,OAAO,SAAS,OAAO,KAAK,UAAU;AACxE,UAAM,IAAI,WAAW,yDAAyD;AAChF,QAAM,kBAAkB,QAAQ;AAChC,MAAI,oBAAoB,WACrB,OAAO,oBAAoB,YAAY,CAAC,OAAO,SAAS,eAAe,KAAK,mBAAmB;AAChG,UAAM,IAAI,WAAW,0DAA0D;AACjF,QAAM,YAAY,MAAM,CAAC,KAAK,MAAM,CAAC;AACrC,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,GAAG,QAAQ,KAAK,IAAI,GAAG,KAAK;AAC3D,QAAM,UAAU,QAAQ;AACxB,MAAI,OAAO;AACX,MAAI,YAAY,EAAG,QAAO,mBAAmB,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,MAAM,CAAC;AAAA,WACtE,oBAAoB,OAAW,QAAO,KAAK,IAAI,SAAS,eAAe;AAChF,QAAM,WAAW,QAAQ,UAAU;AACnC,QAAM,OAAO,OAAO,IAAI,OAAO;AAC/B,QAAM,QAAQ,WAAW,MAAM,MAAM,WAAW;AAChD,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,CAAC,OAAO,SAAS,GAAG,KAAK,UAAU;AAChE,UAAM,IAAI,WAAW,6DAA6D;AACpF,SAAO,OAAO,OAAO,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,KAAK,CAAC;AAC9D;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|