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,4 +1,4 @@
|
|
|
1
|
-
import { ChartRendererKind, ChartRendererPreference } from '../types.cjs';
|
|
1
|
+
import { ChartRendererKind, ChartRendererPreference, ChartTimeZone } from '../types.cjs';
|
|
2
2
|
/** One price level: `[price, size]` */
|
|
3
3
|
export type OrderBookLevel = readonly [price: number, size: number];
|
|
4
4
|
/** Price levels as two parallel columns (typed arrays welcome) */
|
|
@@ -510,7 +510,11 @@ export interface OrderBookHeatmapOptions extends OrderBookCommonOptions {
|
|
|
510
510
|
contrast?: number;
|
|
511
511
|
/** Size drawn with the hottest color; follows the data when omitted */
|
|
512
512
|
maxSize?: number;
|
|
513
|
-
/**
|
|
513
|
+
/**
|
|
514
|
+
* Color ramp, coldest first, interpolated in OKLab after the floor color
|
|
515
|
+
* (the background, a shade darker in dark themes, shown where there is no
|
|
516
|
+
* liquidity); a perceptual heat ramp suited to the theme when omitted
|
|
517
|
+
*/
|
|
514
518
|
colors?: readonly string[];
|
|
515
519
|
/**
|
|
516
520
|
* Trades drawn as bubbles sized by volume (buys / sells colors)
|
|
@@ -549,6 +553,12 @@ export interface OrderBookHeatmapOptions extends OrderBookCommonOptions {
|
|
|
549
553
|
* @default "auto"
|
|
550
554
|
*/
|
|
551
555
|
renderer?: ChartRendererPreference;
|
|
556
|
+
/**
|
|
557
|
+
* Clock of the time axis and the tooltip: the local time or UTC (the
|
|
558
|
+
* clock of most exchanges)
|
|
559
|
+
* @default "local"
|
|
560
|
+
*/
|
|
561
|
+
timeZone?: ChartTimeZone;
|
|
552
562
|
/**
|
|
553
563
|
* Overrides of the built-in texts, which follow `locale` (English,
|
|
554
564
|
* Chinese, Japanese and French built in)
|
|
@@ -686,6 +696,12 @@ export interface TimeAndSalesOptions extends OrderBookCommonOptions {
|
|
|
686
696
|
* @default true
|
|
687
697
|
*/
|
|
688
698
|
milliseconds?: boolean;
|
|
699
|
+
/**
|
|
700
|
+
* Clock of the default time format: the local time or UTC (the clock of
|
|
701
|
+
* most exchanges)
|
|
702
|
+
* @default "local"
|
|
703
|
+
*/
|
|
704
|
+
timeZone?: ChartTimeZone;
|
|
689
705
|
/** Formats the time of a trade (replaces the default `HH:MM:SS.mmm`) */
|
|
690
706
|
formatTime?: (time: number) => string;
|
|
691
707
|
/**
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ChartRendererKind, ChartRendererPreference } from '../types.js';
|
|
1
|
+
import { ChartRendererKind, ChartRendererPreference, ChartTimeZone } from '../types.js';
|
|
2
2
|
/** One price level: `[price, size]` */
|
|
3
3
|
export type OrderBookLevel = readonly [price: number, size: number];
|
|
4
4
|
/** Price levels as two parallel columns (typed arrays welcome) */
|
|
@@ -510,7 +510,11 @@ export interface OrderBookHeatmapOptions extends OrderBookCommonOptions {
|
|
|
510
510
|
contrast?: number;
|
|
511
511
|
/** Size drawn with the hottest color; follows the data when omitted */
|
|
512
512
|
maxSize?: number;
|
|
513
|
-
/**
|
|
513
|
+
/**
|
|
514
|
+
* Color ramp, coldest first, interpolated in OKLab after the floor color
|
|
515
|
+
* (the background, a shade darker in dark themes, shown where there is no
|
|
516
|
+
* liquidity); a perceptual heat ramp suited to the theme when omitted
|
|
517
|
+
*/
|
|
514
518
|
colors?: readonly string[];
|
|
515
519
|
/**
|
|
516
520
|
* Trades drawn as bubbles sized by volume (buys / sells colors)
|
|
@@ -549,6 +553,12 @@ export interface OrderBookHeatmapOptions extends OrderBookCommonOptions {
|
|
|
549
553
|
* @default "auto"
|
|
550
554
|
*/
|
|
551
555
|
renderer?: ChartRendererPreference;
|
|
556
|
+
/**
|
|
557
|
+
* Clock of the time axis and the tooltip: the local time or UTC (the
|
|
558
|
+
* clock of most exchanges)
|
|
559
|
+
* @default "local"
|
|
560
|
+
*/
|
|
561
|
+
timeZone?: ChartTimeZone;
|
|
552
562
|
/**
|
|
553
563
|
* Overrides of the built-in texts, which follow `locale` (English,
|
|
554
564
|
* Chinese, Japanese and French built in)
|
|
@@ -686,6 +696,12 @@ export interface TimeAndSalesOptions extends OrderBookCommonOptions {
|
|
|
686
696
|
* @default true
|
|
687
697
|
*/
|
|
688
698
|
milliseconds?: boolean;
|
|
699
|
+
/**
|
|
700
|
+
* Clock of the default time format: the local time or UTC (the clock of
|
|
701
|
+
* most exchanges)
|
|
702
|
+
* @default "local"
|
|
703
|
+
*/
|
|
704
|
+
timeZone?: ChartTimeZone;
|
|
689
705
|
/** Formats the time of a trade (replaces the default `HH:MM:SS.mmm`) */
|
|
690
706
|
formatTime?: (time: number) => string;
|
|
691
707
|
/**
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("./color.cjs"),t=require("./layout.cjs");var n=(e,t=e.fontSize,n=400)=>`${n} ${t}px ${e.fontFamily}`,r=e=>Math.round(e)+.5,i=(e,n,r,i)=>{let{plot:a}=n,o=t.toScreen(n,e.x??0,e.y??0),s=n.horizontal?{x:e.y===void 0,y:e.x===void 0}:{x:e.x===void 0,y:e.y===void 0},c=s.x?a.x+a.width/2:o.x,l=s.y?a.y+a.height/2:o.y,u=c-r/2,d=l-i/2;return e.anchor===`top`?d=l+6:e.anchor===`bottom`?d=l-6-i:e.anchor===`left`?u=c+6:e.anchor===`right`&&(u=c-6-r),u=Math.max(a.x+6,Math.min(u,a.x+a.width-6-r)),d=Math.max(a.y+2,Math.min(d,a.y+a.height-2-i)),{x:u,y:d,width:r,height:i}},a=(e,n)=>{let{plot:r}=n,[i,a]=n.horizontal?[r.y,r.y+r.height]:[r.x,r.x+r.width],[o,s]=n.horizontal?[r.x,r.x+r.width]:[r.y,r.y+r.height],c=(e,t,n)=>e<t?t:e>n?n:e;return t.screenRect(n,c(n.xToPx(e.x0??-1/0),i,a),c(n.xToPx(e.x1??1/0),i,a),c(n.yToPx(e.y0??-1/0),o,s),c(n.yToPx(e.y1??1/0),o,s))},o=(e,t)=>({vertical:e.axis===`x`!==t.horizontal,at:e.axis===`x`?t.xToPx(e.value):t.yToPx(e.value)}),s=(t,i)=>{let{scales:o,theme:s,xTicks:c,yTicks:l}=i,{plot:u}=o,d=o.horizontal?i.y:i.x,f=o.horizontal?i.x:i.y,p=o.horizontal?l:c,m=o.horizontal?c:l,h=o.horizontal?o.yToPx:o.xToPx,g=o.horizontal?o.xToPx:o.yToPx;t.clearRect(0,0,i.width,i.height),t.save(),t.beginPath(),t.rect(u.x,u.y,u.width,u.height),t.clip();for(let n of i.annotations){if(n.type!==`rect`)continue;let r=a(n,o);r.width<=0||r.height<=0||(t.fillStyle=e.toCss(n.color,n.opacity),t.fillRect(r.x,r.y,r.width,r.height))}if(t.restore(),t.lineWidth=1,t.strokeStyle=e.toCss(s.grid),t.beginPath(),f.grid)for(let e of m.values){let n=r(g(e));n<u.y-1||n>u.y+u.height+1||(t.moveTo(u.x,n),t.lineTo(u.x+u.width,n))}if(d.grid)for(let e of p.values){let n=r(h(e));n<u.x-1||n>u.x+u.width+1||(t.moveTo(n,u.y),t.lineTo(n,u.y+u.height))}t.stroke();let _=Math.ceil(s.fontSize*1.4);if(t.font=n(s),t.fillStyle=e.toCss(s.textMuted),d.visible){t.strokeStyle=e.toCss(s.axis),t.beginPath();let a=r(u.y+u.height);t.moveTo(u.x,a),t.lineTo(u.x+u.width,a),t.stroke(),t.textBaseline=`top`,t.textAlign=`center`;let o=-1/0,c=p.values.map((e,t)=>({px:h(e),text:p.labels[t]})).sort((e,t)=>e.px-t.px);for(let{px:e,text:n}of c){if(e<u.x-.5||e>u.x+u.width+.5)continue;let r=t.measureText(n).width,a=Math.max(0,Math.min(i.width-r,e-r/2));a<o+6||(o=a+r,t.fillText(n,a+r/2,u.y+u.height+7))}d.title&&(t.font=n(s,s.fontSize+1,500),t.fillStyle=e.toCss(s.text,.8),t.fillText(d.title,u.x+u.width/2,u.y+u.height+_+10))}if(f.visible){t.font=n(s),t.fillStyle=e.toCss(s.textMuted),t.textAlign=`right`,t.textBaseline=`middle`;let r=-1/0,i=m.values.map((e,t)=>({py:g(e),text:m.labels[t]})).sort((e,t)=>e.py-t.py),a=s.fontSize+2;for(let{py:e,text:n}of i)if(!(e<u.y-.5||e>u.y+u.height+.5)){if(o.horizontal){if(e-a/2<r)continue;r=e+a/2}t.fillText(n,u.x-8,e)}f.title&&(t.save(),t.font=n(s,s.fontSize+1,500),t.fillStyle=e.toCss(s.text,.8),t.translate(_/2+4,u.y+u.height/2),t.rotate(-Math.PI/2),t.textAlign=`center`,t.fillText(f.title,0,0),t.restore())}let v=o.horizontal?null:i.y2,y=i.y2Ticks;if(v&&y&&v.visible){let r=u.x+u.width;t.font=n(s),t.fillStyle=e.toCss(s.textMuted),t.textAlign=`left`,t.textBaseline=`middle`,y.values.forEach((e,n)=>{let i=o.yToPx(e);i<u.y-.5||i>u.y+u.height+.5||t.fillText(y.labels[n],r+8,i)}),v.title&&(t.save(),t.font=n(s,s.fontSize+1,500),t.fillStyle=e.toCss(s.text,.8),t.translate(i.width-_/2-4,u.y+u.height/2),t.rotate(Math.PI/2),t.textAlign=`center`,t.fillText(v.title,0,0),t.restore())}},c=(e,t)=>e.x<t.x+t.width&&t.x<e.x+e.width&&e.y<t.y+t.height&&t.y<e.y+e.height,l=(e,t)=>e.x>=t.x&&e.y>=t.y&&e.x+e.width<=t.x+t.width&&e.y+e.height<=t.y+t.height,u=(e,t,n,r,i,a)=>{e.lineWidth=3,e.lineJoin=`round`,e.strokeStyle=a,e.strokeText(t,n,r),e.fillStyle=i,e.fillText(t,n,r)},d=(e,t,n,r,i=[])=>{let a=[];for(let o of e){let e=n(o.text),s=o.r+4,u={x:o.x-e/2,y:o.y-s-r,width:e,height:r},d={x:o.x-e/2,y:o.y+s,width:e,height:r},f={x:o.x+s,y:o.y-r/2,width:e,height:r},p={x:o.x-s-e,y:o.y-r/2,width:e,height:r},m=(o.placement===`above`?[u]:o.placement===`below`?[d]:o.placement===`right`?[f,p]:o.placement===`left`?[p,f]:[{x:o.x+s,y:o.y-r/2,width:e,height:r},{x:o.x-s-e,y:o.y-r/2,width:e,height:r},u,d]).find(e=>l(e,t)&&!i.some(t=>c(t,e)));m&&(i.push(m),a.push({label:o,box:m}))}return a},f=(t,s)=>{let{scales:c,theme:l}=s,{plot:f}=c;s.clear!==!1&&t.clearRect(0,0,s.width,s.height),t.save(),t.beginPath(),t.rect(f.x,f.y,f.width,f.height),t.clip();let p=e.toCss(l.background,.9),m=[],h=l.fontSize+4;for(let i of s.annotations){if(i.type!==`line`)continue;let a=e.toCss(i.color);t.strokeStyle=a,t.lineWidth=i.width,t.setLineDash(i.dash),t.beginPath();let s=o(i,c);if(s.vertical){let e=r(s.at);t.moveTo(e,f.y),t.lineTo(e,f.y+f.height),t.stroke(),i.label&&(t.setLineDash([]),t.font=n(l,l.fontSize,500),t.textAlign=`left`,t.textBaseline=`top`,u(t,i.label,e+5,f.y+5,a,p))}else{let e=r(s.at);t.moveTo(f.x,e),t.lineTo(f.x+f.width,e),t.stroke(),i.label&&(t.setLineDash([]),t.font=n(l,l.fontSize,500),t.textAlign=`right`,t.textBaseline=`bottom`,u(t,i.label,f.x+f.width-6,e-3,a,p))}}t.setLineDash([]),t.font=n(l,l.fontSize+1,600);for(let n of s.annotations){if(n.type!==`rect`||!n.label)continue;let r=a(n,c);if(r.width<=0||r.height<=0)continue;let i=t.measureText(n.label).width,o=n.labelPosition,s=o.endsWith(`left`)?r.x+10:o.endsWith(`right`)?r.x+r.width-10-i:r.x+(r.width-i)/2,l=o.startsWith(`top`)?r.y+10:o.startsWith(`bottom`)?r.y+r.height-10-h:r.y+(r.height-h)/2;t.textAlign=`left`,t.textBaseline=`top`,t.fillStyle=e.toCss(n.labelColor),t.fillText(n.label,s,l),m.push({x:s,y:l,width:i,height:h})}for(let r of s.annotations){if(r.type!==`text`||!r.text)continue;t.font=n(l,l.fontSize,r.weight);let a=i(r,c,t.measureText(r.text).width,h);t.textAlign=`left`,t.textBaseline=`middle`,u(t,r.text,a.x,a.y+a.height/2,e.toCss(r.color),p),m.push(a)}if(s.pointLabels.length){t.font=n(l),t.textAlign=`left`,t.textBaseline=`middle`;let r=e.toCss(l.text,.85),i=d(s.pointLabels,f,e=>t.measureText(e).width,h-2,m);for(let{label:e,box:n}of i)u(t,e.text,n.x,n.y+n.height/2,r,p)}t.restore()};exports.drawBackground=s,exports.drawForeground=f,exports.font=n,exports.lineOf=o,exports.placeLabels=d,exports.rectOf=a,exports.textBox=i;
|
|
1
|
+
const e=require("./color.cjs"),t=require("./layout.cjs");var n=(e,t=e.fontSize,n=400)=>`${n} ${t}px ${e.fontFamily}`,r=e=>Math.round(e)+.5,i=(e,n,r,i)=>{let{plot:a}=n,o=t.toScreen(n,e.x??0,e.y??0),s=n.horizontal?{x:e.y===void 0,y:e.x===void 0}:{x:e.x===void 0,y:e.y===void 0},c=s.x?a.x+a.width/2:o.x,l=s.y?a.y+a.height/2:o.y,u=c-r/2,d=l-i/2;return e.anchor===`top`?d=l+6:e.anchor===`bottom`?d=l-6-i:e.anchor===`left`?u=c+6:e.anchor===`right`&&(u=c-6-r),u=Math.max(a.x+6,Math.min(u,a.x+a.width-6-r)),d=Math.max(a.y+2,Math.min(d,a.y+a.height-2-i)),{x:u,y:d,width:r,height:i}},a=(e,n)=>{let{plot:r}=n,[i,a]=n.horizontal?[r.y,r.y+r.height]:[r.x,r.x+r.width],[o,s]=n.horizontal?[r.x,r.x+r.width]:[r.y,r.y+r.height],c=(e,t,n)=>e<t?t:e>n?n:e;return t.screenRect(n,c(n.xToPx(e.x0??-1/0),i,a),c(n.xToPx(e.x1??1/0),i,a),c(n.yToPx(e.y0??-1/0),o,s),c(n.yToPx(e.y1??1/0),o,s))},o=(e,t)=>({vertical:e.axis===`x`!==t.horizontal,at:e.axis===`x`?t.xToPx(e.value):t.yToPx(e.value)}),s=(t,i)=>{let{scales:o,theme:s,xTicks:c,yTicks:l}=i,{plot:u}=o,d=o.horizontal?i.y:i.x,f=o.horizontal?i.x:i.y,p=o.horizontal?l:c,m=o.horizontal?c:l,h=o.horizontal?o.yToPx:o.xToPx,g=o.horizontal?o.xToPx:o.yToPx;t.clearRect(0,0,i.width,i.height),t.save(),t.beginPath(),t.rect(u.x,u.y,u.width,u.height),t.clip();for(let n of i.annotations){if(n.type!==`rect`)continue;let r=a(n,o);r.width<=0||r.height<=0||(t.fillStyle=e.toCss(n.color,n.opacity),t.fillRect(r.x,r.y,r.width,r.height))}if(t.restore(),t.lineWidth=1,t.strokeStyle=e.toCss(s.grid),t.beginPath(),f.grid)for(let e of m.values){let n=r(g(e));n<u.y-1||n>u.y+u.height+1||(t.moveTo(u.x,n),t.lineTo(u.x+u.width,n))}if(d.grid)for(let e of p.values){let n=r(h(e));n<u.x-1||n>u.x+u.width+1||(t.moveTo(n,u.y),t.lineTo(n,u.y+u.height))}t.stroke();let _=Math.ceil(s.fontSize*1.4);if(t.font=n(s),t.fillStyle=e.toCss(s.textMuted),d.visible){t.strokeStyle=e.toCss(s.axis),t.beginPath();let a=r(u.y+u.height);t.moveTo(u.x,a),t.lineTo(u.x+u.width,a),t.stroke(),t.textBaseline=`top`,t.textAlign=`center`;let o=-1/0,c=p.values.map((e,t)=>({px:h(e),text:p.labels[t]})).sort((e,t)=>e.px-t.px);for(let{px:e,text:n}of c){if(e<u.x-.5||e>u.x+u.width+.5)continue;let r=t.measureText(n).width,a=Math.max(0,Math.min(i.width-r,e-r/2));a<o+6||(o=a+r,t.fillText(n,a+r/2,u.y+u.height+7))}d.title&&(t.font=n(s,s.fontSize+1,500),t.fillStyle=e.toCss(s.text,.8),t.fillText(d.title,u.x+u.width/2,u.y+u.height+_+10))}if(f.visible){t.font=n(s),t.fillStyle=e.toCss(s.textMuted),t.textAlign=`right`,t.textBaseline=`middle`;let r=-1/0,i=m.values.map((e,t)=>({py:g(e),text:m.labels[t]})).sort((e,t)=>e.py-t.py),a=s.fontSize+2;for(let{py:e,text:n}of i)if(!(e<u.y-.5||e>u.y+u.height+.5)){if(o.horizontal){if(e-a/2<r)continue;r=e+a/2}t.fillText(n,u.x-8,e)}f.title&&(t.save(),t.font=n(s,s.fontSize+1,500),t.fillStyle=e.toCss(s.text,.8),t.translate(_/2+4,u.y+u.height/2),t.rotate(-Math.PI/2),t.textAlign=`center`,t.fillText(f.title,0,0),t.restore())}let v=o.horizontal?null:i.y2,y=i.y2Ticks;if(v&&y&&v.visible){let r=u.x+u.width;t.font=n(s),t.fillStyle=e.toCss(s.textMuted),t.textAlign=`left`,t.textBaseline=`middle`,y.values.forEach((e,n)=>{let i=o.yToPx(e);i<u.y-.5||i>u.y+u.height+.5||t.fillText(y.labels[n],r+8,i)}),v.title&&(t.save(),t.font=n(s,s.fontSize+1,500),t.fillStyle=e.toCss(s.text,.8),t.translate(i.width-_/2-4,u.y+u.height/2),t.rotate(Math.PI/2),t.textAlign=`center`,t.fillText(v.title,0,0),t.restore())}},c=(e,t)=>e.x<t.x+t.width&&t.x<e.x+e.width&&e.y<t.y+t.height&&t.y<e.y+e.height,l=(e,t)=>e.x>=t.x&&e.y>=t.y&&e.x+e.width<=t.x+t.width&&e.y+e.height<=t.y+t.height,u=(e,t,n,r,i,a)=>{e.lineWidth=3,e.lineJoin=`round`,e.strokeStyle=a,e.strokeText(t,n,r),e.fillStyle=i,e.fillText(t,n,r)},d=(e,t,n,r,i=[])=>{let a=[];for(let o of e){let e=n(o.text),s=o.r+4,u={x:o.x-e/2,y:o.y-s-r,width:e,height:r},d={x:o.x-e/2,y:o.y+s,width:e,height:r},f={x:o.x+s,y:o.y-r/2,width:e,height:r},p={x:o.x-s-e,y:o.y-r/2,width:e,height:r},m=(o.placement===`above`?[u]:o.placement===`below`?[d]:o.placement===`right`?[f,p]:o.placement===`left`?[p,f]:[{x:o.x+s,y:o.y-r/2,width:e,height:r},{x:o.x-s-e,y:o.y-r/2,width:e,height:r},u,d]).find(e=>l(e,t)&&!i.some(t=>c(t,e)));m&&(i.push(m),a.push({label:o,box:m}))}return a},f=(t,s)=>{let{scales:c,theme:l}=s,{plot:f}=c;s.clear!==!1&&t.clearRect(0,0,s.width,s.height),t.save(),t.beginPath(),t.rect(f.x,f.y,f.width,f.height),t.clip();for(let e of s.connectors??[]){t.strokeStyle=e.color,t.lineWidth=e.width,t.setLineDash([...e.dash]),t.beginPath();let n=e.y0===e.y1,i=n?e.x0:r(e.x0),a=n?r(e.y0):e.y0;t.moveTo(i,a),t.lineTo(n?e.x1:i,n?a:e.y1),t.stroke()}t.setLineDash([]);let p=e.toCss(l.background,.9),m=[],h=l.fontSize+4;for(let i of s.annotations){if(i.type!==`line`)continue;let a=e.toCss(i.color);t.strokeStyle=a,t.lineWidth=i.width,t.setLineDash(i.dash),t.beginPath();let s=o(i,c);if(s.vertical){let e=r(s.at);t.moveTo(e,f.y),t.lineTo(e,f.y+f.height),t.stroke(),i.label&&(t.setLineDash([]),t.font=n(l,l.fontSize,500),t.textAlign=`left`,t.textBaseline=`top`,u(t,i.label,e+5,f.y+5,a,p))}else{let e=r(s.at);t.moveTo(f.x,e),t.lineTo(f.x+f.width,e),t.stroke(),i.label&&(t.setLineDash([]),t.font=n(l,l.fontSize,500),t.textAlign=`right`,t.textBaseline=`bottom`,u(t,i.label,f.x+f.width-6,e-3,a,p))}}t.setLineDash([]),t.font=n(l,l.fontSize+1,600);for(let n of s.annotations){if(n.type!==`rect`||!n.label)continue;let r=a(n,c);if(r.width<=0||r.height<=0)continue;let i=t.measureText(n.label).width,o=n.labelPosition,s=o.endsWith(`left`)?r.x+10:o.endsWith(`right`)?r.x+r.width-10-i:r.x+(r.width-i)/2,l=o.startsWith(`top`)?r.y+10:o.startsWith(`bottom`)?r.y+r.height-10-h:r.y+(r.height-h)/2;t.textAlign=`left`,t.textBaseline=`top`,t.fillStyle=e.toCss(n.labelColor),t.fillText(n.label,s,l),m.push({x:s,y:l,width:i,height:h})}for(let r of s.annotations){if(r.type!==`text`||!r.text)continue;t.font=n(l,l.fontSize,r.weight);let a=i(r,c,t.measureText(r.text).width,h);t.textAlign=`left`,t.textBaseline=`middle`,u(t,r.text,a.x,a.y+a.height/2,e.toCss(r.color),p),m.push(a)}if(s.pointLabels.length){t.font=n(l),t.textAlign=`left`,t.textBaseline=`middle`;let r=e.toCss(l.text,.85),i=d(s.pointLabels,f,e=>t.measureText(e).width,h-2,m);for(let{label:e,box:n}of i)u(t,e.text,n.x,n.y+n.height/2,r,p)}t.restore()};exports.drawBackground=s,exports.drawForeground=f,exports.font=n,exports.lineOf=o,exports.placeLabels=d,exports.rectOf=a,exports.textBox=i;
|
|
2
2
|
//# sourceMappingURL=overlay.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overlay.cjs","names":["toScreen","screenRect","toCss","require_color","require_layout","font","theme","weight","size","crisp","v","textBox","s","at","a","free","px","plot","py","x","width","y","height","rectOf","xLo","xHi","yLo","yHi","along","lo","hi","lineOf","drawBackground","input","scales","bottomTicks","yTicks","xTicks","leftTicks","bottomPx","leftPx","ctx","line","base","lastRight","order","i","b","w","text","left","lastBottom","rows","rowHeight","y2","y2Ticks","right","overlaps","inside","r","haloText","halo","color","placeLabels","placed","label","labels","measure","gap","above","below","box","c","occupied","o","drawForeground","labelHeight","where","pos","tx","ty","textColor","t"],"sources":["../../../../charts/src/engine/overlay.ts"],"sourcesContent":["// Canvas2D layers around the data: background (areas, grid, axes, tick\n// labels) and foreground (reference lines, annotation and point labels).\n\nimport { toCss, type Rgba } from \"./color\";\nimport type { AxisTicks } from \"./axis\";\nimport { screenRect, toScreen, type Rect, type Scales } from \"./layout\";\nimport type { AxisModel } from \"./model\";\nimport type { ChartTheme } from \"./theme\";\nimport type { ChartLabelPosition } from \"./types\";\n\nexport interface ResolvedRect {\n type: \"rect\";\n x0?: number;\n x1?: number;\n y0?: number;\n y1?: number;\n color: Rgba;\n opacity: number;\n label?: string;\n labelPosition: ChartLabelPosition;\n labelColor: Rgba;\n}\n\nexport interface ResolvedLine {\n type: \"line\";\n axis: \"x\" | \"y\";\n value: number;\n color: Rgba;\n width: number;\n dash: number[];\n label?: string;\n}\n\nexport interface ResolvedText {\n type: \"text\";\n x?: number;\n y?: number;\n text: string;\n anchor: \"center\" | \"top\" | \"bottom\" | \"left\" | \"right\";\n color: Rgba;\n weight: number;\n}\n\nexport type ResolvedAnnotation = ResolvedRect | ResolvedLine | ResolvedText;\n\nexport interface PointLabel {\n x: number;\n y: number;\n /** Radius of the dot */\n r: number;\n text: string;\n /**\n * Fixed side (bar values: above / below, left / right of horizontal\n * bars); any free side around the dot otherwise\n */\n placement?: \"above\" | \"below\" | \"left\" | \"right\";\n}\n\nexport const font = (theme: ChartTheme, size = theme.fontSize, weight = 400) =>\n `${weight} ${size}px ${theme.fontFamily}`;\n\nconst crisp = (v: number) => Math.round(v) + 0.5;\n\n/** Box of a text annotation, kept inside the plot */\nexport const textBox = (\n a: ResolvedText,\n s: Scales,\n width: number,\n height: number,\n): Rect => {\n const { plot } = s;\n const at = toScreen(s, a.x ?? 0, a.y ?? 0);\n const free = s.horizontal\n ? { x: a.y === undefined, y: a.x === undefined }\n : { x: a.x === undefined, y: a.y === undefined };\n const px = free.x ? plot.x + plot.width / 2 : at.x;\n const py = free.y ? plot.y + plot.height / 2 : at.y;\n const gap = 6;\n let x = px - width / 2;\n let y = py - height / 2;\n if (a.anchor === \"top\") y = py + gap;\n else if (a.anchor === \"bottom\") y = py - gap - height;\n else if (a.anchor === \"left\") x = px + gap;\n else if (a.anchor === \"right\") x = px - gap - width;\n x = Math.max(plot.x + gap, Math.min(x, plot.x + plot.width - gap - width));\n y = Math.max(plot.y + 2, Math.min(y, plot.y + plot.height - 2 - height));\n return { x, y, width, height };\n};\n\n/** Screen box of an area annotation, clipped to the plot */\nexport const rectOf = (a: ResolvedRect, s: Scales): Rect => {\n const { plot } = s;\n // clamp every edge to the plot first: an open edge maps to ±Infinity and\n // `Infinity - Infinity` would make the size NaN (nothing drawn)\n const [xLo, xHi] = s.horizontal\n ? [plot.y, plot.y + plot.height]\n : [plot.x, plot.x + plot.width];\n const [yLo, yHi] = s.horizontal\n ? [plot.x, plot.x + plot.width]\n : [plot.y, plot.y + plot.height];\n const along = (px: number, lo: number, hi: number) =>\n px < lo ? lo : px > hi ? hi : px;\n return screenRect(\n s,\n along(s.xToPx(a.x0 ?? -Infinity), xLo, xHi),\n along(s.xToPx(a.x1 ?? Infinity), xLo, xHi),\n along(s.yToPx(a.y0 ?? -Infinity), yLo, yHi),\n along(s.yToPx(a.y1 ?? Infinity), yLo, yHi),\n );\n};\n\n/**\n * Where a reference line goes: `vertical` lines run at screen x `at`,\n * horizontal ones at screen y `at`\n */\nexport const lineOf = (\n a: ResolvedLine,\n s: Scales,\n): { vertical: boolean; at: number } => {\n const vertical = (a.axis === \"x\") !== s.horizontal;\n return {\n vertical,\n at: a.axis === \"x\" ? s.xToPx(a.value) : s.yToPx(a.value),\n };\n};\n\nexport interface BackgroundInput {\n width: number;\n height: number;\n scales: Scales;\n x: AxisModel;\n y: AxisModel;\n xTicks: AxisTicks;\n yTicks: AxisTicks;\n /** Right axis (dual axis charts) */\n y2?: AxisModel | null;\n y2Ticks?: AxisTicks | null;\n theme: ChartTheme;\n annotations: readonly ResolvedAnnotation[];\n}\n\nexport const drawBackground = (\n ctx: CanvasRenderingContext2D,\n input: BackgroundInput,\n) => {\n const { scales, theme, xTicks, yTicks } = input;\n const { plot } = scales;\n // horizontal charts: the value axis along the bottom, the x axis on the left\n const x = scales.horizontal ? input.y : input.x;\n const y = scales.horizontal ? input.x : input.y;\n const bottomTicks = scales.horizontal ? yTicks : xTicks;\n const leftTicks = scales.horizontal ? xTicks : yTicks;\n const bottomPx = scales.horizontal ? scales.yToPx : scales.xToPx;\n const leftPx = scales.horizontal ? scales.xToPx : scales.yToPx;\n ctx.clearRect(0, 0, input.width, input.height);\n\n // areas\n ctx.save();\n ctx.beginPath();\n ctx.rect(plot.x, plot.y, plot.width, plot.height);\n ctx.clip();\n for (const a of input.annotations) {\n if (a.type !== \"rect\") continue;\n const r = rectOf(a, scales);\n if (r.width <= 0 || r.height <= 0) continue;\n ctx.fillStyle = toCss(a.color, a.opacity);\n ctx.fillRect(r.x, r.y, r.width, r.height);\n }\n ctx.restore();\n\n // grid\n ctx.lineWidth = 1;\n ctx.strokeStyle = toCss(theme.grid);\n ctx.beginPath();\n if (y.grid) {\n for (const v of leftTicks.values) {\n const py = crisp(leftPx(v));\n if (py < plot.y - 1 || py > plot.y + plot.height + 1) continue;\n ctx.moveTo(plot.x, py);\n ctx.lineTo(plot.x + plot.width, py);\n }\n }\n if (x.grid) {\n for (const v of bottomTicks.values) {\n const px = crisp(bottomPx(v));\n if (px < plot.x - 1 || px > plot.x + plot.width + 1) continue;\n ctx.moveTo(px, plot.y);\n ctx.lineTo(px, plot.y + plot.height);\n }\n }\n ctx.stroke();\n\n const line = Math.ceil(theme.fontSize * 1.4);\n ctx.font = font(theme);\n ctx.fillStyle = toCss(theme.textMuted);\n\n // x axis\n if (x.visible) {\n ctx.strokeStyle = toCss(theme.axis);\n ctx.beginPath();\n const base = crisp(plot.y + plot.height);\n ctx.moveTo(plot.x, base);\n ctx.lineTo(plot.x + plot.width, base);\n ctx.stroke();\n ctx.textBaseline = \"top\";\n ctx.textAlign = \"center\";\n let lastRight = -Infinity;\n // left to right (reversed axes list their ticks right to left)\n const order = bottomTicks.values\n .map((v, i) => ({ px: bottomPx(v), text: bottomTicks.labels[i] }))\n .sort((a, b) => a.px - b.px);\n for (const { px, text } of order) {\n if (px < plot.x - 0.5 || px > plot.x + plot.width + 0.5) continue;\n const w = ctx.measureText(text).width;\n const left = Math.max(0, Math.min(input.width - w, px - w / 2));\n if (left < lastRight + 6) continue;\n lastRight = left + w;\n ctx.fillText(text, left + w / 2, plot.y + plot.height + 7);\n }\n if (x.title) {\n ctx.font = font(theme, theme.fontSize + 1, 500);\n ctx.fillStyle = toCss(theme.text, 0.8);\n ctx.fillText(\n x.title,\n plot.x + plot.width / 2,\n plot.y + plot.height + line + 10,\n );\n }\n }\n\n // y axis\n if (y.visible) {\n ctx.font = font(theme);\n ctx.fillStyle = toCss(theme.textMuted);\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"middle\";\n let lastBottom = -Infinity;\n // top to bottom: category rows of horizontal charts never overlap\n const rows = leftTicks.values\n .map((v, i) => ({ py: leftPx(v), text: leftTicks.labels[i] }))\n .sort((a, b) => a.py - b.py);\n const rowHeight = theme.fontSize + 2;\n for (const { py, text } of rows) {\n if (py < plot.y - 0.5 || py > plot.y + plot.height + 0.5) continue;\n if (scales.horizontal) {\n if (py - rowHeight / 2 < lastBottom) continue;\n lastBottom = py + rowHeight / 2;\n }\n ctx.fillText(text, plot.x - 8, py);\n }\n if (y.title) {\n ctx.save();\n ctx.font = font(theme, theme.fontSize + 1, 500);\n ctx.fillStyle = toCss(theme.text, 0.8);\n ctx.translate(line / 2 + 4, plot.y + plot.height / 2);\n ctx.rotate(-Math.PI / 2);\n ctx.textAlign = \"center\";\n ctx.fillText(y.title, 0, 0);\n ctx.restore();\n }\n }\n\n // right axis\n const y2 = scales.horizontal ? null : input.y2;\n const y2Ticks = input.y2Ticks;\n if (y2 && y2Ticks && y2.visible) {\n const right = plot.x + plot.width;\n ctx.font = font(theme);\n ctx.fillStyle = toCss(theme.textMuted);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n y2Ticks.values.forEach((v, i) => {\n const py = scales.yToPx(v);\n if (py < plot.y - 0.5 || py > plot.y + plot.height + 0.5) return;\n ctx.fillText(y2Ticks.labels[i], right + 8, py);\n });\n if (y2.title) {\n ctx.save();\n ctx.font = font(theme, theme.fontSize + 1, 500);\n ctx.fillStyle = toCss(theme.text, 0.8);\n ctx.translate(input.width - line / 2 - 4, plot.y + plot.height / 2);\n ctx.rotate(Math.PI / 2);\n ctx.textAlign = \"center\";\n ctx.fillText(y2.title, 0, 0);\n ctx.restore();\n }\n }\n};\n\nconst overlaps = (a: Rect, b: Rect) =>\n a.x < b.x + b.width &&\n b.x < a.x + a.width &&\n a.y < b.y + b.height &&\n b.y < a.y + a.height;\n\nconst inside = (r: Rect, plot: Rect) =>\n r.x >= plot.x &&\n r.y >= plot.y &&\n r.x + r.width <= plot.x + plot.width &&\n r.y + r.height <= plot.y + plot.height;\n\n/** Text with a halo in the background color (readable over data) */\nconst haloText = (\n ctx: CanvasRenderingContext2D,\n text: string,\n x: number,\n y: number,\n color: string,\n halo: string,\n) => {\n ctx.lineWidth = 3;\n ctx.lineJoin = \"round\";\n ctx.strokeStyle = halo;\n ctx.strokeText(text, x, y);\n ctx.fillStyle = color;\n ctx.fillText(text, x, y);\n};\n\n/** Greedy placement: right, left, above, below the dot; skipped when no slot is free */\nexport const placeLabels = (\n labels: readonly PointLabel[],\n plot: Rect,\n measure: (text: string) => number,\n height: number,\n occupied: Rect[] = [],\n): { label: PointLabel; box: Rect }[] => {\n const placed: { label: PointLabel; box: Rect }[] = [];\n for (const label of labels) {\n const w = measure(label.text);\n const gap = label.r + 4;\n const above = {\n x: label.x - w / 2,\n y: label.y - gap - height,\n width: w,\n height,\n };\n const below = { x: label.x - w / 2, y: label.y + gap, width: w, height };\n const right = {\n x: label.x + gap,\n y: label.y - height / 2,\n width: w,\n height,\n };\n const left = {\n x: label.x - gap - w,\n y: label.y - height / 2,\n width: w,\n height,\n };\n const candidates: Rect[] =\n label.placement === \"above\"\n ? [above]\n : label.placement === \"below\"\n ? [below]\n : label.placement === \"right\"\n ? [right, left]\n : label.placement === \"left\"\n ? [left, right]\n : [\n {\n x: label.x + gap,\n y: label.y - height / 2,\n width: w,\n height,\n },\n {\n x: label.x - gap - w,\n y: label.y - height / 2,\n width: w,\n height,\n },\n above,\n below,\n ];\n const box = candidates.find(\n (c) => inside(c, plot) && !occupied.some((o) => overlaps(o, c)),\n );\n if (!box) continue;\n occupied.push(box);\n placed.push({ label, box });\n }\n return placed;\n};\n\nexport interface ForegroundInput {\n width: number;\n height: number;\n scales: Scales;\n theme: ChartTheme;\n annotations: readonly ResolvedAnnotation[];\n pointLabels: readonly PointLabel[];\n /**\n * Clears the canvas first (off when the layers share one canvas)\n * @default true\n */\n clear?: boolean;\n}\n\nexport const drawForeground = (\n ctx: CanvasRenderingContext2D,\n input: ForegroundInput,\n) => {\n const { scales, theme } = input;\n const { plot } = scales;\n if (input.clear !== false) ctx.clearRect(0, 0, input.width, input.height);\n ctx.save();\n ctx.beginPath();\n ctx.rect(plot.x, plot.y, plot.width, plot.height);\n ctx.clip();\n\n const halo = toCss(theme.background, 0.9);\n const occupied: Rect[] = [];\n const labelHeight = theme.fontSize + 4;\n\n for (const a of input.annotations) {\n if (a.type !== \"line\") continue;\n const color = toCss(a.color);\n ctx.strokeStyle = color;\n ctx.lineWidth = a.width;\n ctx.setLineDash(a.dash);\n ctx.beginPath();\n const where = lineOf(a, scales);\n if (!where.vertical) {\n const py = crisp(where.at);\n ctx.moveTo(plot.x, py);\n ctx.lineTo(plot.x + plot.width, py);\n ctx.stroke();\n if (a.label) {\n ctx.setLineDash([]);\n ctx.font = font(theme, theme.fontSize, 500);\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"bottom\";\n haloText(ctx, a.label, plot.x + plot.width - 6, py - 3, color, halo);\n }\n } else {\n const px = crisp(where.at);\n ctx.moveTo(px, plot.y);\n ctx.lineTo(px, plot.y + plot.height);\n ctx.stroke();\n if (a.label) {\n ctx.setLineDash([]);\n ctx.font = font(theme, theme.fontSize, 500);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"top\";\n haloText(ctx, a.label, px + 5, plot.y + 5, color, halo);\n }\n }\n }\n ctx.setLineDash([]);\n\n // labels of areas\n ctx.font = font(theme, theme.fontSize + 1, 600);\n for (const a of input.annotations) {\n if (a.type !== \"rect\" || !a.label) continue;\n const r = rectOf(a, scales);\n if (r.width <= 0 || r.height <= 0) continue;\n const pad = 10;\n const w = ctx.measureText(a.label).width;\n const pos = a.labelPosition;\n const tx = pos.endsWith(\"left\")\n ? r.x + pad\n : pos.endsWith(\"right\")\n ? r.x + r.width - pad - w\n : r.x + (r.width - w) / 2;\n const ty = pos.startsWith(\"top\")\n ? r.y + pad\n : pos.startsWith(\"bottom\")\n ? r.y + r.height - pad - labelHeight\n : r.y + (r.height - labelHeight) / 2;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"top\";\n ctx.fillStyle = toCss(a.labelColor);\n ctx.fillText(a.label, tx, ty);\n occupied.push({ x: tx, y: ty, width: w, height: labelHeight });\n }\n\n // free texts\n for (const a of input.annotations) {\n if (a.type !== \"text\" || !a.text) continue;\n ctx.font = font(theme, theme.fontSize, a.weight);\n const box = textBox(a, scales, ctx.measureText(a.text).width, labelHeight);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n haloText(ctx, a.text, box.x, box.y + box.height / 2, toCss(a.color), halo);\n occupied.push(box);\n }\n\n // point labels\n if (input.pointLabels.length) {\n ctx.font = font(theme);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n const textColor = toCss(theme.text, 0.85);\n const placed = placeLabels(\n input.pointLabels,\n plot,\n (t) => ctx.measureText(t).width,\n labelHeight - 2,\n occupied,\n );\n for (const { label, box } of placed) {\n haloText(ctx, label.text, box.x, box.y + box.height / 2, textColor, halo);\n }\n }\n ctx.restore();\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"overlay.cjs","names":["toScreen","screenRect","toCss","require_color","require_layout","font","theme","weight","size","crisp","v","textBox","s","at","a","free","px","plot","py","x","width","y","height","rectOf","xLo","xHi","yLo","yHi","along","lo","hi","lineOf","drawBackground","input","scales","bottomTicks","yTicks","xTicks","leftTicks","bottomPx","leftPx","ctx","line","base","lastRight","order","i","b","w","text","left","lastBottom","rows","rowHeight","y2","y2Ticks","right","overlaps","inside","r","haloText","halo","color","placeLabels","placed","label","labels","measure","gap","above","below","box","c","occupied","o","drawForeground","x0","y0","labelHeight","where","pos","tx","ty","textColor","t"],"sources":["../../../../charts/src/engine/overlay.ts"],"sourcesContent":["// Canvas2D layers around the data: background (areas, grid, axes, tick\n// labels) and foreground (reference lines, annotation and point labels).\n\nimport { toCss, type Rgba } from \"./color\";\nimport type { AxisTicks } from \"./axis\";\nimport { screenRect, toScreen, type Rect, type Scales } from \"./layout\";\nimport type { AxisModel } from \"./model\";\nimport type { ChartTheme } from \"./theme\";\nimport type { ChartLabelPosition } from \"./types\";\n\nexport interface ResolvedRect {\n type: \"rect\";\n x0?: number;\n x1?: number;\n y0?: number;\n y1?: number;\n color: Rgba;\n opacity: number;\n label?: string;\n labelPosition: ChartLabelPosition;\n labelColor: Rgba;\n}\n\nexport interface ResolvedLine {\n type: \"line\";\n axis: \"x\" | \"y\";\n value: number;\n color: Rgba;\n width: number;\n dash: number[];\n label?: string;\n}\n\nexport interface ResolvedText {\n type: \"text\";\n x?: number;\n y?: number;\n text: string;\n anchor: \"center\" | \"top\" | \"bottom\" | \"left\" | \"right\";\n color: Rgba;\n weight: number;\n}\n\nexport type ResolvedAnnotation = ResolvedRect | ResolvedLine | ResolvedText;\n\nexport interface PointLabel {\n x: number;\n y: number;\n /** Radius of the dot */\n r: number;\n text: string;\n /**\n * Fixed side (bar values: above / below, left / right of horizontal\n * bars); any free side around the dot otherwise\n */\n placement?: \"above\" | \"below\" | \"left\" | \"right\";\n}\n\nexport const font = (theme: ChartTheme, size = theme.fontSize, weight = 400) =>\n `${weight} ${size}px ${theme.fontFamily}`;\n\nconst crisp = (v: number) => Math.round(v) + 0.5;\n\n/** Box of a text annotation, kept inside the plot */\nexport const textBox = (\n a: ResolvedText,\n s: Scales,\n width: number,\n height: number,\n): Rect => {\n const { plot } = s;\n const at = toScreen(s, a.x ?? 0, a.y ?? 0);\n const free = s.horizontal\n ? { x: a.y === undefined, y: a.x === undefined }\n : { x: a.x === undefined, y: a.y === undefined };\n const px = free.x ? plot.x + plot.width / 2 : at.x;\n const py = free.y ? plot.y + plot.height / 2 : at.y;\n const gap = 6;\n let x = px - width / 2;\n let y = py - height / 2;\n if (a.anchor === \"top\") y = py + gap;\n else if (a.anchor === \"bottom\") y = py - gap - height;\n else if (a.anchor === \"left\") x = px + gap;\n else if (a.anchor === \"right\") x = px - gap - width;\n x = Math.max(plot.x + gap, Math.min(x, plot.x + plot.width - gap - width));\n y = Math.max(plot.y + 2, Math.min(y, plot.y + plot.height - 2 - height));\n return { x, y, width, height };\n};\n\n/** Screen box of an area annotation, clipped to the plot */\nexport const rectOf = (a: ResolvedRect, s: Scales): Rect => {\n const { plot } = s;\n // clamp every edge to the plot first: an open edge maps to ±Infinity and\n // `Infinity - Infinity` would make the size NaN (nothing drawn)\n const [xLo, xHi] = s.horizontal\n ? [plot.y, plot.y + plot.height]\n : [plot.x, plot.x + plot.width];\n const [yLo, yHi] = s.horizontal\n ? [plot.x, plot.x + plot.width]\n : [plot.y, plot.y + plot.height];\n const along = (px: number, lo: number, hi: number) =>\n px < lo ? lo : px > hi ? hi : px;\n return screenRect(\n s,\n along(s.xToPx(a.x0 ?? -Infinity), xLo, xHi),\n along(s.xToPx(a.x1 ?? Infinity), xLo, xHi),\n along(s.yToPx(a.y0 ?? -Infinity), yLo, yHi),\n along(s.yToPx(a.y1 ?? Infinity), yLo, yHi),\n );\n};\n\n/**\n * Where a reference line goes: `vertical` lines run at screen x `at`,\n * horizontal ones at screen y `at`\n */\nexport const lineOf = (\n a: ResolvedLine,\n s: Scales,\n): { vertical: boolean; at: number } => {\n const vertical = (a.axis === \"x\") !== s.horizontal;\n return {\n vertical,\n at: a.axis === \"x\" ? s.xToPx(a.value) : s.yToPx(a.value),\n };\n};\n\nexport interface BackgroundInput {\n width: number;\n height: number;\n scales: Scales;\n x: AxisModel;\n y: AxisModel;\n xTicks: AxisTicks;\n yTicks: AxisTicks;\n /** Right axis (dual axis charts) */\n y2?: AxisModel | null;\n y2Ticks?: AxisTicks | null;\n theme: ChartTheme;\n annotations: readonly ResolvedAnnotation[];\n}\n\nexport const drawBackground = (\n ctx: CanvasRenderingContext2D,\n input: BackgroundInput,\n) => {\n const { scales, theme, xTicks, yTicks } = input;\n const { plot } = scales;\n // horizontal charts: the value axis along the bottom, the x axis on the left\n const x = scales.horizontal ? input.y : input.x;\n const y = scales.horizontal ? input.x : input.y;\n const bottomTicks = scales.horizontal ? yTicks : xTicks;\n const leftTicks = scales.horizontal ? xTicks : yTicks;\n const bottomPx = scales.horizontal ? scales.yToPx : scales.xToPx;\n const leftPx = scales.horizontal ? scales.xToPx : scales.yToPx;\n ctx.clearRect(0, 0, input.width, input.height);\n\n // areas\n ctx.save();\n ctx.beginPath();\n ctx.rect(plot.x, plot.y, plot.width, plot.height);\n ctx.clip();\n for (const a of input.annotations) {\n if (a.type !== \"rect\") continue;\n const r = rectOf(a, scales);\n if (r.width <= 0 || r.height <= 0) continue;\n ctx.fillStyle = toCss(a.color, a.opacity);\n ctx.fillRect(r.x, r.y, r.width, r.height);\n }\n ctx.restore();\n\n // grid\n ctx.lineWidth = 1;\n ctx.strokeStyle = toCss(theme.grid);\n ctx.beginPath();\n if (y.grid) {\n for (const v of leftTicks.values) {\n const py = crisp(leftPx(v));\n if (py < plot.y - 1 || py > plot.y + plot.height + 1) continue;\n ctx.moveTo(plot.x, py);\n ctx.lineTo(plot.x + plot.width, py);\n }\n }\n if (x.grid) {\n for (const v of bottomTicks.values) {\n const px = crisp(bottomPx(v));\n if (px < plot.x - 1 || px > plot.x + plot.width + 1) continue;\n ctx.moveTo(px, plot.y);\n ctx.lineTo(px, plot.y + plot.height);\n }\n }\n ctx.stroke();\n\n const line = Math.ceil(theme.fontSize * 1.4);\n ctx.font = font(theme);\n ctx.fillStyle = toCss(theme.textMuted);\n\n // x axis\n if (x.visible) {\n ctx.strokeStyle = toCss(theme.axis);\n ctx.beginPath();\n const base = crisp(plot.y + plot.height);\n ctx.moveTo(plot.x, base);\n ctx.lineTo(plot.x + plot.width, base);\n ctx.stroke();\n ctx.textBaseline = \"top\";\n ctx.textAlign = \"center\";\n let lastRight = -Infinity;\n // left to right (reversed axes list their ticks right to left)\n const order = bottomTicks.values\n .map((v, i) => ({ px: bottomPx(v), text: bottomTicks.labels[i] }))\n .sort((a, b) => a.px - b.px);\n for (const { px, text } of order) {\n if (px < plot.x - 0.5 || px > plot.x + plot.width + 0.5) continue;\n const w = ctx.measureText(text).width;\n const left = Math.max(0, Math.min(input.width - w, px - w / 2));\n if (left < lastRight + 6) continue;\n lastRight = left + w;\n ctx.fillText(text, left + w / 2, plot.y + plot.height + 7);\n }\n if (x.title) {\n ctx.font = font(theme, theme.fontSize + 1, 500);\n ctx.fillStyle = toCss(theme.text, 0.8);\n ctx.fillText(\n x.title,\n plot.x + plot.width / 2,\n plot.y + plot.height + line + 10,\n );\n }\n }\n\n // y axis\n if (y.visible) {\n ctx.font = font(theme);\n ctx.fillStyle = toCss(theme.textMuted);\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"middle\";\n let lastBottom = -Infinity;\n // top to bottom: category rows of horizontal charts never overlap\n const rows = leftTicks.values\n .map((v, i) => ({ py: leftPx(v), text: leftTicks.labels[i] }))\n .sort((a, b) => a.py - b.py);\n const rowHeight = theme.fontSize + 2;\n for (const { py, text } of rows) {\n if (py < plot.y - 0.5 || py > plot.y + plot.height + 0.5) continue;\n if (scales.horizontal) {\n if (py - rowHeight / 2 < lastBottom) continue;\n lastBottom = py + rowHeight / 2;\n }\n ctx.fillText(text, plot.x - 8, py);\n }\n if (y.title) {\n ctx.save();\n ctx.font = font(theme, theme.fontSize + 1, 500);\n ctx.fillStyle = toCss(theme.text, 0.8);\n ctx.translate(line / 2 + 4, plot.y + plot.height / 2);\n ctx.rotate(-Math.PI / 2);\n ctx.textAlign = \"center\";\n ctx.fillText(y.title, 0, 0);\n ctx.restore();\n }\n }\n\n // right axis\n const y2 = scales.horizontal ? null : input.y2;\n const y2Ticks = input.y2Ticks;\n if (y2 && y2Ticks && y2.visible) {\n const right = plot.x + plot.width;\n ctx.font = font(theme);\n ctx.fillStyle = toCss(theme.textMuted);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n y2Ticks.values.forEach((v, i) => {\n const py = scales.yToPx(v);\n if (py < plot.y - 0.5 || py > plot.y + plot.height + 0.5) return;\n ctx.fillText(y2Ticks.labels[i], right + 8, py);\n });\n if (y2.title) {\n ctx.save();\n ctx.font = font(theme, theme.fontSize + 1, 500);\n ctx.fillStyle = toCss(theme.text, 0.8);\n ctx.translate(input.width - line / 2 - 4, plot.y + plot.height / 2);\n ctx.rotate(Math.PI / 2);\n ctx.textAlign = \"center\";\n ctx.fillText(y2.title, 0, 0);\n ctx.restore();\n }\n }\n};\n\nconst overlaps = (a: Rect, b: Rect) =>\n a.x < b.x + b.width &&\n b.x < a.x + a.width &&\n a.y < b.y + b.height &&\n b.y < a.y + a.height;\n\nconst inside = (r: Rect, plot: Rect) =>\n r.x >= plot.x &&\n r.y >= plot.y &&\n r.x + r.width <= plot.x + plot.width &&\n r.y + r.height <= plot.y + plot.height;\n\n/** Text with a halo in the background color (readable over data) */\nconst haloText = (\n ctx: CanvasRenderingContext2D,\n text: string,\n x: number,\n y: number,\n color: string,\n halo: string,\n) => {\n ctx.lineWidth = 3;\n ctx.lineJoin = \"round\";\n ctx.strokeStyle = halo;\n ctx.strokeText(text, x, y);\n ctx.fillStyle = color;\n ctx.fillText(text, x, y);\n};\n\n/** Greedy placement: right, left, above, below the dot; skipped when no slot is free */\nexport const placeLabels = (\n labels: readonly PointLabel[],\n plot: Rect,\n measure: (text: string) => number,\n height: number,\n occupied: Rect[] = [],\n): { label: PointLabel; box: Rect }[] => {\n const placed: { label: PointLabel; box: Rect }[] = [];\n for (const label of labels) {\n const w = measure(label.text);\n const gap = label.r + 4;\n const above = {\n x: label.x - w / 2,\n y: label.y - gap - height,\n width: w,\n height,\n };\n const below = { x: label.x - w / 2, y: label.y + gap, width: w, height };\n const right = {\n x: label.x + gap,\n y: label.y - height / 2,\n width: w,\n height,\n };\n const left = {\n x: label.x - gap - w,\n y: label.y - height / 2,\n width: w,\n height,\n };\n const candidates: Rect[] =\n label.placement === \"above\"\n ? [above]\n : label.placement === \"below\"\n ? [below]\n : label.placement === \"right\"\n ? [right, left]\n : label.placement === \"left\"\n ? [left, right]\n : [\n {\n x: label.x + gap,\n y: label.y - height / 2,\n width: w,\n height,\n },\n {\n x: label.x - gap - w,\n y: label.y - height / 2,\n width: w,\n height,\n },\n above,\n below,\n ];\n const box = candidates.find(\n (c) => inside(c, plot) && !occupied.some((o) => overlaps(o, c)),\n );\n if (!box) continue;\n occupied.push(box);\n placed.push({ label, box });\n }\n return placed;\n};\n\nexport interface ForegroundInput {\n width: number;\n height: number;\n scales: Scales;\n theme: ChartTheme;\n annotations: readonly ResolvedAnnotation[];\n pointLabels: readonly PointLabel[];\n /**\n * Clears the canvas first (off when the layers share one canvas)\n * @default true\n */\n clear?: boolean;\n /** Lines between consecutive bars (waterfall connectors), drawn first */\n connectors?: readonly {\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n color: string;\n width: number;\n dash: readonly number[];\n }[];\n}\n\nexport const drawForeground = (\n ctx: CanvasRenderingContext2D,\n input: ForegroundInput,\n) => {\n const { scales, theme } = input;\n const { plot } = scales;\n if (input.clear !== false) ctx.clearRect(0, 0, input.width, input.height);\n ctx.save();\n ctx.beginPath();\n ctx.rect(plot.x, plot.y, plot.width, plot.height);\n ctx.clip();\n\n for (const c of input.connectors ?? []) {\n ctx.strokeStyle = c.color;\n ctx.lineWidth = c.width;\n ctx.setLineDash([...c.dash]);\n ctx.beginPath();\n // crisp hairlines along the pixel grid\n const along = c.y0 === c.y1;\n const x0 = along ? c.x0 : crisp(c.x0);\n const y0 = along ? crisp(c.y0) : c.y0;\n ctx.moveTo(x0, y0);\n ctx.lineTo(along ? c.x1 : x0, along ? y0 : c.y1);\n ctx.stroke();\n }\n ctx.setLineDash([]);\n\n const halo = toCss(theme.background, 0.9);\n const occupied: Rect[] = [];\n const labelHeight = theme.fontSize + 4;\n\n for (const a of input.annotations) {\n if (a.type !== \"line\") continue;\n const color = toCss(a.color);\n ctx.strokeStyle = color;\n ctx.lineWidth = a.width;\n ctx.setLineDash(a.dash);\n ctx.beginPath();\n const where = lineOf(a, scales);\n if (!where.vertical) {\n const py = crisp(where.at);\n ctx.moveTo(plot.x, py);\n ctx.lineTo(plot.x + plot.width, py);\n ctx.stroke();\n if (a.label) {\n ctx.setLineDash([]);\n ctx.font = font(theme, theme.fontSize, 500);\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"bottom\";\n haloText(ctx, a.label, plot.x + plot.width - 6, py - 3, color, halo);\n }\n } else {\n const px = crisp(where.at);\n ctx.moveTo(px, plot.y);\n ctx.lineTo(px, plot.y + plot.height);\n ctx.stroke();\n if (a.label) {\n ctx.setLineDash([]);\n ctx.font = font(theme, theme.fontSize, 500);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"top\";\n haloText(ctx, a.label, px + 5, plot.y + 5, color, halo);\n }\n }\n }\n ctx.setLineDash([]);\n\n // labels of areas\n ctx.font = font(theme, theme.fontSize + 1, 600);\n for (const a of input.annotations) {\n if (a.type !== \"rect\" || !a.label) continue;\n const r = rectOf(a, scales);\n if (r.width <= 0 || r.height <= 0) continue;\n const pad = 10;\n const w = ctx.measureText(a.label).width;\n const pos = a.labelPosition;\n const tx = pos.endsWith(\"left\")\n ? r.x + pad\n : pos.endsWith(\"right\")\n ? r.x + r.width - pad - w\n : r.x + (r.width - w) / 2;\n const ty = pos.startsWith(\"top\")\n ? r.y + pad\n : pos.startsWith(\"bottom\")\n ? r.y + r.height - pad - labelHeight\n : r.y + (r.height - labelHeight) / 2;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"top\";\n ctx.fillStyle = toCss(a.labelColor);\n ctx.fillText(a.label, tx, ty);\n occupied.push({ x: tx, y: ty, width: w, height: labelHeight });\n }\n\n // free texts\n for (const a of input.annotations) {\n if (a.type !== \"text\" || !a.text) continue;\n ctx.font = font(theme, theme.fontSize, a.weight);\n const box = textBox(a, scales, ctx.measureText(a.text).width, labelHeight);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n haloText(ctx, a.text, box.x, box.y + box.height / 2, toCss(a.color), halo);\n occupied.push(box);\n }\n\n // point labels\n if (input.pointLabels.length) {\n ctx.font = font(theme);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n const textColor = toCss(theme.text, 0.85);\n const placed = placeLabels(\n input.pointLabels,\n plot,\n (t) => ctx.measureText(t).width,\n labelHeight - 2,\n occupied,\n );\n for (const { label, box } of placed) {\n haloText(ctx, label.text, box.x, box.y + box.height / 2, textColor, halo);\n }\n }\n ctx.restore();\n};\n"],"mappings":"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"}
|
|
@@ -92,5 +92,15 @@ export interface ForegroundInput {
|
|
|
92
92
|
* @default true
|
|
93
93
|
*/
|
|
94
94
|
clear?: boolean;
|
|
95
|
+
/** Lines between consecutive bars (waterfall connectors), drawn first */
|
|
96
|
+
connectors?: readonly {
|
|
97
|
+
x0: number;
|
|
98
|
+
y0: number;
|
|
99
|
+
x1: number;
|
|
100
|
+
y1: number;
|
|
101
|
+
color: string;
|
|
102
|
+
width: number;
|
|
103
|
+
dash: readonly number[];
|
|
104
|
+
}[];
|
|
95
105
|
}
|
|
96
106
|
export declare const drawForeground: (ctx: CanvasRenderingContext2D, input: ForegroundInput) => void;
|
|
@@ -92,5 +92,15 @@ export interface ForegroundInput {
|
|
|
92
92
|
* @default true
|
|
93
93
|
*/
|
|
94
94
|
clear?: boolean;
|
|
95
|
+
/** Lines between consecutive bars (waterfall connectors), drawn first */
|
|
96
|
+
connectors?: readonly {
|
|
97
|
+
x0: number;
|
|
98
|
+
y0: number;
|
|
99
|
+
x1: number;
|
|
100
|
+
y1: number;
|
|
101
|
+
color: string;
|
|
102
|
+
width: number;
|
|
103
|
+
dash: readonly number[];
|
|
104
|
+
}[];
|
|
95
105
|
}
|
|
96
106
|
export declare const drawForeground: (ctx: CanvasRenderingContext2D, input: ForegroundInput) => void;
|
|
@@ -127,6 +127,12 @@ var r = (e, t = e.fontSize, n = 400) => `${n} ${t}px ${e.fontFamily}`, i = (e) =
|
|
|
127
127
|
}, p = (t, n) => {
|
|
128
128
|
let { scales: c, theme: l } = n, { plot: u } = c;
|
|
129
129
|
n.clear !== !1 && t.clearRect(0, 0, n.width, n.height), t.save(), t.beginPath(), t.rect(u.x, u.y, u.width, u.height), t.clip();
|
|
130
|
+
for (let e of n.connectors ?? []) {
|
|
131
|
+
t.strokeStyle = e.color, t.lineWidth = e.width, t.setLineDash([...e.dash]), t.beginPath();
|
|
132
|
+
let n = e.y0 === e.y1, r = n ? e.x0 : i(e.x0), a = n ? i(e.y0) : e.y0;
|
|
133
|
+
t.moveTo(r, a), t.lineTo(n ? e.x1 : r, n ? a : e.y1), t.stroke();
|
|
134
|
+
}
|
|
135
|
+
t.setLineDash([]);
|
|
130
136
|
let p = e(l.background, .9), m = [], h = l.fontSize + 4;
|
|
131
137
|
for (let a of n.annotations) {
|
|
132
138
|
if (a.type !== "line") continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overlay.js","names":["font","theme","weight","size","crisp","v","textBox","s","at","toScreen","a","free","px","plot","py","x","width","y","height","rectOf","xLo","xHi","yLo","yHi","along","lo","hi","screenRect","lineOf","drawBackground","input","scales","bottomTicks","yTicks","xTicks","leftTicks","bottomPx","leftPx","ctx","r","toCss","line","base","lastRight","order","i","b","w","text","left","lastBottom","rows","rowHeight","y2","y2Ticks","right","overlaps","inside","haloText","halo","color","placeLabels","placed","label","labels","measure","gap","above","below","box","c","occupied","o","drawForeground","labelHeight","where","pos","tx","ty","textColor","t"],"sources":["../../../../charts/src/engine/overlay.ts"],"sourcesContent":["// Canvas2D layers around the data: background (areas, grid, axes, tick\n// labels) and foreground (reference lines, annotation and point labels).\n\nimport { toCss, type Rgba } from \"./color\";\nimport type { AxisTicks } from \"./axis\";\nimport { screenRect, toScreen, type Rect, type Scales } from \"./layout\";\nimport type { AxisModel } from \"./model\";\nimport type { ChartTheme } from \"./theme\";\nimport type { ChartLabelPosition } from \"./types\";\n\nexport interface ResolvedRect {\n type: \"rect\";\n x0?: number;\n x1?: number;\n y0?: number;\n y1?: number;\n color: Rgba;\n opacity: number;\n label?: string;\n labelPosition: ChartLabelPosition;\n labelColor: Rgba;\n}\n\nexport interface ResolvedLine {\n type: \"line\";\n axis: \"x\" | \"y\";\n value: number;\n color: Rgba;\n width: number;\n dash: number[];\n label?: string;\n}\n\nexport interface ResolvedText {\n type: \"text\";\n x?: number;\n y?: number;\n text: string;\n anchor: \"center\" | \"top\" | \"bottom\" | \"left\" | \"right\";\n color: Rgba;\n weight: number;\n}\n\nexport type ResolvedAnnotation = ResolvedRect | ResolvedLine | ResolvedText;\n\nexport interface PointLabel {\n x: number;\n y: number;\n /** Radius of the dot */\n r: number;\n text: string;\n /**\n * Fixed side (bar values: above / below, left / right of horizontal\n * bars); any free side around the dot otherwise\n */\n placement?: \"above\" | \"below\" | \"left\" | \"right\";\n}\n\nexport const font = (theme: ChartTheme, size = theme.fontSize, weight = 400) =>\n `${weight} ${size}px ${theme.fontFamily}`;\n\nconst crisp = (v: number) => Math.round(v) + 0.5;\n\n/** Box of a text annotation, kept inside the plot */\nexport const textBox = (\n a: ResolvedText,\n s: Scales,\n width: number,\n height: number,\n): Rect => {\n const { plot } = s;\n const at = toScreen(s, a.x ?? 0, a.y ?? 0);\n const free = s.horizontal\n ? { x: a.y === undefined, y: a.x === undefined }\n : { x: a.x === undefined, y: a.y === undefined };\n const px = free.x ? plot.x + plot.width / 2 : at.x;\n const py = free.y ? plot.y + plot.height / 2 : at.y;\n const gap = 6;\n let x = px - width / 2;\n let y = py - height / 2;\n if (a.anchor === \"top\") y = py + gap;\n else if (a.anchor === \"bottom\") y = py - gap - height;\n else if (a.anchor === \"left\") x = px + gap;\n else if (a.anchor === \"right\") x = px - gap - width;\n x = Math.max(plot.x + gap, Math.min(x, plot.x + plot.width - gap - width));\n y = Math.max(plot.y + 2, Math.min(y, plot.y + plot.height - 2 - height));\n return { x, y, width, height };\n};\n\n/** Screen box of an area annotation, clipped to the plot */\nexport const rectOf = (a: ResolvedRect, s: Scales): Rect => {\n const { plot } = s;\n // clamp every edge to the plot first: an open edge maps to ±Infinity and\n // `Infinity - Infinity` would make the size NaN (nothing drawn)\n const [xLo, xHi] = s.horizontal\n ? [plot.y, plot.y + plot.height]\n : [plot.x, plot.x + plot.width];\n const [yLo, yHi] = s.horizontal\n ? [plot.x, plot.x + plot.width]\n : [plot.y, plot.y + plot.height];\n const along = (px: number, lo: number, hi: number) =>\n px < lo ? lo : px > hi ? hi : px;\n return screenRect(\n s,\n along(s.xToPx(a.x0 ?? -Infinity), xLo, xHi),\n along(s.xToPx(a.x1 ?? Infinity), xLo, xHi),\n along(s.yToPx(a.y0 ?? -Infinity), yLo, yHi),\n along(s.yToPx(a.y1 ?? Infinity), yLo, yHi),\n );\n};\n\n/**\n * Where a reference line goes: `vertical` lines run at screen x `at`,\n * horizontal ones at screen y `at`\n */\nexport const lineOf = (\n a: ResolvedLine,\n s: Scales,\n): { vertical: boolean; at: number } => {\n const vertical = (a.axis === \"x\") !== s.horizontal;\n return {\n vertical,\n at: a.axis === \"x\" ? s.xToPx(a.value) : s.yToPx(a.value),\n };\n};\n\nexport interface BackgroundInput {\n width: number;\n height: number;\n scales: Scales;\n x: AxisModel;\n y: AxisModel;\n xTicks: AxisTicks;\n yTicks: AxisTicks;\n /** Right axis (dual axis charts) */\n y2?: AxisModel | null;\n y2Ticks?: AxisTicks | null;\n theme: ChartTheme;\n annotations: readonly ResolvedAnnotation[];\n}\n\nexport const drawBackground = (\n ctx: CanvasRenderingContext2D,\n input: BackgroundInput,\n) => {\n const { scales, theme, xTicks, yTicks } = input;\n const { plot } = scales;\n // horizontal charts: the value axis along the bottom, the x axis on the left\n const x = scales.horizontal ? input.y : input.x;\n const y = scales.horizontal ? input.x : input.y;\n const bottomTicks = scales.horizontal ? yTicks : xTicks;\n const leftTicks = scales.horizontal ? xTicks : yTicks;\n const bottomPx = scales.horizontal ? scales.yToPx : scales.xToPx;\n const leftPx = scales.horizontal ? scales.xToPx : scales.yToPx;\n ctx.clearRect(0, 0, input.width, input.height);\n\n // areas\n ctx.save();\n ctx.beginPath();\n ctx.rect(plot.x, plot.y, plot.width, plot.height);\n ctx.clip();\n for (const a of input.annotations) {\n if (a.type !== \"rect\") continue;\n const r = rectOf(a, scales);\n if (r.width <= 0 || r.height <= 0) continue;\n ctx.fillStyle = toCss(a.color, a.opacity);\n ctx.fillRect(r.x, r.y, r.width, r.height);\n }\n ctx.restore();\n\n // grid\n ctx.lineWidth = 1;\n ctx.strokeStyle = toCss(theme.grid);\n ctx.beginPath();\n if (y.grid) {\n for (const v of leftTicks.values) {\n const py = crisp(leftPx(v));\n if (py < plot.y - 1 || py > plot.y + plot.height + 1) continue;\n ctx.moveTo(plot.x, py);\n ctx.lineTo(plot.x + plot.width, py);\n }\n }\n if (x.grid) {\n for (const v of bottomTicks.values) {\n const px = crisp(bottomPx(v));\n if (px < plot.x - 1 || px > plot.x + plot.width + 1) continue;\n ctx.moveTo(px, plot.y);\n ctx.lineTo(px, plot.y + plot.height);\n }\n }\n ctx.stroke();\n\n const line = Math.ceil(theme.fontSize * 1.4);\n ctx.font = font(theme);\n ctx.fillStyle = toCss(theme.textMuted);\n\n // x axis\n if (x.visible) {\n ctx.strokeStyle = toCss(theme.axis);\n ctx.beginPath();\n const base = crisp(plot.y + plot.height);\n ctx.moveTo(plot.x, base);\n ctx.lineTo(plot.x + plot.width, base);\n ctx.stroke();\n ctx.textBaseline = \"top\";\n ctx.textAlign = \"center\";\n let lastRight = -Infinity;\n // left to right (reversed axes list their ticks right to left)\n const order = bottomTicks.values\n .map((v, i) => ({ px: bottomPx(v), text: bottomTicks.labels[i] }))\n .sort((a, b) => a.px - b.px);\n for (const { px, text } of order) {\n if (px < plot.x - 0.5 || px > plot.x + plot.width + 0.5) continue;\n const w = ctx.measureText(text).width;\n const left = Math.max(0, Math.min(input.width - w, px - w / 2));\n if (left < lastRight + 6) continue;\n lastRight = left + w;\n ctx.fillText(text, left + w / 2, plot.y + plot.height + 7);\n }\n if (x.title) {\n ctx.font = font(theme, theme.fontSize + 1, 500);\n ctx.fillStyle = toCss(theme.text, 0.8);\n ctx.fillText(\n x.title,\n plot.x + plot.width / 2,\n plot.y + plot.height + line + 10,\n );\n }\n }\n\n // y axis\n if (y.visible) {\n ctx.font = font(theme);\n ctx.fillStyle = toCss(theme.textMuted);\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"middle\";\n let lastBottom = -Infinity;\n // top to bottom: category rows of horizontal charts never overlap\n const rows = leftTicks.values\n .map((v, i) => ({ py: leftPx(v), text: leftTicks.labels[i] }))\n .sort((a, b) => a.py - b.py);\n const rowHeight = theme.fontSize + 2;\n for (const { py, text } of rows) {\n if (py < plot.y - 0.5 || py > plot.y + plot.height + 0.5) continue;\n if (scales.horizontal) {\n if (py - rowHeight / 2 < lastBottom) continue;\n lastBottom = py + rowHeight / 2;\n }\n ctx.fillText(text, plot.x - 8, py);\n }\n if (y.title) {\n ctx.save();\n ctx.font = font(theme, theme.fontSize + 1, 500);\n ctx.fillStyle = toCss(theme.text, 0.8);\n ctx.translate(line / 2 + 4, plot.y + plot.height / 2);\n ctx.rotate(-Math.PI / 2);\n ctx.textAlign = \"center\";\n ctx.fillText(y.title, 0, 0);\n ctx.restore();\n }\n }\n\n // right axis\n const y2 = scales.horizontal ? null : input.y2;\n const y2Ticks = input.y2Ticks;\n if (y2 && y2Ticks && y2.visible) {\n const right = plot.x + plot.width;\n ctx.font = font(theme);\n ctx.fillStyle = toCss(theme.textMuted);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n y2Ticks.values.forEach((v, i) => {\n const py = scales.yToPx(v);\n if (py < plot.y - 0.5 || py > plot.y + plot.height + 0.5) return;\n ctx.fillText(y2Ticks.labels[i], right + 8, py);\n });\n if (y2.title) {\n ctx.save();\n ctx.font = font(theme, theme.fontSize + 1, 500);\n ctx.fillStyle = toCss(theme.text, 0.8);\n ctx.translate(input.width - line / 2 - 4, plot.y + plot.height / 2);\n ctx.rotate(Math.PI / 2);\n ctx.textAlign = \"center\";\n ctx.fillText(y2.title, 0, 0);\n ctx.restore();\n }\n }\n};\n\nconst overlaps = (a: Rect, b: Rect) =>\n a.x < b.x + b.width &&\n b.x < a.x + a.width &&\n a.y < b.y + b.height &&\n b.y < a.y + a.height;\n\nconst inside = (r: Rect, plot: Rect) =>\n r.x >= plot.x &&\n r.y >= plot.y &&\n r.x + r.width <= plot.x + plot.width &&\n r.y + r.height <= plot.y + plot.height;\n\n/** Text with a halo in the background color (readable over data) */\nconst haloText = (\n ctx: CanvasRenderingContext2D,\n text: string,\n x: number,\n y: number,\n color: string,\n halo: string,\n) => {\n ctx.lineWidth = 3;\n ctx.lineJoin = \"round\";\n ctx.strokeStyle = halo;\n ctx.strokeText(text, x, y);\n ctx.fillStyle = color;\n ctx.fillText(text, x, y);\n};\n\n/** Greedy placement: right, left, above, below the dot; skipped when no slot is free */\nexport const placeLabels = (\n labels: readonly PointLabel[],\n plot: Rect,\n measure: (text: string) => number,\n height: number,\n occupied: Rect[] = [],\n): { label: PointLabel; box: Rect }[] => {\n const placed: { label: PointLabel; box: Rect }[] = [];\n for (const label of labels) {\n const w = measure(label.text);\n const gap = label.r + 4;\n const above = {\n x: label.x - w / 2,\n y: label.y - gap - height,\n width: w,\n height,\n };\n const below = { x: label.x - w / 2, y: label.y + gap, width: w, height };\n const right = {\n x: label.x + gap,\n y: label.y - height / 2,\n width: w,\n height,\n };\n const left = {\n x: label.x - gap - w,\n y: label.y - height / 2,\n width: w,\n height,\n };\n const candidates: Rect[] =\n label.placement === \"above\"\n ? [above]\n : label.placement === \"below\"\n ? [below]\n : label.placement === \"right\"\n ? [right, left]\n : label.placement === \"left\"\n ? [left, right]\n : [\n {\n x: label.x + gap,\n y: label.y - height / 2,\n width: w,\n height,\n },\n {\n x: label.x - gap - w,\n y: label.y - height / 2,\n width: w,\n height,\n },\n above,\n below,\n ];\n const box = candidates.find(\n (c) => inside(c, plot) && !occupied.some((o) => overlaps(o, c)),\n );\n if (!box) continue;\n occupied.push(box);\n placed.push({ label, box });\n }\n return placed;\n};\n\nexport interface ForegroundInput {\n width: number;\n height: number;\n scales: Scales;\n theme: ChartTheme;\n annotations: readonly ResolvedAnnotation[];\n pointLabels: readonly PointLabel[];\n /**\n * Clears the canvas first (off when the layers share one canvas)\n * @default true\n */\n clear?: boolean;\n}\n\nexport const drawForeground = (\n ctx: CanvasRenderingContext2D,\n input: ForegroundInput,\n) => {\n const { scales, theme } = input;\n const { plot } = scales;\n if (input.clear !== false) ctx.clearRect(0, 0, input.width, input.height);\n ctx.save();\n ctx.beginPath();\n ctx.rect(plot.x, plot.y, plot.width, plot.height);\n ctx.clip();\n\n const halo = toCss(theme.background, 0.9);\n const occupied: Rect[] = [];\n const labelHeight = theme.fontSize + 4;\n\n for (const a of input.annotations) {\n if (a.type !== \"line\") continue;\n const color = toCss(a.color);\n ctx.strokeStyle = color;\n ctx.lineWidth = a.width;\n ctx.setLineDash(a.dash);\n ctx.beginPath();\n const where = lineOf(a, scales);\n if (!where.vertical) {\n const py = crisp(where.at);\n ctx.moveTo(plot.x, py);\n ctx.lineTo(plot.x + plot.width, py);\n ctx.stroke();\n if (a.label) {\n ctx.setLineDash([]);\n ctx.font = font(theme, theme.fontSize, 500);\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"bottom\";\n haloText(ctx, a.label, plot.x + plot.width - 6, py - 3, color, halo);\n }\n } else {\n const px = crisp(where.at);\n ctx.moveTo(px, plot.y);\n ctx.lineTo(px, plot.y + plot.height);\n ctx.stroke();\n if (a.label) {\n ctx.setLineDash([]);\n ctx.font = font(theme, theme.fontSize, 500);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"top\";\n haloText(ctx, a.label, px + 5, plot.y + 5, color, halo);\n }\n }\n }\n ctx.setLineDash([]);\n\n // labels of areas\n ctx.font = font(theme, theme.fontSize + 1, 600);\n for (const a of input.annotations) {\n if (a.type !== \"rect\" || !a.label) continue;\n const r = rectOf(a, scales);\n if (r.width <= 0 || r.height <= 0) continue;\n const pad = 10;\n const w = ctx.measureText(a.label).width;\n const pos = a.labelPosition;\n const tx = pos.endsWith(\"left\")\n ? r.x + pad\n : pos.endsWith(\"right\")\n ? r.x + r.width - pad - w\n : r.x + (r.width - w) / 2;\n const ty = pos.startsWith(\"top\")\n ? r.y + pad\n : pos.startsWith(\"bottom\")\n ? r.y + r.height - pad - labelHeight\n : r.y + (r.height - labelHeight) / 2;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"top\";\n ctx.fillStyle = toCss(a.labelColor);\n ctx.fillText(a.label, tx, ty);\n occupied.push({ x: tx, y: ty, width: w, height: labelHeight });\n }\n\n // free texts\n for (const a of input.annotations) {\n if (a.type !== \"text\" || !a.text) continue;\n ctx.font = font(theme, theme.fontSize, a.weight);\n const box = textBox(a, scales, ctx.measureText(a.text).width, labelHeight);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n haloText(ctx, a.text, box.x, box.y + box.height / 2, toCss(a.color), halo);\n occupied.push(box);\n }\n\n // point labels\n if (input.pointLabels.length) {\n ctx.font = font(theme);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n const textColor = toCss(theme.text, 0.85);\n const placed = placeLabels(\n input.pointLabels,\n plot,\n (t) => ctx.measureText(t).width,\n labelHeight - 2,\n occupied,\n );\n for (const { label, box } of placed) {\n haloText(ctx, label.text, box.x, box.y + box.height / 2, textColor, halo);\n }\n }\n ctx.restore();\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"overlay.js","names":["font","theme","weight","size","crisp","v","textBox","s","at","toScreen","a","free","px","plot","py","x","width","y","height","rectOf","xLo","xHi","yLo","yHi","along","lo","hi","screenRect","lineOf","drawBackground","input","scales","bottomTicks","yTicks","xTicks","leftTicks","bottomPx","leftPx","ctx","r","toCss","line","base","lastRight","order","i","b","w","text","left","lastBottom","rows","rowHeight","y2","y2Ticks","right","overlaps","inside","haloText","halo","color","placeLabels","placed","label","labels","measure","gap","above","below","box","c","occupied","o","drawForeground","x0","y0","labelHeight","where","pos","tx","ty","textColor","t"],"sources":["../../../../charts/src/engine/overlay.ts"],"sourcesContent":["// Canvas2D layers around the data: background (areas, grid, axes, tick\n// labels) and foreground (reference lines, annotation and point labels).\n\nimport { toCss, type Rgba } from \"./color\";\nimport type { AxisTicks } from \"./axis\";\nimport { screenRect, toScreen, type Rect, type Scales } from \"./layout\";\nimport type { AxisModel } from \"./model\";\nimport type { ChartTheme } from \"./theme\";\nimport type { ChartLabelPosition } from \"./types\";\n\nexport interface ResolvedRect {\n type: \"rect\";\n x0?: number;\n x1?: number;\n y0?: number;\n y1?: number;\n color: Rgba;\n opacity: number;\n label?: string;\n labelPosition: ChartLabelPosition;\n labelColor: Rgba;\n}\n\nexport interface ResolvedLine {\n type: \"line\";\n axis: \"x\" | \"y\";\n value: number;\n color: Rgba;\n width: number;\n dash: number[];\n label?: string;\n}\n\nexport interface ResolvedText {\n type: \"text\";\n x?: number;\n y?: number;\n text: string;\n anchor: \"center\" | \"top\" | \"bottom\" | \"left\" | \"right\";\n color: Rgba;\n weight: number;\n}\n\nexport type ResolvedAnnotation = ResolvedRect | ResolvedLine | ResolvedText;\n\nexport interface PointLabel {\n x: number;\n y: number;\n /** Radius of the dot */\n r: number;\n text: string;\n /**\n * Fixed side (bar values: above / below, left / right of horizontal\n * bars); any free side around the dot otherwise\n */\n placement?: \"above\" | \"below\" | \"left\" | \"right\";\n}\n\nexport const font = (theme: ChartTheme, size = theme.fontSize, weight = 400) =>\n `${weight} ${size}px ${theme.fontFamily}`;\n\nconst crisp = (v: number) => Math.round(v) + 0.5;\n\n/** Box of a text annotation, kept inside the plot */\nexport const textBox = (\n a: ResolvedText,\n s: Scales,\n width: number,\n height: number,\n): Rect => {\n const { plot } = s;\n const at = toScreen(s, a.x ?? 0, a.y ?? 0);\n const free = s.horizontal\n ? { x: a.y === undefined, y: a.x === undefined }\n : { x: a.x === undefined, y: a.y === undefined };\n const px = free.x ? plot.x + plot.width / 2 : at.x;\n const py = free.y ? plot.y + plot.height / 2 : at.y;\n const gap = 6;\n let x = px - width / 2;\n let y = py - height / 2;\n if (a.anchor === \"top\") y = py + gap;\n else if (a.anchor === \"bottom\") y = py - gap - height;\n else if (a.anchor === \"left\") x = px + gap;\n else if (a.anchor === \"right\") x = px - gap - width;\n x = Math.max(plot.x + gap, Math.min(x, plot.x + plot.width - gap - width));\n y = Math.max(plot.y + 2, Math.min(y, plot.y + plot.height - 2 - height));\n return { x, y, width, height };\n};\n\n/** Screen box of an area annotation, clipped to the plot */\nexport const rectOf = (a: ResolvedRect, s: Scales): Rect => {\n const { plot } = s;\n // clamp every edge to the plot first: an open edge maps to ±Infinity and\n // `Infinity - Infinity` would make the size NaN (nothing drawn)\n const [xLo, xHi] = s.horizontal\n ? [plot.y, plot.y + plot.height]\n : [plot.x, plot.x + plot.width];\n const [yLo, yHi] = s.horizontal\n ? [plot.x, plot.x + plot.width]\n : [plot.y, plot.y + plot.height];\n const along = (px: number, lo: number, hi: number) =>\n px < lo ? lo : px > hi ? hi : px;\n return screenRect(\n s,\n along(s.xToPx(a.x0 ?? -Infinity), xLo, xHi),\n along(s.xToPx(a.x1 ?? Infinity), xLo, xHi),\n along(s.yToPx(a.y0 ?? -Infinity), yLo, yHi),\n along(s.yToPx(a.y1 ?? Infinity), yLo, yHi),\n );\n};\n\n/**\n * Where a reference line goes: `vertical` lines run at screen x `at`,\n * horizontal ones at screen y `at`\n */\nexport const lineOf = (\n a: ResolvedLine,\n s: Scales,\n): { vertical: boolean; at: number } => {\n const vertical = (a.axis === \"x\") !== s.horizontal;\n return {\n vertical,\n at: a.axis === \"x\" ? s.xToPx(a.value) : s.yToPx(a.value),\n };\n};\n\nexport interface BackgroundInput {\n width: number;\n height: number;\n scales: Scales;\n x: AxisModel;\n y: AxisModel;\n xTicks: AxisTicks;\n yTicks: AxisTicks;\n /** Right axis (dual axis charts) */\n y2?: AxisModel | null;\n y2Ticks?: AxisTicks | null;\n theme: ChartTheme;\n annotations: readonly ResolvedAnnotation[];\n}\n\nexport const drawBackground = (\n ctx: CanvasRenderingContext2D,\n input: BackgroundInput,\n) => {\n const { scales, theme, xTicks, yTicks } = input;\n const { plot } = scales;\n // horizontal charts: the value axis along the bottom, the x axis on the left\n const x = scales.horizontal ? input.y : input.x;\n const y = scales.horizontal ? input.x : input.y;\n const bottomTicks = scales.horizontal ? yTicks : xTicks;\n const leftTicks = scales.horizontal ? xTicks : yTicks;\n const bottomPx = scales.horizontal ? scales.yToPx : scales.xToPx;\n const leftPx = scales.horizontal ? scales.xToPx : scales.yToPx;\n ctx.clearRect(0, 0, input.width, input.height);\n\n // areas\n ctx.save();\n ctx.beginPath();\n ctx.rect(plot.x, plot.y, plot.width, plot.height);\n ctx.clip();\n for (const a of input.annotations) {\n if (a.type !== \"rect\") continue;\n const r = rectOf(a, scales);\n if (r.width <= 0 || r.height <= 0) continue;\n ctx.fillStyle = toCss(a.color, a.opacity);\n ctx.fillRect(r.x, r.y, r.width, r.height);\n }\n ctx.restore();\n\n // grid\n ctx.lineWidth = 1;\n ctx.strokeStyle = toCss(theme.grid);\n ctx.beginPath();\n if (y.grid) {\n for (const v of leftTicks.values) {\n const py = crisp(leftPx(v));\n if (py < plot.y - 1 || py > plot.y + plot.height + 1) continue;\n ctx.moveTo(plot.x, py);\n ctx.lineTo(plot.x + plot.width, py);\n }\n }\n if (x.grid) {\n for (const v of bottomTicks.values) {\n const px = crisp(bottomPx(v));\n if (px < plot.x - 1 || px > plot.x + plot.width + 1) continue;\n ctx.moveTo(px, plot.y);\n ctx.lineTo(px, plot.y + plot.height);\n }\n }\n ctx.stroke();\n\n const line = Math.ceil(theme.fontSize * 1.4);\n ctx.font = font(theme);\n ctx.fillStyle = toCss(theme.textMuted);\n\n // x axis\n if (x.visible) {\n ctx.strokeStyle = toCss(theme.axis);\n ctx.beginPath();\n const base = crisp(plot.y + plot.height);\n ctx.moveTo(plot.x, base);\n ctx.lineTo(plot.x + plot.width, base);\n ctx.stroke();\n ctx.textBaseline = \"top\";\n ctx.textAlign = \"center\";\n let lastRight = -Infinity;\n // left to right (reversed axes list their ticks right to left)\n const order = bottomTicks.values\n .map((v, i) => ({ px: bottomPx(v), text: bottomTicks.labels[i] }))\n .sort((a, b) => a.px - b.px);\n for (const { px, text } of order) {\n if (px < plot.x - 0.5 || px > plot.x + plot.width + 0.5) continue;\n const w = ctx.measureText(text).width;\n const left = Math.max(0, Math.min(input.width - w, px - w / 2));\n if (left < lastRight + 6) continue;\n lastRight = left + w;\n ctx.fillText(text, left + w / 2, plot.y + plot.height + 7);\n }\n if (x.title) {\n ctx.font = font(theme, theme.fontSize + 1, 500);\n ctx.fillStyle = toCss(theme.text, 0.8);\n ctx.fillText(\n x.title,\n plot.x + plot.width / 2,\n plot.y + plot.height + line + 10,\n );\n }\n }\n\n // y axis\n if (y.visible) {\n ctx.font = font(theme);\n ctx.fillStyle = toCss(theme.textMuted);\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"middle\";\n let lastBottom = -Infinity;\n // top to bottom: category rows of horizontal charts never overlap\n const rows = leftTicks.values\n .map((v, i) => ({ py: leftPx(v), text: leftTicks.labels[i] }))\n .sort((a, b) => a.py - b.py);\n const rowHeight = theme.fontSize + 2;\n for (const { py, text } of rows) {\n if (py < plot.y - 0.5 || py > plot.y + plot.height + 0.5) continue;\n if (scales.horizontal) {\n if (py - rowHeight / 2 < lastBottom) continue;\n lastBottom = py + rowHeight / 2;\n }\n ctx.fillText(text, plot.x - 8, py);\n }\n if (y.title) {\n ctx.save();\n ctx.font = font(theme, theme.fontSize + 1, 500);\n ctx.fillStyle = toCss(theme.text, 0.8);\n ctx.translate(line / 2 + 4, plot.y + plot.height / 2);\n ctx.rotate(-Math.PI / 2);\n ctx.textAlign = \"center\";\n ctx.fillText(y.title, 0, 0);\n ctx.restore();\n }\n }\n\n // right axis\n const y2 = scales.horizontal ? null : input.y2;\n const y2Ticks = input.y2Ticks;\n if (y2 && y2Ticks && y2.visible) {\n const right = plot.x + plot.width;\n ctx.font = font(theme);\n ctx.fillStyle = toCss(theme.textMuted);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n y2Ticks.values.forEach((v, i) => {\n const py = scales.yToPx(v);\n if (py < plot.y - 0.5 || py > plot.y + plot.height + 0.5) return;\n ctx.fillText(y2Ticks.labels[i], right + 8, py);\n });\n if (y2.title) {\n ctx.save();\n ctx.font = font(theme, theme.fontSize + 1, 500);\n ctx.fillStyle = toCss(theme.text, 0.8);\n ctx.translate(input.width - line / 2 - 4, plot.y + plot.height / 2);\n ctx.rotate(Math.PI / 2);\n ctx.textAlign = \"center\";\n ctx.fillText(y2.title, 0, 0);\n ctx.restore();\n }\n }\n};\n\nconst overlaps = (a: Rect, b: Rect) =>\n a.x < b.x + b.width &&\n b.x < a.x + a.width &&\n a.y < b.y + b.height &&\n b.y < a.y + a.height;\n\nconst inside = (r: Rect, plot: Rect) =>\n r.x >= plot.x &&\n r.y >= plot.y &&\n r.x + r.width <= plot.x + plot.width &&\n r.y + r.height <= plot.y + plot.height;\n\n/** Text with a halo in the background color (readable over data) */\nconst haloText = (\n ctx: CanvasRenderingContext2D,\n text: string,\n x: number,\n y: number,\n color: string,\n halo: string,\n) => {\n ctx.lineWidth = 3;\n ctx.lineJoin = \"round\";\n ctx.strokeStyle = halo;\n ctx.strokeText(text, x, y);\n ctx.fillStyle = color;\n ctx.fillText(text, x, y);\n};\n\n/** Greedy placement: right, left, above, below the dot; skipped when no slot is free */\nexport const placeLabels = (\n labels: readonly PointLabel[],\n plot: Rect,\n measure: (text: string) => number,\n height: number,\n occupied: Rect[] = [],\n): { label: PointLabel; box: Rect }[] => {\n const placed: { label: PointLabel; box: Rect }[] = [];\n for (const label of labels) {\n const w = measure(label.text);\n const gap = label.r + 4;\n const above = {\n x: label.x - w / 2,\n y: label.y - gap - height,\n width: w,\n height,\n };\n const below = { x: label.x - w / 2, y: label.y + gap, width: w, height };\n const right = {\n x: label.x + gap,\n y: label.y - height / 2,\n width: w,\n height,\n };\n const left = {\n x: label.x - gap - w,\n y: label.y - height / 2,\n width: w,\n height,\n };\n const candidates: Rect[] =\n label.placement === \"above\"\n ? [above]\n : label.placement === \"below\"\n ? [below]\n : label.placement === \"right\"\n ? [right, left]\n : label.placement === \"left\"\n ? [left, right]\n : [\n {\n x: label.x + gap,\n y: label.y - height / 2,\n width: w,\n height,\n },\n {\n x: label.x - gap - w,\n y: label.y - height / 2,\n width: w,\n height,\n },\n above,\n below,\n ];\n const box = candidates.find(\n (c) => inside(c, plot) && !occupied.some((o) => overlaps(o, c)),\n );\n if (!box) continue;\n occupied.push(box);\n placed.push({ label, box });\n }\n return placed;\n};\n\nexport interface ForegroundInput {\n width: number;\n height: number;\n scales: Scales;\n theme: ChartTheme;\n annotations: readonly ResolvedAnnotation[];\n pointLabels: readonly PointLabel[];\n /**\n * Clears the canvas first (off when the layers share one canvas)\n * @default true\n */\n clear?: boolean;\n /** Lines between consecutive bars (waterfall connectors), drawn first */\n connectors?: readonly {\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n color: string;\n width: number;\n dash: readonly number[];\n }[];\n}\n\nexport const drawForeground = (\n ctx: CanvasRenderingContext2D,\n input: ForegroundInput,\n) => {\n const { scales, theme } = input;\n const { plot } = scales;\n if (input.clear !== false) ctx.clearRect(0, 0, input.width, input.height);\n ctx.save();\n ctx.beginPath();\n ctx.rect(plot.x, plot.y, plot.width, plot.height);\n ctx.clip();\n\n for (const c of input.connectors ?? []) {\n ctx.strokeStyle = c.color;\n ctx.lineWidth = c.width;\n ctx.setLineDash([...c.dash]);\n ctx.beginPath();\n // crisp hairlines along the pixel grid\n const along = c.y0 === c.y1;\n const x0 = along ? c.x0 : crisp(c.x0);\n const y0 = along ? crisp(c.y0) : c.y0;\n ctx.moveTo(x0, y0);\n ctx.lineTo(along ? c.x1 : x0, along ? y0 : c.y1);\n ctx.stroke();\n }\n ctx.setLineDash([]);\n\n const halo = toCss(theme.background, 0.9);\n const occupied: Rect[] = [];\n const labelHeight = theme.fontSize + 4;\n\n for (const a of input.annotations) {\n if (a.type !== \"line\") continue;\n const color = toCss(a.color);\n ctx.strokeStyle = color;\n ctx.lineWidth = a.width;\n ctx.setLineDash(a.dash);\n ctx.beginPath();\n const where = lineOf(a, scales);\n if (!where.vertical) {\n const py = crisp(where.at);\n ctx.moveTo(plot.x, py);\n ctx.lineTo(plot.x + plot.width, py);\n ctx.stroke();\n if (a.label) {\n ctx.setLineDash([]);\n ctx.font = font(theme, theme.fontSize, 500);\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"bottom\";\n haloText(ctx, a.label, plot.x + plot.width - 6, py - 3, color, halo);\n }\n } else {\n const px = crisp(where.at);\n ctx.moveTo(px, plot.y);\n ctx.lineTo(px, plot.y + plot.height);\n ctx.stroke();\n if (a.label) {\n ctx.setLineDash([]);\n ctx.font = font(theme, theme.fontSize, 500);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"top\";\n haloText(ctx, a.label, px + 5, plot.y + 5, color, halo);\n }\n }\n }\n ctx.setLineDash([]);\n\n // labels of areas\n ctx.font = font(theme, theme.fontSize + 1, 600);\n for (const a of input.annotations) {\n if (a.type !== \"rect\" || !a.label) continue;\n const r = rectOf(a, scales);\n if (r.width <= 0 || r.height <= 0) continue;\n const pad = 10;\n const w = ctx.measureText(a.label).width;\n const pos = a.labelPosition;\n const tx = pos.endsWith(\"left\")\n ? r.x + pad\n : pos.endsWith(\"right\")\n ? r.x + r.width - pad - w\n : r.x + (r.width - w) / 2;\n const ty = pos.startsWith(\"top\")\n ? r.y + pad\n : pos.startsWith(\"bottom\")\n ? r.y + r.height - pad - labelHeight\n : r.y + (r.height - labelHeight) / 2;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"top\";\n ctx.fillStyle = toCss(a.labelColor);\n ctx.fillText(a.label, tx, ty);\n occupied.push({ x: tx, y: ty, width: w, height: labelHeight });\n }\n\n // free texts\n for (const a of input.annotations) {\n if (a.type !== \"text\" || !a.text) continue;\n ctx.font = font(theme, theme.fontSize, a.weight);\n const box = textBox(a, scales, ctx.measureText(a.text).width, labelHeight);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n haloText(ctx, a.text, box.x, box.y + box.height / 2, toCss(a.color), halo);\n occupied.push(box);\n }\n\n // point labels\n if (input.pointLabels.length) {\n ctx.font = font(theme);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n const textColor = toCss(theme.text, 0.85);\n const placed = placeLabels(\n input.pointLabels,\n plot,\n (t) => ctx.measureText(t).width,\n labelHeight - 2,\n occupied,\n );\n for (const { label, box } of placed) {\n haloText(ctx, label.text, box.x, box.y + box.height / 2, textColor, halo);\n }\n }\n ctx.restore();\n};\n"],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
const e=require("./locale.cjs"),t=require("./scale.cjs");var
|
|
2
|
-
`)}}),xAxis:{min:n,max:r,title:e.xLabel,reverse:c,nice:!1,grid:!1,tickCount:4,visible:C||!!e.xLabel,...C?{}:{format:()=>``}},yAxis:{min:i,max:a,title:e.yLabel,nice:!1,grid:!1,tickCount:4,visible:C||!!e.yLabel,...C?{}:{format:()=>``}},legend:t.legend??!1,padding:t.padding??(C?void 0:{top:4,right:4,bottom:4,left:4}),interaction:w}},
|
|
1
|
+
const e=require("./locale.cjs"),t=require("./labels.cjs"),n=require("./scale.cjs");var r={en:{value:`Value`,values:`Values`,count:`Count`,change:`Change`,tasks:`Tasks`,progress:`Progress`,milestones:`Milestones`},zh:{value:`数值`,values:`数值`,count:`数量`,change:`变化`,tasks:`任务`,progress:`进度`,milestones:`里程碑`},ja:{value:`値`,values:`値`,count:`件数`,change:`増減`,tasks:`タスク`,progress:`進捗`,milestones:`マイルストーン`},fr:{value:`Valeur`,values:`Valeurs`,count:`Effectif`,change:`Variation`,tasks:`Tâches`,progress:`Avancement`,milestones:`Jalons`}},i=t=>e.localeLabels(r,t),a=(e,t,n,r)=>e.map(e=>{let i=e.type??t;return{...e,type:i,...n!==void 0&&i===t?{stack:e.stack??n}:{},...r!==void 0&&(i===`line`||i===`area`)?{curve:e.curve??r}:{}}}),o=(e,t=!1,n={})=>a(e,t?`area`:`line`,n.stacked?`stack`:void 0,n.curve),s=(e,t={})=>o(e,!0,t),c=(e,t=!1,n=!1)=>a(e,`bar`,t?`stack`:void 0).map(e=>n&&e.type===`bar`?{...e,showLabels:e.showLabels??!0}:e),l=e=>a(e,`scatter`),u=e=>a(e,`candlestick`),d=(e,t={})=>{let n=e.data.some(e=>typeof e.x==`number`),r=e.data.some(e=>typeof e.y==`number`);return{...t,series:[{id:`heatmap`,name:e.name??i(t.locale).value,type:`heatmap`,data:e.data.map(e=>({x:e.x,y:e.y,value:e.value})),colorScale:e.colorScale,valueRange:e.valueRange,colorMidpoint:e.colorMidpoint,radius:e.radius,format:e.format}],xAxis:{...n?{}:{type:`category`,categories:e.xCategories},grid:!1,...t.xAxis},yAxis:{...r?{}:{type:`category`,categories:e.yCategories},grid:!1,...t.yAxis},legend:t.legend??!0,interaction:t.interaction??{zoom:!1},tooltip:t.tooltip??{mode:`nearest`}}},f=(e,t={})=>{let n=e.type??`line`;return{...t,series:[{id:`sparkline`,name:e.name??i(t.locale).value,type:n,data:e.data,color:e.color,curve:n===`bar`?void 0:e.curve??`smooth`,lineWidth:1.5,opacity:n===`area`?.22:void 0,radius:n===`bar`?1.5:void 0,format:e.format}],xAxis:{visible:!1,grid:!1,...t.xAxis},yAxis:{visible:!1,grid:!1,nice:!1,...t.yAxis},legend:!1,padding:t.padding??{top:4,right:4,bottom:4,left:4},interaction:t.interaction??{zoom:!1},annotations:e.reference===void 0?t.annotations:[...t.annotations??[],{type:`line`,axis:`y`,value:e.reference,dash:[2,3]}]}},p={topLeft:`var(--danger-color, #ef4444)`,topRight:`var(--primary-color, #4f46e5)`,bottomLeft:`var(--warning-color, #f59e0b)`,bottomRight:`var(--text-secondary-color, #64748b)`},m=`var(--border-strong-color, var(--border-color, #cbd5e1))`,h=e=>{let[t,n]=e.xDomain??[0,10],[r,i]=e.yDomain??[0,10];return{x0:t,x1:n,y0:r,y1:i,xs:e.xSplit??(t+n)/2,ys:e.ySplit??(r+i)/2}},g=(e,t,n)=>{let{xs:r,ys:i}=h(e),a=e.reverseX?t<r:t>=r;return n>=i?a?`topRight`:`topLeft`:a?`bottomRight`:`bottomLeft`},_=(e,t)=>{let{x0:n,x1:r,y0:i,y1:a,xs:o,ys:s}=h(e),c=t.endsWith(`Right`);return{x:(e.reverseX?!c:c)?(o+r)/2:(n+o)/2,y:t.startsWith(`top`)?(s+a)/2:(i+s)/2}},v=(e,t={})=>{let{x0:n,x1:r,y0:i,y1:a,xs:o,ys:s}=h(e),c=!!e.reverseX,l=t=>e.quadrants?.[t]?.color??p[t],u=[{type:`scatter`,name:e.name??``,pointSize:e.pointSize??12,showLabels:e.showLabels??!0,opacity:.9,data:e.points.map(t=>({x:t.x,y:t.y,label:t.label,size:t.size,color:t.color??l(g(e,t.x,t.y))}))}],d=c?[o,r]:[n,o],f=c?[n,o]:[o,r],_=(t,[n,r],[i,a],o)=>({type:`rect`,x0:n,x1:r,y0:i,y1:a,color:l(t),opacity:.07,label:e.quadrants?.[t]?.label,labelPosition:o}),v=e.axisLabels??{},y=c?r:n,b=c?n:r,x=[...v.top?[{type:`text`,x:o,y:a,text:v.top,anchor:`top`}]:[],...v.bottom?[{type:`text`,x:o,y:i,text:v.bottom,anchor:`bottom`}]:[],...v.left?[{type:`text`,x:y,y:s,text:v.left,anchor:`left`}]:[],...v.right?[{type:`text`,x:b,y:s,text:v.right,anchor:`right`}]:[]],S=[_(`topLeft`,d,[s,a],`top-left`),_(`topRight`,f,[s,a],`top-right`),_(`bottomLeft`,d,[i,s],`bottom-left`),_(`bottomRight`,f,[i,s],`bottom-right`),{type:`line`,axis:`x`,value:o,dash:[],color:m},{type:`line`,axis:`y`,value:s,dash:[],color:m},...x,...t.annotations??[]],C=e.showTicks??!0,w=t.interaction!==!1&&{zoom:!1,...typeof t.interaction==`object`?t.interaction:{},...e.draggable?{dragPoints:!0}:{}};return{...t,series:u,annotations:S,tooltip:t.tooltip??(C?void 0:{render:t=>{let n=t.items[0];if(!n)return null;let r=e.quadrants?.[g(e,n.x,n.y)]?.label;return[n.label??e.name??``,r??``].filter(Boolean).join(`
|
|
2
|
+
`)}}),xAxis:{min:n,max:r,title:e.xLabel,reverse:c,nice:!1,grid:!1,tickCount:4,visible:C||!!e.xLabel,...C?{}:{format:()=>``}},yAxis:{min:i,max:a,title:e.yLabel,nice:!1,grid:!1,tickCount:4,visible:C||!!e.yLabel,...C?{}:{format:()=>``}},legend:t.legend??!1,padding:t.padding??(C?void 0:{top:4,right:4,bottom:4,left:4}),interaction:w}},y=e=>{let t=0;for(let n=0;n<e.length;n++)Number.isFinite(e[n])&&t++;let n=new Float64Array(t),r=0;for(let t=0;t<e.length;t++){let i=e[t];Number.isFinite(i)&&(n[r++]=i)}return n.sort()},b=(e,t)=>{let n=e.length;if(!n)return NaN;let r=Math.min(1,Math.max(0,t))*(n-1),i=Math.floor(r),a=Math.min(n-1,i+1);return e[i]+(e[a]-e[i])*(r-i)},x=(e,t)=>{let n=y(e);return t.map(e=>b(n,e))},S=1e5,C=(e,t={})=>{let r=0,i=1/0,a=-1/0;for(let t=0;t<e.length;t++){let n=e[t];Number.isFinite(n)&&(r++,n<i&&(i=n),n>a&&(a=n))}let[o,s]=t.domain??[i,a];if(!r||!Number.isFinite(o)||!Number.isFinite(s))return{edges:[0,1],counts:[0],width:1,total:0};o>s&&([o,s]=[s,o]),s===o&&(o-=.5,s+=.5);let c=s-o,l=t.bins??`auto`,u=Math.ceil(Math.log2(r))+1,d;if(typeof l==`number`)d=Math.round(l);else if(l===`sturges`)d=u;else{let t=Math.max(1,Math.floor(e.length/S)),n=[];for(let r=0;r<e.length;r+=t){let t=e[r];Number.isFinite(t)&&n.push(t)}let i=Float64Array.from(n).sort(),a=2*(b(i,.75)-b(i,.25))/Math.cbrt(r);d=a>0?Math.ceil(c/a):u}d=Math.max(1,Math.min(1e3,d||1));let f=c/d,p=o;(t.nice??!0)&&(f=n.tickStep(o,s,d)||f,p=Math.floor(o/f+1e-9)*f,d=Math.max(1,Math.ceil((s-p)/f-1e-9)));let m=p+d*f,h=Array(d).fill(0),g=0;for(let t=0;t<e.length;t++){let n=e[t];if(!(n>=p&&n<=m))continue;let r=Math.min(d-1,Math.floor((n-p)/f));h[r]++,g++}let _=[];for(let e=0;e<=d;e++)_.push(Number((p+e*f).toPrecision(12)));return{edges:_,counts:h,width:f,total:g}},w=(t,n={})=>{let r=n.binned??C(t,n),a=e.resolveLocale(n.locale),o=n.format??(e=>T(e,a));return{id:`histogram`,name:n.name??i(a).count,type:`bar`,color:n.color,barWidth:1,radius:1,data:r.counts.map((e,t)=>{let n=r.edges[t]??0,i=r.edges[t+1]??n;return{x:(n+i)/2,y:e,label:`${o(n)} – ${o(i)}`}})}},T=(t,n)=>e.numberFormat(n,{maximumSignificantDigits:6}).format(t),E=(e,t={})=>{let n=y(e),r=n.length;if(!r)return{low:NaN,q1:NaN,median:NaN,q3:NaN,high:NaN,outliers:[],min:NaN,max:NaN,mean:NaN,count:0};let i=b(n,.25),a=b(n,.5),o=b(n,.75),s=n[0],c=n[r-1],l=0;for(let e=0;e<r;e++)l+=n[e];let u=t.whisker??1.5,d=s,f=c,p=[];if(u!==`minmax`){let e=(o-i)*u,t=i-e,a=o+e,s=0;for(;s<r&&n[s]<t;)p.push(n[s++]);d=s<r?n[s]:i;let c=r-1,l=[];for(;c>=0&&n[c]>a;)l.push(n[c--]);f=c>=0?n[c]:o,p.push(...l.reverse())}return{low:Math.min(d,i),q1:i,median:a,q3:o,high:Math.max(f,o),outliers:p,min:s,max:c,mean:l/r,count:r}},D=(e,t={})=>e.map(e=>{let n=E(e.values,t);return{x:e.x,y:Number.isFinite(n.median)?n.median:null,low:n.low,q1:n.q1,q3:n.q3,high:n.high,outliers:n.outliers,...e.color?{color:e.color}:{}}}),O=e=>a(e,`boxplot`),k=(e,t={})=>{let n=t.upColor??`var(--success-color, #16a34a)`,r=t.downColor??`var(--danger-color, #dc2626)`,a=t.totalColor??`var(--primary-color, #4f46e5)`,o=t.start??0,s=e.map(e=>{if(e.kind===`total`||e.kind===`subtotal`)return{x:e.label,y:o,color:e.color??a};let t=e.value??0,i=o;return o+=t,{x:e.label,y0:i,y:o,color:e.color??(t>=0?n:r)}});return{id:`waterfall`,name:t.name??i(t.locale).change,type:`bar`,color:a,data:s,showLabels:t.labels??!1,format:t.format,connector:t.connector??!0}},A=(e,t={})=>{let n=t.minSize??6,r=t.maxSize??48,i=e=>{if(typeof e!=`object`||!e)return null;if(!(`length`in e))return e.value??null;let t=e,n=new Float64Array(t.length).fill(NaN);for(let e=0;e<t.length;e++){let r=t[e];if(r&&typeof r==`object`&&!Array.isArray(r)){let t=r.value;typeof t==`number`&&(n[e]=t)}}return n},a=t.maxValue??0;if(t.maxValue===void 0)for(let t of e){let e=i(t.data);if(e)for(let t=0;t<e.length;t++){let n=Math.abs(e[t]);n>a&&(a=n)}}let o=e=>Number.isFinite(e)&&a>0?Math.max(n,r*Math.sqrt(Math.min(1,Math.abs(e)/a))):n;return e.map(e=>{let t={...e,type:e.type??`scatter`,opacity:e.opacity??.68};if(t.type!==`scatter`)return t;let n=e.data;if(typeof n==`object`&&n&&!(`length`in n)){let e=n.value;if(!e)return t;let r=new Float32Array(e.length);for(let t=0;t<e.length;t++)r[t]=o(e[t]);return{...t,data:{...n,size:r}}}let r=n,i=[];for(let e=0;e<r.length;e++){let t=r[e];if(!t||typeof t!=`object`||Array.isArray(t))continue;let n=t;i.push({...n,size:n.size??o(typeof n.value==`number`?n.value:NaN)})}return i.sort((e,t)=>(t.size??0)-(e.size??0)),{...t,data:i}})},j=[`--primary-color`,`--success-color`,`--warning-color`,`--danger-color`,`--info-color`],M=[`#4f46e5`,`#10b981`,`#f59e0b`,`#ef4444`,`#0ea5e9`,`#8b5cf6`,`#14b8a6`,`#f97316`],N=e=>{let t=e%8,n=M[t]??`#4f46e5`,r=j[t];return r?`var(--chart-series-${t+1}, var(${r}, ${n}))`:`var(--chart-series-${t+1}, ${n})`},P=e=>e instanceof Date?e.getTime():e===void 0?NaN:e,F=(n,r={})=>{let a=e.resolveLocale(r.locale),o=i(a),s=t.chartLabels(a),c=r.taskName??o.tasks,l=r.progressName??o.progress,u=/^(zh|ja)\b/i.test(a)?`、`:`, `,d=[];for(let e of n){let t=e.group??c;!e.milestone&&!d.includes(t)&&d.push(t)}let f=e=>{let t=Math.max(0,d.indexOf(e));return r.colors?.[t]??N(t)},p=r.formatProgress??(t=>e.numberFormat(a,{style:`percent`,maximumFractionDigits:0}).format(t)),m=d.map(e=>({id:`gantt:${e}`,name:e,type:`bar`,stack:`gantt`,color:f(e),opacity:.3,barWidth:.62,radius:4,data:n.filter(t=>!t.milestone&&(t.group??c)===e).map(e=>{let t=[];return e.progress!==void 0&&t.push({name:l,value:p(Math.min(1,Math.max(0,e.progress)))}),e.dependencies?.length&&t.push({name:r.dependenciesName??s.dependencies,value:e.dependencies.join(u)}),{x:e.name,y0:P(e.start),y:P(e.end??e.start),...e.color?{color:e.color}:{},...t.length?{details:t}:{}}})})),h=n.filter(e=>!e.milestone&&e.progress!==void 0&&e.progress>0);h.length&&m.push({id:`gantt:progress`,name:l,type:`bar`,stack:`gantt`,tooltip:!1,color:`var(--text-secondary-color, #6b7280)`,radius:4,data:h.map(e=>{let t=P(e.start),n=P(e.end??e.start),r=Math.min(1,Math.max(0,e.progress??0));return{x:e.name,y0:t,y:t+(n-t)*r,label:p(r),color:e.color??f(e.group??c)}})});let g=n.filter(e=>e.milestone);g.length&&m.push({id:`gantt:milestones`,name:r.milestoneName??o.milestones,type:`scatter`,color:`var(--text-color, #1f2937)`,pointSize:13,opacity:1,data:g.map(e=>({x:e.name,y:P(e.start),...e.color?{color:e.color}:{}}))});let _=1/0,v=-1/0;for(let e of n)for(let t of[P(e.start),P(e.end??e.start)])t<_&&(_=t),t>v&&(v=t);let y=Number.isFinite(v-_)?Math.max((v-_)*.025,1):0;return{series:m,categories:n.map(e=>e.name),domain:Number.isFinite(_)?[_-y,v+y]:[0,1]}},I=(e,t)=>a(e,`area`,void 0,t).map(e=>e.type===`area`?{...e,lineWidth:e.lineWidth??1.5}:e);exports.DEFAULT_QUADRANT_COLORS=p,exports.areaSeries=s,exports.barSeries=c,exports.binValues=C,exports.boxplotData=D,exports.boxplotSeries=O,exports.boxplotStats=E,exports.bubbleSeries=A,exports.candlestickSeries=u,exports.ganttSeries=F,exports.heatmapChartOptions=d,exports.histogramSeries=w,exports.lineSeries=o,exports.paletteColor=N,exports.presetLabels=i,exports.quadrantCenter=_,exports.quadrantChartOptions=v,exports.quadrantOf=g,exports.quantiles=x,exports.rangeAreaSeries=I,exports.scatterSeries=l,exports.sparklineOptions=f,exports.waterfallSeries=k,exports.withSeriesType=a;
|
|
3
3
|
//# sourceMappingURL=presets.cjs.map
|