minerva-design 1.4.0 → 1.5.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 +9 -0
- package/README.md +21 -21
- package/custom-elements.json +4047 -1703
- package/dist/angular/fesm2022/minerva-angular.mjs +1436 -5
- package/dist/angular/fesm2022/minerva-angular.mjs.map +1 -1
- package/dist/angular/types/minerva-angular.d.ts +573 -4
- package/dist/charts/canvas.d.cts +2 -2
- package/dist/charts/canvas.d.ts +2 -2
- package/dist/charts/core.cjs +1 -1
- package/dist/charts/core.d.cts +6 -4
- package/dist/charts/core.d.ts +6 -4
- package/dist/charts/core.js +24 -16
- package/dist/charts/engine/axis.cjs +1 -1
- package/dist/charts/engine/axis.cjs.map +1 -1
- package/dist/charts/engine/axis.js +42 -19
- package/dist/charts/engine/axis.js.map +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 +154 -127
- 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 +365 -251
- package/dist/charts/engine/chart.js.map +1 -1
- package/dist/charts/engine/color.cjs +1 -1
- package/dist/charts/engine/color.cjs.map +1 -1
- package/dist/charts/engine/color.d.cts +18 -0
- package/dist/charts/engine/color.d.ts +18 -0
- package/dist/charts/engine/color.js +48 -2
- package/dist/charts/engine/color.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 +32 -1
- package/dist/charts/engine/controller.d.ts +32 -1
- package/dist/charts/engine/controller.js +310 -263
- package/dist/charts/engine/controller.js.map +1 -1
- package/dist/charts/engine/data.cjs +1 -1
- package/dist/charts/engine/data.cjs.map +1 -1
- package/dist/charts/engine/data.d.cts +3 -1
- package/dist/charts/engine/data.d.ts +3 -1
- package/dist/charts/engine/data.js +6 -4
- package/dist/charts/engine/data.js.map +1 -1
- package/dist/charts/engine/defaults.cjs +2 -0
- package/dist/charts/engine/defaults.cjs.map +1 -0
- package/dist/charts/engine/defaults.d.cts +20 -0
- package/dist/charts/engine/defaults.d.ts +20 -0
- package/dist/charts/engine/defaults.js +35 -0
- package/dist/charts/engine/defaults.js.map +1 -0
- package/dist/charts/engine/format.cjs +1 -1
- package/dist/charts/engine/format.cjs.map +1 -1
- package/dist/charts/engine/format.d.cts +6 -0
- package/dist/charts/engine/format.d.ts +6 -0
- package/dist/charts/engine/format.js +15 -2
- package/dist/charts/engine/format.js.map +1 -1
- package/dist/charts/engine/graph/chart.cjs +2 -0
- package/dist/charts/engine/graph/chart.cjs.map +1 -0
- package/dist/charts/engine/graph/chart.d.cts +3 -0
- package/dist/charts/engine/graph/chart.d.ts +3 -0
- package/dist/charts/engine/graph/chart.js +1565 -0
- package/dist/charts/engine/graph/chart.js.map +1 -0
- package/dist/charts/engine/graph/circular.cjs +2 -0
- package/dist/charts/engine/graph/circular.cjs.map +1 -0
- package/dist/charts/engine/graph/circular.d.cts +16 -0
- package/dist/charts/engine/graph/circular.d.ts +16 -0
- package/dist/charts/engine/graph/circular.js +62 -0
- package/dist/charts/engine/graph/circular.js.map +1 -0
- package/dist/charts/engine/graph/dag.cjs +2 -0
- package/dist/charts/engine/graph/dag.cjs.map +1 -0
- package/dist/charts/engine/graph/dag.d.cts +34 -0
- package/dist/charts/engine/graph/dag.d.ts +34 -0
- package/dist/charts/engine/graph/dag.js +314 -0
- package/dist/charts/engine/graph/dag.js.map +1 -0
- package/dist/charts/engine/graph/dom.cjs +2 -0
- package/dist/charts/engine/graph/dom.cjs.map +1 -0
- package/dist/charts/engine/graph/dom.d.cts +23 -0
- package/dist/charts/engine/graph/dom.d.ts +23 -0
- package/dist/charts/engine/graph/dom.js +158 -0
- package/dist/charts/engine/graph/dom.js.map +1 -0
- package/dist/charts/engine/graph/force.cjs +2 -0
- package/dist/charts/engine/graph/force.cjs.map +1 -0
- package/dist/charts/engine/graph/force.d.cts +67 -0
- package/dist/charts/engine/graph/force.d.ts +67 -0
- package/dist/charts/engine/graph/force.js +325 -0
- package/dist/charts/engine/graph/force.js.map +1 -0
- package/dist/charts/engine/graph/geometry.cjs +2 -0
- package/dist/charts/engine/graph/geometry.cjs.map +1 -0
- package/dist/charts/engine/graph/geometry.d.cts +37 -0
- package/dist/charts/engine/graph/geometry.d.ts +37 -0
- package/dist/charts/engine/graph/geometry.js +144 -0
- package/dist/charts/engine/graph/geometry.js.map +1 -0
- package/dist/charts/engine/graph/index.cjs +1 -0
- package/dist/charts/engine/graph/index.d.cts +6 -0
- package/dist/charts/engine/graph/index.d.ts +6 -0
- package/dist/charts/engine/graph/index.js +6 -0
- package/dist/charts/engine/graph/labels.cjs +2 -0
- package/dist/charts/engine/graph/labels.cjs.map +1 -0
- package/dist/charts/engine/graph/labels.d.cts +12 -0
- package/dist/charts/engine/graph/labels.d.ts +12 -0
- package/dist/charts/engine/graph/labels.js +128 -0
- package/dist/charts/engine/graph/labels.js.map +1 -0
- package/dist/charts/engine/graph/model.cjs +2 -0
- package/dist/charts/engine/graph/model.cjs.map +1 -0
- package/dist/charts/engine/graph/model.d.cts +43 -0
- package/dist/charts/engine/graph/model.d.ts +43 -0
- package/dist/charts/engine/graph/model.js +88 -0
- package/dist/charts/engine/graph/model.js.map +1 -0
- package/dist/charts/engine/graph/sizing.cjs +2 -0
- package/dist/charts/engine/graph/sizing.cjs.map +1 -0
- package/dist/charts/engine/graph/sizing.d.cts +33 -0
- package/dist/charts/engine/graph/sizing.d.ts +33 -0
- package/dist/charts/engine/graph/sizing.js +60 -0
- package/dist/charts/engine/graph/sizing.js.map +1 -0
- package/dist/charts/engine/graph/tree.cjs +2 -0
- package/dist/charts/engine/graph/tree.cjs.map +1 -0
- package/dist/charts/engine/graph/tree.d.cts +30 -0
- package/dist/charts/engine/graph/tree.d.ts +30 -0
- package/dist/charts/engine/graph/tree.js +218 -0
- package/dist/charts/engine/graph/tree.js.map +1 -0
- package/dist/charts/engine/graph/types.d.cts +626 -0
- package/dist/charts/engine/graph/types.d.ts +626 -0
- package/dist/charts/engine/graph/worker.cjs +46 -0
- package/dist/charts/engine/graph/worker.cjs.map +1 -0
- package/dist/charts/engine/graph/worker.d.cts +36 -0
- package/dist/charts/engine/graph/worker.d.ts +36 -0
- package/dist/charts/engine/graph/worker.js +129 -0
- package/dist/charts/engine/graph/worker.js.map +1 -0
- package/dist/charts/engine/items.cjs +1 -1
- package/dist/charts/engine/items.cjs.map +1 -1
- package/dist/charts/engine/items.d.cts +15 -2
- package/dist/charts/engine/items.d.ts +15 -2
- package/dist/charts/engine/items.js +131 -112
- package/dist/charts/engine/items.js.map +1 -1
- package/dist/charts/engine/labels.cjs +1 -1
- package/dist/charts/engine/labels.cjs.map +1 -1
- package/dist/charts/engine/labels.js +28 -4
- package/dist/charts/engine/labels.js.map +1 -1
- package/dist/charts/engine/layout.cjs +1 -1
- package/dist/charts/engine/layout.cjs.map +1 -1
- package/dist/charts/engine/layout.d.cts +9 -0
- package/dist/charts/engine/layout.d.ts +9 -0
- package/dist/charts/engine/layout.js +11 -2
- package/dist/charts/engine/layout.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 +40 -3
- package/dist/charts/engine/model.d.ts +40 -3
- package/dist/charts/engine/model.js +246 -165
- package/dist/charts/engine/model.js.map +1 -1
- package/dist/charts/engine/orderbook/format.cjs +1 -1
- package/dist/charts/engine/orderbook/format.cjs.map +1 -1
- package/dist/charts/engine/orderbook/format.d.cts +3 -2
- package/dist/charts/engine/orderbook/format.d.ts +3 -2
- package/dist/charts/engine/orderbook/format.js +5 -5
- package/dist/charts/engine/orderbook/format.js.map +1 -1
- 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 +527 -408
- package/dist/charts/engine/orderbook/heatmap.js.map +1 -1
- package/dist/charts/engine/orderbook/layout.cjs +2 -0
- package/dist/charts/engine/orderbook/layout.cjs.map +1 -0
- package/dist/charts/engine/orderbook/layout.d.cts +37 -0
- package/dist/charts/engine/orderbook/layout.d.ts +37 -0
- package/dist/charts/engine/orderbook/layout.js +70 -0
- package/dist/charts/engine/orderbook/layout.js.map +1 -0
- 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 +1 -1
- package/dist/charts/engine/orderbook/tape.js.map +1 -1
- package/dist/charts/engine/orderbook/types.d.cts +18 -2
- package/dist/charts/engine/orderbook/types.d.ts +18 -2
- package/dist/charts/engine/overlay.cjs +1 -1
- package/dist/charts/engine/overlay.cjs.map +1 -1
- package/dist/charts/engine/overlay.d.cts +10 -0
- package/dist/charts/engine/overlay.d.ts +10 -0
- package/dist/charts/engine/overlay.js +6 -0
- package/dist/charts/engine/overlay.js.map +1 -1
- package/dist/charts/engine/presets.cjs +2 -2
- package/dist/charts/engine/presets.cjs.map +1 -1
- package/dist/charts/engine/presets.d.cts +25 -3
- package/dist/charts/engine/presets.d.ts +25 -3
- package/dist/charts/engine/presets.js +115 -101
- package/dist/charts/engine/presets.js.map +1 -1
- package/dist/charts/engine/renderers/detect.cjs +1 -1
- package/dist/charts/engine/renderers/detect.cjs.map +1 -1
- package/dist/charts/engine/renderers/detect.d.cts +2 -1
- package/dist/charts/engine/renderers/detect.d.ts +2 -1
- package/dist/charts/engine/renderers/detect.js +23 -21
- package/dist/charts/engine/renderers/detect.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 +57 -4
- package/dist/charts/engine/scene.d.ts +57 -4
- package/dist/charts/engine/scene.js +335 -182
- package/dist/charts/engine/scene.js.map +1 -1
- package/dist/charts/engine/shapes/bullet.cjs +1 -1
- package/dist/charts/engine/shapes/bullet.cjs.map +1 -1
- package/dist/charts/engine/shapes/bullet.js +110 -110
- package/dist/charts/engine/shapes/bullet.js.map +1 -1
- package/dist/charts/engine/shapes/chart.cjs +1 -1
- package/dist/charts/engine/shapes/chart.cjs.map +1 -1
- package/dist/charts/engine/shapes/chart.js +4 -1
- package/dist/charts/engine/shapes/chart.js.map +1 -1
- package/dist/charts/engine/shapes/chord.cjs +2 -0
- package/dist/charts/engine/shapes/chord.cjs.map +1 -0
- package/dist/charts/engine/shapes/chord.d.cts +18 -0
- package/dist/charts/engine/shapes/chord.d.ts +18 -0
- package/dist/charts/engine/shapes/chord.js +414 -0
- package/dist/charts/engine/shapes/chord.js.map +1 -0
- package/dist/charts/engine/shapes/draw.cjs +1 -1
- package/dist/charts/engine/shapes/draw.cjs.map +1 -1
- package/dist/charts/engine/shapes/draw.d.cts +5 -1
- package/dist/charts/engine/shapes/draw.d.ts +5 -1
- package/dist/charts/engine/shapes/draw.js +47 -17
- package/dist/charts/engine/shapes/draw.js.map +1 -1
- package/dist/charts/engine/shapes/hit.cjs +1 -1
- package/dist/charts/engine/shapes/hit.cjs.map +1 -1
- package/dist/charts/engine/shapes/hit.d.cts +3 -1
- package/dist/charts/engine/shapes/hit.d.ts +3 -1
- package/dist/charts/engine/shapes/hit.js +75 -46
- package/dist/charts/engine/shapes/hit.js.map +1 -1
- package/dist/charts/engine/shapes/index.d.cts +3 -2
- package/dist/charts/engine/shapes/index.d.ts +3 -2
- package/dist/charts/engine/shapes/labels.cjs +1 -1
- package/dist/charts/engine/shapes/labels.cjs.map +1 -1
- package/dist/charts/engine/shapes/labels.js +12 -4
- package/dist/charts/engine/shapes/labels.js.map +1 -1
- package/dist/charts/engine/shapes/layout.cjs +2 -2
- package/dist/charts/engine/shapes/layout.cjs.map +1 -1
- package/dist/charts/engine/shapes/layout.d.cts +3 -1
- package/dist/charts/engine/shapes/layout.d.ts +3 -1
- package/dist/charts/engine/shapes/layout.js +106 -78
- package/dist/charts/engine/shapes/layout.js.map +1 -1
- package/dist/charts/engine/shapes/scene.cjs +1 -1
- package/dist/charts/engine/shapes/scene.cjs.map +1 -1
- package/dist/charts/engine/shapes/scene.d.cts +33 -3
- package/dist/charts/engine/shapes/scene.d.ts +33 -3
- package/dist/charts/engine/shapes/scene.js +62 -19
- package/dist/charts/engine/shapes/scene.js.map +1 -1
- package/dist/charts/engine/shapes/types.d.cts +119 -8
- package/dist/charts/engine/shapes/types.d.ts +119 -8
- package/dist/charts/engine/signature.cjs +1 -1
- package/dist/charts/engine/signature.cjs.map +1 -1
- package/dist/charts/engine/signature.js +1 -1
- package/dist/charts/engine/signature.js.map +1 -1
- 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 +5 -2
- package/dist/charts/engine/three-d/canvas2d.d.ts +5 -2
- package/dist/charts/engine/three-d/canvas2d.js +89 -65
- package/dist/charts/engine/three-d/canvas2d.js.map +1 -1
- package/dist/charts/engine/three-d/detect.cjs +1 -1
- package/dist/charts/engine/three-d/detect.cjs.map +1 -1
- package/dist/charts/engine/three-d/detect.d.cts +3 -2
- package/dist/charts/engine/three-d/detect.d.ts +3 -2
- package/dist/charts/engine/three-d/detect.js +22 -20
- package/dist/charts/engine/three-d/detect.js.map +1 -1
- package/dist/charts/engine/three-d/geometry.cjs +1 -1
- package/dist/charts/engine/three-d/geometry.cjs.map +1 -1
- package/dist/charts/engine/three-d/geometry.d.cts +6 -0
- package/dist/charts/engine/three-d/geometry.d.ts +6 -0
- package/dist/charts/engine/three-d/geometry.js +106 -90
- package/dist/charts/engine/three-d/geometry.js.map +1 -1
- package/dist/charts/engine/three-d/model.cjs +1 -1
- package/dist/charts/engine/three-d/model.cjs.map +1 -1
- package/dist/charts/engine/three-d/model.d.cts +2 -0
- package/dist/charts/engine/three-d/model.d.ts +2 -0
- package/dist/charts/engine/three-d/model.js +2 -0
- package/dist/charts/engine/three-d/model.js.map +1 -1
- package/dist/charts/engine/three-d/overlay.cjs +1 -1
- package/dist/charts/engine/three-d/overlay.cjs.map +1 -1
- package/dist/charts/engine/three-d/overlay.js +43 -36
- package/dist/charts/engine/three-d/overlay.js.map +1 -1
- 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 +24 -3
- package/dist/charts/engine/three-d/render-types.d.ts +24 -3
- package/dist/charts/engine/three-d/render-types.js +6 -7
- package/dist/charts/engine/three-d/render-types.js.map +1 -1
- package/dist/charts/engine/three-d/shaders.cjs +63 -28
- package/dist/charts/engine/three-d/shaders.cjs.map +1 -1
- package/dist/charts/engine/three-d/shaders.d.cts +2 -3
- package/dist/charts/engine/three-d/shaders.d.ts +2 -3
- package/dist/charts/engine/three-d/shaders.js +41 -22
- 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 +15 -4
- package/dist/charts/engine/three-d/sort.d.ts +15 -4
- package/dist/charts/engine/three-d/sort.js +117 -43
- package/dist/charts/engine/three-d/sort.js.map +1 -1
- package/dist/charts/engine/three-d/types.d.cts +27 -0
- package/dist/charts/engine/three-d/types.d.ts +27 -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.js +15 -13
- 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 +50 -39
- 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 +10 -0
- package/dist/charts/engine/trading/chart.d.ts +10 -0
- package/dist/charts/engine/trading/chart.js +1475 -776
- package/dist/charts/engine/trading/chart.js.map +1 -1
- package/dist/charts/engine/trading/drawings.cjs +2 -1
- package/dist/charts/engine/trading/drawings.cjs.map +1 -1
- package/dist/charts/engine/trading/drawings.d.cts +47 -9
- package/dist/charts/engine/trading/drawings.d.ts +47 -9
- package/dist/charts/engine/trading/drawings.js +338 -75
- 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 +13 -0
- package/dist/charts/engine/trading/format.d.ts +13 -0
- package/dist/charts/engine/trading/format.js +51 -19
- package/dist/charts/engine/trading/format.js.map +1 -1
- package/dist/charts/engine/trading/index.cjs +1 -1
- package/dist/charts/engine/trading/index.d.cts +2 -1
- package/dist/charts/engine/trading/index.d.ts +2 -1
- package/dist/charts/engine/trading/index.js +4 -3
- package/dist/charts/engine/trading/indicators.cjs +1 -1
- package/dist/charts/engine/trading/indicators.cjs.map +1 -1
- package/dist/charts/engine/trading/indicators.d.cts +180 -10
- package/dist/charts/engine/trading/indicators.d.ts +180 -10
- package/dist/charts/engine/trading/indicators.js +449 -173
- package/dist/charts/engine/trading/indicators.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 +84 -4
- package/dist/charts/engine/trading/labels.js.map +1 -1
- package/dist/charts/engine/trading/store.cjs +1 -1
- package/dist/charts/engine/trading/store.cjs.map +1 -1
- package/dist/charts/engine/trading/store.d.cts +21 -0
- package/dist/charts/engine/trading/store.d.ts +21 -0
- package/dist/charts/engine/trading/store.js +22 -1
- package/dist/charts/engine/trading/store.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 +41 -8
- package/dist/charts/engine/trading/studies.d.ts +41 -8
- package/dist/charts/engine/trading/studies.js +349 -93
- package/dist/charts/engine/trading/studies.js.map +1 -1
- package/dist/charts/engine/trading/sync.cjs +2 -0
- package/dist/charts/engine/trading/sync.cjs.map +1 -0
- package/dist/charts/engine/trading/sync.d.cts +8 -0
- package/dist/charts/engine/trading/sync.d.ts +8 -0
- package/dist/charts/engine/trading/sync.js +25 -0
- package/dist/charts/engine/trading/sync.js.map +1 -0
- package/dist/charts/engine/trading/types.d.cts +484 -9
- package/dist/charts/engine/trading/types.d.ts +484 -9
- package/dist/charts/engine/types.d.cts +82 -8
- package/dist/charts/engine/types.d.ts +82 -8
- package/dist/charts/index.cjs +1 -1
- package/dist/charts/index.d.cts +3 -2
- package/dist/charts/index.d.ts +3 -2
- package/dist/charts/index.js +30 -22
- package/dist/charts/react/charts.cjs +1 -1
- package/dist/charts/react/charts.cjs.map +1 -1
- package/dist/charts/react/charts.js +46 -34
- package/dist/charts/react/charts.js.map +1 -1
- package/dist/charts/react/graph.cjs +2 -0
- package/dist/charts/react/graph.cjs.map +1 -0
- package/dist/charts/react/graph.d.cts +213 -0
- package/dist/charts/react/graph.d.ts +213 -0
- package/dist/charts/react/graph.js +159 -0
- package/dist/charts/react/graph.js.map +1 -0
- package/dist/charts/react/shapes.cjs +1 -1
- package/dist/charts/react/shapes.cjs.map +1 -1
- package/dist/charts/react/shapes.d.cts +87 -4
- package/dist/charts/react/shapes.d.ts +87 -4
- package/dist/charts/react/shapes.js +55 -12
- package/dist/charts/react/shapes.js.map +1 -1
- package/dist/charts/react/trading.cjs +1 -1
- package/dist/charts/react/trading.cjs.map +1 -1
- package/dist/charts/react/trading.d.cts +53 -1
- package/dist/charts/react/trading.d.ts +53 -1
- package/dist/charts/react/trading.js +68 -37
- package/dist/charts/react/trading.js.map +1 -1
- package/dist/charts/react/types.d.cts +11 -0
- package/dist/charts/react/types.d.ts +11 -0
- 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 +3 -3
- package/dist/native/charts/src/engine/axis.cjs +1 -1
- package/dist/native/charts/src/engine/axis.cjs.map +1 -1
- package/dist/native/charts/src/engine/axis.js +42 -19
- package/dist/native/charts/src/engine/axis.js.map +1 -1
- package/dist/native/charts/src/engine/color.cjs +1 -1
- package/dist/native/charts/src/engine/color.cjs.map +1 -1
- package/dist/native/charts/src/engine/color.js +47 -5
- package/dist/native/charts/src/engine/color.js.map +1 -1
- 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 +300 -253
- package/dist/native/charts/src/engine/controller.js.map +1 -1
- package/dist/native/charts/src/engine/data.cjs +1 -1
- package/dist/native/charts/src/engine/data.cjs.map +1 -1
- package/dist/native/charts/src/engine/data.js +6 -4
- package/dist/native/charts/src/engine/data.js.map +1 -1
- package/dist/native/charts/src/engine/format.cjs +1 -1
- package/dist/native/charts/src/engine/format.cjs.map +1 -1
- package/dist/native/charts/src/engine/format.js +15 -2
- package/dist/native/charts/src/engine/format.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 +28 -4
- package/dist/native/charts/src/engine/labels.js.map +1 -1
- package/dist/native/charts/src/engine/layout.cjs +1 -1
- package/dist/native/charts/src/engine/layout.cjs.map +1 -1
- package/dist/native/charts/src/engine/layout.js +11 -2
- package/dist/native/charts/src/engine/layout.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 +252 -171
- 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 +2 -2
- package/dist/native/charts/src/engine/presets.cjs.map +1 -1
- package/dist/native/charts/src/engine/presets.js +104 -90
- 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 +341 -188
- package/dist/native/charts/src/engine/scene.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/bullet.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/bullet.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/bullet.js +110 -110
- package/dist/native/charts/src/engine/shapes/bullet.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/calendar.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/calendar.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/calendar.js +21 -16
- package/dist/native/charts/src/engine/shapes/calendar.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/chord.cjs +2 -0
- package/dist/native/charts/src/engine/shapes/chord.cjs.map +1 -0
- package/dist/native/charts/src/engine/shapes/chord.js +414 -0
- package/dist/native/charts/src/engine/shapes/chord.js.map +1 -0
- package/dist/native/charts/src/engine/shapes/draw.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/draw.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/draw.js +47 -17
- package/dist/native/charts/src/engine/shapes/draw.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/hit.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/hit.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/hit.js +73 -44
- package/dist/native/charts/src/engine/shapes/hit.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/labels.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/labels.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/labels.js +12 -4
- package/dist/native/charts/src/engine/shapes/labels.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 +117 -90
- package/dist/native/charts/src/engine/shapes/layout.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/scene.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/scene.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/scene.js +62 -19
- package/dist/native/charts/src/engine/shapes/scene.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.js +140 -71
- package/dist/native/components/Chart/scene.js.map +1 -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 +54 -42
- package/dist/native/components/Charts/charts.js.map +1 -1
- package/dist/native/components/Charts/types.d.cts +11 -0
- package/dist/native/components/Charts/types.d.ts +11 -0
- 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.js +1 -0
- package/dist/native/components/ShapeChart/ShapeChartBase.js.map +1 -1
- package/dist/native/components/ShapeChart/charts.cjs +1 -1
- package/dist/native/components/ShapeChart/charts.cjs.map +1 -1
- package/dist/native/components/ShapeChart/charts.d.cts +6 -1
- package/dist/native/components/ShapeChart/charts.d.ts +6 -1
- package/dist/native/components/ShapeChart/charts.js +138 -96
- package/dist/native/components/ShapeChart/charts.js.map +1 -1
- package/dist/native/components/ShapeChart/draw.cjs +1 -1
- package/dist/native/components/ShapeChart/draw.cjs.map +1 -1
- package/dist/native/components/ShapeChart/draw.d.cts +1 -1
- package/dist/native/components/ShapeChart/draw.d.ts +1 -1
- package/dist/native/components/ShapeChart/draw.js +26 -17
- package/dist/native/components/ShapeChart/draw.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 +138 -59
- package/dist/native/components/ShapeChart/geometry.js.map +1 -1
- package/dist/native/components/ShapeChart/index.cjs +1 -1
- package/dist/native/components/ShapeChart/index.d.cts +1 -1
- package/dist/native/components/ShapeChart/index.d.ts +1 -1
- package/dist/native/components/ShapeChart/index.js +2 -2
- package/dist/native/components/ShapeChart/recorder.cjs +1 -1
- package/dist/native/components/ShapeChart/recorder.cjs.map +1 -1
- package/dist/native/components/ShapeChart/recorder.d.cts +10 -1
- package/dist/native/components/ShapeChart/recorder.d.ts +10 -1
- package/dist/native/components/ShapeChart/recorder.js +19 -10
- package/dist/native/components/ShapeChart/recorder.js.map +1 -1
- package/dist/native/components/ShapeChart/types.d.cts +92 -7
- package/dist/native/components/ShapeChart/types.d.ts +92 -7
- package/dist/native/index.cjs +1 -1
- package/dist/native/index.js +2 -2
- package/dist/native/source/components/Chart/scene.tsx +158 -14
- package/dist/native/source/components/Charts/charts.tsx +30 -2
- package/dist/native/source/components/Charts/types.ts +11 -0
- package/dist/native/source/components/ShapeChart/ShapeChartBase.tsx +2 -0
- package/dist/native/source/components/ShapeChart/charts.tsx +91 -35
- package/dist/native/source/components/ShapeChart/draw.tsx +39 -8
- package/dist/native/source/components/ShapeChart/geometry.ts +189 -8
- package/dist/native/source/components/ShapeChart/index.ts +1 -0
- package/dist/native/source/components/ShapeChart/recorder.ts +20 -5
- package/dist/native/source/components/ShapeChart/types.ts +96 -5
- package/dist/native/source/manifest.ts +1 -0
- package/dist/taro/charts.d.ts +25 -5
- package/dist/taro/index.js +3900 -2836
- package/dist/taro/shape-charts.d.ts +96 -4
- package/dist/uni/AreaChart.vue.d.ts +5 -1
- package/dist/uni/Badge.vue.d.ts +1 -1
- package/dist/uni/BarChart.vue.d.ts +5 -1
- package/dist/uni/BoxPlotChart.vue.d.ts +8 -0
- package/dist/uni/BubbleChart.vue.d.ts +4 -0
- package/dist/uni/BulletChart.vue.d.ts +4 -0
- package/dist/uni/CalendarHeatmap.vue.d.ts +2 -0
- package/dist/uni/CandlestickChart.vue.d.ts +4 -0
- package/dist/uni/Chart.vue.d.ts +4 -0
- package/dist/uni/ChordChart.vue +93 -0
- package/dist/uni/ChordChart.vue.d.ts +136 -0
- package/dist/uni/DonutChart.vue.d.ts +4 -0
- package/dist/uni/FunnelChart.vue.d.ts +4 -0
- package/dist/uni/GanttChart.vue.d.ts +4 -0
- package/dist/uni/GaugeChart.vue.d.ts +4 -0
- package/dist/uni/HeatmapChart.vue.d.ts +8 -2
- package/dist/uni/HistogramChart.vue.d.ts +4 -0
- package/dist/uni/HorizontalBarChart.vue.d.ts +3 -1
- package/dist/uni/LineChart.vue.d.ts +4 -0
- package/dist/uni/MixedChart.vue.d.ts +4 -0
- package/dist/uni/PieChart.vue.d.ts +4 -0
- package/dist/uni/QuadrantChart.vue.d.ts +4 -0
- package/dist/uni/RadarChart.vue.d.ts +4 -0
- package/dist/uni/RadialBarChart.vue.d.ts +4 -0
- package/dist/uni/RangeAreaChart.vue.d.ts +4 -0
- package/dist/uni/SankeyChart.vue.d.ts +4 -0
- package/dist/uni/ScatterChart.vue.d.ts +4 -0
- package/dist/uni/Sparkline.vue.d.ts +4 -0
- package/dist/uni/SunburstChart.vue.d.ts +4 -0
- package/dist/uni/ToastProvider.vue.d.ts +1 -1
- package/dist/uni/TreemapChart.vue.d.ts +4 -0
- package/dist/uni/WaterfallChart.vue.d.ts +9 -0
- package/dist/uni/chart-canvas.d.ts +3 -0
- package/dist/uni/chart-canvas.js +4 -0
- package/dist/uni/chart-types.d.ts +28 -4
- package/dist/uni/chart-types.js +26 -2
- package/dist/uni/charts-canvas.js +1 -1
- package/dist/uni/index.d.ts +2 -1
- package/dist/uni/index.js +1 -0
- package/dist/uni/manifest.d.ts +7 -0
- package/dist/uni/manifest.js +10 -0
- package/dist/uni/named-chart-options.d.ts +9 -2
- package/dist/uni/named-chart-options.js +18 -1
- package/dist/uni/shape-chart-canvas.d.ts +3 -1
- package/dist/uni/shape-chart-canvas.js +15 -24
- package/dist/uni/shape-chart-types.d.ts +52 -2
- package/dist/uni/shape-chart-types.js +44 -0
- package/dist/vue/charts-global.d.ts +48 -0
- package/dist/vue/charts.d.ts +18 -0
- package/dist/vue/charts.js +56 -0
- package/dist/vue/charts.js.map +1 -0
- package/dist/vue/components/Chart/BoxPlotChart.vue.d.ts +8 -0
- package/dist/vue/components/Chart/BoxPlotChart.vue.js.map +1 -1
- package/dist/vue/components/Chart/BoxPlotChart.vue_vue_type_script_setup_true_lang.js +8 -2
- package/dist/vue/components/Chart/BoxPlotChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/vue/components/Chart/ChordChart.vue.d.ts +153 -0
- package/dist/vue/components/Chart/ChordChart.vue.js +7 -0
- package/dist/vue/components/Chart/ChordChart.vue.js.map +1 -0
- package/dist/vue/components/Chart/ChordChart.vue_vue_type_script_setup_true_lang.js +81 -0
- package/dist/vue/components/Chart/ChordChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/vue/components/Chart/DependencyGraph.vue.d.ts +179 -0
- package/dist/vue/components/Chart/DependencyGraph.vue.js +7 -0
- package/dist/vue/components/Chart/DependencyGraph.vue.js.map +1 -0
- package/dist/vue/components/Chart/DependencyGraph.vue_vue_type_script_setup_true_lang.js +65 -0
- package/dist/vue/components/Chart/DependencyGraph.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/vue/components/Chart/GanttChart.vue.d.ts +4 -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 +4 -1
- 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 +184 -0
- package/dist/vue/components/Chart/GraphChart.vue.js +7 -0
- package/dist/vue/components/Chart/GraphChart.vue.js.map +1 -0
- package/dist/vue/components/Chart/GraphChart.vue_vue_type_script_setup_true_lang.js +62 -0
- package/dist/vue/components/Chart/GraphChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/vue/components/Chart/HeatmapChart.vue.d.ts +9 -5
- package/dist/vue/components/Chart/HeatmapChart.vue.js.map +1 -1
- package/dist/vue/components/Chart/HeatmapChart.vue_vue_type_script_setup_true_lang.js +3 -1
- package/dist/vue/components/Chart/HeatmapChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/vue/components/Chart/OrderBookHeatmap.vue.d.ts +2 -0
- package/dist/vue/components/Chart/TimeAndSales.vue.d.ts +2 -0
- package/dist/vue/components/Chart/TradingChart.vue.d.ts +49 -1
- package/dist/vue/components/Chart/TradingChart.vue.js.map +1 -1
- package/dist/vue/components/Chart/TradingChart.vue_vue_type_script_setup_true_lang.js +31 -0
- package/dist/vue/components/Chart/TradingChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/vue/components/Chart/TreeChart.vue.d.ts +172 -0
- package/dist/vue/components/Chart/TreeChart.vue.js +7 -0
- package/dist/vue/components/Chart/TreeChart.vue.js.map +1 -0
- package/dist/vue/components/Chart/TreeChart.vue_vue_type_script_setup_true_lang.js +56 -0
- package/dist/vue/components/Chart/TreeChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/vue/components/Chart/WaterfallChart.vue.d.ts +12 -1
- package/dist/vue/components/Chart/WaterfallChart.vue.js.map +1 -1
- package/dist/vue/components/Chart/WaterfallChart.vue_vue_type_script_setup_true_lang.js +8 -2
- package/dist/vue/components/Chart/WaterfallChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/vue/components/Chart/graph.d.ts +153 -0
- package/dist/vue/components/Chart/graph.js +135 -0
- package/dist/vue/components/Chart/graph.js.map +1 -0
- package/dist/vue/components/Chart/index.d.ts +5 -1
- package/dist/vue/components/Chart/index.js +5 -1
- package/dist/vue/components/Chart/orderbook.d.ts +5 -1
- package/dist/vue/components/Chart/orderbook.js +2 -0
- package/dist/vue/components/Chart/orderbook.js.map +1 -1
- package/dist/vue/components/Chart/trading.d.ts +24 -2
- package/dist/vue/components/Chart/trading.js +8 -0
- package/dist/vue/components/Chart/trading.js.map +1 -1
- package/dist/vue/components/Chart/types.d.ts +74 -2
- package/dist/vue/global.d.ts +2 -38
- package/dist/vue/groups/charts.js +10 -2
- package/dist/vue/groups/charts.js.map +1 -1
- package/dist/vue/index.js +6 -2
- package/dist/vue/internal/register.d.ts +7 -0
- package/dist/vue/internal/register.js +14 -0
- package/dist/vue/internal/register.js.map +1 -0
- package/dist/vue/plugin.d.ts +9 -4
- package/dist/vue/plugin.js +6 -11
- package/dist/vue/plugin.js.map +1 -1
- package/dist/weapp/charts/canvas.js +1687 -147
- package/dist/weapp/charts/core.js +1 -0
- package/dist/weapp/chord-chart/index.js +1 -0
- package/dist/weapp/chord-chart/index.json +1 -0
- package/dist/weapp/chord-chart/index.wxml +1 -0
- package/dist/weapp/chord-chart/index.wxss +1 -0
- package/dist/weapp/controls.js +92 -32
- package/dist/weapp/types.d.ts +87 -4
- package/dist/web-components/components/chart/charts.d.ts +4 -2
- package/dist/web-components/components/chart/charts.js +8 -1
- package/dist/web-components/components/chart/charts.js.map +1 -1
- package/dist/web-components/components/chart/extended.d.ts +17 -7
- package/dist/web-components/components/chart/extended.js +23 -9
- package/dist/web-components/components/chart/extended.js.map +1 -1
- package/dist/web-components/components/chart/shapes-extended.d.ts +37 -1
- package/dist/web-components/components/chart/shapes-extended.js +27 -1
- package/dist/web-components/components/chart/shapes-extended.js.map +1 -1
- package/dist/web-components/components/graph/graph.d.ts +154 -0
- package/dist/web-components/components/graph/graph.js +149 -0
- package/dist/web-components/components/graph/graph.js.map +1 -0
- package/dist/web-components/components/trading-chart/trading-chart.d.ts +49 -2
- package/dist/web-components/components/trading-chart/trading-chart.js +62 -0
- package/dist/web-components/components/trading-chart/trading-chart.js.map +1 -1
- package/dist/web-components/elements/chart.d.ts +1 -1
- package/dist/web-components/elements/chart.js +6 -5
- package/dist/web-components/elements/chart.js.map +1 -1
- package/dist/web-components/elements/graph.d.ts +2 -0
- package/dist/web-components/elements/graph.js +12 -0
- package/dist/web-components/elements/graph.js.map +1 -0
- package/dist/web-components/html-custom-data.json +273 -4
- package/dist/web-components/types/react.d.ts +63 -4
- package/dist/web-components/types/solid.d.ts +55 -8
- package/dist/web-components/types/svelte.d.ts +55 -8
- package/dist/web-components/types/vue.d.ts +55 -4
- package/package.json +16 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.js","names":["firstX","data","xs","list","i","item","detectXType","datas","x","axisModel","options","gridDefault","definedEntries","out","value","key","extent","min","max","values","v","smallestStep","step","columns","sorted","k","d","bandOf","category","axis","s","stackValues","totals","percent","byX","stack","count","y","t","running","members","base","top","valid","sums","total","b","DEFAULT_UP","DEFAULT_DOWN","hasDateY","precise","nextStep","power","f","alignedDomain","a0","a1","left","stepL","tickStep","n","lo","hi","ensureSpan","niceDomain","start","mapped","mapColumns","map","hit","raw","column","a","cols","buildModel","resolve","resolver","theme","resolveStaticColor","fallback","input","locale","resolveLocale","tooltipOptions","labels","chartLabels","xType","categories","collectCategories","categoryMap","c","resolveX","xResolver","name","yOpts","heatmapData","yCategories","collectYCategories","yType","yCategoryMap","resolveY","resolverKey","horizontal","usedKeys","series","index","entry","cache","normalizeData","type","paletteColor","color","pointColors","resolved","rgba","colorScale","valueRange","cellColors","mix","span","packColor","rampColor","id","toCss","hidden","visible","allScatter","slotted","bars","band","slots","stackId","share","w","group","slotWidth","slot","stackedBars","stacked","percentStacked","p","y0","stackedLines","candles","candleBand","heatmaps","cx","cy","xOpts","xRange","pad","pointsOnly","valuesOf","listBars","zero","leftVisible","leftSeries","leftBars","yRange","yValues","filled","y2Opts","y2","y2Map","rightSeries","domain","scale","rawBase","zoomOption","zoomAxes","yFormat","formatPercent","valueFormatter","plottedY","grids","gridOf","grid","GridIndex"],"sources":["../../../../charts/src/engine/model.ts"],"sourcesContent":["// Options -> chart model: normalized data, colors, bar layout, stacks and\n// the full ranges of the axes. Pure (colors go through the theme's resolver).\n\nimport {\n mix,\n packColor,\n rampColor,\n resolveStaticColor,\n toCss,\n type ColorResolver,\n type Rgba,\n} from \"./color\";\nimport {\n collectCategories,\n collectYCategories,\n normalizeData,\n xResolver,\n type SeriesColumns,\n type YResolver,\n} from \"./data\";\nimport { formatPercent, valueFormatter } from \"./format\";\nimport { chartLabels } from \"./labels\";\nimport { resolveLocale } from \"./locale\";\nimport { ensureSpan, niceDomain, tickStep } from \"./scale\";\nimport { GridIndex } from \"./spatial\";\nimport type { ChartTheme } from \"./theme\";\nimport type {\n ChartAxisOptions,\n ChartAxisType,\n ChartCurve,\n ChartOptions,\n ChartSeries,\n ChartSeriesData,\n ChartLabels,\n ChartSeriesType,\n ChartTimeZone,\n} from \"./types\";\nimport type { Range } from \"./viewport\";\n\nexport interface AxisModel {\n type: ChartAxisType;\n reverse: boolean;\n categories: string[];\n title?: string;\n format?: (value: number) => string;\n grid: boolean;\n visible: boolean;\n tickCount?: number;\n /** Locale of the tick and tooltip labels (historical English texts when omitted) */\n locale?: string;\n /** Calendar of a time axis */\n timeZone?: ChartTimeZone;\n}\n\nexport interface SeriesModel {\n index: number;\n /** Key of the GPU resources and of the data cache */\n key: string;\n id: string;\n name: string;\n type: ChartSeriesType;\n color: Rgba;\n colorCss: string;\n lineWidth: number;\n pointSize: number;\n opacity: number;\n hidden: boolean;\n showLabels: boolean;\n curve: ChartCurve;\n /**\n * Plotted columns: the data, mapped onto the left axis for the series of\n * the right axis (`raw` keeps the values of the data)\n */\n cols: SeriesColumns;\n /** Columns of the data (shown in tooltips and labels) */\n raw: SeriesColumns;\n /** Value axis of the series */\n yAxis: \"left\" | \"right\";\n /** Bars with a start (`y0`): drawn from it, never stacked */\n floating: boolean;\n /** Bars / candlesticks: x offset of the series inside a group and half of the bar width */\n barOffset: number;\n barHalfWidth: number;\n /** Bars: bottom / top of every bar (stacks included) */\n barBase: Float64Array | null;\n barTop: Float64Array | null;\n /** Stacked lines / areas: bottom / top of every point */\n stackBase: Float64Array | null;\n stackTop: Float64Array | null;\n /** Scatter / bar: resolved per-point colors */\n pointColors: (Rgba | undefined)[] | null;\n /** Candlesticks: colors of the rising / falling candles */\n upColor: Rgba;\n downColor: Rgba;\n /** Heatmaps: packed color of every cell (0 = no cell) and half of a cell, in data units */\n cellColors: Uint32Array | null;\n cellHalf: { x: number; y: number };\n /** Heatmaps: ramp of the colors and the values at its ends */\n colorScale: Rgba[];\n valueRange: Range;\n /** Corner radius in CSS pixels (bars, heatmap cells) */\n radius: number;\n /** Tooltip format of the values */\n format?: (value: number) => string;\n /** Scatter: name of the `value` of the points */\n valueName?: string;\n}\n\n/** Linear map of the right axis onto the left one: `left = right * scale + offset` */\nexport interface AxisMap {\n scale: number;\n offset: number;\n}\n\nexport interface ChartModel {\n series: SeriesModel[];\n x: AxisModel;\n y: AxisModel;\n /** Right value axis (`yAxis2`), `null` when no series uses it */\n y2: AxisModel | null;\n /** Right axis values -> left axis values */\n y2Map: AxisMap | null;\n /** The x axis runs down the left side, the values along the bottom */\n horizontal: boolean;\n /** Resolved locale (`locale` option, else the page language) */\n locale: string;\n /** Texts of the locale with the `labels` overrides */\n labels: ChartLabels;\n /** Tooltip value of the locale (series without `format`) */\n formatValue: (value: number) => string;\n /** Full ranges (zoomed out) */\n base: { x: Range; y: Range };\n /** Every series is a scatter (or a heatmap): nearest tooltips, xy zoom */\n allScatter: boolean;\n zoom: { x: boolean; y: boolean };\n tooltipMode: \"nearest\" | \"axis\";\n /** Y value the areas are filled to */\n baseline: number;\n /** Smallest zoomed spans */\n minSpan: { x: number; y: number };\n /** Stacks are scaled to 100% */\n percent: boolean;\n /** Stack id of every series (`null` when not stacked) */\n stacks: (string | null)[];\n}\n\nexport interface DataCacheEntry {\n data: ChartSeriesData;\n resolverKey: string;\n cols: SeriesColumns;\n}\n\nexport type DataCache = Map<string, DataCacheEntry>;\n\nconst firstX = (data: ChartSeriesData): unknown => {\n if (typeof data === \"object\" && data !== null && !(\"length\" in data)) {\n const xs = (data as { x?: ArrayLike<unknown> }).x;\n return xs && xs.length ? xs[0] : undefined;\n }\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < Math.min(list.length, 8); i++) {\n const item = list[i];\n if (Array.isArray(item)) return item[0];\n if (item && typeof item === \"object\") return (item as { x?: unknown }).x;\n }\n return undefined;\n};\n\n/** Axis type when not given: dates -> time, strings -> category */\nexport const detectXType = (\n datas: readonly ChartSeriesData[],\n): ChartAxisType => {\n for (const data of datas) {\n const x = firstX(data);\n if (x instanceof Date) return \"time\";\n if (typeof x === \"string\") return \"category\";\n }\n return \"linear\";\n};\n\nconst axisModel = (\n options: ChartAxisOptions | undefined,\n type: ChartAxisType,\n categories: string[],\n gridDefault: boolean,\n locale: string,\n): AxisModel => ({\n type,\n reverse: !!options?.reverse,\n categories,\n title: options?.title,\n format: options?.format,\n grid: options?.grid ?? gridDefault,\n visible: options?.visible ?? true,\n tickCount: options?.tickCount,\n locale,\n timeZone: options?.timeZone ?? \"local\",\n});\n\n/** Defined entries only (`{ open: undefined }` keeps the built-in text) */\nconst definedEntries = <T extends object>(value: T | undefined): Partial<T> => {\n const out: Partial<T> = {};\n if (!value) return out;\n for (const key of Object.keys(value) as (keyof T)[]) {\n if (value[key] !== undefined) out[key] = value[key];\n }\n return out;\n};\n\nconst extent = (values: ArrayLike<number>): Range => {\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < values.length; i++) {\n const v = values[i];\n if (!Number.isFinite(v)) continue;\n if (v < min) min = v;\n if (v > max) max = v;\n }\n return [min, max];\n};\n\n/** Smallest positive gap between consecutive values (bar width on numeric axes) */\nconst smallestStep = (columns: ArrayLike<number>[], sorted: boolean[]) => {\n let step = Infinity;\n columns.forEach((values, k) => {\n const xs = sorted[k] ? values : Float64Array.from(values).sort();\n for (let i = 1; i < xs.length; i++) {\n const d = xs[i] - xs[i - 1];\n if (d > 0 && d < step) step = d;\n }\n });\n return step;\n};\n\nconst bandOf = (list: SeriesModel[], axis: \"x\" | \"y\", category: boolean) => {\n if (category) return 1;\n const step = smallestStep(\n list.map((s) => (axis === \"x\" ? s.cols.x : s.cols.y)),\n list.map((s) => axis === \"x\" && s.cols.sorted),\n );\n return Number.isFinite(step) ? step : 1;\n};\n\n/**\n * Stacks the y values of series sharing a stack id (positive and negative\n * values separately); `percent` scales every stack to 100 at each x\n */\nconst stackValues = (\n list: { s: SeriesModel; stack: string }[],\n percent: boolean,\n): { base: Float64Array; top: Float64Array }[] => {\n const totals = new Map<string, Map<number, [number, number]>>();\n if (percent) {\n for (const { s, stack } of list) {\n let byX = totals.get(stack);\n if (!byX) totals.set(stack, (byX = new Map()));\n const { x, y, count } = s.cols;\n for (let i = 0; i < count; i++) {\n const v = y[i];\n if (!Number.isFinite(v)) continue;\n const t = byX.get(x[i]) ?? [0, 0];\n if (v >= 0) t[0] += v;\n else t[1] -= v;\n byX.set(x[i], t);\n }\n }\n }\n const running = new Map<string, Map<number, [number, number]>>();\n const members = new Map<string, number>();\n for (const { stack } of list)\n members.set(stack, (members.get(stack) ?? 0) + 1);\n return list.map(({ s, stack }) => {\n const { x, y, count } = s.cols;\n if (!percent && members.get(stack) === 1) {\n // alone in its stack (e.g. grouped bars): from zero, no bookkeeping\n const base = new Float64Array(count);\n const top = new Float64Array(count);\n for (let i = 0; i < count; i++) {\n const v = y[i];\n const valid = Number.isFinite(v);\n base[i] = valid ? 0 : NaN;\n top[i] = valid ? v : NaN;\n }\n return { base, top };\n }\n let byX = running.get(stack);\n if (!byX) running.set(stack, (byX = new Map()));\n const sums = totals.get(stack);\n const base = new Float64Array(count);\n const top = new Float64Array(count);\n for (let i = 0; i < count; i++) {\n let v = y[i];\n if (!Number.isFinite(v)) {\n base[i] = NaN;\n top[i] = NaN;\n continue;\n }\n if (sums) {\n const t = sums.get(x[i]);\n const total = t ? (v >= 0 ? t[0] : t[1]) : 0;\n v = total > 0 ? (v / total) * 100 : 0;\n }\n const t = byX.get(x[i]) ?? [0, 0];\n const b = v >= 0 ? t[0] : t[1];\n base[i] = b;\n top[i] = b + v;\n if (v >= 0) t[0] += v;\n else t[1] += v;\n byX.set(x[i], t);\n }\n return { base, top };\n });\n};\n\nconst DEFAULT_UP = \"var(--success-color, #16a34a)\";\nconst DEFAULT_DOWN = \"var(--danger-color, #dc2626)\";\n\n/** Dates in the y values (or starts) of objects: a time value axis */\nconst hasDateY = (datas: readonly ChartSeriesData[]): boolean => {\n for (const data of datas) {\n if (typeof data !== \"object\" || data === null || !(\"length\" in data))\n continue;\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < Math.min(list.length, 8); i++) {\n const item = list[i];\n if (item && typeof item === \"object\" && !Array.isArray(item)) {\n const d = item as { y?: unknown; y0?: unknown };\n if (d.y instanceof Date || d.y0 instanceof Date) return true;\n }\n }\n }\n return false;\n};\n\nconst precise = (v: number) => Number(v.toPrecision(12));\n\n/** Next step of the 1, 2, 5 × 10^k sequence */\nconst nextStep = (step: number) => {\n const power = 10 ** Math.floor(Math.log10(step) + 1e-9);\n const f = step / power;\n return (f < 1.5 ? 2 : f < 3.5 ? 5 : 10) * power;\n};\n\n/**\n * Range of the right axis covering [lo, hi] with as many tick intervals as\n * the left range has (its ticks then line up with the left grid)\n */\nexport const alignedDomain = (\n lo: number,\n hi: number,\n left: Range,\n count: number,\n): Range => {\n const [a0, a1] = left;\n const stepL = tickStep(a0, a1, count);\n const n = stepL > 0 ? Math.round((a1 - a0) / stepL) : 0;\n [lo, hi] = ensureSpan(lo, hi);\n if (n < 1 || Math.abs(n * stepL - (a1 - a0)) > stepL * 1e-6) {\n return niceDomain(lo, hi, count);\n }\n let step = tickStep(lo, hi, n);\n for (let k = 0; k < 40 && step > 0; k++) {\n const start = Math.floor(lo / step + 1e-9) * step;\n if (start + n * step >= hi - step * 1e-9) {\n return [precise(start), precise(start + n * step)];\n }\n step = nextStep(step);\n }\n return niceDomain(lo, hi, count);\n};\n\nconst mapped = new WeakMap<\n SeriesColumns,\n { key: string; cols: SeriesColumns }\n>();\n\n/** Columns of a right-axis series in left axis units (cached with the data) */\nconst mapColumns = (raw: SeriesColumns, map: AxisMap): SeriesColumns => {\n const key = `${map.scale},${map.offset}`;\n const hit = mapped.get(raw);\n if (hit && hit.key === key) return hit.cols;\n const f = (v: number) => v * map.scale + map.offset;\n const column = (a: Float64Array | null) => (a ? a.map(f) : null);\n const lo = f(raw.yMin);\n const hi = f(raw.yMax);\n const cols: SeriesColumns = {\n ...raw,\n y: raw.y.map(f),\n open: column(raw.open),\n high: column(raw.high),\n low: column(raw.low),\n y0: column(raw.y0),\n q1: column(raw.q1),\n q3: column(raw.q3),\n outliers: raw.outliers ? raw.outliers.map((list) => list?.map(f)) : null,\n yMin: Math.min(lo, hi),\n yMax: Math.max(lo, hi),\n };\n mapped.set(raw, { key, cols });\n return cols;\n};\n\nexport const buildModel = (\n options: ChartOptions,\n theme: ChartTheme,\n hidden: ReadonlySet<string>,\n cache: DataCache,\n resolver: ColorResolver | null = null,\n): ChartModel => {\n const resolve: ColorResolver =\n resolver ??\n theme.resolve ??\n ((value, fallback) => resolveStaticColor(value, {}, fallback));\n const input = options.series;\n // resolved at every build: a page language switch shows on the next update\n const locale = resolveLocale(options.locale);\n const tooltipOptions =\n typeof options.tooltip === \"object\" ? options.tooltip : undefined;\n const labels = chartLabels(locale, {\n ...definedEntries(tooltipOptions?.labels),\n ...definedEntries(options.labels),\n });\n const datas = input.map((s) => s.data);\n const xType = options.xAxis?.type ?? detectXType(datas);\n const categories =\n xType === \"category\"\n ? [...(options.xAxis?.categories ?? collectCategories(datas))]\n : [];\n const categoryMap = new Map(categories.map((c, i) => [c, i]));\n const resolveX = xResolver(xType, (name) => categoryMap.get(name) ?? NaN);\n\n // category y axis (heatmap rows): explicit, or detected from string y values\n const yOpts = options.yAxis;\n const heatmapData = input\n .filter((s) => s.type === \"heatmap\")\n .map((s) => s.data);\n const yCategories =\n yOpts?.type === \"category\" || (!yOpts?.type && heatmapData.length)\n ? [...(yOpts?.categories ?? collectYCategories(heatmapData))]\n : [];\n const yType: ChartAxisType =\n yOpts?.type === \"category\" || yCategories.length\n ? \"category\"\n : yOpts?.type === \"time\" || (!yOpts?.type && hasDateY(datas))\n ? \"time\"\n : \"linear\";\n const yCategoryMap = new Map(yCategories.map((c, i) => [c, i]));\n const resolveY: YResolver = (v) =>\n typeof v === \"number\"\n ? v\n : typeof v === \"string\"\n ? yType === \"category\"\n ? (yCategoryMap.get(v) ?? NaN)\n : yType === \"time\"\n ? Date.parse(v)\n : Number(v)\n : v instanceof Date\n ? v.getTime()\n : NaN;\n const resolverKey = `${xType}|${categories.join(\"\\u0001\")}|${yType}|${yCategories.join(\"\\u0001\")}`;\n const percent = options.stackMode === \"percent\";\n const horizontal = options.orientation === \"horizontal\";\n\n const usedKeys = new Set<string>();\n const series: SeriesModel[] = input.map((s: ChartSeries, index) => {\n let key = s.id ?? `#${index}`;\n while (usedKeys.has(key)) key += \"'\";\n usedKeys.add(key);\n let entry = cache.get(key);\n if (!entry || entry.data !== s.data || entry.resolverKey !== resolverKey) {\n entry = {\n data: s.data,\n resolverKey,\n cols: normalizeData(s.data, resolveX, resolveY),\n };\n cache.set(key, entry);\n }\n const type = s.type ?? \"line\";\n const paletteColor = theme.palette[index % theme.palette.length];\n const color = s.color ? resolve(s.color, paletteColor) : paletteColor;\n const cols = entry.cols;\n let pointColors: (Rgba | undefined)[] | null = null;\n if (\n (type === \"scatter\" || type === \"bar\" || type === \"boxplot\") &&\n cols.colors\n ) {\n const resolved = new Map<string, Rgba>();\n pointColors = cols.colors.map((c) => {\n if (c === undefined) return undefined;\n let rgba = resolved.get(c);\n if (!rgba) resolved.set(c, (rgba = resolve(c, color)));\n return rgba;\n });\n }\n let colorScale: Rgba[] = [];\n let valueRange: Range = [0, 1];\n let cellColors: Uint32Array | null = null;\n if (type === \"heatmap\") {\n colorScale =\n s.colorScale && s.colorScale.length\n ? s.colorScale.map((c) => resolve(c, color))\n : [mix(theme.background, color, 0.08), color];\n valueRange = s.valueRange\n ? [s.valueRange[0], s.valueRange[1]]\n : [cols.valueMin, cols.valueMax];\n if (!Number.isFinite(valueRange[0])) valueRange = [0, 1];\n const values = cols.value ?? cols.y;\n const [lo, hi] = valueRange;\n const span = hi - lo || 1;\n cellColors = new Uint32Array(cols.count);\n for (let i = 0; i < cols.count; i++) {\n const v = values[i];\n if (!Number.isFinite(v) || !Number.isFinite(cols.y[i])) continue;\n // 0 means \"no cell\": a fully transparent color packs to 0 as well\n cellColors[i] = packColor(rampColor(colorScale, (v - lo) / span));\n }\n }\n const id = s.id ?? String(index);\n return {\n index,\n key,\n id,\n name: s.name ?? `${labels.series} ${index + 1}`,\n type,\n color,\n colorCss: toCss(color),\n lineWidth:\n s.lineWidth ??\n (type === \"candlestick\" ? 1 : type === \"boxplot\" ? 1.5 : 2),\n pointSize: s.pointSize ?? (type === \"boxplot\" ? 6 : 8),\n opacity:\n s.opacity ??\n (type === \"area\"\n ? 0.28\n : type === \"scatter\"\n ? 0.78\n : type === \"boxplot\"\n ? 0.22\n : 1),\n hidden: !!s.hidden || hidden.has(id),\n showLabels: !!s.showLabels,\n curve: s.curve ?? \"linear\",\n cols,\n raw: cols,\n yAxis: s.yAxis === \"right\" && !horizontal ? \"right\" : \"left\",\n floating: type === \"bar\" && !!cols.y0,\n barOffset: 0,\n barHalfWidth: 0,\n barBase: null,\n barTop: null,\n stackBase: null,\n stackTop: null,\n pointColors,\n upColor:\n type === \"candlestick\"\n ? resolve(s.upColor ?? DEFAULT_UP, [0.09, 0.64, 0.29, 1])\n : color,\n downColor:\n type === \"candlestick\"\n ? resolve(s.downColor ?? DEFAULT_DOWN, [0.86, 0.15, 0.15, 1])\n : color,\n cellColors,\n cellHalf: { x: 0.5, y: 0.5 },\n colorScale,\n valueRange,\n radius: s.radius ?? (type === \"heatmap\" ? 2 : type === \"boxplot\" ? 0 : 3),\n format: s.format,\n valueName: s.valueName,\n };\n });\n\n const visible = series.filter((s) => !s.hidden);\n const allScatter =\n series.length > 0 &&\n series.every((s) => s.type === \"scatter\" || s.type === \"heatmap\");\n\n // Bars and box plots: groups (one slot per stack) and stacking; floating\n // bars (with starts) are drawn from their starts\n const slotted = visible.filter(\n (s) => s.type === \"bar\" || s.type === \"boxplot\",\n );\n const bars = visible.filter((s) => s.type === \"bar\");\n const band = bandOf(slotted, \"x\", xType === \"category\");\n if (slotted.length) {\n const slots = new Map<string, number>();\n const stackId = (s: SeriesModel) =>\n input[s.index].stack ?? `\\u0000${s.key}`;\n for (const s of slotted) {\n if (!slots.has(stackId(s))) slots.set(stackId(s), slots.size);\n }\n let share = 0;\n for (const s of slotted) {\n const w = input[s.index].barWidth;\n if (w !== undefined && w > share) share = Math.min(1, w);\n }\n const group = band * (share || (slots.size > 1 ? 0.78 : 0.62));\n const slotWidth = group / slots.size;\n for (const s of slotted) {\n const slot = slots.get(stackId(s)) ?? 0;\n s.barOffset = -group / 2 + slotWidth * (slot + 0.5);\n s.barHalfWidth = (slotWidth / 2) * (slots.size > 1 ? 0.86 : 1);\n }\n const stackedBars = bars.filter((s) => !s.floating);\n const stacked = stackValues(\n stackedBars.map((s) => ({ s, stack: stackId(s) })),\n false,\n );\n const percentStacked = percent\n ? stackValues(\n stackedBars\n .filter((s) => input[s.index].stack !== undefined)\n .map((s) => ({ s, stack: stackId(s) })),\n true,\n )\n : [];\n let p = 0;\n stackedBars.forEach((s, k) => {\n const values =\n percent && input[s.index].stack !== undefined\n ? percentStacked[p++]\n : stacked[k];\n s.barBase = values.base;\n s.barTop = values.top;\n });\n for (const s of bars) {\n const { y, y0, count } = s.cols;\n if (!s.floating || !y0) continue;\n const base = new Float64Array(count);\n const top = new Float64Array(count);\n for (let i = 0; i < count; i++) {\n const valid = Number.isFinite(y[i]);\n base[i] = valid ? (Number.isFinite(y0[i]) ? y0[i] : 0) : NaN;\n top[i] = valid ? y[i] : NaN;\n }\n s.barBase = base;\n s.barTop = top;\n }\n }\n\n // Range areas: filled down to their lower edges\n for (const s of visible) {\n if (s.type === \"area\" && s.cols.y0 && input[s.index].stack === undefined)\n s.stackBase = s.cols.y0;\n }\n\n // Stacked lines / areas\n const stackedLines = visible.filter(\n (s) =>\n (s.type === \"line\" || s.type === \"area\") &&\n input[s.index].stack !== undefined,\n );\n if (stackedLines.length) {\n const values = stackValues(\n stackedLines.map((s) => ({ s, stack: input[s.index].stack ?? \"\" })),\n percent,\n );\n stackedLines.forEach((s, k) => {\n s.stackBase = values[k].base;\n s.stackTop = values[k].top;\n });\n }\n\n // Candlesticks: one band per x, bodies of 60%\n const candles = visible.filter((s) => s.type === \"candlestick\");\n const candleBand = bandOf(candles, \"x\", xType === \"category\");\n for (const s of candles) s.barHalfWidth = candleBand * 0.3;\n\n // Heatmaps: cells of the size of the smallest step\n const heatmaps = visible.filter((s) => s.type === \"heatmap\");\n if (heatmaps.length) {\n const cx = bandOf(heatmaps, \"x\", xType === \"category\") / 2;\n const cy = bandOf(heatmaps, \"y\", yType === \"category\") / 2;\n for (const s of heatmaps) s.cellHalf = { x: cx, y: cy };\n }\n\n // X range\n const xOpts = options.xAxis;\n let xRange: Range;\n if (xType === \"category\") {\n xRange = [-0.5, Math.max(1, categories.length) - 0.5];\n } else {\n const values: number[] = [];\n for (const s of visible) {\n values.push(s.cols.xMin, s.cols.xMax);\n const pad =\n s.type === \"bar\" || s.type === \"boxplot\"\n ? band / 2\n : s.type === \"candlestick\"\n ? candleBand / 2\n : s.type === \"heatmap\"\n ? s.cellHalf.x\n : 0;\n if (pad) values.push(s.cols.xMin - pad, s.cols.xMax + pad);\n }\n xRange = ensureSpan(\n ...extent(values),\n xType === \"time\" ? [Date.now() - 86400000, Date.now()] : [0, 1],\n );\n const pointsOnly = series.every((s) => s.type === \"scatter\");\n if (pointsOnly) {\n const pad = (xRange[1] - xRange[0]) * 0.04;\n xRange = [xRange[0] - pad, xRange[1] + pad];\n }\n const nice = xOpts?.nice ?? (pointsOnly && xType === \"linear\");\n if (nice && xType === \"linear\") {\n xRange = niceDomain(xRange[0], xRange[1], xOpts?.tickCount ?? 6);\n }\n }\n if (xOpts?.min !== undefined) xRange[0] = xOpts.min;\n if (xOpts?.max !== undefined) xRange[1] = xOpts.max;\n xRange = ensureSpan(xRange[0], xRange[1]);\n\n // Y range (left axis: the series of the right axis are mapped onto it)\n const valuesOf = (list: SeriesModel[], zero: boolean | undefined) => {\n const values: number[] = [];\n for (const s of list) {\n if (s.type === \"bar\" && s.barBase && s.barTop) {\n values.push(...extent(s.barBase), ...extent(s.barTop));\n } else if (s.stackBase && s.stackTop) {\n values.push(...extent(s.stackBase), ...extent(s.stackTop));\n } else if (s.type === \"heatmap\") {\n values.push(s.cols.yMin - s.cellHalf.y, s.cols.yMax + s.cellHalf.y);\n } else {\n values.push(s.cols.yMin, s.cols.yMax);\n }\n }\n const listBars = list.filter((s) => s.type === \"bar\");\n if (listBars.some((s) => !s.floating) || zero) values.push(0);\n if (listBars.some((s) => s.showLabels)) {\n // room for the value labels above the tallest bar\n const [lo, hi] = extent(values);\n if (hi > 0) values.push(hi + (hi - Math.min(0, lo)) * 0.1);\n if (lo < 0) values.push(lo - (Math.max(0, hi) - lo) * 0.1);\n }\n return values;\n };\n const leftVisible = visible.filter((s) => s.yAxis === \"left\");\n const leftSeries = leftVisible.length ? leftVisible : visible;\n const leftBars = leftSeries.filter((s) => s.type === \"bar\");\n let yRange: Range;\n if (yType === \"category\") {\n yRange = [-0.5, Math.max(1, yCategories.length) - 0.5];\n } else {\n const yValues = valuesOf(leftSeries, yOpts?.zero);\n const filled =\n leftBars.length > 0 || leftSeries.some((s) => s.type === \"area\");\n yRange = ensureSpan(...extent(yValues));\n if (series.every((s) => s.type === \"scatter\")) {\n const pad = (yRange[1] - yRange[0]) * 0.06;\n yRange = [yRange[0] - pad, yRange[1] + pad];\n } else if (\n (candles.length || leftSeries.some((s) => s.type === \"boxplot\")) &&\n !leftBars.length\n ) {\n // room above / below the wicks and the outliers\n const pad = (yRange[1] - yRange[0]) * 0.04;\n yRange = [yRange[0] - pad, yRange[1] + pad];\n }\n if ((yOpts?.nice ?? !heatmaps.length) && yType === \"linear\") {\n yRange = niceDomain(yRange[0], yRange[1], yOpts?.tickCount ?? 5);\n }\n if (percent && (bars.length || stackedLines.length)) {\n // 100% stacks: exactly 0-100 (or -100-100)\n yRange = [extent(yValues)[0] < 0 ? -100 : 0, 100];\n }\n if (filled && !yOpts?.zero) {\n // bars start at zero: no padding below / above it\n if (yRange[0] < 0 && extent(yValues)[0] >= 0) yRange[0] = 0;\n }\n }\n if (yOpts?.min !== undefined) yRange[0] = yOpts.min;\n if (yOpts?.max !== undefined) yRange[1] = yOpts.max;\n yRange = ensureSpan(yRange[0], yRange[1]);\n\n // Right axis: a range aligned on the left ticks; its series are mapped\n // onto the left axis\n const y2Opts = options.yAxis2;\n let y2: AxisModel | null = null;\n let y2Map: AxisMap | null = null;\n const rightSeries = series.filter((s) => s.yAxis === \"right\");\n if (rightSeries.length && yType !== \"category\") {\n const rightVisible = rightSeries.filter((s) => !s.hidden);\n const values = valuesOf(rightVisible, y2Opts?.zero);\n const [lo, hi] = ensureSpan(...extent(values));\n let domain: Range =\n y2Opts?.nice === false\n ? [lo, hi]\n : alignedDomain(lo, hi, yRange, yOpts?.tickCount ?? 5);\n if (y2Opts?.min !== undefined) domain[0] = y2Opts.min;\n if (y2Opts?.max !== undefined) domain[1] = y2Opts.max;\n domain = ensureSpan(domain[0], domain[1]);\n const scale = (yRange[1] - yRange[0]) / (domain[1] - domain[0]);\n const map: AxisMap = { scale, offset: yRange[0] - domain[0] * scale };\n y2Map = map;\n const f = (v: number) => v * map.scale + map.offset;\n const column = (a: Float64Array | null) => (a ? a.map(f) : null);\n const zero = f(Math.min(Math.max(0, domain[0]), domain[1]));\n for (const s of rightSeries) {\n const rawBase = s.stackBase;\n s.cols = mapColumns(s.raw, map);\n s.barBase = column(s.barBase);\n s.barTop = column(s.barTop);\n s.stackTop = column(s.stackTop);\n s.stackBase =\n rawBase && rawBase === s.raw.y0\n ? s.cols.y0\n : rawBase\n ? column(rawBase)\n : s.type === \"area\"\n ? new Float64Array(s.cols.count).fill(zero)\n : null;\n }\n y2 = axisModel(y2Opts, \"linear\", [], false, locale);\n }\n\n const zoomOption =\n options.interaction === false\n ? false\n : options.interaction === true || options.interaction === undefined\n ? true\n : (options.interaction.zoom ?? true);\n const zoomAxes =\n zoomOption === false\n ? { x: false, y: false }\n : zoomOption === true\n ? { x: true, y: allScatter }\n : { x: zoomOption.includes(\"x\"), y: zoomOption.includes(\"y\") };\n\n const yFormat =\n yOpts?.format ??\n (percent && (bars.length || stackedLines.length)\n ? (v: number) => formatPercent(v, locale)\n : undefined);\n\n return {\n series,\n x: axisModel(xOpts, xType, categories, false, locale),\n y: {\n ...axisModel(yOpts, yType, yCategories, yType !== \"category\", locale),\n format: yFormat,\n },\n y2,\n y2Map,\n horizontal,\n locale,\n labels,\n formatValue: valueFormatter(locale),\n base: { x: xRange, y: yRange },\n allScatter,\n zoom: zoomAxes,\n tooltipMode: tooltipOptions?.mode ?? (allScatter ? \"nearest\" : \"axis\"),\n baseline: Math.min(Math.max(0, yRange[0]), yRange[1]),\n minSpan: {\n x: xType === \"category\" ? 1 : (xRange[1] - xRange[0]) * 1e-7,\n y: yType === \"category\" ? 1 : (yRange[1] - yRange[0]) * 1e-7,\n },\n percent,\n stacks: input.map((s) =>\n s.stack !== undefined &&\n (s.type === \"bar\" || s.type === \"line\" || s.type === \"area\" || !s.type)\n ? `${s.type === \"bar\" ? \"bar\" : \"line\"}:${s.stack}`\n : null,\n ),\n };\n};\n\n/** Y value drawn for a point: its stacked top for stacks, the close for candles */\nexport const plottedY = (s: SeriesModel, i: number): number =>\n s.barTop ? s.barTop[i] : s.stackTop ? s.stackTop[i] : s.cols.y[i];\n\nconst grids = new WeakMap<SeriesColumns, GridIndex>();\n\n/** Spatial index of a scatter series, built on first use and kept with its data */\nexport const gridOf = (s: SeriesModel): GridIndex => {\n let grid = grids.get(s.cols);\n if (!grid) {\n grid = new GridIndex(s.cols.x, s.cols.y, s.cols.count);\n grids.set(s.cols, grid);\n }\n return grid;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"model.js","names":["LOG_MAP","firstX","data","xs","list","i","item","detectXType","datas","x","axisModel","options","gridDefault","definedEntries","out","value","key","extent","min","max","values","v","smallestStep","step","columns","sorted","k","d","bandOf","category","axis","s","stackValues","totals","percent","byX","stack","count","y","t","running","members","base","top","valid","sums","total","b","DEFAULT_UP","DEFAULT_DOWN","hasDateY","precise","nextStep","power","f","alignedDomain","a0","a1","left","stepL","tickStep","n","lo","hi","ensureSpan","niceDomain","start","mapped","mapColumns","map","hit","raw","mapper","column","a","cols","range","add","c","decades","logColumns","rawBase","zero","toPlotY","model","fromPlotY","floorBases","floor","heatPosition","mid","heatmapStops","dark","luminance","theme","scheme","neutral","mixOklab","end","withLightness","side","negative","color","buildModel","resolve","resolver","resolveStaticColor","fallback","input","locale","resolveLocale","tooltipOptions","labels","chartLabels","xType","categories","collectCategories","categoryMap","resolveX","xResolver","name","yOpts","heatmapData","yCategories","collectYCategories","yType","yLog","yCategoryMap","resolveY","resolverKey","horizontal","usedKeys","series","index","entry","cache","normalizeData","type","paletteColor","pointColors","resolved","rgba","colorScale","valueRange","cellColors","colorMidpoint","colorLut","scale","lut","oklabRamp","ramp","connector","id","toCss","hidden","visible","allScatter","slotted","bars","band","slots","stackId","share","w","group","slotWidth","slot","stackedBars","stacked","percentStacked","p","y0","stackedLines","candles","candleBand","heatmaps","cx","cy","xOpts","xRange","pad","pointsOnly","valuesOf","listBars","log","leftVisible","leftSeries","leftBars","yRange","yValues","filled","yBound","y2Opts","y2","y2Map","rightSeries","y2Log","rightVisible","domain","y2Bound","timeline","zoomOption","zoomAxes","yFormat","formatPercent","valueFormatter","plottedY","grids","gridOf","grid","GridIndex"],"sources":["../../../../charts/src/engine/model.ts"],"sourcesContent":["// Options -> chart model: normalized data, colors, bar layout, stacks and\n// the full ranges of the axes. Pure (colors go through the theme's resolver).\n\nimport {\n luminance,\n mixOklab,\n oklabRamp,\n resolveStaticColor,\n toCss,\n withLightness,\n type ColorResolver,\n type Rgba,\n} from \"./color\";\nimport {\n collectCategories,\n collectYCategories,\n normalizeData,\n xResolver,\n type SeriesColumns,\n type YResolver,\n} from \"./data\";\nimport { formatPercent, valueFormatter } from \"./format\";\nimport { chartLabels } from \"./labels\";\nimport { resolveLocale } from \"./locale\";\nimport { ensureSpan, niceDomain, tickStep } from \"./scale\";\nimport { GridIndex } from \"./spatial\";\nimport type { ChartTheme } from \"./theme\";\nimport type {\n ChartAxisOptions,\n ChartAxisType,\n ChartColorScheme,\n ChartCurve,\n ChartOptions,\n ChartSeries,\n ChartSeriesData,\n ChartLabels,\n ChartSeriesType,\n ChartTimeZone,\n} from \"./types\";\nimport type { Range } from \"./viewport\";\n\nexport interface AxisModel {\n type: ChartAxisType;\n reverse: boolean;\n categories: string[];\n title?: string;\n format?: (value: number) => string;\n grid: boolean;\n visible: boolean;\n tickCount?: number;\n /** Locale of the tick and tooltip labels (historical English texts when omitted) */\n locale?: string;\n /** Calendar of a time axis */\n timeZone?: ChartTimeZone;\n}\n\nexport interface SeriesModel {\n index: number;\n /** Key of the GPU resources and of the data cache */\n key: string;\n id: string;\n name: string;\n type: ChartSeriesType;\n color: Rgba;\n colorCss: string;\n lineWidth: number;\n pointSize: number;\n opacity: number;\n hidden: boolean;\n showLabels: boolean;\n curve: ChartCurve;\n /**\n * Plotted columns: the data, mapped onto the left axis for the series of\n * the right axis (`raw` keeps the values of the data)\n */\n cols: SeriesColumns;\n /** Columns of the data (shown in tooltips and labels) */\n raw: SeriesColumns;\n /** Value axis of the series */\n yAxis: \"left\" | \"right\";\n /** Bars with a start (`y0`): drawn from it, never stacked */\n floating: boolean;\n /** Bars / candlesticks: x offset of the series inside a group and half of the bar width */\n barOffset: number;\n barHalfWidth: number;\n /** Bars: bottom / top of every bar (stacks included) */\n barBase: Float64Array | null;\n barTop: Float64Array | null;\n /** Stacked lines / areas: bottom / top of every point */\n stackBase: Float64Array | null;\n stackTop: Float64Array | null;\n /** Scatter / bar: resolved per-point colors */\n pointColors: (Rgba | undefined)[] | null;\n /** Candlesticks: colors of the rising / falling candles */\n upColor: Rgba;\n downColor: Rgba;\n /** Heatmaps: packed color of every cell (0 = no cell) and half of a cell, in data units */\n cellColors: Uint32Array | null;\n cellHalf: { x: number; y: number };\n /** Heatmaps: ramp of the colors and the values at its ends */\n colorScale: Rgba[];\n valueRange: Range;\n /** Heatmaps: value at the middle of the ramp (`null`: linear over the range) */\n colorMidpoint: number | null;\n /** Heatmaps: 256 packed colors along the ramp (OKLab) */\n colorLut: Uint32Array | null;\n /** Hit tests and tooltips include the series */\n tooltip: boolean;\n /** Box plots: outlier rings or dots, and their diameter */\n outlierShape: \"hollow\" | \"filled\";\n outlierSize: number;\n /** Bars: lines from the end of every bar to the next one */\n connector: { color: Rgba; dash: number[]; width: number } | null;\n /** Corner radius in CSS pixels (bars, heatmap cells) */\n radius: number;\n /** Tooltip format of the values */\n format?: (value: number) => string;\n /** Scatter: name of the `value` of the points */\n valueName?: string;\n}\n\n/**\n * Map of the values of a series onto the plotted (left axis) units:\n * `left = (log ? log10(value) : value) * scale + offset`\n */\nexport interface AxisMap {\n scale: number;\n offset: number;\n /** Logarithmic axis: the values are plotted as their base-10 logarithm */\n log?: boolean;\n}\n\n/** Plotted units of a log axis: the base-10 logarithm of the values */\nconst LOG_MAP: AxisMap = { scale: 1, offset: 0, log: true };\n\nexport interface ChartModel {\n series: SeriesModel[];\n x: AxisModel;\n y: AxisModel;\n /** Right value axis (`yAxis2`), `null` when no series uses it */\n y2: AxisModel | null;\n /** Right axis values -> left axis values */\n y2Map: AxisMap | null;\n /** The x axis runs down the left side, the values along the bottom */\n horizontal: boolean;\n /** Resolved locale (`locale` option, else the page language) */\n locale: string;\n /** Texts of the locale with the `labels` overrides */\n labels: ChartLabels;\n /** Tooltip value of the locale (series without `format`) */\n formatValue: (value: number) => string;\n /** Full ranges (zoomed out) */\n base: { x: Range; y: Range };\n /** Every series is a scatter (or a heatmap): nearest tooltips, xy zoom */\n allScatter: boolean;\n zoom: { x: boolean; y: boolean };\n tooltipMode: \"nearest\" | \"axis\" | \"item\";\n /** Y value the areas are filled to */\n baseline: number;\n /** Smallest zoomed spans */\n minSpan: { x: number; y: number };\n /** Stacks are scaled to 100% */\n percent: boolean;\n /** Stack id of every series (`null` when not stacked) */\n stacks: (string | null)[];\n}\n\nexport interface DataCacheEntry {\n data: ChartSeriesData;\n resolverKey: string;\n cols: SeriesColumns;\n}\n\nexport type DataCache = Map<string, DataCacheEntry>;\n\nconst firstX = (data: ChartSeriesData): unknown => {\n if (typeof data === \"object\" && data !== null && !(\"length\" in data)) {\n const xs = (data as { x?: ArrayLike<unknown> }).x;\n return xs && xs.length ? xs[0] : undefined;\n }\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < Math.min(list.length, 8); i++) {\n const item = list[i];\n if (Array.isArray(item)) return item[0];\n if (item && typeof item === \"object\") return (item as { x?: unknown }).x;\n }\n return undefined;\n};\n\n/** Axis type when not given: dates -> time, strings -> category */\nexport const detectXType = (\n datas: readonly ChartSeriesData[],\n): ChartAxisType => {\n for (const data of datas) {\n const x = firstX(data);\n if (x instanceof Date) return \"time\";\n if (typeof x === \"string\") return \"category\";\n }\n return \"linear\";\n};\n\nconst axisModel = (\n options: ChartAxisOptions | undefined,\n type: ChartAxisType,\n categories: string[],\n gridDefault: boolean,\n locale: string,\n): AxisModel => ({\n type,\n reverse: !!options?.reverse,\n categories,\n title: options?.title,\n format: options?.format,\n grid: options?.grid ?? gridDefault,\n visible: options?.visible ?? true,\n tickCount: options?.tickCount,\n locale,\n timeZone: options?.timeZone ?? \"local\",\n});\n\n/** Defined entries only (`{ open: undefined }` keeps the built-in text) */\nconst definedEntries = <T extends object>(value: T | undefined): Partial<T> => {\n const out: Partial<T> = {};\n if (!value) return out;\n for (const key of Object.keys(value) as (keyof T)[]) {\n if (value[key] !== undefined) out[key] = value[key];\n }\n return out;\n};\n\nconst extent = (values: ArrayLike<number>): Range => {\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < values.length; i++) {\n const v = values[i];\n if (!Number.isFinite(v)) continue;\n if (v < min) min = v;\n if (v > max) max = v;\n }\n return [min, max];\n};\n\n/** Smallest positive gap between consecutive values (bar width on numeric axes) */\nconst smallestStep = (columns: ArrayLike<number>[], sorted: boolean[]) => {\n let step = Infinity;\n columns.forEach((values, k) => {\n const xs = sorted[k] ? values : Float64Array.from(values).sort();\n for (let i = 1; i < xs.length; i++) {\n const d = xs[i] - xs[i - 1];\n if (d > 0 && d < step) step = d;\n }\n });\n return step;\n};\n\nconst bandOf = (list: SeriesModel[], axis: \"x\" | \"y\", category: boolean) => {\n if (category) return 1;\n const step = smallestStep(\n list.map((s) => (axis === \"x\" ? s.cols.x : s.cols.y)),\n list.map((s) => axis === \"x\" && s.cols.sorted),\n );\n return Number.isFinite(step) ? step : 1;\n};\n\n/**\n * Stacks the y values of series sharing a stack id (positive and negative\n * values separately); `percent` scales every stack to 100 at each x\n */\nconst stackValues = (\n list: { s: SeriesModel; stack: string }[],\n percent: boolean,\n): { base: Float64Array; top: Float64Array }[] => {\n const totals = new Map<string, Map<number, [number, number]>>();\n if (percent) {\n for (const { s, stack } of list) {\n let byX = totals.get(stack);\n if (!byX) totals.set(stack, (byX = new Map()));\n const { x, y, count } = s.cols;\n for (let i = 0; i < count; i++) {\n const v = y[i];\n if (!Number.isFinite(v)) continue;\n const t = byX.get(x[i]) ?? [0, 0];\n if (v >= 0) t[0] += v;\n else t[1] -= v;\n byX.set(x[i], t);\n }\n }\n }\n const running = new Map<string, Map<number, [number, number]>>();\n const members = new Map<string, number>();\n for (const { stack } of list)\n members.set(stack, (members.get(stack) ?? 0) + 1);\n return list.map(({ s, stack }) => {\n const { x, y, count } = s.cols;\n if (!percent && members.get(stack) === 1) {\n // alone in its stack (e.g. grouped bars): from zero, no bookkeeping\n const base = new Float64Array(count);\n const top = new Float64Array(count);\n for (let i = 0; i < count; i++) {\n const v = y[i];\n const valid = Number.isFinite(v);\n base[i] = valid ? 0 : NaN;\n top[i] = valid ? v : NaN;\n }\n return { base, top };\n }\n let byX = running.get(stack);\n if (!byX) running.set(stack, (byX = new Map()));\n const sums = totals.get(stack);\n const base = new Float64Array(count);\n const top = new Float64Array(count);\n for (let i = 0; i < count; i++) {\n let v = y[i];\n if (!Number.isFinite(v)) {\n base[i] = NaN;\n top[i] = NaN;\n continue;\n }\n if (sums) {\n const t = sums.get(x[i]);\n const total = t ? (v >= 0 ? t[0] : t[1]) : 0;\n v = total > 0 ? (v / total) * 100 : 0;\n }\n const t = byX.get(x[i]) ?? [0, 0];\n const b = v >= 0 ? t[0] : t[1];\n base[i] = b;\n top[i] = b + v;\n if (v >= 0) t[0] += v;\n else t[1] += v;\n byX.set(x[i], t);\n }\n return { base, top };\n });\n};\n\nconst DEFAULT_UP = \"var(--success-color, #16a34a)\";\nconst DEFAULT_DOWN = \"var(--danger-color, #dc2626)\";\n\n/** Dates in the y values (or starts) of objects: a time value axis */\nconst hasDateY = (datas: readonly ChartSeriesData[]): boolean => {\n for (const data of datas) {\n if (typeof data !== \"object\" || data === null || !(\"length\" in data))\n continue;\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < Math.min(list.length, 8); i++) {\n const item = list[i];\n if (item && typeof item === \"object\" && !Array.isArray(item)) {\n const d = item as { y?: unknown; y0?: unknown };\n if (d.y instanceof Date || d.y0 instanceof Date) return true;\n }\n }\n }\n return false;\n};\n\nconst precise = (v: number) => Number(v.toPrecision(12));\n\n/** Next step of the 1, 2, 5 × 10^k sequence */\nconst nextStep = (step: number) => {\n const power = 10 ** Math.floor(Math.log10(step) + 1e-9);\n const f = step / power;\n return (f < 1.5 ? 2 : f < 3.5 ? 5 : 10) * power;\n};\n\n/**\n * Range of the right axis covering [lo, hi] with as many tick intervals as\n * the left range has (its ticks then line up with the left grid)\n */\nexport const alignedDomain = (\n lo: number,\n hi: number,\n left: Range,\n count: number,\n): Range => {\n const [a0, a1] = left;\n const stepL = tickStep(a0, a1, count);\n const n = stepL > 0 ? Math.round((a1 - a0) / stepL) : 0;\n [lo, hi] = ensureSpan(lo, hi);\n if (n < 1 || Math.abs(n * stepL - (a1 - a0)) > stepL * 1e-6) {\n return niceDomain(lo, hi, count);\n }\n let step = tickStep(lo, hi, n);\n for (let k = 0; k < 40 && step > 0; k++) {\n const start = Math.floor(lo / step + 1e-9) * step;\n if (start + n * step >= hi - step * 1e-9) {\n return [precise(start), precise(start + n * step)];\n }\n step = nextStep(step);\n }\n return niceDomain(lo, hi, count);\n};\n\nconst mapped = new WeakMap<\n SeriesColumns,\n { key: string; cols: SeriesColumns }\n>();\n\n/** Columns of a right-axis series in left axis units (cached with the data) */\nconst mapColumns = (raw: SeriesColumns, map: AxisMap): SeriesColumns => {\n const key = `${map.scale},${map.offset},${!!map.log}`;\n const hit = mapped.get(raw);\n if (hit && hit.key === key) return hit.cols;\n const f = mapper(map);\n const column = (a: Float64Array | null) => (a ? a.map(f) : null);\n const cols: SeriesColumns = {\n ...raw,\n y: raw.y.map(f),\n open: column(raw.open),\n high: column(raw.high),\n low: column(raw.low),\n y0: column(raw.y0),\n q1: column(raw.q1),\n q3: column(raw.q3),\n outliers: raw.outliers ? raw.outliers.map((list) => list?.map(f)) : null,\n };\n if (map.log) {\n // zeros and negatives have no logarithm: the extent of the others\n const range: Range = [Infinity, -Infinity];\n const add = (a: ArrayLike<number> | null | undefined) => {\n if (!a) return;\n for (let i = 0; i < a.length; i++) {\n const v = a[i];\n if (!Number.isFinite(v)) continue;\n if (v < range[0]) range[0] = v;\n if (v > range[1]) range[1] = v;\n }\n };\n for (const c of [cols.y, cols.y0, cols.high, cols.low, cols.q1, cols.q3])\n add(c);\n cols.outliers?.forEach((list) => add(list));\n cols.yMin = range[0] <= range[1] ? range[0] : NaN;\n cols.yMax = range[0] <= range[1] ? range[1] : NaN;\n } else {\n const lo = f(raw.yMin);\n const hi = f(raw.yMax);\n cols.yMin = Math.min(lo, hi);\n cols.yMax = Math.max(lo, hi);\n }\n mapped.set(raw, { key, cols });\n return cols;\n};\n\n/** A log range widened to whole decades (`[0.3, 2.4]` -> `[0, 3]`) */\nconst decades = (range: Range): Range => {\n const lo = Math.floor(range[0] + 1e-9);\n const hi = Math.ceil(range[1] - 1e-9);\n return [lo, hi > lo ? hi : lo + 1];\n};\n\n/**\n * Plots a series through a map: its columns, bars, stacks and lower\n * edges (bars / areas of the right axis start at `zero`)\n */\nconst logColumns = (s: SeriesModel, map: AxisMap, zero = -Infinity) => {\n const f = mapper(map);\n const column = (a: Float64Array | null) => (a ? a.map(f) : null);\n const rawBase = s.stackBase;\n s.cols = mapColumns(s.raw, map);\n s.barBase =\n s.barBase && !s.floating\n ? s.barBase.map((v) => (v === 0 ? (map.log ? -Infinity : f(0)) : f(v)))\n : column(s.barBase);\n s.barTop = column(s.barTop);\n s.stackTop = column(s.stackTop);\n s.stackBase =\n rawBase && rawBase === s.raw.y0\n ? s.cols.y0\n : rawBase\n ? column(rawBase)\n : s.type === \"area\"\n ? new Float64Array(s.cols.count).fill(zero)\n : null;\n};\n\n/** Value -> plotted units of a map (`-Infinity` for 0 on log axes) */\nconst mapper =\n (map: AxisMap) =>\n (v: number): number =>\n (map.log ? Math.log10(v) : v) * map.scale + map.offset;\n\n/** Value of the y axis -> plotted y (the logarithm on log axes) */\nexport const toPlotY = (model: { y: AxisModel }, value: number): number =>\n model.y.type === \"log\" ? Math.log10(value) : value;\n\n/** Plotted y -> value of the y axis */\nexport const fromPlotY = (model: { y: AxisModel }, value: number): number =>\n model.y.type === \"log\" ? 10 ** value : value;\n\n/** Replaces the bases of bars / areas on log axes (`-Infinity`) by the bottom of the axis */\nconst floorBases = (s: SeriesModel, floor: number) => {\n for (const a of [s.barBase, s.stackBase]) {\n if (!a) continue;\n for (let i = 0; i < a.length; i++) if (a[i] === -Infinity) a[i] = floor;\n }\n};\n\n/** Position (0-1) of a heatmap value on its color ramp */\nexport const heatPosition = (\n s: Pick<SeriesModel, \"valueRange\" | \"colorMidpoint\">,\n v: number,\n): number => {\n const [lo, hi] = s.valueRange;\n const mid = s.colorMidpoint;\n let t: number;\n if (mid !== null && mid > lo && mid < hi) {\n t =\n v < mid\n ? ((v - lo) / (mid - lo)) * 0.5\n : 0.5 + ((v - mid) / (hi - mid)) * 0.5;\n } else {\n t = (v - lo) / (hi - lo || 1);\n }\n return t < 0 ? 0 : t > 1 ? 1 : t;\n};\n\n/**\n * Built-in ramps of heatmaps, perceptual (OKLab) and theme-aware: light\n * themes go from a near-white tint to a deep hue, dark themes from a dark\n * tint of the surface to a bright saturated hue; diverging ramps meet in a\n * neutral middle\n */\nexport const heatmapStops = (\n scheme: ChartColorScheme,\n color: Rgba,\n theme: ChartTheme,\n negative: Rgba,\n): Rgba[] => {\n const dark = luminance(theme.background) < 0.4;\n if (scheme === \"diverging\") {\n const neutral = mixOklab(\n theme.surface,\n theme.textMuted,\n dark ? 0.12 : 0.08,\n );\n const end = (c: Rgba) =>\n dark ? withLightness(c, 0.7, 1.25) : withLightness(c, 0.5, 1.05);\n const side = (c: Rgba) => mixOklab(neutral, end(c), 0.5);\n return [end(negative), side(negative), neutral, side(color), end(color)];\n }\n return dark\n ? [\n mixOklab(theme.surface, color, 0.14),\n withLightness(color, 0.46, 0.95),\n withLightness(color, 0.64, 1.2),\n withLightness(color, 0.8, 1.15),\n ]\n : [\n mixOklab(theme.surface, color, 0.06),\n withLightness(color, 0.8, 0.6),\n withLightness(color, 0.58, 1),\n withLightness(color, 0.36, 0.9),\n ];\n};\n\nexport const buildModel = (\n options: ChartOptions,\n theme: ChartTheme,\n hidden: ReadonlySet<string>,\n cache: DataCache,\n resolver: ColorResolver | null = null,\n): ChartModel => {\n const resolve: ColorResolver =\n resolver ??\n theme.resolve ??\n ((value, fallback) => resolveStaticColor(value, {}, fallback));\n const input = options.series;\n // resolved at every build: a page language switch shows on the next update\n const locale = resolveLocale(options.locale);\n const tooltipOptions =\n typeof options.tooltip === \"object\" ? options.tooltip : undefined;\n const labels = chartLabels(locale, {\n ...definedEntries(tooltipOptions?.labels),\n ...definedEntries(options.labels),\n });\n const datas = input.map((s) => s.data);\n const xType = options.xAxis?.type ?? detectXType(datas);\n const categories =\n xType === \"category\"\n ? [...(options.xAxis?.categories ?? collectCategories(datas))]\n : [];\n const categoryMap = new Map(categories.map((c, i) => [c, i]));\n const resolveX = xResolver(xType, (name) => categoryMap.get(name) ?? NaN);\n\n // category y axis (heatmap rows): explicit, or detected from string y values\n const yOpts = options.yAxis;\n const heatmapData = input\n .filter((s) => s.type === \"heatmap\")\n .map((s) => s.data);\n const yCategories =\n yOpts?.type === \"category\" || (!yOpts?.type && heatmapData.length)\n ? [...(yOpts?.categories ?? collectYCategories(heatmapData))]\n : [];\n const yType: ChartAxisType =\n yOpts?.type === \"category\" || yCategories.length\n ? \"category\"\n : yOpts?.type === \"time\" || (!yOpts?.type && hasDateY(datas))\n ? \"time\"\n : yOpts?.type === \"log\"\n ? \"log\"\n : \"linear\";\n const yLog = yType === \"log\";\n const yCategoryMap = new Map(yCategories.map((c, i) => [c, i]));\n const resolveY: YResolver = (v) =>\n typeof v === \"number\"\n ? v\n : typeof v === \"string\"\n ? yType === \"category\"\n ? (yCategoryMap.get(v) ?? NaN)\n : yType === \"time\"\n ? Date.parse(v)\n : Number(v)\n : v instanceof Date\n ? v.getTime()\n : NaN;\n const resolverKey = `${xType}|${categories.join(\"\\u0001\")}|${yType}|${yCategories.join(\"\\u0001\")}`;\n const percent = options.stackMode === \"percent\";\n const horizontal = options.orientation === \"horizontal\";\n\n const usedKeys = new Set<string>();\n const series: SeriesModel[] = input.map((s: ChartSeries, index) => {\n let key = s.id ?? `#${index}`;\n while (usedKeys.has(key)) key += \"'\";\n usedKeys.add(key);\n let entry = cache.get(key);\n if (!entry || entry.data !== s.data || entry.resolverKey !== resolverKey) {\n entry = {\n data: s.data,\n resolverKey,\n cols: normalizeData(s.data, resolveX, resolveY),\n };\n cache.set(key, entry);\n }\n const type = s.type ?? \"line\";\n const paletteColor = theme.palette[index % theme.palette.length];\n const color = s.color ? resolve(s.color, paletteColor) : paletteColor;\n const cols = entry.cols;\n let pointColors: (Rgba | undefined)[] | null = null;\n if (\n (type === \"scatter\" || type === \"bar\" || type === \"boxplot\") &&\n cols.colors\n ) {\n const resolved = new Map<string, Rgba>();\n pointColors = cols.colors.map((c) => {\n if (c === undefined) return undefined;\n let rgba = resolved.get(c);\n if (!rgba) resolved.set(c, (rgba = resolve(c, color)));\n return rgba;\n });\n }\n let colorScale: Rgba[] = [];\n let valueRange: Range = [0, 1];\n let cellColors: Uint32Array | null = null;\n let colorMidpoint: number | null = null;\n let colorLut: Uint32Array | null = null;\n if (type === \"heatmap\") {\n const scale = s.colorScale;\n const scheme: ChartColorScheme =\n scale === \"diverging\" ? \"diverging\" : \"sequential\";\n colorScale =\n typeof scale === \"object\" && scale.length\n ? scale.map((c) => resolve(c, color))\n : heatmapStops(\n scheme,\n color,\n theme,\n resolve(DEFAULT_DOWN, [0.86, 0.15, 0.15, 1]),\n );\n valueRange = s.valueRange\n ? [s.valueRange[0], s.valueRange[1]]\n : [cols.valueMin, cols.valueMax];\n if (!Number.isFinite(valueRange[0])) valueRange = [0, 1];\n const [lo, hi] = valueRange;\n colorMidpoint =\n s.colorMidpoint ??\n (scheme === \"diverging\" && typeof scale !== \"object\"\n ? lo < 0 && hi > 0\n ? 0\n : (lo + hi) / 2\n : null);\n const lut = oklabRamp(colorScale);\n colorLut = lut;\n const values = cols.value ?? cols.y;\n const ramp = { valueRange, colorMidpoint };\n cellColors = new Uint32Array(cols.count);\n for (let i = 0; i < cols.count; i++) {\n const v = values[i];\n if (!Number.isFinite(v) || !Number.isFinite(cols.y[i])) continue;\n // 0 means \"no cell\": the ramp never packs to 0\n cellColors[i] = lut[Math.round(heatPosition(ramp, v) * 255)];\n }\n }\n const connector = s.connector\n ? typeof s.connector === \"object\"\n ? s.connector\n : {}\n : null;\n const id = s.id ?? String(index);\n return {\n index,\n key,\n id,\n name: s.name ?? `${labels.series} ${index + 1}`,\n type,\n color,\n colorCss: toCss(color),\n lineWidth:\n s.lineWidth ??\n (type === \"candlestick\" ? 1 : type === \"boxplot\" ? 1.5 : 2),\n pointSize: s.pointSize ?? (type === \"boxplot\" ? 6 : 8),\n opacity:\n s.opacity ??\n (type === \"area\"\n ? 0.28\n : type === \"scatter\"\n ? 0.78\n : type === \"boxplot\"\n ? 0.22\n : 1),\n hidden: !!s.hidden || hidden.has(id),\n showLabels: !!s.showLabels,\n curve: s.curve ?? \"linear\",\n cols,\n raw: cols,\n yAxis: s.yAxis === \"right\" && !horizontal ? \"right\" : \"left\",\n floating: type === \"bar\" && !!cols.y0,\n barOffset: 0,\n barHalfWidth: 0,\n barBase: null,\n barTop: null,\n stackBase: null,\n stackTop: null,\n pointColors,\n upColor:\n type === \"candlestick\"\n ? resolve(s.upColor ?? DEFAULT_UP, [0.09, 0.64, 0.29, 1])\n : color,\n downColor:\n type === \"candlestick\"\n ? resolve(s.downColor ?? DEFAULT_DOWN, [0.86, 0.15, 0.15, 1])\n : color,\n cellColors,\n cellHalf: { x: 0.5, y: 0.5 },\n colorScale,\n valueRange,\n colorMidpoint,\n colorLut,\n tooltip: s.tooltip !== false,\n outlierShape: s.outlierShape ?? \"hollow\",\n outlierSize: s.outlierSize ?? s.pointSize ?? 7,\n connector:\n connector && type === \"bar\"\n ? {\n color: connector.color\n ? resolve(connector.color, theme.textMuted)\n : theme.textMuted,\n dash: [...(connector.dash ?? [3, 3])],\n width: connector.width ?? 1,\n }\n : null,\n radius: s.radius ?? (type === \"heatmap\" ? 2 : type === \"boxplot\" ? 0 : 3),\n format: s.format,\n valueName: s.valueName,\n };\n });\n\n const visible = series.filter((s) => !s.hidden);\n const allScatter =\n series.length > 0 &&\n series.every((s) => s.type === \"scatter\" || s.type === \"heatmap\");\n\n // Bars and box plots: groups (one slot per stack) and stacking; floating\n // bars (with starts) are drawn from their starts\n const slotted = visible.filter(\n (s) => s.type === \"bar\" || s.type === \"boxplot\",\n );\n const bars = visible.filter((s) => s.type === \"bar\");\n const band = bandOf(slotted, \"x\", xType === \"category\");\n if (slotted.length) {\n const slots = new Map<string, number>();\n const stackId = (s: SeriesModel) =>\n input[s.index].stack ?? `\\u0000${s.key}`;\n for (const s of slotted) {\n if (!slots.has(stackId(s))) slots.set(stackId(s), slots.size);\n }\n let share = 0;\n for (const s of slotted) {\n const w = input[s.index].barWidth;\n if (w !== undefined && w > share) share = Math.min(1, w);\n }\n const group = band * (share || (slots.size > 1 ? 0.78 : 0.62));\n const slotWidth = group / slots.size;\n for (const s of slotted) {\n const slot = slots.get(stackId(s)) ?? 0;\n s.barOffset = -group / 2 + slotWidth * (slot + 0.5);\n s.barHalfWidth = (slotWidth / 2) * (slots.size > 1 ? 0.86 : 1);\n }\n const stackedBars = bars.filter((s) => !s.floating);\n const stacked = stackValues(\n stackedBars.map((s) => ({ s, stack: stackId(s) })),\n false,\n );\n const percentStacked = percent\n ? stackValues(\n stackedBars\n .filter((s) => input[s.index].stack !== undefined)\n .map((s) => ({ s, stack: stackId(s) })),\n true,\n )\n : [];\n let p = 0;\n stackedBars.forEach((s, k) => {\n const values =\n percent && input[s.index].stack !== undefined\n ? percentStacked[p++]\n : stacked[k];\n s.barBase = values.base;\n s.barTop = values.top;\n });\n for (const s of bars) {\n const { y, y0, count } = s.cols;\n if (!s.floating || !y0) continue;\n const base = new Float64Array(count);\n const top = new Float64Array(count);\n for (let i = 0; i < count; i++) {\n const valid = Number.isFinite(y[i]);\n base[i] = valid ? (Number.isFinite(y0[i]) ? y0[i] : 0) : NaN;\n top[i] = valid ? y[i] : NaN;\n }\n s.barBase = base;\n s.barTop = top;\n }\n }\n\n // Range areas: filled down to their lower edges\n for (const s of visible) {\n if (s.type === \"area\" && s.cols.y0 && input[s.index].stack === undefined)\n s.stackBase = s.cols.y0;\n }\n\n // Stacked lines / areas\n const stackedLines = visible.filter(\n (s) =>\n (s.type === \"line\" || s.type === \"area\") &&\n input[s.index].stack !== undefined,\n );\n if (stackedLines.length) {\n const values = stackValues(\n stackedLines.map((s) => ({ s, stack: input[s.index].stack ?? \"\" })),\n percent,\n );\n stackedLines.forEach((s, k) => {\n s.stackBase = values[k].base;\n s.stackTop = values[k].top;\n });\n }\n\n // Candlesticks: one band per x, bodies of 60%\n const candles = visible.filter((s) => s.type === \"candlestick\");\n const candleBand = bandOf(candles, \"x\", xType === \"category\");\n for (const s of candles) s.barHalfWidth = candleBand * 0.3;\n\n // Heatmaps: cells of the size of the smallest step\n const heatmaps = visible.filter((s) => s.type === \"heatmap\");\n if (heatmaps.length) {\n const cx = bandOf(heatmaps, \"x\", xType === \"category\") / 2;\n const cy = bandOf(heatmaps, \"y\", yType === \"category\") / 2;\n for (const s of heatmaps) s.cellHalf = { x: cx, y: cy };\n }\n\n // X range\n const xOpts = options.xAxis;\n let xRange: Range;\n if (xType === \"category\") {\n xRange = [-0.5, Math.max(1, categories.length) - 0.5];\n } else {\n const values: number[] = [];\n for (const s of visible) {\n values.push(s.cols.xMin, s.cols.xMax);\n const pad =\n s.type === \"bar\" || s.type === \"boxplot\"\n ? band / 2\n : s.type === \"candlestick\"\n ? candleBand / 2\n : s.type === \"heatmap\"\n ? s.cellHalf.x\n : 0;\n if (pad) values.push(s.cols.xMin - pad, s.cols.xMax + pad);\n }\n xRange = ensureSpan(\n ...extent(values),\n xType === \"time\" ? [Date.now() - 86400000, Date.now()] : [0, 1],\n );\n const pointsOnly = series.every((s) => s.type === \"scatter\");\n if (pointsOnly) {\n const pad = (xRange[1] - xRange[0]) * 0.04;\n xRange = [xRange[0] - pad, xRange[1] + pad];\n }\n const nice = xOpts?.nice ?? (pointsOnly && xType === \"linear\");\n if (nice && xType === \"linear\") {\n xRange = niceDomain(xRange[0], xRange[1], xOpts?.tickCount ?? 6);\n }\n }\n if (xOpts?.min !== undefined) xRange[0] = xOpts.min;\n if (xOpts?.max !== undefined) xRange[1] = xOpts.max;\n xRange = ensureSpan(xRange[0], xRange[1]);\n\n // Log axis: the left series are plotted as logarithms (stacks are summed\n // first); bars and areas from zero start at the bottom of the axis\n if (yLog) {\n for (const s of series) {\n if (s.yAxis === \"right\" || s.type === \"heatmap\") continue;\n logColumns(s, LOG_MAP);\n }\n }\n\n // Y range (left axis: the series of the right axis are mapped onto it)\n const valuesOf = (\n list: SeriesModel[],\n zero: boolean | undefined,\n log = false,\n ) => {\n const values: number[] = [];\n for (const s of list) {\n if (s.type === \"bar\" && s.barBase && s.barTop) {\n values.push(...extent(s.barBase), ...extent(s.barTop));\n } else if (s.stackBase && s.stackTop) {\n values.push(...extent(s.stackBase), ...extent(s.stackTop));\n } else if (s.type === \"heatmap\") {\n values.push(s.cols.yMin - s.cellHalf.y, s.cols.yMax + s.cellHalf.y);\n } else {\n values.push(s.cols.yMin, s.cols.yMax);\n }\n }\n const listBars = list.filter((s) => s.type === \"bar\");\n if (!log && (listBars.some((s) => !s.floating) || zero)) values.push(0);\n if (listBars.some((s) => s.showLabels)) {\n // room for the value labels above the tallest bar\n const [lo, hi] = extent(values);\n if (hi > 0) values.push(hi + (hi - Math.min(0, lo)) * 0.1);\n if (lo < 0) values.push(lo - (Math.max(0, hi) - lo) * 0.1);\n }\n return values;\n };\n const leftVisible = visible.filter((s) => s.yAxis === \"left\");\n const leftSeries = leftVisible.length ? leftVisible : visible;\n const leftBars = leftSeries.filter((s) => s.type === \"bar\");\n let yRange: Range;\n if (yType === \"category\") {\n yRange = [-0.5, Math.max(1, yCategories.length) - 0.5];\n } else {\n const yValues = valuesOf(leftSeries, yOpts?.zero, yLog);\n const filled =\n leftBars.length > 0 || leftSeries.some((s) => s.type === \"area\");\n yRange = ensureSpan(...extent(yValues));\n if (series.every((s) => s.type === \"scatter\")) {\n const pad = (yRange[1] - yRange[0]) * 0.06;\n yRange = [yRange[0] - pad, yRange[1] + pad];\n } else if (\n (candles.length || leftSeries.some((s) => s.type === \"boxplot\")) &&\n !leftBars.length\n ) {\n // room above / below the wicks and the outliers\n const pad = (yRange[1] - yRange[0]) * 0.04;\n yRange = [yRange[0] - pad, yRange[1] + pad];\n }\n if ((yOpts?.nice ?? !heatmaps.length) && yType === \"linear\") {\n yRange = niceDomain(yRange[0], yRange[1], yOpts?.tickCount ?? 5);\n }\n if (yLog && yOpts?.nice !== false) yRange = decades(yRange);\n if (percent && (bars.length || stackedLines.length)) {\n // 100% stacks: exactly 0-100 (or -100-100)\n yRange = [extent(yValues)[0] < 0 ? -100 : 0, 100];\n }\n if (filled && !yOpts?.zero && !yLog) {\n // bars start at zero: no padding below / above it\n if (yRange[0] < 0 && extent(yValues)[0] >= 0) yRange[0] = 0;\n }\n }\n const yBound = (v: number) => (yLog ? Math.log10(v) : v);\n if (yOpts?.min !== undefined) yRange[0] = yBound(yOpts.min);\n if (yOpts?.max !== undefined) yRange[1] = yBound(yOpts.max);\n yRange = ensureSpan(yRange[0], yRange[1]);\n if (yLog) {\n for (const s of series) if (s.yAxis === \"left\") floorBases(s, yRange[0]);\n }\n\n // Right axis: a range aligned on the left ticks; its series are mapped\n // onto the left axis\n const y2Opts = options.yAxis2;\n let y2: AxisModel | null = null;\n let y2Map: AxisMap | null = null;\n const rightSeries = series.filter((s) => s.yAxis === \"right\");\n if (rightSeries.length && yType !== \"category\") {\n const y2Log = y2Opts?.type === \"log\";\n const rightVisible = rightSeries.filter((s) => !s.hidden);\n // log: the extent of the logarithms\n const values = y2Log\n ? rightVisible.flatMap((s) => {\n const c = mapColumns(s.raw, LOG_MAP);\n return [c.yMin, c.yMax];\n })\n : valuesOf(rightVisible, y2Opts?.zero);\n const [lo, hi] = ensureSpan(...extent(values));\n let domain: Range =\n y2Opts?.nice === false\n ? [lo, hi]\n : y2Log\n ? decades([lo, hi])\n : alignedDomain(lo, hi, yRange, yOpts?.tickCount ?? 5);\n const y2Bound = (v: number) => (y2Log ? Math.log10(v) : v);\n if (y2Opts?.min !== undefined) domain[0] = y2Bound(y2Opts.min);\n if (y2Opts?.max !== undefined) domain[1] = y2Bound(y2Opts.max);\n domain = ensureSpan(domain[0], domain[1]);\n const scale = (yRange[1] - yRange[0]) / (domain[1] - domain[0]);\n const map: AxisMap = {\n scale,\n offset: yRange[0] - domain[0] * scale,\n log: y2Log,\n };\n y2Map = map;\n const zero = y2Log\n ? yRange[0]\n : mapper(map)(Math.min(Math.max(0, domain[0]), domain[1]));\n for (const s of rightSeries) {\n logColumns(s, map, zero);\n floorBases(s, yRange[0]);\n }\n y2 = axisModel(y2Opts, y2Log ? \"log\" : \"linear\", [], false, locale);\n }\n\n // range bars on a time axis (Gantt charts): rows are unrelated, the\n // tooltip shows the task under the pointer\n const timeline =\n yType === \"time\" &&\n series.some((s) => s.type === \"bar\") &&\n series.every((s) => (s.type === \"bar\" ? s.floating : s.type === \"scatter\"));\n\n const zoomOption =\n options.interaction === false\n ? false\n : options.interaction === true || options.interaction === undefined\n ? true\n : (options.interaction.zoom ?? true);\n const zoomAxes =\n zoomOption === false\n ? { x: false, y: false }\n : zoomOption === true\n ? { x: true, y: allScatter }\n : { x: zoomOption.includes(\"x\"), y: zoomOption.includes(\"y\") };\n\n const yFormat =\n yOpts?.format ??\n (percent && (bars.length || stackedLines.length)\n ? (v: number) => formatPercent(v, locale)\n : undefined);\n\n return {\n series,\n x: axisModel(xOpts, xType, categories, false, locale),\n y: {\n ...axisModel(yOpts, yType, yCategories, yType !== \"category\", locale),\n format: yFormat,\n },\n y2,\n y2Map,\n horizontal,\n locale,\n labels,\n formatValue: valueFormatter(locale),\n base: { x: xRange, y: yRange },\n allScatter,\n zoom: zoomAxes,\n tooltipMode:\n tooltipOptions?.mode ??\n (allScatter ? \"nearest\" : timeline ? \"item\" : \"axis\"),\n baseline: yLog ? yRange[0] : Math.min(Math.max(0, yRange[0]), yRange[1]),\n minSpan: {\n x: xType === \"category\" ? 1 : (xRange[1] - xRange[0]) * 1e-7,\n y: yType === \"category\" ? 1 : (yRange[1] - yRange[0]) * 1e-7,\n },\n percent,\n stacks: input.map((s) =>\n s.stack !== undefined &&\n (s.type === \"bar\" || s.type === \"line\" || s.type === \"area\" || !s.type)\n ? `${s.type === \"bar\" ? \"bar\" : \"line\"}:${s.stack}`\n : null,\n ),\n };\n};\n\n/** Y value drawn for a point: its stacked top for stacks, the close for candles */\nexport const plottedY = (s: SeriesModel, i: number): number =>\n s.barTop ? s.barTop[i] : s.stackTop ? s.stackTop[i] : s.cols.y[i];\n\nconst grids = new WeakMap<SeriesColumns, GridIndex>();\n\n/** Spatial index of a scatter series, built on first use and kept with its data */\nexport const gridOf = (s: SeriesModel): GridIndex => {\n let grid = grids.get(s.cols);\n if (!grid) {\n grid = new GridIndex(s.cols.x, s.cols.y, s.cols.count);\n grids.set(s.cols, grid);\n }\n return grid;\n};\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../locale.cjs");var t=(t,n)=>{let r=Math.max(0,Math.min(12,Math.round(n)));return e.numberFormat(e.resolveLocale(t),{minimumFractionDigits:r,maximumFractionDigits:r})},n=(t,n,r=2)=>{if(!Number.isFinite(t))return`–`;let i=e.resolveLocale(n),a=Math.abs(t);for(let[n,o]of e.compactUnits(i))if(a>=n)return e.numberFormat(i,{maximumFractionDigits:r}).format(t/n)+o;return e.numberFormat(i,{maximumFractionDigits:a>=100?0:a>=1?2:4}).format(t)},r=(t,n,r=2,i=!0)=>{if(!Number.isFinite(t))return`–`;let a=Math.max(0,Math.min(6,Math.round(r)));return e.numberFormat(e.resolveLocale(n),{style:`percent`,minimumFractionDigits:a,maximumFractionDigits:a,signDisplay:i?`exceptZero`:`auto`}).format(t)},i=(i,a,o)=>{let s=e.resolveLocale(i.locale),c=i.pricePrecision??a,l=i.sizePrecision??o,u=t(s,c),d=t(s,l),f=e=>t=>Number.isFinite(t)?e(t):`–`,p=f(i.formatSize??(e=>d.format(e))),m=e=>n(e,s,2);return{price:f(i.formatPrice??(e=>u.format(e))),size:p,total:f(e=>Math.abs(e)>=1e6?m(e):p(e)),notional:f(e=>Math.abs(e)>=1e4?m(e):t(s,2).format(e)),compact:f(m),fixed:(e,n)=>Number.isFinite(e)?t(s,n).format(e):`–`,percent:(e,t=2,n=!0)=>r(e,s,t,n),locale:s,priceDecimals:c,sizeDecimals:l}},a=(e,t=2)=>String(e).padStart(t,`0`),o=(e,t=!0)=>{let
|
|
1
|
+
const e=require("../locale.cjs");var t=(t,n)=>{let r=Math.max(0,Math.min(12,Math.round(n)));return e.numberFormat(e.resolveLocale(t),{minimumFractionDigits:r,maximumFractionDigits:r})},n=(t,n,r=2)=>{if(!Number.isFinite(t))return`–`;let i=e.resolveLocale(n),a=Math.abs(t);for(let[n,o]of e.compactUnits(i))if(a>=n)return e.numberFormat(i,{maximumFractionDigits:r}).format(t/n)+o;return e.numberFormat(i,{maximumFractionDigits:a>=100?0:a>=1?2:4}).format(t)},r=(t,n,r=2,i=!0)=>{if(!Number.isFinite(t))return`–`;let a=Math.max(0,Math.min(6,Math.round(r)));return e.numberFormat(e.resolveLocale(n),{style:`percent`,minimumFractionDigits:a,maximumFractionDigits:a,signDisplay:i?`exceptZero`:`auto`}).format(t)},i=(i,a,o)=>{let s=e.resolveLocale(i.locale),c=i.pricePrecision??a,l=i.sizePrecision??o,u=t(s,c),d=t(s,l),f=e=>t=>Number.isFinite(t)?e(t):`–`,p=f(i.formatSize??(e=>d.format(e))),m=e=>n(e,s,2);return{price:f(i.formatPrice??(e=>u.format(e))),size:p,total:f(e=>Math.abs(e)>=1e6?m(e):p(e)),notional:f(e=>Math.abs(e)>=1e4?m(e):t(s,2).format(e)),compact:f(m),fixed:(e,n)=>Number.isFinite(e)?t(s,n).format(e):`–`,percent:(e,t=2,n=!0)=>r(e,s,t,n),locale:s,priceDecimals:c,sizeDecimals:l}},a=(e,t=2)=>String(e).padStart(t,`0`),o=(e,t=!0,n=`local`)=>{let r=new Date(e);if(Number.isNaN(r.getTime()))return`–`;let i=n===`utc`,o=i?`${a(r.getUTCHours())}:${a(r.getUTCMinutes())}:${a(r.getUTCSeconds())}`:`${a(r.getHours())}:${a(r.getMinutes())}:${a(r.getSeconds())}`;return t?`${o}.${a(i?r.getUTCMilliseconds():r.getMilliseconds(),3)}`:o},s=`var(--success-color, #16a34a)`,c=`var(--danger-color, #dc2626)`,l=[.09,.64,.29,1],u=[.86,.15,.15,1],d=(e,t)=>{let n=(t,n)=>e.resolve?e.resolve(t,n):n,r=t.colorConvention===`red-up`;return{up:n(t.upColor??(r?`var(--danger-color, #dc2626)`:`var(--success-color, #16a34a)`),r?u:l),down:n(t.downColor??(r?`var(--success-color, #16a34a)`:`var(--danger-color, #dc2626)`),r?l:u)}},f=(e,t,n=400,r)=>`${n} ${r??t.fontSize??12}px ${t.fontFamily??e.fontFamily}`,p=(e,t)=>t<=0?1:1-Math.exp(-Math.max(0,e)/t),m=(e,t,n)=>e<t?t:e>n?n:e,h=(e,t,n,r,i,a)=>{let o=Math.max(0,Math.min(a,r/2,i/2));e.beginPath(),e.moveTo(t+o,n),e.arcTo(t+r,n,t+r,n+i,o),e.arcTo(t+r,n+i,t,n+i,o),e.arcTo(t,n+i,t,n,o),e.arcTo(t,n,t+r,n,o),e.closePath()};exports.DEFAULT_DOWN=c,exports.DEFAULT_UP=s,exports.clamp=m,exports.createFormatters=i,exports.ease=p,exports.fontOf=f,exports.formatClock=o,exports.formatCompactNumber=n,exports.formatPercent=r,exports.numberFormat=t,exports.roundRect=h,exports.sideColors=d;
|
|
2
2
|
//# sourceMappingURL=format.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.cjs","names":["intlNumberFormat","resolveLocale","compactUnits","require_locale","numberFormat","d","decimals","locale","formatCompactNumber","value","resolved","abs","unit","suffix","maxDecimals","formatPercent","fraction","signed","createFormatters","options","priceDecimals","inferredPrice","sizeDecimals","inferredSize","priceFormat","sizeFormat","finite","fn","size","v","compact","pad","length","formatClock","time","base","milliseconds","DEFAULT_UP","DEFAULT_DOWN","UP_FALLBACK","DOWN_FALLBACK","sideColors","resolve","theme","fallback","redUp","fontOf","weight","ease","tau","dt","clamp","min","max","roundRect","radius","r","w","h","ctx","x","y"],"sources":["../../../../../charts/src/engine/orderbook/format.ts"],"sourcesContent":["// Number, time and color helpers shared by the order book widgets.\n\nimport type { ChartTheme } from \"../theme\";\nimport type { Rgba } from \"../color\";\nimport {\n compactUnits,\n numberFormat as intlNumberFormat,\n resolveLocale,\n} from \"../locale\";\nimport type { OrderBookCommonOptions } from \"./types\";\n\n/** Cached `Intl.NumberFormat` with fixed decimals (page language when `locale` is omitted) */\nexport const numberFormat = (\n locale: string | undefined,\n decimals: number,\n): Intl.NumberFormat => {\n const d = Math.max(0, Math.min(12, Math.round(decimals)));\n return intlNumberFormat(resolveLocale(locale), {\n minimumFractionDigits: d,\n maximumFractionDigits: d,\n });\n};\n\n/**\n * Compact number in the units of the language (12.4k, 1.25 M, 3.2万, 1.5億),\n * with the locale's decimal separator\n */\nexport const formatCompactNumber = (\n value: number,\n locale?: string,\n maxDecimals = 2,\n): string => {\n if (!Number.isFinite(value)) return \"–\";\n const resolved = resolveLocale(locale);\n const abs = Math.abs(value);\n for (const [unit, suffix] of compactUnits(resolved)) {\n if (abs >= unit)\n return (\n intlNumberFormat(resolved, {\n maximumFractionDigits: maxDecimals,\n }).format(value / unit) + suffix\n );\n }\n return intlNumberFormat(resolved, {\n maximumFractionDigits: abs >= 100 ? 0 : abs >= 1 ? 2 : 4,\n }).format(value);\n};\n\n/** Signed percentage of a fraction (`+0.125%`), in the locale */\nexport const formatPercent = (\n fraction: number,\n locale?: string,\n decimals = 2,\n signed = true,\n): string => {\n if (!Number.isFinite(fraction)) return \"–\";\n const d = Math.max(0, Math.min(6, Math.round(decimals)));\n return intlNumberFormat(resolveLocale(locale), {\n style: \"percent\",\n minimumFractionDigits: d,\n maximumFractionDigits: d,\n signDisplay: signed ? \"exceptZero\" : \"auto\",\n }).format(fraction);\n};\n\nexport interface Formatters {\n price: (value: number) => string;\n size: (value: number) => string;\n /** Large totals: compact (12.4k, 124万) above a million */\n total: (value: number) => string;\n /** Notional values: compact above ten thousand */\n notional: (value: number) => string;\n /** Axis values: always compact when large */\n compact: (value: number) => string;\n /** Fixed decimals in the locale (basis points, shares) */\n fixed: (value: number, decimals: number) => string;\n /** Percentage of a fraction (signed by default) */\n percent: (fraction: number, decimals?: number, signed?: boolean) => string;\n /** Resolved locale (`locale` option or page language) */\n locale: string;\n priceDecimals: number;\n sizeDecimals: number;\n}\n\n/** Formatters of the options, with inferred decimals as fallbacks */\nexport const createFormatters = (\n options: OrderBookCommonOptions,\n inferredPrice: number,\n inferredSize: number,\n): Formatters => {\n const locale = resolveLocale(options.locale);\n const priceDecimals = options.pricePrecision ?? inferredPrice;\n const sizeDecimals = options.sizePrecision ?? inferredSize;\n const priceFormat = numberFormat(locale, priceDecimals);\n const sizeFormat = numberFormat(locale, sizeDecimals);\n const finite =\n (fn: (value: number) => string) =>\n (value: number): string =>\n Number.isFinite(value) ? fn(value) : \"–\";\n const size = finite(options.formatSize ?? ((v) => sizeFormat.format(v)));\n const compact = (v: number) => formatCompactNumber(v, locale, 2);\n return {\n price: finite(options.formatPrice ?? ((v) => priceFormat.format(v))),\n size,\n total: finite((v) => (Math.abs(v) >= 1e6 ? compact(v) : size(v))),\n notional: finite((v) =>\n Math.abs(v) >= 1e4 ? compact(v) : numberFormat(locale, 2).format(v),\n ),\n compact: finite(compact),\n fixed: (v, decimals) =>\n Number.isFinite(v) ? numberFormat(locale, decimals).format(v) : \"–\",\n percent: (fraction, decimals = 2, signed = true) =>\n formatPercent(fraction, locale, decimals, signed),\n locale,\n priceDecimals,\n sizeDecimals,\n };\n};\n\nconst pad = (value: number, length = 2) => String(value).padStart(length, \"0\");\n\n/** `HH:MM:SS` or `HH:MM:SS.mmm`, local time */\nexport const formatClock = (time: number, milliseconds = true): string => {\n const d = new Date(time);\n if (Number.isNaN(d.getTime())) return \"–\";\n const base = `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;\n return milliseconds ? `${base}.${pad(d.getMilliseconds(), 3)}` : base;\n};\n\nexport const DEFAULT_UP = \"var(--success-color, #16a34a)\";\nexport const DEFAULT_DOWN = \"var(--danger-color, #dc2626)\";\nconst UP_FALLBACK: Rgba = [0.09, 0.64, 0.29, 1];\nconst DOWN_FALLBACK: Rgba = [0.86, 0.15, 0.15, 1];\n\n/** Colors of the bids / buys (`up`) and asks / sells (`down`) */\nexport const sideColors = (\n theme: ChartTheme,\n options: OrderBookCommonOptions,\n): { up: Rgba; down: Rgba } => {\n const resolve = (value: string, fallback: Rgba) =>\n theme.resolve ? theme.resolve(value, fallback) : fallback;\n const redUp = options.colorConvention === \"red-up\";\n return {\n up: resolve(\n options.upColor ?? (redUp ? DEFAULT_DOWN : DEFAULT_UP),\n redUp ? DOWN_FALLBACK : UP_FALLBACK,\n ),\n down: resolve(\n options.downColor ?? (redUp ? DEFAULT_UP : DEFAULT_DOWN),\n redUp ? UP_FALLBACK : DOWN_FALLBACK,\n ),\n };\n};\n\n/** Canvas font of the options */\nexport const fontOf = (\n theme: ChartTheme,\n options: OrderBookCommonOptions,\n weight: number | string = 400,\n size?: number,\n): string =>\n `${weight} ${size ?? options.fontSize ?? 12}px ${options.fontFamily ?? theme.fontFamily}`;\n\n/** Exponential smoothing factor for a frame of `dt` ms */\nexport const ease = (dt: number, tau: number): number =>\n tau <= 0 ? 1 : 1 - Math.exp(-Math.max(0, dt) / tau);\n\nexport const clamp = (value: number, min: number, max: number): number =>\n value < min ? min : value > max ? max : value;\n\n/** Rounded rectangle path (`roundRect` is missing in older browsers) */\nexport const roundRect = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n) => {\n const radius = Math.max(0, Math.min(r, w / 2, h / 2));\n ctx.beginPath();\n ctx.moveTo(x + radius, y);\n ctx.arcTo(x + w, y, x + w, y + h, radius);\n ctx.arcTo(x + w, y + h, x, y + h, radius);\n ctx.arcTo(x, y + h, x, y, radius);\n ctx.arcTo(x, y, x + w, y, radius);\n ctx.closePath();\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"format.cjs","names":["intlNumberFormat","resolveLocale","compactUnits","require_locale","numberFormat","d","decimals","locale","formatCompactNumber","value","resolved","abs","unit","suffix","maxDecimals","formatPercent","fraction","signed","createFormatters","options","priceDecimals","inferredPrice","sizeDecimals","inferredSize","priceFormat","sizeFormat","finite","fn","size","v","compact","pad","length","formatClock","time","utc","timeZone","base","milliseconds","DEFAULT_UP","DEFAULT_DOWN","UP_FALLBACK","DOWN_FALLBACK","sideColors","resolve","theme","fallback","redUp","fontOf","weight","ease","tau","dt","clamp","min","max","roundRect","radius","r","w","h","ctx","x","y"],"sources":["../../../../../charts/src/engine/orderbook/format.ts"],"sourcesContent":["// Number, time and color helpers shared by the order book widgets.\n\nimport type { ChartTheme } from \"../theme\";\nimport type { Rgba } from \"../color\";\nimport type { ChartTimeZone } from \"../types\";\nimport {\n compactUnits,\n numberFormat as intlNumberFormat,\n resolveLocale,\n} from \"../locale\";\nimport type { OrderBookCommonOptions } from \"./types\";\n\n/** Cached `Intl.NumberFormat` with fixed decimals (page language when `locale` is omitted) */\nexport const numberFormat = (\n locale: string | undefined,\n decimals: number,\n): Intl.NumberFormat => {\n const d = Math.max(0, Math.min(12, Math.round(decimals)));\n return intlNumberFormat(resolveLocale(locale), {\n minimumFractionDigits: d,\n maximumFractionDigits: d,\n });\n};\n\n/**\n * Compact number in the units of the language (12.4k, 1.25 M, 3.2万, 1.5億),\n * with the locale's decimal separator\n */\nexport const formatCompactNumber = (\n value: number,\n locale?: string,\n maxDecimals = 2,\n): string => {\n if (!Number.isFinite(value)) return \"–\";\n const resolved = resolveLocale(locale);\n const abs = Math.abs(value);\n for (const [unit, suffix] of compactUnits(resolved)) {\n if (abs >= unit)\n return (\n intlNumberFormat(resolved, {\n maximumFractionDigits: maxDecimals,\n }).format(value / unit) + suffix\n );\n }\n return intlNumberFormat(resolved, {\n maximumFractionDigits: abs >= 100 ? 0 : abs >= 1 ? 2 : 4,\n }).format(value);\n};\n\n/** Signed percentage of a fraction (`+0.125%`), in the locale */\nexport const formatPercent = (\n fraction: number,\n locale?: string,\n decimals = 2,\n signed = true,\n): string => {\n if (!Number.isFinite(fraction)) return \"–\";\n const d = Math.max(0, Math.min(6, Math.round(decimals)));\n return intlNumberFormat(resolveLocale(locale), {\n style: \"percent\",\n minimumFractionDigits: d,\n maximumFractionDigits: d,\n signDisplay: signed ? \"exceptZero\" : \"auto\",\n }).format(fraction);\n};\n\nexport interface Formatters {\n price: (value: number) => string;\n size: (value: number) => string;\n /** Large totals: compact (12.4k, 124万) above a million */\n total: (value: number) => string;\n /** Notional values: compact above ten thousand */\n notional: (value: number) => string;\n /** Axis values: always compact when large */\n compact: (value: number) => string;\n /** Fixed decimals in the locale (basis points, shares) */\n fixed: (value: number, decimals: number) => string;\n /** Percentage of a fraction (signed by default) */\n percent: (fraction: number, decimals?: number, signed?: boolean) => string;\n /** Resolved locale (`locale` option or page language) */\n locale: string;\n priceDecimals: number;\n sizeDecimals: number;\n}\n\n/** Formatters of the options, with inferred decimals as fallbacks */\nexport const createFormatters = (\n options: OrderBookCommonOptions,\n inferredPrice: number,\n inferredSize: number,\n): Formatters => {\n const locale = resolveLocale(options.locale);\n const priceDecimals = options.pricePrecision ?? inferredPrice;\n const sizeDecimals = options.sizePrecision ?? inferredSize;\n const priceFormat = numberFormat(locale, priceDecimals);\n const sizeFormat = numberFormat(locale, sizeDecimals);\n const finite =\n (fn: (value: number) => string) =>\n (value: number): string =>\n Number.isFinite(value) ? fn(value) : \"–\";\n const size = finite(options.formatSize ?? ((v) => sizeFormat.format(v)));\n const compact = (v: number) => formatCompactNumber(v, locale, 2);\n return {\n price: finite(options.formatPrice ?? ((v) => priceFormat.format(v))),\n size,\n total: finite((v) => (Math.abs(v) >= 1e6 ? compact(v) : size(v))),\n notional: finite((v) =>\n Math.abs(v) >= 1e4 ? compact(v) : numberFormat(locale, 2).format(v),\n ),\n compact: finite(compact),\n fixed: (v, decimals) =>\n Number.isFinite(v) ? numberFormat(locale, decimals).format(v) : \"–\",\n percent: (fraction, decimals = 2, signed = true) =>\n formatPercent(fraction, locale, decimals, signed),\n locale,\n priceDecimals,\n sizeDecimals,\n };\n};\n\nconst pad = (value: number, length = 2) => String(value).padStart(length, \"0\");\n\n/** `HH:MM:SS` or `HH:MM:SS.mmm`, in the local time or UTC */\nexport const formatClock = (\n time: number,\n milliseconds = true,\n timeZone: ChartTimeZone = \"local\",\n): string => {\n const d = new Date(time);\n if (Number.isNaN(d.getTime())) return \"–\";\n const utc = timeZone === \"utc\";\n const base = utc\n ? `${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}:${pad(d.getUTCSeconds())}`\n : `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;\n return milliseconds\n ? `${base}.${pad(utc ? d.getUTCMilliseconds() : d.getMilliseconds(), 3)}`\n : base;\n};\n\nexport const DEFAULT_UP = \"var(--success-color, #16a34a)\";\nexport const DEFAULT_DOWN = \"var(--danger-color, #dc2626)\";\nconst UP_FALLBACK: Rgba = [0.09, 0.64, 0.29, 1];\nconst DOWN_FALLBACK: Rgba = [0.86, 0.15, 0.15, 1];\n\n/** Colors of the bids / buys (`up`) and asks / sells (`down`) */\nexport const sideColors = (\n theme: ChartTheme,\n options: OrderBookCommonOptions,\n): { up: Rgba; down: Rgba } => {\n const resolve = (value: string, fallback: Rgba) =>\n theme.resolve ? theme.resolve(value, fallback) : fallback;\n const redUp = options.colorConvention === \"red-up\";\n return {\n up: resolve(\n options.upColor ?? (redUp ? DEFAULT_DOWN : DEFAULT_UP),\n redUp ? DOWN_FALLBACK : UP_FALLBACK,\n ),\n down: resolve(\n options.downColor ?? (redUp ? DEFAULT_UP : DEFAULT_DOWN),\n redUp ? UP_FALLBACK : DOWN_FALLBACK,\n ),\n };\n};\n\n/** Canvas font of the options */\nexport const fontOf = (\n theme: ChartTheme,\n options: OrderBookCommonOptions,\n weight: number | string = 400,\n size?: number,\n): string =>\n `${weight} ${size ?? options.fontSize ?? 12}px ${options.fontFamily ?? theme.fontFamily}`;\n\n/** Exponential smoothing factor for a frame of `dt` ms */\nexport const ease = (dt: number, tau: number): number =>\n tau <= 0 ? 1 : 1 - Math.exp(-Math.max(0, dt) / tau);\n\nexport const clamp = (value: number, min: number, max: number): number =>\n value < min ? min : value > max ? max : value;\n\n/** Rounded rectangle path (`roundRect` is missing in older browsers) */\nexport const roundRect = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n) => {\n const radius = Math.max(0, Math.min(r, w / 2, h / 2));\n ctx.beginPath();\n ctx.moveTo(x + radius, y);\n ctx.arcTo(x + w, y, x + w, y + h, radius);\n ctx.arcTo(x + w, y + h, x, y + h, radius);\n ctx.arcTo(x, y + h, x, y, radius);\n ctx.arcTo(x, y, x + w, y, radius);\n ctx.closePath();\n};\n"],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ChartTheme } from '../theme.cjs';
|
|
2
2
|
import { Rgba } from '../color.cjs';
|
|
3
|
+
import { ChartTimeZone } from '../types.cjs';
|
|
3
4
|
import { OrderBookCommonOptions } from './types.cjs';
|
|
4
5
|
/** Cached `Intl.NumberFormat` with fixed decimals (page language when `locale` is omitted) */
|
|
5
6
|
export declare const numberFormat: (locale: string | undefined, decimals: number) => Intl.NumberFormat;
|
|
@@ -30,8 +31,8 @@ export interface Formatters {
|
|
|
30
31
|
}
|
|
31
32
|
/** Formatters of the options, with inferred decimals as fallbacks */
|
|
32
33
|
export declare const createFormatters: (options: OrderBookCommonOptions, inferredPrice: number, inferredSize: number) => Formatters;
|
|
33
|
-
/** `HH:MM:SS` or `HH:MM:SS.mmm`, local time */
|
|
34
|
-
export declare const formatClock: (time: number, milliseconds?: boolean) => string;
|
|
34
|
+
/** `HH:MM:SS` or `HH:MM:SS.mmm`, in the local time or UTC */
|
|
35
|
+
export declare const formatClock: (time: number, milliseconds?: boolean, timeZone?: ChartTimeZone) => string;
|
|
35
36
|
export declare const DEFAULT_UP = "var(--success-color, #16a34a)";
|
|
36
37
|
export declare const DEFAULT_DOWN = "var(--danger-color, #dc2626)";
|
|
37
38
|
/** Colors of the bids / buys (`up`) and asks / sells (`down`) */
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ChartTheme } from '../theme.js';
|
|
2
2
|
import { Rgba } from '../color.js';
|
|
3
|
+
import { ChartTimeZone } from '../types.js';
|
|
3
4
|
import { OrderBookCommonOptions } from './types.js';
|
|
4
5
|
/** Cached `Intl.NumberFormat` with fixed decimals (page language when `locale` is omitted) */
|
|
5
6
|
export declare const numberFormat: (locale: string | undefined, decimals: number) => Intl.NumberFormat;
|
|
@@ -30,8 +31,8 @@ export interface Formatters {
|
|
|
30
31
|
}
|
|
31
32
|
/** Formatters of the options, with inferred decimals as fallbacks */
|
|
32
33
|
export declare const createFormatters: (options: OrderBookCommonOptions, inferredPrice: number, inferredSize: number) => Formatters;
|
|
33
|
-
/** `HH:MM:SS` or `HH:MM:SS.mmm`, local time */
|
|
34
|
-
export declare const formatClock: (time: number, milliseconds?: boolean) => string;
|
|
34
|
+
/** `HH:MM:SS` or `HH:MM:SS.mmm`, in the local time or UTC */
|
|
35
|
+
export declare const formatClock: (time: number, milliseconds?: boolean, timeZone?: ChartTimeZone) => string;
|
|
35
36
|
export declare const DEFAULT_UP = "var(--success-color, #16a34a)";
|
|
36
37
|
export declare const DEFAULT_DOWN = "var(--danger-color, #dc2626)";
|
|
37
38
|
/** Colors of the bids / buys (`up`) and asks / sells (`down`) */
|
|
@@ -34,11 +34,11 @@ var r = (e, r) => {
|
|
|
34
34
|
priceDecimals: c,
|
|
35
35
|
sizeDecimals: l
|
|
36
36
|
};
|
|
37
|
-
}, s = (e, t = 2) => String(e).padStart(t, "0"), c = (e, t = !0) => {
|
|
38
|
-
let
|
|
39
|
-
if (Number.isNaN(
|
|
40
|
-
let
|
|
41
|
-
return t ? `${
|
|
37
|
+
}, s = (e, t = 2) => String(e).padStart(t, "0"), c = (e, t = !0, n = "local") => {
|
|
38
|
+
let r = new Date(e);
|
|
39
|
+
if (Number.isNaN(r.getTime())) return "–";
|
|
40
|
+
let i = n === "utc", a = i ? `${s(r.getUTCHours())}:${s(r.getUTCMinutes())}:${s(r.getUTCSeconds())}` : `${s(r.getHours())}:${s(r.getMinutes())}:${s(r.getSeconds())}`;
|
|
41
|
+
return t ? `${a}.${s(i ? r.getUTCMilliseconds() : r.getMilliseconds(), 3)}` : a;
|
|
42
42
|
}, l = "var(--success-color, #16a34a)", u = "var(--danger-color, #dc2626)", d = [
|
|
43
43
|
.09,
|
|
44
44
|
.64,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","names":["intlNumberFormat","numberFormat$1","numberFormat","d","decimals","resolveLocale","locale","formatCompactNumber","value","resolved","abs","unit","suffix","compactUnits","maxDecimals","formatPercent","fraction","signed","createFormatters","options","priceDecimals","inferredPrice","sizeDecimals","inferredSize","priceFormat","sizeFormat","finite","fn","size","v","compact","pad","length","formatClock","time","base","milliseconds","DEFAULT_UP","DEFAULT_DOWN","UP_FALLBACK","DOWN_FALLBACK","sideColors","resolve","theme","fallback","redUp","fontOf","weight","ease","tau","dt","clamp","min","max","roundRect","radius","r","w","h","ctx","x","y"],"sources":["../../../../../charts/src/engine/orderbook/format.ts"],"sourcesContent":["// Number, time and color helpers shared by the order book widgets.\n\nimport type { ChartTheme } from \"../theme\";\nimport type { Rgba } from \"../color\";\nimport {\n compactUnits,\n numberFormat as intlNumberFormat,\n resolveLocale,\n} from \"../locale\";\nimport type { OrderBookCommonOptions } from \"./types\";\n\n/** Cached `Intl.NumberFormat` with fixed decimals (page language when `locale` is omitted) */\nexport const numberFormat = (\n locale: string | undefined,\n decimals: number,\n): Intl.NumberFormat => {\n const d = Math.max(0, Math.min(12, Math.round(decimals)));\n return intlNumberFormat(resolveLocale(locale), {\n minimumFractionDigits: d,\n maximumFractionDigits: d,\n });\n};\n\n/**\n * Compact number in the units of the language (12.4k, 1.25 M, 3.2万, 1.5億),\n * with the locale's decimal separator\n */\nexport const formatCompactNumber = (\n value: number,\n locale?: string,\n maxDecimals = 2,\n): string => {\n if (!Number.isFinite(value)) return \"–\";\n const resolved = resolveLocale(locale);\n const abs = Math.abs(value);\n for (const [unit, suffix] of compactUnits(resolved)) {\n if (abs >= unit)\n return (\n intlNumberFormat(resolved, {\n maximumFractionDigits: maxDecimals,\n }).format(value / unit) + suffix\n );\n }\n return intlNumberFormat(resolved, {\n maximumFractionDigits: abs >= 100 ? 0 : abs >= 1 ? 2 : 4,\n }).format(value);\n};\n\n/** Signed percentage of a fraction (`+0.125%`), in the locale */\nexport const formatPercent = (\n fraction: number,\n locale?: string,\n decimals = 2,\n signed = true,\n): string => {\n if (!Number.isFinite(fraction)) return \"–\";\n const d = Math.max(0, Math.min(6, Math.round(decimals)));\n return intlNumberFormat(resolveLocale(locale), {\n style: \"percent\",\n minimumFractionDigits: d,\n maximumFractionDigits: d,\n signDisplay: signed ? \"exceptZero\" : \"auto\",\n }).format(fraction);\n};\n\nexport interface Formatters {\n price: (value: number) => string;\n size: (value: number) => string;\n /** Large totals: compact (12.4k, 124万) above a million */\n total: (value: number) => string;\n /** Notional values: compact above ten thousand */\n notional: (value: number) => string;\n /** Axis values: always compact when large */\n compact: (value: number) => string;\n /** Fixed decimals in the locale (basis points, shares) */\n fixed: (value: number, decimals: number) => string;\n /** Percentage of a fraction (signed by default) */\n percent: (fraction: number, decimals?: number, signed?: boolean) => string;\n /** Resolved locale (`locale` option or page language) */\n locale: string;\n priceDecimals: number;\n sizeDecimals: number;\n}\n\n/** Formatters of the options, with inferred decimals as fallbacks */\nexport const createFormatters = (\n options: OrderBookCommonOptions,\n inferredPrice: number,\n inferredSize: number,\n): Formatters => {\n const locale = resolveLocale(options.locale);\n const priceDecimals = options.pricePrecision ?? inferredPrice;\n const sizeDecimals = options.sizePrecision ?? inferredSize;\n const priceFormat = numberFormat(locale, priceDecimals);\n const sizeFormat = numberFormat(locale, sizeDecimals);\n const finite =\n (fn: (value: number) => string) =>\n (value: number): string =>\n Number.isFinite(value) ? fn(value) : \"–\";\n const size = finite(options.formatSize ?? ((v) => sizeFormat.format(v)));\n const compact = (v: number) => formatCompactNumber(v, locale, 2);\n return {\n price: finite(options.formatPrice ?? ((v) => priceFormat.format(v))),\n size,\n total: finite((v) => (Math.abs(v) >= 1e6 ? compact(v) : size(v))),\n notional: finite((v) =>\n Math.abs(v) >= 1e4 ? compact(v) : numberFormat(locale, 2).format(v),\n ),\n compact: finite(compact),\n fixed: (v, decimals) =>\n Number.isFinite(v) ? numberFormat(locale, decimals).format(v) : \"–\",\n percent: (fraction, decimals = 2, signed = true) =>\n formatPercent(fraction, locale, decimals, signed),\n locale,\n priceDecimals,\n sizeDecimals,\n };\n};\n\nconst pad = (value: number, length = 2) => String(value).padStart(length, \"0\");\n\n/** `HH:MM:SS` or `HH:MM:SS.mmm`, local time */\nexport const formatClock = (time: number, milliseconds = true): string => {\n const d = new Date(time);\n if (Number.isNaN(d.getTime())) return \"–\";\n const base = `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;\n return milliseconds ? `${base}.${pad(d.getMilliseconds(), 3)}` : base;\n};\n\nexport const DEFAULT_UP = \"var(--success-color, #16a34a)\";\nexport const DEFAULT_DOWN = \"var(--danger-color, #dc2626)\";\nconst UP_FALLBACK: Rgba = [0.09, 0.64, 0.29, 1];\nconst DOWN_FALLBACK: Rgba = [0.86, 0.15, 0.15, 1];\n\n/** Colors of the bids / buys (`up`) and asks / sells (`down`) */\nexport const sideColors = (\n theme: ChartTheme,\n options: OrderBookCommonOptions,\n): { up: Rgba; down: Rgba } => {\n const resolve = (value: string, fallback: Rgba) =>\n theme.resolve ? theme.resolve(value, fallback) : fallback;\n const redUp = options.colorConvention === \"red-up\";\n return {\n up: resolve(\n options.upColor ?? (redUp ? DEFAULT_DOWN : DEFAULT_UP),\n redUp ? DOWN_FALLBACK : UP_FALLBACK,\n ),\n down: resolve(\n options.downColor ?? (redUp ? DEFAULT_UP : DEFAULT_DOWN),\n redUp ? UP_FALLBACK : DOWN_FALLBACK,\n ),\n };\n};\n\n/** Canvas font of the options */\nexport const fontOf = (\n theme: ChartTheme,\n options: OrderBookCommonOptions,\n weight: number | string = 400,\n size?: number,\n): string =>\n `${weight} ${size ?? options.fontSize ?? 12}px ${options.fontFamily ?? theme.fontFamily}`;\n\n/** Exponential smoothing factor for a frame of `dt` ms */\nexport const ease = (dt: number, tau: number): number =>\n tau <= 0 ? 1 : 1 - Math.exp(-Math.max(0, dt) / tau);\n\nexport const clamp = (value: number, min: number, max: number): number =>\n value < min ? min : value > max ? max : value;\n\n/** Rounded rectangle path (`roundRect` is missing in older browsers) */\nexport const roundRect = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n) => {\n const radius = Math.max(0, Math.min(r, w / 2, h / 2));\n ctx.beginPath();\n ctx.moveTo(x + radius, y);\n ctx.arcTo(x + w, y, x + w, y + h, radius);\n ctx.arcTo(x + w, y + h, x, y + h, radius);\n ctx.arcTo(x, y + h, x, y, radius);\n ctx.arcTo(x, y, x + w, y, radius);\n ctx.closePath();\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"format.js","names":["intlNumberFormat","numberFormat$1","numberFormat","d","decimals","resolveLocale","locale","formatCompactNumber","value","resolved","abs","unit","suffix","compactUnits","maxDecimals","formatPercent","fraction","signed","createFormatters","options","priceDecimals","inferredPrice","sizeDecimals","inferredSize","priceFormat","sizeFormat","finite","fn","size","v","compact","pad","length","formatClock","time","utc","timeZone","base","milliseconds","DEFAULT_UP","DEFAULT_DOWN","UP_FALLBACK","DOWN_FALLBACK","sideColors","resolve","theme","fallback","redUp","fontOf","weight","ease","tau","dt","clamp","min","max","roundRect","radius","r","w","h","ctx","x","y"],"sources":["../../../../../charts/src/engine/orderbook/format.ts"],"sourcesContent":["// Number, time and color helpers shared by the order book widgets.\n\nimport type { ChartTheme } from \"../theme\";\nimport type { Rgba } from \"../color\";\nimport type { ChartTimeZone } from \"../types\";\nimport {\n compactUnits,\n numberFormat as intlNumberFormat,\n resolveLocale,\n} from \"../locale\";\nimport type { OrderBookCommonOptions } from \"./types\";\n\n/** Cached `Intl.NumberFormat` with fixed decimals (page language when `locale` is omitted) */\nexport const numberFormat = (\n locale: string | undefined,\n decimals: number,\n): Intl.NumberFormat => {\n const d = Math.max(0, Math.min(12, Math.round(decimals)));\n return intlNumberFormat(resolveLocale(locale), {\n minimumFractionDigits: d,\n maximumFractionDigits: d,\n });\n};\n\n/**\n * Compact number in the units of the language (12.4k, 1.25 M, 3.2万, 1.5億),\n * with the locale's decimal separator\n */\nexport const formatCompactNumber = (\n value: number,\n locale?: string,\n maxDecimals = 2,\n): string => {\n if (!Number.isFinite(value)) return \"–\";\n const resolved = resolveLocale(locale);\n const abs = Math.abs(value);\n for (const [unit, suffix] of compactUnits(resolved)) {\n if (abs >= unit)\n return (\n intlNumberFormat(resolved, {\n maximumFractionDigits: maxDecimals,\n }).format(value / unit) + suffix\n );\n }\n return intlNumberFormat(resolved, {\n maximumFractionDigits: abs >= 100 ? 0 : abs >= 1 ? 2 : 4,\n }).format(value);\n};\n\n/** Signed percentage of a fraction (`+0.125%`), in the locale */\nexport const formatPercent = (\n fraction: number,\n locale?: string,\n decimals = 2,\n signed = true,\n): string => {\n if (!Number.isFinite(fraction)) return \"–\";\n const d = Math.max(0, Math.min(6, Math.round(decimals)));\n return intlNumberFormat(resolveLocale(locale), {\n style: \"percent\",\n minimumFractionDigits: d,\n maximumFractionDigits: d,\n signDisplay: signed ? \"exceptZero\" : \"auto\",\n }).format(fraction);\n};\n\nexport interface Formatters {\n price: (value: number) => string;\n size: (value: number) => string;\n /** Large totals: compact (12.4k, 124万) above a million */\n total: (value: number) => string;\n /** Notional values: compact above ten thousand */\n notional: (value: number) => string;\n /** Axis values: always compact when large */\n compact: (value: number) => string;\n /** Fixed decimals in the locale (basis points, shares) */\n fixed: (value: number, decimals: number) => string;\n /** Percentage of a fraction (signed by default) */\n percent: (fraction: number, decimals?: number, signed?: boolean) => string;\n /** Resolved locale (`locale` option or page language) */\n locale: string;\n priceDecimals: number;\n sizeDecimals: number;\n}\n\n/** Formatters of the options, with inferred decimals as fallbacks */\nexport const createFormatters = (\n options: OrderBookCommonOptions,\n inferredPrice: number,\n inferredSize: number,\n): Formatters => {\n const locale = resolveLocale(options.locale);\n const priceDecimals = options.pricePrecision ?? inferredPrice;\n const sizeDecimals = options.sizePrecision ?? inferredSize;\n const priceFormat = numberFormat(locale, priceDecimals);\n const sizeFormat = numberFormat(locale, sizeDecimals);\n const finite =\n (fn: (value: number) => string) =>\n (value: number): string =>\n Number.isFinite(value) ? fn(value) : \"–\";\n const size = finite(options.formatSize ?? ((v) => sizeFormat.format(v)));\n const compact = (v: number) => formatCompactNumber(v, locale, 2);\n return {\n price: finite(options.formatPrice ?? ((v) => priceFormat.format(v))),\n size,\n total: finite((v) => (Math.abs(v) >= 1e6 ? compact(v) : size(v))),\n notional: finite((v) =>\n Math.abs(v) >= 1e4 ? compact(v) : numberFormat(locale, 2).format(v),\n ),\n compact: finite(compact),\n fixed: (v, decimals) =>\n Number.isFinite(v) ? numberFormat(locale, decimals).format(v) : \"–\",\n percent: (fraction, decimals = 2, signed = true) =>\n formatPercent(fraction, locale, decimals, signed),\n locale,\n priceDecimals,\n sizeDecimals,\n };\n};\n\nconst pad = (value: number, length = 2) => String(value).padStart(length, \"0\");\n\n/** `HH:MM:SS` or `HH:MM:SS.mmm`, in the local time or UTC */\nexport const formatClock = (\n time: number,\n milliseconds = true,\n timeZone: ChartTimeZone = \"local\",\n): string => {\n const d = new Date(time);\n if (Number.isNaN(d.getTime())) return \"–\";\n const utc = timeZone === \"utc\";\n const base = utc\n ? `${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}:${pad(d.getUTCSeconds())}`\n : `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;\n return milliseconds\n ? `${base}.${pad(utc ? d.getUTCMilliseconds() : d.getMilliseconds(), 3)}`\n : base;\n};\n\nexport const DEFAULT_UP = \"var(--success-color, #16a34a)\";\nexport const DEFAULT_DOWN = \"var(--danger-color, #dc2626)\";\nconst UP_FALLBACK: Rgba = [0.09, 0.64, 0.29, 1];\nconst DOWN_FALLBACK: Rgba = [0.86, 0.15, 0.15, 1];\n\n/** Colors of the bids / buys (`up`) and asks / sells (`down`) */\nexport const sideColors = (\n theme: ChartTheme,\n options: OrderBookCommonOptions,\n): { up: Rgba; down: Rgba } => {\n const resolve = (value: string, fallback: Rgba) =>\n theme.resolve ? theme.resolve(value, fallback) : fallback;\n const redUp = options.colorConvention === \"red-up\";\n return {\n up: resolve(\n options.upColor ?? (redUp ? DEFAULT_DOWN : DEFAULT_UP),\n redUp ? DOWN_FALLBACK : UP_FALLBACK,\n ),\n down: resolve(\n options.downColor ?? (redUp ? DEFAULT_UP : DEFAULT_DOWN),\n redUp ? UP_FALLBACK : DOWN_FALLBACK,\n ),\n };\n};\n\n/** Canvas font of the options */\nexport const fontOf = (\n theme: ChartTheme,\n options: OrderBookCommonOptions,\n weight: number | string = 400,\n size?: number,\n): string =>\n `${weight} ${size ?? options.fontSize ?? 12}px ${options.fontFamily ?? theme.fontFamily}`;\n\n/** Exponential smoothing factor for a frame of `dt` ms */\nexport const ease = (dt: number, tau: number): number =>\n tau <= 0 ? 1 : 1 - Math.exp(-Math.max(0, dt) / tau);\n\nexport const clamp = (value: number, min: number, max: number): number =>\n value < min ? min : value > max ? max : value;\n\n/** Rounded rectangle path (`roundRect` is missing in older browsers) */\nexport const roundRect = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n) => {\n const radius = Math.max(0, Math.min(r, w / 2, h / 2));\n ctx.beginPath();\n ctx.moveTo(x + radius, y);\n ctx.arcTo(x + w, y, x + w, y + h, radius);\n ctx.arcTo(x + w, y + h, x, y + h, radius);\n ctx.arcTo(x, y + h, x, y, radius);\n ctx.arcTo(x, y, x + w, y, radius);\n ctx.closePath();\n};\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../color.cjs"),t=require("../renderers/types.cjs"),n=require("../locale.cjs"),r=require("../scale.cjs"),i=require("../renderers/detect.cjs"),a=require("../time.cjs"),o=require("./book.cjs"),s=require("./format.cjs"),c=require("./host.cjs");var l=32,u=128,d=[`#0b2a4f`,`#12508f`,`#1c7fd0`,`#25b3d6`,`#4fd6a0`,`#e9e35a`,`#ffa23d`,`#ff5533`],f=[`#dbeafe`,`#93c5fd`,`#3b82f6`,`#4338ca`,`#9333ea`,`#db2777`,`#f97316`],p={en:{time:`Time`,price:`Price`,liquidity:`Liquidity`,buys:`Buys`,sells:`Sells`,bid:`Bid`,ask:`Ask`,name:`Liquidity heatmap`},zh:{time:`时间`,price:`价格`,liquidity:`挂单量`,buys:`主动买入`,sells:`主动卖出`,bid:`买一`,ask:`卖一`,name:`订单簿热力图`},ja:{time:`時刻`,price:`価格`,liquidity:`指値量`,buys:`買い約定`,sells:`売り約定`,bid:`最良買気配`,ask:`最良売気配`,name:`板ヒートマップ`},fr:{time:`Heure`,price:`Prix`,liquidity:`Liquidité`,buys:`Achats`,sells:`Ventes`,bid:`Meilleur achat`,ask:`Meilleure vente`,name:`Carte de chaleur de la liquidité`}},m=(e,t,n,r)=>{if(!(e>0)||!(t>0))return 0;let i=Math.min(1,e*r/t);switch(n){case`linear`:return i;case`sqrt`:return Math.sqrt(i);default:return Math.log10(1+9*i)}},ee=(ee,h={})=>{let g=h,_=o.createOrderBookStore(),v=c.createEmitter(),y=s.createFormatters(g,2,4),b={up:[0,0,0,1],down:[0,0,0,1]},te=new Uint32Array(u),x=0,S=[],ne=0,C=NaN,w={buyVolume:0,buyNotional:0,sellVolume:0,sellNotional:0},T=null,E=NaN,D=0,O=0,k=0,A=new Map,j=new Set,M=0,N=null,P=-1,F={x:NaN,y:NaN},I=null,L=0,R=!1,z=()=>{},re=new Promise(e=>{z=e}),B=!0,V=NaN,H=[0,1],U=[0,1],W=NaN,G=NaN,K=!1,ie=0,q={x:0,y:0,w:0,h:0},J=null,ae=``,Y=null,X=c.createHost(ee,{className:`minerva-orderbook-heatmap`,draw:je,onTheme:()=>{me(),ge()}}),{root:Z,doc:oe}=X;Z.tabIndex=0,Z.setAttribute(`role`,`figure`),Z.style.touchAction=`none`;let se=n.localeLabels(p,g.locale,g.labels),ce=()=>se,le=()=>{se=n.localeLabels(p,g.locale,g.labels),Z.setAttribute(`aria-label`,g.ariaLabel??se.name)},Q=()=>Math.max(10,g.interval??100),ue=()=>Math.max(Q()*4,g.history??3e5),de=()=>Math.max(4,Math.round(g.depth??160)),fe=()=>{if(!Number.isFinite(E))return Date.now();let e=pe()-D;return E+Math.min(Math.max(0,e),Q()*3)},pe=()=>typeof performance<`u`?performance.now():Date.now();function me(){let t=X.theme;b=s.sideColors(t,g);let n=e=>t.resolve?t.resolve(e,t.primary):t.primary,r=e.luminance(t.background)<.4,i=[t.background,...(g.colors?.length?g.colors:r?d:f).map(n)];te=new Uint32Array(u);for(let t=0;t<u;t++){let n=e.rampColor(i,t/127);te[t]=e.packColor([n[0],n[1],n[2],1])}}let he=()=>{y=s.createFormatters(g,x>0?Math.max(o.decimalsOf(x),o.inferPriceDecimals(_)):o.inferPriceDecimals(_),o.inferSizeDecimals(_))},ge=()=>{for(let e of A.keys())j.add(e);P=-1,X.invalidate()},_e=()=>{S=[],A.clear(),j.clear(),N=null,P=-1,C=NaN,F={x:NaN,y:NaN},O=0,k=0,w.buyVolume=w.buyNotional=w.sellVolume=w.sellNotional=0},ve=()=>{if(x>0)return;let e=o.inferTickSize(_),t=_.mid();if(g.tickSize&&g.tickSize>0)x=g.tickSize;else if(e>0&&Number.isFinite(t)){let n=t*1e-5/e,r=1;for(let e=1;e<=1e9&&r<n*.75;e*=10)for(let t of[1,2,5])if(r=t*e,r>=n*.75)break;x=o.roundToStep(e*r,e)}else x=Number.isFinite(t)?Math.max(1e-8,t*1e-5):0;x>0&&he()},ye=()=>{let e=de(),t=new Float64Array(e*2),n=new Float32Array(e*2),r=0,i=[0,0,0,0];for(let i of[`bid`,`ask`]){let a=_.count(i),o=0;for(let s=0;s<a;s++){let a=Math.round(_.priceAt(i,s)/x),c=_.sizeAt(i,s);if(r>0&&t[r-1]===a&&o>0){n[r-1]+=c;continue}if(o>=e)break;t[r]=a,n[r]=c,r++,o++}}for(let e=0;e<r;e++){let t=n[e];t>i[3]&&(i[3]=t,i.sort((e,t)=>t-e))}return{bins:t.subarray(0,r),sizes:n.subarray(0,r),reference:i[3]||i[0]}},be=e=>{if(!(x>0))return;let{bins:t,sizes:n,reference:r}=ye(),i={seq:ne++,time:e,bins:t,sizes:n,bestBid:_.bestBid(),bestAsk:_.bestAsk(),buyVolume:w.buyVolume,buyNotional:w.buyNotional,sellVolume:w.sellVolume,sellNotional:w.sellNotional,reference:r};if(w.buyVolume=w.buyNotional=w.sellVolume=w.sellNotional=0,S.push(i),j.add(Math.floor(i.seq/l)),g.maxSize===void 0){let e=S.slice(-100),t=0;for(let n of e)t+=n.reference;let n=t/e.length*1.6;if(!(O>0)||Math.abs(n/O-1)>.3){O=n;for(let e of A.keys())j.add(e);P=-1}}let a=e-ue(),o=0;for(;o<S.length&&S[o].time<a;)o++;if(o){S=S.slice(o);let e=S[0]?Math.floor(S[0].seq/l):1/0;for(let t of[...A.keys()])t<e&&A.delete(t)}},$=e=>{if(!Number.isFinite(e))return;let t=Q();if(!Number.isFinite(C)){C=Math.floor(e/t)*t;return}if(e-C>ue()){be(C),C=Math.floor(e/t)*t;return}for(;e>=C+t;)be(C),C+=t},xe=e=>e===void 0||!Number.isFinite(e)?Date.now():((!Number.isFinite(E)||e>=E)&&(E=e,D=pe()),e),Se=e=>{let t=0,n=S.length-1,r=Q();for(;t<=n;){let i=t+n>>>1,a=S[i];if(e<a.time)n=i-1;else if(e>=a.time+r)t=i+1;else return a}return null},Ce=()=>{if(Number.isFinite(F.x))return;let e=_.mid();F={x:Number.isFinite(C)?C:0,y:Number.isFinite(e)?e:0}},we=e=>{let t=m(e,g.maxSize??O,g.colorScale??`log`,Math.max(.01,g.contrast??1));return Math.round(t*127)},Te=(e,t)=>{let n=Q(),r=0;for(let e of t)for(let t=0;t<e.sizes.length;t++)we(e.sizes[t])>0&&r++;let i=new ArrayBuffer(Math.max(1,r)*16),a=new Float32Array(i),o=new Uint32Array(i),s=0,c=x/2*1.06;for(let e of t){let t=e.time+n/2-F.x;for(let n=0;n<e.sizes.length;n++){let r=we(e.sizes[n]);if(r<=0)continue;let i=e.bins[n]*x-F.y;a[s*4]=t,a[s*4+1]=i-c,a[s*4+2]=i+c,o[s*4+3]=te[r],s++}}return{kind:`bar`,key:e,version:++M,color:[1,1,1,1],instances:i,count:r,halfWidth:n/2*1.06,radius:0,inset:.01,minHalf:0,sorted:!0}},Ee=()=>{if(j.size){let e=new Map;for(let t of S){let n=Math.floor(t.seq/l);if(!j.has(n))continue;let r=e.get(n);r||e.set(n,r=[]),r.push(t)}for(let t of j){let n=e.get(t);n?A.set(t,Te(`heat:${t}`,n)):A.delete(t)}j.clear()}return[...A.values()]},De=()=>{let e=Q(),t=[],n=0,r=S.length;for(;n<r;){let t=n+r>>>1;S[t].time+e<H[0]?n=t+1:r=t}for(let e=n;e<S.length;e++){let n=S[e];if(n.time>H[1])break;t.push(n)}return t},Oe=t=>{if(g.bubbles===!1)return null;let n=Q(),r=[],i=(e,t,i,a)=>{t>0&&r.push([e+n/2,i/t,t,a])};for(let e of t)i(e.time,e.sellVolume,e.sellNotional,!1),i(e.time,e.buyVolume,e.buyNotional,!0);if(Number.isFinite(C)&&(i(C,w.sellVolume,w.sellNotional,!1),i(C,w.buyVolume,w.buyNotional,!0)),!r.length)return null;let a=0;for(let e of r)a=Math.max(a,e[2]);k=k>0?Math.max(a,k*.995):a;let o=g.bubbleVolume??k,c=Math.max(4,g.bubbleSize??28),l=new ArrayBuffer(r.length*16),u=new Float32Array(l),d=new Uint32Array(l),f=e.packColor([b.up[0],b.up[1],b.up[2],.78]),p=e.packColor([b.down[0],b.down[1],b.down[2],.78]);return r.forEach(([e,t,n,r],i)=>{u[i*4]=e-F.x,u[i*4+1]=t-F.y,u[i*4+2]=s.clamp(Math.sqrt(n/o)*c,3,c),d[i*4+3]=r?f:p}),{kind:`scatter`,key:`trades`,version:++M,color:b.up,instances:l,count:r.length,opacity:1,stroke:1.25}},ke=e=>{if(g.bestLines===!1)return[];let n=Q(),r=(r,i,a)=>{let o=e.length+ +!!Number.isFinite(C),s=new Float32Array(o*4),c=(e,r,i)=>{let a=Number.isFinite(i)?i-F.y:t.GAP;s[e*4]=r-F.x,s[e*4+1]=a,s[e*4+2]=r+n-F.x,s[e*4+3]=a};if(e.forEach((e,t)=>c(t,e.time,i(e))),Number.isFinite(C)){let t=r===`bid`?_.bestBid():_.bestAsk();c(e.length,C,t)}return{kind:`line`,key:`best:${r}`,version:++M,color:a,points:s,count:o*2,width:1.5,sorted:!0}};return[r(`bid`,e=>e.bestBid,b.up),r(`ask`,e=>e.bestAsk,b.down)]},Ae=()=>{if(!Number.isFinite(C)||!(x>0))return null;let e=_.version();if(N&&P===e)return N;let{bins:t,sizes:n}=ye();return N=Te(`heat:head`,[{time:C,bins:t,sizes:n}]),P=e,N};function je(t){let n=X.ctx;if(!n)return!1;let{width:i,height:o,dpr:c,theme:l}=X,u=ie?t-ie:0;ie=t;let d=ce(),f=g.fontSize??(i<420?10:11),p=Q(),m=!Number.isFinite(E);m&&_.count(`bid`)+_.count(`ask`)>0&&$(Date.now());let ee=fe();n.setTransform(c,0,0,c,0,0),n.clearRect(0,0,i,o),n.font=s.fontOf(l,g,400,f);let h=_.mid(),v=y.price(Number.isFinite(h)?h*1.0001:0),te=Math.ceil(n.measureText(v).width)+16,S=g.profile===!1?0:Math.round(s.clamp(i*.1,36,84)),ne=f+12;if(q={x:0,y:0,w:Math.max(10,i-te-S),h:Math.max(10,o-ne)},Number.isFinite(V)||(V=Math.max(p*10,g.window??6e4)),(!Number.isFinite(G)||G<=0)&&(ve(),G=g.priceSpan??(x>0?x*60:NaN)),B){let e=ee+p*1.5;H=[e-V,e];let t=_.bestBid(),n=_.bestAsk();Number.isFinite(t)||(t=n),Number.isFinite(n)||(n=t);for(let e of De())e.bestBid<t&&(t=e.bestBid),e.bestAsk>n&&(n=e.bestAsk);if(Number.isFinite(t)&&Number.isFinite(n)){let e=Number.isFinite(W)?s.ease(u,260):1,r=(t+n)/2;if(W=Number.isFinite(W)?W+(r-W)*e:r,!K&&g.priceSpan===void 0&&x>0){let r=Math.max(x*60,(n-t)*1.5);G+=(r-G)*e}}else Number.isFinite(h)&&(W=Number.isFinite(W)?W+(h-W)*s.ease(u,220):h);Number.isFinite(W)&&Number.isFinite(G)&&(U=[W-G/2,W+G/2])}let[w,O]=H,[k,A]=U,j=e=>q.x+(e-w)/(O-w)*q.w,M=e=>q.y+q.h-(e-k)/(A-k)*q.h,N=De();if(I&&x>0){Ce();let e=I.canvas;e.style.left=`${q.x}px`,e.style.top=`${q.y}px`,e.style.width=`${q.w}px`,e.style.height=`${q.h}px`;let t=Math.max(1,Math.round(q.w*c)),n=Math.max(1,Math.round(q.h*c));(e.width!==t||e.height!==n)&&I.resize(t,n);let r=Ee(),i=Ae();i&&r.push(i),r.push(...ke(N));let a=Oe(N);a&&r.push(a);let o=2/(O-w),s=2/(A-k);I.render(r,{transform:{xScale:o,xOffset:(F.x-w)*o-1,yScale:s,yOffset:(F.y-k)*s-1},width:t,height:n,dpr:c})}let P=q.x+q.w+S,L=Number.isFinite(k)?r.linearTicks(k,A,Math.max(2,Math.floor(q.h/44))):[];n.strokeStyle=e.toCss(l.text,.07),n.lineWidth=1,n.beginPath();for(let e of L){let t=Math.round(M(e))+.5;n.moveTo(q.x,t),n.lineTo(P,t)}n.stroke(),n.fillStyle=e.toCss(l.textMuted),n.textAlign=`left`,n.textBaseline=`middle`;for(let e of L){let t=M(e);t<6||t>q.h-6||n.fillText(y.price(e),P+6,t)}let R=a.timeTicks(w,O,Math.max(2,Math.floor(q.w/90)));n.textAlign=`center`,n.textBaseline=`top`;for(let e of R.values){let t=j(e);t<20||t>q.x+q.w-20||n.fillText(R.format(e),t,q.y+q.h+6)}if(n.strokeStyle=e.toCss(l.axis),n.beginPath(),n.moveTo(0,Math.round(q.y+q.h)+.5),n.lineTo(i,Math.round(q.y+q.h)+.5),n.moveTo(Math.round(P)+.5,0),n.lineTo(Math.round(P)+.5,q.y+q.h),n.stroke(),S&&x>0&&Number.isFinite(k)){let t=q.x+q.w;n.fillStyle=e.toCss(l.background,.85),n.fillRect(t,q.y,S,q.h);let r=Math.max(1,x/(A-k)*q.h),i=0,a=[`bid`,`ask`].map(e=>{let{price:t,size:n,count:r}=_.levels(e,{step:x,limit:de()});for(let e=0;e<r;e++)t[e]>=k&&t[e]<=A&&(i=Math.max(i,n[e]));return{side:e,price:t,size:n,count:r}});for(let{side:o,price:s,size:c,count:l}of a){n.fillStyle=e.toCss(o===`bid`?b.up:b.down,.6);for(let e=0;e<l;e++){let a=s[e];if(a<k||a>A||i<=0)continue;let o=c[e]/i*(S-4),l=M(a)-r/2;n.fillRect(t+2,l+(r>3?.5:0),o,Math.max(1,r-+(r>3)))}}}let z=(t,r,a)=>{if(!Number.isFinite(t)||t<k||t>A)return;let o=s.clamp(M(t),8,q.h-8),c=y.price(t);n.font=s.fontOf(l,g,600,f);let u=n.measureText(c).width+10;n.fillStyle=a?e.toCss(r):e.toCss(l.background),s.roundRect(n,P+1,o-8,Math.min(u,i-P-2),16,3),n.fill(),a||(n.strokeStyle=e.toCss(r),n.stroke()),n.fillStyle=a?`#fff`:e.toCss(r),n.textAlign=`left`,n.textBaseline=`middle`,n.fillText(c,P+6,o+.5),n.font=s.fontOf(l,g,400,f)};z(_.bestBid(),b.up,!0),z(_.bestAsk(),b.down,!0);let re=e=>!Number.isFinite(e)||Math.abs(M(e)-M(T?.price??NaN))>=17;T&&re(_.bestBid())&&re(_.bestAsk())&&z(T.price,T.side===`buy`?b.up:b.down,!1),Me(n,j,M,f,P,d),!I&&X.root.dataset.renderer,X.describe(`${g.ariaLabel??d.name}. ${d.bid} ${y.price(_.bestBid())}, ${d.ask} ${y.price(_.bestAsk())}.`);let J=m||pe()-D<2e3;return B&&J&&Number.isFinite(C)}function Me(t,n,r,i,a,l){let{theme:u}=X,d=()=>{X.tooltip.style.display=`none`,ae&&(ae=``,v.emit(`hover`,null))};if(!J||g.tooltip===!1||!(x>0)||Y){d();return}let[f,p]=J;if(f<q.x||f>q.x+q.w||p<q.y||p>q.y+q.h){d();return}let[m,ee]=H,[h,te]=U,S=m+(f-q.x)/q.w*(ee-m),ne=h+(q.y+q.h-p)/q.h*(te-h),T=Math.round(ne/x),E=+(T*x).toFixed(Math.min(12,o.decimalsOf(x)+2)),D=Se(S),O=Q(),k=0,A=NaN,j=NaN,M=0,N=0,P=NaN;if(D){for(let e=0;e<D.bins.length;e++)D.bins[e]===T&&(k+=D.sizes[e]);({bestBid:A,bestAsk:j,buyVolume:M,sellVolume:N}=D),P=D.time}else if(Number.isFinite(C)&&S>=C){let e=[`bid`,`ask`].map(e=>_.levels(e,{step:x,limit:de()}));for(let t of e)for(let e=0;e<t.count;e++)Math.round(t.price[e]/x)===T&&(k+=t.size[e]);A=_.bestBid(),j=_.bestAsk(),M=w.buyVolume,N=w.sellVolume,P=C}let F=E<=A?`bid`:E>=j?`ask`:null;t.strokeStyle=e.toCss(u.text,.45),t.setLineDash([3,3]),t.beginPath(),t.moveTo(Math.round(f)+.5,q.y),t.lineTo(Math.round(f)+.5,q.y+q.h);let I=Math.round(r(E))+.5;if(t.moveTo(q.x,I),t.lineTo(a,I),t.stroke(),t.setLineDash([]),Number.isFinite(P)){let i=n(P),a=n(P+O),o=r(E+x/2),s=r(E-x/2);t.strokeStyle=e.toCss(u.text,.85),t.strokeRect(i,o,Math.max(2,a-i),Math.max(2,s-o))}t.font=s.fontOf(u,g,600,i);let L=y.price(E),R=Math.min(t.measureText(L).width+10,X.width-a-2);t.fillStyle=e.toCss(u.text),s.roundRect(t,a+1,I-8,R,16,3),t.fill(),t.fillStyle=e.toCss(u.background),t.textAlign=`left`,t.textBaseline=`middle`,t.fillText(L,a+6,I+.5),t.font=s.fontOf(u,g,400,i);let z=F===`bid`?b.up:F===`ask`?b.down:u.text;c.tooltipHtml(oe,X.tooltip,{text:Number.isFinite(P)?s.formatClock(P):s.formatClock(S),color:void 0},[[l.price,y.price(E)],[l.liquidity,y.size(k)],[l.buys,y.size(M)],[l.sells,y.size(N)]]),X.tooltip.style.display=`block`,X.tooltip.style.borderLeft=`3px solid ${e.toCss(z)}`,X.placeTooltip(X.tooltip,f,p,f>q.w*.6?`left`:`right`);let re=`${P}|${T}|${k}|${M}|${N}`;if(re!==ae){ae=re;let e={time:Number.isFinite(P)?P:S,price:E,size:k,side:F,buyVolume:M,sellVolume:N};v.emit(`hover`,e)}}let Ne=async(e=new Set)=>{let t=++L,n=await i.createRenderer(g.renderer??`auto`,()=>{let e=oe.createElement(`canvas`);return Object.assign(e.style,{position:`absolute`,left:`0`,top:`0`,pointerEvents:`none`}),e.setAttribute(`aria-hidden`,`true`),e},t=>{R||I?.kind!==t||(I.destroy(),I.canvas.remove(),I=null,Ne(new Set([...e,t])))},e);if(R||t!==L){n?.destroy();return}I&&(I.destroy(),I.canvas.remove()),I=n,n&&(Z.dataset.renderer=n.kind,Z.insertBefore(n.canvas,X.canvas),v.emit(`renderer`,n.kind)),z(n?.kind??null),X.invalidate()},Pe=e=>{B!==e&&(B=e,v.emit(`follow`,e))},Fe=e=>{if(g.interactive===!1)return;let[t,n]=c.localPoint(Z,e);Z.setPointerCapture?.(e.pointerId),Y={x:t,y:n,viewX:[...H],viewY:[...U],axis:t>q.x+q.w,span:U[1]-U[0]}},Ie=e=>{let[t,n]=c.localPoint(Z,e);if(J=[t,n],Y){let e=t-Y.x,r=n-Y.y;if(Y.axis){let e=Y.span*Math.exp(r*.006),t=(Y.viewY[0]+Y.viewY[1])/2;G=e,K=!0,U=[t-e/2,t+e/2],B&&(W=t)}else if(Math.abs(e)+Math.abs(r)>3){Pe(!1);let t=(Y.viewX[1]-Y.viewX[0])/q.w*e,n=(Y.viewY[1]-Y.viewY[0])/q.h*r;H=[Y.viewX[0]-t,Y.viewX[1]-t],U=[Y.viewY[0]+n,Y.viewY[1]+n]}}X.invalidate()},Le=e=>{Z.releasePointerCapture?.(e.pointerId),Y=null,X.invalidate()},Re=()=>{Y||(J=null,X.invalidate())},ze=(e,t)=>{let[n,r]=H,i=s.clamp((r-n)*e,Q()*10,ue());if(V=i,!B){let e=n+(t-q.x)/q.w*(r-n),a=(e-n)/(r-n);H=[e-i*a,e+i*(1-a)]}X.invalidate()},Be=e=>{let t=s.clamp((U[1]-U[0])*e,x*6||1e-9,1/0),n=(U[0]+U[1])/2;G=t,K=!0,U=[n-t/2,n+t/2],X.invalidate()},Ve=e=>{if(g.interactive===!1||!(e.ctrlKey||e.metaKey))return;e.preventDefault();let[t]=c.localPoint(Z,e),n=Math.exp(e.deltaY*.002);e.shiftKey||t>q.x+q.w?Be(n):ze(n,t)},He=()=>{g.interactive!==!1&&Ge.resetView()},Ue=e=>{if(g.interactive!==!1){switch(e.key){case`+`:case`=`:ze(.8,q.x+q.w);break;case`-`:ze(1.25,q.x+q.w);break;case`ArrowUp`:case`ArrowDown`:{if(e.shiftKey){Be(e.key===`ArrowUp`?.8:1.25);break}Pe(!1);let t=(U[1]-U[0])*.1*(e.key===`ArrowUp`?1:-1);U=[U[0]+t,U[1]+t],X.invalidate();break}case`ArrowLeft`:case`ArrowRight`:{Pe(!1);let t=(H[1]-H[0])*.1*(e.key===`ArrowLeft`?-1:1);H=[H[0]+t,H[1]+t],X.invalidate();break}case`0`:case`Home`:Ge.resetView();break;default:return}e.preventDefault()}};Z.addEventListener(`pointerdown`,Fe),Z.addEventListener(`pointermove`,Ie),Z.addEventListener(`pointerup`,Le),Z.addEventListener(`pointercancel`,Le),Z.addEventListener(`pointerleave`,Re),Z.addEventListener(`wheel`,Ve,{passive:!1}),Z.addEventListener(`dblclick`,He),Z.addEventListener(`keydown`,Ue);let We=e=>{let t=xe(e.time);_.count(`bid`)+_.count(`ask`)>0&&(ve(),$(t)),_.applyDelta(e)},Ge={setBook(e){let t=xe(e.time);_.count(`bid`)+_.count(`ask`)>0&&$(t),_.setSnapshot(e),ve(),he(),Number.isFinite(C)||$(t),X.invalidate()},applyDeltas(e){if(Array.isArray(e))for(let t of e)We(t);else We(e);!Number.isFinite(C)&&x>0&&$(fe()),X.invalidate()},addTrades(e){let t=Array.isArray(e)?e:[e];for(let e of t){if(!(e.size>0)||!Number.isFinite(e.price))continue;Number.isFinite(E)&&(xe(e.time),$(e.time));let t=!Number.isFinite(C)||e.time>=C?w:Se(e.time);t&&(e.side===`buy`?(t.buyVolume+=e.size,t.buyNotional+=e.size*e.price):(t.sellVolume+=e.size,t.sellNotional+=e.size*e.price)),(!T||e.time>=T.time)&&(T=e)}X.invalidate()},clear(){_.clear(),_e(),T=null,E=NaN,x=0,W=NaN,G=NaN,K=!1,X.invalidate()},setOptions(e){let t=g;g=e,le(),(e.tickSize!==t.tickSize||(e.interval??100)!==(t.interval??100))&&(_e(),x=0,G=NaN,ve()),e.window!==t.window&&(V=NaN),e.priceSpan!==t.priceSpan&&(G=NaN),(e.renderer??`auto`)!==(t.renderer??`auto`)&&Ne(),me(),he(),ge()},resetView(){V=NaN,G=NaN,K=!1,W=NaN,Pe(!0),X.invalidate()},getRenderer:()=>I?.kind??null,ready:re,getStore:()=>_,on:(e,t)=>v.on(e,t),resize(){X.invalidate()},destroy(){R=!0,Z.removeEventListener(`pointerdown`,Fe),Z.removeEventListener(`pointermove`,Ie),Z.removeEventListener(`pointerup`,Le),Z.removeEventListener(`pointercancel`,Le),Z.removeEventListener(`pointerleave`,Re),Z.removeEventListener(`wheel`,Ve),Z.removeEventListener(`dblclick`,He),Z.removeEventListener(`keydown`,Ue),I?.destroy(),I=null,v.clear(),X.destroy(),z(null)}};return le(),me(),Ne(),Ge};exports.createOrderBookHeatmap=ee,exports.heatIntensity=m;
|
|
1
|
+
const e=require("../color.cjs"),t=require("../locale.cjs"),n=require("../scale.cjs"),r=require("../renderers/detect.cjs"),i=require("../time.cjs"),a=require("./book.cjs"),o=require("./format.cjs"),s=require("./host.cjs"),c=require("./layout.cjs");var l=32,u=128,d=[`#0b2140`,`#0f3a70`,`#1259a3`,`#1585bd`,`#1fb3b0`,`#62cf73`,`#d9e04a`,`#ffb23a`,`#ff6a33`],f=[`#dfecfb`,`#b3d2f5`,`#79abe8`,`#4580d6`,`#3b54b8`,`#5a33a0`,`#962a86`,`#cf2f55`],ee=16,p=6,m={en:{time:`Time`,price:`Price`,liquidity:`Liquidity`,buys:`Buys`,sells:`Sells`,bid:`Bid`,ask:`Ask`,name:`Liquidity heatmap`},zh:{time:`时间`,price:`价格`,liquidity:`挂单量`,buys:`主动买入`,sells:`主动卖出`,bid:`买一`,ask:`卖一`,name:`订单簿热力图`},ja:{time:`時刻`,price:`価格`,liquidity:`指値量`,buys:`買い約定`,sells:`売り約定`,bid:`最良買気配`,ask:`最良売気配`,name:`板ヒートマップ`},fr:{time:`Heure`,price:`Prix`,liquidity:`Liquidité`,buys:`Achats`,sells:`Ventes`,bid:`Meilleur achat`,ask:`Meilleure vente`,name:`Carte de chaleur de la liquidité`}},h=(e,t,n,r)=>{if(!(e>0)||!(t>0))return 0;let i=Math.min(1,e*r/t);switch(n){case`linear`:return i;case`sqrt`:return Math.sqrt(i);default:return Math.log10(1+9*i)}},g=(g,_={})=>{let v=_,y=a.createOrderBookStore(),b=s.createEmitter(),x=o.createFormatters(v,2,4),S={up:[0,0,0,1],down:[0,0,0,1]},C=new Uint32Array(u),te=[0,0,0,1],w=!1,T=0,E=[],ne=0,D=NaN,O={buyVolume:0,buyNotional:0,sellVolume:0,sellNotional:0},k=null,A=NaN,re=0,j=0,M=0,N=0,P=new Map,F=new Set,ie=0,I=null,L=-1,ae={x:NaN,y:NaN},R=null,oe=0,z=!1,B=()=>{},se=new Promise(e=>{B=e}),ce=!0,V=NaN,H=[0,1],U=[0,1],le=!1,W=null,G=NaN,K=NaN,ue=0,q={x:0,y:0,w:0,h:0},de=null,fe=``,J=null,Y=s.createHost(g,{className:`minerva-orderbook-heatmap`,draw:He,onTheme:()=>{ye(),xe()}}),{root:X,doc:pe}=Y;X.tabIndex=0,X.setAttribute(`role`,`figure`),X.style.touchAction=`none`;let Z=t.localeLabels(m,v.locale,v.labels),me=()=>Z,he=()=>{Z=t.localeLabels(m,v.locale,v.labels),X.setAttribute(`aria-label`,v.ariaLabel??Z.name)},Q=()=>Math.max(10,v.interval??100),ge=()=>Math.max(Q()*4,v.history??3e5),$=()=>Math.max(4,Math.round(v.depth??160)),_e=()=>{if(!Number.isFinite(A))return Date.now();let e=ve()-re;return A+Math.min(Math.max(0,e),Q()*3)},ve=()=>typeof performance<`u`?performance.now():Date.now();function ye(){let t=Y.theme;S=o.sideColors(t,v);let n=e=>{let n=t.resolve?t.resolve(e,t.primary):t.primary;return[n[0],n[1],n[2],1]},r=[t.background[0],t.background[1],t.background[2],1];w=t.background[3]>0&&e.luminance(r)<.4,te=w?e.mixOklab(r,[0,0,0,1],.4):e.mixOklab(r,[t.text[0],t.text[1],t.text[2],1],.02),C=e.oklabRamp([te,...(v.colors?.length?v.colors:w?d:f).map(n)],u)}let be=()=>{x=o.createFormatters(v,T>0?Math.max(a.decimalsOf(T),a.inferPriceDecimals(y)):a.inferPriceDecimals(y),a.inferSizeDecimals(y))},xe=()=>{for(let e of P.keys())F.add(e);L=-1,Y.invalidate()},Se=()=>{E=[],P.clear(),F.clear(),I=null,L=-1,D=NaN,ae={x:NaN,y:NaN},j=0,M=0,K=NaN,O.buyVolume=O.buyNotional=O.sellVolume=O.sellNotional=0},Ce=()=>{if(T>0)return;let e=a.inferTickSize(y),t=y.mid();if(v.tickSize&&v.tickSize>0)T=v.tickSize;else if(e>0&&Number.isFinite(t)){let n=t*1e-5/e,r=1;for(let e=1;e<=1e9&&r<n*.75;e*=10)for(let t of[1,2,5])if(r=t*e,r>=n*.75)break;T=a.roundToStep(e*r,e)}else T=Number.isFinite(t)?Math.max(1e-8,t*1e-5):0;T>0&&be()},we=()=>{let e=$(),t=new Float64Array(e*2),n=new Float32Array(e*2),r=0,i=[0,0,0,0];for(let i of[`bid`,`ask`]){let a=y.count(i),o=0;for(let s=0;s<a;s++){let a=Math.round(y.priceAt(i,s)/T),c=y.sizeAt(i,s);if(r>0&&t[r-1]===a&&o>0){n[r-1]+=c;continue}if(o>=e)break;t[r]=a,n[r]=c,r++,o++}}for(let e=0;e<r;e++){let t=n[e];t>i[3]&&(i[3]=t,i.sort((e,t)=>t-e))}return{bins:t.subarray(0,r),sizes:n.subarray(0,r),reference:i[3]||i[0]}},Te=e=>{if(!(T>0))return;let{bins:t,sizes:n,reference:r}=we(),i={seq:ne++,time:e,bins:t,sizes:n,bestBid:y.bestBid(),bestAsk:y.bestAsk(),buyVolume:O.buyVolume,buyNotional:O.buyNotional,sellVolume:O.sellVolume,sellNotional:O.sellNotional,reference:r};if(O.buyVolume=O.buyNotional=O.sellVolume=O.sellNotional=0,E.push(i),F.add(Math.floor(i.seq/l)),v.maxSize===void 0){let e=E.slice(-100),t=0;for(let n of e)t+=n.reference;let n=t/e.length*1.6;if(!(j>0)||Math.abs(n/j-1)>.3){j=n;for(let e of P.keys())F.add(e);L=-1}}let a=e-ge(),o=0;for(;o<E.length&&E[o].time<a;)o++;if(o){E=E.slice(o);let e=E[0]?Math.floor(E[0].seq/l):1/0;for(let t of[...P.keys()])t<e&&P.delete(t)}},Ee=e=>{if(!Number.isFinite(e))return;let t=Q();if(!Number.isFinite(D)){D=Math.floor(e/t)*t;return}if(e-D>ge()){Te(D),D=Math.floor(e/t)*t;return}for(;e>=D+t;)Te(D),D+=t},De=e=>e===void 0||!Number.isFinite(e)?Date.now():((!Number.isFinite(A)||e>=A)&&(A=e,re=ve()),e),Oe=e=>{let t=0,n=E.length-1,r=Q();for(;t<=n;){let i=t+n>>>1,a=E[i];if(e<a.time)n=i-1;else if(e>=a.time+r)t=i+1;else return a}return null},ke=()=>{if(Number.isFinite(ae.x))return;let e=y.mid();ae={x:Number.isFinite(D)?D:0,y:Number.isFinite(e)?e:0}},Ae=e=>{let t=h(e,v.maxSize??j,v.colorScale??`log`,Math.max(.01,v.contrast??1));return Math.round(t*127)},je=(e,t)=>{let n=Q(),r=0;for(let e of t)for(let t=0;t<e.sizes.length;t++)Ae(e.sizes[t])>0&&r++;let i=new ArrayBuffer(Math.max(1,r)*16),a=new Float32Array(i),o=new Uint32Array(i),s=0,c=T/2*1.06;for(let e of t){let t=e.time+n/2-ae.x;for(let n=0;n<e.sizes.length;n++){let r=Ae(e.sizes[n]);if(r<=0)continue;let i=e.bins[n]*T-ae.y;a[s*4]=t,a[s*4+1]=i-c,a[s*4+2]=i+c,o[s*4+3]=C[r],s++}}return{kind:`bar`,key:e,version:++ie,color:[1,1,1,1],instances:i,count:r,halfWidth:n/2*1.06,radius:0,inset:.01,minHalf:0,sorted:!0}},Me=()=>{if(F.size){let e=new Map;for(let t of E){let n=Math.floor(t.seq/l);if(!F.has(n))continue;let r=e.get(n);r||e.set(n,r=[]),r.push(t)}for(let t of F){let n=e.get(t);n?P.set(t,je(`heat:${t}`,n)):P.delete(t)}F.clear()}return[...P.values()]},Ne=()=>{let e=Q(),t=[],n=0,r=E.length;for(;n<r;){let t=n+r>>>1;E[t].time+e<H[0]?n=t+1:r=t}for(let e=n;e<E.length;e++){let n=E[e];if(n.time>H[1])break;t.push(n)}return t},Pe=(e,t)=>{let n=Q(),r=Math.max(1,Math.ceil(p/Math.max(1e-6,t))),i=[],a=NaN,o=0,s=0,c={bv:0,bn:0,sv:0,sn:0},l=()=>{let e=(o+s)/2;c.sv>0&&i.push({time:e,price:c.sn/c.sv,volume:c.sv,buy:!1}),c.bv>0&&i.push({time:e,price:c.bn/c.bv,volume:c.bv,buy:!0}),c.bv=c.bn=c.sv=c.sn=0},u=(e,t,i)=>{let u=Math.floor(e/r);u!==a&&(Number.isFinite(a)&&l(),a=u,o=t),s=t+n,c.bv+=i.buyVolume,c.bn+=i.buyNotional,c.sv+=i.sellVolume,c.sn+=i.sellNotional};for(let t of e)u(t.seq,t.time,t);return Number.isFinite(D)&&D<=H[1]&&u(ne,D,O),Number.isFinite(a)&&l(),i},Fe=e=>{e.save(),e.beginPath(),e.rect(q.x,q.y,q.w,q.h),e.clip()},Ie=(t,n,r,i,a)=>{if(v.bestLines===!1)return;let o=Q(),s=n.map(e=>[e.time,e.bestBid,e.bestAsk]);if(Number.isFinite(D)&&s.push([D,y.bestBid(),y.bestAsk()]),!s.length)return;let c=a>=2;Fe(t),t.beginPath();for(let[e,n,a]of s){if(!Number.isFinite(n)||!Number.isFinite(a)||!(a>n))continue;let s=r(e),c=i(a);t.rect(s,c,r(e+o)-s,i(n)-c)}t.fillStyle=e.toCss(Y.theme.text,w?.07:.06),t.fill(),t.lineJoin=`round`;for(let[n,a]of[[1,S.up],[2,S.down]]){t.beginPath();let l=!1;for(let e of s){let a=e[n];if(!Number.isFinite(a)){l=!1;continue}let s=i(a),u=r(e[0]),d=r(e[0]+o);c?(l?t.lineTo(u,s):t.moveTo(u,s),t.lineTo(d,s)):l?t.lineTo((u+d)/2,s):t.moveTo((u+d)/2,s),l=!0}t.strokeStyle=e.toCss(te,.55),t.lineWidth=3.5,t.stroke(),t.strokeStyle=e.toCss(a),t.lineWidth=1.5,t.stroke()}t.restore()},Le=(t,n,r,i,a)=>{if(!n.length)return;let s=0;for(let e of n)s=Math.max(s,e.volume);M=M>0?Math.max(s,M*.995):s;let c=v.bubbleVolume??M,l=Math.max(4,v.bubbleSize??28),u=n.map(e=>({...e,d:o.clamp(Math.sqrt(e.volume/c)*l,3,l)})).sort((e,t)=>e.d-t.d);Fe(t),t.lineWidth=1.25,t.textAlign=`center`,t.textBaseline=`middle`,t.font=o.fontOf(Y.theme,v,600,Math.max(8,a-1));for(let n of u){let a=r(n.time),o=i(n.price),s=n.d/2;if(a<q.x-s||a>q.x+q.w+s||o<q.y-s||o>q.y+q.h+s)continue;let c=n.buy?S.up:S.down;if(t.beginPath(),t.arc(a,o,s,0,Math.PI*2),t.fillStyle=e.toCss(c,.62),t.fill(),t.strokeStyle=e.toCss(e.mixOklab(c,[1,1,1,1],.25)),t.stroke(),n.d>=26){let e=x.compact(n.volume);t.measureText(e).width<=n.d-6&&(t.fillStyle=`#fff`,t.fillText(e,a,o+.5))}}t.restore()},Re=(t,n,r,i,a)=>{let s=Y.theme,[l,u]=U,d=Math.max(1,T/(u-l)*q.h),f=0,ee=[`bid`,`ask`].map(e=>{let t=y.levels(e,{step:T,limit:$()});for(let e=0;e<t.count;e++){let n=t.price[e];n>=l&&n<=u&&(f=Math.max(f,t.size[e]))}return{side:e,...t}});if((f>N||f<N*.35||!(N>0))&&(N=c.niceCeil(f)),!(N>0))return;let p=n+3,m=r-9;t.strokeStyle=e.toCss(s.text,.09),t.lineWidth=1,t.setLineDash([2,3]),t.beginPath();for(let e of[.5,1]){let n=Math.round(p+m*e)+.5;t.moveTo(n,q.y),t.lineTo(n,q.y+q.h)}t.stroke(),t.setLineDash([]);let h=+(d>3),g=Math.max(1,d-h);for(let{side:n,price:r,size:a,count:o}of ee){let s=n===`bid`?S.up:S.down;t.beginPath();for(let e=1;e<o;e++){let n=r[e];if(n<l||n>u)continue;let o=Math.max(1,Math.min(m,a[e]/N*m));t.rect(p,i(n)-d/2+h/2,o,g)}t.fillStyle=e.toCss(s,.55),t.fill();let c=r[0];if(o&&c!==void 0&&c>=l&&c<=u){let n=Math.max(1,Math.min(m,a[0]/N*m));t.fillStyle=e.toCss(s,.95),t.fillRect(p,i(c)-d/2+h/2,n,g)}}let _=Math.round(q.y+q.h+4)+.5;t.strokeStyle=e.toCss(s.textMuted,.7),t.beginPath(),t.moveTo(p,_),t.lineTo(p+m,_);for(let e of[0,.5,1]){let n=Math.round(p+m*e)+.5;t.moveTo(n,_),t.lineTo(n,_+3)}t.stroke(),t.font=o.fontOf(s,v,400,Math.max(8,a-1)),t.fillStyle=e.toCss(s.textMuted),t.textBaseline=`top`;let b=x.compact(N),C=t.measureText(b).width;t.textAlign=`right`,t.fillText(b,p+m+2,_+4),C+t.measureText(`0`).width+8<m&&(t.textAlign=`left`,t.fillText(`0`,p-1,_+4))},ze=()=>{if(!Number.isFinite(D)||!(T>0))return null;let e=y.version();if(I&&L===e)return I;let{bins:t,sizes:n}=we();return I=je(`heat:head`,[{time:D,bins:t,sizes:n}]),L=e,I},Be=()=>{if(!de||v.tooltip===!1||!(T>0)||J||!le)return null;let[e,t]=de;if(e<q.x||e>q.x+q.w||t<q.y||t>q.y+q.h)return null;let[n,r]=H,[i,o]=U,s=n+(e-q.x)/q.w*(r-n),c=i+(q.y+q.h-t)/q.h*(o-i),l=Math.round(c/T),u=+(l*T).toFixed(Math.min(12,a.decimalsOf(T)+2)),d=Oe(s);return{hx:e,hy:t,time:s,start:d?d.time:Number.isFinite(D)&&s>=D?D:NaN,column:d,bin:l,rowPrice:u}},Ve=(t,n,r,i,a,s,c,l=`left`)=>{let u=Math.min(t.measureText(n).width+10,a),d=l===`center`?r-u/2:r;t.fillStyle=c?e.toCss(s):e.toCss(te),o.roundRect(t,d,i-ee/2,u,ee,3),t.fill(),c||(t.strokeStyle=e.toCss(s),t.lineWidth=1,t.stroke()),t.fillStyle=c?e.luminance(s)>.6?`#111`:`#fff`:e.toCss(s),t.textAlign=l,t.textBaseline=`middle`,t.fillText(n,l===`center`?r:d+5,i+.5)};function He(t){let r=Y.ctx;if(!r)return!1;let{width:a,height:s,dpr:l,theme:u}=Y,d=ue?t-ue:0;ue=t;let f=me(),p=v.fontSize??(a<420?10:11),m=o.fontOf(u,v,400,p),h=o.fontOf(u,v,600,p),g=Q(),_=!Number.isFinite(A);_&&y.count(`bid`)+y.count(`ask`)>0&&Ee(Date.now());let b=_e();K=Number.isFinite(K)&&b>K-g*4?Math.max(K,b):b;let C=K;r.setTransform(l,0,0,l,0,0),r.clearRect(0,0,a,s),Ce();let ne=y.mid();r.font=h;let O=x.price(Number.isFinite(ne)?ne*1.0001:0),j=Math.ceil(r.measureText(O).width)+18;r.font=m;let M=v.profile===!1?0:Math.round(o.clamp(a*.11,44,96)),N=p+12;q={x:0,y:0,w:Math.max(10,a-j-M),h:Math.max(10,s-N)};let P=q.x+q.w,F=P+M;if(Number.isFinite(V)||(V=Math.max(g*10,v.window??6e4)),ce){let e=E.length?E[0].time:D;H=c.fitTimeRange(e,C,V,Math.min(V,g*60));let t=y.bestBid(),n=y.bestAsk();for(let e of Ne())Number.isFinite(e.bestBid)&&!(e.bestBid>=t)&&(t=e.bestBid),Number.isFinite(e.bestAsk)&&!(e.bestAsk<=n)&&(n=e.bestAsk);Number.isFinite(t)||(t=n),Number.isFinite(n)||(n=t);let r=T>0?T*Math.max(40,q.h/6):0,i=v.priceSpan??(Number.isFinite(G)?G:void 0);if(r>0||i!==void 0){W=c.fitPriceRange(W,t,n,r,i);let[e,a]=W;if(Number.isFinite(e)&&Number.isFinite(a)){if(!le)U=[e,a],le=!0;else{let t=o.ease(d,280);U=[U[0]+(e-U[0])*t,U[1]+(a-U[1])*t]}}}}let[ie,I]=H,[L,oe]=U,z=e=>q.x+(e-ie)/(I-ie)*q.w,B=e=>q.y+q.h-(e-L)/(oe-L)*q.h,se=le&&T>0,de=Ne(),fe=g/(I-ie)*q.w,J=e.toCss(te);if(R&&T>0){ke();let e=R.canvas;e.style.left=`${q.x}px`,e.style.top=`${q.y}px`,e.style.width=`${q.w}px`,e.style.height=`${q.h}px`,e.dataset.floor!==J&&(e.dataset.floor=J,e.style.background=J);let t=Math.max(1,Math.round(q.w*l)),n=Math.max(1,Math.round(q.h*l));(e.width!==t||e.height!==n)&&R.resize(t,n);let r=Me(),i=ze();i&&r.push(i);let a=2/(I-ie),o=2/(oe-L);R.render(r,{transform:{xScale:a,xOffset:(ae.x-ie)*a-1,yScale:o,yOffset:(ae.y-L)*o-1},width:t,height:n,dpr:l})}else r.fillStyle=J,r.fillRect(q.x,q.y,q.w,q.h);M&&(r.fillStyle=J,r.fillRect(P,q.y,M,q.h));let X=se?n.linearTicks(L,oe,Math.max(2,Math.floor(q.h/44))):[],pe=i.timeTicks(ie,I,Math.max(2,Math.floor(q.w/75)),void 0,v.timeZone??`local`);r.strokeStyle=e.toCss(u.text,w?.07:.09),r.lineWidth=1,r.beginPath();for(let e of X){let t=Math.round(B(e))+.5;r.moveTo(q.x,t),r.lineTo(F,t)}for(let e of pe.values){let t=Math.round(z(e))+.5;t<=q.x+1||t>=P-1||(r.moveTo(t,q.y),r.lineTo(t,q.y+q.h))}r.stroke(),se&&(Ie(r,de,z,B,fe),v.bubbles!==!1&&Le(r,Pe(de,fe),z,B,p),M&&Re(r,P,M,B,p)),r.strokeStyle=e.toCss(u.axis),r.lineWidth=1,r.beginPath(),r.moveTo(0,Math.round(q.y+q.h)+.5),r.lineTo(a,Math.round(q.y+q.h)+.5),M&&(r.moveTo(Math.round(P)+.5,q.y),r.lineTo(Math.round(P)+.5,q.y+q.h)),r.moveTo(Math.round(F)+.5,q.y),r.lineTo(Math.round(F)+.5,q.y+q.h),r.stroke();let Z=se?Be():null;r.font=m;let he=Z?o.formatClock(Number.isFinite(Z.start)?Z.start:Z.time,g<1e3,v.timeZone):``,ge=Z?r.measureText(he).width/2+8:0;r.fillStyle=e.toCss(u.textMuted),r.textAlign=`center`,r.textBaseline=`top`;for(let e of pe.values){let t=z(e);if(t<20||t>P-20)continue;let n=pe.format(e);Z&&Math.abs(t-Z.hx)<ge+r.measureText(n).width/2||r.fillText(n,t,q.y+q.h+6)}let $=k,ye=[{price:y.bestAsk(),color:S.down,filled:!0},{price:y.bestBid(),color:S.up,filled:!0}];$&&$.price!==y.bestBid()&&$.price!==y.bestAsk()&&ye.push({price:$.price,color:$.side===`buy`?S.up:S.down,filled:!1});let be=se?ye.filter(e=>Number.isFinite(e.price)&&e.price>=L&&e.price<=oe):[],xe=Z?Math.round(B(Z.rowPrice))+.5:NaN,Se=c.layoutAxisLabels(be.map(e=>({y:B(e.price),h:ee})),Z?{y:xe,h:ee}:null,X.map(B),p+2,[q.y,q.y+q.h]);r.fillStyle=e.toCss(u.textMuted),r.textAlign=`left`,r.textBaseline=`middle`,X.forEach((e,t)=>{Se.ticks[t]&&r.fillText(x.price(e),F+6,B(e))}),r.font=h,be.forEach((t,n)=>{let i=Se.pinned[n];if(i==null)return;let o=B(t.price);Math.abs(i-o)>1&&(r.strokeStyle=e.toCss(t.color),r.lineWidth=1,r.beginPath(),r.moveTo(F-4,o),r.lineTo(F+1,i),r.stroke()),Ve(r,x.price(t.price),F+1,i,a-F-2,t.color,t.filled)}),Ue(r,z,B,F,f,Z,xe,he),r.font=m,Y.describe(`${v.ariaLabel??f.name}. ${f.bid} ${x.price(y.bestBid())}, ${f.ask} ${x.price(y.bestAsk())}.`);let we=_||ve()-re<2e3;return ce&&we&&Number.isFinite(D)||le&&W!==null&&Math.abs(U[0]-W[0])>1e-9}function Ue(t,n,r,i,a,c,l,u){let{theme:d}=Y;if(!c){Y.tooltip.style.display=`none`,fe&&(fe=``,b.emit(`hover`,null));return}let{hx:f,hy:p,time:m,start:h,column:g,bin:_,rowPrice:C}=c,te=Q(),w=0,E=NaN,ne=NaN,D=0,k=0;if(g){for(let e=0;e<g.bins.length;e++)g.bins[e]===_&&(w+=g.sizes[e]);({bestBid:E,bestAsk:ne,buyVolume:D,sellVolume:k}=g)}else if(Number.isFinite(h)){let e=[`bid`,`ask`].map(e=>y.levels(e,{step:T,limit:$()}));for(let t of e)for(let e=0;e<t.count;e++)Math.round(t.price[e]/T)===_&&(w+=t.size[e]);E=y.bestBid(),ne=y.bestAsk(),D=O.buyVolume,k=O.sellVolume}let A=C<=E?`bid`:C>=ne?`ask`:null;if(t.strokeStyle=e.toCss(d.text,.5),t.lineWidth=1,t.setLineDash([3,3]),t.beginPath(),t.moveTo(Math.round(f)+.5,q.y),t.lineTo(Math.round(f)+.5,q.y+q.h),t.moveTo(q.x,l),t.lineTo(i,l),t.stroke(),t.setLineDash([]),Number.isFinite(h)){let i=n(h),a=n(h+te),o=r(C+T/2),s=r(C-T/2);t.strokeStyle=e.toCss(d.text,.85),t.strokeRect(i,o,Math.max(2,a-i),Math.max(2,s-o))}t.font=o.fontOf(d,v,600,v.fontSize??(Y.width<420?10:11)),Ve(t,x.price(C),i+1,l,Y.width-i-2,d.text,!0),Ve(t,u,o.clamp(f,q.x+40,q.x+q.w-40),q.y+q.h+ee/2+2,q.w,d.text,!0,`center`);let re=A===`bid`?S.up:A===`ask`?S.down:d.text;s.tooltipHtml(pe,Y.tooltip,{text:o.formatClock(Number.isFinite(h)?h:m,!0,v.timeZone),color:void 0},[[a.price,x.price(C)],[a.liquidity,x.size(w)],[a.buys,x.size(D)],[a.sells,x.size(k)]]),Y.tooltip.style.display=`block`,Y.tooltip.style.borderLeft=`3px solid ${e.toCss(re)}`,Y.placeTooltip(Y.tooltip,f,p,f>q.w*.6?`left`:`right`);let j=`${h}|${_}|${w}|${D}|${k}`;if(j!==fe){fe=j;let e={time:Number.isFinite(h)?h:m,price:C,size:w,side:A,buyVolume:D,sellVolume:k};b.emit(`hover`,e)}}let We=async(e=new Set)=>{let t=++oe,n=await r.createRenderer(v.renderer??`auto`,()=>{let e=pe.createElement(`canvas`);return Object.assign(e.style,{position:`absolute`,left:`0`,top:`0`,pointerEvents:`none`}),e.setAttribute(`aria-hidden`,`true`),e},t=>{z||R?.kind!==t||(R.destroy(),R.canvas.remove(),R=null,We(new Set([...e,t])))},e);if(z||t!==oe){n?.destroy();return}R&&(R.destroy(),R.canvas.remove()),R=n,n&&(X.dataset.renderer=n.kind,X.insertBefore(n.canvas,Y.canvas),b.emit(`renderer`,n.kind)),B(n?.kind??null),Y.invalidate()},Ge=e=>{ce!==e&&(ce=e,b.emit(`follow`,e))},Ke=e=>{let t=E.length?E[0].time:D;if(!Number.isFinite(t))return e;let n=e[1]-e[0],r=(Number.isFinite(K)?K:_e())+Q()+n/2,i=Math.max(t-n/2,Math.min(e[0],r-n));return[i,i+n]},qe=e=>{if(v.interactive===!1)return;let[t,n]=s.localPoint(X,e);X.setPointerCapture?.(e.pointerId),J={x:t,y:n,viewX:[...H],viewY:[...U],axis:t>q.x+q.w,span:U[1]-U[0]}},Je=e=>{let[t,n]=s.localPoint(X,e);if(de=[t,n],J){let e=t-J.x,r=n-J.y;if(J.axis){let e=J.span*Math.exp(r*.006),t=(J.viewY[0]+J.viewY[1])/2;G=e,U=[t-e/2,t+e/2],W=[U[0],U[1]]}else if(Math.abs(e)+Math.abs(r)>3){Ge(!1);let t=(J.viewX[1]-J.viewX[0])/q.w*e,n=(J.viewY[1]-J.viewY[0])/q.h*r;H=Ke([J.viewX[0]-t,J.viewX[1]-t]),U=[J.viewY[0]+n,J.viewY[1]+n]}}Y.invalidate()},Ye=e=>{X.releasePointerCapture?.(e.pointerId),J=null,Y.invalidate()},Xe=()=>{J||(de=null,Y.invalidate())},Ze=(e,t)=>{let[n,r]=H,i=o.clamp((ce?V:r-n)*e,Q()*10,ge());if(V=i,!ce){let e=n+(t-q.x)/q.w*(r-n),a=(e-n)/(r-n);H=Ke([e-i*a,e+i*(1-a)])}Y.invalidate()},Qe=e=>{let t=o.clamp((U[1]-U[0])*e,T*6||1e-9,1/0),n=(U[0]+U[1])/2;G=t,U=[n-t/2,n+t/2],W=[U[0],U[1]],Y.invalidate()},$e=e=>{if(v.interactive===!1||!(e.ctrlKey||e.metaKey))return;e.preventDefault();let[t]=s.localPoint(X,e),n=Math.exp(e.deltaY*.002);e.shiftKey||t>q.x+q.w?Qe(n):Ze(n,t)},et=()=>{v.interactive!==!1&&rt.resetView()},tt=e=>{if(v.interactive!==!1){switch(e.key){case`+`:case`=`:Ze(.8,q.x+q.w);break;case`-`:Ze(1.25,q.x+q.w);break;case`ArrowUp`:case`ArrowDown`:{if(e.shiftKey){Qe(e.key===`ArrowUp`?.8:1.25);break}Ge(!1);let t=(U[1]-U[0])*.1*(e.key===`ArrowUp`?1:-1);U=[U[0]+t,U[1]+t],Y.invalidate();break}case`ArrowLeft`:case`ArrowRight`:{Ge(!1);let t=(H[1]-H[0])*.1*(e.key===`ArrowLeft`?-1:1);H=Ke([H[0]+t,H[1]+t]),Y.invalidate();break}case`0`:case`Home`:rt.resetView();break;default:return}e.preventDefault()}};X.addEventListener(`pointerdown`,qe),X.addEventListener(`pointermove`,Je),X.addEventListener(`pointerup`,Ye),X.addEventListener(`pointercancel`,Ye),X.addEventListener(`pointerleave`,Xe),X.addEventListener(`wheel`,$e,{passive:!1}),X.addEventListener(`dblclick`,et),X.addEventListener(`keydown`,tt);let nt=e=>{let t=De(e.time);y.count(`bid`)+y.count(`ask`)>0&&(Ce(),Ee(t)),y.applyDelta(e)},rt={setBook(e){let t=De(e.time);y.count(`bid`)+y.count(`ask`)>0&&Ee(t),y.setSnapshot(e),Ce(),be(),Number.isFinite(D)||Ee(t),Y.invalidate()},applyDeltas(e){if(Array.isArray(e))for(let t of e)nt(t);else nt(e);!Number.isFinite(D)&&T>0&&Ee(_e()),Y.invalidate()},addTrades(e){let t=Array.isArray(e)?e:[e];for(let e of t){if(!(e.size>0)||!Number.isFinite(e.price))continue;Number.isFinite(A)&&(De(e.time),Ee(e.time));let t=!Number.isFinite(D)||e.time>=D?O:Oe(e.time);t&&(e.side===`buy`?(t.buyVolume+=e.size,t.buyNotional+=e.size*e.price):(t.sellVolume+=e.size,t.sellNotional+=e.size*e.price)),(!k||e.time>=k.time)&&(k=e)}Y.invalidate()},clear(){y.clear(),Se(),k=null,A=NaN,T=0,G=NaN,W=null,le=!1,Y.invalidate()},setOptions(e){let t=v;v=e,he(),(e.tickSize!==t.tickSize||(e.interval??100)!==(t.interval??100))&&(Se(),T=0,G=NaN,Ce()),e.window!==t.window&&(V=NaN),e.priceSpan!==t.priceSpan&&(G=NaN),(e.renderer??`auto`)!==(t.renderer??`auto`)&&We(),ye(),be(),xe()},resetView(){V=NaN,G=NaN,W=null,Ge(!0),Y.invalidate()},getRenderer:()=>R?.kind??null,ready:se,getStore:()=>y,on:(e,t)=>b.on(e,t),resize(){Y.invalidate()},destroy(){z=!0,X.removeEventListener(`pointerdown`,qe),X.removeEventListener(`pointermove`,Je),X.removeEventListener(`pointerup`,Ye),X.removeEventListener(`pointercancel`,Ye),X.removeEventListener(`pointerleave`,Xe),X.removeEventListener(`wheel`,$e),X.removeEventListener(`dblclick`,et),X.removeEventListener(`keydown`,tt),R?.destroy(),R=null,b.clear(),Y.destroy(),B(null)}};return he(),ye(),We(),rt};exports.createOrderBookHeatmap=g,exports.heatIntensity=h;
|
|
2
2
|
//# sourceMappingURL=heatmap.cjs.map
|