minerva-design 1.5.0 → 1.6.0
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/CHANGELOG.md +6 -0
- package/custom-elements.json +122 -5
- package/dist/angular/fesm2022/minerva-angular.mjs +55 -0
- package/dist/angular/fesm2022/minerva-angular.mjs.map +1 -1
- package/dist/angular/types/minerva-angular.d.ts +23 -2
- package/dist/charts/canvas.d.cts +2 -1
- package/dist/charts/canvas.d.ts +2 -1
- package/dist/charts/core.d.cts +1 -1
- package/dist/charts/core.d.ts +1 -1
- package/dist/charts/engine/canvas.cjs +1 -1
- package/dist/charts/engine/canvas.cjs.map +1 -1
- package/dist/charts/engine/canvas.js +2 -1
- package/dist/charts/engine/canvas.js.map +1 -1
- package/dist/charts/engine/chart.cjs +1 -1
- package/dist/charts/engine/chart.cjs.map +1 -1
- package/dist/charts/engine/chart.js +144 -143
- package/dist/charts/engine/chart.js.map +1 -1
- package/dist/charts/engine/controller.cjs +2 -2
- package/dist/charts/engine/controller.cjs.map +1 -1
- package/dist/charts/engine/controller.d.cts +3 -1
- package/dist/charts/engine/controller.d.ts +3 -1
- package/dist/charts/engine/controller.js +130 -132
- package/dist/charts/engine/controller.js.map +1 -1
- package/dist/charts/engine/defaults.cjs.map +1 -1
- package/dist/charts/engine/defaults.d.cts +4 -4
- package/dist/charts/engine/defaults.d.ts +4 -4
- package/dist/charts/engine/defaults.js.map +1 -1
- package/dist/charts/engine/graph/chart.cjs +1 -1
- package/dist/charts/engine/graph/chart.cjs.map +1 -1
- package/dist/charts/engine/graph/chart.js +740 -597
- package/dist/charts/engine/graph/chart.js.map +1 -1
- package/dist/charts/engine/graph/dag.cjs +1 -1
- package/dist/charts/engine/graph/dag.cjs.map +1 -1
- package/dist/charts/engine/graph/dag.js +191 -166
- package/dist/charts/engine/graph/dag.js.map +1 -1
- package/dist/charts/engine/graph/force.cjs +1 -1
- package/dist/charts/engine/graph/force.cjs.map +1 -1
- package/dist/charts/engine/graph/force.d.cts +9 -0
- package/dist/charts/engine/graph/force.d.ts +9 -0
- package/dist/charts/engine/graph/force.js +279 -181
- package/dist/charts/engine/graph/force.js.map +1 -1
- package/dist/charts/engine/graph/geometry.cjs +1 -1
- package/dist/charts/engine/graph/geometry.cjs.map +1 -1
- package/dist/charts/engine/graph/geometry.d.cts +14 -1
- package/dist/charts/engine/graph/geometry.d.ts +14 -1
- package/dist/charts/engine/graph/geometry.js +77 -24
- package/dist/charts/engine/graph/geometry.js.map +1 -1
- package/dist/charts/engine/graph/model.cjs +1 -1
- package/dist/charts/engine/graph/model.cjs.map +1 -1
- package/dist/charts/engine/graph/model.d.cts +9 -0
- package/dist/charts/engine/graph/model.d.ts +9 -0
- package/dist/charts/engine/graph/model.js +63 -43
- package/dist/charts/engine/graph/model.js.map +1 -1
- package/dist/charts/engine/graph/types.d.cts +14 -0
- package/dist/charts/engine/graph/types.d.ts +14 -0
- package/dist/charts/engine/graph/worker.cjs +12 -6
- package/dist/charts/engine/graph/worker.cjs.map +1 -1
- package/dist/charts/engine/graph/worker.js +12 -6
- package/dist/charts/engine/graph/worker.js.map +1 -1
- package/dist/charts/engine/labels.cjs.map +1 -1
- package/dist/charts/engine/labels.d.cts +17 -0
- package/dist/charts/engine/labels.d.ts +17 -0
- package/dist/charts/engine/labels.js.map +1 -1
- package/dist/charts/engine/model.cjs +1 -1
- package/dist/charts/engine/model.cjs.map +1 -1
- package/dist/charts/engine/model.d.cts +33 -0
- package/dist/charts/engine/model.d.ts +33 -0
- package/dist/charts/engine/model.js +149 -126
- package/dist/charts/engine/model.js.map +1 -1
- package/dist/charts/engine/orderbook/field.cjs +37 -0
- package/dist/charts/engine/orderbook/field.cjs.map +1 -0
- package/dist/charts/engine/orderbook/field.d.cts +92 -0
- package/dist/charts/engine/orderbook/field.d.ts +92 -0
- package/dist/charts/engine/orderbook/field.js +297 -0
- package/dist/charts/engine/orderbook/field.js.map +1 -0
- package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
- package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
- package/dist/charts/engine/orderbook/heatmap.js +413 -441
- package/dist/charts/engine/orderbook/heatmap.js.map +1 -1
- package/dist/charts/engine/orderbook/host.cjs +1 -1
- package/dist/charts/engine/orderbook/host.cjs.map +1 -1
- package/dist/charts/engine/orderbook/host.d.cts +8 -1
- package/dist/charts/engine/orderbook/host.d.ts +8 -1
- package/dist/charts/engine/orderbook/host.js +27 -5
- package/dist/charts/engine/orderbook/host.js.map +1 -1
- package/dist/charts/engine/orderbook/ladder.cjs +1 -1
- package/dist/charts/engine/orderbook/ladder.cjs.map +1 -1
- package/dist/charts/engine/orderbook/ladder.js +1 -1
- package/dist/charts/engine/orderbook/ladder.js.map +1 -1
- package/dist/charts/engine/orderbook/layout.cjs +1 -1
- package/dist/charts/engine/orderbook/layout.cjs.map +1 -1
- package/dist/charts/engine/orderbook/layout.d.cts +5 -0
- package/dist/charts/engine/orderbook/layout.d.ts +5 -0
- package/dist/charts/engine/orderbook/layout.js +8 -2
- package/dist/charts/engine/orderbook/layout.js.map +1 -1
- package/dist/charts/engine/orderbook/tape.cjs +1 -1
- package/dist/charts/engine/orderbook/tape.cjs.map +1 -1
- package/dist/charts/engine/orderbook/tape.js +3 -3
- package/dist/charts/engine/orderbook/tape.js.map +1 -1
- package/dist/charts/engine/orderbook/types.d.cts +12 -4
- package/dist/charts/engine/orderbook/types.d.ts +12 -4
- package/dist/charts/engine/overlay.cjs +1 -1
- package/dist/charts/engine/overlay.cjs.map +1 -1
- package/dist/charts/engine/overlay.d.cts +17 -0
- package/dist/charts/engine/overlay.d.ts +17 -0
- package/dist/charts/engine/overlay.js +29 -13
- package/dist/charts/engine/overlay.js.map +1 -1
- package/dist/charts/engine/presets.cjs +1 -1
- package/dist/charts/engine/presets.cjs.map +1 -1
- package/dist/charts/engine/presets.d.cts +12 -2
- package/dist/charts/engine/presets.d.ts +12 -2
- package/dist/charts/engine/presets.js +8 -2
- package/dist/charts/engine/presets.js.map +1 -1
- package/dist/charts/engine/renderers/canvas2d.cjs +1 -1
- package/dist/charts/engine/renderers/canvas2d.cjs.map +1 -1
- package/dist/charts/engine/renderers/canvas2d.js +13 -9
- package/dist/charts/engine/renderers/canvas2d.js.map +1 -1
- package/dist/charts/engine/renderers/follow.cjs +2 -0
- package/dist/charts/engine/renderers/follow.cjs.map +1 -0
- package/dist/charts/engine/renderers/follow.d.cts +8 -0
- package/dist/charts/engine/renderers/follow.d.ts +8 -0
- package/dist/charts/engine/renderers/follow.js +10 -0
- package/dist/charts/engine/renderers/follow.js.map +1 -0
- package/dist/charts/engine/renderers/gl-budget.cjs +2 -0
- package/dist/charts/engine/renderers/gl-budget.cjs.map +1 -0
- package/dist/charts/engine/renderers/gl-budget.d.cts +32 -0
- package/dist/charts/engine/renderers/gl-budget.d.ts +32 -0
- package/dist/charts/engine/renderers/gl-budget.js +95 -0
- package/dist/charts/engine/renderers/gl-budget.js.map +1 -0
- package/dist/charts/engine/renderers/gl.cjs +1 -1
- package/dist/charts/engine/renderers/gl.cjs.map +1 -1
- package/dist/charts/engine/renderers/gl.js +1 -1
- package/dist/charts/engine/renderers/gl.js.map +1 -1
- package/dist/charts/engine/renderers/shaders.cjs +9 -6
- package/dist/charts/engine/renderers/shaders.cjs.map +1 -1
- package/dist/charts/engine/renderers/shaders.d.cts +1 -1
- package/dist/charts/engine/renderers/shaders.d.ts +1 -1
- package/dist/charts/engine/renderers/shaders.js +9 -6
- package/dist/charts/engine/renderers/shaders.js.map +1 -1
- package/dist/charts/engine/renderers/types.cjs.map +1 -1
- package/dist/charts/engine/renderers/types.d.cts +2 -0
- package/dist/charts/engine/renderers/types.d.ts +2 -0
- package/dist/charts/engine/renderers/types.js.map +1 -1
- package/dist/charts/engine/renderers/webgl.cjs +1 -1
- package/dist/charts/engine/renderers/webgl.cjs.map +1 -1
- package/dist/charts/engine/renderers/webgl.js +85 -64
- package/dist/charts/engine/renderers/webgl.js.map +1 -1
- package/dist/charts/engine/renderers/webgl2.cjs +1 -1
- package/dist/charts/engine/renderers/webgl2.cjs.map +1 -1
- package/dist/charts/engine/renderers/webgl2.js +72 -58
- package/dist/charts/engine/renderers/webgl2.js.map +1 -1
- package/dist/charts/engine/renderers/webgpu.cjs +1 -1
- package/dist/charts/engine/renderers/webgpu.cjs.map +1 -1
- package/dist/charts/engine/renderers/webgpu.js +1 -1
- package/dist/charts/engine/renderers/webgpu.js.map +1 -1
- package/dist/charts/engine/scene.cjs +1 -1
- package/dist/charts/engine/scene.cjs.map +1 -1
- package/dist/charts/engine/scene.d.cts +51 -4
- package/dist/charts/engine/scene.d.ts +51 -4
- package/dist/charts/engine/scene.js +188 -122
- package/dist/charts/engine/scene.js.map +1 -1
- package/dist/charts/engine/shapes/chord.cjs +1 -1
- package/dist/charts/engine/shapes/chord.cjs.map +1 -1
- package/dist/charts/engine/shapes/chord.js +108 -103
- package/dist/charts/engine/shapes/chord.js.map +1 -1
- package/dist/charts/engine/shapes/types.d.cts +5 -3
- package/dist/charts/engine/shapes/types.d.ts +5 -3
- package/dist/charts/engine/three-d/canvas2d.cjs +1 -1
- package/dist/charts/engine/three-d/canvas2d.cjs.map +1 -1
- package/dist/charts/engine/three-d/canvas2d.d.cts +36 -1
- package/dist/charts/engine/three-d/canvas2d.d.ts +36 -1
- package/dist/charts/engine/three-d/canvas2d.js +155 -80
- package/dist/charts/engine/three-d/canvas2d.js.map +1 -1
- package/dist/charts/engine/three-d/chart.cjs +1 -1
- package/dist/charts/engine/three-d/chart.cjs.map +1 -1
- package/dist/charts/engine/three-d/chart.js +219 -215
- package/dist/charts/engine/three-d/chart.js.map +1 -1
- package/dist/charts/engine/three-d/oit.cjs +109 -0
- package/dist/charts/engine/three-d/oit.cjs.map +1 -0
- package/dist/charts/engine/three-d/oit.d.cts +34 -0
- package/dist/charts/engine/three-d/oit.d.ts +34 -0
- package/dist/charts/engine/three-d/oit.js +111 -0
- package/dist/charts/engine/three-d/oit.js.map +1 -0
- package/dist/charts/engine/three-d/render-types.cjs +1 -1
- package/dist/charts/engine/three-d/render-types.cjs.map +1 -1
- package/dist/charts/engine/three-d/render-types.d.cts +16 -3
- package/dist/charts/engine/three-d/render-types.d.ts +16 -3
- package/dist/charts/engine/three-d/render-types.js +6 -9
- package/dist/charts/engine/three-d/render-types.js.map +1 -1
- package/dist/charts/engine/three-d/shaders.cjs +52 -26
- package/dist/charts/engine/three-d/shaders.cjs.map +1 -1
- package/dist/charts/engine/three-d/shaders.d.cts +11 -3
- package/dist/charts/engine/three-d/shaders.d.ts +11 -3
- package/dist/charts/engine/three-d/shaders.js +84 -40
- package/dist/charts/engine/three-d/shaders.js.map +1 -1
- package/dist/charts/engine/three-d/sort.cjs +1 -1
- package/dist/charts/engine/three-d/sort.cjs.map +1 -1
- package/dist/charts/engine/three-d/sort.d.cts +6 -4
- package/dist/charts/engine/three-d/sort.d.ts +6 -4
- package/dist/charts/engine/three-d/sort.js +51 -39
- package/dist/charts/engine/three-d/sort.js.map +1 -1
- package/dist/charts/engine/three-d/types.d.cts +9 -0
- package/dist/charts/engine/three-d/types.d.ts +9 -0
- package/dist/charts/engine/three-d/webgl.cjs +1 -1
- package/dist/charts/engine/three-d/webgl.cjs.map +1 -1
- package/dist/charts/engine/three-d/webgl.d.cts +9 -0
- package/dist/charts/engine/three-d/webgl.d.ts +9 -0
- package/dist/charts/engine/three-d/webgl.js +199 -76
- package/dist/charts/engine/three-d/webgl.js.map +1 -1
- package/dist/charts/engine/three-d/webgpu.cjs +1 -1
- package/dist/charts/engine/three-d/webgpu.cjs.map +1 -1
- package/dist/charts/engine/three-d/webgpu.js +225 -99
- package/dist/charts/engine/three-d/webgpu.js.map +1 -1
- package/dist/charts/engine/trading/chart.cjs +1 -1
- package/dist/charts/engine/trading/chart.cjs.map +1 -1
- package/dist/charts/engine/trading/chart.d.cts +0 -1
- package/dist/charts/engine/trading/chart.d.ts +0 -1
- package/dist/charts/engine/trading/chart.js +1048 -883
- package/dist/charts/engine/trading/chart.js.map +1 -1
- package/dist/charts/engine/trading/drawings.cjs +2 -2
- package/dist/charts/engine/trading/drawings.cjs.map +1 -1
- package/dist/charts/engine/trading/drawings.d.cts +6 -0
- package/dist/charts/engine/trading/drawings.d.ts +6 -0
- package/dist/charts/engine/trading/drawings.js +100 -88
- package/dist/charts/engine/trading/drawings.js.map +1 -1
- package/dist/charts/engine/trading/format.cjs +1 -1
- package/dist/charts/engine/trading/format.cjs.map +1 -1
- package/dist/charts/engine/trading/format.d.cts +6 -0
- package/dist/charts/engine/trading/format.d.ts +6 -0
- package/dist/charts/engine/trading/format.js +42 -30
- package/dist/charts/engine/trading/format.js.map +1 -1
- package/dist/charts/engine/trading/geometry.cjs +1 -1
- package/dist/charts/engine/trading/geometry.cjs.map +1 -1
- package/dist/charts/engine/trading/geometry.d.cts +16 -0
- package/dist/charts/engine/trading/geometry.d.ts +16 -0
- package/dist/charts/engine/trading/geometry.js +19 -4
- package/dist/charts/engine/trading/geometry.js.map +1 -1
- package/dist/charts/engine/trading/labels.cjs +1 -1
- package/dist/charts/engine/trading/labels.cjs.map +1 -1
- package/dist/charts/engine/trading/labels.js +24 -4
- package/dist/charts/engine/trading/labels.js.map +1 -1
- package/dist/charts/engine/trading/studies.cjs +1 -1
- package/dist/charts/engine/trading/studies.cjs.map +1 -1
- package/dist/charts/engine/trading/studies.d.cts +8 -0
- package/dist/charts/engine/trading/studies.d.ts +8 -0
- package/dist/charts/engine/trading/studies.js +4 -1
- package/dist/charts/engine/trading/studies.js.map +1 -1
- package/dist/charts/engine/trading/types.d.cts +34 -11
- package/dist/charts/engine/trading/types.d.ts +34 -11
- package/dist/charts/engine/types.d.cts +25 -4
- package/dist/charts/engine/types.d.ts +25 -4
- package/dist/charts/react/charts.cjs +1 -1
- package/dist/charts/react/charts.cjs.map +1 -1
- package/dist/charts/react/charts.js +20 -15
- package/dist/charts/react/charts.js.map +1 -1
- package/dist/charts/react/graph.cjs +1 -1
- package/dist/charts/react/graph.cjs.map +1 -1
- package/dist/charts/react/graph.d.cts +6 -0
- package/dist/charts/react/graph.d.ts +6 -0
- package/dist/charts/react/graph.js +28 -27
- package/dist/charts/react/graph.js.map +1 -1
- package/dist/charts/react/orderbook.cjs +1 -1
- package/dist/charts/react/orderbook.cjs.map +1 -1
- package/dist/charts/react/orderbook.d.cts +3 -1
- package/dist/charts/react/orderbook.d.ts +3 -1
- package/dist/charts/react/orderbook.js +1 -0
- package/dist/charts/react/orderbook.js.map +1 -1
- package/dist/charts/react/shapes.cjs.map +1 -1
- package/dist/charts/react/shapes.d.cts +4 -3
- package/dist/charts/react/shapes.d.ts +4 -3
- package/dist/charts/react/shapes.js.map +1 -1
- package/dist/charts/react/three-d.cjs +1 -1
- package/dist/charts/react/three-d.cjs.map +1 -1
- package/dist/charts/react/three-d.d.cts +7 -0
- package/dist/charts/react/three-d.d.ts +7 -0
- package/dist/charts/react/three-d.js +14 -13
- package/dist/charts/react/three-d.js.map +1 -1
- package/dist/charts/react/trading.cjs.map +1 -1
- package/dist/charts/react/trading.d.cts +3 -3
- package/dist/charts/react/trading.d.ts +3 -3
- package/dist/charts/react/trading.js.map +1 -1
- package/dist/core/contracts.cjs +1 -1
- package/dist/core/contracts.cjs.map +1 -1
- package/dist/core/contracts.js +1 -1
- package/dist/core/contracts.js.map +1 -1
- package/dist/native/charts/src/canvas.cjs +1 -1
- package/dist/native/charts/src/canvas.js +4 -3
- package/dist/native/charts/src/engine/controller.cjs +2 -2
- package/dist/native/charts/src/engine/controller.cjs.map +1 -1
- package/dist/native/charts/src/engine/controller.js +102 -104
- package/dist/native/charts/src/engine/controller.js.map +1 -1
- package/dist/native/charts/src/engine/labels.cjs +1 -1
- package/dist/native/charts/src/engine/labels.cjs.map +1 -1
- package/dist/native/charts/src/engine/labels.js +14 -1
- package/dist/native/charts/src/engine/labels.js.map +1 -1
- package/dist/native/charts/src/engine/model.cjs +1 -1
- package/dist/native/charts/src/engine/model.cjs.map +1 -1
- package/dist/native/charts/src/engine/model.js +180 -157
- package/dist/native/charts/src/engine/model.js.map +1 -1
- package/dist/native/charts/src/engine/overlay.cjs.map +1 -1
- package/dist/native/charts/src/engine/overlay.js.map +1 -1
- package/dist/native/charts/src/engine/presets.cjs +1 -1
- package/dist/native/charts/src/engine/presets.cjs.map +1 -1
- package/dist/native/charts/src/engine/presets.js +8 -2
- package/dist/native/charts/src/engine/presets.js.map +1 -1
- package/dist/native/charts/src/engine/scene.cjs +1 -1
- package/dist/native/charts/src/engine/scene.cjs.map +1 -1
- package/dist/native/charts/src/engine/scene.js +188 -122
- package/dist/native/charts/src/engine/scene.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/chord.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/chord.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/chord.js +108 -103
- package/dist/native/charts/src/engine/shapes/chord.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/layout.cjs +2 -2
- package/dist/native/charts/src/engine/shapes/layout.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/layout.js +88 -73
- package/dist/native/charts/src/engine/shapes/layout.js.map +1 -1
- package/dist/native/components/Chart/ChartBase.cjs +1 -1
- package/dist/native/components/Chart/ChartBase.cjs.map +1 -1
- package/dist/native/components/Chart/ChartBase.js +127 -115
- package/dist/native/components/Chart/ChartBase.js.map +1 -1
- package/dist/native/components/Chart/charts.cjs +1 -1
- package/dist/native/components/Chart/charts.cjs.map +1 -1
- package/dist/native/components/Chart/charts.js +8 -5
- package/dist/native/components/Chart/charts.js.map +1 -1
- package/dist/native/components/Chart/scene.cjs +1 -1
- package/dist/native/components/Chart/scene.cjs.map +1 -1
- package/dist/native/components/Chart/scene.d.cts +6 -1
- package/dist/native/components/Chart/scene.d.ts +6 -1
- package/dist/native/components/Chart/scene.js +99 -50
- package/dist/native/components/Chart/scene.js.map +1 -1
- package/dist/native/components/Chart/types.d.cts +7 -1
- package/dist/native/components/Chart/types.d.ts +7 -1
- package/dist/native/components/Charts/charts.cjs +1 -1
- package/dist/native/components/Charts/charts.cjs.map +1 -1
- package/dist/native/components/Charts/charts.js +23 -18
- package/dist/native/components/Charts/charts.js.map +1 -1
- package/dist/native/components/ShapeChart/ShapeChartBase.cjs +1 -1
- package/dist/native/components/ShapeChart/ShapeChartBase.cjs.map +1 -1
- package/dist/native/components/ShapeChart/ShapeChartBase.d.cts +1 -1
- package/dist/native/components/ShapeChart/ShapeChartBase.d.ts +1 -1
- package/dist/native/components/ShapeChart/ShapeChartBase.js +97 -107
- package/dist/native/components/ShapeChart/ShapeChartBase.js.map +1 -1
- package/dist/native/components/ShapeChart/geometry.cjs +1 -1
- package/dist/native/components/ShapeChart/geometry.cjs.map +1 -1
- package/dist/native/components/ShapeChart/geometry.js +120 -36
- package/dist/native/components/ShapeChart/geometry.js.map +1 -1
- package/dist/native/components/ShapeChart/types.d.cts +6 -4
- package/dist/native/components/ShapeChart/types.d.ts +6 -4
- package/dist/native/source/components/Chart/ChartBase.tsx +19 -6
- package/dist/native/source/components/Chart/charts.tsx +10 -3
- package/dist/native/source/components/Chart/scene.tsx +85 -0
- package/dist/native/source/components/Chart/types.ts +7 -0
- package/dist/native/source/components/Charts/charts.tsx +7 -0
- package/dist/native/source/components/ShapeChart/ShapeChartBase.tsx +10 -36
- package/dist/native/source/components/ShapeChart/geometry.ts +188 -18
- package/dist/native/source/components/ShapeChart/types.ts +6 -4
- package/dist/taro/chart-a11y.d.ts +7 -0
- package/dist/taro/charts.d.ts +4 -1
- package/dist/taro/index.js +3212 -3049
- package/dist/taro/shape-charts.d.ts +6 -4
- package/dist/uni/AreaChart.vue +2 -1
- package/dist/uni/AreaChart.vue.d.ts +1 -1
- package/dist/uni/BarChart.vue +2 -1
- package/dist/uni/BarChart.vue.d.ts +1 -1
- package/dist/uni/BoxPlotChart.vue +2 -1
- package/dist/uni/BubbleChart.vue +2 -1
- package/dist/uni/CandlestickChart.vue +2 -1
- package/dist/uni/Chart.vue +2 -1
- package/dist/uni/Divider.vue.d.ts +1 -1
- package/dist/uni/DonutChart.vue.d.ts +1 -1
- package/dist/uni/GanttChart.vue +2 -1
- package/dist/uni/GanttChart.vue.d.ts +11 -0
- package/dist/uni/GaugeChart.vue.d.ts +1 -1
- package/dist/uni/HeatmapChart.vue +2 -1
- package/dist/uni/HistogramChart.vue +2 -1
- package/dist/uni/HorizontalBarChart.vue +2 -1
- package/dist/uni/HorizontalBarChart.vue.d.ts +1 -1
- package/dist/uni/LineChart.vue +2 -1
- package/dist/uni/MixedChart.vue +2 -1
- package/dist/uni/PieChart.vue.d.ts +1 -1
- package/dist/uni/QuadrantChart.vue +2 -1
- package/dist/uni/RangeAreaChart.vue +2 -1
- package/dist/uni/ScatterChart.vue +2 -1
- package/dist/uni/Sparkline.vue +2 -1
- package/dist/uni/WaterfallChart.vue +2 -1
- package/dist/uni/chart-a11y.d.ts +7 -0
- package/dist/uni/chart-a11y.js +29 -0
- package/dist/uni/chart-canvas.d.ts +9 -0
- package/dist/uni/chart-canvas.js +11 -1
- package/dist/uni/chart-types.d.ts +8 -1
- package/dist/uni/chart-types.js +5 -1
- package/dist/uni/charts-canvas.js +2 -1
- package/dist/uni/named-chart-options.d.ts +2 -0
- package/dist/uni/named-chart-options.js +3 -0
- package/dist/uni/shape-chart-canvas.d.ts +0 -2
- package/dist/uni/shape-chart-canvas.js +4 -36
- package/dist/uni/shape-chart-types.d.ts +2 -2
- package/dist/uni/shape-chart-types.js +2 -2
- package/dist/vue/components/Chart/Bar3DChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/DependencyGraph.vue.d.ts +2 -0
- package/dist/vue/components/Chart/GanttChart.vue.d.ts +15 -0
- package/dist/vue/components/Chart/GanttChart.vue.js.map +1 -1
- package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js +8 -0
- package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/vue/components/Chart/GraphChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/Line3DChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/Scatter3DChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/Surface3DChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/TradingChart.vue.d.ts +9 -0
- package/dist/vue/components/Chart/TreeChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/graph.d.ts +3 -0
- package/dist/vue/components/Chart/graph.js +2 -0
- package/dist/vue/components/Chart/graph.js.map +1 -1
- package/dist/vue/components/Chart/three-d.d.ts +3 -0
- package/dist/vue/components/Chart/three-d.js +2 -0
- package/dist/vue/components/Chart/three-d.js.map +1 -1
- package/dist/vue/components/Chart/trading.d.ts +7 -2
- package/dist/vue/components/Chart/trading.js +1 -0
- package/dist/vue/components/Chart/trading.js.map +1 -1
- package/dist/weapp/area-chart/index.wxml +1 -1
- package/dist/weapp/bar-chart/index.wxml +1 -1
- package/dist/weapp/box-plot-chart/index.wxml +1 -1
- package/dist/weapp/bubble-chart/index.wxml +1 -1
- package/dist/weapp/candlestick-chart/index.wxml +1 -1
- package/dist/weapp/chart/index.wxml +1 -1
- package/dist/weapp/charts/canvas.js +326 -54
- package/dist/weapp/charts/core.js +2 -0
- package/dist/weapp/controls.js +58 -27
- package/dist/weapp/gantt-chart/index.wxml +1 -1
- package/dist/weapp/heatmap-chart/index.wxml +1 -1
- package/dist/weapp/histogram-chart/index.wxml +1 -1
- package/dist/weapp/horizontal-bar-chart/index.wxml +1 -1
- package/dist/weapp/line-chart/index.wxml +1 -1
- package/dist/weapp/mixed-chart/index.wxml +1 -1
- package/dist/weapp/quadrant-chart/index.wxml +1 -1
- package/dist/weapp/range-area-chart/index.wxml +1 -1
- package/dist/weapp/scatter-chart/index.wxml +1 -1
- package/dist/weapp/sparkline/index.wxml +1 -1
- package/dist/weapp/types.d.ts +11 -2
- package/dist/weapp/waterfall-chart/index.wxml +1 -1
- package/dist/web-components/components/chart/extended.d.ts +4 -0
- package/dist/web-components/components/chart/extended.js +8 -2
- package/dist/web-components/components/chart/extended.js.map +1 -1
- package/dist/web-components/components/chart-3d/chart-3d.d.ts +1 -1
- package/dist/web-components/components/chart-3d/chart-3d.js.map +1 -1
- package/dist/web-components/components/graph/graph.d.ts +2 -0
- package/dist/web-components/components/graph/graph.js +3 -2
- package/dist/web-components/components/graph/graph.js.map +1 -1
- package/dist/web-components/components/trading-chart/trading-chart.d.ts +1 -1
- package/dist/web-components/components/trading-chart/trading-chart.js.map +1 -1
- package/dist/web-components/html-custom-data.json +45 -0
- package/dist/web-components/types/react.d.ts +4 -4
- package/dist/web-components/types/solid.d.ts +8 -8
- package/dist/web-components/types/svelte.d.ts +8 -8
- package/dist/web-components/types/vue.d.ts +4 -4
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart.cjs","names":["parseColor","luminance","styleElement","createStore","createPyramid","DAY","readTheme","resolveLocale","localeLabels","TRADING_LABELS","toCss","priceFormatter","parseTimeframe","indexOfTime","zoneOffset","MINUTE","rangeLevel","createRangePyramid","lowerBoundTime","detectPrecision","inferTimeframe","buildStudies","LINE_COLORS","inputLength","barAt","storeUpdate","createScale","pyramidLevel","toScaled","boundaryWeight","pickTicks","tickText","formatPercent","stepDecimals","fromScaled","formatVolume","formatFixed","packColor","candleMetrics","yOf","LineBuffer","BarBuffer","pixelRange","yOfScaled","AreaBuffer","clampRange","mix","volumeProfile","valueAt","HOUR","fill","paintDrawing","formatCountdown","formatCrosshairTime","scaledAt","scaleTicks","readBar","hitDrawing","isFillable","handlePoints","isPosition","anchorCount","moveHandle","themeColorsChanged","watchTheme","createRenderer","createDataCanvas","isTimeZone","storeAppend","storePrepend","require_dom","require_color","require_locale","require_scale","require_detect","require_theme","require_drawings","require_format","require_geometry","require_indicators","require_labels","require_scale$1","require_store","require_studies","TIME_AXIS","MIN_AXIS","MAX_SPACING","MIN_PANE","PRICE","UP","DOWN","WARNING","PRIMARY","HISTORY_LIMIT","PALETTE","LINE_STYLES","syncHooks","PRICE_LINE_TITLES","clamp","v","lo","hi","textOn","color","fill","finite","createTradingChart","doc","container","win","options","initial","destroyed","make","tag","style","root","layer","background","foreground","legends","jump","live","toolbar","editor","sheet","store","pyramid","ha","haValid","haPyramid","studies","studyValid","visibility","compares","outputLods","dataVersion","tailVersion","detectedPrecision","inferredTimeframe","spacing","right","plotW","plotH","axisW","width","height","panes","scales","paneHeights","vis","volumeOverlayMax","theme","themeVersion","optionsVersion","renderer","rendererToken","frameId","layers","geomKey","builtTail","itemVersion","resolveReady","ready","resolve","pointer","keyboardIndex","gesture","touches","pinch","kinetic","scrollAnim","pendingRange","drawings","emittedDrawings","committed","undoStack","redoStack","undoKey","tool","selected","hovered","draft","draftClicks","draftPane","drawingCounter","textBoxes","editing","toolbarKey","paletteOpen","lineOverrides","hoveredLine","canvasButtons","hoveredButton","lastRange","silentRange","externalCross","lastCrosshair","historyFirst","countdownTimer","replay","replayPicking","replaySpeed","profile","listeners","emit","type","fn","event","locale","texts","resolveTexts","labels","n","redUp","upCss","downCss","css","fallback","value","alpha","precision","priceFormat","priceFormatKey","formatPrice","key","timeframe","tfMs","font","weight","size","isVisible","study","xOf","index","indexAt","x","timeAt","count","i","timeAtFrac","edge","t","indexAtTimeFrac","time","span","zone","offsetMinutes","studyOffset","shift","colorOf","groupRanges","lod","values","lodOf","out","indexOfTimeExt","last","display","markDirty","from","c","level","l","p","syncDerived","valid","next","j","afterDataChange","invalidate","rebuildStudies","reused","id","s","rebuildCompares","data","series","a","b","d","followsRealtime","replaceBars","bars","scale","applyBarsOption","length","first","follow","before","at","added","layoutPanes","paneStudies","available","wanted","total","max","k","heights","h","priceHeight","scaleOf","mode","price","top","paneAt","y","clampView","minSpacing","computeVisible","left","src","cols","i0","i1","r0","r1","groupCenter","g","groupBars","firstVisibleIndex","compareBase","compareScaled","base","baselinePrice","outputExtent","r","offset","shiftBars","range","autoscale","pane","closeOnly","vol","extent","scaled","band","timeTicks","tf","intraday","gEnd","groupTime","candidates","prev","sample","gap","ctx","paneTickText","studyValueText","createLayers","result","up","down","upP","downP","bg","metrics","dpr","X","histogramHalf","volumeColors","bottom","Y","lineLayer","buffer","isLive","ga","gb","toY","lineWidth","rangeLayer","dx","extra","to","prevY","yLo","yHi","second","st","lineColor","area","yb","upArea","downArea","upLine","downLine","px","py","point","hollow","ohlc","wick","body","wicks","bodies","caps","ticks","tick","o","cx","wt","wb","side","bt","bb","segments","edges","box","items","y0","strong","faded","fixed","radius","half","runLayer","lastMain","version","item","renderData","canvas","bw","bh","sizeCanvas","w","roundRect","paintFill","outA","f","outB","ra","rb","above","below","run","sign","flush","ya","d0","cy","paintSessionBreaks","xs","prevDay","day","profileOptions","option","paintVolumeProfile","rows","largest","fromRight","upColor","downColor","y1","upLength","downLength","dir","start","paintBackground","grid","showGrid","ys","axisLabel","textColor","text","priceAxisText","line","kind","linePrice","crosshairState","bar","best","yy","paneOf","drawingMapper","formatSpan","abs","ms","parts","days","hours","minutes","paneValueText","roundPrice","step","pill","align","fillColor","canvasButton","paintDrawings","all","position","mapper","own","drawing","colors","paintForeground","muted","bgCss","upC","downC","hiG","loG","label","labelLeft","row","priceLegend","roomRight","roomLeft","leftSide","tx","stack","many","marker","sell","anchor","tip","lastClose","lineStyle","titleKey","title","pnl","pnlFill","widths","part","grip","partFill","lastLine","lastUp","lastColor","compareLabels","covered","end","date","badgeY","cross","labelBg","textValue","bx","by","orderPrice","hover","legendKey","legendRows","legendBoxes","legendBox","legendRow","button","updateLegends","outputs","buildLegends","priceBox","head","slots","titleOf","setSpan","maxWidth","prevClose","change","html","name","escapeHtml","pct","shown","source","prefix","ch","frame","animate","active","now","eased","dt","measureAxis","widest","animating","fg","pass","applyRange","bands","updateJump","updateToolbar","positionEditor","emitView","buttonAt","updateCursor","show","visibleRange","local","rect","zoomAt","factor","anchorAt","setTool","notify","select","undoState","emitUndo","state","commitDrawings","restoreDrawings","undo","previous","closeEditor","redo","updateDrawing","patch","removeDrawing","positionPoints","entry","risk","target","long","stop","finishDraft","done","openEditor","fixDraftAnchor","followDraft","hitLine","hitDrawingAt","hit","separatorAt","autosizeEditor","created","commit","icon","dash","path","toolbarButton","pressed","content","onClick","separator","buildToolbar","swatch","remove","palette","dragging","pts","x0","x1","replayState","emitReplay","columnsOf","showBars","hasVolume","stopReplayTimer","beginReplay","replayStepBy","playReplay","speed","interval","perTick","endReplay","wasPicking","restore","cursor","nextHover","onPointerDown","sep","anchors","onPointerMove","distance","mid","lastIndex","dy","nextBelow","points","di","ds","onPointerUp","onPointerLeave","onWheel","unit","modifier","onDoubleClick","instance","announce","page","move","current","keyboard","resizeObserver","refreshTheme","unwatchTheme","langObserver","applyStatic","compose","origin","view","element","computed","fullscreen","onFullscreen","initRenderer","token","exclude","symbol","wantTimer","applyOptions","nextZone","timeChanged","animateScroll","quality","visible","set","listener"],"sources":["../../../../../charts/src/engine/trading/chart.ts"],"sourcesContent":["// Trading chart: candles (or bars, lines, areas...) over a gap-free index\n// axis, indicator panes, price lines, markers, drawings and streaming.\n//\n// Layers, bottom to top: a Canvas2D background (grid, bands, watermark),\n// the GPU data canvas covering every pane (candles, volumes, indicator\n// lines, baked in device pixels), a Canvas2D overlay (axes, labels, price\n// lines, markers, drawings, crosshair) and DOM legends. The GPU items are\n// rebuilt only when the view, the scales or the data change; a tick\n// rebuilds only the items of the last bar.\n\nimport {\n luminance,\n mix,\n packColor,\n parseColor,\n toCss,\n type Rgba,\n} from \"../color\";\nimport { createDataCanvas, styleElement } from \"../dom\";\nimport { createRenderer } from \"../renderers/detect\";\nimport type { ChartRenderer, RenderItem } from \"../renderers/types\";\nimport { stepDecimals } from \"../scale\";\nimport {\n readTheme,\n themeColorsChanged,\n watchTheme,\n type ChartTheme,\n} from \"../theme\";\nimport type { ChartRendererKind } from \"../types\";\nimport { localeLabels, resolveLocale } from \"../locale\";\nimport {\n anchorCount,\n handlePoints,\n hitDrawing,\n isFillable,\n isPosition,\n moveHandle,\n paintDrawing,\n setDash,\n type Box,\n type DrawingMapper,\n} from \"./drawings\";\nimport {\n DAY,\n HOUR,\n MINUTE,\n boundaryWeight,\n detectPrecision,\n formatCountdown,\n formatCrosshairTime,\n formatFixed,\n formatPercent,\n formatVolume,\n inferTimeframe,\n isTimeZone,\n pickTicks,\n priceFormatter,\n tickText,\n zoneOffset,\n type UtcOffset,\n} from \"./format\";\nimport {\n AreaBuffer,\n BarBuffer,\n LineBuffer,\n candleMetrics,\n clampRange,\n pixelRange,\n} from \"./geometry\";\nimport { heikinAshiInto, parseTimeframe, volumeProfile } from \"./indicators\";\nimport { TRADING_LABELS, fill, type TradingTexts } from \"./labels\";\nimport {\n createScale,\n fitScale,\n fromScaled,\n panScale,\n scaleTicks,\n scaledAt,\n toScaled,\n valueAt,\n yOf,\n yOfScaled,\n zoomScale,\n type PaneScale,\n} from \"./scale\";\nimport {\n appendBars as storeAppend,\n createPyramid,\n createRangePyramid,\n createStore,\n indexOfTime,\n inputLength,\n invalidateRangePyramid,\n barAt,\n prependBars as storePrepend,\n pyramidLevel,\n rangeLevel,\n readBar,\n setBars as storeSet,\n updateBar as storeUpdate,\n lowerBoundTime,\n type BarStore,\n type OhlcColumns,\n type RangePyramid,\n} from \"./store\";\nimport {\n LINE_COLORS,\n buildStudies,\n type Study,\n type StudyOutput,\n} from \"./studies\";\nimport type {\n TradingBarsInput,\n TradingChartEventMap,\n TradingChartInstance,\n TradingChartOptions,\n TradingCrosshairEvent,\n TradingDrawing,\n TradingDrawingPatch,\n TradingDrawingPoint,\n TradingDrawingTool,\n TradingLineStyle,\n TradingPriceLine,\n TradingReplayState,\n TradingScaleMode,\n TradingUndoState,\n TradingVisibleRange,\n TradingVolumeProfile,\n TradingVolumeProfileOptions,\n} from \"./types\";\n\nconst TIME_AXIS = 28;\nconst MIN_AXIS = 60;\nconst MAX_SPACING = 60;\nconst MIN_PANE = 48;\nconst PRICE = \"price\";\nconst UP = \"var(--success-color, #089981)\";\nconst DOWN = \"var(--danger-color, #f23645)\";\nconst WARNING = \"var(--warning-color, #f59e0b)\";\nconst PRIMARY = \"var(--primary-color, #2962ff)\";\nconst HISTORY_LIMIT = 100;\n\n/** Colors of the drawing toolbar */\nconst PALETTE = [\n \"#2962ff\",\n \"#089981\",\n \"#f23645\",\n \"#f59e0b\",\n \"#a855f7\",\n \"#0ea5e9\",\n \"#ec4899\",\n \"#787b86\",\n];\nconst LINE_STYLES: readonly TradingLineStyle[] = [\"solid\", \"dashed\", \"dotted\"];\n\n/**\n * Hooks used by `syncCharts` to follow another chart without echoing its\n * events back (internal: not part of the public instance)\n */\nexport const syncHooks = new WeakMap<\n TradingChartInstance,\n { setTimeRange(range: { from: number; to: number }): void }\n>();\n\nconst PRICE_LINE_TITLES: Record<string, keyof TradingTexts | undefined> = {\n order: \"limit\",\n position: \"position\",\n takeProfit: \"takeProfit\",\n stopLoss: \"stopLoss\",\n alert: \"alert\",\n};\n\nconst clamp = (v: number, lo: number, hi: number) =>\n v < lo ? lo : v > hi ? hi : v;\n\n/** Readable text on a fill (a CSS color): dark on light fills, white otherwise */\nconst textOn = (fill: string) => {\n const color = parseColor(fill);\n return color && luminance(color) > 0.5 ? \"#0b0e11\" : \"#fff\";\n};\n\nconst finite = Number.isFinite;\n\ninterface Pane {\n id: string;\n study: Study | null;\n scale: PaneScale;\n top: number;\n height: number;\n ticks: number[];\n step: number;\n}\n\n/** Bars drawn: a level of the pyramid and the groups in view */\ninterface Visible {\n /** Logical index at the left edge */\n left: number;\n level: number;\n /** Bars per group */\n size: number;\n cols: OhlcColumns;\n /** Groups drawn (one extra on each side) */\n g0: number;\n g1: number;\n /** Groups whose center is in the plot */\n s0: number;\n s1: number;\n /** Last group */\n last: number;\n}\n\ninterface LegendRow {\n row: HTMLDivElement;\n values: HTMLSpanElement[];\n button: HTMLButtonElement | null;\n}\n\ntype Layer = (ga: number, gb: number, live: boolean) => RenderItem[];\n\n/** Interaction in progress */\ntype Gesture =\n | {\n kind: \"pan\";\n x: number;\n y: number;\n right: number;\n pane: Pane | null;\n moved: boolean;\n lastX: number;\n lastY: number;\n lastT: number;\n velocity: number;\n }\n | { kind: \"axisY\"; pane: Pane; y: number; min: number; max: number }\n | { kind: \"axisX\"; x: number; spacing: number }\n | {\n kind: \"separator\";\n index: number;\n y: number;\n above: number;\n below: number;\n }\n | { kind: \"order\"; line: TradingPriceLine; startPrice: number }\n | {\n kind: \"drawing\";\n id: string;\n pane: Pane;\n handle: number;\n x: number;\n y: number;\n original: TradingDrawing;\n moved: boolean;\n }\n | { kind: \"create\"; pane: Pane; x: number; y: number; moved: boolean }\n | { kind: \"button\"; action: () => void };\n\n/** Mounts a trading chart in `container` (which should have a height) */\nexport const createTradingChart = (\n container: HTMLElement,\n initial: TradingChartOptions = {},\n): TradingChartInstance => {\n const doc = container.ownerDocument;\n const win = doc.defaultView;\n let options: TradingChartOptions = { ...initial };\n let destroyed = false;\n\n // ------------------------------------------------------------------ DOM\n\n const make = <K extends keyof HTMLElementTagNameMap>(\n tag: K,\n style: Partial<CSSStyleDeclaration>,\n ) => styleElement(doc.createElement(tag), style) as HTMLElementTagNameMap[K];\n\n const root = make(\"div\", {\n position: \"relative\",\n width: \"100%\",\n height: \"100%\",\n minHeight: \"0\",\n overflow: \"hidden\",\n outline: \"none\",\n userSelect: \"none\",\n touchAction: \"pan-y\",\n fontFamily: \"var(--font-family-sans, system-ui, sans-serif)\",\n color: \"var(--text-color, #1f2937)\",\n cursor: \"crosshair\",\n });\n root.className = \"minerva-trading-chart\";\n root.tabIndex = 0;\n root.setAttribute(\"role\", \"figure\");\n root.setAttribute(\"aria-roledescription\", \"chart\");\n\n const layer = (tag: \"canvas\" | \"div\") =>\n make(tag, {\n position: \"absolute\",\n left: \"0\",\n top: \"0\",\n pointerEvents: \"none\",\n });\n const background = layer(\"canvas\") as HTMLCanvasElement;\n const foreground = layer(\"canvas\") as HTMLCanvasElement;\n background.setAttribute(\"aria-hidden\", \"true\");\n foreground.setAttribute(\"aria-hidden\", \"true\");\n const legends = layer(\"div\") as HTMLDivElement;\n legends.style.right = \"0\";\n legends.style.bottom = \"0\";\n const jump = make(\"button\", {\n position: \"absolute\",\n display: \"none\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"28px\",\n height: \"28px\",\n padding: \"0\",\n borderRadius: \"50%\",\n border:\n \"1px solid color-mix(in srgb, var(--border-color, #e5e7eb) 80%, transparent)\",\n background: \"var(--surface-elevated-color, var(--surface-color, #fff))\",\n color: \"var(--text-color, #1f2937)\",\n boxShadow: \"0 4px 14px -4px rgba(15, 23, 42, 0.25)\",\n cursor: \"pointer\",\n });\n jump.type = \"button\";\n jump.innerHTML =\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M3 3l5 5-5 5M9 3l5 5-5 5\"/></svg>';\n const live = make(\"div\", {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n overflow: \"hidden\",\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n whiteSpace: \"nowrap\",\n });\n live.setAttribute(\"aria-live\", \"polite\");\n // floating toolbar of the selected drawing, and the editor of text drawings\n const toolbar = make(\"div\", {\n position: \"absolute\",\n display: \"none\",\n alignItems: \"center\",\n gap: \"1px\",\n padding: \"3px\",\n borderRadius: \"8px\",\n border:\n \"1px solid color-mix(in srgb, var(--border-color, #e5e7eb) 85%, transparent)\",\n background: \"var(--surface-elevated-color, var(--surface-color, #fff))\",\n boxShadow: \"0 8px 24px -8px rgba(15, 23, 42, 0.35)\",\n zIndex: \"2\",\n cursor: \"default\",\n });\n toolbar.className = \"minerva-trading-toolbar\";\n toolbar.setAttribute(\"role\", \"toolbar\");\n const editor = make(\"textarea\", {\n position: \"absolute\",\n display: \"none\",\n minWidth: \"120px\",\n minHeight: \"28px\",\n padding: \"5px 9px\",\n resize: \"none\",\n border: \"1px solid var(--primary-color, #2962ff)\",\n borderRadius: \"5px\",\n outline: \"none\",\n background: \"var(--surface-elevated-color, var(--surface-color, #fff))\",\n color: \"var(--text-color, #1f2937)\",\n font: \"500 13px var(--font-family-sans, system-ui, sans-serif)\",\n boxShadow: \"0 6px 18px -6px rgba(15, 23, 42, 0.3)\",\n zIndex: \"3\",\n });\n editor.rows = 1;\n const sheet = make(\"style\", {});\n sheet.textContent = `.minerva-trading-toolbar button{all:unset;box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;min-width:26px;height:26px;padding:0 5px;border-radius:5px;cursor:pointer;color:var(--text-color,#1f2937)}.minerva-trading-toolbar button:hover{background:color-mix(in srgb,var(--text-color,#1f2937) 9%,transparent)}.minerva-trading-toolbar button:focus-visible{box-shadow:inset 0 0 0 2px var(--primary-color,#2962ff)}.minerva-trading-toolbar button[aria-pressed=\"true\"]{background:color-mix(in srgb,var(--primary-color,#2962ff) 16%,transparent);color:var(--primary-color,#2962ff)}.minerva-trading-toolbar .sep{width:1px;height:18px;margin:0 3px;background:var(--border-color,#e5e7eb)}`;\n root.append(\n sheet,\n background,\n foreground,\n legends,\n jump,\n toolbar,\n editor,\n live,\n );\n container.appendChild(root);\n\n // ----------------------------------------------------------------- data\n\n const store = createStore();\n let pyramid = createPyramid();\n /** Heikin-Ashi bars (time and volume shared with the store) */\n const ha: OhlcColumns = {\n time: store.time,\n open: new Float64Array(0),\n high: new Float64Array(0),\n low: new Float64Array(0),\n close: new Float64Array(0),\n volume: store.volume,\n };\n let haValid = 0;\n let haPyramid = createPyramid();\n let studies: Study[] = [];\n const studyValid = new Map<Study, number>();\n const visibility = new Map<string, boolean>();\n interface CompareRuntime {\n id: string;\n name: string;\n color: string;\n width: number;\n times: Float64Array;\n data: Float64Array;\n values: Float64Array;\n valid: number;\n lod: RangePyramid;\n }\n let compares: CompareRuntime[] = [];\n /** Min / max pyramids of the indicator outputs (zoomed-out decimation) */\n const outputLods = new WeakMap<StudyOutput, RangePyramid>();\n /** Changes when bars other than the last one change */\n let dataVersion = 0;\n /** Changes when the last bar changes */\n let tailVersion = 0;\n let detectedPrecision = 2;\n let inferredTimeframe = DAY;\n\n // ----------------------------------------------------------------- view\n\n let spacing = options.barSpacing ?? 8;\n let right = NaN;\n let plotW = 0;\n let plotH = 0;\n let axisW = MIN_AXIS;\n let width = 0;\n let height = 0;\n let panes: Pane[] = [];\n const scales = new Map<string, PaneScale>();\n const paneHeights = new Map<string, number>();\n let vis: Visible | null = null;\n let volumeOverlayMax = 0;\n\n // -------------------------------------------------------------- state\n\n let theme: ChartTheme = readTheme(root);\n let themeVersion = 0;\n let optionsVersion = 0;\n let renderer: ChartRenderer | null = null;\n let rendererToken = 0;\n let frameId = 0;\n let layers: { fn: Layer; main: RenderItem[]; live: RenderItem[] }[] = [];\n let geomKey = \"\";\n let builtTail = -1;\n let itemVersion = 0;\n let resolveReady!: (kind: ChartRendererKind | null) => void;\n const ready = new Promise<ChartRendererKind | null>((resolve) => {\n resolveReady = resolve;\n });\n\n let pointer: { x: number; y: number } | null = null;\n let keyboardIndex: number | null = null;\n let gesture: Gesture | null = null;\n const touches = new Map<number, { x: number; y: number }>();\n let pinch: { distance: number; spacing: number } | null = null;\n let kinetic: { v: number; t: number } | null = null;\n let scrollAnim: { from: number; to: number; start: number } | null = null;\n /** Range asked by `setVisibleRange` / `fitContent`, applied once the plot width is known */\n let pendingRange: { from: number; to: number } | null = null;\n\n let drawings: readonly TradingDrawing[] = options.drawings ?? [];\n let emittedDrawings: readonly TradingDrawing[] | null = null;\n /** Drawings of the last commit: the base of the undo history */\n let committed: readonly TradingDrawing[] = drawings;\n const undoStack: (readonly TradingDrawing[])[] = [];\n const redoStack: (readonly TradingDrawing[])[] = [];\n let undoKey = \"false|false\";\n let tool: TradingDrawingTool = options.drawingMode ?? \"cursor\";\n let selected: string | null = null;\n let hovered: string | null = null;\n let draft: TradingDrawing | null = null;\n /** Clicks still needed by the drawing being made (three-anchor tools) */\n let draftClicks = 0;\n let draftPane: string = PRICE;\n let drawingCounter = 0;\n /** Text boxes measured when painted (hit tests of text drawings) */\n const textBoxes = new Map<string, Box>();\n /** Drawing whose text is being edited */\n let editing: { id: string; created: boolean } | null = null;\n let toolbarKey = \"\";\n let paletteOpen = false;\n const lineOverrides = new Map<string, number>();\n let hoveredLine: string | null = null;\n /** Clickable areas painted on the canvas (close buttons, order entry) */\n let canvasButtons: {\n x: number;\n y: number;\n w: number;\n h: number;\n action: () => void;\n }[] = [];\n let hoveredButton = -1;\n let lastRange: TradingVisibleRange | null = null;\n /** The next view change comes from a synchronized chart: not reported */\n let silentRange = false;\n /** Crosshair set by `setCrosshair` (synchronized charts) */\n let externalCross: { time: number; price: number } | null = null;\n let lastCrosshair = \"\";\n let historyFirst = NaN;\n let countdownTimer: ReturnType<typeof setInterval> | null = null;\n /** Bar replay: the full history, and the bars shown so far */\n let replay: {\n source: BarStore;\n playing: boolean;\n speed: number;\n timer: ReturnType<typeof setInterval> | null;\n } | null = null;\n let replayPicking = false;\n let replaySpeed = 4;\n let profile: { key: string; result: TradingVolumeProfile } | null = null;\n\n // ---------------------------------------------------------- listeners\n\n const listeners = new Map<string, Set<(event: never) => void>>();\n const emit = <K extends keyof TradingChartEventMap>(\n type: K,\n event: TradingChartEventMap[K],\n ) => {\n listeners\n .get(type)\n ?.forEach((fn) => (fn as (e: TradingChartEventMap[K]) => void)(event));\n };\n\n // ------------------------------------------------------------- helpers\n\n // locale and texts, resolved at each options update (and `<html lang>` change)\n let locale = resolveLocale(options.locale);\n let texts = localeLabels(TRADING_LABELS, locale, options.labels);\n const resolveTexts = () => {\n locale = resolveLocale(options.locale);\n texts = localeLabels(TRADING_LABELS, locale, options.labels);\n };\n const labels = () => texts;\n const n = () => store.length;\n const style = () => options.chartStyle ?? \"candles\";\n const redUp = () => options.colorConvention === \"redUp\";\n const upCss = () => options.upColor ?? (redUp() ? DOWN : UP);\n const downCss = () => options.downColor ?? (redUp() ? UP : DOWN);\n const resolve = (css: string, fallback: Rgba = theme.primary): Rgba =>\n theme.resolve ? theme.resolve(css, fallback) : fallback;\n const css = (value: string, alpha = 1) => toCss(resolve(value), alpha);\n const precision = () => options.precision ?? detectedPrecision;\n let priceFormat = priceFormatter(2, undefined);\n let priceFormatKey = \"\";\n const formatPrice = (value: number) => {\n if (options.formatPrice) return options.formatPrice(value);\n const key = `${precision()}|${locale}`;\n if (key !== priceFormatKey) {\n priceFormat = priceFormatter(precision(), locale);\n priceFormatKey = key;\n }\n return priceFormat(value);\n };\n const timeframe = () => {\n const parsed =\n options.timeframe !== undefined\n ? parseTimeframe(options.timeframe)\n : null;\n return (\n parsed ?? {\n unit: \"ms\" as const,\n count: inferredTimeframe,\n ms: inferredTimeframe,\n }\n );\n };\n const tfMs = () => timeframe().ms;\n const font = (size: number, weight = 400) =>\n `${weight} ${size}px ${theme.fontFamily}`;\n\n const isVisible = (study: Study) =>\n visibility.get(study.id) ?? study.config.visible ?? true;\n\n const xOf = (index: number) => plotW + (index - right) * spacing;\n const indexAt = (x: number) => right - (plotW - x) / spacing;\n\n /** Time of a logical index (extrapolated outside the bars) */\n const timeAt = (index: number) => {\n const count = n();\n if (!count) return 0;\n const i = Math.round(index);\n if (i < 0) return store.time[0] + i * tfMs();\n if (i >= count) return store.time[count - 1] + (i - count + 1) * tfMs();\n return store.time[i];\n };\n\n /** Time of a fractional index, interpolated between the bars */\n const timeAtFrac = (index: number) => {\n const count = n();\n if (!count) return 0;\n const i = Math.floor(index);\n if (i < 0 || i >= count - 1) {\n const edge = i < 0 ? 0 : count - 1;\n return store.time[edge] + (index - edge) * tfMs();\n }\n const t = index - i;\n return store.time[i] + t * (store.time[i + 1] - store.time[i]);\n };\n\n /** Fractional index of a time (the inverse of `timeAtFrac`) */\n const indexAtTimeFrac = (time: number) => {\n const count = n();\n if (!count) return 0;\n if (time >= store.time[count - 1])\n return count - 1 + (time - store.time[count - 1]) / tfMs();\n if (time <= store.time[0]) return (time - store.time[0]) / tfMs();\n const i = indexOfTime(store.time, count, time);\n const span = store.time[i + 1] - store.time[i];\n return i + (span > 0 ? (time - store.time[i]) / span : 0);\n };\n\n // displayed time: a fixed offset, a time zone or the local time\n let zone: string | undefined;\n const offsetMinutes = (time: number) =>\n options.utcOffset ??\n (zone\n ? zoneOffset(time, zone)\n : -new Date(finite(time) ? time : 0).getTimezoneOffset());\n const studyOffset: UtcOffset = (time) => offsetMinutes(time);\n /** Time shifted so that the UTC getters read the displayed time */\n const shift = (time: number) => time + offsetMinutes(time) * MINUTE;\n\n /** CSS color of a study color: `up` / `down` stand for the bar colors */\n const colorOf = (color: string) =>\n color === \"up\" ? upCss() : color === \"down\" ? downCss() : color;\n\n /** Min / max / last of each visible group of a column of values */\n const groupRanges = (\n v: Visible,\n values: Float64Array,\n lod: RangePyramid,\n ): {\n min: ArrayLike<number>;\n max: ArrayLike<number>;\n last: ArrayLike<number>;\n } => {\n if (!v.level) return { min: values, max: values, last: values };\n const level = rangeLevel(lod, values, n(), v.level);\n return level;\n };\n const lodOf = (out: StudyOutput) => {\n let lod = outputLods.get(out);\n if (!lod) outputLods.set(out, (lod = createRangePyramid()));\n return lod;\n };\n\n /** Logical index of a time (extrapolated outside the bars) */\n const indexOfTimeExt = (time: number) => {\n const count = n();\n if (!count) return 0;\n const last = store.time[count - 1];\n if (time > last) return count - 1 + (time - last) / tfMs();\n if (time < store.time[0]) return (time - store.time[0]) / tfMs();\n return indexOfTime(store.time, count, time);\n };\n\n /** Bars as drawn: Heikin-Ashi or the store */\n const display = (): OhlcColumns => (style() === \"heikinAshi\" ? ha : store);\n\n // ------------------------------------------------------- derived data\n\n const markDirty = (from: number) => {\n for (const study of studies) {\n studyValid.set(study, Math.min(studyValid.get(study) ?? 0, from));\n for (const out of study.outputs) {\n const lod = outputLods.get(out);\n if (lod) invalidateRangePyramid(lod, from);\n }\n }\n haValid = Math.min(haValid, from);\n for (const c of compares) {\n c.valid = Math.min(c.valid, from);\n invalidateRangePyramid(c.lod, from);\n }\n profile = null;\n const level = (p: typeof pyramid) => {\n for (const l of p.levels)\n if (l) l.valid = Math.min(l.valid, Math.floor(from / l.size));\n };\n level(pyramid);\n level(haPyramid);\n };\n\n const syncDerived = () => {\n const count = n();\n for (const study of studies) {\n const valid = studyValid.get(study) ?? 0;\n if (valid < count) {\n study.compute(store, valid);\n studyValid.set(study, count);\n }\n }\n ha.time = store.time;\n ha.volume = store.volume;\n if (style() === \"heikinAshi\" && haValid < count) {\n if (ha.open.length < store.capacity) {\n for (const key of [\"open\", \"high\", \"low\", \"close\"] as const) {\n const next = new Float64Array(store.capacity);\n next.set(ha[key].subarray(0, haValid));\n ha[key] = next;\n }\n }\n heikinAshiInto(\n store.open,\n store.high,\n store.low,\n store.close,\n count,\n ha,\n haValid,\n );\n haValid = count;\n }\n for (const c of compares) {\n if (c.valid >= count) continue;\n if (c.values.length < store.capacity) {\n const next = new Float64Array(store.capacity).fill(NaN);\n next.set(c.values.subarray(0, c.valid));\n c.values = next;\n }\n for (let i = c.valid; i < count; i++) {\n const j =\n lowerBoundTime(c.times, c.times.length, store.time[i] + 0.5) - 1;\n c.values[i] = j >= 0 ? c.data[j] : NaN;\n }\n c.valid = count;\n }\n };\n\n const afterDataChange = (from: number) => {\n markDirty(from);\n const count = n();\n if (from < count - 1) dataVersion++;\n tailVersion++;\n if (count) {\n detectedPrecision = Math.max(\n from === 0 ? 0 : detectedPrecision,\n detectPrecision(store.close, from, count),\n detectPrecision(store.open, Math.max(from, count - 50), count),\n );\n if (from === 0 || count < 80)\n inferredTimeframe = inferTimeframe(store.time, count);\n }\n invalidate();\n };\n\n const rebuildStudies = () => {\n const { studies: next, reused } = buildStudies(\n options.indicators ?? [],\n studies,\n studyOffset,\n );\n for (const study of studies)\n if (!reused.has(study)) studyValid.delete(study);\n for (const study of next) if (!reused.has(study)) studyValid.set(study, 0);\n studies = next;\n // drop the user's toggles of indicators whose visibility is now set\n for (const id of [...visibility.keys()])\n if (!studies.some((s) => s.id === id)) visibility.delete(id);\n };\n\n const rebuildCompares = () => {\n compares = (options.compare ?? []).map((series, i) => {\n const data = [...series.data].sort((a, b) => a.time - b.time);\n return {\n id: series.id ?? series.name,\n name: series.name,\n color: series.color ?? LINE_COLORS[(i + 2) % LINE_COLORS.length],\n width: series.lineWidth ?? 1.5,\n times: Float64Array.from(data, (d) => d.time),\n data: Float64Array.from(data, (d) => d.value),\n values: new Float64Array(0),\n valid: 0,\n lod: createRangePyramid(),\n };\n });\n };\n\n // ---------------------------------------------------------- bars input\n\n /** Last bar visible: new bars keep the view at the latest bar */\n const followsRealtime = () => {\n const count = n();\n if (!count || !finite(right)) return true;\n const x = xOf(count - 1);\n return x >= 0 && x <= plotW + spacing * 0.5;\n };\n\n const replaceBars = (bars: TradingBarsInput) => {\n storeSet(store, bars);\n pyramid = createPyramid();\n haPyramid = createPyramid();\n haValid = 0;\n historyFirst = NaN;\n for (const scale of scales.values()) scale.auto = true;\n right = n() - 1 + (options.rightOffset ?? 8);\n kinetic = null;\n scrollAnim = null;\n afterDataChange(0);\n };\n\n /**\n * New `bars` option: streamed (same first bars plus newer ones),\n * prepended history (same last bar), or replaced\n */\n const applyBarsOption = (bars: TradingBarsInput) => {\n const count = n();\n const length = inputLength(bars);\n if (count >= 2 && length >= count) {\n const first = barAt(bars, 0).time;\n const last = store.time[count - 1];\n if (\n first === store.time[0] &&\n barAt(bars, count - 2).time === store.time[count - 2]\n ) {\n // streaming through the props: update the last bar, append the rest\n const follow = followsRealtime();\n const before = count;\n let from = count;\n for (let i = count - 1; i < length; i++) {\n const at = storeUpdate(store, barAt(bars, i));\n if (at >= 0) from = Math.min(from, at);\n }\n if (follow) right += n() - before;\n if (from < n()) afterDataChange(from);\n return;\n }\n if (barAt(bars, length - 1).time === last && length > count) {\n const added = length - count;\n storeSet(store, bars);\n pyramid = createPyramid();\n haPyramid = createPyramid();\n haValid = 0;\n right += added;\n afterDataChange(0);\n return;\n }\n }\n replaceBars(bars);\n };\n\n // --------------------------------------------------------------- layout\n\n const layoutPanes = () => {\n const paneStudies = studies.filter((s) => !s.overlay);\n const available = plotH;\n const wanted = paneStudies.map((s) => paneHeights.get(s.id) ?? s.height);\n const total = wanted.reduce((a, b) => a + b, 0);\n const max = Math.max(0, available * 0.62);\n const k = total > max && total > 0 ? max / total : 1;\n const heights = wanted.map((h) =>\n Math.max(MIN_PANE * Math.min(1, k * 2), h * k),\n );\n const priceHeight = Math.max(\n 40,\n available - heights.reduce((a, b) => a + b, 0),\n );\n const next: Pane[] = [];\n const scaleOf = (id: string, mode: TradingScaleMode) => {\n let scale = scales.get(id);\n if (!scale) {\n scale = createScale(mode);\n scales.set(id, scale);\n }\n if (scale.mode !== mode) {\n scale.mode = mode;\n scale.auto = true;\n }\n return scale;\n };\n const price = scaleOf(PRICE, options.scaleMode ?? \"linear\");\n price.top = 0;\n price.height = priceHeight;\n price.marginTop = 0.1;\n price.marginBottom = 0.08;\n next.push({\n id: PRICE,\n study: null,\n scale: price,\n top: 0,\n height: priceHeight,\n ticks: [],\n step: 0,\n });\n let top = priceHeight;\n paneStudies.forEach((study, i) => {\n const scale = scaleOf(study.id, \"linear\");\n scale.top = top;\n scale.height = heights[i];\n scale.marginTop = study.type === \"volume\" ? 0.18 : 0.14;\n scale.marginBottom = study.type === \"volume\" ? 0 : 0.1;\n if (study.range) scale.marginTop = scale.marginBottom = 0.06;\n next.push({\n id: study.id,\n study,\n scale,\n top,\n height: heights[i],\n ticks: [],\n step: 0,\n });\n top += heights[i];\n });\n for (const id of [...scales.keys()])\n if (!next.some((p) => p.id === id)) scales.delete(id);\n panes = next;\n };\n\n const paneAt = (y: number) =>\n panes.find((p) => y >= p.top && y < p.top + p.height) ?? null;\n\n const clampView = () => {\n const count = n();\n const minSpacing = Math.min(1, (plotW * 0.8) / Math.max(1, count));\n spacing = clamp(spacing, Math.max(1e-4, minSpacing), MAX_SPACING);\n const bars = plotW / spacing;\n if (!finite(right)) right = count - 1 + (options.rightOffset ?? 8);\n const hi =\n Math.max(0, count - 1) + Math.max(options.rightOffset ?? 8, bars * 0.75);\n const lo = Math.min(bars * 0.25, hi);\n right = clamp(right, lo, hi);\n };\n\n const computeVisible = (): Visible | null => {\n const count = n();\n if (!count) return null;\n const left = right - plotW / spacing;\n const level = spacing >= 2 ? 0 : Math.ceil(Math.log2(2 / spacing));\n const size = 2 ** level;\n const src = display();\n const cols = level\n ? pyramidLevel(\n style() === \"heikinAshi\" ? haPyramid : pyramid,\n src,\n count,\n level,\n )\n : src;\n const last = Math.floor((count - 1) / size);\n const i0 = clamp(Math.floor(left) - 1, 0, count - 1);\n const i1 = clamp(Math.ceil(right) + 1, 0, count - 1);\n const r0 = clamp(Math.ceil(left - 0.5), 0, count - 1);\n const r1 = clamp(Math.floor(right + 0.5), 0, count - 1);\n return {\n left,\n level,\n size,\n cols,\n g0: Math.floor(i0 / size),\n g1: Math.floor(i1 / size),\n s0: Math.floor(r0 / size),\n s1: Math.floor(r1 / size),\n last,\n };\n };\n\n /** Center index of a group */\n const groupCenter = (v: Visible, g: number) => g * v.size + (v.size - 1) / 2;\n const groupBars = (v: Visible, g: number) =>\n Math.min(v.size, n() - g * v.size);\n\n /** First visible bar: the base of the percent scale and of the baseline */\n const firstVisibleIndex = () =>\n clamp(Math.ceil(right - plotW / spacing - 0.5), 0, Math.max(0, n() - 1));\n\n const compareBase = (c: CompareRuntime) => {\n const count = n();\n for (let i = firstVisibleIndex(); i < count; i++) {\n const v = c.values[i];\n if (finite(v) && v !== 0) return v;\n }\n return NaN;\n };\n\n /** Scaled value of a comparison series (percent: from its own base) */\n const compareScaled = (scale: PaneScale, value: number, base: number) =>\n scale.mode === \"percent\"\n ? (value / base - 1) * 100\n : toScaled(scale, value);\n\n const baselinePrice = () =>\n options.baselinePrice ?? display().close[firstVisibleIndex()];\n\n /** Extends `[lo, hi]` with the visible groups of an output (shift included) */\n const outputExtent = (\n v: Visible,\n values: Float64Array,\n lod: RangePyramid,\n shiftBars: number,\n range: [number, number],\n ) => {\n const r = groupRanges(v, values, lod);\n const offset = Math.round(shiftBars / v.size);\n const a = clamp(v.s0 - offset, 0, v.last);\n const b = clamp(v.s1 - offset, 0, v.last);\n for (let g = a; g <= b; g++) {\n if (r.min[g] < range[0]) range[0] = r.min[g];\n if (r.max[g] > range[1]) range[1] = r.max[g];\n }\n };\n\n const autoscale = (v: Visible | null) => {\n volumeOverlayMax = 0;\n for (const pane of panes) {\n const scale = pane.scale;\n if (!v) continue;\n if (pane.id === PRICE) {\n scale.base = store.close[firstVisibleIndex()] || 1;\n const { cols } = v;\n const s = style();\n const closeOnly = s === \"line\" || s === \"area\" || s === \"baseline\";\n const range: [number, number] = [Infinity, -Infinity];\n for (let g = v.s0; g <= v.s1; g++) {\n const l = closeOnly ? cols.close[g] : cols.low[g];\n const h = closeOnly ? cols.close[g] : cols.high[g];\n if (l < range[0]) range[0] = l;\n if (h > range[1]) range[1] = h;\n }\n for (const study of studies) {\n if (!study.overlay || !isVisible(study)) continue;\n if (study.type === \"volume\") {\n for (let g = v.s0; g <= v.s1; g++) {\n const vol = cols.volume[g] / groupBars(v, g);\n if (vol > volumeOverlayMax) volumeOverlayMax = vol;\n }\n continue;\n }\n for (const out of study.outputs)\n outputExtent(v, out.values, lodOf(out), out.shift, range);\n }\n let [lo, hi] = range;\n if (s === \"baseline\") {\n const b = baselinePrice();\n if (b < lo) lo = b;\n if (b > hi) hi = b;\n }\n if (!scale.auto) continue;\n let a = toScaled(scale, lo);\n let b = toScaled(scale, hi);\n if (scale.mode === \"log\" && !(lo > 0))\n a = toScaled(scale, Math.max(hi * 1e-3, 1e-12));\n for (const c of compares) {\n const base = compareBase(c);\n const extent: [number, number] = [Infinity, -Infinity];\n outputExtent(v, c.values, c.lod, 0, extent);\n for (const value of extent) {\n const scaled = compareScaled(scale, value, base);\n if (scaled < a) a = scaled;\n if (scaled > b) b = scaled;\n }\n }\n if (scale.mode === \"percent\" && compares.length) {\n // the 0% line of a comparison stays in view\n a = Math.min(a, 0);\n b = Math.max(b, 0);\n }\n fitScale(scale, a, b);\n continue;\n }\n const study = pane.study;\n if (!study || !scale.auto) continue;\n if (study.range) {\n fitScale(scale, study.range[0], study.range[1]);\n continue;\n }\n const range: [number, number] = [Infinity, -Infinity];\n if (study.type === \"volume\") range[0] = 0;\n for (const out of study.outputs) {\n if (out.kind === \"volume\") {\n for (let g = v.s0; g <= v.s1; g++) {\n const value = v.cols.volume[g] / groupBars(v, g);\n if (value > range[1]) range[1] = value;\n }\n continue;\n }\n outputExtent(v, out.values, lodOf(out), out.shift, range);\n }\n let [lo, hi] = range;\n if (study.bands && finite(lo) && finite(hi)) {\n // reference bands (CCI ±100, DMI 25) stay in view\n for (const band of study.bands) {\n lo = Math.min(lo, band);\n hi = Math.max(hi, band);\n }\n }\n if (study.zero && finite(lo) && finite(hi)) {\n lo = Math.min(lo, 0);\n hi = Math.max(hi, 0);\n }\n fitScale(scale, lo, hi);\n }\n };\n\n // ----------------------------------------------------------------- ticks\n\n interface TimeLabel {\n x: number;\n text: string;\n bold: boolean;\n }\n\n const timeTicks = (\n v: Visible | null,\n ctx: CanvasRenderingContext2D,\n ): TimeLabel[] => {\n const count = n();\n if (!count || !v) return [];\n const tf = tfMs();\n const intraday = tf < DAY;\n // groups up to the right edge, past the last bar too\n const gEnd = Math.floor(Math.max(0, Math.ceil(right)) / v.size);\n const groupTime = (g: number) => {\n if (g <= v.last) return v.cols.time[g];\n return store.time[count - 1] + (g * v.size - (count - 1)) * tf;\n };\n const candidates: { x: number; weight: number; time: number }[] = [];\n let prev = v.g0 > 0 ? shift(groupTime(v.g0 - 1)) : NaN;\n for (let g = v.g0; g <= gEnd; g++) {\n const time = shift(groupTime(g));\n const x = xOf(groupCenter(v, g));\n const weight = boundaryWeight(prev, time);\n // no labels inside a second (tick charts)\n if (x >= -20 && x <= plotW + 20 && weight > 10)\n candidates.push({ x, weight, time });\n prev = time;\n }\n ctx.font = font(theme.fontSize);\n const sample = intraday ? \"00:00\" : \"Sep 30\";\n const gap =\n Math.max(ctx.measureText(sample).width, ctx.measureText(\"2024\").width) +\n 34;\n return pickTicks(candidates, gap)\n .filter((t) => t.x > 8 && t.x < plotW - 8)\n .map((t) => ({\n x: t.x,\n text: tickText(t.time, t.weight, locale, intraday),\n bold: t.weight >= (intraday ? 50 : 60),\n }));\n };\n\n const paneTickText = (pane: Pane, scaled: number) => {\n if (pane.id === PRICE) {\n if (pane.scale.mode === \"percent\")\n return formatPercent(\n scaled,\n locale,\n Math.min(2, stepDecimals(pane.step)),\n );\n return formatPrice(fromScaled(pane.scale, scaled));\n }\n if (pane.study?.compact) return formatVolume(scaled, locale);\n return formatFixed(scaled, Math.min(4, stepDecimals(pane.step)), locale);\n };\n\n /** Text of a value of a study in the legend */\n const studyValueText = (study: Study, value: number) => {\n if (study.overlay && study.type !== \"volume\") return formatPrice(value);\n if (study.compact) return formatVolume(value, locale);\n return formatFixed(\n value,\n study.range ? 2 : Math.max(2, Math.min(6, precision())),\n locale,\n );\n };\n\n // ------------------------------------------------------------ GPU items\n\n const createLayers = (v: Visible, dpr: number): Layer[] => {\n const result: Layer[] = [];\n const cols = v.cols;\n const up = resolve(upCss());\n const down = resolve(downCss());\n const upP = packColor(up);\n const downP = packColor(down);\n const bg = theme.background;\n const metrics = candleMetrics(spacing * v.size * dpr, dpr);\n const X = (g: number) => xOf(groupCenter(v, g)) * dpr;\n const s = style();\n\n const histogramHalf = Math.max(0.5, metrics.body / 2);\n const volumeColors = {\n up: packColor([up[0], up[1], up[2], 0.5]),\n down: packColor([down[0], down[1], down[2], 0.5]),\n };\n\n for (const pane of panes) {\n const top = pane.top * dpr;\n const bottom = (pane.top + pane.height) * dpr;\n const scale = pane.scale;\n const Y = (value: number) => yOf(scale, value) * dpr;\n\n const lineLayer =\n (\n values: (g: number) => number,\n color: Rgba,\n lineWidth: number,\n toY: (value: number) => number = Y,\n ): Layer =>\n (ga, gb, isLive) => {\n const buffer = new LineBuffer(top, bottom);\n for (let g = isLive ? Math.max(v.g0, ga - 1) : ga; g <= gb; g++)\n buffer.push(X(g), toY(values(g)));\n return buffer.count > 1 ? [buffer.item(\"\", 0, color, lineWidth)] : [];\n };\n\n /**\n * Line of a column of values: one point per bar, or the low and high\n * of each group once zoomed out (min / max decimation), drawn\n * `shiftBars` later\n */\n const rangeLayer =\n (\n values: Float64Array,\n lod: RangePyramid,\n color: Rgba,\n lineWidth: number,\n shiftBars = 0,\n toY: (value: number) => number = Y,\n ): Layer =>\n (ga, gb, isLive) => {\n const r = groupRanges(v, values, lod);\n const dx = shiftBars * spacing * dpr;\n const extra = Math.ceil(Math.abs(shiftBars) / v.size) + 1;\n let from = isLive ? Math.max(0, ga - 1) : ga;\n let to = gb;\n if (!isLive && shiftBars > 0) from = Math.max(0, from - extra);\n if (!isLive && shiftBars < 0) to = Math.min(v.last - 1, to + extra);\n const buffer = new LineBuffer(top, bottom);\n let prevY = NaN;\n for (let g = from; g <= to; g++) {\n const x = X(g) + dx;\n const lo = r.min[g];\n const hi = r.max[g];\n if (!v.level || lo === hi || !finite(lo) || !finite(hi)) {\n prevY = toY(r.last[g]);\n buffer.push(x, prevY);\n continue;\n }\n const yLo = toY(lo);\n const yHi = toY(hi);\n // start with the extreme closest to the previous point\n const first =\n finite(prevY) && Math.abs(prevY - yHi) < Math.abs(prevY - yLo)\n ? yHi\n : yLo;\n const second = first === yHi ? yLo : yHi;\n buffer.push(x, first);\n buffer.push(x, second);\n prevY = second;\n }\n return buffer.count > 1 ? [buffer.item(\"\", 0, color, lineWidth)] : [];\n };\n\n if (pane.id === PRICE) {\n // volume at the bottom of the price pane\n const volumeStudy = studies.find(\n (st) => st.overlay && st.type === \"volume\" && isVisible(st),\n );\n if (volumeStudy && volumeOverlayMax > 0) {\n const h = (bottom - top) * 0.2;\n result.push((ga, gb) => {\n const buffer = new BarBuffer();\n for (let g = ga; g <= gb; g++) {\n const vol = cols.volume[g] / groupBars(v, g);\n if (!(vol > 0)) continue;\n const y = bottom - (vol / volumeOverlayMax) * h;\n const [a, b] = pixelRange(y, bottom);\n buffer.push(\n metrics.snap(X(g)),\n a,\n b,\n cols.close[g] >= cols.open[g]\n ? volumeColors.up\n : volumeColors.down,\n );\n }\n return [buffer.item(\"\", 0, histogramHalf)];\n });\n }\n // comparison series\n for (const c of compares) {\n const base = compareBase(c);\n const color = resolve(c.color);\n result.push(\n rangeLayer(\n c.values,\n c.lod,\n color,\n c.width,\n 0,\n (value) =>\n yOfScaled(scale, compareScaled(scale, value, base)) * dpr,\n ),\n );\n }\n // the bars\n if (s === \"line\" || s === \"area\" || s === \"baseline\") {\n const lineColor = resolve(PRIMARY);\n if (s === \"area\") {\n result.push((ga, gb, isLive) => {\n const area = new AreaBuffer(top, bottom);\n for (let g = isLive ? Math.max(v.g0, ga - 1) : ga; g <= gb; g++)\n area.push(X(g), Y(cols.close[g]), bottom);\n return area.count > 1 ? [area.item(\"\", 0, lineColor, 0.28)] : [];\n });\n }\n if (s === \"baseline\") {\n const yb = Y(baselinePrice());\n result.push((ga, gb, isLive) => {\n const upArea = new AreaBuffer(top, bottom);\n const downArea = new AreaBuffer(top, bottom);\n const upLine = new LineBuffer(top, bottom);\n const downLine = new LineBuffer(top, bottom);\n let px = NaN;\n let py = NaN;\n const point = (x: number, y: number) => {\n upArea.push(x, Math.min(y, yb), yb);\n downArea.push(x, Math.max(y, yb), yb);\n if (y <= yb) upLine.push(x, y);\n else upLine.break();\n if (y >= yb) downLine.push(x, y);\n else downLine.break();\n };\n for (let g = isLive ? Math.max(v.g0, ga - 1) : ga; g <= gb; g++) {\n const x = X(g);\n const y = Y(cols.close[g]);\n if (finite(py) && (py - yb) * (y - yb) < 0) {\n const t = (yb - py) / (y - py);\n point(px + (x - px) * t, yb);\n }\n point(x, y);\n px = x;\n py = y;\n }\n const out: RenderItem[] = [];\n if (upArea.count > 1)\n out.push(\n upArea.item(\"u\", 0, up, 0.22),\n downArea.item(\"d\", 0, down, 0.22),\n );\n if (upLine.count > 1) out.push(upLine.item(\"ul\", 0, up, 2));\n if (downLine.count > 1) out.push(downLine.item(\"dl\", 0, down, 2));\n return out;\n });\n } else {\n result.push(lineLayer((g) => cols.close[g], lineColor, 2));\n }\n } else {\n const hollow = s === \"hollowCandles\";\n const ohlc = s === \"bars\";\n const wick = metrics.wick;\n const body = metrics.body;\n result.push((ga, gb) => {\n const wicks = new BarBuffer();\n const bodies = new BarBuffer();\n const caps = new BarBuffer();\n const ticks = new BarBuffer();\n const tick = Math.max(wick, Math.round((body - wick) / 2));\n for (let g = ga; g <= gb; g++) {\n const o = cols.open[g];\n const h = cols.high[g];\n const l = cols.low[g];\n const c = cols.close[g];\n if (!finite(o) || !finite(c)) continue;\n const rising = hollow\n ? c >= (g > 0 ? cols.close[g - 1] : o)\n : c >= o;\n const color = rising ? upP : downP;\n const cx = metrics.snap(X(g));\n const [wt, wb] = pixelRange(Y(h), Y(l));\n if (ohlc) {\n const range = clampRange(wt, wb, top, bottom);\n if (range) wicks.push(cx, range[0], range[1], color);\n for (const [value, side] of [\n [o, -1],\n [c, 1],\n ] as const) {\n const y = Math.round(Y(value) - wick / 2);\n if (y < top || y + wick > bottom) continue;\n ticks.push(\n cx + side * (wick / 2 + tick / 2),\n y,\n y + wick,\n color,\n );\n }\n continue;\n }\n const [bt, bb] = pixelRange(Y(o), Y(c));\n if (body <= wick) {\n const range = clampRange(wt, wb, top, bottom);\n if (range) wicks.push(cx, range[0], range[1], color);\n continue;\n }\n if (hollow && c > o) {\n const segments: [number, number][] = [\n [wt, bt],\n [bb, wb],\n ];\n for (const [a, b] of segments) {\n const range = b > a ? clampRange(a, b, top, bottom) : null;\n if (range) wicks.push(cx, range[0], range[1], color);\n }\n const edges = clampRange(bt, bb, top, bottom);\n if (edges) {\n wicks.push(\n cx - body / 2 + wick / 2,\n edges[0],\n edges[1],\n color,\n );\n wicks.push(\n cx + body / 2 - wick / 2,\n edges[0],\n edges[1],\n color,\n );\n }\n for (const y of [bt, bb - wick]) {\n if (y >= top && y + wick <= bottom)\n caps.push(cx, y, y + wick, color);\n }\n continue;\n }\n const range = clampRange(wt, wb, top, bottom);\n if (range) wicks.push(cx, range[0], range[1], color);\n const box = clampRange(bt, bb, top, bottom);\n if (box) bodies.push(cx, box[0], box[1], color);\n }\n const items: RenderItem[] = [wicks.item(\"w\", 0, wick / 2)];\n if (bodies.count) items.push(bodies.item(\"b\", 0, body / 2));\n if (caps.count) items.push(caps.item(\"c\", 0, body / 2));\n if (ticks.count) items.push(ticks.item(\"t\", 0, tick / 2));\n return items;\n });\n }\n }\n\n // indicators of the pane\n const paneStudies =\n pane.id === PRICE\n ? studies.filter((st) => st.overlay && st.type !== \"volume\")\n : pane.study\n ? [pane.study]\n : [];\n for (const study of paneStudies) {\n if (!isVisible(study)) continue;\n for (const out of study.outputs) {\n if (out.kind === \"volume\") {\n const y0 = Y(0);\n result.push((ga, gb) => {\n const buffer = new BarBuffer();\n for (let g = ga; g <= gb; g++) {\n const vol = cols.volume[g] / groupBars(v, g);\n if (!(vol > 0)) continue;\n const range = clampRange(\n ...pixelRange(Y(vol), y0),\n top,\n bottom,\n );\n if (range)\n buffer.push(\n metrics.snap(X(g)),\n range[0],\n range[1],\n cols.close[g] >= cols.open[g]\n ? volumeColors.up\n : volumeColors.down,\n );\n }\n return [buffer.item(\"\", 0, histogramHalf)];\n });\n } else if (out.kind === \"histogram\") {\n const y0 = Y(0);\n const strong = { up: upP, down: downP };\n const faded = {\n up: packColor(mix(bg, up, 0.45)),\n down: packColor(mix(bg, down, 0.45)),\n };\n const lod = lodOf(out);\n result.push((ga, gb) => {\n const r = groupRanges(v, out.values, lod);\n const buffer = new BarBuffer();\n for (let g = ga; g <= gb; g++) {\n const value = r.last[g];\n if (!finite(value)) continue;\n const prev = g > 0 ? r.last[g - 1] : value;\n const color =\n value >= 0\n ? value >= prev\n ? strong.up\n : faded.up\n : value <= prev\n ? strong.down\n : faded.down;\n // a group spans its lowest and highest values (and zero)\n const lo = Math.min(0, finite(r.min[g]) ? r.min[g] : value);\n const hi = Math.max(0, finite(r.max[g]) ? r.max[g] : value);\n const range = clampRange(\n ...(v.level\n ? pixelRange(Y(hi), Y(lo))\n : pixelRange(Y(value), y0)),\n top,\n bottom,\n );\n if (range)\n buffer.push(metrics.snap(X(g)), range[0], range[1], color);\n }\n return [buffer.item(\"\", 0, histogramHalf)];\n });\n } else if (out.kind === \"dots\") {\n const fixed = out.color\n ? packColor(resolve(colorOf(out.color)))\n : 0;\n const radius = clamp(spacing * v.size * 0.22, 1.25, 2.6);\n const half = radius * dpr;\n result.push((ga, gb) => {\n const buffer = new BarBuffer();\n for (let g = ga; g <= gb; g++) {\n const value = v.level\n ? out.values[Math.min(n() - 1, g * v.size + v.size - 1)]\n : out.values[g];\n if (!finite(value)) continue;\n const y = Y(value);\n if (y < top || y > bottom) continue;\n const color = fixed || (value <= cols.close[g] ? upP : downP);\n buffer.push(X(g), y - half, y + half, color);\n }\n return buffer.count ? [buffer.item(\"\", 0, half, 0, radius)] : [];\n });\n } else {\n const color = resolve(colorOf(out.color));\n result.push(\n rangeLayer(\n out.values,\n lodOf(out),\n [color[0], color[1], color[2], color[3] * out.alpha],\n out.width,\n out.shift,\n ),\n );\n }\n }\n }\n }\n return result;\n };\n\n /** Builds the items of the main bars or of the last group */\n const runLayer = (\n fn: Layer,\n index: number,\n v: Visible,\n isLive: boolean,\n ): RenderItem[] => {\n const lastMain = Math.min(v.g1, v.last - 1);\n const items = isLive\n ? v.last >= v.g0 && v.last <= v.g1\n ? fn(v.last, v.last, true)\n : []\n : lastMain >= v.g0\n ? fn(v.g0, lastMain, false)\n : [];\n const version = ++itemVersion;\n return items.map((item, k) => ({\n ...item,\n key: `L${index}:${k}:${item.kind}:${item.key}${isLive ? \":live\" : \"\"}`,\n version,\n }));\n };\n\n const renderData = (v: Visible | null, dpr: number) => {\n if (!renderer) return;\n const canvas = renderer.canvas;\n styleElement(canvas, {\n left: \"0px\",\n top: \"0px\",\n width: `${plotW}px`,\n height: `${plotH}px`,\n });\n const bw = Math.max(1, Math.round(plotW * dpr));\n const bh = Math.max(1, Math.round(plotH * dpr));\n if (canvas.width !== bw || canvas.height !== bh) renderer.resize(bw, bh);\n if (v) {\n const key = [\n bw,\n bh,\n dpr,\n spacing,\n right,\n v.level,\n style(),\n dataVersion,\n themeVersion,\n optionsVersion,\n volumeOverlayMax,\n style() === \"baseline\" ? baselinePrice() : 0,\n ...panes.map(\n (p) =>\n `${p.id}:${p.top}:${p.height}:${p.scale.min}:${p.scale.max}:${p.scale.base}:${p.scale.mode}`,\n ),\n ...studies.map((st) => `${st.id}:${isVisible(st)}`),\n ].join(\"|\");\n if (key !== geomKey) {\n geomKey = key;\n builtTail = tailVersion;\n layers = createLayers(v, dpr).map((fn) => ({ fn, main: [], live: [] }));\n layers.forEach((l, i) => {\n l.main = runLayer(l.fn, i, v, false);\n l.live = runLayer(l.fn, i, v, true);\n });\n } else if (builtTail !== tailVersion) {\n builtTail = tailVersion;\n layers.forEach((l, i) => {\n l.live = runLayer(l.fn, i, v, true);\n });\n }\n } else {\n layers = [];\n geomKey = \"\";\n }\n const items = layers.flatMap((l) => [...l.main, ...l.live]);\n renderer.render(items, {\n transform: { xScale: 2 / bw, xOffset: -1, yScale: -2 / bh, yOffset: 1 },\n width: bw,\n height: bh,\n dpr,\n });\n };\n\n // -------------------------------------------------------- 2D painting\n\n const sizeCanvas = (canvas: HTMLCanvasElement, dpr: number) => {\n const w = Math.max(1, Math.round(width * dpr));\n const h = Math.max(1, Math.round(height * dpr));\n if (canvas.width !== w) canvas.width = w;\n if (canvas.height !== h) canvas.height = h;\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n };\n\n const roundRect = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n ) => {\n ctx.beginPath();\n if (typeof ctx.roundRect === \"function\") ctx.roundRect(x, y, w, h, r);\n else ctx.rect(x, y, w, h);\n };\n\n /** Area between two outputs of a study, colored by which one is above */\n const paintFill = (\n ctx: CanvasRenderingContext2D,\n v: Visible,\n pane: Pane,\n study: Study,\n f: Study[\"fills\"][number],\n ) => {\n const outA = study.outputs[f.a];\n const outB = study.outputs[f.b];\n if (!outA || !outB) return;\n const ra = groupRanges(v, outA.values, lodOf(outA));\n const rb = groupRanges(v, outB.values, lodOf(outB));\n const shiftBars = outA.shift;\n const extra = Math.ceil(Math.abs(shiftBars) / v.size) + 1;\n const from = Math.max(0, v.g0 - (shiftBars > 0 ? extra : 0));\n const to = Math.min(v.last, v.g1 + (shiftBars < 0 ? extra : 0));\n const above = css(colorOf(f.color), f.opacity);\n const below = css(colorOf(f.colorBelow ?? f.color), f.opacity);\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, pane.top, plotW, pane.height);\n ctx.clip();\n let run: { x: number; ya: number; yb: number }[] = [];\n let sign = 0;\n const flush = () => {\n if (run.length > 1) {\n ctx.fillStyle = sign >= 0 ? above : below;\n ctx.beginPath();\n run.forEach((p, i) =>\n i ? ctx.lineTo(p.x, p.ya) : ctx.moveTo(p.x, p.ya),\n );\n for (let k = run.length - 1; k >= 0; k--) {\n const p = run[k];\n if (p) ctx.lineTo(p.x, p.yb);\n }\n ctx.closePath();\n ctx.fill();\n }\n run = [];\n };\n for (let g = from; g <= to; g++) {\n const a = ra.last[g];\n const b = rb.last[g];\n if (!finite(a) || !finite(b)) {\n flush();\n sign = 0;\n continue;\n }\n const x = xOf(groupCenter(v, g) + shiftBars);\n const ya = yOf(pane.scale, a);\n const yb = yOf(pane.scale, b);\n const s = a >= b ? 1 : -1;\n const prev = run[run.length - 1];\n if (prev && s !== sign) {\n // the lines cross: close the run at the crossing\n const d0 = prev.ya - prev.yb;\n const t = d0 / (d0 - (ya - yb));\n const cx = prev.x + (x - prev.x) * t;\n const cy = prev.ya + (ya - prev.ya) * t;\n run.push({ x: cx, ya: cy, yb: cy });\n flush();\n run.push({ x: cx, ya: cy, yb: cy });\n }\n sign = s;\n run.push({ x, ya, yb });\n }\n flush();\n ctx.restore();\n };\n\n /** Dashed lines where a day starts (in the displayed time zone) */\n const paintSessionBreaks = (ctx: CanvasRenderingContext2D, v: Visible) => {\n if (!options.sessionBreaks || tfMs() >= DAY) return;\n const xs: number[] = [];\n let prevDay = NaN;\n for (let g = Math.max(0, v.g0 - 1); g <= Math.min(v.g1, v.last); g++) {\n const day = Math.floor(shift(v.cols.time[g]) / DAY);\n if (finite(prevDay) && day !== prevDay) {\n const x = Math.round(xOf(g * v.size - 0.5)) + 0.5;\n if (x > 0 && x < plotW) xs.push(x);\n // too dense to read: none at all\n if (xs.length > plotW / 6) return;\n }\n prevDay = day;\n }\n if (!xs.length) return;\n ctx.save();\n ctx.strokeStyle = toCss(theme.textMuted, 0.4);\n ctx.setLineDash([4, 4]);\n ctx.beginPath();\n for (const x of xs) {\n ctx.moveTo(x, 0);\n ctx.lineTo(x, plotH);\n }\n ctx.stroke();\n ctx.restore();\n };\n\n const profileOptions = (): TradingVolumeProfileOptions | null => {\n const option = options.volumeProfile;\n if (!option) return null;\n return option === true ? {} : option;\n };\n\n /** Volume by price of the visible bars, from the right (or left) edge */\n const paintVolumeProfile = (ctx: CanvasRenderingContext2D, v: Visible) => {\n const o = profileOptions();\n const price = panes[0];\n if (!o || !price || !store.hasVolume) return;\n const rows = clamp(Math.floor(o.rows ?? 24), 2, 400);\n const key = [\n v.level,\n v.s0,\n v.s1,\n rows,\n o.valueArea ?? 0.7,\n dataVersion,\n tailVersion,\n ].join(\"|\");\n if (!profile || profile.key !== key) {\n // real prices, also under Heikin-Ashi bars\n const cols = v.level ? pyramidLevel(pyramid, store, n(), v.level) : store;\n profile = {\n key,\n result: volumeProfile(cols, {\n from: v.s0,\n to: v.s1,\n rows,\n valueArea: o.valueArea,\n }),\n };\n }\n const r = profile.result;\n if (r.poc < 0) return;\n let largest = 0;\n for (let i = 0; i < rows; i++)\n largest = Math.max(largest, (r.up[i] ?? 0) + (r.down[i] ?? 0));\n if (!(largest > 0)) return;\n const span = plotW * clamp(o.width ?? 0.28, 0.05, 0.9);\n const fromRight = (o.side ?? \"right\") === \"right\";\n const upColor = resolve(colorOf(o.upColor ?? \"up\"));\n const downColor = resolve(colorOf(o.downColor ?? \"down\"));\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, price.top, plotW, price.height);\n ctx.clip();\n for (let i = 0; i < rows; i++) {\n const up = r.up[i] ?? 0;\n const down = r.down[i] ?? 0;\n if (!(up + down > 0)) continue;\n const y0 = yOf(price.scale, r.low + i * r.step);\n const y1 = yOf(price.scale, r.low + (i + 1) * r.step);\n const top = Math.min(y0, y1);\n const h = Math.max(\n 1,\n Math.abs(y1 - y0) - (Math.abs(y1 - y0) > 4 ? 1 : 0),\n );\n const inside = i >= r.valueAreaFrom && i <= r.valueAreaTo;\n const alpha = inside ? 0.42 : 0.17;\n const upLength = (up / largest) * span;\n const downLength = (down / largest) * span;\n const edge = fromRight ? plotW : 0;\n const dir = fromRight ? -1 : 1;\n ctx.fillStyle = toCss(upColor, alpha);\n ctx.fillRect(Math.min(edge, edge + dir * upLength), top, upLength, h);\n ctx.fillStyle = toCss(downColor, alpha);\n const start = edge + dir * upLength;\n ctx.fillRect(\n Math.min(start, start + dir * downLength),\n top,\n downLength,\n h,\n );\n }\n // point of control\n const y =\n Math.round(yOf(price.scale, r.low + (r.poc + 0.5) * r.step)) + 0.5;\n ctx.strokeStyle = css(o.pocColor ?? WARNING, 0.9);\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n ctx.stroke();\n ctx.restore();\n };\n\n const paintBackground = (\n ctx: CanvasRenderingContext2D,\n v: Visible | null,\n ticks: TimeLabel[],\n ) => {\n const grid = toCss(theme.grid);\n const showGrid = options.grid !== false;\n ctx.lineWidth = 1;\n if (showGrid) {\n ctx.strokeStyle = grid;\n ctx.beginPath();\n for (const t of ticks) {\n const x = Math.round(t.x) + 0.5;\n ctx.moveTo(x, 0);\n ctx.lineTo(x, plotH);\n }\n for (const pane of panes) {\n for (const t of pane.ticks) {\n const y = Math.round(yOfScaled(pane.scale, t)) + 0.5;\n if (y < pane.top + 2 || y > pane.top + pane.height - 2) continue;\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n }\n }\n ctx.stroke();\n }\n // watermark\n if (options.watermark) {\n const price = panes[0];\n ctx.save();\n ctx.font = font(Math.min(56, Math.max(22, plotW / 14)), 700);\n ctx.fillStyle = toCss(theme.text, 0.07);\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(options.watermark, plotW / 2, price.top + price.height / 2);\n ctx.restore();\n }\n // bands of the indicator panes\n for (const pane of panes) {\n const study = pane.study;\n if (study?.bands && isVisible(study)) {\n const color = resolve(colorOf(study.outputs[0]?.color ?? PRIMARY));\n const ys = study.bands.map((b) => Math.round(yOf(pane.scale, b)) + 0.5);\n if (study.bandFill && ys.length === 2) {\n ctx.fillStyle = toCss(color, 0.07);\n ctx.fillRect(\n 0,\n Math.min(ys[0], ys[1]),\n plotW,\n Math.abs(ys[1] - ys[0]),\n );\n }\n ctx.save();\n ctx.setLineDash([4, 4]);\n ctx.strokeStyle = toCss(theme.textMuted, 0.45);\n ctx.beginPath();\n for (const y of ys) {\n if (y < pane.top || y > pane.top + pane.height) continue;\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n }\n ctx.stroke();\n ctx.restore();\n }\n }\n if (v) {\n paintSessionBreaks(ctx, v);\n for (const study of studies) {\n if (!study.fills.length || !isVisible(study)) continue;\n const pane = study.overlay\n ? panes[0]\n : panes.find((p) => p.study === study);\n if (pane)\n for (const f of study.fills) paintFill(ctx, v, pane, study, f);\n }\n const price = panes[0];\n if (price && price.scale.mode === \"percent\" && compares.length) {\n // the common origin of the compared series\n const y = Math.round(yOfScaled(price.scale, 0)) + 0.5;\n if (y > price.top && y < price.top + price.height) {\n ctx.save();\n ctx.strokeStyle = toCss(theme.textMuted, 0.6);\n ctx.setLineDash([2, 3]);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n ctx.stroke();\n ctx.restore();\n }\n }\n paintVolumeProfile(ctx, v);\n }\n // separators and axis borders\n ctx.strokeStyle = toCss(theme.axis);\n ctx.beginPath();\n for (const pane of panes.slice(1)) {\n const y = Math.round(pane.top) + 0.5;\n ctx.moveTo(0, y);\n ctx.lineTo(width, y);\n }\n ctx.moveTo(Math.round(plotW) + 0.5, 0);\n ctx.lineTo(Math.round(plotW) + 0.5, height);\n ctx.moveTo(0, Math.round(plotH) + 0.5);\n ctx.lineTo(width, Math.round(plotH) + 0.5);\n ctx.stroke();\n };\n\n /** Label on the price axis; returns its vertical extent */\n const axisLabel = (\n ctx: CanvasRenderingContext2D,\n y: number,\n text: string,\n fill: string,\n textColor: string,\n second?: string,\n ) => {\n const h = second ? 32 : 18;\n const top = clamp(Math.round(y - 9), 0, plotH - h);\n roundRect(ctx, plotW + 1, top, axisW - 2, h, 3);\n ctx.fillStyle = fill;\n ctx.fill();\n ctx.fillStyle = textColor;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n ctx.font = font(theme.fontSize, 500);\n ctx.fillText(text, plotW + 7, top + 9.5);\n if (second) {\n ctx.font = font(theme.fontSize - 1);\n ctx.fillText(second, plotW + 7, top + 24);\n }\n };\n\n const priceAxisText = (value: number) =>\n panes[0]?.scale.mode === \"percent\"\n ? formatPercent(toScaled(panes[0].scale, value), locale)\n : formatPrice(value);\n\n const lineColor = (line: TradingPriceLine) => {\n if (line.color) return css(line.color);\n const kind = line.kind ?? \"line\";\n if (kind === \"takeProfit\") return css(upCss());\n if (kind === \"stopLoss\") return css(downCss());\n if (kind === \"alert\") return css(WARNING);\n if (kind === \"line\") return css(PRIMARY);\n return css(line.side === \"sell\" ? downCss() : upCss());\n };\n\n const linePrice = (line: TradingPriceLine) =>\n lineOverrides.get(line.id) ?? line.price;\n\n const crosshairState = () => {\n if (!vis || !panes.length) return null;\n if (keyboardIndex !== null) {\n const index = keyboardIndex;\n const bar = index >= 0 && index < n() ? display().close[index] : NaN;\n return { index, pane: panes[0], y: yOf(panes[0].scale, bar), price: bar };\n }\n if (!pointer && externalCross) {\n const index = Math.round(indexOfTimeExt(externalCross.time));\n const price = externalCross.price;\n return {\n index,\n pane: panes[0],\n y: finite(price) ? yOf(panes[0].scale, price) : NaN,\n price,\n };\n }\n if (!pointer || pointer.x > plotW || pointer.y > plotH) return null;\n const pane = paneAt(pointer.y);\n if (!pane) return null;\n const index = Math.round(indexAt(pointer.x));\n let y = pointer.y;\n let price = valueAt(pane.scale, y);\n if (\n pane.id === PRICE &&\n options.crosshair !== \"free\" &&\n index >= 0 &&\n index < n() &&\n tool === \"cursor\"\n ) {\n const d = display();\n let best = Infinity;\n for (const value of [\n d.open[index],\n d.high[index],\n d.low[index],\n d.close[index],\n ]) {\n const yy = yOf(pane.scale, value);\n if (Math.abs(yy - pointer.y) < best) {\n best = Math.abs(yy - pointer.y);\n y = yy;\n price = value;\n }\n }\n }\n return { index, pane, y, price };\n };\n\n const paneOf = (id: string | undefined) =>\n panes.find((p) => p.id === (id ?? PRICE)) ?? null;\n\n const drawingMapper = (pane: Pane | null): DrawingMapper | null => {\n if (!pane) return null;\n return {\n x: xOf,\n y: (p) => yOf(pane.scale, p),\n index: indexOfTimeExt,\n left: 0,\n right: plotW,\n top: pane.top,\n bottom: pane.top + pane.height,\n };\n };\n\n const formatSpan = (bars: number, ms: number) => {\n const l = labels();\n const abs = Math.abs(ms);\n const parts: string[] = [];\n const days = Math.floor(abs / DAY);\n const hours = Math.floor((abs % DAY) / HOUR);\n const minutes = Math.floor((abs % HOUR) / MINUTE);\n if (days) parts.push(fill(l.days, { count: days }));\n if (hours) parts.push(fill(l.hours, { count: hours }));\n if (minutes && !days) parts.push(fill(l.minutes, { count: minutes }));\n return `${fill(labels().bars, { count: bars })}, ${parts.join(\" \") || fill(l.minutes, { count: 0 })}`;\n };\n\n /** A value of a pane as written by its axis (prices on the price pane) */\n const paneValueText = (pane: Pane, value: number) =>\n pane.id === PRICE ? formatPrice(value) : paneTickText(pane, value);\n\n /** Price rounded to the precision of the prices */\n const roundPrice = (price: number) => {\n const step = 10 ** -precision();\n return Number((Math.round(price / step) * step).toFixed(precision()));\n };\n\n /** A rounded label (pill) with text */\n const pill = (\n ctx: CanvasRenderingContext2D,\n text: string,\n x: number,\n y: number,\n fillColor: string,\n align: \"left\" | \"center\" | \"right\" = \"center\",\n ) => {\n ctx.font = font(theme.fontSize, 500);\n const w = ctx.measureText(text).width + 16;\n const left = clamp(\n align === \"center\" ? x - w / 2 : align === \"right\" ? x - w : x,\n 2,\n Math.max(2, plotW - w - 2),\n );\n roundRect(ctx, left, y, w, 22, 11);\n ctx.fillStyle = fillColor;\n ctx.fill();\n ctx.fillStyle = textOn(fillColor);\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(text, left + w / 2, y + 11.5);\n return w;\n };\n\n /** Registers a clickable area of the canvas; returns whether it is hovered */\n const canvasButton = (\n x: number,\n y: number,\n w: number,\n h: number,\n action: () => void,\n ) => {\n canvasButtons.push({ x, y, w, h, action });\n return hoveredButton === canvasButtons.length - 1;\n };\n\n const paintDrawings = (\n ctx: CanvasRenderingContext2D,\n colors: { text: string; background: string; up: string; down: string },\n ) => {\n const count = n();\n const last = count ? store.close[count - 1] : NaN;\n const all = draft ? [...drawings, draft] : drawings;\n if (!all.length) return;\n const l = labels();\n const position = {\n target: l.target,\n stop: l.stop,\n riskReward: l.riskReward,\n profit: l.profit,\n long: l.long,\n short: l.short,\n };\n for (const pane of panes) {\n const mapper = drawingMapper(pane);\n if (!mapper) continue;\n const own = all.filter((d) => (d.pane ?? PRICE) === pane.id);\n if (!own.length) continue;\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, pane.top, plotW, pane.height);\n ctx.clip();\n for (const drawing of own) {\n const box = paintDrawing(\n ctx,\n drawing,\n mapper,\n {\n ...colors,\n color: css(drawing.color ?? PRIMARY),\n font: font(theme.fontSize, 500),\n fontFamily: theme.fontFamily,\n formatPrice: (value) => paneValueText(pane, value),\n formatPercent: (value) => formatPercent(value, locale),\n formatSpan,\n textOn,\n defaultText: l.text,\n position,\n last: pane.id === PRICE ? last : NaN,\n fill,\n },\n {\n selected: drawing === draft || drawing.id === selected,\n hovered: drawing.id === hovered,\n },\n );\n if (box) textBoxes.set(drawing.id, box);\n }\n ctx.restore();\n }\n };\n\n const paintForeground = (\n ctx: CanvasRenderingContext2D,\n v: Visible | null,\n ticks: TimeLabel[],\n ) => {\n const price = panes[0];\n if (!price) return;\n canvasButtons = [];\n const count = n();\n const text = toCss(theme.text);\n const muted = toCss(theme.textMuted);\n const bgCss = toCss(theme.background);\n const upC = css(upCss());\n const downC = css(downCss());\n const l = labels();\n\n // ---- price pane contents (clipped)\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, price.top, plotW, price.height);\n ctx.clip();\n\n // high / low of the visible bars, kept inside the plot\n if (\n v &&\n options.highLowMarkers !== false &&\n style() !== \"line\" &&\n style() !== \"area\" &&\n style() !== \"baseline\"\n ) {\n let hi = -Infinity;\n let lo = Infinity;\n let hiG = -1;\n let loG = -1;\n for (let g = v.s0; g <= v.s1; g++) {\n if (v.cols.high[g] > hi) {\n hi = v.cols.high[g];\n hiG = g;\n }\n if (v.cols.low[g] < lo) {\n lo = v.cols.low[g];\n loG = g;\n }\n }\n ctx.font = font(theme.fontSize);\n ctx.fillStyle = muted;\n ctx.strokeStyle = muted;\n ctx.lineWidth = 1;\n for (const [g, value, below] of [\n [hiG, hi, false],\n [loG, lo, true],\n ] as const) {\n if (g < 0 || !finite(value)) continue;\n const x = xOf(groupCenter(v, g));\n const label = formatPrice(value);\n const w = ctx.measureText(label).width;\n let y = clamp(\n yOf(price.scale, value) + (below ? 9 : -9),\n price.top + 8,\n price.top + price.height - 8,\n );\n // not under a row of the legend\n const labelLeft = Math.min(x, x + (x > plotW * 0.6 ? -17 - w : 17 + w));\n for (const row of priceLegend) {\n if (\n labelLeft < row.right &&\n y - 7 < row.bottom &&\n y + 7 > row.top &&\n row.bottom + 10 < price.top + price.height - 8\n )\n y = row.bottom + 10;\n }\n // on the right of the bar, unless it does not fit there\n const roomRight = plotW - 4 - (x + 17 + w);\n const roomLeft = x - 17 - w - 4;\n const leftSide =\n (roomRight < 0 || x > plotW * 0.6) &&\n roomLeft >= Math.min(0, roomRight);\n const dir = leftSide ? -1 : 1;\n ctx.textBaseline = \"middle\";\n ctx.textAlign = \"left\";\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(x + dir * 14, y);\n ctx.stroke();\n const tx = clamp(leftSide ? x - 17 - w : x + 17, 2, plotW - w - 2);\n ctx.fillText(label, tx, y);\n }\n }\n\n // trade markers\n if (v && options.markers?.length) {\n const stack = new Map<string, number>();\n ctx.font = font(theme.fontSize, 600);\n ctx.textAlign = \"center\";\n const many = options.markers.length > 400;\n for (const marker of options.markers) {\n const index = indexOfTimeExt(marker.time);\n if (index < 0 || index > count - 1) continue;\n const g = Math.floor(index / v.size);\n if (g < v.g0 || g > v.g1) continue;\n const x = Math.round(xOf(groupCenter(v, g)));\n const sell = marker.side === \"sell\";\n const color = marker.color ? css(marker.color) : sell ? downC : upC;\n const key = `${g}:${sell}`;\n const offset = stack.get(key) ?? 0;\n stack.set(key, offset + (marker.text && !many ? 30 : 16));\n const anchor = yOf(price.scale, sell ? v.cols.high[g] : v.cols.low[g]);\n const dir = sell ? -1 : 1;\n const tip = anchor + dir * (6 + offset);\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.moveTo(x, tip);\n ctx.lineTo(x - 5.5, tip + dir * 7);\n ctx.lineTo(x - 2, tip + dir * 7);\n ctx.lineTo(x - 2, tip + dir * 12);\n ctx.lineTo(x + 2, tip + dir * 12);\n ctx.lineTo(x + 2, tip + dir * 7);\n ctx.lineTo(x + 5.5, tip + dir * 7);\n ctx.closePath();\n ctx.fill();\n if (marker.text && !many) {\n ctx.textBaseline = sell ? \"bottom\" : \"top\";\n ctx.fillText(marker.text, x, tip + dir * 14);\n }\n if (marker.price !== undefined && finite(marker.price)) {\n ctx.beginPath();\n ctx.arc(x, yOf(price.scale, marker.price), 3, 0, Math.PI * 2);\n ctx.fill();\n ctx.lineWidth = 1.5;\n ctx.strokeStyle = bgCss;\n ctx.stroke();\n }\n }\n }\n ctx.restore();\n\n // drawings, each in its pane\n paintDrawings(ctx, { text, background: bgCss, up: upC, down: downC });\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, price.top, plotW, price.height);\n ctx.clip();\n // price lines (orders, positions, TP / SL, alerts)\n const lastClose = count ? store.close[count - 1] : NaN;\n for (const line of options.priceLines ?? []) {\n const p = linePrice(line);\n const y = Math.round(yOf(price.scale, p)) + 0.5;\n if (!finite(y) || y < price.top || y > price.top + price.height) continue;\n const color = lineColor(line);\n const kind = line.kind ?? \"line\";\n const lineStyle =\n line.lineStyle ??\n (kind === \"position\" || kind === \"line\" ? \"solid\" : \"dashed\");\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth =\n hoveredLine === line.id ||\n (gesture?.kind === \"order\" && gesture.line.id === line.id)\n ? 1.5\n : 1;\n setDash(ctx, lineStyle, 1);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n ctx.stroke();\n ctx.restore();\n // label: [grip] title | quantity | profit | close\n const titleKey = PRICE_LINE_TITLES[kind];\n const title = line.title ?? (titleKey ? l[titleKey] : \"\");\n const parts: {\n text: string;\n fill: string;\n color: string;\n cancel?: boolean;\n }[] = [];\n if (title) parts.push({ text: title, fill: color, color: textOn(color) });\n if (line.quantity !== undefined && line.quantity !== \"\")\n parts.push({ text: String(line.quantity), fill: bgCss, color });\n if (\n kind === \"position\" &&\n typeof line.quantity === \"number\" &&\n finite(lastClose)\n ) {\n const pnl =\n (lastClose - p) * line.quantity * (line.side === \"sell\" ? -1 : 1);\n const pnlFill = pnl >= 0 ? upC : downC;\n parts.push({\n text: `${pnl >= 0 ? \"+\" : \"−\"}${formatPrice(Math.abs(pnl))}`,\n fill: pnlFill,\n color: textOn(pnlFill),\n });\n }\n if (line.cancellable)\n parts.push({ text: \"×\", fill: bgCss, color, cancel: true });\n if (!parts.length && !line.draggable) continue;\n ctx.font = font(theme.fontSize, 600);\n const widths = parts.map((part) =>\n part.cancel ? 20 : ctx.measureText(part.text).width + 12,\n );\n const grip = line.draggable ? 14 : 0;\n const total = widths.reduce((a, b) => a + b, 0) + grip;\n let x = Math.round(plotW - total - 56);\n const top = Math.round(y - 9.5);\n roundRect(ctx, x - 0.5, top - 0.5, total + 1, 19, 3);\n ctx.fillStyle = bgCss;\n ctx.fill();\n ctx.strokeStyle = color;\n ctx.lineWidth = 1;\n ctx.setLineDash([]);\n ctx.stroke();\n if (grip) {\n ctx.fillStyle = color;\n for (let k = 0; k < 3; k++)\n ctx.fillRect(x + 4, top + 5 + k * 3.5, 6, 1.5);\n x += grip;\n }\n ctx.textBaseline = \"middle\";\n ctx.textAlign = \"center\";\n parts.forEach((part, k) => {\n const w = widths[k] ?? 0;\n let partFill = part.fill;\n if (part.cancel) {\n const hover = canvasButton(x, top, w, 18, () =>\n emit(\"orderCancel\", { id: line.id, line }),\n );\n if (hover) partFill = color;\n ctx.fillStyle = color;\n ctx.fillRect(x, top + 3, 1, 12);\n }\n if (partFill !== bgCss) {\n ctx.fillStyle = partFill;\n ctx.fillRect(x, top, w, 18);\n }\n ctx.fillStyle =\n part.cancel && partFill !== bgCss ? textOn(color) : part.color;\n if (part.cancel) ctx.font = font(theme.fontSize + 3, 500);\n ctx.fillText(part.text, x + w / 2, top + (part.cancel ? 9 : 9.5));\n ctx.font = font(theme.fontSize, 600);\n x += w;\n });\n }\n\n // last price line\n const lastLine = options.lastPriceLine !== false && count > 0;\n const lastUp = count > 0 && store.close[count - 1] >= store.open[count - 1];\n // a line takes its own color; bars the color of the last bar\n const lastColor =\n style() === \"line\" || style() === \"area\"\n ? css(PRIMARY)\n : lastUp\n ? upC\n : downC;\n if (lastLine) {\n const y = Math.round(yOf(price.scale, lastClose)) + 0.5;\n ctx.save();\n ctx.strokeStyle = lastColor;\n ctx.setLineDash([1, 2]);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n ctx.stroke();\n ctx.restore();\n }\n ctx.restore();\n\n // last values of the compared series\n const compareLabels: { y: number; text: string; color: string }[] = [];\n for (const c of compares) {\n let i = count - 1;\n while (i >= 0 && !finite(c.values[i])) i--;\n if (i < 0) continue;\n const value = c.values[i];\n const scaled = compareScaled(price.scale, value, compareBase(c));\n const y = yOfScaled(price.scale, scaled);\n if (!finite(y) || y < price.top || y > price.top + price.height) continue;\n compareLabels.push({\n y,\n text:\n price.scale.mode === \"percent\"\n ? formatPercent(scaled, locale)\n : formatPrice(value),\n color: css(c.color),\n });\n }\n\n // axis ticks, except under the labels drawn over the axis\n const covered: { pane: string; y: number }[] = [];\n for (const line of options.priceLines ?? [])\n covered.push({ pane: PRICE, y: yOf(price.scale, linePrice(line)) });\n for (const drawing of drawings) {\n const pane = paneOf(drawing.pane);\n if (pane && drawing.type === \"horizontalLine\" && drawing.points[0])\n covered.push({\n pane: pane.id,\n y: yOf(pane.scale, drawing.points[0].price),\n });\n }\n for (const label of compareLabels)\n covered.push({ pane: PRICE, y: label.y });\n if (lastLine)\n covered.push({\n pane: PRICE,\n y: yOf(price.scale, lastClose) + (options.countdown ? 7 : 0),\n });\n ctx.font = font(theme.fontSize);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n ctx.fillStyle = muted;\n for (const pane of panes) {\n for (const t of pane.ticks) {\n const y = yOfScaled(pane.scale, t);\n if (y < pane.top + 8 || y > pane.top + pane.height - 8) continue;\n const gap = options.countdown && pane.id === PRICE ? 18 : 14;\n if (covered.some((c) => c.pane === pane.id && Math.abs(c.y - y) < gap))\n continue;\n ctx.fillText(paneTickText(pane, t), plotW + 8, y);\n }\n }\n // time axis ticks\n ctx.textAlign = \"center\";\n for (const t of ticks) {\n ctx.font = font(theme.fontSize, t.bold ? 600 : 400);\n ctx.fillStyle = t.bold ? text : muted;\n ctx.fillText(t.text, t.x, plotH + TIME_AXIS / 2);\n }\n\n // labels of the price lines, the drawings and the compared series\n for (const line of options.priceLines ?? []) {\n const p = linePrice(line);\n const y = yOf(price.scale, p);\n if (!finite(y) || y < price.top || y > price.top + price.height) continue;\n const fillColor = lineColor(line);\n axisLabel(ctx, y, priceAxisText(p), fillColor, textOn(fillColor));\n }\n for (const drawing of drawings) {\n const pane = paneOf(drawing.pane);\n if (!pane || drawing.type !== \"horizontalLine\" || !drawing.points[0])\n continue;\n const p = drawing.points[0].price;\n const y = yOf(pane.scale, p);\n if (y < pane.top || y > pane.top + pane.height) continue;\n const fillColor = css(drawing.color ?? PRIMARY);\n axisLabel(\n ctx,\n y,\n pane.id === PRICE ? priceAxisText(p) : paneValueText(pane, p),\n fillColor,\n textOn(fillColor),\n );\n }\n for (const label of compareLabels)\n axisLabel(ctx, label.y, label.text, label.color, textOn(label.color));\n // last price label (with the countdown)\n if (lastLine) {\n let second: string | undefined;\n if (options.countdown) {\n const tf = timeframe();\n const start = store.time[count - 1];\n let end = start + tf.ms;\n if (tf.unit === \"month\") {\n const date = new Date(start);\n end = Date.UTC(\n date.getUTCFullYear(),\n date.getUTCMonth() + tf.count,\n date.getUTCDate(),\n date.getUTCHours(),\n date.getUTCMinutes(),\n );\n }\n second = formatCountdown(end - Date.now(), l);\n }\n axisLabel(\n ctx,\n yOf(price.scale, lastClose),\n priceAxisText(lastClose),\n lastColor,\n textOn(lastColor),\n second,\n );\n }\n\n // replay: the badge, or the picking of the first bar (at the bottom of\n // the price pane: the legends cover its top)\n const badgeY = price.top + price.height - 32;\n if (replayPicking) {\n const x = pointer && pointer.x <= plotW ? pointer.x : NaN;\n if (finite(x)) {\n ctx.fillStyle = toCss(theme.background, 0.62);\n ctx.fillRect(x, 0, plotW - x, plotH);\n ctx.strokeStyle = css(PRIMARY);\n ctx.lineWidth = 1.5;\n ctx.beginPath();\n ctx.moveTo(Math.round(x) + 0.5, 0);\n ctx.lineTo(Math.round(x) + 0.5, plotH);\n ctx.stroke();\n }\n pill(ctx, l.replayHint, plotW / 2, badgeY, css(PRIMARY));\n } else if (replay && count) {\n pill(\n ctx,\n fill(l.replay, {\n time: formatCrosshairTime(\n shift(store.time[count - 1]),\n tfMs(),\n locale,\n ),\n }),\n plotW / 2,\n badgeY,\n css(PRIMARY),\n );\n }\n\n // crosshair\n const cross = crosshairState();\n if (cross && v && !replayPicking) {\n const x = Math.round(xOf(cross.index)) + 0.5;\n ctx.save();\n ctx.strokeStyle = toCss(theme.textMuted, 0.75);\n ctx.lineWidth = 1;\n ctx.setLineDash([4, 3]);\n ctx.beginPath();\n if (x >= 0 && x <= plotW) {\n ctx.moveTo(x, 0);\n ctx.lineTo(x, plotH);\n }\n const y = Math.round(cross.y) + 0.5;\n if (\n finite(y) &&\n y >= cross.pane.top &&\n y <= cross.pane.top + cross.pane.height\n ) {\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n }\n ctx.stroke();\n ctx.restore();\n const labelBg = toCss(theme.text);\n if (\n finite(cross.y) &&\n cross.y >= cross.pane.top &&\n cross.y <= cross.pane.top + cross.pane.height\n ) {\n const scaled = scaledAt(cross.pane.scale, cross.y);\n const textValue =\n cross.pane.id === PRICE\n ? priceAxisText(fromScaled(cross.pane.scale, scaled))\n : paneTickText(cross.pane, scaled);\n axisLabel(ctx, cross.y, textValue, labelBg, bgCss);\n }\n if (x >= 0 && x <= plotW && count) {\n const label = formatCrosshairTime(\n shift(timeAt(cross.index)),\n tfMs(),\n locale,\n );\n ctx.font = font(theme.fontSize, 500);\n const w = ctx.measureText(label).width + 16;\n const left = clamp(x - w / 2, 0, width - w);\n roundRect(ctx, left, plotH + 3, w, 21, 3);\n ctx.fillStyle = labelBg;\n ctx.fill();\n ctx.fillStyle = bgCss;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(label, left + w / 2, plotH + 14);\n }\n // order entry: a \"+\" at the crosshair price\n if (\n options.orderEntry &&\n pointer &&\n cross.pane.id === PRICE &&\n finite(cross.y) &&\n tool === \"cursor\" &&\n !gesture &&\n count\n ) {\n const size = 18;\n const bx = plotW - size - 4;\n const by = clamp(\n Math.round(cross.y - size / 2),\n price.top + 1,\n price.top + price.height - size - 1,\n );\n const orderPrice = roundPrice(cross.price);\n const side = orderPrice < lastClose ? \"buy\" : \"sell\";\n const hover = canvasButton(bx, by, size, size, () =>\n emit(\"orderCreate\", { price: orderPrice, side }),\n );\n roundRect(ctx, bx, by, size, size, 4);\n ctx.fillStyle = hover ? css(PRIMARY) : labelBg;\n ctx.fill();\n ctx.strokeStyle = hover ? textOn(css(PRIMARY)) : bgCss;\n ctx.lineWidth = 1.5;\n ctx.beginPath();\n ctx.moveTo(bx + 5, by + size / 2);\n ctx.lineTo(bx + size - 5, by + size / 2);\n ctx.moveTo(bx + size / 2, by + 5);\n ctx.lineTo(bx + size / 2, by + size - 5);\n ctx.stroke();\n if (hover) {\n pill(\n ctx,\n fill(side === \"buy\" ? l.buyLimit : l.sellLimit, {\n price: formatPrice(orderPrice),\n }),\n bx - 6,\n by - 2,\n side === \"buy\" ? upC : downC,\n \"right\",\n );\n }\n }\n }\n };\n\n // -------------------------------------------------------------- legends\n\n let legendKey = \"\";\n /** Rows of the legend of the price pane (labels painted under them are moved) */\n let priceLegend: { right: number; top: number; bottom: number }[] = [];\n const legendRows = new Map<string, LegendRow>();\n const legendBoxes = new Map<string, HTMLDivElement>();\n\n const legendBox = (id: string) => {\n let box = legendBoxes.get(id);\n if (!box) {\n box = make(\"div\", {\n position: \"absolute\",\n left: \"8px\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n gap: \"1px\",\n maxWidth: \"calc(100% - 16px)\",\n fontSize: \"12px\",\n lineHeight: \"18px\",\n fontVariantNumeric: \"tabular-nums\",\n whiteSpace: \"nowrap\",\n pointerEvents: \"none\",\n });\n legends.appendChild(box);\n legendBoxes.set(id, box);\n }\n return box;\n };\n\n const legendRow = (\n box: HTMLDivElement,\n title: string,\n study: Study | null,\n outputs: number,\n ) => {\n const row = make(\"div\", {\n display: \"flex\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n columnGap: \"6px\",\n padding: \"0 4px\",\n marginLeft: \"-4px\",\n borderRadius: \"4px\",\n background:\n \"color-mix(in srgb, var(--surface-color, var(--background-color, #fff)) 86%, transparent)\",\n });\n let button: HTMLButtonElement | null = null;\n if (study) {\n button = make(\"button\", {\n all: \"unset\",\n cursor: \"pointer\",\n pointerEvents: \"auto\",\n color: \"var(--text-color, #1f2937)\",\n fontWeight: \"500\",\n borderRadius: \"3px\",\n });\n button.type = \"button\";\n button.textContent = title;\n button.setAttribute(\n \"aria-label\",\n fill(labels().toggleIndicator, { name: title }),\n );\n button.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n const next = !isVisible(study);\n visibility.set(study.id, next);\n emit(\"indicatorToggle\", { id: study.id, visible: next });\n updateLegends();\n invalidate();\n });\n button.addEventListener(\"pointerdown\", (event) =>\n event.stopPropagation(),\n );\n row.appendChild(button);\n } else if (title) {\n const label = make(\"span\", { fontWeight: \"600\" });\n label.textContent = title;\n row.appendChild(label);\n }\n const values: HTMLSpanElement[] = [];\n for (let i = 0; i < outputs; i++) {\n const span = make(\"span\", {});\n row.appendChild(span);\n values.push(span);\n }\n box.appendChild(row);\n return { row, values, button };\n };\n\n const buildLegends = () => {\n legendRows.clear();\n for (const box of legendBoxes.values()) box.remove();\n legendBoxes.clear();\n if (options.legend === false) return;\n const priceBox = legendBox(PRICE);\n const head = [\n options.symbol,\n options.labels?.timeframe ??\n (typeof options.timeframe === \"string\" ? options.timeframe : \"\"),\n ]\n .filter(Boolean)\n .join(\" · \");\n legendRows.set(\"ohlc\", legendRow(priceBox, head, null, 1));\n for (const study of studies) {\n const slots = study.mergeLegend ? 1 : study.outputs.length;\n if (study.overlay && study.type === \"volume\") {\n legendRows.set(study.id, legendRow(priceBox, titleOf(study), study, 1));\n } else if (study.overlay) {\n legendRows.set(\n study.id,\n legendRow(priceBox, titleOf(study), study, slots),\n );\n }\n }\n for (const c of compares)\n legendRows.set(`compare:${c.id}`, legendRow(priceBox, \"\", null, 1));\n for (const study of studies) {\n if (study.overlay) continue;\n legendRows.set(\n study.id,\n legendRow(\n legendBox(study.id),\n titleOf(study),\n study,\n study.mergeLegend ? 1 : study.outputs.length,\n ),\n );\n }\n };\n\n /** Legend title: indicator abbreviations, but words for the volume and some indicators */\n const titleOf = (study: Study) =>\n study.type === \"volume\"\n ? labels().volume\n : study.titleKey\n ? `${labels()[study.titleKey]} ${study.title}`\n : study.title;\n\n const setSpan = (\n span: HTMLSpanElement | undefined,\n text: string,\n color?: string,\n ) => {\n if (!span) return;\n if (span.textContent !== text) span.textContent = text;\n const c = color ?? \"\";\n if (span.style.color !== c) span.style.color = c;\n };\n\n const updateLegends = () => {\n const key = [\n options.legend !== false,\n options.symbol,\n options.timeframe,\n ...studies.map((s) => `${s.id}:${titleOf(s)}:${s.outputs.length}`),\n ...compares.map((c) => c.id),\n texts.toggleIndicator,\n options.labels?.timeframe,\n ].join(\"|\");\n if (key !== legendKey) {\n legendKey = key;\n buildLegends();\n }\n if (options.legend === false) return;\n for (const pane of panes) {\n const box = legendBoxes.get(pane.id);\n if (!box) continue;\n box.style.top = `${pane.top + 6}px`;\n // over the plot only, never over the price axis\n const maxWidth = `${Math.max(80, Math.floor(plotW - 14))}px`;\n if (box.style.maxWidth !== maxWidth) box.style.maxWidth = maxWidth;\n }\n const priceBox = legendBoxes.get(PRICE);\n priceLegend = priceBox\n ? Array.from(\n priceBox.children as HTMLCollectionOf<HTMLElement>,\n (row) => ({\n right: priceBox.offsetLeft + row.offsetLeft + row.offsetWidth,\n top: priceBox.offsetTop + row.offsetTop,\n bottom: priceBox.offsetTop + row.offsetTop + row.offsetHeight,\n }),\n )\n : [];\n const count = n();\n const cross = crosshairState();\n const index = clamp(\n cross && cross.index >= 0 && cross.index < count\n ? cross.index\n : count - 1,\n 0,\n Math.max(0, count - 1),\n );\n const l = labels();\n const ohlc = legendRows.get(\"ohlc\");\n const upC = css(upCss());\n const downC = css(downCss());\n if (ohlc && count) {\n const d = display();\n const o = d.open[index];\n const c = d.close[index];\n const prevClose = index > 0 ? d.close[index - 1] : o;\n const change = c - prevClose;\n const color = c >= o ? upC : downC;\n const span = ohlc.values[0];\n const html = [\n [l.open, d.open[index]],\n [l.high, d.high[index]],\n [l.low, d.low[index]],\n [l.close, c],\n ]\n .map(\n ([name, value]) =>\n `<span style=\"color:var(--text-secondary-color,#6b7280)\">${escapeHtml(String(name))}</span><span style=\"color:${color}\">${escapeHtml(formatPrice(value as number))}</span>`,\n )\n .join(\" \");\n const pct = prevClose ? (change / prevClose) * 100 : NaN;\n const changeName = l.change\n ? `<span style=\"color:var(--text-secondary-color,#6b7280)\">${escapeHtml(l.change)}</span>`\n : \"\";\n const changeHtml = `${changeName}<span style=\"color:${change >= 0 ? upC : downC}\">${change >= 0 ? \"+\" : \"−\"}${escapeHtml(formatPrice(Math.abs(change)))} (${escapeHtml(formatPercent(pct, locale))})</span>`;\n const vol = store.hasVolume\n ? ` <span style=\"color:var(--text-secondary-color,#6b7280)\">${escapeHtml(l.volume)}</span>${escapeHtml(formatVolume(store.volume[index], locale))}`\n : \"\";\n const next = `${html} ${changeHtml}${vol}`;\n if (span && span.dataset.html !== next) {\n span.innerHTML = next;\n span.dataset.html = next;\n span.style.display = \"inline-flex\";\n span.style.gap = \"4px\";\n span.style.flexWrap = \"wrap\";\n }\n }\n for (const study of studies) {\n const row = legendRows.get(study.id);\n if (!row) continue;\n const shown = isVisible(study);\n row.row.style.opacity = shown ? \"1\" : \"0.5\";\n if (row.button) {\n row.button.setAttribute(\"aria-pressed\", String(shown));\n row.button.style.textDecoration = shown ? \"none\" : \"line-through\";\n }\n const slots = study.outputs.length;\n if (study.mergeLegend) {\n // one value: the output in use (SuperTrend up or down)\n const out = study.outputs.find((o) => finite(o.values[index]));\n setSpan(\n row.values[0],\n shown && count && out ? studyValueText(study, out.values[index]) : \"\",\n out ? css(colorOf(out.color)) : undefined,\n );\n continue;\n }\n study.outputs.forEach((out, i) => {\n // the MACD histogram (drawn first, under the lines) is listed last\n const span =\n row.values[study.type === \"macd\" ? (i + slots - 1) % slots : i];\n if (!shown || !count) {\n setSpan(span, \"\");\n return;\n }\n if (out.kind === \"volume\") {\n const c = store.close[index] >= store.open[index] ? upC : downC;\n setSpan(span, formatVolume(store.volume[index], locale), c);\n return;\n }\n // a shifted output shows the value drawn at this bar\n const source = index - out.shift;\n const value = source >= 0 && source < count ? out.values[source] : NaN;\n let color = out.color ? css(colorOf(out.color)) : undefined;\n if (out.kind === \"histogram\") color = value >= 0 ? upC : downC;\n if (out.kind === \"dots\" && !out.color)\n color = value <= store.close[index] ? upC : downC;\n const prefix =\n study.outputs.length > 1 && !study.plainLegend ? `${out.label} ` : \"\";\n setSpan(span, `${prefix}${studyValueText(study, value)}`, color);\n });\n }\n for (const c of compares) {\n const row = legendRows.get(`compare:${c.id}`);\n if (!row) continue;\n const value = c.values[index];\n const base = compareBase(c);\n const pct = finite(base) ? (value / base - 1) * 100 : NaN;\n setSpan(\n row.values[0],\n `${c.name} ${formatPrice(value)} ${formatPercent(pct, locale)}`,\n css(c.color),\n );\n }\n };\n\n const escapeHtml = (text: string) =>\n text.replace(/[&<>\"]/g, (ch) =>\n ch === \"&\"\n ? \"&\"\n : ch === \"<\"\n ? \"<\"\n : ch === \">\"\n ? \">\"\n : \""\",\n );\n\n // ---------------------------------------------------------------- frame\n\n const invalidate = () => {\n if (destroyed || frameId) return;\n frameId = win?.requestAnimationFrame\n ? win.requestAnimationFrame(frame)\n : (setTimeout(() => frame(Date.now()), 16) as unknown as number);\n };\n\n const animate = (now: number) => {\n let active = false;\n if (scrollAnim) {\n const t = Math.min(1, (now - scrollAnim.start) / 320);\n const eased = 1 - (1 - t) ** 3;\n right = scrollAnim.from + (scrollAnim.to - scrollAnim.from) * eased;\n if (t >= 1) scrollAnim = null;\n else active = true;\n }\n if (kinetic) {\n const dt = Math.min(64, now - kinetic.t);\n kinetic.t = now;\n const before = right;\n right -= (kinetic.v * dt) / spacing;\n kinetic.v *= Math.exp(-dt / 320);\n clampView();\n if (Math.abs(kinetic.v) < 0.02 || right === before) kinetic = null;\n else active = true;\n }\n return active;\n };\n\n const measureAxis = (ctx: CanvasRenderingContext2D) => {\n ctx.font = font(theme.fontSize, 500);\n let widest = 0;\n for (const pane of panes) {\n for (const t of pane.ticks)\n widest = Math.max(widest, ctx.measureText(paneTickText(pane, t)).width);\n }\n const count = n();\n if (count) {\n widest = Math.max(\n widest,\n ctx.measureText(priceAxisText(store.close[count - 1])).width,\n );\n if (options.countdown)\n widest = Math.max(widest, ctx.measureText(\"00:00:00\").width);\n }\n const wanted = Math.max(MIN_AXIS, Math.ceil(widest + 18));\n // shrink only when clearly narrower (no jitter while the price moves)\n if (wanted > axisW || wanted < axisW - 12) axisW = wanted;\n };\n\n function frame(now?: number) {\n frameId = 0;\n if (destroyed) return;\n width = root.clientWidth;\n height = root.clientHeight;\n if (width <= 0 || height <= 0) return;\n const time = now ?? Date.now();\n const animating = animate(\n typeof performance !== \"undefined\" ? performance.now() : time,\n );\n const dpr = win?.devicePixelRatio || 1;\n syncDerived();\n sizeCanvas(background, dpr);\n sizeCanvas(foreground, dpr);\n const bg = background.getContext(\"2d\");\n const fg = foreground.getContext(\"2d\");\n plotH = Math.max(1, height - TIME_AXIS);\n for (let pass = 0; pass < 2; pass++) {\n plotW = Math.max(1, width - axisW);\n layoutPanes();\n if (pendingRange) applyRange(pendingRange);\n clampView();\n vis = computeVisible();\n autoscale(vis);\n for (const pane of panes) {\n const ticks = scaleTicks(pane.scale, pane.id === PRICE ? 44 : 30);\n // fixed-range panes (RSI) label their bands and their middle\n const range = pane.study?.range;\n const bands = pane.study?.bands;\n pane.ticks =\n range && bands\n ? [...bands, (range[0] + range[1]) / 2].sort((a, b) => a - b)\n : ticks.scaled;\n pane.step = ticks.step;\n }\n const before = axisW;\n if (fg) measureAxis(fg);\n if (axisW === before) break;\n }\n const v = vis;\n pendingRange = null;\n const ticks = fg ? timeTicks(v, fg) : [];\n renderData(v, dpr);\n if (bg) {\n bg.setTransform(dpr, 0, 0, dpr, 0, 0);\n bg.clearRect(0, 0, width, height);\n paintBackground(bg, v, ticks);\n }\n if (fg) {\n fg.setTransform(dpr, 0, 0, dpr, 0, 0);\n fg.clearRect(0, 0, width, height);\n paintForeground(fg, v, ticks);\n }\n updateLegends();\n updateJump();\n updateToolbar();\n positionEditor();\n emitView();\n // buttons painted this frame may now be under the pointer\n if (\n pointer &&\n !gesture &&\n buttonAt(pointer.x, pointer.y) !== hoveredButton\n ) {\n updateCursor(pointer.x, pointer.y);\n invalidate();\n }\n if (animating) invalidate();\n }\n\n const updateJump = () => {\n const count = n();\n const price = panes[0];\n const show = count > 0 && price && xOf(count - 1) > plotW + spacing * 0.5;\n jump.style.display = show ? \"flex\" : \"none\";\n if (show && price) {\n jump.style.left = `${plotW - 40}px`;\n jump.style.top = `${price.top + price.height - 40}px`;\n const text = labels().scrollToRealtime;\n if (jump.getAttribute(\"aria-label\") !== text) {\n jump.setAttribute(\"aria-label\", text);\n jump.title = text;\n }\n }\n };\n\n const visibleRange = (): TradingVisibleRange => {\n const from = right - plotW / spacing;\n return { from, to: right, fromTime: timeAt(from), toTime: timeAt(right) };\n };\n\n const emitView = () => {\n const count = n();\n if (!count) return;\n const range = visibleRange();\n if (\n !lastRange ||\n Math.abs(lastRange.from - range.from) > 1e-6 ||\n Math.abs(lastRange.to - range.to) > 1e-6\n ) {\n lastRange = range;\n if (!silentRange) emit(\"visibleRangeChange\", range);\n }\n silentRange = false;\n if (range.from < 10 && historyFirst !== store.time[0]) {\n historyFirst = store.time[0];\n emit(\"historyRequest\", { firstTime: store.time[0], count });\n }\n const cross = crosshairState();\n // a crosshair set by `setCrosshair` is not reported\n const own = cross && (pointer || keyboardIndex !== null) ? cross : null;\n const key = own ? `${own.index}|${own.price}|${own.pane.id}` : \"\";\n if (key !== lastCrosshair) {\n lastCrosshair = key;\n if (!own) {\n emit(\"crosshairMove\", null);\n } else {\n const event: TradingCrosshairEvent = {\n index: own.index,\n time: timeAt(own.index),\n bar:\n own.index >= 0 && own.index < count\n ? readBar(store, own.index)\n : null,\n price: own.price,\n pane: own.pane.id,\n x: xOf(own.index),\n y: own.y,\n };\n emit(\"crosshairMove\", event);\n }\n }\n };\n\n // ---------------------------------------------------------- interaction\n\n const local = (event: { clientX: number; clientY: number }) => {\n const rect = root.getBoundingClientRect();\n return { x: event.clientX - rect.left, y: event.clientY - rect.top };\n };\n\n const applyRange = (range: { from: number; to: number }) => {\n spacing = plotW / (range.to - range.from);\n right = range.to;\n clampView();\n };\n\n /**\n * Zooms around `x`; while the latest bar is in view it stays where it is\n * (the reader is following the market), like the price scale side of\n * trading terminals\n */\n const zoomAt = (x: number, factor: number) => {\n const count = n();\n if (count && followsRealtime()) x = Math.min(plotW, xOf(count - 1));\n const anchor = indexAt(x);\n spacing = spacing * factor;\n clampView();\n right = anchor + (plotW - x) / spacing;\n clampView();\n kinetic = null;\n scrollAnim = null;\n invalidate();\n };\n\n const anchorAt = (x: number, y: number, pane: Pane): TradingDrawingPoint => {\n const index = Math.round(indexAt(x));\n return { time: timeAt(index), price: valueAt(pane.scale, y) };\n };\n\n const setTool = (next: TradingDrawingTool, notify: boolean) => {\n if (next === tool) return;\n tool = next;\n draft = null;\n draftClicks = 0;\n if (notify) emit(\"drawingToolChange\", next);\n invalidate();\n };\n\n const select = (id: string | null) => {\n if (id === selected) return;\n selected = id;\n paletteOpen = false;\n emit(\"drawingSelect\", id);\n invalidate();\n };\n\n // ------------------------------------------------------ drawing history\n\n const undoState = (): TradingUndoState => ({\n canUndo: undoStack.length > 0,\n canRedo: redoStack.length > 0,\n });\n\n const emitUndo = () => {\n const state = undoState();\n const key = `${state.canUndo}|${state.canRedo}`;\n if (key === undoKey) return;\n undoKey = key;\n emit(\"undoChange\", state);\n };\n\n /** Records a change of the drawings: undoable, and reported unless `notify` is false */\n const commitDrawings = (next: readonly TradingDrawing[], notify = true) => {\n if (next !== committed) {\n undoStack.push(committed);\n if (undoStack.length > HISTORY_LIMIT) undoStack.shift();\n redoStack.length = 0;\n committed = next;\n }\n drawings = next;\n if (notify) {\n emittedDrawings = next;\n emit(\"drawingsChange\", next);\n }\n if (selected && !next.some((d) => d.id === selected)) select(null);\n emitUndo();\n invalidate();\n };\n\n /** Shows drawings of the history (undo / redo) */\n const restoreDrawings = (next: readonly TradingDrawing[]) => {\n committed = next;\n drawings = next;\n emittedDrawings = next;\n draft = null;\n if (selected && !next.some((d) => d.id === selected)) select(null);\n emit(\"drawingsChange\", next);\n emitUndo();\n invalidate();\n };\n\n const undo = () => {\n const previous = undoStack.pop();\n if (!previous) return;\n if (editing) closeEditor(false);\n redoStack.push(committed);\n restoreDrawings(previous);\n };\n\n const redo = () => {\n const next = redoStack.pop();\n if (!next) return;\n undoStack.push(committed);\n restoreDrawings(next);\n };\n\n const updateDrawing = (id: string, patch: TradingDrawingPatch) => {\n if (!drawings.some((d) => d.id === id)) return;\n commitDrawings(\n drawings.map((d) =>\n d.id === id ? { ...d, ...patch, id: d.id, type: d.type } : d,\n ),\n );\n };\n\n const removeDrawing = (id: string) => {\n if (!drawings.some((d) => d.id === id)) return;\n if (selected === id) select(null);\n commitDrawings(drawings.filter((d) => d.id !== id));\n };\n\n /** Default target and stop of a new position: a reward twice the risk */\n const positionPoints = (\n entry: TradingDrawingPoint,\n pane: Pane,\n long: boolean,\n ): TradingDrawingPoint[] => {\n const y = yOf(pane.scale, entry.price);\n const risk = Math.max(12, pane.height * 0.07);\n const target = valueAt(pane.scale, y + (long ? -2 : 2) * risk);\n const stop = valueAt(pane.scale, y + (long ? 1 : -1) * risk);\n const bars = Math.max(6, Math.round((plotW * 0.16) / spacing));\n const end = timeAt(Math.round(indexOfTimeExt(entry.time)) + bars);\n return [\n entry,\n { time: end, price: roundPrice(target) },\n { time: end, price: roundPrice(stop) },\n ];\n };\n\n const finishDraft = () => {\n if (!draft) return;\n const done = draft;\n draft = null;\n draftClicks = 0;\n commitDrawings([...drawings, done]);\n select(done.id);\n if (!options.keepDrawingMode) setTool(\"cursor\", true);\n if (done.type === \"text\") openEditor(done.id, true);\n };\n\n /** Fixes the anchor following the pointer; the drawing is done after its last anchor */\n const fixDraftAnchor = () => {\n if (!draft) return;\n draftClicks--;\n if (draftClicks <= 0) {\n finishDraft();\n return;\n }\n const last = draft.points[draft.points.length - 1];\n if (last) draft = { ...draft, points: [...draft.points, last] };\n };\n\n /** Moves the anchor of the drawing being made to the pointer */\n const followDraft = (x: number, y: number) => {\n const pane = paneOf(draftPane);\n if (!draft || !pane || draftClicks <= 0) return;\n draft = {\n ...draft,\n points: [...draft.points.slice(0, -1), anchorAt(x, y, pane)],\n };\n };\n\n const hitLine = (x: number, y: number) => {\n const price = panes[0];\n if (!price || x > plotW) return null;\n for (const line of options.priceLines ?? []) {\n if (!line.draggable) continue;\n if (Math.abs(yOf(price.scale, linePrice(line)) - y) <= 5) return line;\n }\n return null;\n };\n\n const hitDrawingAt = (x: number, y: number) => {\n if (x > plotW) return null;\n const pane = paneAt(y);\n const mapper = drawingMapper(pane);\n if (!pane || !mapper) return null;\n for (let i = drawings.length - 1; i >= 0; i--) {\n const drawing = drawings[i];\n if (!drawing || (drawing.pane ?? PRICE) !== pane.id) continue;\n const hit = hitDrawing(\n drawing,\n mapper,\n { x, y },\n 6,\n textBoxes.get(drawing.id),\n );\n if (hit) return { drawing, hit, pane };\n }\n return null;\n };\n\n const buttonAt = (x: number, y: number) =>\n canvasButtons.findIndex(\n (b) => x >= b.x && x <= b.x + b.w && y >= b.y && y <= b.y + b.h,\n );\n\n const separatorAt = (y: number) => {\n for (let i = 1; i < panes.length; i++) {\n if (Math.abs(panes[i].top - y) <= 4) return i;\n }\n return -1;\n };\n\n // --------------------------------------------------------- text editor\n\n const autosizeEditor = () => {\n editor.style.height = \"auto\";\n editor.style.height = `${Math.max(28, editor.scrollHeight + 2)}px`;\n };\n\n const positionEditor = () => {\n if (!editing) return;\n const id = editing.id;\n const drawing = drawings.find((d) => d.id === id);\n const pane = drawing ? paneOf(drawing.pane) : null;\n const anchor = drawing?.points[0];\n if (!drawing || !pane || !anchor) return;\n const x = xOf(indexOfTimeExt(anchor.time));\n const y = yOf(pane.scale, anchor.price);\n editor.style.left = `${clamp(x, 2, Math.max(2, plotW - 160))}px`;\n editor.style.top = `${clamp(y, 2, Math.max(2, plotH - 40))}px`;\n };\n\n function openEditor(id: string, created: boolean) {\n const drawing = drawings.find((d) => d.id === id);\n if (!drawing || drawing.locked) return;\n editing = { id, created };\n editor.value = created ? \"\" : (drawing.text ?? \"\");\n editor.placeholder = labels().text;\n editor.setAttribute(\"aria-label\", labels().editText);\n editor.style.display = \"block\";\n positionEditor();\n autosizeEditor();\n editor.focus();\n editor.select();\n invalidate();\n }\n\n function closeEditor(commit: boolean) {\n if (!editing) return;\n const { id, created } = editing;\n editing = null;\n editor.style.display = \"none\";\n const text = editor.value.replace(/\\s+$/, \"\");\n const drawing = drawings.find((d) => d.id === id);\n if (drawing && created && (!commit || !text)) {\n // a new text left empty or cancelled: as if it had never been made\n const previous = undoStack.pop();\n restoreDrawings(previous ?? drawings.filter((d) => d.id !== id));\n } else if (drawing && commit && text !== (drawing.text ?? \"\")) {\n if (created) {\n // the text completes the creation (a single undo step)\n const next = drawings.map((d) => (d.id === id ? { ...d, text } : d));\n committed = next;\n drawings = next;\n emittedDrawings = next;\n emit(\"drawingsChange\", next);\n } else {\n updateDrawing(id, { text });\n }\n }\n if (doc.activeElement === editor || doc.activeElement === doc.body)\n root.focus();\n invalidate();\n }\n\n editor.addEventListener(\"keydown\", (event) => {\n event.stopPropagation();\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n closeEditor(true);\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n closeEditor(false);\n }\n });\n editor.addEventListener(\"input\", autosizeEditor);\n editor.addEventListener(\"blur\", () => closeEditor(true));\n editor.addEventListener(\"pointerdown\", (event) => event.stopPropagation());\n editor.addEventListener(\"dblclick\", (event) => event.stopPropagation());\n\n // ------------------------------------------------------ drawing toolbar\n\n const icon = (path: string, dash = \"\", width = 1.5) =>\n `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"${width}\" stroke-linecap=\"round\" stroke-linejoin=\"round\"${dash ? ` stroke-dasharray=\"${dash}\"` : \"\"} aria-hidden=\"true\"><path d=\"${path}\"/></svg>`;\n\n const toolbarButton = (\n label: string,\n content: string,\n onClick: () => void,\n pressed?: boolean,\n ) => {\n const button = doc.createElement(\"button\");\n button.type = \"button\";\n button.setAttribute(\"aria-label\", label);\n button.title = label;\n if (pressed !== undefined)\n button.setAttribute(\"aria-pressed\", String(pressed));\n button.innerHTML = content;\n button.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n onClick();\n });\n return button;\n };\n\n const separator = () => {\n const span = doc.createElement(\"span\");\n span.className = \"sep\";\n return span;\n };\n\n const buildToolbar = (drawing: TradingDrawing) => {\n toolbar.textContent = \"\";\n const l = labels();\n toolbar.setAttribute(\"aria-label\", l.lineStyle);\n const id = drawing.id;\n const items: HTMLElement[] = [];\n if (!drawing.locked) {\n const color = css(drawing.color ?? PRIMARY);\n const swatch = toolbarButton(\n l.color,\n `<span style=\"display:block;width:14px;height:14px;border-radius:50%;background:${color};box-shadow:inset 0 0 0 1px rgba(127,127,127,.35)\"></span>`,\n () => {\n paletteOpen = !paletteOpen;\n toolbarKey = \"\";\n updateToolbar();\n },\n );\n swatch.setAttribute(\"aria-expanded\", String(paletteOpen));\n items.push(swatch);\n const width = drawing.lineWidth ?? 1.5;\n const widths = [1, 2, 3, 4];\n items.push(\n toolbarButton(\n `${l.lineWidth}: ${width}px`,\n `${icon(\"M2 8h12\", \"\", Math.min(4, width))}<span style=\"font-size:11px;margin-left:3px\">${width}</span>`,\n () =>\n updateDrawing(id, {\n lineWidth: widths.find((w) => w > width) ?? widths[0],\n }),\n ),\n );\n const lineStyle = drawing.lineStyle ?? \"solid\";\n items.push(\n toolbarButton(\n l.lineStyle,\n icon(\n \"M2 8h12\",\n lineStyle === \"dashed\"\n ? \"3.5 2.5\"\n : lineStyle === \"dotted\"\n ? \"0.1 3\"\n : \"\",\n lineStyle === \"dotted\" ? 2.2 : 1.6,\n ),\n () =>\n updateDrawing(id, {\n lineStyle:\n LINE_STYLES[\n (LINE_STYLES.indexOf(lineStyle) + 1) % LINE_STYLES.length\n ],\n }),\n ),\n );\n if (isFillable(drawing.type)) {\n items.push(\n toolbarButton(\n l.fill,\n '<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\"><rect x=\"2.5\" y=\"3.5\" width=\"11\" height=\"9\" rx=\"1.5\" fill=\"currentColor\" fill-opacity=\".3\" stroke=\"currentColor\" stroke-width=\"1.3\"/></svg>',\n () => updateDrawing(id, { fill: drawing.fill === false }),\n drawing.fill !== false,\n ),\n );\n }\n if (drawing.type === \"text\") {\n items.push(\n toolbarButton(l.editText, icon(\"M3 13h3l7-7-3-3-7 7zM9 4l3 3\"), () =>\n openEditor(id, false),\n ),\n );\n }\n items.push(separator());\n }\n items.push(\n toolbarButton(\n l.lock,\n drawing.locked\n ? icon(\"M4.5 7.5h7v6h-7zM6 7.5V5.5a2 2 0 0 1 4 0v2\")\n : icon(\"M4.5 7.5h7v6h-7zM6 7.5V5.5a2 2 0 0 1 3.8-.9\"),\n () => updateDrawing(id, { locked: !drawing.locked }),\n !!drawing.locked,\n ),\n );\n if (!drawing.locked) {\n const remove = toolbarButton(\n l.remove,\n icon(\"M3 4.5h10M6.5 4.5V3h3v1.5M4.5 4.5l.7 8.5h5.6l.7-8.5\"),\n () => removeDrawing(id),\n );\n remove.style.color = \"var(--danger-color, #f23645)\";\n items.push(remove);\n }\n toolbar.append(...items);\n if (paletteOpen && !drawing.locked) {\n const palette = make(\"div\", {\n position: \"absolute\",\n left: \"0\",\n top: \"calc(100% + 4px)\",\n display: \"flex\",\n gap: \"2px\",\n padding: \"4px\",\n borderRadius: \"8px\",\n border:\n \"1px solid color-mix(in srgb, var(--border-color, #e5e7eb) 85%, transparent)\",\n background: \"var(--surface-elevated-color, var(--surface-color, #fff))\",\n boxShadow: \"0 8px 24px -8px rgba(15, 23, 42, 0.35)\",\n });\n for (const color of PALETTE) {\n const button = toolbarButton(\n `${l.color} ${color}`,\n `<span style=\"display:block;width:16px;height:16px;border-radius:50%;background:${color}\"></span>`,\n () => {\n paletteOpen = false;\n updateDrawing(id, { color });\n },\n (drawing.color ?? \"\").toLowerCase() === color,\n );\n palette.appendChild(button);\n }\n toolbar.appendChild(palette);\n }\n };\n\n function updateToolbar() {\n const drawing = selected\n ? drawings.find((d) => d.id === selected)\n : undefined;\n const pane = drawing ? paneOf(drawing.pane) : null;\n const mapper = drawingMapper(pane);\n const dragging = gesture?.kind === \"drawing\" && gesture.moved;\n if (\n !drawing ||\n !pane ||\n !mapper ||\n options.drawingToolbar === false ||\n editing ||\n dragging ||\n draft\n ) {\n toolbar.style.display = \"none\";\n toolbarKey = \"\";\n paletteOpen = false;\n return;\n }\n const key = [\n drawing.id,\n drawing.color,\n drawing.lineWidth,\n drawing.lineStyle,\n drawing.fill,\n drawing.locked,\n paletteOpen,\n locale,\n themeVersion,\n ].join(\"|\");\n if (key !== toolbarKey) {\n toolbarKey = key;\n buildToolbar(drawing);\n }\n toolbar.style.display = \"flex\";\n // above the drawing (below it when there is no room), inside the plot\n const pts = handlePoints(drawing, mapper, textBoxes.get(drawing.id));\n const box = textBoxes.get(drawing.id);\n if (drawing.type === \"text\" && box)\n pts.push({ x: box.x + box.w, y: box.y + box.h });\n let x0 = Infinity;\n let x1 = -Infinity;\n let y0 = Infinity;\n let y1 = -Infinity;\n for (const p of pts) {\n x0 = Math.min(x0, clamp(p.x, 0, plotW));\n x1 = Math.max(x1, clamp(p.x, 0, plotW));\n y0 = Math.min(y0, clamp(p.y, pane.top, pane.top + pane.height));\n y1 = Math.max(y1, clamp(p.y, pane.top, pane.top + pane.height));\n }\n if (drawing.type === \"horizontalLine\") {\n x0 = plotW * 0.35;\n x1 = plotW * 0.65;\n }\n const w = toolbar.offsetWidth || 200;\n const h = toolbar.offsetHeight || 34;\n const left = clamp((x0 + x1) / 2 - w / 2, 4, Math.max(4, plotW - w - 4));\n let top = y0 - h - 14;\n // below, clear of the labels under the drawing (position stops, measures)\n if (top < 4) top = y1 + 32;\n toolbar.style.left = `${Math.round(left)}px`;\n toolbar.style.top = `${Math.round(clamp(top, 4, Math.max(4, plotH - h - 4)))}px`;\n }\n\n toolbar.addEventListener(\"pointerdown\", (event) => event.stopPropagation());\n toolbar.addEventListener(\"dblclick\", (event) => event.stopPropagation());\n // the chart under the toolbar is not hovered\n toolbar.addEventListener(\"pointermove\", (event) => event.stopPropagation());\n toolbar.addEventListener(\"pointerenter\", () => {\n pointer = null;\n hovered = null;\n root.style.cursor = \"default\";\n invalidate();\n });\n\n // ---------------------------------------------------------------- replay\n\n const replayState = (): TradingReplayState => ({\n active: !!replay,\n picking: replayPicking,\n playing: !!replay?.playing,\n speed: replay?.speed ?? replaySpeed,\n index: n(),\n total: replay ? replay.source.length : n(),\n time: n() ? store.time[n() - 1] : NaN,\n });\n\n const emitReplay = () => emit(\"replayChange\", replayState());\n\n const columnsOf = (from: BarStore, count: number) => ({\n time: from.time.subarray(0, count),\n open: from.open.subarray(0, count),\n high: from.high.subarray(0, count),\n low: from.low.subarray(0, count),\n close: from.close.subarray(0, count),\n volume: from.volume.subarray(0, count),\n });\n\n /** Replaces the bars of the store by the first `count` bars of `source` */\n const showBars = (source: BarStore, count: number) => {\n const hasVolume = source.hasVolume;\n storeSet(store, columnsOf(source, count));\n store.hasVolume = hasVolume;\n pyramid = createPyramid();\n haPyramid = createPyramid();\n haValid = 0;\n historyFirst = NaN;\n afterDataChange(0);\n };\n\n const stopReplayTimer = () => {\n if (replay?.timer) clearInterval(replay.timer);\n if (replay) {\n replay.timer = null;\n replay.playing = false;\n }\n };\n\n const beginReplay = (index: number) => {\n replayPicking = false;\n if (!replay) {\n if (!n()) return;\n const source = createStore();\n storeSet(source, columnsOf(store, n()));\n source.hasVolume = store.hasVolume;\n replay = { source, playing: false, speed: replaySpeed, timer: null };\n }\n stopReplayTimer();\n const shown = clamp(Math.round(index) + 1, 1, replay.source.length);\n showBars(replay.source, shown);\n right = shown - 1 + (options.rightOffset ?? 8);\n for (const scale of scales.values()) scale.auto = true;\n emitReplay();\n };\n\n const replayStepBy = (count: number) => {\n if (!replay) return;\n const source = replay.source;\n const before = n();\n const follow = followsRealtime();\n let from = -1;\n for (let i = 0; i < count && n() < source.length; i++) {\n const at = storeUpdate(store, readBar(source, n()));\n if (from < 0) from = at;\n }\n store.hasVolume = source.hasVolume;\n if (from >= 0) {\n if (follow) right += n() - before;\n afterDataChange(from);\n }\n if (n() >= source.length) stopReplayTimer();\n emitReplay();\n };\n\n const playReplay = (speed?: number) => {\n if (!replay) return;\n if (speed !== undefined && speed > 0) replay.speed = replaySpeed = speed;\n stopReplayTimer();\n if (n() >= replay.source.length) {\n emitReplay();\n return;\n }\n const interval = Math.max(16, 1000 / replay.speed);\n const perTick = Math.max(1, Math.round((replay.speed * interval) / 1000));\n replay.playing = true;\n replay.timer = setInterval(() => replayStepBy(perTick), interval);\n emitReplay();\n };\n\n /** Ends the replay; `restore` shows every bar again */\n const endReplay = (restore: boolean) => {\n const wasPicking = replayPicking;\n replayPicking = false;\n if (!replay) {\n if (wasPicking) {\n emitReplay();\n invalidate();\n }\n return;\n }\n stopReplayTimer();\n const source = replay.source;\n replay = null;\n if (restore) showBars(source, source.length);\n emitReplay();\n };\n\n // ----------------------------------------------------------- pointer\n\n const updateCursor = (x: number, y: number) => {\n let cursor = \"crosshair\";\n hoveredLine = null;\n let nextHover: string | null = null;\n const button = gesture ? -1 : buttonAt(x, y);\n if (button !== hoveredButton) hoveredButton = button;\n if (gesture?.kind === \"pan\" && gesture.moved) cursor = \"grabbing\";\n else if (button >= 0) cursor = \"pointer\";\n else if (replayPicking && x <= plotW && y <= plotH) cursor = \"pointer\";\n else if (separatorAt(y) > 0) cursor = \"row-resize\";\n else if (x > plotW && y < plotH) cursor = \"ns-resize\";\n else if (y > plotH) cursor = \"ew-resize\";\n else if (tool === \"cursor\") {\n const line = hitLine(x, y);\n if (line) {\n cursor = \"ns-resize\";\n hoveredLine = line.id;\n } else {\n const hit = hitDrawingAt(x, y);\n if (hit) {\n nextHover = hit.drawing.id;\n cursor = hit.drawing.locked\n ? \"pointer\"\n : hit.hit.part === \"handle\"\n ? \"move\"\n : \"pointer\";\n }\n }\n }\n if (nextHover !== hovered) hovered = nextHover;\n if (root.style.cursor !== cursor) root.style.cursor = cursor;\n };\n\n const onPointerDown = (event: PointerEvent) => {\n if (event.button !== 0 && event.pointerType === \"mouse\") return;\n const { x, y } = local(event);\n pointer = { x, y };\n keyboardIndex = null;\n kinetic = null;\n scrollAnim = null;\n if (editing) closeEditor(true);\n if (paletteOpen) {\n paletteOpen = false;\n invalidate();\n }\n if (event.pointerType === \"touch\") {\n touches.set(event.pointerId, { x, y });\n if (touches.size === 2) {\n const [a, b] = [...touches.values()];\n pinch = { distance: Math.hypot(a.x - b.x, a.y - b.y), spacing };\n gesture = null;\n return;\n }\n }\n try {\n root.setPointerCapture(event.pointerId);\n } catch {\n // the pointer may already be released\n }\n const button = buttonAt(x, y);\n const target = canvasButtons[button];\n if (target) {\n gesture = { kind: \"button\", action: target.action };\n return;\n }\n if (replayPicking && x <= plotW && y <= plotH) {\n beginReplay(Math.min(n() - 1, Math.round(indexAt(x))));\n return;\n }\n const sep = separatorAt(y);\n if (sep > 0) {\n const above = panes[sep - 1];\n const below = panes[sep];\n gesture = {\n kind: \"separator\",\n index: sep,\n y,\n above: above.height,\n below: below.height,\n };\n return;\n }\n if (x > plotW && y < plotH) {\n const pane = paneAt(y);\n if (pane)\n gesture = {\n kind: \"axisY\",\n pane,\n y,\n min: pane.scale.min,\n max: pane.scale.max,\n };\n return;\n }\n if (y > plotH) {\n gesture = { kind: \"axisX\", x, spacing };\n return;\n }\n const pane = paneAt(y);\n if (tool !== \"cursor\" && pane && n()) {\n if (draft) {\n // the next anchor of a click-by-click drawing\n followDraft(x, y);\n fixDraftAnchor();\n gesture = null;\n invalidate();\n return;\n }\n const type = tool;\n const position = isPosition(type);\n // positions need prices: on the price pane only\n const at = position ? panes[0] : pane;\n const point = anchorAt(x, clamp(y, at.top, at.top + at.height), at);\n const anchors = anchorCount(type);\n draftPane = at.id;\n draft = {\n id: `drawing-${Date.now().toString(36)}-${++drawingCounter}`,\n type,\n points: position\n ? positionPoints(\n { ...point, price: roundPrice(point.price) },\n at,\n type === \"longPosition\",\n )\n : anchors === 1\n ? [point]\n : [point, point],\n ...(at.id !== PRICE ? { pane: at.id } : {}),\n };\n if (anchors === 1) {\n finishDraft();\n return;\n }\n draftClicks = anchors - 1;\n gesture = { kind: \"create\", pane: at, x, y, moved: false };\n invalidate();\n return;\n }\n if (tool === \"cursor\") {\n const line = hitLine(x, y);\n if (line) {\n gesture = { kind: \"order\", line, startPrice: line.price };\n return;\n }\n const hit = hitDrawingAt(x, y);\n if (hit) {\n select(hit.drawing.id);\n if (!hit.drawing.locked) {\n gesture = {\n kind: \"drawing\",\n id: hit.drawing.id,\n pane: hit.pane,\n handle: hit.hit.part === \"handle\" ? hit.hit.index : -1,\n x,\n y,\n original: hit.drawing,\n moved: false,\n };\n }\n return;\n }\n }\n gesture = {\n kind: \"pan\",\n x,\n y,\n right,\n pane,\n moved: false,\n lastX: x,\n lastY: y,\n lastT: event.timeStamp,\n velocity: 0,\n };\n };\n\n const onPointerMove = (event: PointerEvent) => {\n const { x, y } = local(event);\n pointer = { x, y };\n if (event.pointerType === \"touch\" && touches.has(event.pointerId)) {\n touches.set(event.pointerId, { x, y });\n if (pinch && touches.size === 2) {\n const [a, b] = [...touches.values()];\n const distance = Math.hypot(a.x - b.x, a.y - b.y);\n const count = n();\n const mid =\n count && followsRealtime()\n ? Math.min(plotW, xOf(count - 1))\n : (a.x + b.x) / 2;\n const anchor = indexAt(mid);\n spacing = (pinch.spacing * distance) / Math.max(1, pinch.distance);\n clampView();\n right = anchor + (plotW - mid) / spacing;\n clampView();\n invalidate();\n return;\n }\n }\n const g = gesture;\n if (!g) {\n if (draft) followDraft(x, y);\n updateCursor(x, y);\n invalidate();\n return;\n }\n switch (g.kind) {\n case \"pan\": {\n const dx = x - g.x;\n if (!g.moved && Math.hypot(dx, y - g.y) < 3) break;\n g.moved = true;\n right = g.right - dx / spacing;\n if (g.pane && !g.pane.scale.auto) panScale(g.pane.scale, y - g.lastY);\n g.lastY = y;\n const dt = Math.max(1, event.timeStamp - g.lastT);\n g.velocity = 0.6 * ((x - g.lastX) / dt) + 0.4 * g.velocity;\n g.lastX = x;\n g.lastT = event.timeStamp;\n clampView();\n root.style.cursor = \"grabbing\";\n break;\n }\n case \"axisY\": {\n const scale = g.pane.scale;\n scale.min = g.min;\n scale.max = g.max;\n zoomScale(scale, Math.exp((y - g.y) * 0.006));\n break;\n }\n case \"axisX\": {\n const lastIndex = right;\n spacing = g.spacing * Math.exp((x - g.x) * 0.006);\n clampView();\n right = lastIndex;\n clampView();\n break;\n }\n case \"separator\": {\n const dy = y - g.y;\n const above = panes[g.index - 1];\n const below = panes[g.index];\n if (!above || !below) break;\n const total = g.above + g.below;\n const nextBelow = clamp(g.below - dy, MIN_PANE, total - MIN_PANE);\n paneHeights.set(below.id, nextBelow);\n if (above.id !== PRICE) paneHeights.set(above.id, total - nextBelow);\n break;\n }\n case \"order\": {\n lineOverrides.set(g.line.id, roundPrice(valueAt(panes[0].scale, y)));\n break;\n }\n case \"drawing\": {\n if (!g.moved && Math.hypot(x - g.x, y - g.y) < 3) break;\n g.moved = true;\n const scale = g.pane.scale;\n let points: TradingDrawingPoint[];\n if (g.handle >= 0) {\n points = moveHandle(g.original, g.handle, anchorAt(x, y, g.pane));\n } else {\n const di = Math.round(indexAt(x) - indexAt(g.x));\n const ds = scaledAt(scale, y) - scaledAt(scale, g.y);\n points = g.original.points.map((p) => ({\n time: timeAt(Math.round(indexOfTimeExt(p.time)) + di),\n price: fromScaled(scale, toScaled(scale, p.price) + ds),\n }));\n }\n drawings = drawings.map((d) => (d.id === g.id ? { ...d, points } : d));\n break;\n }\n case \"create\": {\n if (Math.hypot(x - g.x, y - g.y) >= 4) g.moved = true;\n followDraft(x, y);\n break;\n }\n default:\n updateCursor(x, y);\n break;\n }\n invalidate();\n };\n\n const onPointerUp = (event: PointerEvent) => {\n touches.delete(event.pointerId);\n if (touches.size < 2) pinch = null;\n const g = gesture;\n gesture = null;\n const { x, y } = local(event);\n if (event.pointerType === \"touch\") pointer = null;\n if (!g) {\n invalidate();\n return;\n }\n switch (g.kind) {\n case \"pan\":\n if (!g.moved) {\n if (selected) select(null);\n const pane = paneAt(y);\n if (pane && x <= plotW) {\n emit(\"click\", {\n index: Math.round(indexAt(x)),\n time: timeAt(Math.round(indexAt(x))),\n price: valueAt(pane.scale, y),\n pane: pane.id,\n });\n }\n } else if (\n options.kineticScroll !== false &&\n event.timeStamp - g.lastT < 60 &&\n Math.abs(g.velocity) > 0.25\n ) {\n kinetic = {\n v: g.velocity,\n t:\n typeof performance !== \"undefined\"\n ? performance.now()\n : Date.now(),\n };\n }\n break;\n case \"order\": {\n const next = lineOverrides.get(g.line.id);\n if (next !== undefined && next !== g.startPrice) {\n emit(\"orderMove\", {\n id: g.line.id,\n price: next,\n previousPrice: g.startPrice,\n line: g.line,\n });\n } else {\n lineOverrides.delete(g.line.id);\n }\n break;\n }\n case \"drawing\":\n if (g.moved) commitDrawings(drawings);\n break;\n case \"create\":\n // a click starts a click-by-click drawing; a drag fixes the anchor\n if (g.moved) fixDraftAnchor();\n break;\n case \"button\":\n if (buttonAt(x, y) >= 0) g.action();\n break;\n default:\n break;\n }\n updateCursor(x, y);\n invalidate();\n };\n\n const onPointerLeave = (event: PointerEvent) => {\n if (gesture || event.pointerType === \"touch\") return;\n pointer = null;\n hovered = null;\n hoveredLine = null;\n invalidate();\n };\n\n const onWheel = (event: WheelEvent) => {\n const mode = options.wheel ?? \"zoom\";\n if (mode === \"none\") return;\n const { x } = local(event);\n const unit = event.deltaMode === 1 ? 16 : event.deltaMode === 2 ? plotW : 1;\n const dx = event.deltaX * unit;\n const dy = event.deltaY * unit;\n const modifier = event.ctrlKey || event.metaKey;\n if (mode === \"modifier\" && !modifier && Math.abs(dx) <= Math.abs(dy))\n return;\n event.preventDefault();\n keyboardIndex = null;\n if (Math.abs(dx) > Math.abs(dy) || event.shiftKey) {\n right += (Math.abs(dx) > Math.abs(dy) ? dx : dy) / spacing;\n clampView();\n kinetic = null;\n invalidate();\n return;\n }\n const factor = Math.exp(-dy * (event.ctrlKey ? 0.01 : 0.0015));\n zoomAt(Math.min(x, plotW), factor);\n };\n\n const onDoubleClick = (event: MouseEvent) => {\n const { x, y } = local(event);\n const hit = tool === \"cursor\" ? hitDrawingAt(x, y) : null;\n if (hit?.drawing.type === \"text\") {\n openEditor(hit.drawing.id, false);\n return;\n }\n if (x > plotW && y < plotH) {\n const pane = paneAt(y);\n if (pane) pane.scale.auto = true;\n } else if (y > plotH) {\n spacing = options.barSpacing ?? 8;\n instance.scrollToRealtime(true);\n } else {\n for (const scale of scales.values()) scale.auto = true;\n }\n invalidate();\n };\n\n const announce = (index: number) => {\n if (index < 0 || index >= n()) return;\n const d = display();\n const l = labels();\n live.textContent = fill(l.announcement, {\n time: formatCrosshairTime(shift(store.time[index]), tfMs(), locale),\n open: formatPrice(d.open[index]),\n high: formatPrice(d.high[index]),\n low: formatPrice(d.low[index]),\n close: formatPrice(d.close[index]),\n });\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n if ((event.ctrlKey || event.metaKey) && !event.altKey) {\n const key = event.key.toLowerCase();\n if (key === \"z\" || key === \"y\") {\n if (key === \"y\" || event.shiftKey) redo();\n else undo();\n event.preventDefault();\n }\n return;\n }\n const count = n();\n const page = Math.max(1, Math.floor(plotW / spacing / 2));\n const move = (index: number) => {\n keyboardIndex = clamp(index, 0, Math.max(0, count - 1));\n const x = xOf(keyboardIndex);\n if (x < spacing) right += (spacing - x) / spacing + 1;\n if (x > plotW - spacing) right -= (x - plotW + spacing) / spacing - 1;\n clampView();\n announce(keyboardIndex);\n };\n const current = keyboardIndex ?? Math.min(count - 1, Math.round(right));\n switch (event.key) {\n case \"ArrowLeft\":\n move(current - (event.shiftKey ? 10 : 1));\n break;\n case \"ArrowRight\":\n move(current + (event.shiftKey ? 10 : 1));\n break;\n case \"PageUp\":\n move(current - page);\n break;\n case \"PageDown\":\n move(current + page);\n break;\n case \"Home\":\n move(0);\n break;\n case \"End\":\n move(count - 1);\n instance.scrollToRealtime(true);\n break;\n case \"+\":\n case \"=\":\n case \"ArrowUp\":\n zoomAt(keyboardIndex !== null ? xOf(keyboardIndex) : plotW, 1.2);\n break;\n case \"-\":\n case \"_\":\n case \"ArrowDown\":\n zoomAt(keyboardIndex !== null ? xOf(keyboardIndex) : plotW, 1 / 1.2);\n break;\n case \"Escape\":\n if (paletteOpen) paletteOpen = false;\n else if (replayPicking) endReplay(false);\n else if (draft) {\n draft = null;\n draftClicks = 0;\n } else if (tool !== \"cursor\") setTool(\"cursor\", true);\n else if (selected) select(null);\n else keyboardIndex = null;\n break;\n case \"Delete\":\n case \"Backspace\": {\n const target = drawings.find((d) => d.id === selected);\n if (!target || target.locked) return;\n removeDrawing(target.id);\n break;\n }\n default:\n return;\n }\n event.preventDefault();\n invalidate();\n };\n\n const onFocus = () => {\n let keyboard = true;\n try {\n keyboard = root.matches(\":focus-visible\");\n } catch {\n // older engines: show the ring\n }\n if (keyboard)\n root.style.boxShadow = `inset 0 0 0 2px ${toCss(theme.primary, 0.6)}`;\n };\n const onBlur = () => {\n root.style.boxShadow = \"\";\n if (keyboardIndex !== null) {\n keyboardIndex = null;\n invalidate();\n }\n };\n\n root.addEventListener(\"pointerdown\", onPointerDown);\n root.addEventListener(\"pointermove\", onPointerMove);\n root.addEventListener(\"pointerup\", onPointerUp);\n root.addEventListener(\"pointercancel\", onPointerUp);\n root.addEventListener(\"pointerleave\", onPointerLeave);\n root.addEventListener(\"wheel\", onWheel, { passive: false });\n root.addEventListener(\"dblclick\", onDoubleClick);\n root.addEventListener(\"keydown\", onKeyDown);\n root.addEventListener(\"focus\", onFocus);\n root.addEventListener(\"blur\", onBlur);\n jump.addEventListener(\"pointerdown\", (event) => event.stopPropagation());\n jump.addEventListener(\"click\", () => instance.scrollToRealtime(true));\n\n const resizeObserver =\n typeof ResizeObserver === \"function\"\n ? new ResizeObserver(() => invalidate())\n : null;\n resizeObserver?.observe(root);\n\n const refreshTheme = () => {\n if (destroyed) return;\n const next = readTheme(root);\n if (themeColorsChanged(theme, next)) themeVersion++;\n theme = next;\n legendKey = \"\";\n invalidate();\n };\n const unwatchTheme = watchTheme(refreshTheme);\n\n // the page language, when no `locale` is given\n let langObserver: MutationObserver | null = null;\n if (typeof MutationObserver === \"function\" && root.ownerDocument) {\n langObserver = new MutationObserver(() => {\n if (options.locale) return;\n const before = locale;\n resolveTexts();\n if (locale === before) return;\n legendKey = \"\";\n optionsVersion++;\n applyStatic();\n invalidate();\n });\n langObserver.observe(root.ownerDocument.documentElement, {\n attributes: true,\n attributeFilter: [\"lang\"],\n });\n }\n\n // ----------------------------------------------------- image, full screen\n\n /** Every layer of the chart (and the legends) drawn on one canvas */\n const compose = (): HTMLCanvasElement | null => {\n if (destroyed) return null;\n // a fresh frame: the GPU canvas is read in the same task\n if (frameId) {\n if (win?.cancelAnimationFrame) win.cancelAnimationFrame(frameId);\n else clearTimeout(frameId);\n frameId = 0;\n }\n frame();\n const dpr = win?.devicePixelRatio || 1;\n const canvas = doc.createElement(\"canvas\");\n canvas.width = Math.max(1, Math.round(width * dpr));\n canvas.height = Math.max(1, Math.round(height * dpr));\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return null;\n ctx.fillStyle = toCss(theme.background);\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n try {\n ctx.drawImage(background, 0, 0);\n if (renderer)\n ctx.drawImage(\n renderer.canvas,\n 0,\n 0,\n Math.round(plotW * dpr),\n Math.round(plotH * dpr),\n );\n ctx.drawImage(foreground, 0, 0);\n } catch {\n // a canvas that can't be read (lost context): skipped\n }\n // the legends are DOM text: written at their place\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n const origin = root.getBoundingClientRect();\n const view = win ?? null;\n legends.querySelectorAll(\"span, button\").forEach((element) => {\n const text = element.textContent ?? \"\";\n if (element.children.length || !text.trim() || !view) return;\n const rect = element.getBoundingClientRect();\n const computed = view.getComputedStyle(element);\n ctx.font = `${computed.fontWeight} ${computed.fontSize} ${computed.fontFamily}`;\n ctx.fillStyle = computed.color || toCss(theme.text);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(\n text,\n rect.left - origin.left,\n rect.top - origin.top + rect.height / 2,\n );\n });\n return canvas;\n };\n\n let fullscreen = false;\n const onFullscreen = () => {\n const next = doc.fullscreenElement === root;\n if (next === fullscreen) return;\n fullscreen = next;\n root.style.background = next ? toCss(theme.background) : \"\";\n emit(\"fullscreenChange\", next);\n invalidate();\n };\n doc.addEventListener(\"fullscreenchange\", onFullscreen);\n\n // ------------------------------------------------------------- renderer\n\n const initRenderer = async (exclude: Set<ChartRendererKind> = new Set()) => {\n const token = ++rendererToken;\n const next = await createRenderer(\n options.renderer ?? \"auto\",\n () => createDataCanvas(doc),\n (kind) => {\n if (destroyed || renderer?.kind !== kind) return;\n renderer.destroy();\n renderer.canvas.remove();\n renderer = null;\n void initRenderer(new Set([...exclude, kind]));\n },\n exclude,\n );\n if (destroyed || token !== rendererToken) {\n next?.destroy();\n return;\n }\n if (renderer) {\n renderer.destroy();\n renderer.canvas.remove();\n }\n renderer = next;\n geomKey = \"\";\n if (next) {\n root.dataset.renderer = next.kind;\n root.insertBefore(next.canvas, foreground);\n emit(\"renderer\", next.kind);\n }\n resolveReady(next?.kind ?? null);\n invalidate();\n };\n\n // ------------------------------------------------------------- options\n\n const applyStatic = () => {\n const symbol = options.symbol ?? \"\";\n root.setAttribute(\n \"aria-label\",\n options.ariaLabel ?? fill(labels().chart, { symbol }).trim(),\n );\n const wantTimer = !!options.countdown && options.lastPriceLine !== false;\n if (wantTimer && !countdownTimer)\n countdownTimer = setInterval(invalidate, 1000);\n if (!wantTimer && countdownTimer) {\n clearInterval(countdownTimer);\n countdownTimer = null;\n }\n };\n\n const applyOptions = (previous: TradingChartOptions | null) => {\n const next = options;\n resolveTexts();\n const nextZone =\n next.timeZone && isTimeZone(next.timeZone) ? next.timeZone : undefined;\n const timeChanged =\n !!previous &&\n (next.utcOffset !== previous.utcOffset || nextZone !== zone);\n zone = nextZone;\n if (!previous || next.indicators !== previous.indicators) rebuildStudies();\n // session periods (VWAP) follow the displayed time\n if (timeChanged) for (const study of studies) studyValid.set(study, 0);\n if (!previous || next.compare !== previous.compare) rebuildCompares();\n if (next.bars && (!previous || next.bars !== previous.bars)) {\n if (replay) endReplay(false);\n if (previous) applyBarsOption(next.bars);\n else replaceBars(next.bars);\n } else if (!next.bars && previous?.bars) {\n if (replay) endReplay(false);\n replaceBars([]);\n }\n if (previous && next.barSpacing !== previous.barSpacing && next.barSpacing)\n spacing = next.barSpacing;\n if (previous && next.scaleMode !== previous.scaleMode) {\n const price = scales.get(PRICE);\n if (price) price.auto = true;\n }\n if (\n next.drawings &&\n next.drawings !== emittedDrawings &&\n (!previous || next.drawings !== previous.drawings)\n ) {\n if (previous) commitDrawings(next.drawings, false);\n else drawings = committed = next.drawings;\n }\n if (\n previous &&\n (next.drawingMode ?? \"cursor\") !== (previous.drawingMode ?? \"cursor\")\n ) {\n setTool(next.drawingMode ?? \"cursor\", false);\n }\n if (previous && next.priceLines !== previous.priceLines)\n lineOverrides.clear();\n if (previous && next.chartStyle !== previous.chartStyle)\n haValid = Math.min(haValid, 0);\n optionsVersion++;\n applyStatic();\n invalidate();\n };\n\n applyOptions(null);\n void initRenderer();\n\n // ------------------------------------------------------------------ api\n\n const instance: TradingChartInstance = {\n setOptions(next) {\n if (destroyed) return;\n const previous = options;\n options = { ...next };\n applyOptions(previous);\n if ((next.renderer ?? \"auto\") !== (previous.renderer ?? \"auto\"))\n void initRenderer();\n },\n setBars(bars) {\n if (replay) endReplay(false);\n replaceBars(bars);\n },\n update(bar) {\n if (replay) {\n // the stream goes on behind the replay\n storeUpdate(replay.source, bar);\n return;\n }\n const before = n();\n const follow = followsRealtime();\n const at = storeUpdate(store, bar);\n if (at < 0) return;\n if (n() > before && follow) right += n() - before;\n afterDataChange(at);\n },\n appendBars(bars) {\n if (replay) {\n storeAppend(replay.source, bars);\n return;\n }\n const before = n();\n const follow = followsRealtime();\n const at = storeAppend(store, bars);\n if (at < 0) return;\n if (follow) right += n() - before;\n afterDataChange(at);\n },\n prependBars(bars) {\n if (replay) storePrepend(replay.source, bars);\n const added = storePrepend(store, bars);\n if (!added) return;\n pyramid = createPyramid();\n haPyramid = createPyramid();\n haValid = 0;\n right += added;\n if (keyboardIndex !== null) keyboardIndex += added;\n afterDataChange(0);\n },\n getBarCount: () => n(),\n getBar: (index) =>\n index >= 0 && index < n() ? readBar(store, Math.floor(index)) : null,\n scrollToRealtime(animateScroll = true) {\n const target = n() - 1 + (options.rightOffset ?? 8);\n kinetic = null;\n if (\n animateScroll &&\n finite(right) &&\n Math.abs(target - right) * spacing < plotW * 6\n ) {\n scrollAnim = {\n from: right,\n to: target,\n start:\n typeof performance !== \"undefined\" ? performance.now() : Date.now(),\n };\n } else {\n right = target;\n }\n invalidate();\n },\n fitContent() {\n const count = n();\n if (!count) return;\n instance.setVisibleRange({\n from: -0.5,\n to: count - 1 + (options.rightOffset ?? 8),\n });\n },\n getVisibleRange: () => visibleRange(),\n setVisibleRange({ from, to }) {\n if (!(to > from)) return;\n kinetic = null;\n scrollAnim = null;\n pendingRange = { from, to };\n applyRange(pendingRange);\n invalidate();\n },\n getVisibleTimeRange() {\n const range = visibleRange();\n return { from: timeAtFrac(range.from), to: timeAtFrac(range.to) };\n },\n setVisibleTimeRange({ from, to }) {\n if (!n() || !(to > from)) return;\n instance.setVisibleRange({\n from: indexAtTimeFrac(from),\n to: indexAtTimeFrac(to),\n });\n },\n setCrosshair(time, price) {\n externalCross =\n time === null || !finite(time) ? null : { time, price: price ?? NaN };\n invalidate();\n },\n setScaleMode(mode) {\n options = { ...options, scaleMode: mode };\n const price = scales.get(PRICE);\n if (price) price.auto = true;\n invalidate();\n },\n resetPriceScales() {\n for (const scale of scales.values()) scale.auto = true;\n invalidate();\n },\n setDrawingTool: (next) => setTool(next, true),\n getDrawingTool: () => tool,\n getDrawings: () => drawings,\n setDrawings(next) {\n commitDrawings(next, false);\n },\n removeDrawing,\n updateDrawing,\n selectDrawing: (id) => select(id),\n undo,\n redo,\n getUndoState: undoState,\n startReplay(time) {\n if (!n() && !replay) return;\n if (time === undefined) {\n if (replay) endReplay(true);\n replayPicking = true;\n emitReplay();\n invalidate();\n return;\n }\n const source = replay ? replay.source : store;\n beginReplay(indexOfTime(source.time, source.length, time));\n },\n replayStep: (count = 1) => replayStepBy(Math.max(1, Math.floor(count))),\n replayPlay: (speed) => playReplay(speed),\n replayPause() {\n if (!replay) return;\n stopReplayTimer();\n emitReplay();\n },\n stopReplay: () => endReplay(true),\n getReplayState: replayState,\n toDataURL(type = \"image/png\", quality) {\n return compose()?.toDataURL(type, quality) ?? \"\";\n },\n toBlob(type = \"image/png\", quality) {\n const canvas = compose();\n return new Promise((resolve) => {\n if (!canvas || typeof canvas.toBlob !== \"function\") resolve(null);\n else canvas.toBlob(resolve, type, quality);\n });\n },\n async requestFullscreen() {\n if (typeof root.requestFullscreen === \"function\")\n await root.requestFullscreen();\n },\n async exitFullscreen() {\n if (\n doc.fullscreenElement === root &&\n typeof doc.exitFullscreen === \"function\"\n )\n await doc.exitFullscreen();\n },\n isFullscreen: () => doc.fullscreenElement === root,\n setIndicatorVisible(id, visible) {\n visibility.set(id, visible);\n invalidate();\n },\n getRenderer: () => renderer?.kind ?? null,\n ready,\n refreshTheme,\n resize: () => invalidate(),\n on(type, listener) {\n let set = listeners.get(type);\n if (!set) listeners.set(type, (set = new Set()));\n set.add(listener as (event: never) => void);\n return () => set.delete(listener as (event: never) => void);\n },\n destroy() {\n if (destroyed) return;\n destroyed = true;\n if (frameId) {\n if (win?.cancelAnimationFrame) win.cancelAnimationFrame(frameId);\n else clearTimeout(frameId);\n }\n if (countdownTimer) clearInterval(countdownTimer);\n if (replay?.timer) clearInterval(replay.timer);\n doc.removeEventListener(\"fullscreenchange\", onFullscreen);\n resizeObserver?.disconnect();\n unwatchTheme();\n langObserver?.disconnect();\n root.removeEventListener(\"wheel\", onWheel);\n renderer?.destroy();\n renderer = null;\n resolveReady(null);\n listeners.clear();\n root.remove();\n },\n };\n syncHooks.set(instance, {\n setTimeRange(range) {\n silentRange = true;\n instance.setVisibleTimeRange(range);\n },\n });\n return instance;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chart.cjs","names":["parseColor","luminance","styleElement","createStore","createPyramid","DAY","readTheme","resolveLocale","localeLabels","TRADING_LABELS","redUpLocale","toCss","priceFormatter","parseTimeframe","indexOfTime","zoneOffset","MINUTE","rangeLevel","createRangePyramid","lowerBoundTime","detectPrecision","inferTimeframe","buildStudies","LINE_COLORS","inputLength","barAt","storeUpdate","createScale","pyramidLevel","toScaled","drawingPrices","boundaryWeight","pickTicks","tickText","formatPercent","stepDecimals","fromScaled","formatVolume","formatFixed","packColor","candleMetrics","yOf","LineBuffer","TrendBuffer","BarBuffer","pixelRange","yOfScaled","AreaBuffer","clampRange","mix","volumeProfile","valueAt","HOUR","fill","paintDrawing","formatCountdown","formatCrosshairTime","scaledAt","scaleTicks","readBar","hitDrawing","isFillable","handlePoints","isPosition","anchorCount","moveHandle","themeColorsChanged","watchTheme","createRenderer","createDataCanvas","isTimeZone","followDefaultRenderer","storeAppend","storePrepend","require_dom","require_color","require_locale","require_scale","require_detect","require_follow","require_theme","require_drawings","require_format","require_geometry","require_indicators","require_labels","require_scale$1","require_store","require_studies","TIME_AXIS","MIN_AXIS","MAX_SPACING","MIN_PANE","PRICE","UP","DOWN","WARNING","PRIMARY","HISTORY_LIMIT","PALETTE","LINE_STYLES","syncHooks","PRICE_LINE_TITLES","clamp","v","lo","hi","textOn","color","fill","finite","ORDER_KEYS","ELLIPSIS","PAIR","createTradingChart","doc","container","win","options","initial","destroyed","make","tag","style","root","layer","background","foreground","legends","jump","live","toolbar","editor","sheet","store","pyramid","ha","haValid","haPyramid","studies","studyValid","visibility","compares","outputLods","trendLods","dataVersion","tailVersion","detectedPrecision","inferredTimeframe","spacing","right","plotW","plotH","axisW","width","height","panes","scales","paneHeights","vis","volumeOverlayMax","theme","themeVersion","optionsVersion","renderer","rendererToken","frameId","layers","geomKey","builtTail","itemVersion","resolveReady","ready","resolve","pointer","keyboardIndex","keyOrder","gesture","touches","pinch","kinetic","scrollAnim","pendingRange","drawings","emittedDrawings","committed","undoStack","redoStack","undoKey","tool","selected","hovered","draft","draftClicks","draftPane","drawingCounter","textBoxes","editing","toolbarKey","paletteOpen","lineOverrides","hoveredLine","canvasButtons","hoveredButton","lastRange","silentRange","externalCross","lastCrosshair","historyFirst","countdownTimer","replay","replayPicking","replaySpeed","profile","listeners","emit","type","fn","event","locale","texts","resolveTexts","labels","n","redUp","upCss","downCss","css","fallback","value","alpha","precision","priceFormat","priceFormatKey","formatPrice","key","timeframe","tfMs","font","weight","size","isVisible","study","xOf","index","indexAt","x","timeAt","count","i","timeAtFrac","edge","t","indexAtTimeFrac","time","span","zone","offsetMinutes","studyOffset","shift","colorOf","groupRanges","lod","values","trendLodOf","lodOf","out","indexOfTimeExt","last","display","markDirty","from","trendLod","c","level","l","p","syncDerived","valid","next","j","afterDataChange","invalidate","rebuildStudies","reused","id","s","rebuildCompares","data","series","a","b","d","followsRealtime","replaceBars","bars","scale","applyBarsOption","length","first","follow","before","at","added","layoutPanes","paneStudies","available","wanted","total","max","k","heights","h","priceHeight","scaleOf","mode","price","top","paneAt","y","clampView","minSpacing","computeVisible","left","src","cols","i0","i1","r0","r1","groupCenter","g","groupBars","firstVisibleIndex","compareBase","compareScaled","base","baselinePrice","outputExtent","r","offset","shiftBars","range","drawingsExtent","dragged","drawing","paneId","autoscale","pane","closeOnly","vol","extent","scaled","band","timeTicks","tf","intraday","gEnd","groupTime","candidates","prev","sample","gap","ctx","paneTickText","studyValueText","createLayers","result","up","down","upP","downP","bg","metrics","dpr","X","histogramHalf","volumeColors","bottom","Y","lineLayer","buffer","isLive","ga","gb","toY","lineWidth","rangeLayer","dx","extra","to","prevY","yLo","yHi","second","trendLayer","trend","line","halo","items","upColor","downColor","st","lineColor","area","yb","upArea","downArea","upLine","downLine","px","py","point","hollow","ohlc","wick","body","wicks","bodies","caps","ticks","tick","o","cx","wt","wb","side","bt","bb","segments","edges","box","upOut","downOut","y0","strong","faded","fixed","radius","half","runLayer","lastMain","version","item","renderData","canvas","bw","bh","sizeCanvas","w","roundRect","paintFill","outA","f","outB","ra","rb","above","below","run","sign","flush","ya","d0","cy","paintSessionBreaks","xs","prevDay","day","profileOptions","option","paintVolumeProfile","rows","largest","fromRight","y1","upLength","downLength","dir","start","paintBackground","grid","showGrid","ys","axisLabel","textColor","text","priceAxisText","kind","linePrice","crosshairState","bar","best","yy","paneOf","drawingMapper","formatSpan","abs","ms","parts","days","hours","minutes","paneValueText","roundPrice","step","pill","align","fillColor","canvasButton","paintDrawings","all","position","mapper","own","colors","paintForeground","muted","bgCss","upC","downC","hiG","loG","label","labelLeft","row","priceLegend","roomRight","roomLeft","leftSide","tx","stack","many","marker","sell","anchor","tip","lastClose","lineStyle","titleKey","title","pnl","pnlFill","widths","part","grip","partFill","lastLine","lastUp","lastColor","compareLabels","covered","end","date","badgeY","cross","labelBg","textValue","bx","by","orderPrice","hover","legendKey","legendRows","legendBoxes","legendBox","legendRow","button","updateLegends","outputs","buildLegends","priceBox","head","slots","titleOf","setSpan","maxWidth","maxHeight","measured","moved","prevClose","change","html","name","escapeHtml","pct","shown","source","prefix","ch","frame","animate","active","now","eased","dt","measureAxis","widest","animating","fg","pass","applyRange","bands","updateJump","updateToolbar","positionEditor","emitView","buttonAt","updateCursor","show","visibleRange","local","rect","zoomAt","factor","anchorAt","setTool","notify","select","undoState","emitUndo","state","commitDrawings","restoreDrawings","undo","previous","closeEditor","redo","updateDrawing","patch","removeDrawing","positionPoints","entry","risk","target","long","stop","finishDraft","done","openEditor","fixDraftAnchor","followDraft","hitLine","hitDrawingAt","hit","separatorAt","autosizeEditor","created","commit","icon","dash","path","toolbarButton","pressed","content","onClick","separator","buildToolbar","swatch","remove","palette","dragging","pts","x0","x1","replayState","emitReplay","columnsOf","showBars","hasVolume","stopReplayTimer","beginReplay","replayStepBy","playReplay","speed","interval","perTick","endReplay","wasPicking","restore","cursor","nextHover","onPointerDown","endKeyOrder","sep","anchors","onPointerMove","distance","mid","lastIndex","dy","nextBelow","points","di","ds","onPointerUp","onPointerLeave","onWheel","unit","modifier","onDoubleClick","instance","announce","say","keyLines","lineTitle","onOrderKey","orderText","lines","current","pickedId","picked","page","move","keyboard","resizeObserver","refreshTheme","unwatchTheme","langObserver","applyStatic","compose","origin","view","element","computed","fullscreen","onFullscreen","initRenderer","token","exclude","symbol","wantTimer","applyOptions","nextZone","timeChanged","unfollowDefault","animateScroll","quality","visible","set","listener"],"sources":["../../../../../charts/src/engine/trading/chart.ts"],"sourcesContent":["// Trading chart: candles (or bars, lines, areas...) over a gap-free index\n// axis, indicator panes, price lines, markers, drawings and streaming.\n//\n// Layers, bottom to top: a Canvas2D background (grid, bands, watermark),\n// the GPU data canvas covering every pane (candles, volumes, indicator\n// lines, baked in device pixels), a Canvas2D overlay (axes, labels, price\n// lines, markers, drawings, crosshair) and DOM legends. The GPU items are\n// rebuilt only when the view, the scales or the data change; a tick\n// rebuilds only the items of the last bar.\n\nimport {\n luminance,\n mix,\n packColor,\n parseColor,\n toCss,\n type Rgba,\n} from \"../color\";\nimport { createDataCanvas, styleElement } from \"../dom\";\nimport { createRenderer } from \"../renderers/detect\";\nimport { followDefaultRenderer } from \"../renderers/follow\";\nimport type { ChartRenderer, RenderItem } from \"../renderers/types\";\nimport { stepDecimals } from \"../scale\";\nimport {\n readTheme,\n themeColorsChanged,\n watchTheme,\n type ChartTheme,\n} from \"../theme\";\nimport type { ChartRendererKind } from \"../types\";\nimport { localeLabels, resolveLocale } from \"../locale\";\nimport {\n anchorCount,\n drawingPrices,\n handlePoints,\n hitDrawing,\n isFillable,\n isPosition,\n moveHandle,\n paintDrawing,\n setDash,\n type Box,\n type DrawingMapper,\n} from \"./drawings\";\nimport {\n DAY,\n HOUR,\n MINUTE,\n boundaryWeight,\n detectPrecision,\n formatCountdown,\n formatCrosshairTime,\n formatFixed,\n formatPercent,\n formatVolume,\n inferTimeframe,\n isTimeZone,\n pickTicks,\n priceFormatter,\n redUpLocale,\n tickText,\n zoneOffset,\n type UtcOffset,\n} from \"./format\";\nimport {\n AreaBuffer,\n BarBuffer,\n LineBuffer,\n TrendBuffer,\n candleMetrics,\n clampRange,\n pixelRange,\n} from \"./geometry\";\nimport { heikinAshiInto, parseTimeframe, volumeProfile } from \"./indicators\";\nimport { TRADING_LABELS, fill, type TradingTexts } from \"./labels\";\nimport {\n createScale,\n fitScale,\n fromScaled,\n panScale,\n scaleTicks,\n scaledAt,\n toScaled,\n valueAt,\n yOf,\n yOfScaled,\n zoomScale,\n type PaneScale,\n} from \"./scale\";\nimport {\n appendBars as storeAppend,\n createPyramid,\n createRangePyramid,\n createStore,\n indexOfTime,\n inputLength,\n invalidateRangePyramid,\n barAt,\n prependBars as storePrepend,\n pyramidLevel,\n rangeLevel,\n readBar,\n setBars as storeSet,\n updateBar as storeUpdate,\n lowerBoundTime,\n type BarStore,\n type OhlcColumns,\n type RangePyramid,\n} from \"./store\";\nimport {\n LINE_COLORS,\n buildStudies,\n type Study,\n type StudyOutput,\n} from \"./studies\";\nimport type {\n TradingBarsInput,\n TradingChartEventMap,\n TradingChartInstance,\n TradingChartOptions,\n TradingCrosshairEvent,\n TradingDrawing,\n TradingDrawingPatch,\n TradingDrawingPoint,\n TradingDrawingTool,\n TradingLineStyle,\n TradingPriceLine,\n TradingReplayState,\n TradingScaleMode,\n TradingUndoState,\n TradingVisibleRange,\n TradingVolumeProfile,\n TradingVolumeProfileOptions,\n} from \"./types\";\n\nconst TIME_AXIS = 28;\nconst MIN_AXIS = 60;\nconst MAX_SPACING = 60;\nconst MIN_PANE = 48;\nconst PRICE = \"price\";\nconst UP = \"var(--success-color, #089981)\";\nconst DOWN = \"var(--danger-color, #f23645)\";\nconst WARNING = \"var(--warning-color, #f59e0b)\";\nconst PRIMARY = \"var(--primary-color, #2962ff)\";\nconst HISTORY_LIMIT = 100;\n\n/** Colors of the drawing toolbar */\nconst PALETTE = [\n \"#2962ff\",\n \"#089981\",\n \"#f23645\",\n \"#f59e0b\",\n \"#a855f7\",\n \"#0ea5e9\",\n \"#ec4899\",\n \"#787b86\",\n];\nconst LINE_STYLES: readonly TradingLineStyle[] = [\"solid\", \"dashed\", \"dotted\"];\n\n/**\n * Hooks used by `syncCharts` to follow another chart without echoing its\n * events back (internal: not part of the public instance)\n */\nexport const syncHooks = new WeakMap<\n TradingChartInstance,\n { setTimeRange(range: { from: number; to: number }): void }\n>();\n\nconst PRICE_LINE_TITLES: Record<string, keyof TradingTexts | undefined> = {\n order: \"limit\",\n position: \"position\",\n takeProfit: \"takeProfit\",\n stopLoss: \"stopLoss\",\n alert: \"alert\",\n};\n\nconst clamp = (v: number, lo: number, hi: number) =>\n v < lo ? lo : v > hi ? hi : v;\n\n/** Readable text on a fill (a CSS color): dark on light fills, white otherwise */\nconst textOn = (fill: string) => {\n const color = parseColor(fill);\n return color && luminance(color) > 0.5 ? \"#0b0e11\" : \"#fff\";\n};\n\nconst finite = Number.isFinite;\n\ninterface Pane {\n id: string;\n study: Study | null;\n scale: PaneScale;\n top: number;\n height: number;\n ticks: number[];\n step: number;\n}\n\n/** Bars drawn: a level of the pyramid and the groups in view */\ninterface Visible {\n /** Logical index at the left edge */\n left: number;\n level: number;\n /** Bars per group */\n size: number;\n cols: OhlcColumns;\n /** Groups drawn (one extra on each side) */\n g0: number;\n g1: number;\n /** Groups whose center is in the plot */\n s0: number;\n s1: number;\n /** Last group */\n last: number;\n}\n\ninterface LegendRow {\n row: HTMLDivElement;\n values: HTMLSpanElement[];\n button: HTMLButtonElement | null;\n}\n\ntype Layer = (ga: number, gb: number, live: boolean) => RenderItem[];\n\n/** Interaction in progress */\ntype Gesture =\n | {\n kind: \"pan\";\n x: number;\n y: number;\n right: number;\n pane: Pane | null;\n moved: boolean;\n lastX: number;\n lastY: number;\n lastT: number;\n velocity: number;\n }\n | { kind: \"axisY\"; pane: Pane; y: number; min: number; max: number }\n | { kind: \"axisX\"; x: number; spacing: number }\n | {\n kind: \"separator\";\n index: number;\n y: number;\n above: number;\n below: number;\n }\n | { kind: \"order\"; line: TradingPriceLine; startPrice: number }\n | {\n kind: \"drawing\";\n id: string;\n pane: Pane;\n handle: number;\n x: number;\n y: number;\n original: TradingDrawing;\n moved: boolean;\n }\n | { kind: \"create\"; pane: Pane; x: number; y: number; moved: boolean }\n | { kind: \"button\"; action: () => void };\n\n/** Mounts a trading chart in `container` (which should have a height) */\n/** Keys of the keyboard order entry (`aria-keyshortcuts`) */\nconst ORDER_KEYS =\n \"B S O Shift+O ArrowUp ArrowDown Shift+ArrowUp Shift+ArrowDown Enter Escape Delete\";\n\n/** Legend items cut with an ellipsis when wider than the legend */\nconst ELLIPSIS: Partial<CSSStyleDeclaration> = {\n minWidth: \"0\",\n maxWidth: \"100%\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n};\n/** A name and its value in the OHLC legend, never split by the wrapping */\nconst PAIR =\n \"display:inline-flex;gap:3px;max-width:100%;overflow:hidden;text-overflow:ellipsis\";\n\nexport const createTradingChart = (\n container: HTMLElement,\n initial: TradingChartOptions = {},\n): TradingChartInstance => {\n const doc = container.ownerDocument;\n const win = doc.defaultView;\n let options: TradingChartOptions = { ...initial };\n let destroyed = false;\n\n // ------------------------------------------------------------------ DOM\n\n const make = <K extends keyof HTMLElementTagNameMap>(\n tag: K,\n style: Partial<CSSStyleDeclaration>,\n ) => styleElement(doc.createElement(tag), style) as HTMLElementTagNameMap[K];\n\n const root = make(\"div\", {\n position: \"relative\",\n width: \"100%\",\n height: \"100%\",\n minHeight: \"0\",\n overflow: \"hidden\",\n outline: \"none\",\n userSelect: \"none\",\n touchAction: \"pan-y\",\n fontFamily: \"var(--font-family-sans, system-ui, sans-serif)\",\n color: \"var(--text-color, #1f2937)\",\n cursor: \"crosshair\",\n });\n root.className = \"minerva-trading-chart\";\n root.tabIndex = 0;\n root.setAttribute(\"role\", \"figure\");\n root.setAttribute(\"aria-roledescription\", \"chart\");\n\n const layer = (tag: \"canvas\" | \"div\") =>\n make(tag, {\n position: \"absolute\",\n left: \"0\",\n top: \"0\",\n pointerEvents: \"none\",\n });\n const background = layer(\"canvas\") as HTMLCanvasElement;\n const foreground = layer(\"canvas\") as HTMLCanvasElement;\n background.setAttribute(\"aria-hidden\", \"true\");\n foreground.setAttribute(\"aria-hidden\", \"true\");\n const legends = layer(\"div\") as HTMLDivElement;\n legends.style.right = \"0\";\n legends.style.bottom = \"0\";\n const jump = make(\"button\", {\n position: \"absolute\",\n display: \"none\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"28px\",\n height: \"28px\",\n padding: \"0\",\n borderRadius: \"50%\",\n border:\n \"1px solid color-mix(in srgb, var(--border-color, #e5e7eb) 80%, transparent)\",\n background: \"var(--surface-elevated-color, var(--surface-color, #fff))\",\n color: \"var(--text-color, #1f2937)\",\n boxShadow: \"0 4px 14px -4px rgba(15, 23, 42, 0.25)\",\n cursor: \"pointer\",\n });\n jump.type = \"button\";\n jump.innerHTML =\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M3 3l5 5-5 5M9 3l5 5-5 5\"/></svg>';\n const live = make(\"div\", {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n overflow: \"hidden\",\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n whiteSpace: \"nowrap\",\n });\n live.setAttribute(\"aria-live\", \"polite\");\n // floating toolbar of the selected drawing, and the editor of text drawings\n const toolbar = make(\"div\", {\n position: \"absolute\",\n display: \"none\",\n alignItems: \"center\",\n gap: \"1px\",\n padding: \"3px\",\n borderRadius: \"8px\",\n border:\n \"1px solid color-mix(in srgb, var(--border-color, #e5e7eb) 85%, transparent)\",\n background: \"var(--surface-elevated-color, var(--surface-color, #fff))\",\n boxShadow: \"0 8px 24px -8px rgba(15, 23, 42, 0.35)\",\n zIndex: \"2\",\n cursor: \"default\",\n });\n toolbar.className = \"minerva-trading-toolbar\";\n toolbar.setAttribute(\"role\", \"toolbar\");\n const editor = make(\"textarea\", {\n position: \"absolute\",\n display: \"none\",\n minWidth: \"120px\",\n minHeight: \"28px\",\n padding: \"5px 9px\",\n resize: \"none\",\n border: \"1px solid var(--primary-color, #2962ff)\",\n borderRadius: \"5px\",\n outline: \"none\",\n background: \"var(--surface-elevated-color, var(--surface-color, #fff))\",\n color: \"var(--text-color, #1f2937)\",\n font: \"500 13px var(--font-family-sans, system-ui, sans-serif)\",\n boxShadow: \"0 6px 18px -6px rgba(15, 23, 42, 0.3)\",\n zIndex: \"3\",\n });\n editor.rows = 1;\n const sheet = make(\"style\", {});\n sheet.textContent = `.minerva-trading-toolbar button{all:unset;box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;min-width:26px;height:26px;padding:0 5px;border-radius:5px;cursor:pointer;color:var(--text-color,#1f2937)}.minerva-trading-toolbar button:hover{background:color-mix(in srgb,var(--text-color,#1f2937) 9%,transparent)}.minerva-trading-toolbar button:focus-visible{box-shadow:inset 0 0 0 2px var(--primary-color,#2962ff)}.minerva-trading-toolbar button[aria-pressed=\"true\"]{background:color-mix(in srgb,var(--primary-color,#2962ff) 16%,transparent);color:var(--primary-color,#2962ff)}.minerva-trading-toolbar .sep{width:1px;height:18px;margin:0 3px;background:var(--border-color,#e5e7eb)}`;\n root.append(\n sheet,\n background,\n foreground,\n legends,\n jump,\n toolbar,\n editor,\n live,\n );\n container.appendChild(root);\n\n // ----------------------------------------------------------------- data\n\n const store = createStore();\n let pyramid = createPyramid();\n /** Heikin-Ashi bars (time and volume shared with the store) */\n const ha: OhlcColumns = {\n time: store.time,\n open: new Float64Array(0),\n high: new Float64Array(0),\n low: new Float64Array(0),\n close: new Float64Array(0),\n volume: store.volume,\n };\n let haValid = 0;\n let haPyramid = createPyramid();\n let studies: Study[] = [];\n const studyValid = new Map<Study, number>();\n const visibility = new Map<string, boolean>();\n interface CompareRuntime {\n id: string;\n name: string;\n color: string;\n width: number;\n times: Float64Array;\n data: Float64Array;\n values: Float64Array;\n valid: number;\n lod: RangePyramid;\n }\n let compares: CompareRuntime[] = [];\n /** Min / max pyramids of the indicator outputs (zoomed-out decimation) */\n const outputLods = new WeakMap<StudyOutput, RangePyramid>();\n /** Min / max pyramids of the trend lines (SuperTrend) */\n const trendLods = new WeakMap<Study, RangePyramid>();\n /** Changes when bars other than the last one change */\n let dataVersion = 0;\n /** Changes when the last bar changes */\n let tailVersion = 0;\n let detectedPrecision = 2;\n let inferredTimeframe = DAY;\n\n // ----------------------------------------------------------------- view\n\n let spacing = options.barSpacing ?? 8;\n let right = NaN;\n let plotW = 0;\n let plotH = 0;\n let axisW = MIN_AXIS;\n let width = 0;\n let height = 0;\n let panes: Pane[] = [];\n const scales = new Map<string, PaneScale>();\n const paneHeights = new Map<string, number>();\n let vis: Visible | null = null;\n let volumeOverlayMax = 0;\n\n // -------------------------------------------------------------- state\n\n let theme: ChartTheme = readTheme(root);\n let themeVersion = 0;\n let optionsVersion = 0;\n let renderer: ChartRenderer | null = null;\n let rendererToken = 0;\n let frameId = 0;\n let layers: { fn: Layer; main: RenderItem[]; live: RenderItem[] }[] = [];\n let geomKey = \"\";\n let builtTail = -1;\n let itemVersion = 0;\n let resolveReady!: (kind: ChartRendererKind | null) => void;\n const ready = new Promise<ChartRendererKind | null>((resolve) => {\n resolveReady = resolve;\n });\n\n let pointer: { x: number; y: number } | null = null;\n let keyboardIndex: number | null = null;\n /**\n * Keyboard order entry: an order armed with B / S, or a price line picked\n * with O (its preview price lives in `lineOverrides`, like a drag)\n */\n let keyOrder:\n | { kind: \"create\"; side: \"buy\" | \"sell\"; price: number }\n | { kind: \"move\"; id: string; start: number; override?: number }\n | null = null;\n let gesture: Gesture | null = null;\n const touches = new Map<number, { x: number; y: number }>();\n let pinch: { distance: number; spacing: number } | null = null;\n let kinetic: { v: number; t: number } | null = null;\n let scrollAnim: { from: number; to: number; start: number } | null = null;\n /** Range asked by `setVisibleRange` / `fitContent`, applied once the plot width is known */\n let pendingRange: { from: number; to: number } | null = null;\n\n let drawings: readonly TradingDrawing[] = options.drawings ?? [];\n let emittedDrawings: readonly TradingDrawing[] | null = null;\n /** Drawings of the last commit: the base of the undo history */\n let committed: readonly TradingDrawing[] = drawings;\n const undoStack: (readonly TradingDrawing[])[] = [];\n const redoStack: (readonly TradingDrawing[])[] = [];\n let undoKey = \"false|false\";\n let tool: TradingDrawingTool = options.drawingMode ?? \"cursor\";\n let selected: string | null = null;\n let hovered: string | null = null;\n let draft: TradingDrawing | null = null;\n /** Clicks still needed by the drawing being made (three-anchor tools) */\n let draftClicks = 0;\n let draftPane: string = PRICE;\n let drawingCounter = 0;\n /** Text boxes measured when painted (hit tests of text drawings) */\n const textBoxes = new Map<string, Box>();\n /** Drawing whose text is being edited */\n let editing: { id: string; created: boolean } | null = null;\n let toolbarKey = \"\";\n let paletteOpen = false;\n const lineOverrides = new Map<string, number>();\n let hoveredLine: string | null = null;\n /** Clickable areas painted on the canvas (close buttons, order entry) */\n let canvasButtons: {\n x: number;\n y: number;\n w: number;\n h: number;\n action: () => void;\n }[] = [];\n let hoveredButton = -1;\n let lastRange: TradingVisibleRange | null = null;\n /** The next view change comes from a synchronized chart: not reported */\n let silentRange = false;\n /** Crosshair set by `setCrosshair` (synchronized charts) */\n let externalCross: { time: number; price: number } | null = null;\n let lastCrosshair = \"\";\n let historyFirst = NaN;\n let countdownTimer: ReturnType<typeof setInterval> | null = null;\n /** Bar replay: the full history, and the bars shown so far */\n let replay: {\n source: BarStore;\n playing: boolean;\n speed: number;\n timer: ReturnType<typeof setInterval> | null;\n } | null = null;\n let replayPicking = false;\n let replaySpeed = 4;\n let profile: { key: string; result: TradingVolumeProfile } | null = null;\n\n // ---------------------------------------------------------- listeners\n\n const listeners = new Map<string, Set<(event: never) => void>>();\n const emit = <K extends keyof TradingChartEventMap>(\n type: K,\n event: TradingChartEventMap[K],\n ) => {\n listeners\n .get(type)\n ?.forEach((fn) => (fn as (e: TradingChartEventMap[K]) => void)(event));\n };\n\n // ------------------------------------------------------------- helpers\n\n // locale and texts, resolved at each options update (and `<html lang>` change)\n let locale = resolveLocale(options.locale);\n let texts = localeLabels(TRADING_LABELS, locale, options.labels);\n const resolveTexts = () => {\n locale = resolveLocale(options.locale);\n texts = localeLabels(TRADING_LABELS, locale, options.labels);\n };\n const labels = () => texts;\n const n = () => store.length;\n const style = () => options.chartStyle ?? \"candles\";\n const redUp = () =>\n options.colorConvention === \"redUp\" ||\n (options.colorConvention === \"auto\" && redUpLocale(locale));\n const upCss = () => options.upColor ?? (redUp() ? DOWN : UP);\n const downCss = () => options.downColor ?? (redUp() ? UP : DOWN);\n const resolve = (css: string, fallback: Rgba = theme.primary): Rgba =>\n theme.resolve ? theme.resolve(css, fallback) : fallback;\n const css = (value: string, alpha = 1) => toCss(resolve(value), alpha);\n const precision = () => options.precision ?? detectedPrecision;\n let priceFormat = priceFormatter(2, undefined);\n let priceFormatKey = \"\";\n const formatPrice = (value: number) => {\n if (options.formatPrice) return options.formatPrice(value);\n const key = `${precision()}|${locale}`;\n if (key !== priceFormatKey) {\n priceFormat = priceFormatter(precision(), locale);\n priceFormatKey = key;\n }\n return priceFormat(value);\n };\n const timeframe = () => {\n const parsed =\n options.timeframe !== undefined\n ? parseTimeframe(options.timeframe)\n : null;\n return (\n parsed ?? {\n unit: \"ms\" as const,\n count: inferredTimeframe,\n ms: inferredTimeframe,\n }\n );\n };\n const tfMs = () => timeframe().ms;\n const font = (size: number, weight = 400) =>\n `${weight} ${size}px ${theme.fontFamily}`;\n\n const isVisible = (study: Study) =>\n visibility.get(study.id) ?? study.config.visible ?? true;\n\n const xOf = (index: number) => plotW + (index - right) * spacing;\n const indexAt = (x: number) => right - (plotW - x) / spacing;\n\n /** Time of a logical index (extrapolated outside the bars) */\n const timeAt = (index: number) => {\n const count = n();\n if (!count) return 0;\n const i = Math.round(index);\n if (i < 0) return store.time[0] + i * tfMs();\n if (i >= count) return store.time[count - 1] + (i - count + 1) * tfMs();\n return store.time[i];\n };\n\n /** Time of a fractional index, interpolated between the bars */\n const timeAtFrac = (index: number) => {\n const count = n();\n if (!count) return 0;\n const i = Math.floor(index);\n if (i < 0 || i >= count - 1) {\n const edge = i < 0 ? 0 : count - 1;\n return store.time[edge] + (index - edge) * tfMs();\n }\n const t = index - i;\n return store.time[i] + t * (store.time[i + 1] - store.time[i]);\n };\n\n /** Fractional index of a time (the inverse of `timeAtFrac`) */\n const indexAtTimeFrac = (time: number) => {\n const count = n();\n if (!count) return 0;\n if (time >= store.time[count - 1])\n return count - 1 + (time - store.time[count - 1]) / tfMs();\n if (time <= store.time[0]) return (time - store.time[0]) / tfMs();\n const i = indexOfTime(store.time, count, time);\n const span = store.time[i + 1] - store.time[i];\n return i + (span > 0 ? (time - store.time[i]) / span : 0);\n };\n\n // displayed time: a fixed offset, a time zone or the local time\n let zone: string | undefined;\n const offsetMinutes = (time: number) =>\n options.utcOffset ??\n (zone\n ? zoneOffset(time, zone)\n : -new Date(finite(time) ? time : 0).getTimezoneOffset());\n const studyOffset: UtcOffset = (time) => offsetMinutes(time);\n /** Time shifted so that the UTC getters read the displayed time */\n const shift = (time: number) => time + offsetMinutes(time) * MINUTE;\n\n /** CSS color of a study color: `up` / `down` stand for the bar colors */\n const colorOf = (color: string) =>\n color === \"up\" ? upCss() : color === \"down\" ? downCss() : color;\n\n /** Min / max / last of each visible group of a column of values */\n const groupRanges = (\n v: Visible,\n values: Float64Array,\n lod: RangePyramid,\n ): {\n min: ArrayLike<number>;\n max: ArrayLike<number>;\n last: ArrayLike<number>;\n } => {\n if (!v.level) return { min: values, max: values, last: values };\n const level = rangeLevel(lod, values, n(), v.level);\n return level;\n };\n const trendLodOf = (study: Study) => {\n let lod = trendLods.get(study);\n if (!lod) trendLods.set(study, (lod = createRangePyramid()));\n return lod;\n };\n const lodOf = (out: StudyOutput) => {\n let lod = outputLods.get(out);\n if (!lod) outputLods.set(out, (lod = createRangePyramid()));\n return lod;\n };\n\n /** Logical index of a time (extrapolated outside the bars) */\n const indexOfTimeExt = (time: number) => {\n const count = n();\n if (!count) return 0;\n const last = store.time[count - 1];\n if (time > last) return count - 1 + (time - last) / tfMs();\n if (time < store.time[0]) return (time - store.time[0]) / tfMs();\n return indexOfTime(store.time, count, time);\n };\n\n /** Bars as drawn: Heikin-Ashi or the store */\n const display = (): OhlcColumns => (style() === \"heikinAshi\" ? ha : store);\n\n // ------------------------------------------------------- derived data\n\n const markDirty = (from: number) => {\n for (const study of studies) {\n studyValid.set(study, Math.min(studyValid.get(study) ?? 0, from));\n for (const out of study.outputs) {\n const lod = outputLods.get(out);\n if (lod) invalidateRangePyramid(lod, from);\n }\n const trendLod = trendLods.get(study);\n if (trendLod) invalidateRangePyramid(trendLod, from);\n }\n haValid = Math.min(haValid, from);\n for (const c of compares) {\n c.valid = Math.min(c.valid, from);\n invalidateRangePyramid(c.lod, from);\n }\n profile = null;\n const level = (p: typeof pyramid) => {\n for (const l of p.levels)\n if (l) l.valid = Math.min(l.valid, Math.floor(from / l.size));\n };\n level(pyramid);\n level(haPyramid);\n };\n\n const syncDerived = () => {\n const count = n();\n for (const study of studies) {\n const valid = studyValid.get(study) ?? 0;\n if (valid < count) {\n study.compute(store, valid);\n studyValid.set(study, count);\n }\n }\n ha.time = store.time;\n ha.volume = store.volume;\n if (style() === \"heikinAshi\" && haValid < count) {\n if (ha.open.length < store.capacity) {\n for (const key of [\"open\", \"high\", \"low\", \"close\"] as const) {\n const next = new Float64Array(store.capacity);\n next.set(ha[key].subarray(0, haValid));\n ha[key] = next;\n }\n }\n heikinAshiInto(\n store.open,\n store.high,\n store.low,\n store.close,\n count,\n ha,\n haValid,\n );\n haValid = count;\n }\n for (const c of compares) {\n if (c.valid >= count) continue;\n if (c.values.length < store.capacity) {\n const next = new Float64Array(store.capacity).fill(NaN);\n next.set(c.values.subarray(0, c.valid));\n c.values = next;\n }\n for (let i = c.valid; i < count; i++) {\n const j =\n lowerBoundTime(c.times, c.times.length, store.time[i] + 0.5) - 1;\n c.values[i] = j >= 0 ? c.data[j] : NaN;\n }\n c.valid = count;\n }\n };\n\n const afterDataChange = (from: number) => {\n markDirty(from);\n const count = n();\n if (from < count - 1) dataVersion++;\n tailVersion++;\n if (count) {\n detectedPrecision = Math.max(\n from === 0 ? 0 : detectedPrecision,\n detectPrecision(store.close, from, count),\n detectPrecision(store.open, Math.max(from, count - 50), count),\n );\n if (from === 0 || count < 80)\n inferredTimeframe = inferTimeframe(store.time, count);\n }\n invalidate();\n };\n\n const rebuildStudies = () => {\n const { studies: next, reused } = buildStudies(\n options.indicators ?? [],\n studies,\n studyOffset,\n );\n for (const study of studies)\n if (!reused.has(study)) studyValid.delete(study);\n for (const study of next) if (!reused.has(study)) studyValid.set(study, 0);\n studies = next;\n // drop the user's toggles of indicators whose visibility is now set\n for (const id of [...visibility.keys()])\n if (!studies.some((s) => s.id === id)) visibility.delete(id);\n };\n\n const rebuildCompares = () => {\n compares = (options.compare ?? []).map((series, i) => {\n const data = [...series.data].sort((a, b) => a.time - b.time);\n return {\n id: series.id ?? series.name,\n name: series.name,\n color: series.color ?? LINE_COLORS[(i + 2) % LINE_COLORS.length],\n width: series.lineWidth ?? 1.5,\n times: Float64Array.from(data, (d) => d.time),\n data: Float64Array.from(data, (d) => d.value),\n values: new Float64Array(0),\n valid: 0,\n lod: createRangePyramid(),\n };\n });\n };\n\n // ---------------------------------------------------------- bars input\n\n /** Last bar visible: new bars keep the view at the latest bar */\n const followsRealtime = () => {\n const count = n();\n if (!count || !finite(right)) return true;\n const x = xOf(count - 1);\n return x >= 0 && x <= plotW + spacing * 0.5;\n };\n\n const replaceBars = (bars: TradingBarsInput) => {\n storeSet(store, bars);\n pyramid = createPyramid();\n haPyramid = createPyramid();\n haValid = 0;\n historyFirst = NaN;\n for (const scale of scales.values()) scale.auto = true;\n right = n() - 1 + (options.rightOffset ?? 8);\n kinetic = null;\n scrollAnim = null;\n afterDataChange(0);\n };\n\n /**\n * New `bars` option: streamed (same first bars plus newer ones),\n * prepended history (same last bar), or replaced\n */\n const applyBarsOption = (bars: TradingBarsInput) => {\n const count = n();\n const length = inputLength(bars);\n if (count >= 2 && length >= count) {\n const first = barAt(bars, 0).time;\n const last = store.time[count - 1];\n if (\n first === store.time[0] &&\n barAt(bars, count - 2).time === store.time[count - 2]\n ) {\n // streaming through the props: update the last bar, append the rest\n const follow = followsRealtime();\n const before = count;\n let from = count;\n for (let i = count - 1; i < length; i++) {\n const at = storeUpdate(store, barAt(bars, i));\n if (at >= 0) from = Math.min(from, at);\n }\n if (follow) right += n() - before;\n if (from < n()) afterDataChange(from);\n return;\n }\n if (barAt(bars, length - 1).time === last && length > count) {\n const added = length - count;\n storeSet(store, bars);\n pyramid = createPyramid();\n haPyramid = createPyramid();\n haValid = 0;\n right += added;\n afterDataChange(0);\n return;\n }\n }\n replaceBars(bars);\n };\n\n // --------------------------------------------------------------- layout\n\n const layoutPanes = () => {\n const paneStudies = studies.filter((s) => !s.overlay);\n const available = plotH;\n const wanted = paneStudies.map((s) => paneHeights.get(s.id) ?? s.height);\n const total = wanted.reduce((a, b) => a + b, 0);\n const max = Math.max(0, available * 0.62);\n const k = total > max && total > 0 ? max / total : 1;\n const heights = wanted.map((h) =>\n Math.max(MIN_PANE * Math.min(1, k * 2), h * k),\n );\n const priceHeight = Math.max(\n 40,\n available - heights.reduce((a, b) => a + b, 0),\n );\n const next: Pane[] = [];\n const scaleOf = (id: string, mode: TradingScaleMode) => {\n let scale = scales.get(id);\n if (!scale) {\n scale = createScale(mode);\n scales.set(id, scale);\n }\n if (scale.mode !== mode) {\n scale.mode = mode;\n scale.auto = true;\n }\n return scale;\n };\n const price = scaleOf(PRICE, options.scaleMode ?? \"linear\");\n price.top = 0;\n price.height = priceHeight;\n price.marginTop = 0.1;\n price.marginBottom = 0.08;\n next.push({\n id: PRICE,\n study: null,\n scale: price,\n top: 0,\n height: priceHeight,\n ticks: [],\n step: 0,\n });\n let top = priceHeight;\n paneStudies.forEach((study, i) => {\n const scale = scaleOf(study.id, \"linear\");\n scale.top = top;\n scale.height = heights[i];\n scale.marginTop = study.type === \"volume\" ? 0.18 : 0.14;\n scale.marginBottom = study.type === \"volume\" ? 0 : 0.1;\n if (study.range) scale.marginTop = scale.marginBottom = 0.06;\n next.push({\n id: study.id,\n study,\n scale,\n top,\n height: heights[i],\n ticks: [],\n step: 0,\n });\n top += heights[i];\n });\n for (const id of [...scales.keys()])\n if (!next.some((p) => p.id === id)) scales.delete(id);\n panes = next;\n };\n\n const paneAt = (y: number) =>\n panes.find((p) => y >= p.top && y < p.top + p.height) ?? null;\n\n const clampView = () => {\n const count = n();\n const minSpacing = Math.min(1, (plotW * 0.8) / Math.max(1, count));\n spacing = clamp(spacing, Math.max(1e-4, minSpacing), MAX_SPACING);\n const bars = plotW / spacing;\n if (!finite(right)) right = count - 1 + (options.rightOffset ?? 8);\n const hi =\n Math.max(0, count - 1) + Math.max(options.rightOffset ?? 8, bars * 0.75);\n const lo = Math.min(bars * 0.25, hi);\n right = clamp(right, lo, hi);\n };\n\n const computeVisible = (): Visible | null => {\n const count = n();\n if (!count) return null;\n const left = right - plotW / spacing;\n const level = spacing >= 2 ? 0 : Math.ceil(Math.log2(2 / spacing));\n const size = 2 ** level;\n const src = display();\n const cols = level\n ? pyramidLevel(\n style() === \"heikinAshi\" ? haPyramid : pyramid,\n src,\n count,\n level,\n )\n : src;\n const last = Math.floor((count - 1) / size);\n const i0 = clamp(Math.floor(left) - 1, 0, count - 1);\n const i1 = clamp(Math.ceil(right) + 1, 0, count - 1);\n const r0 = clamp(Math.ceil(left - 0.5), 0, count - 1);\n const r1 = clamp(Math.floor(right + 0.5), 0, count - 1);\n return {\n left,\n level,\n size,\n cols,\n g0: Math.floor(i0 / size),\n g1: Math.floor(i1 / size),\n s0: Math.floor(r0 / size),\n s1: Math.floor(r1 / size),\n last,\n };\n };\n\n /** Center index of a group */\n const groupCenter = (v: Visible, g: number) => g * v.size + (v.size - 1) / 2;\n const groupBars = (v: Visible, g: number) =>\n Math.min(v.size, n() - g * v.size);\n\n /** First visible bar: the base of the percent scale and of the baseline */\n const firstVisibleIndex = () =>\n clamp(Math.ceil(right - plotW / spacing - 0.5), 0, Math.max(0, n() - 1));\n\n const compareBase = (c: CompareRuntime) => {\n const count = n();\n for (let i = firstVisibleIndex(); i < count; i++) {\n const v = c.values[i];\n if (finite(v) && v !== 0) return v;\n }\n return NaN;\n };\n\n /** Scaled value of a comparison series (percent: from its own base) */\n const compareScaled = (scale: PaneScale, value: number, base: number) =>\n scale.mode === \"percent\"\n ? (value / base - 1) * 100\n : toScaled(scale, value);\n\n const baselinePrice = () =>\n options.baselinePrice ?? display().close[firstVisibleIndex()];\n\n /** Extends `[lo, hi]` with the visible groups of an output (shift included) */\n const outputExtent = (\n v: Visible,\n values: Float64Array,\n lod: RangePyramid,\n shiftBars: number,\n range: [number, number],\n ) => {\n const r = groupRanges(v, values, lod);\n const offset = Math.round(shiftBars / v.size);\n const a = clamp(v.s0 - offset, 0, v.last);\n const b = clamp(v.s1 - offset, 0, v.last);\n for (let g = a; g <= b; g++) {\n if (r.min[g] < range[0]) range[0] = r.min[g];\n if (r.max[g] > range[1]) range[1] = r.max[g];\n }\n };\n\n /**\n * Extends `[lo, hi]` with the visible drawings of a pane\n * (`autoscaleIncludesDrawings`); a drawing being dragged counts where it\n * started, so the scale does not move under the pointer\n */\n const drawingsExtent = (paneId: string, range: [number, number]) => {\n if (!options.autoscaleIncludesDrawings || !drawings.length) return;\n const from = right - plotW / spacing;\n const dragged = gesture?.kind === \"drawing\" ? gesture : null;\n for (const drawing of drawings) {\n if ((drawing.pane ?? PRICE) !== paneId) continue;\n const d =\n dragged && dragged.id === drawing.id ? dragged.original : drawing;\n for (const price of drawingPrices(d, indexOfTimeExt, from, right)) {\n if (price < range[0]) range[0] = price;\n if (price > range[1]) range[1] = price;\n }\n }\n };\n\n const autoscale = (v: Visible | null) => {\n volumeOverlayMax = 0;\n for (const pane of panes) {\n const scale = pane.scale;\n if (!v) continue;\n if (pane.id === PRICE) {\n scale.base = store.close[firstVisibleIndex()] || 1;\n const { cols } = v;\n const s = style();\n const closeOnly = s === \"line\" || s === \"area\" || s === \"baseline\";\n const range: [number, number] = [Infinity, -Infinity];\n for (let g = v.s0; g <= v.s1; g++) {\n const l = closeOnly ? cols.close[g] : cols.low[g];\n const h = closeOnly ? cols.close[g] : cols.high[g];\n if (l < range[0]) range[0] = l;\n if (h > range[1]) range[1] = h;\n }\n for (const study of studies) {\n if (!study.overlay || !isVisible(study)) continue;\n if (study.type === \"volume\") {\n for (let g = v.s0; g <= v.s1; g++) {\n const vol = cols.volume[g] / groupBars(v, g);\n if (vol > volumeOverlayMax) volumeOverlayMax = vol;\n }\n continue;\n }\n for (const out of study.outputs)\n outputExtent(v, out.values, lodOf(out), out.shift, range);\n }\n drawingsExtent(PRICE, range);\n let [lo, hi] = range;\n if (s === \"baseline\") {\n const b = baselinePrice();\n if (b < lo) lo = b;\n if (b > hi) hi = b;\n }\n if (!scale.auto) continue;\n let a = toScaled(scale, lo);\n let b = toScaled(scale, hi);\n if (scale.mode === \"log\" && !(lo > 0))\n a = toScaled(scale, Math.max(hi * 1e-3, 1e-12));\n for (const c of compares) {\n const base = compareBase(c);\n const extent: [number, number] = [Infinity, -Infinity];\n outputExtent(v, c.values, c.lod, 0, extent);\n for (const value of extent) {\n const scaled = compareScaled(scale, value, base);\n if (scaled < a) a = scaled;\n if (scaled > b) b = scaled;\n }\n }\n if (scale.mode === \"percent\" && compares.length) {\n // the 0% line of a comparison stays in view\n a = Math.min(a, 0);\n b = Math.max(b, 0);\n }\n fitScale(scale, a, b);\n continue;\n }\n const study = pane.study;\n if (!study || !scale.auto) continue;\n if (study.range) {\n fitScale(scale, study.range[0], study.range[1]);\n continue;\n }\n const range: [number, number] = [Infinity, -Infinity];\n if (study.type === \"volume\") range[0] = 0;\n for (const out of study.outputs) {\n if (out.kind === \"volume\") {\n for (let g = v.s0; g <= v.s1; g++) {\n const value = v.cols.volume[g] / groupBars(v, g);\n if (value > range[1]) range[1] = value;\n }\n continue;\n }\n outputExtent(v, out.values, lodOf(out), out.shift, range);\n }\n drawingsExtent(pane.id, range);\n let [lo, hi] = range;\n if (study.bands && finite(lo) && finite(hi)) {\n // reference bands (CCI ±100, DMI 25) stay in view\n for (const band of study.bands) {\n lo = Math.min(lo, band);\n hi = Math.max(hi, band);\n }\n }\n if (study.zero && finite(lo) && finite(hi)) {\n lo = Math.min(lo, 0);\n hi = Math.max(hi, 0);\n }\n fitScale(scale, lo, hi);\n }\n };\n\n // ----------------------------------------------------------------- ticks\n\n interface TimeLabel {\n x: number;\n text: string;\n bold: boolean;\n }\n\n const timeTicks = (\n v: Visible | null,\n ctx: CanvasRenderingContext2D,\n ): TimeLabel[] => {\n const count = n();\n if (!count || !v) return [];\n const tf = tfMs();\n const intraday = tf < DAY;\n // groups up to the right edge, past the last bar too\n const gEnd = Math.floor(Math.max(0, Math.ceil(right)) / v.size);\n const groupTime = (g: number) => {\n if (g <= v.last) return v.cols.time[g];\n return store.time[count - 1] + (g * v.size - (count - 1)) * tf;\n };\n const candidates: { x: number; weight: number; time: number }[] = [];\n let prev = v.g0 > 0 ? shift(groupTime(v.g0 - 1)) : NaN;\n for (let g = v.g0; g <= gEnd; g++) {\n const time = shift(groupTime(g));\n const x = xOf(groupCenter(v, g));\n const weight = boundaryWeight(prev, time);\n // no labels inside a second (tick charts)\n if (x >= -20 && x <= plotW + 20 && weight > 10)\n candidates.push({ x, weight, time });\n prev = time;\n }\n ctx.font = font(theme.fontSize);\n const sample = intraday ? \"00:00\" : \"Sep 30\";\n const gap =\n Math.max(ctx.measureText(sample).width, ctx.measureText(\"2024\").width) +\n 34;\n return pickTicks(candidates, gap)\n .filter((t) => t.x > 8 && t.x < plotW - 8)\n .map((t) => ({\n x: t.x,\n text: tickText(t.time, t.weight, locale, intraday),\n bold: t.weight >= (intraday ? 50 : 60),\n }));\n };\n\n const paneTickText = (pane: Pane, scaled: number) => {\n if (pane.id === PRICE) {\n if (pane.scale.mode === \"percent\")\n return formatPercent(\n scaled,\n locale,\n Math.min(2, stepDecimals(pane.step)),\n );\n return formatPrice(fromScaled(pane.scale, scaled));\n }\n if (pane.study?.compact) return formatVolume(scaled, locale);\n return formatFixed(scaled, Math.min(4, stepDecimals(pane.step)), locale);\n };\n\n /** Text of a value of a study in the legend */\n const studyValueText = (study: Study, value: number) => {\n if (study.overlay && study.type !== \"volume\") return formatPrice(value);\n if (study.compact) return formatVolume(value, locale);\n return formatFixed(\n value,\n study.range ? 2 : Math.max(2, Math.min(6, precision())),\n locale,\n );\n };\n\n // ------------------------------------------------------------ GPU items\n\n const createLayers = (v: Visible, dpr: number): Layer[] => {\n const result: Layer[] = [];\n const cols = v.cols;\n const up = resolve(upCss());\n const down = resolve(downCss());\n const upP = packColor(up);\n const downP = packColor(down);\n const bg = theme.background;\n const metrics = candleMetrics(spacing * v.size * dpr, dpr);\n const X = (g: number) => xOf(groupCenter(v, g)) * dpr;\n const s = style();\n\n const histogramHalf = Math.max(0.5, metrics.body / 2);\n const volumeColors = {\n up: packColor([up[0], up[1], up[2], 0.5]),\n down: packColor([down[0], down[1], down[2], 0.5]),\n };\n\n for (const pane of panes) {\n const top = pane.top * dpr;\n const bottom = (pane.top + pane.height) * dpr;\n const scale = pane.scale;\n const Y = (value: number) => yOf(scale, value) * dpr;\n\n const lineLayer =\n (\n values: (g: number) => number,\n color: Rgba,\n lineWidth: number,\n toY: (value: number) => number = Y,\n ): Layer =>\n (ga, gb, isLive) => {\n const buffer = new LineBuffer(top, bottom);\n for (let g = isLive ? Math.max(v.g0, ga - 1) : ga; g <= gb; g++)\n buffer.push(X(g), toY(values(g)));\n return buffer.count > 1 ? [buffer.item(\"\", 0, color, lineWidth)] : [];\n };\n\n /**\n * Line of a column of values: one point per bar, or the low and high\n * of each group once zoomed out (min / max decimation), drawn\n * `shiftBars` later\n */\n const rangeLayer =\n (\n values: Float64Array,\n lod: RangePyramid,\n color: Rgba,\n lineWidth: number,\n shiftBars = 0,\n toY: (value: number) => number = Y,\n ): Layer =>\n (ga, gb, isLive) => {\n const r = groupRanges(v, values, lod);\n const dx = shiftBars * spacing * dpr;\n const extra = Math.ceil(Math.abs(shiftBars) / v.size) + 1;\n let from = isLive ? Math.max(0, ga - 1) : ga;\n let to = gb;\n if (!isLive && shiftBars > 0) from = Math.max(0, from - extra);\n if (!isLive && shiftBars < 0) to = Math.min(v.last - 1, to + extra);\n const buffer = new LineBuffer(top, bottom);\n let prevY = NaN;\n for (let g = from; g <= to; g++) {\n const x = X(g) + dx;\n const lo = r.min[g];\n const hi = r.max[g];\n if (!v.level || lo === hi || !finite(lo) || !finite(hi)) {\n prevY = toY(r.last[g]);\n buffer.push(x, prevY);\n continue;\n }\n const yLo = toY(lo);\n const yHi = toY(hi);\n // start with the extreme closest to the previous point\n const first =\n finite(prevY) && Math.abs(prevY - yHi) < Math.abs(prevY - yLo)\n ? yHi\n : yLo;\n const second = first === yHi ? yLo : yHi;\n buffer.push(x, first);\n buffer.push(x, second);\n prevY = second;\n }\n return buffer.count > 1 ? [buffer.item(\"\", 0, color, lineWidth)] : [];\n };\n\n /**\n * Line colored by its direction once zoomed out: the min / max of each\n * group in the color of its last bar, each run starting at the last\n * point of the previous one so the line stays joined at the flips\n */\n const trendLayer =\n (\n trend: NonNullable<Study[\"trend\"]>,\n lod: RangePyramid,\n upColor: Rgba,\n downColor: Rgba,\n lineWidth: number,\n ): Layer =>\n (ga, gb, isLive) => {\n const r = groupRanges(v, trend.value, lod);\n const count = n();\n const line = new TrendBuffer(top, bottom);\n let prevY = NaN;\n for (let g = isLive ? Math.max(0, ga - 1) : ga; g <= gb; g++) {\n const lo = r.min[g];\n const hi = r.max[g];\n if (!finite(lo) || !finite(hi)) {\n line.break();\n prevY = NaN;\n continue;\n }\n const up =\n trend.direction[Math.min(count - 1, g * v.size + v.size - 1)] !==\n -1;\n const x = X(g);\n const yLo = Y(lo);\n const yHi = Y(hi);\n // start with the extreme closest to the previous point\n const first =\n finite(prevY) && Math.abs(prevY - yHi) < Math.abs(prevY - yLo)\n ? yHi\n : yLo;\n const second = first === yHi ? yLo : yHi;\n line.push(x, first, up);\n if (second !== first) line.push(x, second, up);\n prevY = second;\n }\n // a halo of the background under the line: zoomed out, it runs\n // through the bars, drawn in the same colors\n const halo: Rgba = [bg[0], bg[1], bg[2], 0.9];\n const items: RenderItem[] = [];\n for (const [buffer, key] of [\n [line.up, \"u\"],\n [line.down, \"d\"],\n ] as const) {\n if (buffer.count > 1)\n items.push(buffer.item(`${key}h`, 0, halo, lineWidth + 2.5));\n }\n if (line.up.count > 1)\n items.push(line.up.item(\"u\", 0, upColor, lineWidth));\n if (line.down.count > 1)\n items.push(line.down.item(\"d\", 0, downColor, lineWidth));\n return items;\n };\n\n if (pane.id === PRICE) {\n // volume at the bottom of the price pane\n const volumeStudy = studies.find(\n (st) => st.overlay && st.type === \"volume\" && isVisible(st),\n );\n if (volumeStudy && volumeOverlayMax > 0) {\n const h = (bottom - top) * 0.2;\n result.push((ga, gb) => {\n const buffer = new BarBuffer();\n for (let g = ga; g <= gb; g++) {\n const vol = cols.volume[g] / groupBars(v, g);\n if (!(vol > 0)) continue;\n const y = bottom - (vol / volumeOverlayMax) * h;\n const [a, b] = pixelRange(y, bottom);\n buffer.push(\n metrics.snap(X(g)),\n a,\n b,\n cols.close[g] >= cols.open[g]\n ? volumeColors.up\n : volumeColors.down,\n );\n }\n return [buffer.item(\"\", 0, histogramHalf)];\n });\n }\n // comparison series\n for (const c of compares) {\n const base = compareBase(c);\n const color = resolve(c.color);\n result.push(\n rangeLayer(\n c.values,\n c.lod,\n color,\n c.width,\n 0,\n (value) =>\n yOfScaled(scale, compareScaled(scale, value, base)) * dpr,\n ),\n );\n }\n // the bars\n if (s === \"line\" || s === \"area\" || s === \"baseline\") {\n const lineColor = resolve(PRIMARY);\n if (s === \"area\") {\n result.push((ga, gb, isLive) => {\n const area = new AreaBuffer(top, bottom);\n for (let g = isLive ? Math.max(v.g0, ga - 1) : ga; g <= gb; g++)\n area.push(X(g), Y(cols.close[g]), bottom);\n return area.count > 1 ? [area.item(\"\", 0, lineColor, 0.28)] : [];\n });\n }\n if (s === \"baseline\") {\n const yb = Y(baselinePrice());\n result.push((ga, gb, isLive) => {\n const upArea = new AreaBuffer(top, bottom);\n const downArea = new AreaBuffer(top, bottom);\n const upLine = new LineBuffer(top, bottom);\n const downLine = new LineBuffer(top, bottom);\n let px = NaN;\n let py = NaN;\n const point = (x: number, y: number) => {\n upArea.push(x, Math.min(y, yb), yb);\n downArea.push(x, Math.max(y, yb), yb);\n if (y <= yb) upLine.push(x, y);\n else upLine.break();\n if (y >= yb) downLine.push(x, y);\n else downLine.break();\n };\n for (let g = isLive ? Math.max(v.g0, ga - 1) : ga; g <= gb; g++) {\n const x = X(g);\n const y = Y(cols.close[g]);\n if (finite(py) && (py - yb) * (y - yb) < 0) {\n const t = (yb - py) / (y - py);\n point(px + (x - px) * t, yb);\n }\n point(x, y);\n px = x;\n py = y;\n }\n const out: RenderItem[] = [];\n if (upArea.count > 1)\n out.push(\n upArea.item(\"u\", 0, up, 0.22),\n downArea.item(\"d\", 0, down, 0.22),\n );\n if (upLine.count > 1) out.push(upLine.item(\"ul\", 0, up, 2));\n if (downLine.count > 1) out.push(downLine.item(\"dl\", 0, down, 2));\n return out;\n });\n } else {\n result.push(lineLayer((g) => cols.close[g], lineColor, 2));\n }\n } else {\n const hollow = s === \"hollowCandles\";\n const ohlc = s === \"bars\";\n const wick = metrics.wick;\n const body = metrics.body;\n result.push((ga, gb) => {\n const wicks = new BarBuffer();\n const bodies = new BarBuffer();\n const caps = new BarBuffer();\n const ticks = new BarBuffer();\n const tick = Math.max(wick, Math.round((body - wick) / 2));\n for (let g = ga; g <= gb; g++) {\n const o = cols.open[g];\n const h = cols.high[g];\n const l = cols.low[g];\n const c = cols.close[g];\n if (!finite(o) || !finite(c)) continue;\n const rising = hollow\n ? c >= (g > 0 ? cols.close[g - 1] : o)\n : c >= o;\n const color = rising ? upP : downP;\n const cx = metrics.snap(X(g));\n const [wt, wb] = pixelRange(Y(h), Y(l));\n if (ohlc) {\n const range = clampRange(wt, wb, top, bottom);\n if (range) wicks.push(cx, range[0], range[1], color);\n for (const [value, side] of [\n [o, -1],\n [c, 1],\n ] as const) {\n const y = Math.round(Y(value) - wick / 2);\n if (y < top || y + wick > bottom) continue;\n ticks.push(\n cx + side * (wick / 2 + tick / 2),\n y,\n y + wick,\n color,\n );\n }\n continue;\n }\n const [bt, bb] = pixelRange(Y(o), Y(c));\n if (body <= wick) {\n const range = clampRange(wt, wb, top, bottom);\n if (range) wicks.push(cx, range[0], range[1], color);\n continue;\n }\n if (hollow && c > o) {\n const segments: [number, number][] = [\n [wt, bt],\n [bb, wb],\n ];\n for (const [a, b] of segments) {\n const range = b > a ? clampRange(a, b, top, bottom) : null;\n if (range) wicks.push(cx, range[0], range[1], color);\n }\n const edges = clampRange(bt, bb, top, bottom);\n if (edges) {\n wicks.push(\n cx - body / 2 + wick / 2,\n edges[0],\n edges[1],\n color,\n );\n wicks.push(\n cx + body / 2 - wick / 2,\n edges[0],\n edges[1],\n color,\n );\n }\n for (const y of [bt, bb - wick]) {\n if (y >= top && y + wick <= bottom)\n caps.push(cx, y, y + wick, color);\n }\n continue;\n }\n const range = clampRange(wt, wb, top, bottom);\n if (range) wicks.push(cx, range[0], range[1], color);\n const box = clampRange(bt, bb, top, bottom);\n if (box) bodies.push(cx, box[0], box[1], color);\n }\n const items: RenderItem[] = [wicks.item(\"w\", 0, wick / 2)];\n if (bodies.count) items.push(bodies.item(\"b\", 0, body / 2));\n if (caps.count) items.push(caps.item(\"c\", 0, body / 2));\n if (ticks.count) items.push(ticks.item(\"t\", 0, tick / 2));\n return items;\n });\n }\n }\n\n // indicators of the pane\n const paneStudies =\n pane.id === PRICE\n ? studies.filter((st) => st.overlay && st.type !== \"volume\")\n : pane.study\n ? [pane.study]\n : [];\n for (const study of paneStudies) {\n if (!isVisible(study)) continue;\n const trend = study.trend;\n const [upOut, downOut] = study.outputs;\n if (trend && v.level && upOut && downOut) {\n result.push(\n trendLayer(\n trend,\n trendLodOf(study),\n resolve(colorOf(upOut.color)),\n resolve(colorOf(downOut.color)),\n upOut.width,\n ),\n );\n continue;\n }\n for (const out of study.outputs) {\n if (out.kind === \"volume\") {\n const y0 = Y(0);\n result.push((ga, gb) => {\n const buffer = new BarBuffer();\n for (let g = ga; g <= gb; g++) {\n const vol = cols.volume[g] / groupBars(v, g);\n if (!(vol > 0)) continue;\n const range = clampRange(\n ...pixelRange(Y(vol), y0),\n top,\n bottom,\n );\n if (range)\n buffer.push(\n metrics.snap(X(g)),\n range[0],\n range[1],\n cols.close[g] >= cols.open[g]\n ? volumeColors.up\n : volumeColors.down,\n );\n }\n return [buffer.item(\"\", 0, histogramHalf)];\n });\n } else if (out.kind === \"histogram\") {\n const y0 = Y(0);\n const strong = { up: upP, down: downP };\n const faded = {\n up: packColor(mix(bg, up, 0.45)),\n down: packColor(mix(bg, down, 0.45)),\n };\n const lod = lodOf(out);\n result.push((ga, gb) => {\n const r = groupRanges(v, out.values, lod);\n const buffer = new BarBuffer();\n for (let g = ga; g <= gb; g++) {\n const value = r.last[g];\n if (!finite(value)) continue;\n const prev = g > 0 ? r.last[g - 1] : value;\n const color =\n value >= 0\n ? value >= prev\n ? strong.up\n : faded.up\n : value <= prev\n ? strong.down\n : faded.down;\n // a group spans its lowest and highest values (and zero)\n const lo = Math.min(0, finite(r.min[g]) ? r.min[g] : value);\n const hi = Math.max(0, finite(r.max[g]) ? r.max[g] : value);\n const range = clampRange(\n ...(v.level\n ? pixelRange(Y(hi), Y(lo))\n : pixelRange(Y(value), y0)),\n top,\n bottom,\n );\n if (range)\n buffer.push(metrics.snap(X(g)), range[0], range[1], color);\n }\n return [buffer.item(\"\", 0, histogramHalf)];\n });\n } else if (out.kind === \"dots\") {\n const fixed = out.color\n ? packColor(resolve(colorOf(out.color)))\n : 0;\n const radius = clamp(spacing * v.size * 0.22, 1.25, 2.6);\n const half = radius * dpr;\n result.push((ga, gb) => {\n const buffer = new BarBuffer();\n for (let g = ga; g <= gb; g++) {\n const value = v.level\n ? out.values[Math.min(n() - 1, g * v.size + v.size - 1)]\n : out.values[g];\n if (!finite(value)) continue;\n const y = Y(value);\n if (y < top || y > bottom) continue;\n const color = fixed || (value <= cols.close[g] ? upP : downP);\n buffer.push(X(g), y - half, y + half, color);\n }\n return buffer.count ? [buffer.item(\"\", 0, half, 0, radius)] : [];\n });\n } else {\n const color = resolve(colorOf(out.color));\n result.push(\n rangeLayer(\n out.values,\n lodOf(out),\n [color[0], color[1], color[2], color[3] * out.alpha],\n out.width,\n out.shift,\n ),\n );\n }\n }\n }\n }\n return result;\n };\n\n /** Builds the items of the main bars or of the last group */\n const runLayer = (\n fn: Layer,\n index: number,\n v: Visible,\n isLive: boolean,\n ): RenderItem[] => {\n const lastMain = Math.min(v.g1, v.last - 1);\n const items = isLive\n ? v.last >= v.g0 && v.last <= v.g1\n ? fn(v.last, v.last, true)\n : []\n : lastMain >= v.g0\n ? fn(v.g0, lastMain, false)\n : [];\n const version = ++itemVersion;\n return items.map((item, k) => ({\n ...item,\n key: `L${index}:${k}:${item.kind}:${item.key}${isLive ? \":live\" : \"\"}`,\n version,\n }));\n };\n\n const renderData = (v: Visible | null, dpr: number) => {\n if (!renderer) return;\n const canvas = renderer.canvas;\n styleElement(canvas, {\n left: \"0px\",\n top: \"0px\",\n width: `${plotW}px`,\n height: `${plotH}px`,\n });\n const bw = Math.max(1, Math.round(plotW * dpr));\n const bh = Math.max(1, Math.round(plotH * dpr));\n if (canvas.width !== bw || canvas.height !== bh) renderer.resize(bw, bh);\n if (v) {\n const key = [\n bw,\n bh,\n dpr,\n spacing,\n right,\n v.level,\n style(),\n dataVersion,\n themeVersion,\n optionsVersion,\n volumeOverlayMax,\n style() === \"baseline\" ? baselinePrice() : 0,\n ...panes.map(\n (p) =>\n `${p.id}:${p.top}:${p.height}:${p.scale.min}:${p.scale.max}:${p.scale.base}:${p.scale.mode}`,\n ),\n ...studies.map((st) => `${st.id}:${isVisible(st)}`),\n ].join(\"|\");\n if (key !== geomKey) {\n geomKey = key;\n builtTail = tailVersion;\n layers = createLayers(v, dpr).map((fn) => ({ fn, main: [], live: [] }));\n layers.forEach((l, i) => {\n l.main = runLayer(l.fn, i, v, false);\n l.live = runLayer(l.fn, i, v, true);\n });\n } else if (builtTail !== tailVersion) {\n builtTail = tailVersion;\n layers.forEach((l, i) => {\n l.live = runLayer(l.fn, i, v, true);\n });\n }\n } else {\n layers = [];\n geomKey = \"\";\n }\n const items = layers.flatMap((l) => [...l.main, ...l.live]);\n renderer.render(items, {\n transform: { xScale: 2 / bw, xOffset: -1, yScale: -2 / bh, yOffset: 1 },\n width: bw,\n height: bh,\n dpr,\n });\n };\n\n // -------------------------------------------------------- 2D painting\n\n const sizeCanvas = (canvas: HTMLCanvasElement, dpr: number) => {\n const w = Math.max(1, Math.round(width * dpr));\n const h = Math.max(1, Math.round(height * dpr));\n if (canvas.width !== w) canvas.width = w;\n if (canvas.height !== h) canvas.height = h;\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n };\n\n const roundRect = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n ) => {\n ctx.beginPath();\n if (typeof ctx.roundRect === \"function\") ctx.roundRect(x, y, w, h, r);\n else ctx.rect(x, y, w, h);\n };\n\n /** Area between two outputs of a study, colored by which one is above */\n const paintFill = (\n ctx: CanvasRenderingContext2D,\n v: Visible,\n pane: Pane,\n study: Study,\n f: Study[\"fills\"][number],\n ) => {\n const outA = study.outputs[f.a];\n const outB = study.outputs[f.b];\n if (!outA || !outB) return;\n const ra = groupRanges(v, outA.values, lodOf(outA));\n const rb = groupRanges(v, outB.values, lodOf(outB));\n const shiftBars = outA.shift;\n const extra = Math.ceil(Math.abs(shiftBars) / v.size) + 1;\n const from = Math.max(0, v.g0 - (shiftBars > 0 ? extra : 0));\n const to = Math.min(v.last, v.g1 + (shiftBars < 0 ? extra : 0));\n const above = css(colorOf(f.color), f.opacity);\n const below = css(colorOf(f.colorBelow ?? f.color), f.opacity);\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, pane.top, plotW, pane.height);\n ctx.clip();\n let run: { x: number; ya: number; yb: number }[] = [];\n let sign = 0;\n const flush = () => {\n if (run.length > 1) {\n ctx.fillStyle = sign >= 0 ? above : below;\n ctx.beginPath();\n run.forEach((p, i) =>\n i ? ctx.lineTo(p.x, p.ya) : ctx.moveTo(p.x, p.ya),\n );\n for (let k = run.length - 1; k >= 0; k--) {\n const p = run[k];\n if (p) ctx.lineTo(p.x, p.yb);\n }\n ctx.closePath();\n ctx.fill();\n }\n run = [];\n };\n for (let g = from; g <= to; g++) {\n const a = ra.last[g];\n const b = rb.last[g];\n if (!finite(a) || !finite(b)) {\n flush();\n sign = 0;\n continue;\n }\n const x = xOf(groupCenter(v, g) + shiftBars);\n const ya = yOf(pane.scale, a);\n const yb = yOf(pane.scale, b);\n const s = a >= b ? 1 : -1;\n const prev = run[run.length - 1];\n if (prev && s !== sign) {\n // the lines cross: close the run at the crossing\n const d0 = prev.ya - prev.yb;\n const t = d0 / (d0 - (ya - yb));\n const cx = prev.x + (x - prev.x) * t;\n const cy = prev.ya + (ya - prev.ya) * t;\n run.push({ x: cx, ya: cy, yb: cy });\n flush();\n run.push({ x: cx, ya: cy, yb: cy });\n }\n sign = s;\n run.push({ x, ya, yb });\n }\n flush();\n ctx.restore();\n };\n\n /** Dashed lines where a day starts (in the displayed time zone) */\n const paintSessionBreaks = (ctx: CanvasRenderingContext2D, v: Visible) => {\n if (!options.sessionBreaks || tfMs() >= DAY) return;\n const xs: number[] = [];\n let prevDay = NaN;\n for (let g = Math.max(0, v.g0 - 1); g <= Math.min(v.g1, v.last); g++) {\n const day = Math.floor(shift(v.cols.time[g]) / DAY);\n if (finite(prevDay) && day !== prevDay) {\n const x = Math.round(xOf(g * v.size - 0.5)) + 0.5;\n if (x > 0 && x < plotW) xs.push(x);\n // too dense to read: none at all\n if (xs.length > plotW / 6) return;\n }\n prevDay = day;\n }\n if (!xs.length) return;\n ctx.save();\n ctx.strokeStyle = toCss(theme.textMuted, 0.4);\n ctx.setLineDash([4, 4]);\n ctx.beginPath();\n for (const x of xs) {\n ctx.moveTo(x, 0);\n ctx.lineTo(x, plotH);\n }\n ctx.stroke();\n ctx.restore();\n };\n\n const profileOptions = (): TradingVolumeProfileOptions | null => {\n const option = options.volumeProfile;\n if (!option) return null;\n return option === true ? {} : option;\n };\n\n /** Volume by price of the visible bars, from the right (or left) edge */\n const paintVolumeProfile = (ctx: CanvasRenderingContext2D, v: Visible) => {\n const o = profileOptions();\n const price = panes[0];\n if (!o || !price || !store.hasVolume) return;\n const rows = clamp(Math.floor(o.rows ?? 24), 2, 400);\n const key = [\n v.level,\n v.s0,\n v.s1,\n rows,\n o.valueArea ?? 0.7,\n dataVersion,\n tailVersion,\n ].join(\"|\");\n if (!profile || profile.key !== key) {\n // real prices, also under Heikin-Ashi bars\n const cols = v.level ? pyramidLevel(pyramid, store, n(), v.level) : store;\n profile = {\n key,\n result: volumeProfile(cols, {\n from: v.s0,\n to: v.s1,\n rows,\n valueArea: o.valueArea,\n }),\n };\n }\n const r = profile.result;\n if (r.poc < 0) return;\n let largest = 0;\n for (let i = 0; i < rows; i++)\n largest = Math.max(largest, (r.up[i] ?? 0) + (r.down[i] ?? 0));\n if (!(largest > 0)) return;\n const span = plotW * clamp(o.width ?? 0.28, 0.05, 0.9);\n const fromRight = (o.side ?? \"right\") === \"right\";\n const upColor = resolve(colorOf(o.upColor ?? \"up\"));\n const downColor = resolve(colorOf(o.downColor ?? \"down\"));\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, price.top, plotW, price.height);\n ctx.clip();\n for (let i = 0; i < rows; i++) {\n const up = r.up[i] ?? 0;\n const down = r.down[i] ?? 0;\n if (!(up + down > 0)) continue;\n const y0 = yOf(price.scale, r.low + i * r.step);\n const y1 = yOf(price.scale, r.low + (i + 1) * r.step);\n const top = Math.min(y0, y1);\n const h = Math.max(\n 1,\n Math.abs(y1 - y0) - (Math.abs(y1 - y0) > 4 ? 1 : 0),\n );\n const inside = i >= r.valueAreaFrom && i <= r.valueAreaTo;\n const alpha = inside ? 0.42 : 0.17;\n const upLength = (up / largest) * span;\n const downLength = (down / largest) * span;\n const edge = fromRight ? plotW : 0;\n const dir = fromRight ? -1 : 1;\n ctx.fillStyle = toCss(upColor, alpha);\n ctx.fillRect(Math.min(edge, edge + dir * upLength), top, upLength, h);\n ctx.fillStyle = toCss(downColor, alpha);\n const start = edge + dir * upLength;\n ctx.fillRect(\n Math.min(start, start + dir * downLength),\n top,\n downLength,\n h,\n );\n }\n // point of control\n const y =\n Math.round(yOf(price.scale, r.low + (r.poc + 0.5) * r.step)) + 0.5;\n ctx.strokeStyle = css(o.pocColor ?? WARNING, 0.9);\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n ctx.stroke();\n ctx.restore();\n };\n\n const paintBackground = (\n ctx: CanvasRenderingContext2D,\n v: Visible | null,\n ticks: TimeLabel[],\n ) => {\n const grid = toCss(theme.grid);\n const showGrid = options.grid !== false;\n ctx.lineWidth = 1;\n if (showGrid) {\n ctx.strokeStyle = grid;\n ctx.beginPath();\n for (const t of ticks) {\n const x = Math.round(t.x) + 0.5;\n ctx.moveTo(x, 0);\n ctx.lineTo(x, plotH);\n }\n for (const pane of panes) {\n for (const t of pane.ticks) {\n const y = Math.round(yOfScaled(pane.scale, t)) + 0.5;\n if (y < pane.top + 2 || y > pane.top + pane.height - 2) continue;\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n }\n }\n ctx.stroke();\n }\n // watermark\n if (options.watermark) {\n const price = panes[0];\n ctx.save();\n ctx.font = font(Math.min(56, Math.max(22, plotW / 14)), 700);\n ctx.fillStyle = toCss(theme.text, 0.07);\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(options.watermark, plotW / 2, price.top + price.height / 2);\n ctx.restore();\n }\n // bands of the indicator panes\n for (const pane of panes) {\n const study = pane.study;\n if (study?.bands && isVisible(study)) {\n const color = resolve(colorOf(study.outputs[0]?.color ?? PRIMARY));\n const ys = study.bands.map((b) => Math.round(yOf(pane.scale, b)) + 0.5);\n if (study.bandFill && ys.length === 2) {\n ctx.fillStyle = toCss(color, 0.07);\n ctx.fillRect(\n 0,\n Math.min(ys[0], ys[1]),\n plotW,\n Math.abs(ys[1] - ys[0]),\n );\n }\n ctx.save();\n ctx.setLineDash([4, 4]);\n ctx.strokeStyle = toCss(theme.textMuted, 0.45);\n ctx.beginPath();\n for (const y of ys) {\n if (y < pane.top || y > pane.top + pane.height) continue;\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n }\n ctx.stroke();\n ctx.restore();\n }\n }\n if (v) {\n paintSessionBreaks(ctx, v);\n for (const study of studies) {\n if (!study.fills.length || !isVisible(study)) continue;\n const pane = study.overlay\n ? panes[0]\n : panes.find((p) => p.study === study);\n if (pane)\n for (const f of study.fills) paintFill(ctx, v, pane, study, f);\n }\n const price = panes[0];\n if (price && price.scale.mode === \"percent\" && compares.length) {\n // the common origin of the compared series\n const y = Math.round(yOfScaled(price.scale, 0)) + 0.5;\n if (y > price.top && y < price.top + price.height) {\n ctx.save();\n ctx.strokeStyle = toCss(theme.textMuted, 0.6);\n ctx.setLineDash([2, 3]);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n ctx.stroke();\n ctx.restore();\n }\n }\n paintVolumeProfile(ctx, v);\n }\n // separators and axis borders\n ctx.strokeStyle = toCss(theme.axis);\n ctx.beginPath();\n for (const pane of panes.slice(1)) {\n const y = Math.round(pane.top) + 0.5;\n ctx.moveTo(0, y);\n ctx.lineTo(width, y);\n }\n ctx.moveTo(Math.round(plotW) + 0.5, 0);\n ctx.lineTo(Math.round(plotW) + 0.5, height);\n ctx.moveTo(0, Math.round(plotH) + 0.5);\n ctx.lineTo(width, Math.round(plotH) + 0.5);\n ctx.stroke();\n };\n\n /** Label on the price axis; returns its vertical extent */\n const axisLabel = (\n ctx: CanvasRenderingContext2D,\n y: number,\n text: string,\n fill: string,\n textColor: string,\n second?: string,\n ) => {\n const h = second ? 32 : 18;\n const top = clamp(Math.round(y - 9), 0, plotH - h);\n roundRect(ctx, plotW + 1, top, axisW - 2, h, 3);\n ctx.fillStyle = fill;\n ctx.fill();\n ctx.fillStyle = textColor;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n ctx.font = font(theme.fontSize, 500);\n ctx.fillText(text, plotW + 7, top + 9.5);\n if (second) {\n ctx.font = font(theme.fontSize - 1);\n ctx.fillText(second, plotW + 7, top + 24);\n }\n };\n\n const priceAxisText = (value: number) =>\n panes[0]?.scale.mode === \"percent\"\n ? formatPercent(toScaled(panes[0].scale, value), locale)\n : formatPrice(value);\n\n const lineColor = (line: TradingPriceLine) => {\n if (line.color) return css(line.color);\n const kind = line.kind ?? \"line\";\n if (kind === \"takeProfit\") return css(upCss());\n if (kind === \"stopLoss\") return css(downCss());\n if (kind === \"alert\") return css(WARNING);\n if (kind === \"line\") return css(PRIMARY);\n return css(line.side === \"sell\" ? downCss() : upCss());\n };\n\n const linePrice = (line: TradingPriceLine) =>\n lineOverrides.get(line.id) ?? line.price;\n\n const crosshairState = () => {\n if (!vis || !panes.length) return null;\n if (keyboardIndex !== null) {\n const index = keyboardIndex;\n const bar = index >= 0 && index < n() ? display().close[index] : NaN;\n return { index, pane: panes[0], y: yOf(panes[0].scale, bar), price: bar };\n }\n if (!pointer && externalCross) {\n const index = Math.round(indexOfTimeExt(externalCross.time));\n const price = externalCross.price;\n return {\n index,\n pane: panes[0],\n y: finite(price) ? yOf(panes[0].scale, price) : NaN,\n price,\n };\n }\n if (!pointer || pointer.x > plotW || pointer.y > plotH) return null;\n const pane = paneAt(pointer.y);\n if (!pane) return null;\n const index = Math.round(indexAt(pointer.x));\n let y = pointer.y;\n let price = valueAt(pane.scale, y);\n if (\n pane.id === PRICE &&\n options.crosshair !== \"free\" &&\n index >= 0 &&\n index < n() &&\n tool === \"cursor\"\n ) {\n const d = display();\n let best = Infinity;\n for (const value of [\n d.open[index],\n d.high[index],\n d.low[index],\n d.close[index],\n ]) {\n const yy = yOf(pane.scale, value);\n if (Math.abs(yy - pointer.y) < best) {\n best = Math.abs(yy - pointer.y);\n y = yy;\n price = value;\n }\n }\n }\n return { index, pane, y, price };\n };\n\n const paneOf = (id: string | undefined) =>\n panes.find((p) => p.id === (id ?? PRICE)) ?? null;\n\n const drawingMapper = (pane: Pane | null): DrawingMapper | null => {\n if (!pane) return null;\n return {\n x: xOf,\n y: (p) => yOf(pane.scale, p),\n index: indexOfTimeExt,\n left: 0,\n right: plotW,\n top: pane.top,\n bottom: pane.top + pane.height,\n };\n };\n\n const formatSpan = (bars: number, ms: number) => {\n const l = labels();\n const abs = Math.abs(ms);\n const parts: string[] = [];\n const days = Math.floor(abs / DAY);\n const hours = Math.floor((abs % DAY) / HOUR);\n const minutes = Math.floor((abs % HOUR) / MINUTE);\n if (days) parts.push(fill(l.days, { count: days }));\n if (hours) parts.push(fill(l.hours, { count: hours }));\n if (minutes && !days) parts.push(fill(l.minutes, { count: minutes }));\n return `${fill(labels().bars, { count: bars })}, ${parts.join(\" \") || fill(l.minutes, { count: 0 })}`;\n };\n\n /** A value of a pane as written by its axis (prices on the price pane) */\n const paneValueText = (pane: Pane, value: number) =>\n pane.id === PRICE ? formatPrice(value) : paneTickText(pane, value);\n\n /** Price rounded to the precision of the prices */\n const roundPrice = (price: number) => {\n const step = 10 ** -precision();\n return Number((Math.round(price / step) * step).toFixed(precision()));\n };\n\n /** A rounded label (pill) with text */\n const pill = (\n ctx: CanvasRenderingContext2D,\n text: string,\n x: number,\n y: number,\n fillColor: string,\n align: \"left\" | \"center\" | \"right\" = \"center\",\n ) => {\n ctx.font = font(theme.fontSize, 500);\n const w = ctx.measureText(text).width + 16;\n const left = clamp(\n align === \"center\" ? x - w / 2 : align === \"right\" ? x - w : x,\n 2,\n Math.max(2, plotW - w - 2),\n );\n roundRect(ctx, left, y, w, 22, 11);\n ctx.fillStyle = fillColor;\n ctx.fill();\n ctx.fillStyle = textOn(fillColor);\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(text, left + w / 2, y + 11.5);\n return w;\n };\n\n /** Registers a clickable area of the canvas; returns whether it is hovered */\n const canvasButton = (\n x: number,\n y: number,\n w: number,\n h: number,\n action: () => void,\n ) => {\n canvasButtons.push({ x, y, w, h, action });\n return hoveredButton === canvasButtons.length - 1;\n };\n\n const paintDrawings = (\n ctx: CanvasRenderingContext2D,\n colors: { text: string; background: string; up: string; down: string },\n ) => {\n const count = n();\n const last = count ? store.close[count - 1] : NaN;\n const all = draft ? [...drawings, draft] : drawings;\n if (!all.length) return;\n const l = labels();\n const position = {\n target: l.target,\n stop: l.stop,\n riskReward: l.riskReward,\n profit: l.profit,\n long: l.long,\n short: l.short,\n };\n for (const pane of panes) {\n const mapper = drawingMapper(pane);\n if (!mapper) continue;\n const own = all.filter((d) => (d.pane ?? PRICE) === pane.id);\n if (!own.length) continue;\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, pane.top, plotW, pane.height);\n ctx.clip();\n for (const drawing of own) {\n const box = paintDrawing(\n ctx,\n drawing,\n mapper,\n {\n ...colors,\n color: css(drawing.color ?? PRIMARY),\n font: font(theme.fontSize, 500),\n fontFamily: theme.fontFamily,\n formatPrice: (value) => paneValueText(pane, value),\n formatPercent: (value) => formatPercent(value, locale),\n formatSpan,\n textOn,\n defaultText: l.text,\n position,\n last: pane.id === PRICE ? last : NaN,\n fill,\n },\n {\n selected: drawing === draft || drawing.id === selected,\n hovered: drawing.id === hovered,\n },\n );\n if (box) textBoxes.set(drawing.id, box);\n }\n ctx.restore();\n }\n };\n\n const paintForeground = (\n ctx: CanvasRenderingContext2D,\n v: Visible | null,\n ticks: TimeLabel[],\n ) => {\n const price = panes[0];\n if (!price) return;\n canvasButtons = [];\n const count = n();\n const text = toCss(theme.text);\n const muted = toCss(theme.textMuted);\n const bgCss = toCss(theme.background);\n const upC = css(upCss());\n const downC = css(downCss());\n const l = labels();\n\n // ---- price pane contents (clipped)\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, price.top, plotW, price.height);\n ctx.clip();\n\n // high / low of the visible bars, kept inside the plot\n if (\n v &&\n options.highLowMarkers !== false &&\n style() !== \"line\" &&\n style() !== \"area\" &&\n style() !== \"baseline\"\n ) {\n let hi = -Infinity;\n let lo = Infinity;\n let hiG = -1;\n let loG = -1;\n for (let g = v.s0; g <= v.s1; g++) {\n if (v.cols.high[g] > hi) {\n hi = v.cols.high[g];\n hiG = g;\n }\n if (v.cols.low[g] < lo) {\n lo = v.cols.low[g];\n loG = g;\n }\n }\n ctx.font = font(theme.fontSize);\n ctx.fillStyle = muted;\n ctx.strokeStyle = muted;\n ctx.lineWidth = 1;\n for (const [g, value, below] of [\n [hiG, hi, false],\n [loG, lo, true],\n ] as const) {\n if (g < 0 || !finite(value)) continue;\n const x = xOf(groupCenter(v, g));\n const label = formatPrice(value);\n const w = ctx.measureText(label).width;\n let y = clamp(\n yOf(price.scale, value) + (below ? 9 : -9),\n price.top + 8,\n price.top + price.height - 8,\n );\n // not under a row of the legend\n const labelLeft = Math.min(x, x + (x > plotW * 0.6 ? -17 - w : 17 + w));\n for (const row of priceLegend) {\n if (\n labelLeft < row.right &&\n y - 7 < row.bottom &&\n y + 7 > row.top &&\n row.bottom + 10 < price.top + price.height - 8\n )\n y = row.bottom + 10;\n }\n // on the right of the bar, unless it does not fit there\n const roomRight = plotW - 4 - (x + 17 + w);\n const roomLeft = x - 17 - w - 4;\n const leftSide =\n (roomRight < 0 || x > plotW * 0.6) &&\n roomLeft >= Math.min(0, roomRight);\n const dir = leftSide ? -1 : 1;\n ctx.textBaseline = \"middle\";\n ctx.textAlign = \"left\";\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(x + dir * 14, y);\n ctx.stroke();\n const tx = clamp(leftSide ? x - 17 - w : x + 17, 2, plotW - w - 2);\n ctx.fillText(label, tx, y);\n }\n }\n\n // trade markers\n if (v && options.markers?.length) {\n const stack = new Map<string, number>();\n ctx.font = font(theme.fontSize, 600);\n ctx.textAlign = \"center\";\n const many = options.markers.length > 400;\n for (const marker of options.markers) {\n const index = indexOfTimeExt(marker.time);\n if (index < 0 || index > count - 1) continue;\n const g = Math.floor(index / v.size);\n if (g < v.g0 || g > v.g1) continue;\n const x = Math.round(xOf(groupCenter(v, g)));\n const sell = marker.side === \"sell\";\n const color = marker.color ? css(marker.color) : sell ? downC : upC;\n const key = `${g}:${sell}`;\n const offset = stack.get(key) ?? 0;\n stack.set(key, offset + (marker.text && !many ? 30 : 16));\n const anchor = yOf(price.scale, sell ? v.cols.high[g] : v.cols.low[g]);\n const dir = sell ? -1 : 1;\n const tip = anchor + dir * (6 + offset);\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.moveTo(x, tip);\n ctx.lineTo(x - 5.5, tip + dir * 7);\n ctx.lineTo(x - 2, tip + dir * 7);\n ctx.lineTo(x - 2, tip + dir * 12);\n ctx.lineTo(x + 2, tip + dir * 12);\n ctx.lineTo(x + 2, tip + dir * 7);\n ctx.lineTo(x + 5.5, tip + dir * 7);\n ctx.closePath();\n ctx.fill();\n if (marker.text && !many) {\n ctx.textBaseline = sell ? \"bottom\" : \"top\";\n ctx.fillText(marker.text, x, tip + dir * 14);\n }\n if (marker.price !== undefined && finite(marker.price)) {\n ctx.beginPath();\n ctx.arc(x, yOf(price.scale, marker.price), 3, 0, Math.PI * 2);\n ctx.fill();\n ctx.lineWidth = 1.5;\n ctx.strokeStyle = bgCss;\n ctx.stroke();\n }\n }\n }\n ctx.restore();\n\n // drawings, each in its pane\n paintDrawings(ctx, { text, background: bgCss, up: upC, down: downC });\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, price.top, plotW, price.height);\n ctx.clip();\n // price lines (orders, positions, TP / SL, alerts)\n const lastClose = count ? store.close[count - 1] : NaN;\n for (const line of options.priceLines ?? []) {\n const p = linePrice(line);\n const y = Math.round(yOf(price.scale, p)) + 0.5;\n if (!finite(y) || y < price.top || y > price.top + price.height) continue;\n const color = lineColor(line);\n const kind = line.kind ?? \"line\";\n const lineStyle =\n line.lineStyle ??\n (kind === \"position\" || kind === \"line\" ? \"solid\" : \"dashed\");\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth =\n hoveredLine === line.id ||\n (gesture?.kind === \"order\" && gesture.line.id === line.id) ||\n (keyOrder?.kind === \"move\" && keyOrder.id === line.id)\n ? 1.5\n : 1;\n setDash(ctx, lineStyle, 1);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n ctx.stroke();\n ctx.restore();\n // label: [grip] title | quantity | profit | close\n const titleKey = PRICE_LINE_TITLES[kind];\n const title = line.title ?? (titleKey ? l[titleKey] : \"\");\n const parts: {\n text: string;\n fill: string;\n color: string;\n cancel?: boolean;\n }[] = [];\n if (title) parts.push({ text: title, fill: color, color: textOn(color) });\n if (line.quantity !== undefined && line.quantity !== \"\")\n parts.push({ text: String(line.quantity), fill: bgCss, color });\n if (\n kind === \"position\" &&\n typeof line.quantity === \"number\" &&\n finite(lastClose)\n ) {\n const pnl =\n (lastClose - p) * line.quantity * (line.side === \"sell\" ? -1 : 1);\n const pnlFill = pnl >= 0 ? upC : downC;\n parts.push({\n text: `${pnl >= 0 ? \"+\" : \"−\"}${formatPrice(Math.abs(pnl))}`,\n fill: pnlFill,\n color: textOn(pnlFill),\n });\n }\n if (line.cancellable)\n parts.push({ text: \"×\", fill: bgCss, color, cancel: true });\n if (!parts.length && !line.draggable) continue;\n ctx.font = font(theme.fontSize, 600);\n const widths = parts.map((part) =>\n part.cancel ? 20 : ctx.measureText(part.text).width + 12,\n );\n const grip = line.draggable ? 14 : 0;\n const total = widths.reduce((a, b) => a + b, 0) + grip;\n let x = Math.round(plotW - total - 56);\n const top = Math.round(y - 9.5);\n if (keyOrder?.kind === \"move\" && keyOrder.id === line.id) {\n // picked with the keyboard: a focus ring around the label\n roundRect(ctx, x - 3.5, top - 3.5, total + 7, 25, 5);\n ctx.strokeStyle = css(PRIMARY);\n ctx.lineWidth = 2;\n ctx.setLineDash([]);\n ctx.stroke();\n }\n roundRect(ctx, x - 0.5, top - 0.5, total + 1, 19, 3);\n ctx.fillStyle = bgCss;\n ctx.fill();\n ctx.strokeStyle = color;\n ctx.lineWidth = 1;\n ctx.setLineDash([]);\n ctx.stroke();\n if (grip) {\n ctx.fillStyle = color;\n for (let k = 0; k < 3; k++)\n ctx.fillRect(x + 4, top + 5 + k * 3.5, 6, 1.5);\n x += grip;\n }\n ctx.textBaseline = \"middle\";\n ctx.textAlign = \"center\";\n parts.forEach((part, k) => {\n const w = widths[k] ?? 0;\n let partFill = part.fill;\n if (part.cancel) {\n const hover = canvasButton(x, top, w, 18, () =>\n emit(\"orderCancel\", { id: line.id, line }),\n );\n if (hover) partFill = color;\n ctx.fillStyle = color;\n ctx.fillRect(x, top + 3, 1, 12);\n }\n if (partFill !== bgCss) {\n ctx.fillStyle = partFill;\n ctx.fillRect(x, top, w, 18);\n }\n ctx.fillStyle =\n part.cancel && partFill !== bgCss ? textOn(color) : part.color;\n if (part.cancel) ctx.font = font(theme.fontSize + 3, 500);\n ctx.fillText(part.text, x + w / 2, top + (part.cancel ? 9 : 9.5));\n ctx.font = font(theme.fontSize, 600);\n x += w;\n });\n }\n\n // last price line\n const lastLine = options.lastPriceLine !== false && count > 0;\n const lastUp = count > 0 && store.close[count - 1] >= store.open[count - 1];\n // a line takes its own color; bars the color of the last bar\n const lastColor =\n style() === \"line\" || style() === \"area\"\n ? css(PRIMARY)\n : lastUp\n ? upC\n : downC;\n if (lastLine) {\n const y = Math.round(yOf(price.scale, lastClose)) + 0.5;\n ctx.save();\n ctx.strokeStyle = lastColor;\n ctx.setLineDash([1, 2]);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n ctx.stroke();\n ctx.restore();\n }\n ctx.restore();\n\n // last values of the compared series\n const compareLabels: { y: number; text: string; color: string }[] = [];\n for (const c of compares) {\n let i = count - 1;\n while (i >= 0 && !finite(c.values[i])) i--;\n if (i < 0) continue;\n const value = c.values[i];\n const scaled = compareScaled(price.scale, value, compareBase(c));\n const y = yOfScaled(price.scale, scaled);\n if (!finite(y) || y < price.top || y > price.top + price.height) continue;\n compareLabels.push({\n y,\n text:\n price.scale.mode === \"percent\"\n ? formatPercent(scaled, locale)\n : formatPrice(value),\n color: css(c.color),\n });\n }\n\n // axis ticks, except under the labels drawn over the axis\n const covered: { pane: string; y: number }[] = [];\n for (const line of options.priceLines ?? [])\n covered.push({ pane: PRICE, y: yOf(price.scale, linePrice(line)) });\n for (const drawing of drawings) {\n const pane = paneOf(drawing.pane);\n if (pane && drawing.type === \"horizontalLine\" && drawing.points[0])\n covered.push({\n pane: pane.id,\n y: yOf(pane.scale, drawing.points[0].price),\n });\n }\n for (const label of compareLabels)\n covered.push({ pane: PRICE, y: label.y });\n if (lastLine)\n covered.push({\n pane: PRICE,\n y: yOf(price.scale, lastClose) + (options.countdown ? 7 : 0),\n });\n ctx.font = font(theme.fontSize);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n ctx.fillStyle = muted;\n for (const pane of panes) {\n for (const t of pane.ticks) {\n const y = yOfScaled(pane.scale, t);\n if (y < pane.top + 8 || y > pane.top + pane.height - 8) continue;\n const gap = options.countdown && pane.id === PRICE ? 18 : 14;\n if (covered.some((c) => c.pane === pane.id && Math.abs(c.y - y) < gap))\n continue;\n ctx.fillText(paneTickText(pane, t), plotW + 8, y);\n }\n }\n // time axis ticks\n ctx.textAlign = \"center\";\n for (const t of ticks) {\n ctx.font = font(theme.fontSize, t.bold ? 600 : 400);\n ctx.fillStyle = t.bold ? text : muted;\n ctx.fillText(t.text, t.x, plotH + TIME_AXIS / 2);\n }\n\n // labels of the price lines, the drawings and the compared series\n for (const line of options.priceLines ?? []) {\n const p = linePrice(line);\n const y = yOf(price.scale, p);\n if (!finite(y) || y < price.top || y > price.top + price.height) continue;\n const fillColor = lineColor(line);\n axisLabel(ctx, y, priceAxisText(p), fillColor, textOn(fillColor));\n }\n for (const drawing of drawings) {\n const pane = paneOf(drawing.pane);\n if (!pane || drawing.type !== \"horizontalLine\" || !drawing.points[0])\n continue;\n const p = drawing.points[0].price;\n const y = yOf(pane.scale, p);\n if (y < pane.top || y > pane.top + pane.height) continue;\n const fillColor = css(drawing.color ?? PRIMARY);\n axisLabel(\n ctx,\n y,\n pane.id === PRICE ? priceAxisText(p) : paneValueText(pane, p),\n fillColor,\n textOn(fillColor),\n );\n }\n for (const label of compareLabels)\n axisLabel(ctx, label.y, label.text, label.color, textOn(label.color));\n // last price label (with the countdown)\n if (lastLine) {\n let second: string | undefined;\n if (options.countdown) {\n const tf = timeframe();\n const start = store.time[count - 1];\n let end = start + tf.ms;\n if (tf.unit === \"month\") {\n const date = new Date(start);\n end = Date.UTC(\n date.getUTCFullYear(),\n date.getUTCMonth() + tf.count,\n date.getUTCDate(),\n date.getUTCHours(),\n date.getUTCMinutes(),\n );\n }\n second = formatCountdown(end - Date.now(), l);\n }\n axisLabel(\n ctx,\n yOf(price.scale, lastClose),\n priceAxisText(lastClose),\n lastColor,\n textOn(lastColor),\n second,\n );\n }\n\n // replay: the badge, or the picking of the first bar (at the bottom of\n // the price pane: the legends cover its top)\n const badgeY = price.top + price.height - 32;\n if (replayPicking) {\n const x = pointer && pointer.x <= plotW ? pointer.x : NaN;\n if (finite(x)) {\n ctx.fillStyle = toCss(theme.background, 0.62);\n ctx.fillRect(x, 0, plotW - x, plotH);\n ctx.strokeStyle = css(PRIMARY);\n ctx.lineWidth = 1.5;\n ctx.beginPath();\n ctx.moveTo(Math.round(x) + 0.5, 0);\n ctx.lineTo(Math.round(x) + 0.5, plotH);\n ctx.stroke();\n }\n pill(ctx, l.replayHint, plotW / 2, badgeY, css(PRIMARY));\n } else if (replay && count) {\n pill(\n ctx,\n fill(l.replay, {\n time: formatCrosshairTime(\n shift(store.time[count - 1]),\n tfMs(),\n locale,\n ),\n }),\n plotW / 2,\n badgeY,\n css(PRIMARY),\n );\n }\n\n // keyboard order entry: the armed order and the keys to use\n if (keyOrder && count) {\n if (keyOrder.kind === \"create\") {\n const color = keyOrder.side === \"buy\" ? upC : downC;\n const y = Math.round(yOf(price.scale, keyOrder.price)) + 0.5;\n if (finite(y) && y >= price.top && y <= price.top + price.height) {\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = 1.5;\n ctx.setLineDash([6, 4]);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n ctx.stroke();\n ctx.restore();\n pill(\n ctx,\n fill(keyOrder.side === \"buy\" ? l.buyLimit : l.sellLimit, {\n price: formatPrice(keyOrder.price),\n }),\n plotW - 56,\n clamp(y - 11, price.top + 2, price.top + price.height - 24),\n color,\n \"right\",\n );\n axisLabel(\n ctx,\n y,\n priceAxisText(keyOrder.price),\n color,\n textOn(color),\n );\n }\n }\n // the keys to use, on the left: order labels sit on the right\n if (!replay && !replayPicking)\n pill(ctx, l.orderHint, 8, badgeY, toCss(theme.text, 0.86), \"left\");\n }\n\n // crosshair\n const cross = crosshairState();\n if (cross && v && !replayPicking) {\n const x = Math.round(xOf(cross.index)) + 0.5;\n ctx.save();\n ctx.strokeStyle = toCss(theme.textMuted, 0.75);\n ctx.lineWidth = 1;\n ctx.setLineDash([4, 3]);\n ctx.beginPath();\n if (x >= 0 && x <= plotW) {\n ctx.moveTo(x, 0);\n ctx.lineTo(x, plotH);\n }\n const y = Math.round(cross.y) + 0.5;\n if (\n finite(y) &&\n y >= cross.pane.top &&\n y <= cross.pane.top + cross.pane.height\n ) {\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n }\n ctx.stroke();\n ctx.restore();\n const labelBg = toCss(theme.text);\n if (\n finite(cross.y) &&\n cross.y >= cross.pane.top &&\n cross.y <= cross.pane.top + cross.pane.height\n ) {\n const scaled = scaledAt(cross.pane.scale, cross.y);\n const textValue =\n cross.pane.id === PRICE\n ? priceAxisText(fromScaled(cross.pane.scale, scaled))\n : paneTickText(cross.pane, scaled);\n axisLabel(ctx, cross.y, textValue, labelBg, bgCss);\n }\n if (x >= 0 && x <= plotW && count) {\n const label = formatCrosshairTime(\n shift(timeAt(cross.index)),\n tfMs(),\n locale,\n );\n ctx.font = font(theme.fontSize, 500);\n const w = ctx.measureText(label).width + 16;\n const left = clamp(x - w / 2, 0, width - w);\n roundRect(ctx, left, plotH + 3, w, 21, 3);\n ctx.fillStyle = labelBg;\n ctx.fill();\n ctx.fillStyle = bgCss;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(label, left + w / 2, plotH + 14);\n }\n // order entry: a \"+\" at the crosshair price\n if (\n options.orderEntry &&\n pointer &&\n cross.pane.id === PRICE &&\n finite(cross.y) &&\n tool === \"cursor\" &&\n !gesture &&\n count\n ) {\n const size = 18;\n const bx = plotW - size - 4;\n const by = clamp(\n Math.round(cross.y - size / 2),\n price.top + 1,\n price.top + price.height - size - 1,\n );\n const orderPrice = roundPrice(cross.price);\n const side = orderPrice < lastClose ? \"buy\" : \"sell\";\n const hover = canvasButton(bx, by, size, size, () =>\n emit(\"orderCreate\", { price: orderPrice, side }),\n );\n roundRect(ctx, bx, by, size, size, 4);\n ctx.fillStyle = hover ? css(PRIMARY) : labelBg;\n ctx.fill();\n ctx.strokeStyle = hover ? textOn(css(PRIMARY)) : bgCss;\n ctx.lineWidth = 1.5;\n ctx.beginPath();\n ctx.moveTo(bx + 5, by + size / 2);\n ctx.lineTo(bx + size - 5, by + size / 2);\n ctx.moveTo(bx + size / 2, by + 5);\n ctx.lineTo(bx + size / 2, by + size - 5);\n ctx.stroke();\n if (hover) {\n pill(\n ctx,\n fill(side === \"buy\" ? l.buyLimit : l.sellLimit, {\n price: formatPrice(orderPrice),\n }),\n bx - 6,\n by - 2,\n side === \"buy\" ? upC : downC,\n \"right\",\n );\n }\n }\n }\n };\n\n // -------------------------------------------------------------- legends\n\n let legendKey = \"\";\n /** Rows of the legend of the price pane (labels painted under them are moved) */\n let priceLegend: { right: number; top: number; bottom: number }[] = [];\n const legendRows = new Map<string, LegendRow>();\n const legendBoxes = new Map<string, HTMLDivElement>();\n\n const legendBox = (id: string) => {\n let box = legendBoxes.get(id);\n if (!box) {\n // narrow charts: rows wrap, long items are cut with an ellipsis and\n // the rows that do not fit in the pane are hidden\n box = make(\"div\", {\n position: \"absolute\",\n left: \"4px\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n gap: \"1px\",\n maxWidth: \"calc(100% - 12px)\",\n overflow: \"hidden\",\n fontSize: \"12px\",\n lineHeight: \"18px\",\n fontVariantNumeric: \"tabular-nums\",\n whiteSpace: \"nowrap\",\n pointerEvents: \"none\",\n });\n legends.appendChild(box);\n legendBoxes.set(id, box);\n }\n return box;\n };\n\n const legendRow = (\n box: HTMLDivElement,\n title: string,\n study: Study | null,\n outputs: number,\n ) => {\n const row = make(\"div\", {\n display: \"flex\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n columnGap: \"6px\",\n maxWidth: \"100%\",\n minWidth: \"0\",\n boxSizing: \"border-box\",\n padding: \"0 4px\",\n borderRadius: \"4px\",\n background:\n \"color-mix(in srgb, var(--surface-color, var(--background-color, #fff)) 86%, transparent)\",\n });\n let button: HTMLButtonElement | null = null;\n if (study) {\n button = make(\"button\", {\n all: \"unset\",\n cursor: \"pointer\",\n pointerEvents: \"auto\",\n color: \"var(--text-color, #1f2937)\",\n fontWeight: \"500\",\n borderRadius: \"3px\",\n ...ELLIPSIS,\n });\n button.type = \"button\";\n button.textContent = title;\n button.setAttribute(\n \"aria-label\",\n fill(labels().toggleIndicator, { name: title }),\n );\n button.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n const next = !isVisible(study);\n visibility.set(study.id, next);\n emit(\"indicatorToggle\", { id: study.id, visible: next });\n updateLegends();\n invalidate();\n });\n button.addEventListener(\"pointerdown\", (event) =>\n event.stopPropagation(),\n );\n row.appendChild(button);\n } else if (title) {\n const label = make(\"span\", { fontWeight: \"600\", ...ELLIPSIS });\n label.textContent = title;\n row.appendChild(label);\n }\n const values: HTMLSpanElement[] = [];\n for (let i = 0; i < outputs; i++) {\n const span = make(\"span\", ELLIPSIS);\n row.appendChild(span);\n values.push(span);\n }\n box.appendChild(row);\n return { row, values, button };\n };\n\n const buildLegends = () => {\n legendRows.clear();\n for (const box of legendBoxes.values()) box.remove();\n legendBoxes.clear();\n if (options.legend === false) return;\n const priceBox = legendBox(PRICE);\n const head = [\n options.symbol,\n options.labels?.timeframe ??\n (typeof options.timeframe === \"string\" ? options.timeframe : \"\"),\n ]\n .filter(Boolean)\n .join(\" · \");\n legendRows.set(\"ohlc\", legendRow(priceBox, head, null, 1));\n for (const study of studies) {\n const slots = study.mergeLegend ? 1 : study.outputs.length;\n if (study.overlay && study.type === \"volume\") {\n legendRows.set(study.id, legendRow(priceBox, titleOf(study), study, 1));\n } else if (study.overlay) {\n legendRows.set(\n study.id,\n legendRow(priceBox, titleOf(study), study, slots),\n );\n }\n }\n for (const c of compares)\n legendRows.set(`compare:${c.id}`, legendRow(priceBox, \"\", null, 1));\n for (const study of studies) {\n if (study.overlay) continue;\n legendRows.set(\n study.id,\n legendRow(\n legendBox(study.id),\n titleOf(study),\n study,\n study.mergeLegend ? 1 : study.outputs.length,\n ),\n );\n }\n };\n\n /** Legend title: indicator abbreviations, but words for the volume and some indicators */\n const titleOf = (study: Study) =>\n study.type === \"volume\"\n ? labels().volume\n : study.titleKey\n ? `${labels()[study.titleKey]} ${study.title}`\n : study.title;\n\n const setSpan = (\n span: HTMLSpanElement | undefined,\n text: string,\n color?: string,\n ) => {\n if (!span) return;\n if (span.textContent !== text) span.textContent = text;\n const c = color ?? \"\";\n if (span.style.color !== c) span.style.color = c;\n };\n\n const updateLegends = () => {\n const key = [\n options.legend !== false,\n options.symbol,\n options.timeframe,\n ...studies.map((s) => `${s.id}:${titleOf(s)}:${s.outputs.length}`),\n ...compares.map((c) => c.id),\n texts.toggleIndicator,\n options.labels?.timeframe,\n ].join(\"|\");\n if (key !== legendKey) {\n legendKey = key;\n buildLegends();\n }\n if (options.legend === false) return;\n for (const pane of panes) {\n const box = legendBoxes.get(pane.id);\n if (!box) continue;\n box.style.top = `${pane.top + 6}px`;\n // over the plot only, never over the price axis nor the next pane\n const maxWidth = `${Math.max(60, Math.floor(plotW - 10))}px`;\n if (box.style.maxWidth !== maxWidth) box.style.maxWidth = maxWidth;\n const maxHeight = `${Math.max(18, Math.floor(pane.height - 10))}px`;\n if (box.style.maxHeight !== maxHeight) box.style.maxHeight = maxHeight;\n }\n const priceBox = legendBoxes.get(PRICE);\n const measured = priceBox\n ? Array.from(\n priceBox.children as HTMLCollectionOf<HTMLElement>,\n (row) => ({\n right: priceBox.offsetLeft + row.offsetLeft + row.offsetWidth,\n top: priceBox.offsetTop + row.offsetTop,\n bottom: priceBox.offsetTop + row.offsetTop + row.offsetHeight,\n }),\n )\n : [];\n // the labels avoiding the legend were painted with the previous layout\n // (a resize wraps the rows differently): paint them again\n const moved =\n measured.length !== priceLegend.length ||\n measured.some((row, i) => {\n const before = priceLegend[i];\n return (\n !before ||\n before.right !== row.right ||\n before.top !== row.top ||\n before.bottom !== row.bottom\n );\n });\n priceLegend = measured;\n if (moved) invalidate();\n const count = n();\n const cross = crosshairState();\n const index = clamp(\n cross && cross.index >= 0 && cross.index < count\n ? cross.index\n : count - 1,\n 0,\n Math.max(0, count - 1),\n );\n const l = labels();\n const ohlc = legendRows.get(\"ohlc\");\n const upC = css(upCss());\n const downC = css(downCss());\n if (ohlc && count) {\n const d = display();\n const o = d.open[index];\n const c = d.close[index];\n const prevClose = index > 0 ? d.close[index - 1] : o;\n const change = c - prevClose;\n const color = c >= o ? upC : downC;\n const span = ohlc.values[0];\n const html = [\n [l.open, d.open[index]],\n [l.high, d.high[index]],\n [l.low, d.low[index]],\n [l.close, c],\n ]\n .map(\n ([name, value]) =>\n `<span style=\"${PAIR}\"><span style=\"color:var(--text-secondary-color,#6b7280)\">${escapeHtml(String(name))}</span><span style=\"color:${color}\">${escapeHtml(formatPrice(value as number))}</span></span>`,\n )\n .join(\"\");\n const pct = prevClose ? (change / prevClose) * 100 : NaN;\n const changeName = l.change\n ? `<span style=\"color:var(--text-secondary-color,#6b7280)\">${escapeHtml(l.change)}</span>`\n : \"\";\n const changeHtml = `<span style=\"${PAIR}\">${changeName}<span style=\"color:${change >= 0 ? upC : downC}\">${change >= 0 ? \"+\" : \"−\"}${escapeHtml(formatPrice(Math.abs(change)))} (${escapeHtml(formatPercent(pct, locale))})</span></span>`;\n const vol = store.hasVolume\n ? `<span style=\"${PAIR}\"><span style=\"color:var(--text-secondary-color,#6b7280)\">${escapeHtml(l.volume)}</span>${escapeHtml(formatVolume(store.volume[index], locale))}</span>`\n : \"\";\n const next = `${html}${changeHtml}${vol}`;\n if (span && span.dataset.html !== next) {\n span.innerHTML = next;\n span.dataset.html = next;\n span.style.display = \"inline-flex\";\n span.style.columnGap = \"6px\";\n span.style.flexWrap = \"wrap\";\n }\n }\n for (const study of studies) {\n const row = legendRows.get(study.id);\n if (!row) continue;\n const shown = isVisible(study);\n row.row.style.opacity = shown ? \"1\" : \"0.5\";\n if (row.button) {\n row.button.setAttribute(\"aria-pressed\", String(shown));\n row.button.style.textDecoration = shown ? \"none\" : \"line-through\";\n }\n const slots = study.outputs.length;\n if (study.mergeLegend) {\n // one value: the output in use (SuperTrend up or down)\n const out = study.outputs.find((o) => finite(o.values[index]));\n setSpan(\n row.values[0],\n shown && count && out ? studyValueText(study, out.values[index]) : \"\",\n out ? css(colorOf(out.color)) : undefined,\n );\n continue;\n }\n study.outputs.forEach((out, i) => {\n // the MACD histogram (drawn first, under the lines) is listed last\n const span =\n row.values[study.type === \"macd\" ? (i + slots - 1) % slots : i];\n if (!shown || !count) {\n setSpan(span, \"\");\n return;\n }\n if (out.kind === \"volume\") {\n const c = store.close[index] >= store.open[index] ? upC : downC;\n setSpan(span, formatVolume(store.volume[index], locale), c);\n return;\n }\n // a shifted output shows the value drawn at this bar\n const source = index - out.shift;\n const value = source >= 0 && source < count ? out.values[source] : NaN;\n let color = out.color ? css(colorOf(out.color)) : undefined;\n if (out.kind === \"histogram\") color = value >= 0 ? upC : downC;\n if (out.kind === \"dots\" && !out.color)\n color = value <= store.close[index] ? upC : downC;\n const prefix =\n study.outputs.length > 1 && !study.plainLegend ? `${out.label} ` : \"\";\n setSpan(span, `${prefix}${studyValueText(study, value)}`, color);\n });\n }\n for (const c of compares) {\n const row = legendRows.get(`compare:${c.id}`);\n if (!row) continue;\n const value = c.values[index];\n const base = compareBase(c);\n const pct = finite(base) ? (value / base - 1) * 100 : NaN;\n setSpan(\n row.values[0],\n `${c.name} ${formatPrice(value)} ${formatPercent(pct, locale)}`,\n css(c.color),\n );\n }\n };\n\n const escapeHtml = (text: string) =>\n text.replace(/[&<>\"]/g, (ch) =>\n ch === \"&\"\n ? \"&\"\n : ch === \"<\"\n ? \"<\"\n : ch === \">\"\n ? \">\"\n : \""\",\n );\n\n // ---------------------------------------------------------------- frame\n\n const invalidate = () => {\n if (destroyed || frameId) return;\n frameId = win?.requestAnimationFrame\n ? win.requestAnimationFrame(frame)\n : (setTimeout(() => frame(Date.now()), 16) as unknown as number);\n };\n\n const animate = (now: number) => {\n let active = false;\n if (scrollAnim) {\n const t = Math.min(1, (now - scrollAnim.start) / 320);\n const eased = 1 - (1 - t) ** 3;\n right = scrollAnim.from + (scrollAnim.to - scrollAnim.from) * eased;\n if (t >= 1) scrollAnim = null;\n else active = true;\n }\n if (kinetic) {\n const dt = Math.min(64, now - kinetic.t);\n kinetic.t = now;\n const before = right;\n right -= (kinetic.v * dt) / spacing;\n kinetic.v *= Math.exp(-dt / 320);\n clampView();\n if (Math.abs(kinetic.v) < 0.02 || right === before) kinetic = null;\n else active = true;\n }\n return active;\n };\n\n const measureAxis = (ctx: CanvasRenderingContext2D) => {\n ctx.font = font(theme.fontSize, 500);\n let widest = 0;\n for (const pane of panes) {\n for (const t of pane.ticks)\n widest = Math.max(widest, ctx.measureText(paneTickText(pane, t)).width);\n }\n const count = n();\n if (count) {\n widest = Math.max(\n widest,\n ctx.measureText(priceAxisText(store.close[count - 1])).width,\n );\n if (options.countdown)\n widest = Math.max(widest, ctx.measureText(\"00:00:00\").width);\n }\n const wanted = Math.max(MIN_AXIS, Math.ceil(widest + 18));\n // shrink only when clearly narrower (no jitter while the price moves)\n if (wanted > axisW || wanted < axisW - 12) axisW = wanted;\n };\n\n function frame(now?: number) {\n frameId = 0;\n if (destroyed) return;\n width = root.clientWidth;\n height = root.clientHeight;\n if (width <= 0 || height <= 0) return;\n const time = now ?? Date.now();\n const animating = animate(\n typeof performance !== \"undefined\" ? performance.now() : time,\n );\n const dpr = win?.devicePixelRatio || 1;\n syncDerived();\n sizeCanvas(background, dpr);\n sizeCanvas(foreground, dpr);\n const bg = background.getContext(\"2d\");\n const fg = foreground.getContext(\"2d\");\n plotH = Math.max(1, height - TIME_AXIS);\n for (let pass = 0; pass < 2; pass++) {\n plotW = Math.max(1, width - axisW);\n layoutPanes();\n if (pendingRange) applyRange(pendingRange);\n clampView();\n vis = computeVisible();\n autoscale(vis);\n for (const pane of panes) {\n const ticks = scaleTicks(pane.scale, pane.id === PRICE ? 44 : 30);\n // fixed-range panes (RSI) label their bands and their middle\n const range = pane.study?.range;\n const bands = pane.study?.bands;\n pane.ticks =\n range && bands\n ? [...bands, (range[0] + range[1]) / 2].sort((a, b) => a - b)\n : ticks.scaled;\n pane.step = ticks.step;\n }\n const before = axisW;\n if (fg) measureAxis(fg);\n if (axisW === before) break;\n }\n const v = vis;\n pendingRange = null;\n const ticks = fg ? timeTicks(v, fg) : [];\n renderData(v, dpr);\n if (bg) {\n bg.setTransform(dpr, 0, 0, dpr, 0, 0);\n bg.clearRect(0, 0, width, height);\n paintBackground(bg, v, ticks);\n }\n if (fg) {\n fg.setTransform(dpr, 0, 0, dpr, 0, 0);\n fg.clearRect(0, 0, width, height);\n paintForeground(fg, v, ticks);\n }\n updateLegends();\n updateJump();\n updateToolbar();\n positionEditor();\n emitView();\n // buttons painted this frame may now be under the pointer\n if (\n pointer &&\n !gesture &&\n buttonAt(pointer.x, pointer.y) !== hoveredButton\n ) {\n updateCursor(pointer.x, pointer.y);\n invalidate();\n }\n if (animating) invalidate();\n }\n\n const updateJump = () => {\n const count = n();\n const price = panes[0];\n const show = count > 0 && price && xOf(count - 1) > plotW + spacing * 0.5;\n jump.style.display = show ? \"flex\" : \"none\";\n if (show && price) {\n jump.style.left = `${plotW - 40}px`;\n jump.style.top = `${price.top + price.height - 40}px`;\n const text = labels().scrollToRealtime;\n if (jump.getAttribute(\"aria-label\") !== text) {\n jump.setAttribute(\"aria-label\", text);\n jump.title = text;\n }\n }\n };\n\n const visibleRange = (): TradingVisibleRange => {\n const from = right - plotW / spacing;\n return { from, to: right, fromTime: timeAt(from), toTime: timeAt(right) };\n };\n\n const emitView = () => {\n const count = n();\n if (!count) return;\n const range = visibleRange();\n if (\n !lastRange ||\n Math.abs(lastRange.from - range.from) > 1e-6 ||\n Math.abs(lastRange.to - range.to) > 1e-6\n ) {\n lastRange = range;\n if (!silentRange) emit(\"visibleRangeChange\", range);\n }\n silentRange = false;\n if (range.from < 10 && historyFirst !== store.time[0]) {\n historyFirst = store.time[0];\n emit(\"historyRequest\", { firstTime: store.time[0], count });\n }\n const cross = crosshairState();\n // a crosshair set by `setCrosshair` is not reported\n const own = cross && (pointer || keyboardIndex !== null) ? cross : null;\n const key = own ? `${own.index}|${own.price}|${own.pane.id}` : \"\";\n if (key !== lastCrosshair) {\n lastCrosshair = key;\n if (!own) {\n emit(\"crosshairMove\", null);\n } else {\n const event: TradingCrosshairEvent = {\n index: own.index,\n time: timeAt(own.index),\n bar:\n own.index >= 0 && own.index < count\n ? readBar(store, own.index)\n : null,\n price: own.price,\n pane: own.pane.id,\n x: xOf(own.index),\n y: own.y,\n };\n emit(\"crosshairMove\", event);\n }\n }\n };\n\n // ---------------------------------------------------------- interaction\n\n const local = (event: { clientX: number; clientY: number }) => {\n const rect = root.getBoundingClientRect();\n return { x: event.clientX - rect.left, y: event.clientY - rect.top };\n };\n\n const applyRange = (range: { from: number; to: number }) => {\n spacing = plotW / (range.to - range.from);\n right = range.to;\n clampView();\n };\n\n /**\n * Zooms around `x`; while the latest bar is in view it stays where it is\n * (the reader is following the market), like the price scale side of\n * trading terminals\n */\n const zoomAt = (x: number, factor: number) => {\n const count = n();\n if (count && followsRealtime()) x = Math.min(plotW, xOf(count - 1));\n const anchor = indexAt(x);\n spacing = spacing * factor;\n clampView();\n right = anchor + (plotW - x) / spacing;\n clampView();\n kinetic = null;\n scrollAnim = null;\n invalidate();\n };\n\n const anchorAt = (x: number, y: number, pane: Pane): TradingDrawingPoint => {\n const index = Math.round(indexAt(x));\n return { time: timeAt(index), price: valueAt(pane.scale, y) };\n };\n\n const setTool = (next: TradingDrawingTool, notify: boolean) => {\n if (next === tool) return;\n tool = next;\n draft = null;\n draftClicks = 0;\n if (notify) emit(\"drawingToolChange\", next);\n invalidate();\n };\n\n const select = (id: string | null) => {\n if (id === selected) return;\n selected = id;\n paletteOpen = false;\n emit(\"drawingSelect\", id);\n invalidate();\n };\n\n // ------------------------------------------------------ drawing history\n\n const undoState = (): TradingUndoState => ({\n canUndo: undoStack.length > 0,\n canRedo: redoStack.length > 0,\n });\n\n const emitUndo = () => {\n const state = undoState();\n const key = `${state.canUndo}|${state.canRedo}`;\n if (key === undoKey) return;\n undoKey = key;\n emit(\"undoChange\", state);\n };\n\n /** Records a change of the drawings: undoable, and reported unless `notify` is false */\n const commitDrawings = (next: readonly TradingDrawing[], notify = true) => {\n if (next !== committed) {\n undoStack.push(committed);\n if (undoStack.length > HISTORY_LIMIT) undoStack.shift();\n redoStack.length = 0;\n committed = next;\n }\n drawings = next;\n if (notify) {\n emittedDrawings = next;\n emit(\"drawingsChange\", next);\n }\n if (selected && !next.some((d) => d.id === selected)) select(null);\n emitUndo();\n invalidate();\n };\n\n /** Shows drawings of the history (undo / redo) */\n const restoreDrawings = (next: readonly TradingDrawing[]) => {\n committed = next;\n drawings = next;\n emittedDrawings = next;\n draft = null;\n if (selected && !next.some((d) => d.id === selected)) select(null);\n emit(\"drawingsChange\", next);\n emitUndo();\n invalidate();\n };\n\n const undo = () => {\n const previous = undoStack.pop();\n if (!previous) return;\n if (editing) closeEditor(false);\n redoStack.push(committed);\n restoreDrawings(previous);\n };\n\n const redo = () => {\n const next = redoStack.pop();\n if (!next) return;\n undoStack.push(committed);\n restoreDrawings(next);\n };\n\n const updateDrawing = (id: string, patch: TradingDrawingPatch) => {\n if (!drawings.some((d) => d.id === id)) return;\n commitDrawings(\n drawings.map((d) =>\n d.id === id ? { ...d, ...patch, id: d.id, type: d.type } : d,\n ),\n );\n };\n\n const removeDrawing = (id: string) => {\n if (!drawings.some((d) => d.id === id)) return;\n if (selected === id) select(null);\n commitDrawings(drawings.filter((d) => d.id !== id));\n };\n\n /** Default target and stop of a new position: a reward twice the risk */\n const positionPoints = (\n entry: TradingDrawingPoint,\n pane: Pane,\n long: boolean,\n ): TradingDrawingPoint[] => {\n const y = yOf(pane.scale, entry.price);\n const risk = Math.max(12, pane.height * 0.07);\n const target = valueAt(pane.scale, y + (long ? -2 : 2) * risk);\n const stop = valueAt(pane.scale, y + (long ? 1 : -1) * risk);\n const bars = Math.max(6, Math.round((plotW * 0.16) / spacing));\n const end = timeAt(Math.round(indexOfTimeExt(entry.time)) + bars);\n return [\n entry,\n { time: end, price: roundPrice(target) },\n { time: end, price: roundPrice(stop) },\n ];\n };\n\n const finishDraft = () => {\n if (!draft) return;\n const done = draft;\n draft = null;\n draftClicks = 0;\n commitDrawings([...drawings, done]);\n select(done.id);\n if (!options.keepDrawingMode) setTool(\"cursor\", true);\n if (done.type === \"text\") openEditor(done.id, true);\n };\n\n /** Fixes the anchor following the pointer; the drawing is done after its last anchor */\n const fixDraftAnchor = () => {\n if (!draft) return;\n draftClicks--;\n if (draftClicks <= 0) {\n finishDraft();\n return;\n }\n const last = draft.points[draft.points.length - 1];\n if (last) draft = { ...draft, points: [...draft.points, last] };\n };\n\n /** Moves the anchor of the drawing being made to the pointer */\n const followDraft = (x: number, y: number) => {\n const pane = paneOf(draftPane);\n if (!draft || !pane || draftClicks <= 0) return;\n draft = {\n ...draft,\n points: [...draft.points.slice(0, -1), anchorAt(x, y, pane)],\n };\n };\n\n const hitLine = (x: number, y: number) => {\n const price = panes[0];\n if (!price || x > plotW) return null;\n for (const line of options.priceLines ?? []) {\n if (!line.draggable) continue;\n if (Math.abs(yOf(price.scale, linePrice(line)) - y) <= 5) return line;\n }\n return null;\n };\n\n const hitDrawingAt = (x: number, y: number) => {\n if (x > plotW) return null;\n const pane = paneAt(y);\n const mapper = drawingMapper(pane);\n if (!pane || !mapper) return null;\n for (let i = drawings.length - 1; i >= 0; i--) {\n const drawing = drawings[i];\n if (!drawing || (drawing.pane ?? PRICE) !== pane.id) continue;\n const hit = hitDrawing(\n drawing,\n mapper,\n { x, y },\n 6,\n textBoxes.get(drawing.id),\n );\n if (hit) return { drawing, hit, pane };\n }\n return null;\n };\n\n const buttonAt = (x: number, y: number) =>\n canvasButtons.findIndex(\n (b) => x >= b.x && x <= b.x + b.w && y >= b.y && y <= b.y + b.h,\n );\n\n const separatorAt = (y: number) => {\n for (let i = 1; i < panes.length; i++) {\n if (Math.abs(panes[i].top - y) <= 4) return i;\n }\n return -1;\n };\n\n // --------------------------------------------------------- text editor\n\n const autosizeEditor = () => {\n editor.style.height = \"auto\";\n editor.style.height = `${Math.max(28, editor.scrollHeight + 2)}px`;\n };\n\n const positionEditor = () => {\n if (!editing) return;\n const id = editing.id;\n const drawing = drawings.find((d) => d.id === id);\n const pane = drawing ? paneOf(drawing.pane) : null;\n const anchor = drawing?.points[0];\n if (!drawing || !pane || !anchor) return;\n const x = xOf(indexOfTimeExt(anchor.time));\n const y = yOf(pane.scale, anchor.price);\n editor.style.left = `${clamp(x, 2, Math.max(2, plotW - 160))}px`;\n editor.style.top = `${clamp(y, 2, Math.max(2, plotH - 40))}px`;\n };\n\n function openEditor(id: string, created: boolean) {\n const drawing = drawings.find((d) => d.id === id);\n if (!drawing || drawing.locked) return;\n editing = { id, created };\n editor.value = created ? \"\" : (drawing.text ?? \"\");\n editor.placeholder = labels().text;\n editor.setAttribute(\"aria-label\", labels().editText);\n editor.style.display = \"block\";\n positionEditor();\n autosizeEditor();\n editor.focus();\n editor.select();\n invalidate();\n }\n\n function closeEditor(commit: boolean) {\n if (!editing) return;\n const { id, created } = editing;\n editing = null;\n editor.style.display = \"none\";\n const text = editor.value.replace(/\\s+$/, \"\");\n const drawing = drawings.find((d) => d.id === id);\n if (drawing && created && (!commit || !text)) {\n // a new text left empty or cancelled: as if it had never been made\n const previous = undoStack.pop();\n restoreDrawings(previous ?? drawings.filter((d) => d.id !== id));\n } else if (drawing && commit && text !== (drawing.text ?? \"\")) {\n if (created) {\n // the text completes the creation (a single undo step)\n const next = drawings.map((d) => (d.id === id ? { ...d, text } : d));\n committed = next;\n drawings = next;\n emittedDrawings = next;\n emit(\"drawingsChange\", next);\n } else {\n updateDrawing(id, { text });\n }\n }\n if (doc.activeElement === editor || doc.activeElement === doc.body)\n root.focus();\n invalidate();\n }\n\n editor.addEventListener(\"keydown\", (event) => {\n event.stopPropagation();\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n closeEditor(true);\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n closeEditor(false);\n }\n });\n editor.addEventListener(\"input\", autosizeEditor);\n editor.addEventListener(\"blur\", () => closeEditor(true));\n editor.addEventListener(\"pointerdown\", (event) => event.stopPropagation());\n editor.addEventListener(\"dblclick\", (event) => event.stopPropagation());\n\n // ------------------------------------------------------ drawing toolbar\n\n const icon = (path: string, dash = \"\", width = 1.5) =>\n `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"${width}\" stroke-linecap=\"round\" stroke-linejoin=\"round\"${dash ? ` stroke-dasharray=\"${dash}\"` : \"\"} aria-hidden=\"true\"><path d=\"${path}\"/></svg>`;\n\n const toolbarButton = (\n label: string,\n content: string,\n onClick: () => void,\n pressed?: boolean,\n ) => {\n const button = doc.createElement(\"button\");\n button.type = \"button\";\n button.setAttribute(\"aria-label\", label);\n button.title = label;\n if (pressed !== undefined)\n button.setAttribute(\"aria-pressed\", String(pressed));\n button.innerHTML = content;\n button.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n onClick();\n });\n return button;\n };\n\n const separator = () => {\n const span = doc.createElement(\"span\");\n span.className = \"sep\";\n return span;\n };\n\n const buildToolbar = (drawing: TradingDrawing) => {\n toolbar.textContent = \"\";\n const l = labels();\n toolbar.setAttribute(\"aria-label\", l.lineStyle);\n const id = drawing.id;\n const items: HTMLElement[] = [];\n if (!drawing.locked) {\n const color = css(drawing.color ?? PRIMARY);\n const swatch = toolbarButton(\n l.color,\n `<span style=\"display:block;width:14px;height:14px;border-radius:50%;background:${color};box-shadow:inset 0 0 0 1px rgba(127,127,127,.35)\"></span>`,\n () => {\n paletteOpen = !paletteOpen;\n toolbarKey = \"\";\n updateToolbar();\n },\n );\n swatch.setAttribute(\"aria-expanded\", String(paletteOpen));\n items.push(swatch);\n const width = drawing.lineWidth ?? 1.5;\n const widths = [1, 2, 3, 4];\n items.push(\n toolbarButton(\n `${l.lineWidth}: ${width}px`,\n `${icon(\"M2 8h12\", \"\", Math.min(4, width))}<span style=\"font-size:11px;margin-left:3px\">${width}</span>`,\n () =>\n updateDrawing(id, {\n lineWidth: widths.find((w) => w > width) ?? widths[0],\n }),\n ),\n );\n const lineStyle = drawing.lineStyle ?? \"solid\";\n items.push(\n toolbarButton(\n l.lineStyle,\n icon(\n \"M2 8h12\",\n lineStyle === \"dashed\"\n ? \"3.5 2.5\"\n : lineStyle === \"dotted\"\n ? \"0.1 3\"\n : \"\",\n lineStyle === \"dotted\" ? 2.2 : 1.6,\n ),\n () =>\n updateDrawing(id, {\n lineStyle:\n LINE_STYLES[\n (LINE_STYLES.indexOf(lineStyle) + 1) % LINE_STYLES.length\n ],\n }),\n ),\n );\n if (isFillable(drawing.type)) {\n items.push(\n toolbarButton(\n l.fill,\n '<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\"><rect x=\"2.5\" y=\"3.5\" width=\"11\" height=\"9\" rx=\"1.5\" fill=\"currentColor\" fill-opacity=\".3\" stroke=\"currentColor\" stroke-width=\"1.3\"/></svg>',\n () => updateDrawing(id, { fill: drawing.fill === false }),\n drawing.fill !== false,\n ),\n );\n }\n if (drawing.type === \"text\") {\n items.push(\n toolbarButton(l.editText, icon(\"M3 13h3l7-7-3-3-7 7zM9 4l3 3\"), () =>\n openEditor(id, false),\n ),\n );\n }\n items.push(separator());\n }\n items.push(\n toolbarButton(\n l.lock,\n drawing.locked\n ? icon(\"M4.5 7.5h7v6h-7zM6 7.5V5.5a2 2 0 0 1 4 0v2\")\n : icon(\"M4.5 7.5h7v6h-7zM6 7.5V5.5a2 2 0 0 1 3.8-.9\"),\n () => updateDrawing(id, { locked: !drawing.locked }),\n !!drawing.locked,\n ),\n );\n if (!drawing.locked) {\n const remove = toolbarButton(\n l.remove,\n icon(\"M3 4.5h10M6.5 4.5V3h3v1.5M4.5 4.5l.7 8.5h5.6l.7-8.5\"),\n () => removeDrawing(id),\n );\n remove.style.color = \"var(--danger-color, #f23645)\";\n items.push(remove);\n }\n toolbar.append(...items);\n if (paletteOpen && !drawing.locked) {\n const palette = make(\"div\", {\n position: \"absolute\",\n left: \"0\",\n top: \"calc(100% + 4px)\",\n display: \"flex\",\n gap: \"2px\",\n padding: \"4px\",\n borderRadius: \"8px\",\n border:\n \"1px solid color-mix(in srgb, var(--border-color, #e5e7eb) 85%, transparent)\",\n background: \"var(--surface-elevated-color, var(--surface-color, #fff))\",\n boxShadow: \"0 8px 24px -8px rgba(15, 23, 42, 0.35)\",\n });\n for (const color of PALETTE) {\n const button = toolbarButton(\n `${l.color} ${color}`,\n `<span style=\"display:block;width:16px;height:16px;border-radius:50%;background:${color}\"></span>`,\n () => {\n paletteOpen = false;\n updateDrawing(id, { color });\n },\n (drawing.color ?? \"\").toLowerCase() === color,\n );\n palette.appendChild(button);\n }\n toolbar.appendChild(palette);\n }\n };\n\n function updateToolbar() {\n const drawing = selected\n ? drawings.find((d) => d.id === selected)\n : undefined;\n const pane = drawing ? paneOf(drawing.pane) : null;\n const mapper = drawingMapper(pane);\n const dragging = gesture?.kind === \"drawing\" && gesture.moved;\n if (\n !drawing ||\n !pane ||\n !mapper ||\n options.drawingToolbar === false ||\n editing ||\n dragging ||\n draft\n ) {\n toolbar.style.display = \"none\";\n toolbarKey = \"\";\n paletteOpen = false;\n return;\n }\n const key = [\n drawing.id,\n drawing.color,\n drawing.lineWidth,\n drawing.lineStyle,\n drawing.fill,\n drawing.locked,\n paletteOpen,\n locale,\n themeVersion,\n ].join(\"|\");\n if (key !== toolbarKey) {\n toolbarKey = key;\n buildToolbar(drawing);\n }\n toolbar.style.display = \"flex\";\n // above the drawing (below it when there is no room), inside the plot\n const pts = handlePoints(drawing, mapper, textBoxes.get(drawing.id));\n const box = textBoxes.get(drawing.id);\n if (drawing.type === \"text\" && box)\n pts.push({ x: box.x + box.w, y: box.y + box.h });\n let x0 = Infinity;\n let x1 = -Infinity;\n let y0 = Infinity;\n let y1 = -Infinity;\n for (const p of pts) {\n x0 = Math.min(x0, clamp(p.x, 0, plotW));\n x1 = Math.max(x1, clamp(p.x, 0, plotW));\n y0 = Math.min(y0, clamp(p.y, pane.top, pane.top + pane.height));\n y1 = Math.max(y1, clamp(p.y, pane.top, pane.top + pane.height));\n }\n if (drawing.type === \"horizontalLine\") {\n x0 = plotW * 0.35;\n x1 = plotW * 0.65;\n }\n const w = toolbar.offsetWidth || 200;\n const h = toolbar.offsetHeight || 34;\n const left = clamp((x0 + x1) / 2 - w / 2, 4, Math.max(4, plotW - w - 4));\n let top = y0 - h - 14;\n // below, clear of the labels under the drawing (position stops, measures)\n if (top < 4) top = y1 + 32;\n toolbar.style.left = `${Math.round(left)}px`;\n toolbar.style.top = `${Math.round(clamp(top, 4, Math.max(4, plotH - h - 4)))}px`;\n }\n\n toolbar.addEventListener(\"pointerdown\", (event) => event.stopPropagation());\n toolbar.addEventListener(\"dblclick\", (event) => event.stopPropagation());\n // the chart under the toolbar is not hovered\n toolbar.addEventListener(\"pointermove\", (event) => event.stopPropagation());\n toolbar.addEventListener(\"pointerenter\", () => {\n pointer = null;\n hovered = null;\n root.style.cursor = \"default\";\n invalidate();\n });\n\n // ---------------------------------------------------------------- replay\n\n const replayState = (): TradingReplayState => ({\n active: !!replay,\n picking: replayPicking,\n playing: !!replay?.playing,\n speed: replay?.speed ?? replaySpeed,\n index: n(),\n total: replay ? replay.source.length : n(),\n time: n() ? store.time[n() - 1] : NaN,\n });\n\n const emitReplay = () => emit(\"replayChange\", replayState());\n\n const columnsOf = (from: BarStore, count: number) => ({\n time: from.time.subarray(0, count),\n open: from.open.subarray(0, count),\n high: from.high.subarray(0, count),\n low: from.low.subarray(0, count),\n close: from.close.subarray(0, count),\n volume: from.volume.subarray(0, count),\n });\n\n /** Replaces the bars of the store by the first `count` bars of `source` */\n const showBars = (source: BarStore, count: number) => {\n const hasVolume = source.hasVolume;\n storeSet(store, columnsOf(source, count));\n store.hasVolume = hasVolume;\n pyramid = createPyramid();\n haPyramid = createPyramid();\n haValid = 0;\n historyFirst = NaN;\n afterDataChange(0);\n };\n\n const stopReplayTimer = () => {\n if (replay?.timer) clearInterval(replay.timer);\n if (replay) {\n replay.timer = null;\n replay.playing = false;\n }\n };\n\n const beginReplay = (index: number) => {\n replayPicking = false;\n if (!replay) {\n if (!n()) return;\n const source = createStore();\n storeSet(source, columnsOf(store, n()));\n source.hasVolume = store.hasVolume;\n replay = { source, playing: false, speed: replaySpeed, timer: null };\n }\n stopReplayTimer();\n const shown = clamp(Math.round(index) + 1, 1, replay.source.length);\n showBars(replay.source, shown);\n right = shown - 1 + (options.rightOffset ?? 8);\n for (const scale of scales.values()) scale.auto = true;\n emitReplay();\n };\n\n const replayStepBy = (count: number) => {\n if (!replay) return;\n const source = replay.source;\n const before = n();\n const follow = followsRealtime();\n let from = -1;\n for (let i = 0; i < count && n() < source.length; i++) {\n const at = storeUpdate(store, readBar(source, n()));\n if (from < 0) from = at;\n }\n store.hasVolume = source.hasVolume;\n if (from >= 0) {\n if (follow) right += n() - before;\n afterDataChange(from);\n }\n if (n() >= source.length) stopReplayTimer();\n emitReplay();\n };\n\n const playReplay = (speed?: number) => {\n if (!replay) return;\n if (speed !== undefined && speed > 0) replay.speed = replaySpeed = speed;\n stopReplayTimer();\n if (n() >= replay.source.length) {\n emitReplay();\n return;\n }\n const interval = Math.max(16, 1000 / replay.speed);\n const perTick = Math.max(1, Math.round((replay.speed * interval) / 1000));\n replay.playing = true;\n replay.timer = setInterval(() => replayStepBy(perTick), interval);\n emitReplay();\n };\n\n /** Ends the replay; `restore` shows every bar again */\n const endReplay = (restore: boolean) => {\n const wasPicking = replayPicking;\n replayPicking = false;\n if (!replay) {\n if (wasPicking) {\n emitReplay();\n invalidate();\n }\n return;\n }\n stopReplayTimer();\n const source = replay.source;\n replay = null;\n if (restore) showBars(source, source.length);\n emitReplay();\n };\n\n // ----------------------------------------------------------- pointer\n\n const updateCursor = (x: number, y: number) => {\n let cursor = \"crosshair\";\n hoveredLine = null;\n let nextHover: string | null = null;\n const button = gesture ? -1 : buttonAt(x, y);\n if (button !== hoveredButton) hoveredButton = button;\n if (gesture?.kind === \"pan\" && gesture.moved) cursor = \"grabbing\";\n else if (button >= 0) cursor = \"pointer\";\n else if (replayPicking && x <= plotW && y <= plotH) cursor = \"pointer\";\n else if (separatorAt(y) > 0) cursor = \"row-resize\";\n else if (x > plotW && y < plotH) cursor = \"ns-resize\";\n else if (y > plotH) cursor = \"ew-resize\";\n else if (tool === \"cursor\") {\n const line = hitLine(x, y);\n if (line) {\n cursor = \"ns-resize\";\n hoveredLine = line.id;\n } else {\n const hit = hitDrawingAt(x, y);\n if (hit) {\n nextHover = hit.drawing.id;\n cursor = hit.drawing.locked\n ? \"pointer\"\n : hit.hit.part === \"handle\"\n ? \"move\"\n : \"pointer\";\n }\n }\n }\n if (nextHover !== hovered) hovered = nextHover;\n if (root.style.cursor !== cursor) root.style.cursor = cursor;\n };\n\n const onPointerDown = (event: PointerEvent) => {\n if (event.button !== 0 && event.pointerType === \"mouse\") return;\n const { x, y } = local(event);\n pointer = { x, y };\n keyboardIndex = null;\n if (keyOrder) endKeyOrder(true);\n kinetic = null;\n scrollAnim = null;\n if (editing) closeEditor(true);\n if (paletteOpen) {\n paletteOpen = false;\n invalidate();\n }\n if (event.pointerType === \"touch\") {\n touches.set(event.pointerId, { x, y });\n if (touches.size === 2) {\n const [a, b] = [...touches.values()];\n pinch = { distance: Math.hypot(a.x - b.x, a.y - b.y), spacing };\n gesture = null;\n return;\n }\n }\n try {\n root.setPointerCapture(event.pointerId);\n } catch {\n // the pointer may already be released\n }\n const button = buttonAt(x, y);\n const target = canvasButtons[button];\n if (target) {\n gesture = { kind: \"button\", action: target.action };\n return;\n }\n if (replayPicking && x <= plotW && y <= plotH) {\n beginReplay(Math.min(n() - 1, Math.round(indexAt(x))));\n return;\n }\n const sep = separatorAt(y);\n if (sep > 0) {\n const above = panes[sep - 1];\n const below = panes[sep];\n gesture = {\n kind: \"separator\",\n index: sep,\n y,\n above: above.height,\n below: below.height,\n };\n return;\n }\n if (x > plotW && y < plotH) {\n const pane = paneAt(y);\n if (pane)\n gesture = {\n kind: \"axisY\",\n pane,\n y,\n min: pane.scale.min,\n max: pane.scale.max,\n };\n return;\n }\n if (y > plotH) {\n gesture = { kind: \"axisX\", x, spacing };\n return;\n }\n const pane = paneAt(y);\n if (tool !== \"cursor\" && pane && n()) {\n if (draft) {\n // the next anchor of a click-by-click drawing\n followDraft(x, y);\n fixDraftAnchor();\n gesture = null;\n invalidate();\n return;\n }\n const type = tool;\n const position = isPosition(type);\n // positions need prices: on the price pane only\n const at = position ? panes[0] : pane;\n const point = anchorAt(x, clamp(y, at.top, at.top + at.height), at);\n const anchors = anchorCount(type);\n draftPane = at.id;\n draft = {\n id: `drawing-${Date.now().toString(36)}-${++drawingCounter}`,\n type,\n points: position\n ? positionPoints(\n { ...point, price: roundPrice(point.price) },\n at,\n type === \"longPosition\",\n )\n : anchors === 1\n ? [point]\n : [point, point],\n ...(at.id !== PRICE ? { pane: at.id } : {}),\n };\n if (anchors === 1) {\n finishDraft();\n return;\n }\n draftClicks = anchors - 1;\n gesture = { kind: \"create\", pane: at, x, y, moved: false };\n invalidate();\n return;\n }\n if (tool === \"cursor\") {\n const line = hitLine(x, y);\n if (line) {\n gesture = { kind: \"order\", line, startPrice: line.price };\n return;\n }\n const hit = hitDrawingAt(x, y);\n if (hit) {\n select(hit.drawing.id);\n if (!hit.drawing.locked) {\n gesture = {\n kind: \"drawing\",\n id: hit.drawing.id,\n pane: hit.pane,\n handle: hit.hit.part === \"handle\" ? hit.hit.index : -1,\n x,\n y,\n original: hit.drawing,\n moved: false,\n };\n }\n return;\n }\n }\n gesture = {\n kind: \"pan\",\n x,\n y,\n right,\n pane,\n moved: false,\n lastX: x,\n lastY: y,\n lastT: event.timeStamp,\n velocity: 0,\n };\n };\n\n const onPointerMove = (event: PointerEvent) => {\n const { x, y } = local(event);\n pointer = { x, y };\n if (event.pointerType === \"touch\" && touches.has(event.pointerId)) {\n touches.set(event.pointerId, { x, y });\n if (pinch && touches.size === 2) {\n const [a, b] = [...touches.values()];\n const distance = Math.hypot(a.x - b.x, a.y - b.y);\n const count = n();\n const mid =\n count && followsRealtime()\n ? Math.min(plotW, xOf(count - 1))\n : (a.x + b.x) / 2;\n const anchor = indexAt(mid);\n spacing = (pinch.spacing * distance) / Math.max(1, pinch.distance);\n clampView();\n right = anchor + (plotW - mid) / spacing;\n clampView();\n invalidate();\n return;\n }\n }\n const g = gesture;\n if (!g) {\n if (draft) followDraft(x, y);\n updateCursor(x, y);\n invalidate();\n return;\n }\n switch (g.kind) {\n case \"pan\": {\n const dx = x - g.x;\n if (!g.moved && Math.hypot(dx, y - g.y) < 3) break;\n g.moved = true;\n right = g.right - dx / spacing;\n if (g.pane && !g.pane.scale.auto) panScale(g.pane.scale, y - g.lastY);\n g.lastY = y;\n const dt = Math.max(1, event.timeStamp - g.lastT);\n g.velocity = 0.6 * ((x - g.lastX) / dt) + 0.4 * g.velocity;\n g.lastX = x;\n g.lastT = event.timeStamp;\n clampView();\n root.style.cursor = \"grabbing\";\n break;\n }\n case \"axisY\": {\n const scale = g.pane.scale;\n scale.min = g.min;\n scale.max = g.max;\n zoomScale(scale, Math.exp((y - g.y) * 0.006));\n break;\n }\n case \"axisX\": {\n const lastIndex = right;\n spacing = g.spacing * Math.exp((x - g.x) * 0.006);\n clampView();\n right = lastIndex;\n clampView();\n break;\n }\n case \"separator\": {\n const dy = y - g.y;\n const above = panes[g.index - 1];\n const below = panes[g.index];\n if (!above || !below) break;\n const total = g.above + g.below;\n const nextBelow = clamp(g.below - dy, MIN_PANE, total - MIN_PANE);\n paneHeights.set(below.id, nextBelow);\n if (above.id !== PRICE) paneHeights.set(above.id, total - nextBelow);\n break;\n }\n case \"order\": {\n lineOverrides.set(g.line.id, roundPrice(valueAt(panes[0].scale, y)));\n break;\n }\n case \"drawing\": {\n if (!g.moved && Math.hypot(x - g.x, y - g.y) < 3) break;\n g.moved = true;\n const scale = g.pane.scale;\n let points: TradingDrawingPoint[];\n if (g.handle >= 0) {\n points = moveHandle(g.original, g.handle, anchorAt(x, y, g.pane));\n } else {\n const di = Math.round(indexAt(x) - indexAt(g.x));\n const ds = scaledAt(scale, y) - scaledAt(scale, g.y);\n points = g.original.points.map((p) => ({\n time: timeAt(Math.round(indexOfTimeExt(p.time)) + di),\n price: fromScaled(scale, toScaled(scale, p.price) + ds),\n }));\n }\n drawings = drawings.map((d) => (d.id === g.id ? { ...d, points } : d));\n break;\n }\n case \"create\": {\n if (Math.hypot(x - g.x, y - g.y) >= 4) g.moved = true;\n followDraft(x, y);\n break;\n }\n default:\n updateCursor(x, y);\n break;\n }\n invalidate();\n };\n\n const onPointerUp = (event: PointerEvent) => {\n touches.delete(event.pointerId);\n if (touches.size < 2) pinch = null;\n const g = gesture;\n gesture = null;\n const { x, y } = local(event);\n if (event.pointerType === \"touch\") pointer = null;\n if (!g) {\n invalidate();\n return;\n }\n switch (g.kind) {\n case \"pan\":\n if (!g.moved) {\n if (selected) select(null);\n const pane = paneAt(y);\n if (pane && x <= plotW) {\n emit(\"click\", {\n index: Math.round(indexAt(x)),\n time: timeAt(Math.round(indexAt(x))),\n price: valueAt(pane.scale, y),\n pane: pane.id,\n });\n }\n } else if (\n options.kineticScroll !== false &&\n event.timeStamp - g.lastT < 60 &&\n Math.abs(g.velocity) > 0.25\n ) {\n kinetic = {\n v: g.velocity,\n t:\n typeof performance !== \"undefined\"\n ? performance.now()\n : Date.now(),\n };\n }\n break;\n case \"order\": {\n const next = lineOverrides.get(g.line.id);\n if (next !== undefined && next !== g.startPrice) {\n emit(\"orderMove\", {\n id: g.line.id,\n price: next,\n previousPrice: g.startPrice,\n line: g.line,\n });\n } else {\n lineOverrides.delete(g.line.id);\n }\n break;\n }\n case \"drawing\":\n if (g.moved) commitDrawings(drawings);\n break;\n case \"create\":\n // a click starts a click-by-click drawing; a drag fixes the anchor\n if (g.moved) fixDraftAnchor();\n break;\n case \"button\":\n if (buttonAt(x, y) >= 0) g.action();\n break;\n default:\n break;\n }\n updateCursor(x, y);\n invalidate();\n };\n\n const onPointerLeave = (event: PointerEvent) => {\n if (gesture || event.pointerType === \"touch\") return;\n pointer = null;\n hovered = null;\n hoveredLine = null;\n invalidate();\n };\n\n const onWheel = (event: WheelEvent) => {\n const mode = options.wheel ?? \"zoom\";\n if (mode === \"none\") return;\n const { x } = local(event);\n const unit = event.deltaMode === 1 ? 16 : event.deltaMode === 2 ? plotW : 1;\n const dx = event.deltaX * unit;\n const dy = event.deltaY * unit;\n const modifier = event.ctrlKey || event.metaKey;\n if (mode === \"modifier\" && !modifier && Math.abs(dx) <= Math.abs(dy))\n return;\n event.preventDefault();\n keyboardIndex = null;\n if (Math.abs(dx) > Math.abs(dy) || event.shiftKey) {\n right += (Math.abs(dx) > Math.abs(dy) ? dx : dy) / spacing;\n clampView();\n kinetic = null;\n invalidate();\n return;\n }\n const factor = Math.exp(-dy * (event.ctrlKey ? 0.01 : 0.0015));\n zoomAt(Math.min(x, plotW), factor);\n };\n\n const onDoubleClick = (event: MouseEvent) => {\n const { x, y } = local(event);\n const hit = tool === \"cursor\" ? hitDrawingAt(x, y) : null;\n if (hit?.drawing.type === \"text\") {\n openEditor(hit.drawing.id, false);\n return;\n }\n if (x > plotW && y < plotH) {\n const pane = paneAt(y);\n if (pane) pane.scale.auto = true;\n } else if (y > plotH) {\n spacing = options.barSpacing ?? 8;\n instance.scrollToRealtime(true);\n } else {\n for (const scale of scales.values()) scale.auto = true;\n }\n invalidate();\n };\n\n const announce = (index: number) => {\n if (index < 0 || index >= n()) return;\n const d = display();\n const l = labels();\n live.textContent = fill(l.announcement, {\n time: formatCrosshairTime(shift(store.time[index]), tfMs(), locale),\n open: formatPrice(d.open[index]),\n high: formatPrice(d.high[index]),\n low: formatPrice(d.low[index]),\n close: formatPrice(d.close[index]),\n });\n };\n\n const say = (text: string) => {\n live.textContent = text;\n };\n\n /** Price lines the keyboard can pick: draggable or cancellable ones */\n const keyLines = () =>\n (options.priceLines ?? []).filter(\n (line) => line.draggable || line.cancellable,\n );\n\n const lineTitle = (line: TradingPriceLine) => {\n const key = PRICE_LINE_TITLES[line.kind ?? \"line\"];\n return line.title ?? (key ? labels()[key] : \"\");\n };\n\n /** Leaves the keyboard order entry; `restore` puts a picked line back */\n const endKeyOrder = (restore: boolean) => {\n if (keyOrder?.kind === \"move\" && restore) {\n if (keyOrder.override === undefined) lineOverrides.delete(keyOrder.id);\n else lineOverrides.set(keyOrder.id, keyOrder.override);\n }\n keyOrder = null;\n };\n\n /** Order entry keys (`orderEntry`); returns whether the key was used */\n const onOrderKey = (event: KeyboardEvent): boolean => {\n const count = n();\n if (\n !options.orderEntry ||\n !count ||\n event.altKey ||\n event.ctrlKey ||\n event.metaKey\n )\n return false;\n const l = labels();\n const key = event.key.length === 1 ? event.key.toLowerCase() : event.key;\n const orderText = (side: \"buy\" | \"sell\", value: number) =>\n fill(side === \"buy\" ? l.buyLimit : l.sellLimit, {\n price: formatPrice(value),\n });\n if (key === \"b\" || key === \"s\") {\n endKeyOrder(true);\n const cross = crosshairState();\n const at =\n cross && cross.pane.id === PRICE && finite(cross.price)\n ? cross.price\n : store.close[count - 1];\n const side = key === \"b\" ? \"buy\" : \"sell\";\n keyOrder = { kind: \"create\", side, price: roundPrice(at) };\n say(`${orderText(side, keyOrder.price)}. ${l.orderHint}`);\n return true;\n }\n if (key === \"o\") {\n const lines = keyLines();\n if (!lines.length) return false;\n const current = keyOrder?.kind === \"move\" ? keyOrder.id : null;\n endKeyOrder(true);\n const at = lines.findIndex((line) => line.id === current);\n const step = event.shiftKey ? -1 : 1;\n const next =\n at < 0\n ? step > 0\n ? 0\n : lines.length - 1\n : (at + step + lines.length) % lines.length;\n const line = lines[next];\n if (!line) return false;\n keyOrder = {\n kind: \"move\",\n id: line.id,\n start: linePrice(line),\n override: lineOverrides.get(line.id),\n };\n const name = fill(l.orderLine, {\n title: lineTitle(line),\n price: formatPrice(linePrice(line)),\n });\n say(\n [\n name,\n line.draggable ? l.orderHint : \"\",\n line.cancellable ? l.orderCancelHint : \"\",\n ]\n .filter(Boolean)\n .join(\". \"),\n );\n return true;\n }\n if (!keyOrder) return false;\n const pickedId = keyOrder.kind === \"move\" ? keyOrder.id : null;\n const picked = (options.priceLines ?? []).find(\n (line) => line.id === pickedId,\n );\n switch (event.key) {\n case \"ArrowUp\":\n case \"ArrowDown\": {\n const tick =\n 10 ** -precision() *\n (event.shiftKey ? 10 : 1) *\n (event.key === \"ArrowUp\" ? 1 : -1);\n if (keyOrder.kind === \"create\") {\n keyOrder.price = roundPrice(keyOrder.price + tick);\n say(orderText(keyOrder.side, keyOrder.price));\n } else if (picked?.draggable) {\n const next = roundPrice(linePrice(picked) + tick);\n lineOverrides.set(picked.id, next);\n say(formatPrice(next));\n }\n return true;\n }\n case \"Enter\": {\n if (keyOrder.kind === \"create\") {\n const { price, side } = keyOrder;\n endKeyOrder(false);\n emit(\"orderCreate\", { price, side });\n say(fill(l.orderPlaced, { price: formatPrice(price) }));\n return true;\n }\n const start = keyOrder.start;\n endKeyOrder(false);\n const next = picked ? lineOverrides.get(picked.id) : undefined;\n if (picked && next !== undefined && next !== start) {\n emit(\"orderMove\", {\n id: picked.id,\n price: next,\n previousPrice: start,\n line: picked,\n });\n say(fill(l.orderPlaced, { price: formatPrice(next) }));\n }\n return true;\n }\n case \"Escape\":\n if (keyOrder.kind === \"create\") say(l.orderCancelled);\n else if (picked)\n say(\n fill(l.orderLine, {\n title: lineTitle(picked),\n price: formatPrice(keyOrder.start),\n }),\n );\n endKeyOrder(true);\n return true;\n case \"Delete\":\n case \"Backspace\":\n if (picked?.cancellable) {\n endKeyOrder(true);\n emit(\"orderCancel\", { id: picked.id, line: picked });\n say(l.orderCancelled);\n }\n return true;\n default:\n return false;\n }\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.target === root && onOrderKey(event)) {\n event.preventDefault();\n invalidate();\n return;\n }\n if ((event.ctrlKey || event.metaKey) && !event.altKey) {\n const key = event.key.toLowerCase();\n if (key === \"z\" || key === \"y\") {\n if (key === \"y\" || event.shiftKey) redo();\n else undo();\n event.preventDefault();\n }\n return;\n }\n const count = n();\n const page = Math.max(1, Math.floor(plotW / spacing / 2));\n const move = (index: number) => {\n keyboardIndex = clamp(index, 0, Math.max(0, count - 1));\n const x = xOf(keyboardIndex);\n if (x < spacing) right += (spacing - x) / spacing + 1;\n if (x > plotW - spacing) right -= (x - plotW + spacing) / spacing - 1;\n clampView();\n announce(keyboardIndex);\n };\n const current = keyboardIndex ?? Math.min(count - 1, Math.round(right));\n switch (event.key) {\n case \"ArrowLeft\":\n move(current - (event.shiftKey ? 10 : 1));\n break;\n case \"ArrowRight\":\n move(current + (event.shiftKey ? 10 : 1));\n break;\n case \"PageUp\":\n move(current - page);\n break;\n case \"PageDown\":\n move(current + page);\n break;\n case \"Home\":\n move(0);\n break;\n case \"End\":\n move(count - 1);\n instance.scrollToRealtime(true);\n break;\n case \"+\":\n case \"=\":\n case \"ArrowUp\":\n zoomAt(keyboardIndex !== null ? xOf(keyboardIndex) : plotW, 1.2);\n break;\n case \"-\":\n case \"_\":\n case \"ArrowDown\":\n zoomAt(keyboardIndex !== null ? xOf(keyboardIndex) : plotW, 1 / 1.2);\n break;\n case \"Escape\":\n if (paletteOpen) paletteOpen = false;\n else if (replayPicking) endReplay(false);\n else if (draft) {\n draft = null;\n draftClicks = 0;\n } else if (tool !== \"cursor\") setTool(\"cursor\", true);\n else if (selected) select(null);\n else keyboardIndex = null;\n break;\n case \"Delete\":\n case \"Backspace\": {\n const target = drawings.find((d) => d.id === selected);\n if (!target || target.locked) return;\n removeDrawing(target.id);\n break;\n }\n default:\n return;\n }\n event.preventDefault();\n invalidate();\n };\n\n const onFocus = () => {\n let keyboard = true;\n try {\n keyboard = root.matches(\":focus-visible\");\n } catch {\n // older engines: show the ring\n }\n if (keyboard)\n root.style.boxShadow = `inset 0 0 0 2px ${toCss(theme.primary, 0.6)}`;\n };\n const onBlur = () => {\n root.style.boxShadow = \"\";\n if (keyOrder) {\n endKeyOrder(true);\n invalidate();\n }\n if (keyboardIndex !== null) {\n keyboardIndex = null;\n invalidate();\n }\n };\n\n root.addEventListener(\"pointerdown\", onPointerDown);\n root.addEventListener(\"pointermove\", onPointerMove);\n root.addEventListener(\"pointerup\", onPointerUp);\n root.addEventListener(\"pointercancel\", onPointerUp);\n root.addEventListener(\"pointerleave\", onPointerLeave);\n root.addEventListener(\"wheel\", onWheel, { passive: false });\n root.addEventListener(\"dblclick\", onDoubleClick);\n root.addEventListener(\"keydown\", onKeyDown);\n root.addEventListener(\"focus\", onFocus);\n root.addEventListener(\"blur\", onBlur);\n jump.addEventListener(\"pointerdown\", (event) => event.stopPropagation());\n jump.addEventListener(\"click\", () => instance.scrollToRealtime(true));\n\n const resizeObserver =\n typeof ResizeObserver === \"function\"\n ? new ResizeObserver(() => invalidate())\n : null;\n resizeObserver?.observe(root);\n\n const refreshTheme = () => {\n if (destroyed) return;\n const next = readTheme(root);\n if (themeColorsChanged(theme, next)) themeVersion++;\n theme = next;\n legendKey = \"\";\n invalidate();\n };\n const unwatchTheme = watchTheme(refreshTheme);\n\n // the page language, when no `locale` is given\n let langObserver: MutationObserver | null = null;\n if (typeof MutationObserver === \"function\" && root.ownerDocument) {\n langObserver = new MutationObserver(() => {\n if (options.locale) return;\n const before = locale;\n resolveTexts();\n if (locale === before) return;\n legendKey = \"\";\n optionsVersion++;\n applyStatic();\n invalidate();\n });\n langObserver.observe(root.ownerDocument.documentElement, {\n attributes: true,\n attributeFilter: [\"lang\"],\n });\n }\n\n // ----------------------------------------------------- image, full screen\n\n /** Every layer of the chart (and the legends) drawn on one canvas */\n const compose = (): HTMLCanvasElement | null => {\n if (destroyed) return null;\n // a fresh frame: the GPU canvas is read in the same task\n if (frameId) {\n if (win?.cancelAnimationFrame) win.cancelAnimationFrame(frameId);\n else clearTimeout(frameId);\n frameId = 0;\n }\n frame();\n const dpr = win?.devicePixelRatio || 1;\n const canvas = doc.createElement(\"canvas\");\n canvas.width = Math.max(1, Math.round(width * dpr));\n canvas.height = Math.max(1, Math.round(height * dpr));\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return null;\n ctx.fillStyle = toCss(theme.background);\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n try {\n ctx.drawImage(background, 0, 0);\n if (renderer)\n ctx.drawImage(\n renderer.canvas,\n 0,\n 0,\n Math.round(plotW * dpr),\n Math.round(plotH * dpr),\n );\n ctx.drawImage(foreground, 0, 0);\n } catch {\n // a canvas that can't be read (lost context): skipped\n }\n // the legends are DOM text: written at their place\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n const origin = root.getBoundingClientRect();\n const view = win ?? null;\n legends.querySelectorAll(\"span, button\").forEach((element) => {\n const text = element.textContent ?? \"\";\n if (element.children.length || !text.trim() || !view) return;\n const rect = element.getBoundingClientRect();\n const computed = view.getComputedStyle(element);\n ctx.font = `${computed.fontWeight} ${computed.fontSize} ${computed.fontFamily}`;\n ctx.fillStyle = computed.color || toCss(theme.text);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(\n text,\n rect.left - origin.left,\n rect.top - origin.top + rect.height / 2,\n );\n });\n return canvas;\n };\n\n let fullscreen = false;\n const onFullscreen = () => {\n const next = doc.fullscreenElement === root;\n if (next === fullscreen) return;\n fullscreen = next;\n root.style.background = next ? toCss(theme.background) : \"\";\n emit(\"fullscreenChange\", next);\n invalidate();\n };\n doc.addEventListener(\"fullscreenchange\", onFullscreen);\n\n // ------------------------------------------------------------- renderer\n\n const initRenderer = async (exclude: Set<ChartRendererKind> = new Set()) => {\n const token = ++rendererToken;\n const next = await createRenderer(\n options.renderer ?? \"auto\",\n () => createDataCanvas(doc),\n (kind) => {\n if (destroyed || renderer?.kind !== kind) return;\n renderer.destroy();\n renderer.canvas.remove();\n renderer = null;\n void initRenderer(new Set([...exclude, kind]));\n },\n exclude,\n );\n if (destroyed || token !== rendererToken) {\n next?.destroy();\n return;\n }\n if (renderer) {\n renderer.destroy();\n renderer.canvas.remove();\n }\n renderer = next;\n geomKey = \"\";\n if (next) {\n root.dataset.renderer = next.kind;\n root.insertBefore(next.canvas, foreground);\n emit(\"renderer\", next.kind);\n }\n resolveReady(next?.kind ?? null);\n invalidate();\n };\n\n // ------------------------------------------------------------- options\n\n const applyStatic = () => {\n const symbol = options.symbol ?? \"\";\n root.setAttribute(\n \"aria-label\",\n options.ariaLabel ?? fill(labels().chart, { symbol }).trim(),\n );\n const wantTimer = !!options.countdown && options.lastPriceLine !== false;\n if (wantTimer && !countdownTimer)\n countdownTimer = setInterval(invalidate, 1000);\n if (!wantTimer && countdownTimer) {\n clearInterval(countdownTimer);\n countdownTimer = null;\n }\n };\n\n const applyOptions = (previous: TradingChartOptions | null) => {\n const next = options;\n resolveTexts();\n const nextZone =\n next.timeZone && isTimeZone(next.timeZone) ? next.timeZone : undefined;\n const timeChanged =\n !!previous &&\n (next.utcOffset !== previous.utcOffset || nextZone !== zone);\n zone = nextZone;\n if (!previous || next.indicators !== previous.indicators) rebuildStudies();\n // session periods (VWAP) follow the displayed time\n if (timeChanged) for (const study of studies) studyValid.set(study, 0);\n if (!previous || next.compare !== previous.compare) rebuildCompares();\n if (next.bars && (!previous || next.bars !== previous.bars)) {\n if (replay) endReplay(false);\n if (previous) applyBarsOption(next.bars);\n else replaceBars(next.bars);\n } else if (!next.bars && previous?.bars) {\n if (replay) endReplay(false);\n replaceBars([]);\n }\n if (previous && next.barSpacing !== previous.barSpacing && next.barSpacing)\n spacing = next.barSpacing;\n if (previous && next.scaleMode !== previous.scaleMode) {\n const price = scales.get(PRICE);\n if (price) price.auto = true;\n }\n if (\n next.drawings &&\n next.drawings !== emittedDrawings &&\n (!previous || next.drawings !== previous.drawings)\n ) {\n if (previous) commitDrawings(next.drawings, false);\n else drawings = committed = next.drawings;\n }\n if (\n previous &&\n (next.drawingMode ?? \"cursor\") !== (previous.drawingMode ?? \"cursor\")\n ) {\n setTool(next.drawingMode ?? \"cursor\", false);\n }\n if (previous && next.priceLines !== previous.priceLines) {\n lineOverrides.clear();\n // the picked line is gone, or its new price is the reference now\n if (keyOrder?.kind === \"move\") {\n const id = keyOrder.id;\n const line = keyLines().find((l) => l.id === id);\n keyOrder = line\n ? { kind: \"move\", id, start: line.price, override: undefined }\n : null;\n }\n }\n if (next.orderEntry) root.setAttribute(\"aria-keyshortcuts\", ORDER_KEYS);\n else {\n root.removeAttribute(\"aria-keyshortcuts\");\n if (keyOrder) endKeyOrder(true);\n }\n if (previous && next.chartStyle !== previous.chartStyle)\n haValid = Math.min(haValid, 0);\n optionsVersion++;\n applyStatic();\n invalidate();\n };\n\n applyOptions(null);\n void initRenderer();\n const unfollowDefault = followDefaultRenderer(\n () => options.renderer,\n () => void initRenderer(),\n );\n\n // ------------------------------------------------------------------ api\n\n const instance: TradingChartInstance = {\n setOptions(next) {\n if (destroyed) return;\n const previous = options;\n options = { ...next };\n applyOptions(previous);\n if ((next.renderer ?? \"auto\") !== (previous.renderer ?? \"auto\"))\n void initRenderer();\n },\n setBars(bars) {\n if (replay) endReplay(false);\n replaceBars(bars);\n },\n update(bar) {\n if (replay) {\n // the stream goes on behind the replay\n storeUpdate(replay.source, bar);\n return;\n }\n const before = n();\n const follow = followsRealtime();\n const at = storeUpdate(store, bar);\n if (at < 0) return;\n if (n() > before && follow) right += n() - before;\n afterDataChange(at);\n },\n appendBars(bars) {\n if (replay) {\n storeAppend(replay.source, bars);\n return;\n }\n const before = n();\n const follow = followsRealtime();\n const at = storeAppend(store, bars);\n if (at < 0) return;\n if (follow) right += n() - before;\n afterDataChange(at);\n },\n prependBars(bars) {\n if (replay) storePrepend(replay.source, bars);\n const added = storePrepend(store, bars);\n if (!added) return;\n pyramid = createPyramid();\n haPyramid = createPyramid();\n haValid = 0;\n right += added;\n if (keyboardIndex !== null) keyboardIndex += added;\n afterDataChange(0);\n },\n getBarCount: () => n(),\n getBar: (index) =>\n index >= 0 && index < n() ? readBar(store, Math.floor(index)) : null,\n scrollToRealtime(animateScroll = true) {\n const target = n() - 1 + (options.rightOffset ?? 8);\n kinetic = null;\n if (\n animateScroll &&\n finite(right) &&\n Math.abs(target - right) * spacing < plotW * 6\n ) {\n scrollAnim = {\n from: right,\n to: target,\n start:\n typeof performance !== \"undefined\" ? performance.now() : Date.now(),\n };\n } else {\n right = target;\n }\n invalidate();\n },\n fitContent() {\n const count = n();\n if (!count) return;\n instance.setVisibleRange({\n from: -0.5,\n to: count - 1 + (options.rightOffset ?? 8),\n });\n },\n getVisibleRange: () => visibleRange(),\n setVisibleRange({ from, to }) {\n if (!(to > from)) return;\n kinetic = null;\n scrollAnim = null;\n pendingRange = { from, to };\n applyRange(pendingRange);\n invalidate();\n },\n getVisibleTimeRange() {\n const range = visibleRange();\n return { from: timeAtFrac(range.from), to: timeAtFrac(range.to) };\n },\n setVisibleTimeRange({ from, to }) {\n if (!n() || !(to > from)) return;\n instance.setVisibleRange({\n from: indexAtTimeFrac(from),\n to: indexAtTimeFrac(to),\n });\n },\n setCrosshair(time, price) {\n externalCross =\n time === null || !finite(time) ? null : { time, price: price ?? NaN };\n invalidate();\n },\n setScaleMode(mode) {\n options = { ...options, scaleMode: mode };\n const price = scales.get(PRICE);\n if (price) price.auto = true;\n invalidate();\n },\n resetPriceScales() {\n for (const scale of scales.values()) scale.auto = true;\n invalidate();\n },\n setDrawingTool: (next) => setTool(next, true),\n getDrawingTool: () => tool,\n getDrawings: () => drawings,\n setDrawings(next) {\n commitDrawings(next, false);\n },\n removeDrawing,\n updateDrawing,\n selectDrawing: (id) => select(id),\n undo,\n redo,\n getUndoState: undoState,\n startReplay(time) {\n if (!n() && !replay) return;\n if (time === undefined) {\n if (replay) endReplay(true);\n replayPicking = true;\n emitReplay();\n invalidate();\n return;\n }\n const source = replay ? replay.source : store;\n beginReplay(indexOfTime(source.time, source.length, time));\n },\n replayStep: (count = 1) => replayStepBy(Math.max(1, Math.floor(count))),\n replayPlay: (speed) => playReplay(speed),\n replayPause() {\n if (!replay) return;\n stopReplayTimer();\n emitReplay();\n },\n stopReplay: () => endReplay(true),\n getReplayState: replayState,\n toDataURL(type = \"image/png\", quality) {\n return compose()?.toDataURL(type, quality) ?? \"\";\n },\n toBlob(type = \"image/png\", quality) {\n const canvas = compose();\n return new Promise((resolve) => {\n if (!canvas || typeof canvas.toBlob !== \"function\") resolve(null);\n else canvas.toBlob(resolve, type, quality);\n });\n },\n async requestFullscreen() {\n if (typeof root.requestFullscreen === \"function\")\n await root.requestFullscreen();\n },\n async exitFullscreen() {\n if (\n doc.fullscreenElement === root &&\n typeof doc.exitFullscreen === \"function\"\n )\n await doc.exitFullscreen();\n },\n isFullscreen: () => doc.fullscreenElement === root,\n setIndicatorVisible(id, visible) {\n visibility.set(id, visible);\n invalidate();\n },\n getRenderer: () => renderer?.kind ?? null,\n ready,\n refreshTheme,\n resize: () => invalidate(),\n on(type, listener) {\n let set = listeners.get(type);\n if (!set) listeners.set(type, (set = new Set()));\n set.add(listener as (event: never) => void);\n return () => set.delete(listener as (event: never) => void);\n },\n destroy() {\n if (destroyed) return;\n destroyed = true;\n if (frameId) {\n if (win?.cancelAnimationFrame) win.cancelAnimationFrame(frameId);\n else clearTimeout(frameId);\n }\n if (countdownTimer) clearInterval(countdownTimer);\n if (replay?.timer) clearInterval(replay.timer);\n doc.removeEventListener(\"fullscreenchange\", onFullscreen);\n resizeObserver?.disconnect();\n unfollowDefault();\n unwatchTheme();\n langObserver?.disconnect();\n root.removeEventListener(\"wheel\", onWheel);\n renderer?.destroy();\n renderer = null;\n resolveReady(null);\n listeners.clear();\n root.remove();\n },\n };\n syncHooks.set(instance, {\n setTimeRange(range) {\n silentRange = true;\n instance.setVisibleTimeRange(range);\n },\n });\n return instance;\n};\n"],"mappings":"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"}
|