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":"scene.cjs","names":["mix","axisTicks","computePlot","createScales","tickFormatter","toScreen","plottedY","alongX","alongY","toData","nearestIndex","toCss","unpackColor","formatDuration","numberFormat","formatPercent","screenRect","heatCellStyle","luminance","require_color","require_data","require_layout","require_locale","require_format","require_model","require_axis","DEFAULT_PADDING","fallbackResolve","fallback","resolveAnnotations","resolve","theme","y","mapY","v","annotations","a","color","layoutChart","input","model","layoutHorizontal","yCount","height","yTicks","view","yLabelWidth","label","measure","y2Ticks","rightTicks","y2LabelWidth","categoryWidth","step","i","padding","plot","xCount","xTicks","axis","map","b","ticks","count","raw","maxAbs","tick","rows","xLabelWidth","names","name","collectPointLabels","labels","axisFormat","series","format","texts","top","x0","x1","xv","x","reversed","p","s","y0","delta","text","xi","yi","d","size","slotOffset","pointOf","sc","onColumn","pa","pb","ax","center","half","ay","candidateOf","px","py","inside","high","low","outlierAt","list","reach","slop","best","bestDist","k","dotSize","maxSizes","maxDot","sizes","max","nearestScatter","radius","at","rx","ry","cellAt","hx","hy","found","yv","nearestX","sorted","bestD","hoverItemOf","pc","index","extra","o","open","value","packed","q1","q3","out","outliers","eventOf","candidates","items","item","c","hitTest","margin","scatter","others","all","bestDx","bandPx","aligned","first","event","sameHover","it","CHANGE_PERCENT","detailRows","tooltipContent","yFormat","formatOf","firstSeries","yName","valueRow","rowOf","binTitle","change","ohlc","stats","totals","stack","stackIdOf","total","row","seriesIndex","hoverMarks","marks","bandLo","bandHi","plottedOutlier","cx","cy","hw","hh","cell","style","bottom","left","right","fill","contrastRing","rgba","pad","lo","hi","connectorSegments","v0","v1","prev","COLOR_STOPS","colorLegend","lut","stops","mid","legendShown","option","named","legendShape","type","showsCrosshair","crosshair","crosshairAt"],"sources":["../../../../../../charts/src/engine/scene.ts"],"sourcesContent":["// The DOM-free half of a chart: annotations, layout, point labels, hit\n// testing and tooltip content. Shared by createChart (DOM + GPU),\n// createCanvasChart (any 2D context) and the React Native views.\n\nimport { axisTicks, type AxisTicks } from \"./axis\";\nimport { luminance, mix, toCss, unpackColor, type Rgba } from \"./color\";\nimport { nearestIndex } from \"./data\";\nimport { formatDuration, formatPercent, tickFormatter } from \"./format\";\nimport { numberFormat } from \"./locale\";\nimport {\n alongX,\n alongY,\n computePlot,\n createScales,\n heatCellStyle,\n screenRect,\n toData,\n toScreen,\n type Rect,\n type Scales,\n} from \"./layout\";\nimport { gridOf, plottedY, type ChartModel, type SeriesModel } from \"./model\";\nimport type { PointLabel, ResolvedAnnotation } from \"./overlay\";\nimport type { ChartTheme } from \"./theme\";\nimport type { Range } from \"./viewport\";\nimport type {\n ChartAnnotation,\n ChartHoverEvent,\n ChartHoverItem,\n ChartOptions,\n ChartPadding,\n ChartView,\n} from \"./types\";\n\nexport const MAX_POINT_LABELS = 300;\nexport const DEFAULT_PADDING = { top: 12, right: 16, bottom: 4, left: 4 };\n\nexport const fallbackResolve = (_value: string, fallback: Rgba) => fallback;\n\n/**\n * Annotation colors resolved against the theme; `mapY` turns y values into\n * plotted units (log axes)\n */\nexport const resolveAnnotations = (\n annotations: readonly ChartAnnotation[] | undefined,\n theme: ChartTheme,\n mapY?: (value: number) => number,\n): ResolvedAnnotation[] => {\n const resolve = theme.resolve ?? fallbackResolve;\n const y = <T extends number | undefined>(v: T): T =>\n (mapY && v !== undefined ? mapY(v) : v) as T;\n return (annotations ?? []).map((a) => {\n if (a.type === \"rect\") {\n const color = a.color ? resolve(a.color, theme.primary) : theme.primary;\n return {\n type: \"rect\",\n x0: a.x0,\n x1: a.x1,\n y0: y(a.y0),\n y1: y(a.y1),\n color,\n opacity: a.opacity ?? 0.08,\n label: a.label,\n labelPosition: a.labelPosition ?? \"top-left\",\n labelColor: a.labelColor\n ? resolve(a.labelColor, color)\n : mix(color, theme.text, 0.2),\n };\n }\n if (a.type === \"text\") {\n return {\n type: \"text\",\n x: a.x,\n y: y(a.y),\n text: a.text,\n anchor: a.anchor ?? \"center\",\n color: a.color ? resolve(a.color, theme.textMuted) : theme.textMuted,\n weight: a.weight ?? 500,\n };\n }\n return {\n type: \"line\",\n axis: a.axis,\n value: a.axis === \"y\" ? y(a.value) : a.value,\n color: a.color ? resolve(a.color, theme.textMuted) : theme.textMuted,\n width: a.width ?? 1,\n dash: [...(a.dash ?? [4, 4])],\n label: a.label,\n };\n });\n};\n\nexport interface ChartLayout {\n plot: Rect;\n scales: Scales;\n xTicks: AxisTicks;\n yTicks: AxisTicks;\n /** Ticks of the right axis: at the left tick positions, labelled in right axis units */\n y2Ticks: AxisTicks | null;\n}\n\nexport interface LayoutInput {\n model: ChartModel;\n view: ChartView;\n theme: ChartTheme;\n /** Size of the drawing area (legend excluded), CSS pixels */\n width: number;\n height: number;\n padding?: ChartPadding;\n /** Offset of the drawing area (e.g. below a legend) */\n top?: number;\n /** Width of a tick label in the theme font */\n measure: (text: string) => number;\n}\n\n/** Ticks, room for the axes and the plot rectangle */\nexport const layoutChart = (input: LayoutInput): ChartLayout => {\n const { model, view, theme, width, height, measure } = input;\n if (model.horizontal) return layoutHorizontal(input);\n // same count as the nice range of the model (its ends are then ticks),\n // fewer on short charts; category rows get a label each when they fit\n const yCount =\n model.y.tickCount ??\n (model.y.type === \"category\"\n ? Math.max(1, Math.floor((height - 40) / (theme.fontSize + 5)))\n : height >= 220\n ? 5\n : Math.max(2, Math.round((height - 48) / 52)));\n const yTicks = axisTicks(model.y, view.y, yCount);\n let yLabelWidth = 0;\n if (model.y.visible) {\n for (const label of yTicks.labels)\n yLabelWidth = Math.max(yLabelWidth, measure(label));\n }\n const y2Ticks = rightTicks(model, yTicks, view.y, yCount);\n let y2LabelWidth = 0;\n if (y2Ticks && model.y2?.visible) {\n for (const label of y2Ticks.labels)\n y2LabelWidth = Math.max(y2LabelWidth, measure(label));\n }\n let categoryWidth = 48;\n if (model.x.type === \"category\") {\n categoryWidth = 0;\n const step = Math.max(1, Math.floor(model.x.categories.length / 200));\n for (let i = 0; i < model.x.categories.length; i += step) {\n categoryWidth = Math.max(categoryWidth, measure(model.x.categories[i]));\n }\n }\n const padding = { ...DEFAULT_PADDING, ...input.padding };\n const plot = computePlot({\n width,\n height,\n padding,\n yLabelWidth: model.y.visible ? Math.ceil(yLabelWidth) : 0,\n y2LabelWidth: Math.ceil(y2LabelWidth),\n y2Title: !!model.y2?.title && !!model.y2.visible,\n xAxisVisible: model.x.visible,\n xTitle: !!model.x.title && model.x.visible,\n yTitle: !!model.y.title && model.y.visible,\n fontSize: theme.fontSize,\n });\n if (input.top) plot.y += input.top;\n const xCount =\n model.x.type === \"category\"\n ? Math.max(1, Math.floor(plot.width / (categoryWidth + 14)))\n : (model.x.tickCount ?? Math.max(3, Math.floor(plot.width / 88)));\n const xTicks = axisTicks(model.x, view.x, xCount);\n const scales = createScales(plot, view, model.x.reverse, model.y.reverse);\n return { plot, scales, xTicks, yTicks, y2Ticks };\n};\n\n/**\n * Right axis ticks: the left ticks labelled in right axis units; log axes\n * get their own decades\n */\nconst rightTicks = (\n model: ChartModel,\n yTicks: AxisTicks,\n view: Range,\n count: number,\n): AxisTicks | null => {\n const axis = model.y2;\n const map = model.y2Map;\n if (!axis || !map || !map.scale) return null;\n if (map.log) {\n const a = (view[0] - map.offset) / map.scale;\n const b = (view[1] - map.offset) / map.scale;\n const ticks = axisTicks(axis, [Math.min(a, b), Math.max(a, b)], count);\n return {\n ...ticks,\n values: ticks.values.map((e) => e * map.scale + map.offset),\n };\n }\n const raw = yTicks.values.map((v) => (v - map.offset) / map.scale);\n const step = raw.length > 1 ? Math.abs(raw[1] - raw[0]) : 1;\n let maxAbs = 0;\n for (const v of raw) maxAbs = Math.max(maxAbs, Math.abs(v));\n const tick = axis.format ?? tickFormatter(step, maxAbs, model.locale);\n return {\n values: yTicks.values,\n labels: raw.map(tick),\n formatValue: axis.format ?? model.formatValue,\n };\n};\n\n/** Horizontal charts: the x axis on the left, the values along the bottom */\nconst layoutHorizontal = (input: LayoutInput): ChartLayout => {\n const { model, view, theme, width, height, measure } = input;\n const rows = Math.max(1, Math.floor((height - 40) / (theme.fontSize + 5)));\n const xCount =\n model.x.tickCount ??\n (model.x.type === \"category\"\n ? rows\n : height >= 220\n ? 5\n : Math.max(2, Math.round((height - 48) / 52)));\n const xTicks = axisTicks(model.x, view.x, xCount);\n let xLabelWidth = 0;\n if (model.x.visible) {\n if (model.x.type === \"category\") {\n // every name (the visible ones change when zooming)\n const names = model.x.categories;\n const step = Math.max(1, Math.floor(names.length / 200));\n for (let i = 0; i < names.length; i += step) {\n const name = model.x.format ? model.x.format(i) : names[i];\n xLabelWidth = Math.max(xLabelWidth, measure(name));\n }\n } else {\n for (const label of xTicks.labels)\n xLabelWidth = Math.max(xLabelWidth, measure(label));\n }\n }\n const padding = { ...DEFAULT_PADDING, ...input.padding };\n const plot = computePlot({\n width,\n height,\n padding,\n yLabelWidth: model.x.visible ? Math.ceil(xLabelWidth) : 0,\n xAxisVisible: model.y.visible,\n xTitle: !!model.y.title && model.y.visible,\n yTitle: !!model.x.title && model.x.visible,\n fontSize: theme.fontSize,\n });\n if (input.top) plot.y += input.top;\n const yCount =\n model.y.tickCount ??\n (model.y.type === \"category\"\n ? Math.max(1, Math.floor(plot.width / 60))\n : Math.max(3, Math.min(8, Math.floor(plot.width / 88))));\n const yTicks = axisTicks(model.y, view.y, yCount);\n const scales = createScales(\n plot,\n view,\n model.x.reverse,\n model.y.reverse,\n true,\n );\n return { plot, scales, xTicks, yTicks, y2Ticks: null };\n};\n\n/** Labels of the visible scatter points and bar values (`showLabels`) */\nexport const collectPointLabels = (\n model: ChartModel,\n view: ChartView,\n s: Scales,\n yTicks?: AxisTicks | null,\n): PointLabel[] => {\n const labels: PointLabel[] = [];\n // 100% stacks: the axis shows percents, the labels the actual values\n const axisFormat = model.percent\n ? model.formatValue\n : (yTicks?.formatValue ?? model.formatValue);\n for (const series of model.series) {\n if (series.hidden || !series.showLabels) continue;\n if (series.type === \"bar\" && series.barTop) {\n // 100% stacks and right axis series: the values of the data\n const format =\n series.format ??\n (series.yAxis === \"right\"\n ? (model.y2?.format ?? model.formatValue)\n : axisFormat);\n const { x, count } = series.cols;\n const { y, y0, labels: texts } = series.raw;\n const top = series.barTop;\n const [x0, x1] = view.x[0] <= view.x[1] ? view.x : [view.x[1], view.x[0]];\n for (let i = 0; i < count && labels.length < MAX_POINT_LABELS; i++) {\n const xv = x[i] + series.barOffset;\n if (!Number.isFinite(y[i]) || xv < x0 || xv > x1) continue;\n // the end away from the base (the top, or the bottom of negative bars)\n const negative = top[i] < (series.barBase?.[i] ?? 0);\n const reversed = negative !== model.y.reverse;\n const p = toScreen(s, xv, top[i]);\n const step = series.floating && y0 && Number.isFinite(y0[i]);\n // ranges on a time axis (Gantt tasks) have no value to write\n if (step && model.y.type === \"time\" && !texts?.[i]) continue;\n const delta = step ? y[i] - (y0?.[i] ?? 0) : 0;\n labels.push({\n x: p.x,\n y: p.y,\n r: 0,\n text:\n texts?.[i] ??\n (step ? `${delta > 0 ? \"+\" : \"\"}${format(delta)}` : format(y[i])),\n placement: s.horizontal\n ? reversed\n ? \"left\"\n : \"right\"\n : reversed\n ? \"below\"\n : \"above\",\n });\n }\n continue;\n }\n if (series.type !== \"scatter\") continue;\n const { x, y, count, labels: texts, size } = series.cols;\n if (!texts) continue;\n for (let i = 0; i < count && labels.length < MAX_POINT_LABELS; i++) {\n const text = texts[i];\n if (!text) continue;\n const xi = x[i];\n const yi = y[i];\n if (xi < view.x[0] || xi > view.x[1] || yi < view.y[0] || yi > view.y[1])\n continue;\n const d = size && size[i] > 0 ? size[i] : series.pointSize;\n const p = toScreen(s, xi, yi);\n labels.push({ x: p.x, y: p.y, r: d / 2, text });\n }\n }\n return labels;\n};\n\n// ---------------------------------------------------------------- hit tests\n\ninterface Candidate {\n series: SeriesModel;\n index: number;\n /** Pixel position of the point */\n px: number;\n py: number;\n /** Distance along the x axis */\n dx: number;\n dist: number;\n inside: boolean;\n /** Box plots: value of the outlier under the pointer */\n outlier?: number;\n}\n\n/** Bars and box plots sit in a slot of their category */\nconst slotOffset = (s: SeriesModel) =>\n s.type === \"bar\" || s.type === \"boxplot\" ? s.barOffset : 0;\n\n/**\n * Screen position of a point (the end of a bar or stack, the close of a\n * candle, the median of a box)\n */\nexport const pointOf = (s: SeriesModel, i: number, sc: Scales) => {\n const p = toScreen(sc, s.cols.x[i] + slotOffset(s), plottedY(s, i));\n return { px: p.x, py: p.y };\n};\n\n/** Whether a pixel (along x, along y) is on a column from `a` to `b` */\nconst onColumn = (\n sc: Scales,\n center: number,\n half: number,\n a: number,\n b: number,\n ax: number,\n ay: number,\n) => {\n const pa = sc.yToPx(a);\n const pb = sc.yToPx(b);\n return (\n Math.abs(ax - center) <= half &&\n ay >= Math.min(pa, pb) - 2 &&\n ay <= Math.max(pa, pb) + 2\n );\n};\n\nconst candidateOf = (\n s: SeriesModel,\n i: number,\n px: number,\n py: number,\n sc: Scales,\n): Candidate => {\n const p = pointOf(s, i, sc);\n const ax = alongX(sc, px, py);\n const ay = alongY(sc, px, py);\n const center = sc.xToPx(s.cols.x[i] + slotOffset(s));\n let inside = false;\n if (s.type === \"bar\" && s.barBase && s.barTop) {\n const half = s.barHalfWidth / Math.abs(sc.xPerPx);\n inside = onColumn(sc, center, half, s.barBase[i], s.barTop[i], ax, ay);\n } else if (s.type === \"candlestick\" || s.type === \"boxplot\") {\n const { high, low, y } = s.cols;\n const half = Math.max(s.barHalfWidth / Math.abs(sc.xPerPx), 3);\n const a = high ? high[i] : y[i];\n const b = low ? low[i] : y[i];\n inside = onColumn(sc, center, half, a, b, ax, ay);\n }\n return {\n series: s,\n index: i,\n px: p.px,\n py: p.py,\n dx: Math.abs(sc.xToPx(s.cols.x[i]) - ax),\n dist: inside ? 0 : Math.hypot(p.px - px, p.py - py),\n inside,\n };\n};\n\n/** Outlier of a box under a pixel (`undefined` when none is in reach) */\nconst outlierAt = (\n s: SeriesModel,\n i: number,\n px: number,\n py: number,\n sc: Scales,\n slop: number,\n): number | undefined => {\n const list = s.cols.outliers?.[i];\n if (!list) return undefined;\n const center = sc.xToPx(s.cols.x[i] + slotOffset(s));\n const ax = alongX(sc, px, py) - center;\n const ay = alongY(sc, px, py);\n const reach = s.outlierSize / 2 + 4 + slop;\n let best: number | undefined;\n let bestDist = reach;\n list.forEach((v, k) => {\n const d = Math.hypot(ax, sc.yToPx(v) - ay);\n if (d <= bestDist) {\n bestDist = d;\n // the value of the data (right axis series are mapped)\n best = s.raw.outliers?.[i]?.[k] ?? v;\n }\n });\n return best;\n};\n\n/** Diameter of a scatter dot */\nexport const dotSize = (s: SeriesModel, i: number) =>\n s.cols.size && s.cols.size[i] > 0 ? s.cols.size[i] : s.pointSize;\n\nconst maxSizes = new WeakMap<Float32Array, number>();\n\n/** Largest dot of a series (bubbles reach further than plain dots) */\nconst maxDot = (s: SeriesModel) => {\n const sizes = s.cols.size;\n if (!sizes) return s.pointSize;\n let max = maxSizes.get(sizes);\n if (max === undefined) {\n max = s.pointSize;\n for (let i = 0; i < sizes.length; i++) if (sizes[i] > max) max = sizes[i];\n maxSizes.set(sizes, max);\n }\n return max;\n};\n\nconst nearestScatter = (\n s: SeriesModel,\n px: number,\n py: number,\n sc: Scales,\n slop: number,\n) => {\n const radius = Math.max(maxDot(s) / 2 + 6, 10) + slop;\n const at = toData(sc, px, py);\n const rx = radius * Math.abs(sc.xPerPx);\n const ry = radius * Math.abs(sc.yPerPx);\n let best = -1;\n let bestDist = Infinity;\n const { x, y } = s.cols;\n gridOf(s).query(at.x - rx, at.x + rx, at.y - ry, at.y + ry, (i) => {\n const p = toScreen(sc, x[i], y[i]);\n const d = Math.hypot(p.x - px, p.y - py);\n const reach = Math.max(dotSize(s, i) / 2 + 4, 8) + slop;\n if (d <= reach && d <= bestDist) {\n bestDist = d;\n best = i;\n }\n });\n return best;\n};\n\n/** Heatmap cell containing a data position, -1 if none */\nconst cellAt = (s: SeriesModel, xv: number, yv: number) => {\n const { x: hx, y: hy } = s.cellHalf;\n const { x, y } = s.cols;\n let found = -1;\n gridOf(s).query(xv - hx, xv + hx, yv - hy, yv + hy, (i) => {\n if (\n s.cellColors?.[i] &&\n Math.abs(x[i] - xv) <= hx &&\n Math.abs(y[i] - yv) <= hy\n ) {\n found = i;\n }\n });\n return found;\n};\n\nconst nearestX = (s: SeriesModel, xv: number) => {\n const { x, y, count, sorted } = s.cols;\n if (sorted) return nearestIndex(x, y, count, xv);\n let best = -1;\n let bestD = Infinity;\n for (let i = 0; i < count; i++) {\n if (!Number.isFinite(y[i])) continue;\n const d = Math.abs(x[i] - xv);\n if (d < bestD) {\n bestD = d;\n best = i;\n }\n }\n return best;\n};\n\n/** Hover payload item of a point (values of the data, right axis included) */\nexport const hoverItemOf = (s: SeriesModel, index: number): ChartHoverItem => {\n const pc = s.pointColors?.[index];\n const { open, high, low, value, y0, q1, q3, outliers, labels } = s.raw;\n const label = labels?.[index];\n let color = pc ? toCss(pc) : s.colorCss;\n const extra: Partial<ChartHoverItem> = {};\n if (s.type === \"candlestick\") {\n const o = open ? open[index] : NaN;\n if (Number.isFinite(o)) extra.open = o;\n if (high && Number.isFinite(high[index])) extra.high = high[index];\n if (low && Number.isFinite(low[index])) extra.low = low[index];\n color = toCss(s.raw.y[index] < o ? s.downColor : s.upColor);\n } else if (s.type === \"heatmap\") {\n const v = value ? value[index] : s.raw.y[index];\n if (Number.isFinite(v)) extra.value = v;\n const packed = s.cellColors?.[index];\n if (packed) color = toCss(unpackColor(packed));\n } else if (s.type === \"boxplot\") {\n if (high && Number.isFinite(high[index])) extra.high = high[index];\n if (low && Number.isFinite(low[index])) extra.low = low[index];\n if (q1 && Number.isFinite(q1[index])) extra.q1 = q1[index];\n if (q3 && Number.isFinite(q3[index])) extra.q3 = q3[index];\n const out = outliers?.[index];\n if (out) extra.outliers = out.length;\n } else {\n if (y0 && Number.isFinite(y0[index])) extra.y0 = y0[index];\n if (s.type === \"scatter\" && value && Number.isFinite(value[index]))\n extra.value = value[index];\n }\n return {\n seriesIndex: s.index,\n seriesId: s.id,\n seriesName: s.name,\n index,\n x: s.raw.x[index],\n y: s.raw.y[index],\n color,\n ...(label !== undefined ? { label } : {}),\n ...extra,\n };\n};\n\nconst eventOf = (\n candidates: Candidate[],\n xTicks: AxisTicks | null,\n): ChartHoverEvent | null => {\n if (!candidates.length) return null;\n candidates.sort((a, b) => a.series.index - b.series.index);\n const items = candidates.map((c) => {\n const item = hoverItemOf(c.series, c.index);\n if (c.outlier !== undefined) item.outlier = c.outlier;\n return item;\n });\n const x = items[0].x;\n return { items, x, xLabel: xTicks?.formatValue(x) ?? String(x) };\n};\n\n/**\n * Points under a pixel of the stage: the nearest point (scatter / `nearest`\n * tooltips) or every series at the nearest x (`axis` tooltips).\n * `slop` widens the reach of the dots (touch screens).\n */\nexport const hitTest = (\n model: ChartModel,\n sc: Scales,\n xTicks: AxisTicks | null,\n px: number,\n py: number,\n slop = 0,\n): ChartHoverEvent | null => {\n const { plot } = sc;\n const margin = 6 + slop;\n if (\n px < plot.x - margin ||\n px > plot.x + plot.width + margin ||\n py < plot.y - margin ||\n py > plot.y + plot.height + margin\n ) {\n return null;\n }\n const at = toData(sc, px, py);\n const scatter: Candidate[] = [];\n const others: Candidate[] = [];\n for (const s of model.series) {\n if (s.hidden || !s.tooltip || s.cols.count === 0) continue;\n if (s.type === \"scatter\") {\n const i = nearestScatter(s, px, py, sc, slop);\n if (i >= 0) scatter.push(candidateOf(s, i, px, py, sc));\n } else if (s.type === \"heatmap\") {\n const i = cellAt(s, at.x, at.y);\n if (i >= 0) {\n const c = candidateOf(s, i, px, py, sc);\n c.inside = true;\n c.dist = 0;\n scatter.push(c);\n }\n } else {\n const i = nearestX(s, at.x);\n if (i < 0) continue;\n const c = candidateOf(s, i, px, py, sc);\n if (s.type === \"boxplot\") {\n c.outlier = outlierAt(s, i, px, py, sc, slop);\n if (c.outlier !== undefined) {\n c.inside = true;\n c.dist = 0;\n }\n }\n others.push(c);\n }\n }\n if (model.tooltipMode === \"item\") {\n // the shape under the pointer only: bars, boxes, cells, dots in reach\n // and lines within a few pixels; the last drawn wins\n const all = [...scatter, ...others].filter(\n (c) =>\n c.inside ||\n c.series.type === \"scatter\" ||\n ((c.series.type === \"line\" || c.series.type === \"area\") &&\n c.dist <= 8 + slop),\n );\n if (!all.length) return null;\n const best = all.reduce((a, b) =>\n b.dist < a.dist || (b.dist === a.dist && b.series.index > a.series.index)\n ? b\n : a,\n );\n return eventOf([best], xTicks);\n }\n if (model.tooltipMode === \"nearest\") {\n const all = [...scatter, ...others].filter(\n (c) => c.inside || c.series.type === \"scatter\" || c.dist <= 32 + slop,\n );\n if (!all.length) return null;\n const best = all.reduce((a, b) => (b.dist <= a.dist ? b : a));\n return eventOf([best], xTicks);\n }\n if (!others.length) {\n if (!scatter.length) return null;\n return eventOf(\n [scatter.reduce((a, b) => (b.dist <= a.dist ? b : a))],\n xTicks,\n );\n }\n const bestDx = Math.min(...others.map((c) => c.dx));\n const bandPx = model.x.type === \"category\" ? 0.5 / Math.abs(sc.xPerPx) : 0;\n const aligned = others.filter((c) => c.dx <= bestDx + Math.max(1, bandPx));\n const first = aligned.reduce((a, b) => (b.dx < a.dx ? b : a));\n const ordered = [first, ...aligned.filter((c) => c !== first), ...scatter];\n const event = eventOf(ordered, xTicks);\n if (event) {\n event.x = hoverItemOf(first.series, first.index).x;\n event.xLabel = xTicks?.formatValue(event.x) ?? String(event.x);\n }\n return event;\n};\n\n/** Whether two hover payloads point at the same points */\nexport const sameHover = (\n a: ChartHoverEvent | null,\n b: ChartHoverEvent | null,\n): boolean =>\n a === b ||\n (!!a &&\n !!b &&\n a.items.length === b.items.length &&\n a.items.every(\n (it, i) =>\n it.index === b.items[i].index &&\n it.seriesIndex === b.items[i].seriesIndex,\n ));\n\n// ------------------------------------------------------------------ tooltip\n\n/** Change of a candlestick: `+1.25%` */\nconst CHANGE_PERCENT: Intl.NumberFormatOptions = {\n style: \"percent\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n};\n\nexport interface TooltipRow {\n /** Swatch color (CSS) */\n color: string | null;\n name: string;\n value: string;\n}\n\nexport interface TooltipContent {\n title: string;\n /** Swatch of the title (single scatter point, Gantt task) */\n titleColor: string | null;\n /** Muted line below the title (the group of a Gantt task) */\n subtitle?: string;\n rows: TooltipRow[];\n}\n\n/** Extra rows of a point (`details` of its datum) */\nconst detailRows = (s: SeriesModel, index: number): TooltipRow[] =>\n s.raw.details?.[index]?.map((d) => ({\n color: null,\n name: d.name,\n value: d.value,\n })) ?? [];\n\n/**\n * Default tooltip content of a hover payload; `y2Ticks` formats the values\n * of the right axis series\n */\nexport const tooltipContent = (\n model: ChartModel,\n event: ChartHoverEvent,\n yTicks: AxisTicks | null,\n y2Ticks: AxisTicks | null = null,\n): TooltipContent => {\n const yFormat = yTicks?.formatValue ?? String;\n const formatOf = (s: SeriesModel) =>\n s.format ??\n (s.yAxis === \"right\"\n ? (y2Ticks?.formatValue ?? model.y2?.format ?? model.formatValue)\n : yFormat);\n const names = model.labels;\n const first = event.items[0];\n const firstSeries = first ? model.series[first.seriesIndex] : null;\n if (\n event.items.length === 1 &&\n first &&\n firstSeries?.type === \"bar\" &&\n first.y0 !== undefined &&\n model.y.type === \"time\"\n ) {\n // a task of a Gantt chart / timeline: its dates and its length\n const format = formatOf(firstSeries);\n const title = first.label ?? event.xLabel;\n return {\n title,\n titleColor: first.color,\n subtitle:\n first.label !== undefined\n ? `${event.xLabel} · ${firstSeries.name}`\n : firstSeries.name,\n rows: [\n { color: null, name: names.start, value: format(first.y0) },\n { color: null, name: names.end, value: format(first.y) },\n {\n color: null,\n name: names.duration,\n value: formatDuration(first.y - first.y0, model.locale),\n },\n ...detailRows(firstSeries, first.index),\n ],\n };\n }\n if (event.items.length === 1 && firstSeries?.type === \"heatmap\") {\n const yName =\n model.y.type === \"category\"\n ? (model.y.categories[Math.round(first.y)] ?? yFormat(first.y))\n : yFormat(first.y);\n return {\n title: `${event.xLabel} · ${yName}`,\n titleColor: null,\n rows: [\n {\n color: first.color,\n name: first.label ?? firstSeries.name,\n value:\n first.value === undefined\n ? \"–\"\n : (firstSeries.format ?? model.formatValue)(first.value),\n },\n ...detailRows(firstSeries, first.index),\n ],\n };\n }\n const scatterOnly = event.items.every(\n (it) => model.series[it.seriesIndex].type === \"scatter\",\n );\n if (scatterOnly && event.items.length === 1) {\n const it = event.items[0];\n const s = model.series[it.seriesIndex];\n const valueRow: TooltipRow[] =\n it.value !== undefined\n ? [\n {\n color: null,\n name: s.valueName ?? names.value,\n value: (s.format ?? model.formatValue)(it.value),\n },\n ]\n : [];\n if (model.x.type === \"category\") {\n // a dot on a category (Gantt milestones, dot plots)\n return {\n title: it.label ?? event.xLabel,\n titleColor: null,\n rows: [\n { color: it.color, name: it.seriesName, value: formatOf(s)(it.y) },\n ...valueRow,\n ...detailRows(s, it.index),\n ],\n };\n }\n const rows: TooltipRow[] = [\n { color: null, name: model.x.title ?? names.x, value: event.xLabel },\n {\n color: null,\n name:\n (s.yAxis === \"right\" ? model.y2?.title : model.y.title) ?? names.y,\n value: formatOf(s)(it.y),\n },\n ...valueRow,\n ...detailRows(s, it.index),\n ];\n if (it.label !== undefined && model.series.length > 1)\n rows.push({ color: null, name: \"\", value: it.seriesName });\n return { title: it.label ?? it.seriesName, titleColor: it.color, rows };\n }\n const rows: TooltipRow[] = [];\n /** Row of every item */\n const rowOf: number[] = [];\n // one labelled bar on a numeric axis (a histogram bin): the label is the title\n const binTitle =\n event.items.length === 1 &&\n firstSeries?.type === \"bar\" &&\n model.x.type !== \"category\" &&\n first?.label !== undefined\n ? first.label\n : null;\n for (const it of event.items) {\n const s = model.series[it.seriesIndex];\n const format = formatOf(s);\n rowOf.push(rows.length);\n if (s.type === \"candlestick\") {\n const change =\n it.open !== undefined && it.open !== 0\n ? ((it.y - it.open) / Math.abs(it.open)) * 100\n : NaN;\n rows.push({\n color: it.color,\n name: s.name,\n value: Number.isFinite(change)\n ? `${change >= 0 ? \"+\" : \"\"}${numberFormat(model.locale, CHANGE_PERCENT).format(change / 100)}`\n : \"\",\n });\n const ohlc: [string, number | undefined][] = [\n [names.open, it.open],\n [names.high, it.high],\n [names.low, it.low],\n [names.close, it.y],\n ];\n for (const [name, v] of ohlc) {\n if (v !== undefined && Number.isFinite(v))\n rows.push({ color: null, name, value: format(v) });\n }\n continue;\n }\n if (s.type === \"boxplot\") {\n if (it.outlier !== undefined) {\n // an outlier: its value and its group\n rows.push(\n {\n color: it.color,\n name: it.label ? `${it.seriesName} · ${it.label}` : it.seriesName,\n value: \"\",\n },\n { color: null, name: names.outlier, value: format(it.outlier) },\n );\n continue;\n }\n rows.push({\n color: it.color,\n name: it.label ? `${it.seriesName} · ${it.label}` : it.seriesName,\n value: \"\",\n });\n const stats: [string, number | undefined][] = [\n [names.max, it.high],\n [names.q3, it.q3],\n [names.median, it.y],\n [names.q1, it.q1],\n [names.min, it.low],\n ];\n for (const [name, v] of stats) {\n if (v !== undefined && Number.isFinite(v))\n rows.push({ color: null, name, value: format(v) });\n }\n if (it.outliers)\n rows.push({\n color: null,\n name: names.outliers,\n value: String(it.outliers),\n });\n continue;\n }\n let value = format(it.y);\n if (it.y0 !== undefined) {\n // waterfall steps: the change; time ranges and bands: both ends\n const delta = it.y - it.y0;\n value =\n s.type === \"bar\" && model.y.type !== \"time\"\n ? `${delta > 0 ? \"+\" : \"\"}${format(delta)}`\n : `${format(it.y0)} – ${format(it.y)}`;\n }\n rows.push({\n color: it.color,\n name:\n it.label && binTitle === null\n ? `${it.seriesName} · ${it.label}`\n : it.seriesName,\n value,\n });\n rows.push(...detailRows(s, it.index));\n }\n if (model.percent) {\n // 100% stacks: the share of every value next to it\n const totals = new Map<string, number>();\n for (const it of event.items) {\n const stack = stackIdOf(model, it.seriesIndex);\n if (stack !== null && Number.isFinite(it.y))\n totals.set(stack, (totals.get(stack) ?? 0) + Math.abs(it.y));\n }\n event.items.forEach((it, k) => {\n const stack = stackIdOf(model, it.seriesIndex);\n const total = stack !== null ? totals.get(stack) : undefined;\n const row = rows[rowOf[k]];\n if (total && row && Number.isFinite(it.y)) {\n const format = model.series[it.seriesIndex].format ?? model.formatValue;\n row.value = `${format(it.y)} · ${formatPercent((Math.abs(it.y) / total) * 100, model.locale, true)}`;\n }\n });\n }\n return { title: binTitle ?? event.xLabel, titleColor: null, rows };\n};\n\n/** Stack of a series in a 100% chart (`null` when it is not stacked) */\nconst stackIdOf = (model: ChartModel, seriesIndex: number): string | null =>\n model.series[seriesIndex].hidden ? null : model.stacks[seriesIndex];\n\n/**\n * Shape of the hover marker of an item: a dot with a soft halo on a point,\n * a band behind the hovered bar group / candle, or the outline of a cell\n */\nexport type HoverMark =\n | {\n kind: \"dot\";\n x: number;\n y: number;\n size: number;\n color: string;\n /** Translucent series color of the halo around the dot */\n halo: string;\n }\n | { kind: \"band\"; x: number; y: number; width: number; height: number }\n | {\n /** Soft band over the row / column of a hovered cell (above the data) */\n kind: \"guide\";\n x: number;\n y: number;\n width: number;\n height: number;\n }\n | {\n /** The hovered cell, lifted, with a ring inside its edge */\n kind: \"cell\";\n x: number;\n y: number;\n width: number;\n height: number;\n /** Fill of the cell (CSS) */\n color: string;\n /** Ring color (CSS), contrasting with the fill */\n ring: string;\n radius: number;\n };\n\n/** Markers of the hovered points (pixels of the stage); bands come first */\nexport const hoverMarks = (\n model: ChartModel,\n sc: Scales,\n event: ChartHoverEvent,\n): HoverMark[] => {\n const marks: HoverMark[] = [];\n const { plot } = sc;\n let bandLo = Infinity;\n let bandHi = -Infinity;\n for (const it of event.items) {\n const s = model.series[it.seriesIndex];\n if (s.type === \"boxplot\" && it.outlier !== undefined) {\n const p = toScreen(sc, it.x + slotOffset(s), plottedOutlier(s, it));\n marks.push({\n kind: \"dot\",\n x: p.x,\n y: p.y,\n size: s.outlierSize + 3,\n color: it.color,\n halo: toCss(s.pointColors?.[it.index] ?? s.color, 0.2),\n });\n continue;\n }\n if (s.type === \"bar\" || s.type === \"candlestick\" || s.type === \"boxplot\") {\n const c = sc.xToPx(it.x + slotOffset(s));\n const half = Math.max(s.barHalfWidth / Math.abs(sc.xPerPx), 1);\n bandLo = Math.min(bandLo, c - half);\n bandHi = Math.max(bandHi, c + half);\n continue;\n }\n if (s.type === \"heatmap\") {\n const cx = sc.xToPx(it.x);\n const cy = sc.yToPx(it.y);\n const hw = Math.abs(s.cellHalf.x / sc.xPerPx);\n const hh = Math.abs(s.cellHalf.y / sc.yPerPx);\n const cell = screenRect(sc, cx - hw, cx + hw, cy - hh, cy + hh);\n const style = heatCellStyle(cell.width, cell.height, s.radius);\n // the row and the column, clipped to the plot\n const top = Math.max(plot.y, cell.y);\n const bottom = Math.min(plot.y + plot.height, cell.y + cell.height);\n const left = Math.max(plot.x, cell.x);\n const right = Math.min(plot.x + plot.width, cell.x + cell.width);\n if (bottom > top)\n marks.push({\n kind: \"guide\",\n x: plot.x,\n y: top,\n width: plot.width,\n height: bottom - top,\n });\n if (right > left)\n marks.push({\n kind: \"guide\",\n x: left,\n y: plot.y,\n width: right - left,\n height: plot.height,\n });\n const packed = s.cellColors?.[it.index];\n const fill = packed ? unpackColor(packed) : s.color;\n marks.push({\n kind: \"cell\",\n x: cell.x + style.inset,\n y: cell.y + style.inset,\n width: Math.max(1, cell.width - style.inset * 2),\n height: Math.max(1, cell.height - style.inset * 2),\n color: it.color,\n ring: contrastRing(fill),\n radius: style.radius,\n });\n continue;\n }\n const { px, py } = pointOf(s, it.index, sc);\n if (\n px < plot.x - 1 ||\n px > plot.x + plot.width + 1 ||\n py < plot.y - 1 ||\n py > plot.y + plot.height + 1\n ) {\n continue;\n }\n const size =\n s.type === \"scatter\"\n ? dotSize(s, it.index) + 4\n : Math.max(9, s.lineWidth * 2 + 5);\n const rgba = s.pointColors?.[it.index] ?? s.color;\n marks.push({\n kind: \"dot\",\n x: px,\n y: py,\n size,\n color: it.color,\n halo: toCss(rgba, 0.2),\n });\n }\n if (bandHi > bandLo) {\n // the group of bars plus a margin, clipped to the plot\n const pad = Math.max(4, (bandHi - bandLo) * 0.14);\n const lo = sc.horizontal ? plot.y : plot.x;\n const hi = lo + (sc.horizontal ? plot.height : plot.width);\n const a = Math.max(lo, bandLo - pad);\n const b = Math.min(hi, bandHi + pad);\n if (b > a) {\n marks.unshift({\n kind: \"band\",\n ...(sc.horizontal\n ? { x: plot.x, y: a, width: plot.width, height: b - a }\n : { x: a, y: plot.y, width: b - a, height: plot.height }),\n });\n }\n }\n return marks;\n};\n\n/** Ring of a hovered cell: light on dark fills, dark on light ones */\nexport const contrastRing = (fill: Rgba): string =>\n luminance(fill) > 0.45\n ? \"rgba(15, 23, 42, 0.78)\"\n : \"rgba(255, 255, 255, 0.9)\";\n\n/** Plotted value of the hovered outlier of a box */\nconst plottedOutlier = (s: SeriesModel, it: ChartHoverItem): number => {\n const raw = s.raw.outliers?.[it.index];\n const k = raw ? raw.indexOf(it.outlier ?? NaN) : -1;\n return (\n (k >= 0 ? s.cols.outliers?.[it.index]?.[k] : undefined) ?? it.outlier ?? 0\n );\n};\n\n/** A line from the end of a bar to the next bar, pixels of the stage */\nexport interface ConnectorSegment {\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n color: string;\n width: number;\n dash: number[];\n}\n\n/**\n * Connectors of the bar series (`connector`, waterfalls): from the end of\n * every bar to the next bar, at the value where the next one starts\n */\nexport const connectorSegments = (\n model: ChartModel,\n sc: Scales,\n): ConnectorSegment[] => {\n const out: ConnectorSegment[] = [];\n for (const s of model.series) {\n const c = s.connector;\n if (!c || s.hidden || s.type !== \"bar\" || !s.barTop) continue;\n const { x, count } = s.cols;\n const top = s.barTop;\n const half = s.barHalfWidth;\n const [v0, v1] =\n sc.view.x[0] <= sc.view.x[1] ? sc.view.x : [sc.view.x[1], sc.view.x[0]];\n const color = toCss(c.color, 0.75);\n let prev = -1;\n for (let i = 0; i < count && out.length < MAX_POINT_LABELS * 4; i++) {\n if (!Number.isFinite(top[i]) || !Number.isFinite(x[i])) continue;\n if (prev >= 0 && x[i] + half >= v0 && x[prev] - half <= v1) {\n const a = toScreen(sc, x[prev] + s.barOffset + half, top[prev]);\n const b = toScreen(sc, x[i] + s.barOffset - half, top[prev]);\n out.push({\n x0: a.x,\n y0: a.y,\n x1: b.x,\n y1: b.y,\n color,\n width: c.width,\n dash: c.dash,\n });\n }\n prev = i;\n }\n }\n return out;\n};\n\n/** Visual map of a heatmap: its color ramp and the values at the ends */\nexport interface ColorLegend {\n seriesIndex: number;\n /** CSS colors at even steps from the lowest to the highest value */\n stops: string[];\n /** Labels along the ramp (`at`: 0-1): the ends, and the middle of diverging ramps */\n labels: { at: number; text: string }[];\n}\n\nconst COLOR_STOPS = 12;\n\n/**\n * Color legend of a heatmap chart (every series is a heatmap; the first\n * visible one), `null` otherwise\n */\nexport const colorLegend = (model: ChartModel): ColorLegend | null => {\n if (!model.series.length || model.series.some((s) => s.type !== \"heatmap\"))\n return null;\n const s = model.series.find((it) => !it.hidden && it.colorLut);\n const lut = s?.colorLut;\n if (!s || !lut) return null;\n const stops: string[] = [];\n for (let k = 0; k < COLOR_STOPS; k++) {\n const packed = lut[Math.round((k / (COLOR_STOPS - 1)) * (lut.length - 1))];\n stops.push(toCss(unpackColor(packed ?? 0)));\n }\n const format = s.format ?? model.formatValue;\n const [lo, hi] = s.valueRange;\n const labels = [\n { at: 0, text: format(lo) },\n { at: 1, text: format(hi) },\n ];\n const mid = s.colorMidpoint;\n if (mid !== null && mid > lo && mid < hi)\n labels.splice(1, 0, { at: 0.5, text: format(mid) });\n return { seriesIndex: s.index, stops, labels };\n};\n\n/** Whether the legend shows (`legend` option; heatmaps get their color legend) */\nexport const legendShown = (\n option: ChartOptions[\"legend\"],\n model: ChartModel,\n named: number,\n): boolean =>\n option === undefined ? named > 1 || colorLegend(model) !== null : !!option;\n\n/** Swatch of a series in the legend */\nexport const legendShape = (\n type: SeriesModel[\"type\"],\n): \"dot\" | \"line\" | \"square\" =>\n type === \"scatter\" ? \"dot\" : type === \"line\" ? \"line\" : \"square\";\n\n/** Whether the guide line follows the pointer */\nexport const showsCrosshair = (\n model: ChartModel,\n event: ChartHoverEvent,\n crosshair: boolean | undefined,\n) =>\n crosshair ??\n (model.tooltipMode === \"axis\" &&\n event.items.some((it) => {\n const type = model.series[it.seriesIndex].type;\n return type === \"line\" || type === \"area\";\n }) &&\n // bars get a band instead\n !event.items.some((it) => {\n const type = model.series[it.seriesIndex].type;\n return type === \"bar\" || type === \"candlestick\" || type === \"boxplot\";\n }));\n\n/** Pixel of the guide line along the x axis (`null` when hidden / outside the plot) */\nexport const crosshairAt = (\n model: ChartModel,\n sc: Scales,\n event: ChartHoverEvent,\n crosshair: boolean | undefined,\n): number | null => {\n if (!showsCrosshair(model, event, crosshair)) return null;\n const c = sc.xToPx(event.items[0].x);\n const lo = sc.horizontal ? sc.plot.y : sc.plot.x;\n const hi = lo + (sc.horizontal ? sc.plot.height : sc.plot.width);\n return c >= lo && c <= hi ? c : null;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scene.cjs","names":["mix","axisTicks","computePlot","createScales","tickFormatter","toScreen","plottedY","alongX","alongY","toData","nearestIndex","toCss","unpackColor","formatDuration","numberFormat","formatPercent","screenRect","heatCellStyle","luminance","toPlotX","require_color","require_data","require_layout","require_locale","require_format","require_model","require_axis","DEFAULT_PADDING","fallbackResolve","fallback","resolveAnnotations","resolve","theme","y","mapY","v","x","mapX","annotations","a","color","layoutChart","input","model","layoutHorizontal","yCount","height","yTicks","view","yLabelWidth","label","measure","y2Ticks","rightTicks","y2LabelWidth","categoryWidth","step","i","padding","plot","xCount","xTicks","axis","map","b","ticks","count","raw","maxAbs","tick","rows","xLabelWidth","names","name","collectPointLabels","labels","axisFormat","series","format","texts","top","x0","x1","xv","reversed","p","s","y0","delta","text","xi","yi","d","size","slotOffset","pointOf","sc","onColumn","pa","pb","ax","center","half","ay","candidateOf","px","py","inside","high","low","outlierAt","list","reach","slop","best","bestDist","k","dotSize","maxSizes","maxDot","sizes","max","nearestScatter","radius","at","rx","ry","cellAt","hx","hy","found","yv","nearestX","sorted","bestD","hoverItemOf","pc","index","extra","o","open","value","packed","q1","q3","out","outliers","eventOf","candidates","items","item","c","hitTest","margin","scatter","others","all","bestDx","bandPx","aligned","first","event","sameHover","it","CHANGE_PERCENT","detailRows","tooltipContent","yFormat","formatOf","firstSeries","yName","valueRow","yAxisFormat","rowOf","binTitle","change","ohlc","stats","totals","stack","stackIdOf","total","row","seriesIndex","hoverMarks","marks","bandLo","bandHi","itX","plottedOutlier","cx","cy","hw","hh","cell","style","bottom","left","right","fill","contrastRing","rgba","pad","lo","hi","connectorSegments","v0","v1","prev","resolveDependencies","muted","dependencies","ARROW_HEAD","rowSpans","bar","start","end","dependencyArrows","horizontal","pt","valuePx","categoryPx","dir","rowPx","ev","ca","sv","cb","base","length","points","exit","between","back","COLOR_STOPS","colorLegend","lut","stops","mid","legendShown","option","named","legendShape","type","showsCrosshair","crosshair","crosshairAt"],"sources":["../../../../../../charts/src/engine/scene.ts"],"sourcesContent":["// The DOM-free half of a chart: annotations, layout, point labels, hit\n// testing and tooltip content. Shared by createChart (DOM + GPU),\n// createCanvasChart (any 2D context) and the React Native views.\n\nimport { axisTicks, type AxisTicks } from \"./axis\";\nimport { luminance, mix, toCss, unpackColor, type Rgba } from \"./color\";\nimport { nearestIndex } from \"./data\";\nimport { formatDuration, formatPercent, tickFormatter } from \"./format\";\nimport { numberFormat } from \"./locale\";\nimport {\n alongX,\n alongY,\n computePlot,\n createScales,\n heatCellStyle,\n screenRect,\n toData,\n toScreen,\n type Rect,\n type Scales,\n} from \"./layout\";\nimport {\n gridOf,\n plottedY,\n toPlotX,\n type ChartModel,\n type SeriesModel,\n} from \"./model\";\nimport type { PointLabel, ResolvedAnnotation } from \"./overlay\";\nimport type { ChartTheme } from \"./theme\";\nimport type { Range } from \"./viewport\";\nimport type {\n ChartAnnotation,\n ChartDependency,\n ChartHoverEvent,\n ChartHoverItem,\n ChartOptions,\n ChartPadding,\n ChartView,\n} from \"./types\";\n\nexport const MAX_POINT_LABELS = 300;\nexport const DEFAULT_PADDING = { top: 12, right: 16, bottom: 4, left: 4 };\n\nexport const fallbackResolve = (_value: string, fallback: Rgba) => fallback;\n\n/**\n * Annotation colors resolved against the theme; `mapY` / `mapX` turn values\n * into plotted units (log axes)\n */\nexport const resolveAnnotations = (\n annotations: readonly ChartAnnotation[] | undefined,\n theme: ChartTheme,\n mapY?: (value: number) => number,\n mapX?: (value: number) => number,\n): ResolvedAnnotation[] => {\n const resolve = theme.resolve ?? fallbackResolve;\n const y = <T extends number | undefined>(v: T): T =>\n (mapY && v !== undefined ? mapY(v) : v) as T;\n const x = <T extends number | undefined>(v: T): T =>\n (mapX && v !== undefined ? mapX(v) : v) as T;\n return (annotations ?? []).map((a) => {\n if (a.type === \"rect\") {\n const color = a.color ? resolve(a.color, theme.primary) : theme.primary;\n return {\n type: \"rect\",\n x0: x(a.x0),\n x1: x(a.x1),\n y0: y(a.y0),\n y1: y(a.y1),\n color,\n opacity: a.opacity ?? 0.08,\n label: a.label,\n labelPosition: a.labelPosition ?? \"top-left\",\n labelColor: a.labelColor\n ? resolve(a.labelColor, color)\n : mix(color, theme.text, 0.2),\n };\n }\n if (a.type === \"text\") {\n return {\n type: \"text\",\n x: x(a.x),\n y: y(a.y),\n text: a.text,\n anchor: a.anchor ?? \"center\",\n color: a.color ? resolve(a.color, theme.textMuted) : theme.textMuted,\n weight: a.weight ?? 500,\n };\n }\n return {\n type: \"line\",\n axis: a.axis,\n value: a.axis === \"y\" ? y(a.value) : x(a.value),\n color: a.color ? resolve(a.color, theme.textMuted) : theme.textMuted,\n width: a.width ?? 1,\n dash: [...(a.dash ?? [4, 4])],\n label: a.label,\n };\n });\n};\n\nexport interface ChartLayout {\n plot: Rect;\n scales: Scales;\n xTicks: AxisTicks;\n yTicks: AxisTicks;\n /** Ticks of the right axis: at the left tick positions, labelled in right axis units */\n y2Ticks: AxisTicks | null;\n}\n\nexport interface LayoutInput {\n model: ChartModel;\n view: ChartView;\n theme: ChartTheme;\n /** Size of the drawing area (legend excluded), CSS pixels */\n width: number;\n height: number;\n padding?: ChartPadding;\n /** Offset of the drawing area (e.g. below a legend) */\n top?: number;\n /** Width of a tick label in the theme font */\n measure: (text: string) => number;\n}\n\n/** Ticks, room for the axes and the plot rectangle */\nexport const layoutChart = (input: LayoutInput): ChartLayout => {\n const { model, view, theme, width, height, measure } = input;\n if (model.horizontal) return layoutHorizontal(input);\n // same count as the nice range of the model (its ends are then ticks),\n // fewer on short charts; category rows get a label each when they fit\n const yCount =\n model.y.tickCount ??\n (model.y.type === \"category\"\n ? Math.max(1, Math.floor((height - 40) / (theme.fontSize + 5)))\n : height >= 220\n ? 5\n : Math.max(2, Math.round((height - 48) / 52)));\n const yTicks = axisTicks(model.y, view.y, yCount);\n let yLabelWidth = 0;\n if (model.y.visible) {\n for (const label of yTicks.labels)\n yLabelWidth = Math.max(yLabelWidth, measure(label));\n }\n const y2Ticks = rightTicks(model, yTicks, view.y, yCount);\n let y2LabelWidth = 0;\n if (y2Ticks && model.y2?.visible) {\n for (const label of y2Ticks.labels)\n y2LabelWidth = Math.max(y2LabelWidth, measure(label));\n }\n let categoryWidth = 48;\n if (model.x.type === \"category\") {\n categoryWidth = 0;\n const step = Math.max(1, Math.floor(model.x.categories.length / 200));\n for (let i = 0; i < model.x.categories.length; i += step) {\n categoryWidth = Math.max(categoryWidth, measure(model.x.categories[i]));\n }\n }\n const padding = { ...DEFAULT_PADDING, ...input.padding };\n const plot = computePlot({\n width,\n height,\n padding,\n yLabelWidth: model.y.visible ? Math.ceil(yLabelWidth) : 0,\n y2LabelWidth: Math.ceil(y2LabelWidth),\n y2Title: !!model.y2?.title && !!model.y2.visible,\n xAxisVisible: model.x.visible,\n xTitle: !!model.x.title && model.x.visible,\n yTitle: !!model.y.title && model.y.visible,\n fontSize: theme.fontSize,\n });\n if (input.top) plot.y += input.top;\n const xCount =\n model.x.type === \"category\"\n ? Math.max(1, Math.floor(plot.width / (categoryWidth + 14)))\n : (model.x.tickCount ?? Math.max(3, Math.floor(plot.width / 88)));\n const xTicks = axisTicks(model.x, view.x, xCount);\n const scales = createScales(plot, view, model.x.reverse, model.y.reverse);\n return { plot, scales, xTicks, yTicks, y2Ticks };\n};\n\n/**\n * Right axis ticks: the left ticks labelled in right axis units; log axes\n * get their own decades\n */\nconst rightTicks = (\n model: ChartModel,\n yTicks: AxisTicks,\n view: Range,\n count: number,\n): AxisTicks | null => {\n const axis = model.y2;\n const map = model.y2Map;\n if (!axis || !map || !map.scale) return null;\n if (map.log) {\n const a = (view[0] - map.offset) / map.scale;\n const b = (view[1] - map.offset) / map.scale;\n const ticks = axisTicks(axis, [Math.min(a, b), Math.max(a, b)], count);\n return {\n ...ticks,\n values: ticks.values.map((e) => e * map.scale + map.offset),\n };\n }\n const raw = yTicks.values.map((v) => (v - map.offset) / map.scale);\n const step = raw.length > 1 ? Math.abs(raw[1] - raw[0]) : 1;\n let maxAbs = 0;\n for (const v of raw) maxAbs = Math.max(maxAbs, Math.abs(v));\n const tick = axis.format ?? tickFormatter(step, maxAbs, model.locale);\n return {\n values: yTicks.values,\n labels: raw.map(tick),\n formatValue: axis.format ?? model.formatValue,\n };\n};\n\n/** Horizontal charts: the x axis on the left, the values along the bottom */\nconst layoutHorizontal = (input: LayoutInput): ChartLayout => {\n const { model, view, theme, width, height, measure } = input;\n const rows = Math.max(1, Math.floor((height - 40) / (theme.fontSize + 5)));\n const xCount =\n model.x.tickCount ??\n (model.x.type === \"category\"\n ? rows\n : height >= 220\n ? 5\n : Math.max(2, Math.round((height - 48) / 52)));\n const xTicks = axisTicks(model.x, view.x, xCount);\n let xLabelWidth = 0;\n if (model.x.visible) {\n if (model.x.type === \"category\") {\n // every name (the visible ones change when zooming)\n const names = model.x.categories;\n const step = Math.max(1, Math.floor(names.length / 200));\n for (let i = 0; i < names.length; i += step) {\n const name = model.x.format ? model.x.format(i) : names[i];\n xLabelWidth = Math.max(xLabelWidth, measure(name));\n }\n } else {\n for (const label of xTicks.labels)\n xLabelWidth = Math.max(xLabelWidth, measure(label));\n }\n }\n const padding = { ...DEFAULT_PADDING, ...input.padding };\n const plot = computePlot({\n width,\n height,\n padding,\n yLabelWidth: model.x.visible ? Math.ceil(xLabelWidth) : 0,\n xAxisVisible: model.y.visible,\n xTitle: !!model.y.title && model.y.visible,\n yTitle: !!model.x.title && model.x.visible,\n fontSize: theme.fontSize,\n });\n if (input.top) plot.y += input.top;\n const yCount =\n model.y.tickCount ??\n (model.y.type === \"category\"\n ? Math.max(1, Math.floor(plot.width / 60))\n : Math.max(3, Math.min(8, Math.floor(plot.width / 88))));\n const yTicks = axisTicks(model.y, view.y, yCount);\n const scales = createScales(\n plot,\n view,\n model.x.reverse,\n model.y.reverse,\n true,\n );\n return { plot, scales, xTicks, yTicks, y2Ticks: null };\n};\n\n/** Labels of the visible scatter points and bar values (`showLabels`) */\nexport const collectPointLabels = (\n model: ChartModel,\n view: ChartView,\n s: Scales,\n yTicks?: AxisTicks | null,\n): PointLabel[] => {\n const labels: PointLabel[] = [];\n // 100% stacks: the axis shows percents, the labels the actual values\n const axisFormat = model.percent\n ? model.formatValue\n : (yTicks?.formatValue ?? model.formatValue);\n for (const series of model.series) {\n if (series.hidden || !series.showLabels) continue;\n if (series.type === \"bar\" && series.barTop) {\n // 100% stacks and right axis series: the values of the data\n const format =\n series.format ??\n (series.yAxis === \"right\"\n ? (model.y2?.format ?? model.formatValue)\n : axisFormat);\n const { x, count } = series.cols;\n const { y, y0, labels: texts } = series.raw;\n const top = series.barTop;\n const [x0, x1] = view.x[0] <= view.x[1] ? view.x : [view.x[1], view.x[0]];\n for (let i = 0; i < count && labels.length < MAX_POINT_LABELS; i++) {\n const xv = x[i] + series.barOffset;\n if (!Number.isFinite(y[i]) || xv < x0 || xv > x1) continue;\n // the end away from the base (the top, or the bottom of negative bars)\n const negative = top[i] < (series.barBase?.[i] ?? 0);\n const reversed = negative !== model.y.reverse;\n const p = toScreen(s, xv, top[i]);\n const step = series.floating && y0 && Number.isFinite(y0[i]);\n // ranges on a time axis (Gantt tasks) have no value to write\n if (step && model.y.type === \"time\" && !texts?.[i]) continue;\n const delta = step ? y[i] - (y0?.[i] ?? 0) : 0;\n labels.push({\n x: p.x,\n y: p.y,\n r: 0,\n text:\n texts?.[i] ??\n (step ? `${delta > 0 ? \"+\" : \"\"}${format(delta)}` : format(y[i])),\n placement: s.horizontal\n ? reversed\n ? \"left\"\n : \"right\"\n : reversed\n ? \"below\"\n : \"above\",\n });\n }\n continue;\n }\n if (series.type !== \"scatter\") continue;\n const { x, y, count, labels: texts, size } = series.cols;\n if (!texts) continue;\n for (let i = 0; i < count && labels.length < MAX_POINT_LABELS; i++) {\n const text = texts[i];\n if (!text) continue;\n const xi = x[i];\n const yi = y[i];\n if (xi < view.x[0] || xi > view.x[1] || yi < view.y[0] || yi > view.y[1])\n continue;\n const d = size && size[i] > 0 ? size[i] : series.pointSize;\n const p = toScreen(s, xi, yi);\n labels.push({ x: p.x, y: p.y, r: d / 2, text });\n }\n }\n return labels;\n};\n\n// ---------------------------------------------------------------- hit tests\n\ninterface Candidate {\n series: SeriesModel;\n index: number;\n /** Pixel position of the point */\n px: number;\n py: number;\n /** Distance along the x axis */\n dx: number;\n dist: number;\n inside: boolean;\n /** Box plots: value of the outlier under the pointer */\n outlier?: number;\n}\n\n/** Bars and box plots sit in a slot of their category */\nconst slotOffset = (s: SeriesModel) =>\n s.type === \"bar\" || s.type === \"boxplot\" ? s.barOffset : 0;\n\n/**\n * Screen position of a point (the end of a bar or stack, the close of a\n * candle, the median of a box)\n */\nexport const pointOf = (s: SeriesModel, i: number, sc: Scales) => {\n const p = toScreen(sc, s.cols.x[i] + slotOffset(s), plottedY(s, i));\n return { px: p.x, py: p.y };\n};\n\n/** Whether a pixel (along x, along y) is on a column from `a` to `b` */\nconst onColumn = (\n sc: Scales,\n center: number,\n half: number,\n a: number,\n b: number,\n ax: number,\n ay: number,\n) => {\n const pa = sc.yToPx(a);\n const pb = sc.yToPx(b);\n return (\n Math.abs(ax - center) <= half &&\n ay >= Math.min(pa, pb) - 2 &&\n ay <= Math.max(pa, pb) + 2\n );\n};\n\nconst candidateOf = (\n s: SeriesModel,\n i: number,\n px: number,\n py: number,\n sc: Scales,\n): Candidate => {\n const p = pointOf(s, i, sc);\n const ax = alongX(sc, px, py);\n const ay = alongY(sc, px, py);\n const center = sc.xToPx(s.cols.x[i] + slotOffset(s));\n let inside = false;\n if (s.type === \"bar\" && s.barBase && s.barTop) {\n const half = s.barHalfWidth / Math.abs(sc.xPerPx);\n inside = onColumn(sc, center, half, s.barBase[i], s.barTop[i], ax, ay);\n } else if (s.type === \"candlestick\" || s.type === \"boxplot\") {\n const { high, low, y } = s.cols;\n const half = Math.max(s.barHalfWidth / Math.abs(sc.xPerPx), 3);\n const a = high ? high[i] : y[i];\n const b = low ? low[i] : y[i];\n inside = onColumn(sc, center, half, a, b, ax, ay);\n }\n return {\n series: s,\n index: i,\n px: p.px,\n py: p.py,\n dx: Math.abs(sc.xToPx(s.cols.x[i]) - ax),\n dist: inside ? 0 : Math.hypot(p.px - px, p.py - py),\n inside,\n };\n};\n\n/** Outlier of a box under a pixel (`undefined` when none is in reach) */\nconst outlierAt = (\n s: SeriesModel,\n i: number,\n px: number,\n py: number,\n sc: Scales,\n slop: number,\n): number | undefined => {\n const list = s.cols.outliers?.[i];\n if (!list) return undefined;\n const center = sc.xToPx(s.cols.x[i] + slotOffset(s));\n const ax = alongX(sc, px, py) - center;\n const ay = alongY(sc, px, py);\n const reach = s.outlierSize / 2 + 4 + slop;\n let best: number | undefined;\n let bestDist = reach;\n list.forEach((v, k) => {\n const d = Math.hypot(ax, sc.yToPx(v) - ay);\n if (d <= bestDist) {\n bestDist = d;\n // the value of the data (right axis series are mapped)\n best = s.raw.outliers?.[i]?.[k] ?? v;\n }\n });\n return best;\n};\n\n/** Diameter of a scatter dot */\nexport const dotSize = (s: SeriesModel, i: number) =>\n s.cols.size && s.cols.size[i] > 0 ? s.cols.size[i] : s.pointSize;\n\nconst maxSizes = new WeakMap<Float32Array, number>();\n\n/** Largest dot of a series (bubbles reach further than plain dots) */\nconst maxDot = (s: SeriesModel) => {\n const sizes = s.cols.size;\n if (!sizes) return s.pointSize;\n let max = maxSizes.get(sizes);\n if (max === undefined) {\n max = s.pointSize;\n for (let i = 0; i < sizes.length; i++) if (sizes[i] > max) max = sizes[i];\n maxSizes.set(sizes, max);\n }\n return max;\n};\n\nconst nearestScatter = (\n s: SeriesModel,\n px: number,\n py: number,\n sc: Scales,\n slop: number,\n) => {\n const radius = Math.max(maxDot(s) / 2 + 6, 10) + slop;\n const at = toData(sc, px, py);\n const rx = radius * Math.abs(sc.xPerPx);\n const ry = radius * Math.abs(sc.yPerPx);\n let best = -1;\n let bestDist = Infinity;\n const { x, y } = s.cols;\n gridOf(s).query(at.x - rx, at.x + rx, at.y - ry, at.y + ry, (i) => {\n const p = toScreen(sc, x[i], y[i]);\n const d = Math.hypot(p.x - px, p.y - py);\n const reach = Math.max(dotSize(s, i) / 2 + 4, 8) + slop;\n if (d <= reach && d <= bestDist) {\n bestDist = d;\n best = i;\n }\n });\n return best;\n};\n\n/** Heatmap cell containing a data position, -1 if none */\nconst cellAt = (s: SeriesModel, xv: number, yv: number) => {\n const { x: hx, y: hy } = s.cellHalf;\n const { x, y } = s.cols;\n let found = -1;\n gridOf(s).query(xv - hx, xv + hx, yv - hy, yv + hy, (i) => {\n if (\n s.cellColors?.[i] &&\n Math.abs(x[i] - xv) <= hx &&\n Math.abs(y[i] - yv) <= hy\n ) {\n found = i;\n }\n });\n return found;\n};\n\nconst nearestX = (s: SeriesModel, xv: number) => {\n const { x, y, count, sorted } = s.cols;\n if (sorted) return nearestIndex(x, y, count, xv);\n let best = -1;\n let bestD = Infinity;\n for (let i = 0; i < count; i++) {\n if (!Number.isFinite(y[i])) continue;\n const d = Math.abs(x[i] - xv);\n if (d < bestD) {\n bestD = d;\n best = i;\n }\n }\n return best;\n};\n\n/** Hover payload item of a point (values of the data, right axis included) */\nexport const hoverItemOf = (s: SeriesModel, index: number): ChartHoverItem => {\n const pc = s.pointColors?.[index];\n const { open, high, low, value, y0, q1, q3, outliers, labels } = s.raw;\n const label = labels?.[index];\n let color = pc ? toCss(pc) : s.colorCss;\n const extra: Partial<ChartHoverItem> = {};\n if (s.type === \"candlestick\") {\n const o = open ? open[index] : NaN;\n if (Number.isFinite(o)) extra.open = o;\n if (high && Number.isFinite(high[index])) extra.high = high[index];\n if (low && Number.isFinite(low[index])) extra.low = low[index];\n color = toCss(s.raw.y[index] < o ? s.downColor : s.upColor);\n } else if (s.type === \"heatmap\") {\n const v = value ? value[index] : s.raw.y[index];\n if (Number.isFinite(v)) extra.value = v;\n const packed = s.cellColors?.[index];\n if (packed) color = toCss(unpackColor(packed));\n } else if (s.type === \"boxplot\") {\n if (high && Number.isFinite(high[index])) extra.high = high[index];\n if (low && Number.isFinite(low[index])) extra.low = low[index];\n if (q1 && Number.isFinite(q1[index])) extra.q1 = q1[index];\n if (q3 && Number.isFinite(q3[index])) extra.q3 = q3[index];\n const out = outliers?.[index];\n if (out) extra.outliers = out.length;\n } else {\n if (y0 && Number.isFinite(y0[index])) extra.y0 = y0[index];\n if (s.type === \"scatter\" && value && Number.isFinite(value[index]))\n extra.value = value[index];\n }\n return {\n seriesIndex: s.index,\n seriesId: s.id,\n seriesName: s.name,\n index,\n x: s.raw.x[index],\n y: s.raw.y[index],\n color,\n ...(label !== undefined ? { label } : {}),\n ...extra,\n };\n};\n\nconst eventOf = (\n candidates: Candidate[],\n xTicks: AxisTicks | null,\n): ChartHoverEvent | null => {\n if (!candidates.length) return null;\n candidates.sort((a, b) => a.series.index - b.series.index);\n const items = candidates.map((c) => {\n const item = hoverItemOf(c.series, c.index);\n if (c.outlier !== undefined) item.outlier = c.outlier;\n return item;\n });\n const x = items[0].x;\n return { items, x, xLabel: xTicks?.formatValue(x) ?? String(x) };\n};\n\n/**\n * Points under a pixel of the stage: the nearest point (scatter / `nearest`\n * tooltips) or every series at the nearest x (`axis` tooltips).\n * `slop` widens the reach of the dots (touch screens).\n */\nexport const hitTest = (\n model: ChartModel,\n sc: Scales,\n xTicks: AxisTicks | null,\n px: number,\n py: number,\n slop = 0,\n): ChartHoverEvent | null => {\n const { plot } = sc;\n const margin = 6 + slop;\n if (\n px < plot.x - margin ||\n px > plot.x + plot.width + margin ||\n py < plot.y - margin ||\n py > plot.y + plot.height + margin\n ) {\n return null;\n }\n const at = toData(sc, px, py);\n const scatter: Candidate[] = [];\n const others: Candidate[] = [];\n for (const s of model.series) {\n if (s.hidden || !s.tooltip || s.cols.count === 0) continue;\n if (s.type === \"scatter\") {\n const i = nearestScatter(s, px, py, sc, slop);\n if (i >= 0) scatter.push(candidateOf(s, i, px, py, sc));\n } else if (s.type === \"heatmap\") {\n const i = cellAt(s, at.x, at.y);\n if (i >= 0) {\n const c = candidateOf(s, i, px, py, sc);\n c.inside = true;\n c.dist = 0;\n scatter.push(c);\n }\n } else {\n const i = nearestX(s, at.x);\n if (i < 0) continue;\n const c = candidateOf(s, i, px, py, sc);\n if (s.type === \"boxplot\") {\n c.outlier = outlierAt(s, i, px, py, sc, slop);\n if (c.outlier !== undefined) {\n c.inside = true;\n c.dist = 0;\n }\n }\n others.push(c);\n }\n }\n if (model.tooltipMode === \"item\") {\n // the shape under the pointer only: bars, boxes, cells, dots in reach\n // and lines within a few pixels; the last drawn wins\n const all = [...scatter, ...others].filter(\n (c) =>\n c.inside ||\n c.series.type === \"scatter\" ||\n ((c.series.type === \"line\" || c.series.type === \"area\") &&\n c.dist <= 8 + slop),\n );\n if (!all.length) return null;\n const best = all.reduce((a, b) =>\n b.dist < a.dist || (b.dist === a.dist && b.series.index > a.series.index)\n ? b\n : a,\n );\n return eventOf([best], xTicks);\n }\n if (model.tooltipMode === \"nearest\") {\n const all = [...scatter, ...others].filter(\n (c) => c.inside || c.series.type === \"scatter\" || c.dist <= 32 + slop,\n );\n if (!all.length) return null;\n const best = all.reduce((a, b) => (b.dist <= a.dist ? b : a));\n return eventOf([best], xTicks);\n }\n if (!others.length) {\n if (!scatter.length) return null;\n return eventOf(\n [scatter.reduce((a, b) => (b.dist <= a.dist ? b : a))],\n xTicks,\n );\n }\n const bestDx = Math.min(...others.map((c) => c.dx));\n const bandPx = model.x.type === \"category\" ? 0.5 / Math.abs(sc.xPerPx) : 0;\n const aligned = others.filter((c) => c.dx <= bestDx + Math.max(1, bandPx));\n const first = aligned.reduce((a, b) => (b.dx < a.dx ? b : a));\n const ordered = [first, ...aligned.filter((c) => c !== first), ...scatter];\n const event = eventOf(ordered, xTicks);\n if (event) {\n event.x = hoverItemOf(first.series, first.index).x;\n event.xLabel = xTicks?.formatValue(event.x) ?? String(event.x);\n }\n return event;\n};\n\n/** Whether two hover payloads point at the same points */\nexport const sameHover = (\n a: ChartHoverEvent | null,\n b: ChartHoverEvent | null,\n): boolean =>\n a === b ||\n (!!a &&\n !!b &&\n a.items.length === b.items.length &&\n a.items.every(\n (it, i) =>\n it.index === b.items[i].index &&\n it.seriesIndex === b.items[i].seriesIndex,\n ));\n\n// ------------------------------------------------------------------ tooltip\n\n/** Change of a candlestick: `+1.25%` */\nconst CHANGE_PERCENT: Intl.NumberFormatOptions = {\n style: \"percent\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n};\n\nexport interface TooltipRow {\n /** Swatch color (CSS) */\n color: string | null;\n name: string;\n value: string;\n}\n\nexport interface TooltipContent {\n title: string;\n /** Swatch of the title (single scatter point, Gantt task) */\n titleColor: string | null;\n /** Muted line below the title (the group of a Gantt task) */\n subtitle?: string;\n rows: TooltipRow[];\n}\n\n/** Extra rows of a point (`details` of its datum) */\nconst detailRows = (s: SeriesModel, index: number): TooltipRow[] =>\n s.raw.details?.[index]?.map((d) => ({\n color: null,\n name: d.name,\n value: d.value,\n })) ?? [];\n\n/**\n * Default tooltip content of a hover payload; `y2Ticks` formats the values\n * of the right axis series\n */\nexport const tooltipContent = (\n model: ChartModel,\n event: ChartHoverEvent,\n yTicks: AxisTicks | null,\n y2Ticks: AxisTicks | null = null,\n): TooltipContent => {\n const yFormat = yTicks?.formatValue ?? String;\n const formatOf = (s: SeriesModel) =>\n s.format ??\n (s.yAxis === \"right\"\n ? (y2Ticks?.formatValue ?? model.y2?.format ?? model.formatValue)\n : yFormat);\n const names = model.labels;\n const first = event.items[0];\n const firstSeries = first ? model.series[first.seriesIndex] : null;\n if (\n event.items.length === 1 &&\n first &&\n firstSeries?.type === \"bar\" &&\n first.y0 !== undefined &&\n model.y.type === \"time\"\n ) {\n // a task of a Gantt chart / timeline: its dates and its length\n const format = formatOf(firstSeries);\n const title = first.label ?? event.xLabel;\n return {\n title,\n titleColor: first.color,\n subtitle:\n first.label !== undefined\n ? `${event.xLabel} · ${firstSeries.name}`\n : firstSeries.name,\n rows: [\n { color: null, name: names.start, value: format(first.y0) },\n { color: null, name: names.end, value: format(first.y) },\n {\n color: null,\n name: names.duration,\n value: formatDuration(first.y - first.y0, model.locale),\n },\n ...detailRows(firstSeries, first.index),\n ],\n };\n }\n if (event.items.length === 1 && firstSeries?.type === \"heatmap\") {\n const yName =\n model.y.type === \"category\"\n ? (model.y.categories[Math.round(first.y)] ?? yFormat(first.y))\n : yFormat(first.y);\n return {\n title: `${event.xLabel} · ${yName}`,\n titleColor: null,\n rows: [\n {\n color: first.color,\n name: first.label ?? firstSeries.name,\n value:\n first.value === undefined\n ? \"–\"\n : (firstSeries.format ?? model.formatValue)(first.value),\n },\n ...detailRows(firstSeries, first.index),\n ],\n };\n }\n const scatterOnly = event.items.every(\n (it) => model.series[it.seriesIndex].type === \"scatter\",\n );\n if (scatterOnly && event.items.length === 1) {\n const it = event.items[0];\n const s = model.series[it.seriesIndex];\n const valueRow: TooltipRow[] =\n it.value !== undefined\n ? [\n {\n color: null,\n name: s.valueName ?? names.value,\n value: (s.format ?? model.formatValue)(it.value),\n },\n ]\n : [];\n if (model.x.type === \"category\") {\n // a dot on a category (Gantt milestones, dot plots)\n return {\n title: it.label ?? event.xLabel,\n titleColor: null,\n rows: [\n { color: it.color, name: it.seriesName, value: formatOf(s)(it.y) },\n ...valueRow,\n ...detailRows(s, it.index),\n ],\n };\n }\n const yAxisFormat =\n s.yAxis === \"right\"\n ? (y2Ticks?.formatValue ?? model.y2?.format ?? model.formatValue)\n : yFormat;\n const rows: TooltipRow[] = [\n { color: null, name: model.x.title ?? names.x, value: event.xLabel },\n {\n color: null,\n name:\n (s.yAxis === \"right\" ? model.y2?.title : model.y.title) ?? names.y,\n // bubbles: `format` is the one of their value, y keeps the axis one\n value: (it.value !== undefined ? yAxisFormat : formatOf(s))(it.y),\n },\n ...valueRow,\n ...detailRows(s, it.index),\n ];\n return {\n title: it.label ?? it.seriesName,\n titleColor: it.color,\n // a named point of a group: the group under its name\n ...(it.label !== undefined && model.series.length > 1\n ? { subtitle: it.seriesName }\n : {}),\n rows,\n };\n }\n const rows: TooltipRow[] = [];\n /** Row of every item */\n const rowOf: number[] = [];\n // one labelled bar on a numeric axis (a histogram bin): the label is the title\n const binTitle =\n event.items.length === 1 &&\n firstSeries?.type === \"bar\" &&\n model.x.type !== \"category\" &&\n first?.label !== undefined\n ? first.label\n : null;\n for (const it of event.items) {\n const s = model.series[it.seriesIndex];\n const format = formatOf(s);\n rowOf.push(rows.length);\n if (s.type === \"candlestick\") {\n const change =\n it.open !== undefined && it.open !== 0\n ? ((it.y - it.open) / Math.abs(it.open)) * 100\n : NaN;\n rows.push({\n color: it.color,\n name: s.name,\n value: Number.isFinite(change)\n ? `${change >= 0 ? \"+\" : \"\"}${numberFormat(model.locale, CHANGE_PERCENT).format(change / 100)}`\n : \"\",\n });\n const ohlc: [string, number | undefined][] = [\n [names.open, it.open],\n [names.high, it.high],\n [names.low, it.low],\n [names.close, it.y],\n ];\n for (const [name, v] of ohlc) {\n if (v !== undefined && Number.isFinite(v))\n rows.push({ color: null, name, value: format(v) });\n }\n continue;\n }\n if (s.type === \"boxplot\") {\n if (it.outlier !== undefined) {\n // an outlier: its value and its group\n rows.push(\n {\n color: it.color,\n name: it.label ? `${it.seriesName} · ${it.label}` : it.seriesName,\n value: \"\",\n },\n { color: null, name: names.outlier, value: format(it.outlier) },\n );\n continue;\n }\n rows.push({\n color: it.color,\n name: it.label ? `${it.seriesName} · ${it.label}` : it.seriesName,\n value: \"\",\n });\n const stats: [string, number | undefined][] = [\n [names.max, it.high],\n [names.q3, it.q3],\n [names.median, it.y],\n [names.q1, it.q1],\n [names.min, it.low],\n ];\n for (const [name, v] of stats) {\n if (v !== undefined && Number.isFinite(v))\n rows.push({ color: null, name, value: format(v) });\n }\n if (it.outliers)\n rows.push({\n color: null,\n name: names.outliers,\n value: String(it.outliers),\n });\n continue;\n }\n let value = format(it.y);\n if (it.y0 !== undefined) {\n // waterfall steps: the change; time ranges and bands: both ends\n const delta = it.y - it.y0;\n value =\n s.type === \"bar\" && model.y.type !== \"time\"\n ? `${delta > 0 ? \"+\" : \"\"}${format(delta)}`\n : `${format(it.y0)} – ${format(it.y)}`;\n }\n rows.push({\n color: it.color,\n name:\n it.label && binTitle === null\n ? `${it.seriesName} · ${it.label}`\n : it.seriesName,\n value,\n });\n rows.push(...detailRows(s, it.index));\n }\n if (model.percent) {\n // 100% stacks: the share of every value next to it\n const totals = new Map<string, number>();\n for (const it of event.items) {\n const stack = stackIdOf(model, it.seriesIndex);\n if (stack !== null && Number.isFinite(it.y))\n totals.set(stack, (totals.get(stack) ?? 0) + Math.abs(it.y));\n }\n event.items.forEach((it, k) => {\n const stack = stackIdOf(model, it.seriesIndex);\n const total = stack !== null ? totals.get(stack) : undefined;\n const row = rows[rowOf[k]];\n if (total && row && Number.isFinite(it.y)) {\n const format = model.series[it.seriesIndex].format ?? model.formatValue;\n row.value = `${format(it.y)} · ${formatPercent((Math.abs(it.y) / total) * 100, model.locale, true)}`;\n }\n });\n }\n return { title: binTitle ?? event.xLabel, titleColor: null, rows };\n};\n\n/** Stack of a series in a 100% chart (`null` when it is not stacked) */\nconst stackIdOf = (model: ChartModel, seriesIndex: number): string | null =>\n model.series[seriesIndex].hidden ? null : model.stacks[seriesIndex];\n\n/**\n * Shape of the hover marker of an item: a dot with a soft halo on a point,\n * a band behind the hovered bar group / candle, or the outline of a cell\n */\nexport type HoverMark =\n | {\n kind: \"dot\";\n x: number;\n y: number;\n size: number;\n color: string;\n /** Translucent series color of the halo around the dot */\n halo: string;\n }\n | { kind: \"band\"; x: number; y: number; width: number; height: number }\n | {\n /** Soft band over the row / column of a hovered cell (above the data) */\n kind: \"guide\";\n x: number;\n y: number;\n width: number;\n height: number;\n }\n | {\n /** The hovered cell, lifted, with a ring inside its edge */\n kind: \"cell\";\n x: number;\n y: number;\n width: number;\n height: number;\n /** Fill of the cell (CSS) */\n color: string;\n /** Ring color (CSS), contrasting with the fill */\n ring: string;\n radius: number;\n };\n\n/** Markers of the hovered points (pixels of the stage); bands come first */\nexport const hoverMarks = (\n model: ChartModel,\n sc: Scales,\n event: ChartHoverEvent,\n): HoverMark[] => {\n const marks: HoverMark[] = [];\n const { plot } = sc;\n let bandLo = Infinity;\n let bandHi = -Infinity;\n for (const it of event.items) {\n const s = model.series[it.seriesIndex];\n // plotted x (the logarithm on log x axes)\n const itX = s.cols.x[it.index] ?? it.x;\n if (s.type === \"boxplot\" && it.outlier !== undefined) {\n const p = toScreen(sc, itX + slotOffset(s), plottedOutlier(s, it));\n marks.push({\n kind: \"dot\",\n x: p.x,\n y: p.y,\n size: s.outlierSize + 3,\n color: it.color,\n halo: toCss(s.pointColors?.[it.index] ?? s.color, 0.2),\n });\n continue;\n }\n if (s.type === \"bar\" || s.type === \"candlestick\" || s.type === \"boxplot\") {\n const c = sc.xToPx(itX + slotOffset(s));\n const half = Math.max(s.barHalfWidth / Math.abs(sc.xPerPx), 1);\n bandLo = Math.min(bandLo, c - half);\n bandHi = Math.max(bandHi, c + half);\n continue;\n }\n if (s.type === \"heatmap\") {\n const cx = sc.xToPx(itX);\n const cy = sc.yToPx(it.y);\n const hw = Math.abs(s.cellHalf.x / sc.xPerPx);\n const hh = Math.abs(s.cellHalf.y / sc.yPerPx);\n const cell = screenRect(sc, cx - hw, cx + hw, cy - hh, cy + hh);\n const style = heatCellStyle(cell.width, cell.height, s.radius);\n // the row and the column, clipped to the plot\n const top = Math.max(plot.y, cell.y);\n const bottom = Math.min(plot.y + plot.height, cell.y + cell.height);\n const left = Math.max(plot.x, cell.x);\n const right = Math.min(plot.x + plot.width, cell.x + cell.width);\n if (bottom > top)\n marks.push({\n kind: \"guide\",\n x: plot.x,\n y: top,\n width: plot.width,\n height: bottom - top,\n });\n if (right > left)\n marks.push({\n kind: \"guide\",\n x: left,\n y: plot.y,\n width: right - left,\n height: plot.height,\n });\n const packed = s.cellColors?.[it.index];\n const fill = packed ? unpackColor(packed) : s.color;\n marks.push({\n kind: \"cell\",\n x: cell.x + style.inset,\n y: cell.y + style.inset,\n width: Math.max(1, cell.width - style.inset * 2),\n height: Math.max(1, cell.height - style.inset * 2),\n color: it.color,\n ring: contrastRing(fill),\n radius: style.radius,\n });\n continue;\n }\n const { px, py } = pointOf(s, it.index, sc);\n if (\n px < plot.x - 1 ||\n px > plot.x + plot.width + 1 ||\n py < plot.y - 1 ||\n py > plot.y + plot.height + 1\n ) {\n continue;\n }\n const size =\n s.type === \"scatter\"\n ? dotSize(s, it.index) + 4\n : Math.max(9, s.lineWidth * 2 + 5);\n const rgba = s.pointColors?.[it.index] ?? s.color;\n marks.push({\n kind: \"dot\",\n x: px,\n y: py,\n size,\n color: it.color,\n halo: toCss(rgba, 0.2),\n });\n }\n if (bandHi > bandLo) {\n // the group of bars plus a margin, clipped to the plot\n const pad = Math.max(4, (bandHi - bandLo) * 0.14);\n const lo = sc.horizontal ? plot.y : plot.x;\n const hi = lo + (sc.horizontal ? plot.height : plot.width);\n const a = Math.max(lo, bandLo - pad);\n const b = Math.min(hi, bandHi + pad);\n if (b > a) {\n marks.unshift({\n kind: \"band\",\n ...(sc.horizontal\n ? { x: plot.x, y: a, width: plot.width, height: b - a }\n : { x: a, y: plot.y, width: b - a, height: plot.height }),\n });\n }\n }\n return marks;\n};\n\n/** Ring of a hovered cell: light on dark fills, dark on light ones */\nexport const contrastRing = (fill: Rgba): string =>\n luminance(fill) > 0.45\n ? \"rgba(15, 23, 42, 0.78)\"\n : \"rgba(255, 255, 255, 0.9)\";\n\n/** Plotted value of the hovered outlier of a box */\nconst plottedOutlier = (s: SeriesModel, it: ChartHoverItem): number => {\n const raw = s.raw.outliers?.[it.index];\n const k = raw ? raw.indexOf(it.outlier ?? NaN) : -1;\n return (\n (k >= 0 ? s.cols.outliers?.[it.index]?.[k] : undefined) ?? it.outlier ?? 0\n );\n};\n\n/** A line from the end of a bar to the next bar, pixels of the stage */\nexport interface ConnectorSegment {\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n color: string;\n width: number;\n dash: number[];\n}\n\n/**\n * Connectors of the bar series (`connector`, waterfalls): from the end of\n * every bar to the next bar, at the value where the next one starts\n */\nexport const connectorSegments = (\n model: ChartModel,\n sc: Scales,\n): ConnectorSegment[] => {\n const out: ConnectorSegment[] = [];\n for (const s of model.series) {\n const c = s.connector;\n if (!c || s.hidden || s.type !== \"bar\" || !s.barTop) continue;\n const { x, count } = s.cols;\n const top = s.barTop;\n const half = s.barHalfWidth;\n const [v0, v1] =\n sc.view.x[0] <= sc.view.x[1] ? sc.view.x : [sc.view.x[1], sc.view.x[0]];\n const color = toCss(c.color, 0.75);\n let prev = -1;\n for (let i = 0; i < count && out.length < MAX_POINT_LABELS * 4; i++) {\n if (!Number.isFinite(top[i]) || !Number.isFinite(x[i])) continue;\n if (prev >= 0 && x[i] + half >= v0 && x[prev] - half <= v1) {\n const a = toScreen(sc, x[prev] + s.barOffset + half, top[prev]);\n const b = toScreen(sc, x[i] + s.barOffset - half, top[prev]);\n out.push({\n x0: a.x,\n y0: a.y,\n x1: b.x,\n y1: b.y,\n color,\n width: c.width,\n dash: c.dash,\n });\n }\n prev = i;\n }\n }\n return out;\n};\n\n/** A dependency with its color resolved against the theme */\nexport interface ResolvedDependency {\n from: string;\n to: string;\n color: string;\n}\n\n/** Colors of the dependency arrows (resolved once per options / theme) */\nexport const resolveDependencies = (\n dependencies: readonly ChartDependency[] | undefined,\n theme: ChartTheme,\n): ResolvedDependency[] => {\n const resolve = theme.resolve ?? fallbackResolve;\n const muted = toCss(theme.textMuted, 0.85);\n return (dependencies ?? []).map((d) => ({\n from: d.from,\n to: d.to,\n color: d.color ? toCss(resolve(d.color, theme.textMuted)) : muted,\n }));\n};\n\n/**\n * Elbow arrow between two bars, pixels of the stage: an axis-aligned\n * polyline ending at the base of a filled triangular head\n */\nexport interface DependencyArrow {\n /** Corners of the line, from the end of the predecessor to the base of the head */\n points: { x: number; y: number }[];\n /** Tip and the two base corners of the arrowhead */\n head: [\n { x: number; y: number },\n { x: number; y: number },\n { x: number; y: number },\n ];\n color: string;\n width: number;\n}\n\n/** Length and half width of the arrowheads, in CSS pixels */\nexport const ARROW_HEAD = { length: 6, half: 3.5 };\n\ninterface RowSpan {\n /** Category position of the bar center */\n at: number;\n start: number;\n end: number;\n /** Half thickness of the bar / radius of the dot in pixels */\n half: number;\n /** A dot (milestone): the arrows stop at its edge */\n dot: boolean;\n}\n\n/** Bars (or dots) of every category, the first visible one per category */\nconst rowSpans = (model: ChartModel, sc: Scales): Map<number, RowSpan> => {\n const rows = new Map<number, RowSpan>();\n for (const s of model.series) {\n if (s.hidden || !s.tooltip) continue;\n if (s.type !== \"bar\" && s.type !== \"scatter\") continue;\n const { x, y, count } = s.cols;\n const bar = s.type === \"bar\" && s.barBase && s.barTop;\n const half = bar ? s.barHalfWidth / Math.abs(sc.xPerPx) : dotSize(s, 0) / 2;\n for (let i = 0; i < count; i++) {\n const k = Math.round(x[i]);\n if (rows.has(k)) continue;\n const start = bar ? s.barBase![i] : y[i];\n const end = bar ? s.barTop![i] : y[i];\n if (!Number.isFinite(start) || !Number.isFinite(end)) continue;\n rows.set(k, {\n at: x[i] + slotOffset(s),\n start: Math.min(start, end),\n end: Math.max(start, end),\n half,\n dot: !bar,\n });\n }\n }\n return rows;\n};\n\n/**\n * Dependency arrows (`dependencies`, Gantt charts): from the end of the\n * predecessor to the start of the successor; when the successor starts\n * too early the line turns around between the rows\n */\nexport const dependencyArrows = (\n model: ChartModel,\n sc: Scales,\n dependencies: readonly ResolvedDependency[],\n): DependencyArrow[] => {\n if (!dependencies.length || model.x.type !== \"category\") return [];\n const rows = rowSpans(model, sc);\n const index = new Map<string, number>();\n model.x.categories.forEach((c, i) => {\n if (!index.has(c)) index.set(c, i);\n });\n // (value pixel, category pixel) -> stage pixels\n const horizontal = sc.horizontal;\n const pt = (v: number, c: number) =>\n horizontal ? { x: v, y: c } : { x: c, y: v };\n const valuePx = (value: number) => {\n const p = toScreen(sc, 0, value);\n return horizontal ? p.x : p.y;\n };\n const categoryPx = (at: number) => {\n const p = toScreen(sc, at, 0);\n return horizontal ? p.y : p.x;\n };\n const dir = Math.sign(valuePx(sc.view.y[1]) - valuePx(sc.view.y[0])) || 1;\n const rowPx = Math.abs(categoryPx(1) - categoryPx(0));\n const { length, half } = ARROW_HEAD;\n const gap = 8;\n const out: DependencyArrow[] = [];\n for (const d of dependencies) {\n const a = rows.get(index.get(d.from) ?? NaN);\n const b = rows.get(index.get(d.to) ?? NaN);\n if (!a || !b || a === b) continue;\n const ev = valuePx(a.end) + (a.dot ? dir * a.half : 0);\n const ca = categoryPx(a.at);\n const sv = valuePx(b.start) - dir * (b.dot ? b.half + 1 : 1);\n const cb = categoryPx(b.at);\n const base = sv - dir * length;\n const points = [pt(ev, ca)];\n const exit = ev + dir * gap;\n if (dir * (base - exit) >= 0) {\n // room before the successor: out, across the rows, in\n points.push(pt(exit, ca), pt(exit, cb), pt(base, cb));\n } else {\n // around: out, to the gap between the rows, back, across, in\n const side = Math.sign(cb - ca) || 1;\n const between = ca + side * Math.max(a.half + 3, rowPx / 2);\n const back = base - dir * gap;\n points.push(\n pt(exit, ca),\n pt(exit, between),\n pt(back, between),\n pt(back, cb),\n pt(base, cb),\n );\n }\n out.push({\n points,\n head: [pt(sv, cb), pt(base, cb - half), pt(base, cb + half)],\n color: d.color,\n width: 1.25,\n });\n }\n return out;\n};\n\n/** Visual map of a heatmap: its color ramp and the values at the ends */\nexport interface ColorLegend {\n seriesIndex: number;\n /** CSS colors at even steps from the lowest to the highest value */\n stops: string[];\n /** Labels along the ramp (`at`: 0-1): the ends, and the middle of diverging ramps */\n labels: { at: number; text: string }[];\n}\n\nconst COLOR_STOPS = 12;\n\n/**\n * Color legend of a heatmap chart (every series is a heatmap; the first\n * visible one), `null` otherwise\n */\nexport const colorLegend = (model: ChartModel): ColorLegend | null => {\n if (!model.series.length || model.series.some((s) => s.type !== \"heatmap\"))\n return null;\n const s = model.series.find((it) => !it.hidden && it.colorLut);\n const lut = s?.colorLut;\n if (!s || !lut) return null;\n const stops: string[] = [];\n for (let k = 0; k < COLOR_STOPS; k++) {\n const packed = lut[Math.round((k / (COLOR_STOPS - 1)) * (lut.length - 1))];\n stops.push(toCss(unpackColor(packed ?? 0)));\n }\n const format = s.format ?? model.formatValue;\n const [lo, hi] = s.valueRange;\n const labels = [\n { at: 0, text: format(lo) },\n { at: 1, text: format(hi) },\n ];\n const mid = s.colorMidpoint;\n if (mid !== null && mid > lo && mid < hi)\n labels.splice(1, 0, { at: 0.5, text: format(mid) });\n return { seriesIndex: s.index, stops, labels };\n};\n\n/** Whether the legend shows (`legend` option; heatmaps get their color legend) */\nexport const legendShown = (\n option: ChartOptions[\"legend\"],\n model: ChartModel,\n named: number,\n): boolean =>\n option === undefined ? named > 1 || colorLegend(model) !== null : !!option;\n\n/** Swatch of a series in the legend */\nexport const legendShape = (\n type: SeriesModel[\"type\"],\n): \"dot\" | \"line\" | \"square\" =>\n type === \"scatter\" ? \"dot\" : type === \"line\" ? \"line\" : \"square\";\n\n/** Whether the guide line follows the pointer */\nexport const showsCrosshair = (\n model: ChartModel,\n event: ChartHoverEvent,\n crosshair: boolean | undefined,\n) =>\n crosshair ??\n (model.tooltipMode === \"axis\" &&\n event.items.some((it) => {\n const type = model.series[it.seriesIndex].type;\n return type === \"line\" || type === \"area\";\n }) &&\n // bars get a band instead\n !event.items.some((it) => {\n const type = model.series[it.seriesIndex].type;\n return type === \"bar\" || type === \"candlestick\" || type === \"boxplot\";\n }));\n\n/** Pixel of the guide line along the x axis (`null` when hidden / outside the plot) */\nexport const crosshairAt = (\n model: ChartModel,\n sc: Scales,\n event: ChartHoverEvent,\n crosshair: boolean | undefined,\n): number | null => {\n if (!showsCrosshair(model, event, crosshair)) return null;\n const first = event.items[0];\n const c = sc.xToPx(\n model.series[first.seriesIndex]?.cols.x[first.index] ??\n toPlotX(model, first.x),\n );\n const lo = sc.horizontal ? sc.plot.y : sc.plot.x;\n const hi = lo + (sc.horizontal ? sc.plot.height : sc.plot.width);\n return c >= lo && c <= hi ? c : null;\n};\n"],"mappings":"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"}
|