minerva-design 1.4.0 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/README.md +21 -21
- package/custom-elements.json +3072 -611
- package/dist/angular/fesm2022/minerva-angular.mjs +1491 -5
- package/dist/angular/fesm2022/minerva-angular.mjs.map +1 -1
- package/dist/angular/types/minerva-angular.d.ts +595 -5
- package/dist/charts/canvas.d.cts +4 -3
- package/dist/charts/canvas.d.ts +4 -3
- 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 +155 -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 +370 -255
- 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 +34 -1
- package/dist/charts/engine/controller.d.ts +34 -1
- package/dist/charts/engine/controller.js +318 -273
- 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 +1708 -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 +339 -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 +76 -0
- package/dist/charts/engine/graph/force.d.ts +76 -0
- package/dist/charts/engine/graph/force.js +423 -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 +50 -0
- package/dist/charts/engine/graph/geometry.d.ts +50 -0
- package/dist/charts/engine/graph/geometry.js +197 -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 +52 -0
- package/dist/charts/engine/graph/model.d.ts +52 -0
- package/dist/charts/engine/graph/model.js +108 -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 +640 -0
- package/dist/charts/engine/graph/types.d.ts +640 -0
- package/dist/charts/engine/graph/worker.cjs +52 -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 +135 -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.d.cts +17 -0
- package/dist/charts/engine/labels.d.ts +17 -0
- 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 +73 -3
- package/dist/charts/engine/model.d.ts +73 -3
- package/dist/charts/engine/model.js +258 -154
- package/dist/charts/engine/model.js.map +1 -1
- package/dist/charts/engine/orderbook/field.cjs +37 -0
- package/dist/charts/engine/orderbook/field.cjs.map +1 -0
- package/dist/charts/engine/orderbook/field.d.cts +92 -0
- package/dist/charts/engine/orderbook/field.d.ts +92 -0
- package/dist/charts/engine/orderbook/field.js +297 -0
- package/dist/charts/engine/orderbook/field.js.map +1 -0
- package/dist/charts/engine/orderbook/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 +566 -475
- package/dist/charts/engine/orderbook/heatmap.js.map +1 -1
- package/dist/charts/engine/orderbook/host.cjs +1 -1
- package/dist/charts/engine/orderbook/host.cjs.map +1 -1
- package/dist/charts/engine/orderbook/host.d.cts +8 -1
- package/dist/charts/engine/orderbook/host.d.ts +8 -1
- package/dist/charts/engine/orderbook/host.js +27 -5
- package/dist/charts/engine/orderbook/host.js.map +1 -1
- package/dist/charts/engine/orderbook/ladder.cjs +1 -1
- package/dist/charts/engine/orderbook/ladder.cjs.map +1 -1
- package/dist/charts/engine/orderbook/ladder.js +1 -1
- package/dist/charts/engine/orderbook/ladder.js.map +1 -1
- package/dist/charts/engine/orderbook/layout.cjs +2 -0
- package/dist/charts/engine/orderbook/layout.cjs.map +1 -0
- package/dist/charts/engine/orderbook/layout.d.cts +42 -0
- package/dist/charts/engine/orderbook/layout.d.ts +42 -0
- package/dist/charts/engine/orderbook/layout.js +76 -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 +4 -4
- package/dist/charts/engine/orderbook/tape.js.map +1 -1
- package/dist/charts/engine/orderbook/types.d.cts +27 -3
- package/dist/charts/engine/orderbook/types.d.ts +27 -3
- package/dist/charts/engine/overlay.cjs +1 -1
- package/dist/charts/engine/overlay.cjs.map +1 -1
- package/dist/charts/engine/overlay.d.cts +27 -0
- package/dist/charts/engine/overlay.d.ts +27 -0
- package/dist/charts/engine/overlay.js +34 -12
- 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 +35 -3
- package/dist/charts/engine/presets.d.ts +35 -3
- package/dist/charts/engine/presets.js +121 -101
- package/dist/charts/engine/presets.js.map +1 -1
- package/dist/charts/engine/renderers/canvas2d.cjs +1 -1
- package/dist/charts/engine/renderers/canvas2d.cjs.map +1 -1
- package/dist/charts/engine/renderers/canvas2d.js +13 -9
- package/dist/charts/engine/renderers/canvas2d.js.map +1 -1
- package/dist/charts/engine/renderers/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/renderers/follow.cjs +2 -0
- package/dist/charts/engine/renderers/follow.cjs.map +1 -0
- package/dist/charts/engine/renderers/follow.d.cts +8 -0
- package/dist/charts/engine/renderers/follow.d.ts +8 -0
- package/dist/charts/engine/renderers/follow.js +10 -0
- package/dist/charts/engine/renderers/follow.js.map +1 -0
- package/dist/charts/engine/renderers/gl-budget.cjs +2 -0
- package/dist/charts/engine/renderers/gl-budget.cjs.map +1 -0
- package/dist/charts/engine/renderers/gl-budget.d.cts +32 -0
- package/dist/charts/engine/renderers/gl-budget.d.ts +32 -0
- package/dist/charts/engine/renderers/gl-budget.js +95 -0
- package/dist/charts/engine/renderers/gl-budget.js.map +1 -0
- package/dist/charts/engine/renderers/gl.cjs +1 -1
- package/dist/charts/engine/renderers/gl.cjs.map +1 -1
- package/dist/charts/engine/renderers/gl.js +1 -1
- package/dist/charts/engine/renderers/gl.js.map +1 -1
- package/dist/charts/engine/renderers/shaders.cjs +9 -6
- package/dist/charts/engine/renderers/shaders.cjs.map +1 -1
- package/dist/charts/engine/renderers/shaders.d.cts +1 -1
- package/dist/charts/engine/renderers/shaders.d.ts +1 -1
- package/dist/charts/engine/renderers/shaders.js +9 -6
- package/dist/charts/engine/renderers/shaders.js.map +1 -1
- package/dist/charts/engine/renderers/types.cjs.map +1 -1
- package/dist/charts/engine/renderers/types.d.cts +2 -0
- package/dist/charts/engine/renderers/types.d.ts +2 -0
- package/dist/charts/engine/renderers/types.js.map +1 -1
- package/dist/charts/engine/renderers/webgl.cjs +1 -1
- package/dist/charts/engine/renderers/webgl.cjs.map +1 -1
- package/dist/charts/engine/renderers/webgl.js +85 -64
- package/dist/charts/engine/renderers/webgl.js.map +1 -1
- package/dist/charts/engine/renderers/webgl2.cjs +1 -1
- package/dist/charts/engine/renderers/webgl2.cjs.map +1 -1
- package/dist/charts/engine/renderers/webgl2.js +72 -58
- package/dist/charts/engine/renderers/webgl2.js.map +1 -1
- package/dist/charts/engine/renderers/webgpu.cjs +1 -1
- package/dist/charts/engine/renderers/webgpu.cjs.map +1 -1
- package/dist/charts/engine/renderers/webgpu.js +1 -1
- package/dist/charts/engine/renderers/webgpu.js.map +1 -1
- package/dist/charts/engine/scene.cjs +1 -1
- package/dist/charts/engine/scene.cjs.map +1 -1
- package/dist/charts/engine/scene.d.cts +104 -4
- package/dist/charts/engine/scene.d.ts +104 -4
- package/dist/charts/engine/scene.js +412 -193
- 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 +419 -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 +121 -8
- package/dist/charts/engine/shapes/types.d.ts +121 -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 +41 -3
- package/dist/charts/engine/three-d/canvas2d.d.ts +41 -3
- package/dist/charts/engine/three-d/canvas2d.js +166 -67
- package/dist/charts/engine/three-d/canvas2d.js.map +1 -1
- package/dist/charts/engine/three-d/chart.cjs +1 -1
- package/dist/charts/engine/three-d/chart.cjs.map +1 -1
- package/dist/charts/engine/three-d/chart.js +219 -215
- package/dist/charts/engine/three-d/chart.js.map +1 -1
- package/dist/charts/engine/three-d/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/oit.cjs +109 -0
- package/dist/charts/engine/three-d/oit.cjs.map +1 -0
- package/dist/charts/engine/three-d/oit.d.cts +34 -0
- package/dist/charts/engine/three-d/oit.d.ts +34 -0
- package/dist/charts/engine/three-d/oit.js +111 -0
- package/dist/charts/engine/three-d/oit.js.map +1 -0
- package/dist/charts/engine/three-d/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 +37 -3
- package/dist/charts/engine/three-d/render-types.d.ts +37 -3
- package/dist/charts/engine/three-d/render-types.js +6 -10
- package/dist/charts/engine/three-d/render-types.js.map +1 -1
- package/dist/charts/engine/three-d/shaders.cjs +109 -48
- package/dist/charts/engine/three-d/shaders.cjs.map +1 -1
- package/dist/charts/engine/three-d/shaders.d.cts +12 -5
- package/dist/charts/engine/three-d/shaders.d.ts +12 -5
- package/dist/charts/engine/three-d/shaders.js +118 -55
- 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 +18 -5
- package/dist/charts/engine/three-d/sort.d.ts +18 -5
- package/dist/charts/engine/three-d/sort.js +129 -43
- package/dist/charts/engine/three-d/sort.js.map +1 -1
- package/dist/charts/engine/three-d/types.d.cts +36 -0
- package/dist/charts/engine/three-d/types.d.ts +36 -0
- package/dist/charts/engine/three-d/webgl.cjs +1 -1
- package/dist/charts/engine/three-d/webgl.cjs.map +1 -1
- package/dist/charts/engine/three-d/webgl.d.cts +9 -0
- package/dist/charts/engine/three-d/webgl.d.ts +9 -0
- package/dist/charts/engine/three-d/webgl.js +199 -74
- 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 +231 -94
- 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 -1
- package/dist/charts/engine/trading/chart.d.ts +10 -1
- package/dist/charts/engine/trading/chart.js +1677 -813
- 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 +53 -9
- package/dist/charts/engine/trading/drawings.d.ts +53 -9
- package/dist/charts/engine/trading/drawings.js +346 -71
- 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 +19 -0
- package/dist/charts/engine/trading/format.d.ts +19 -0
- package/dist/charts/engine/trading/format.js +65 -21
- package/dist/charts/engine/trading/format.js.map +1 -1
- package/dist/charts/engine/trading/geometry.cjs +1 -1
- package/dist/charts/engine/trading/geometry.cjs.map +1 -1
- package/dist/charts/engine/trading/geometry.d.cts +16 -0
- package/dist/charts/engine/trading/geometry.d.ts +16 -0
- package/dist/charts/engine/trading/geometry.js +19 -4
- package/dist/charts/engine/trading/geometry.js.map +1 -1
- package/dist/charts/engine/trading/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 +104 -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 +49 -8
- package/dist/charts/engine/trading/studies.d.ts +49 -8
- package/dist/charts/engine/trading/studies.js +352 -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 +514 -16
- package/dist/charts/engine/trading/types.d.ts +514 -16
- package/dist/charts/engine/types.d.cts +106 -11
- package/dist/charts/engine/types.d.ts +106 -11
- 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 +51 -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 +219 -0
- package/dist/charts/react/graph.d.ts +219 -0
- package/dist/charts/react/graph.js +160 -0
- package/dist/charts/react/graph.js.map +1 -0
- package/dist/charts/react/orderbook.cjs +1 -1
- package/dist/charts/react/orderbook.cjs.map +1 -1
- package/dist/charts/react/orderbook.d.cts +3 -1
- package/dist/charts/react/orderbook.d.ts +3 -1
- package/dist/charts/react/orderbook.js +1 -0
- package/dist/charts/react/orderbook.js.map +1 -1
- package/dist/charts/react/shapes.cjs +1 -1
- package/dist/charts/react/shapes.cjs.map +1 -1
- package/dist/charts/react/shapes.d.cts +88 -4
- package/dist/charts/react/shapes.d.ts +88 -4
- package/dist/charts/react/shapes.js +55 -12
- package/dist/charts/react/shapes.js.map +1 -1
- package/dist/charts/react/three-d.cjs +1 -1
- package/dist/charts/react/three-d.cjs.map +1 -1
- package/dist/charts/react/three-d.d.cts +7 -0
- package/dist/charts/react/three-d.d.ts +7 -0
- package/dist/charts/react/three-d.js +14 -13
- package/dist/charts/react/three-d.js.map +1 -1
- package/dist/charts/react/trading.cjs +1 -1
- package/dist/charts/react/trading.cjs.map +1 -1
- package/dist/charts/react/trading.d.cts +54 -2
- package/dist/charts/react/trading.d.ts +54 -2
- 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 +5 -4
- 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 +296 -251
- 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 +42 -5
- 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 +278 -174
- 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 +110 -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 +421 -202
- 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 +419 -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 +136 -94
- 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/ChartBase.cjs +1 -1
- package/dist/native/components/Chart/ChartBase.cjs.map +1 -1
- package/dist/native/components/Chart/ChartBase.js +127 -115
- package/dist/native/components/Chart/ChartBase.js.map +1 -1
- package/dist/native/components/Chart/charts.cjs +1 -1
- package/dist/native/components/Chart/charts.cjs.map +1 -1
- package/dist/native/components/Chart/charts.js +8 -5
- package/dist/native/components/Chart/charts.js.map +1 -1
- package/dist/native/components/Chart/scene.cjs +1 -1
- package/dist/native/components/Chart/scene.cjs.map +1 -1
- package/dist/native/components/Chart/scene.d.cts +6 -1
- package/dist/native/components/Chart/scene.d.ts +6 -1
- package/dist/native/components/Chart/scene.js +226 -108
- package/dist/native/components/Chart/scene.js.map +1 -1
- package/dist/native/components/Chart/types.d.cts +7 -1
- package/dist/native/components/Chart/types.d.ts +7 -1
- package/dist/native/components/Charts/charts.cjs +1 -1
- package/dist/native/components/Charts/charts.cjs.map +1 -1
- package/dist/native/components/Charts/charts.js +60 -43
- 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.d.cts +1 -1
- package/dist/native/components/ShapeChart/ShapeChartBase.d.ts +1 -1
- package/dist/native/components/ShapeChart/ShapeChartBase.js +97 -106
- 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 +233 -70
- 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 +95 -8
- package/dist/native/components/ShapeChart/types.d.ts +95 -8
- package/dist/native/index.cjs +1 -1
- package/dist/native/index.js +2 -2
- package/dist/native/source/components/Chart/ChartBase.tsx +19 -6
- package/dist/native/source/components/Chart/charts.tsx +10 -3
- package/dist/native/source/components/Chart/scene.tsx +243 -14
- package/dist/native/source/components/Chart/types.ts +7 -0
- package/dist/native/source/components/Charts/charts.tsx +37 -2
- package/dist/native/source/components/Charts/types.ts +11 -0
- package/dist/native/source/components/ShapeChart/ShapeChartBase.tsx +10 -34
- 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 +376 -25
- 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 +99 -6
- package/dist/native/source/manifest.ts +1 -0
- package/dist/taro/chart-a11y.d.ts +7 -0
- package/dist/taro/charts.d.ts +29 -6
- package/dist/taro/index.js +3129 -1902
- package/dist/taro/shape-charts.d.ts +99 -5
- package/dist/uni/AreaChart.vue +2 -1
- package/dist/uni/AreaChart.vue.d.ts +5 -1
- package/dist/uni/Badge.vue.d.ts +1 -1
- package/dist/uni/BarChart.vue +2 -1
- package/dist/uni/BarChart.vue.d.ts +5 -1
- package/dist/uni/BoxPlotChart.vue +2 -1
- package/dist/uni/BoxPlotChart.vue.d.ts +8 -0
- package/dist/uni/BubbleChart.vue +2 -1
- 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 +2 -1
- package/dist/uni/CandlestickChart.vue.d.ts +4 -0
- package/dist/uni/Chart.vue +2 -1
- 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/Divider.vue.d.ts +1 -1
- package/dist/uni/DonutChart.vue.d.ts +5 -1
- package/dist/uni/FunnelChart.vue.d.ts +4 -0
- package/dist/uni/GanttChart.vue +2 -1
- package/dist/uni/GanttChart.vue.d.ts +15 -0
- package/dist/uni/GaugeChart.vue.d.ts +5 -1
- package/dist/uni/HeatmapChart.vue +2 -1
- package/dist/uni/HeatmapChart.vue.d.ts +8 -2
- package/dist/uni/HistogramChart.vue +2 -1
- package/dist/uni/HistogramChart.vue.d.ts +4 -0
- package/dist/uni/HorizontalBarChart.vue +2 -1
- package/dist/uni/HorizontalBarChart.vue.d.ts +3 -1
- package/dist/uni/LineChart.vue +2 -1
- package/dist/uni/LineChart.vue.d.ts +4 -0
- package/dist/uni/MixedChart.vue +2 -1
- package/dist/uni/MixedChart.vue.d.ts +4 -0
- package/dist/uni/PieChart.vue.d.ts +5 -1
- package/dist/uni/QuadrantChart.vue +2 -1
- 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 +2 -1
- package/dist/uni/RangeAreaChart.vue.d.ts +4 -0
- package/dist/uni/SankeyChart.vue.d.ts +4 -0
- package/dist/uni/ScatterChart.vue +2 -1
- package/dist/uni/ScatterChart.vue.d.ts +4 -0
- package/dist/uni/Sparkline.vue +2 -1
- 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 +2 -1
- package/dist/uni/WaterfallChart.vue.d.ts +9 -0
- package/dist/uni/chart-a11y.d.ts +7 -0
- package/dist/uni/chart-a11y.js +29 -0
- package/dist/uni/chart-canvas.d.ts +12 -0
- package/dist/uni/chart-canvas.js +15 -1
- package/dist/uni/chart-types.d.ts +36 -5
- package/dist/uni/chart-types.js +31 -3
- package/dist/uni/charts-canvas.js +3 -2
- 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 +11 -2
- package/dist/uni/named-chart-options.js +21 -1
- package/dist/uni/shape-chart-canvas.d.ts +3 -3
- package/dist/uni/shape-chart-canvas.js +17 -58
- package/dist/uni/shape-chart-types.d.ts +53 -3
- package/dist/uni/shape-chart-types.js +45 -1
- 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/Bar3DChart.vue.d.ts +2 -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 +181 -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 +19 -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 +12 -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 +186 -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/Line3DChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/OrderBookHeatmap.vue.d.ts +2 -0
- package/dist/vue/components/Chart/Scatter3DChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/Surface3DChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/TimeAndSales.vue.d.ts +2 -0
- package/dist/vue/components/Chart/TradingChart.vue.d.ts +58 -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 +174 -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 +156 -0
- package/dist/vue/components/Chart/graph.js +137 -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/three-d.d.ts +3 -0
- package/dist/vue/components/Chart/three-d.js +2 -0
- package/dist/vue/components/Chart/three-d.js.map +1 -1
- package/dist/vue/components/Chart/trading.d.ts +30 -3
- package/dist/vue/components/Chart/trading.js +9 -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/area-chart/index.wxml +1 -1
- package/dist/weapp/bar-chart/index.wxml +1 -1
- package/dist/weapp/box-plot-chart/index.wxml +1 -1
- package/dist/weapp/bubble-chart/index.wxml +1 -1
- package/dist/weapp/candlestick-chart/index.wxml +1 -1
- package/dist/weapp/chart/index.wxml +1 -1
- package/dist/weapp/charts/canvas.js +1987 -175
- package/dist/weapp/charts/core.js +3 -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 +148 -57
- package/dist/weapp/gantt-chart/index.wxml +1 -1
- package/dist/weapp/heatmap-chart/index.wxml +1 -1
- package/dist/weapp/histogram-chart/index.wxml +1 -1
- package/dist/weapp/horizontal-bar-chart/index.wxml +1 -1
- package/dist/weapp/line-chart/index.wxml +1 -1
- package/dist/weapp/mixed-chart/index.wxml +1 -1
- package/dist/weapp/quadrant-chart/index.wxml +1 -1
- package/dist/weapp/range-area-chart/index.wxml +1 -1
- package/dist/weapp/scatter-chart/index.wxml +1 -1
- package/dist/weapp/sparkline/index.wxml +1 -1
- package/dist/weapp/types.d.ts +96 -4
- package/dist/weapp/waterfall-chart/index.wxml +1 -1
- 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 +21 -7
- package/dist/web-components/components/chart/extended.js +29 -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/chart-3d/chart-3d.d.ts +1 -1
- package/dist/web-components/components/chart-3d/chart-3d.js.map +1 -1
- package/dist/web-components/components/graph/graph.d.ts +156 -0
- package/dist/web-components/components/graph/graph.js +150 -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 +318 -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,2 +1,2 @@
|
|
|
1
|
-
const e=require("./range.cjs"),t=require("./shaders.cjs");var n=64,r=async(r,i,a=!1)=>{let o=navigator.gpu;if(!o)return null;let s=await o.requestAdapter();if(!s)return null;let c=s;if(a&&(c.info?.isFallbackAdapter||c.isFallbackAdapter))return null;let l=await s.requestDevice(),u=r.getContext(`webgpu`);if(!u)return l.destroy(),null;let d=o.getPreferredCanvasFormat();u.configure({device:l,format:d,alphaMode:`premultiplied`});let f=!1;l.lost.then(()=>{f||i()});let p=l.createBindGroupLayout({entries:[{binding:0,visibility:3,buffer:{type:`uniform`}}]}),m=l.createPipelineLayout({bindGroupLayouts:[p]}),h={color:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`,operation:`add`},alpha:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`,operation:`add`}},g=(e,t)=>{let n=l.createShaderModule({code:e});return l.createRenderPipeline({layout:m,vertex:{module:n,entryPoint:`vs`,buffers:t},fragment:{module:n,entryPoint:`fs`,targets:[{format:d,blend:h}]},primitive:{topology:`triangle-strip`}})},_=(e,t)=>[{arrayStride:e,stepMode:`instance`,attributes:[{shaderLocation:0,offset:0,format:t}]},{arrayStride:e,stepMode:`instance`,attributes:[{shaderLocation:1,offset:0,format:t}]}],v={line:g(t.WGSL_LINE,_(8,`float32x2`)),area:g(t.WGSL_AREA,_(12,`float32x3`)),bar:g(t.WGSL_BAR,[{arrayStride:16,stepMode:`instance`,attributes:[{shaderLocation:0,offset:0,format:`float32x3`},{shaderLocation:1,offset:12,format:`unorm8x4`}]}]),scatter:g(t.WGSL_SCATTER,[{arrayStride:16,stepMode:`instance`,attributes:[{shaderLocation:0,offset:0,format:`float32x2`},{shaderLocation:1,offset:8,format:`float32`},{shaderLocation:2,offset:12,format:`unorm8x4`}]}])},y=new Map,b=new Float32Array(n/4),x=e=>{switch(e.kind){case`line`:return e.points.subarray(0,e.count*2);case`area`:return e.points.subarray(0,e.count*3);default:return e.instances}},S=e=>{let t=y.get(e.key);if(t&&t.version===e.version&&t.kind===e.kind)return t;t?.vertex?.destroy();let r=x(e),i=Math.max(16,Math.ceil(r.byteLength/4)*4),a=r.byteLength>0?l.createBuffer({size:i,usage:40}):null;if(a&&(r instanceof Float32Array?l.queue.writeBuffer(a,0,r.buffer,r.byteOffset,r.byteLength):l.queue.writeBuffer(a,0,r)),t)t.version=e.version,t.kind=e.kind,t.vertex=a;else{let r=l.createBuffer({size:n,usage:72});t={version:e.version,kind:e.kind,vertex:a,uniform:r,bindGroup:l.createBindGroup({layout:p,entries:[{binding:0,resource:{buffer:r}}]})},y.set(e.key,t)}return t},C=(e,t)=>{switch(e.kind){case`line`:return[e.width*t.dpr/2,0,0,0];case`area`:return[
|
|
1
|
+
const e=require("./range.cjs"),t=require("./shaders.cjs");var n=64,r=async(r,i,a=!1)=>{let o=navigator.gpu;if(!o)return null;let s=await o.requestAdapter();if(!s)return null;let c=s;if(a&&(c.info?.isFallbackAdapter||c.isFallbackAdapter))return null;let l=await s.requestDevice(),u=r.getContext(`webgpu`);if(!u)return l.destroy(),null;let d=o.getPreferredCanvasFormat();u.configure({device:l,format:d,alphaMode:`premultiplied`});let f=!1;l.lost.then(()=>{f||i()});let p=l.createBindGroupLayout({entries:[{binding:0,visibility:3,buffer:{type:`uniform`}}]}),m=l.createPipelineLayout({bindGroupLayouts:[p]}),h={color:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`,operation:`add`},alpha:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`,operation:`add`}},g=(e,t)=>{let n=l.createShaderModule({code:e});return l.createRenderPipeline({layout:m,vertex:{module:n,entryPoint:`vs`,buffers:t},fragment:{module:n,entryPoint:`fs`,targets:[{format:d,blend:h}]},primitive:{topology:`triangle-strip`}})},_=(e,t)=>[{arrayStride:e,stepMode:`instance`,attributes:[{shaderLocation:0,offset:0,format:t}]},{arrayStride:e,stepMode:`instance`,attributes:[{shaderLocation:1,offset:0,format:t}]}],v={line:g(t.WGSL_LINE,_(8,`float32x2`)),area:g(t.WGSL_AREA,_(12,`float32x3`)),bar:g(t.WGSL_BAR,[{arrayStride:16,stepMode:`instance`,attributes:[{shaderLocation:0,offset:0,format:`float32x3`},{shaderLocation:1,offset:12,format:`unorm8x4`}]}]),scatter:g(t.WGSL_SCATTER,[{arrayStride:16,stepMode:`instance`,attributes:[{shaderLocation:0,offset:0,format:`float32x2`},{shaderLocation:1,offset:8,format:`float32`},{shaderLocation:2,offset:12,format:`unorm8x4`}]}])},y=new Map,b=new Float32Array(n/4),x=e=>{switch(e.kind){case`line`:return e.points.subarray(0,e.count*2);case`area`:return e.points.subarray(0,e.count*3);default:return e.instances}},S=e=>{let t=y.get(e.key);if(t&&t.version===e.version&&t.kind===e.kind)return t;t?.vertex?.destroy();let r=x(e),i=Math.max(16,Math.ceil(r.byteLength/4)*4),a=r.byteLength>0?l.createBuffer({size:i,usage:40}):null;if(a&&(r instanceof Float32Array?l.queue.writeBuffer(a,0,r.buffer,r.byteOffset,r.byteLength):l.queue.writeBuffer(a,0,r)),t)t.version=e.version,t.kind=e.kind,t.vertex=a;else{let r=l.createBuffer({size:n,usage:72});t={version:e.version,kind:e.kind,vertex:a,uniform:r,bindGroup:l.createBindGroup({layout:p,entries:[{binding:0,resource:{buffer:r}}]})},y.set(e.key,t)}return t},C=(e,t)=>{switch(e.kind){case`line`:return[e.width*t.dpr/2,0,0,0];case`area`:return[+!!e.flat,e.opacity,0,0];case`bar`:return[e.halfWidth,e.radius,e.inset,e.minHalf];default:return[e.opacity,e.stroke,0,0]}};return{kind:`webgpu`,canvas:r,resize(e,t){r.width=Math.max(1,e),r.height=Math.max(1,t)},render(t,n){if(f)return;let r=new Set,i=l.createCommandEncoder(),a=i.beginRenderPass({colorAttachments:[{view:u.getCurrentTexture().createView(),clearValue:{r:0,g:0,b:0,a:0},loadOp:`clear`,storeOp:`store`}]}),o=n.transform;for(let i of t){r.add(i.key);let[t,s]=e.instanceRange(i,n);if(s<=0)continue;let c=S(i);c.vertex&&(b.set([o.xScale,o.xOffset,o.yScale,o.yOffset,n.width,n.height,n.dpr,0,...i.color,...C(i,n)],0),l.queue.writeBuffer(c.uniform,0,b),a.setPipeline(v[i.kind]),a.setBindGroup(0,c.bindGroup),a.setVertexBuffer(0,c.vertex),i.kind===`line`?a.setVertexBuffer(1,c.vertex,8):i.kind===`area`&&a.setVertexBuffer(1,c.vertex,12),a.draw(4,s,0,t))}a.end(),l.queue.submit([i.finish()]);for(let[e,t]of y)r.has(e)||(t.vertex?.destroy(),t.uniform.destroy(),y.delete(e))},destroy(){f=!0;for(let e of y.values())e.vertex?.destroy(),e.uniform.destroy();y.clear(),u.unconfigure(),l.destroy()}}};exports.createWebGpuRenderer=r;
|
|
2
2
|
//# sourceMappingURL=webgpu.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgpu.cjs","names":["WGSL_LINE","WGSL_AREA","WGSL_BAR","WGSL_SCATTER","instanceRange","require_range","require_shaders","UNIFORM_SIZE","createWebGpuRenderer","gpu","adapter","fallback","requireHardware","device","context","canvas","format","destroyed","onLost","bindGroupLayout","layout","blend","pipeline","module","segment","stride","pipelines","resources","uniformData","vertexData","item","upload","res","data","size","vertex","uniform","params","frame","width","height","seen","encoder","pass","t","items","first","instances","key"],"sources":["../../../../../charts/src/engine/renderers/webgpu.ts"],"sourcesContent":["// WebGPU backend: one instanced draw per series.\n\nimport type { ChartRendererKind } from \"../types\";\nimport { instanceRange } from \"./range\";\nimport { WGSL_AREA, WGSL_BAR, WGSL_LINE, WGSL_SCATTER } from \"./shaders\";\nimport {\n AREA_STRIDE,\n BAR_STRIDE,\n SCATTER_STRIDE,\n type ChartRenderer,\n type RenderFrame,\n type RenderItem,\n type RendererLostHandler,\n} from \"./types\";\n\n// lib.dom has the WebGPU interfaces but not these constant objects\nconst BUFFER_VERTEX = 0x20;\nconst BUFFER_UNIFORM = 0x40;\nconst BUFFER_COPY_DST = 0x08;\nconst STAGE_VERTEX = 0x1;\nconst STAGE_FRAGMENT = 0x2;\n\nconst UNIFORM_SIZE = 64;\n\ninterface ItemResources {\n version: number;\n kind: RenderItem[\"kind\"];\n vertex: GPUBuffer | null;\n uniform: GPUBuffer;\n bindGroup: GPUBindGroup;\n}\n\ntype GpuNavigator = Navigator & { gpu?: GPU };\n\n/** Whether `navigator.gpu` exists (an adapter may still be unavailable) */\nexport const hasWebGpu = (): boolean =>\n typeof navigator !== \"undefined\" && !!(navigator as GpuNavigator).gpu;\n\nexport const createWebGpuRenderer = async (\n canvas: HTMLCanvasElement,\n onLost: RendererLostHandler,\n /** Refuses fallback (software) adapters */\n requireHardware = false,\n): Promise<ChartRenderer | null> => {\n const gpu = (navigator as GpuNavigator).gpu;\n if (!gpu) return null;\n const adapter = await gpu.requestAdapter();\n if (!adapter) return null;\n const fallback = adapter as GPUAdapter & {\n isFallbackAdapter?: boolean;\n info?: { isFallbackAdapter?: boolean };\n };\n if (\n requireHardware &&\n (fallback.info?.isFallbackAdapter || fallback.isFallbackAdapter)\n ) {\n return null;\n }\n const device = await adapter.requestDevice();\n const context = canvas.getContext(\"webgpu\") as GPUCanvasContext | null;\n if (!context) {\n device.destroy();\n return null;\n }\n const format = gpu.getPreferredCanvasFormat();\n context.configure({ device, format, alphaMode: \"premultiplied\" });\n\n let destroyed = false;\n void device.lost.then(() => {\n if (!destroyed) onLost();\n });\n\n const bindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: STAGE_VERTEX | STAGE_FRAGMENT,\n buffer: { type: \"uniform\" },\n },\n ],\n });\n const layout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n const blend: GPUBlendState = {\n color: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n alpha: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n };\n const pipeline = (code: string, buffers: GPUVertexBufferLayout[]) => {\n const module = device.createShaderModule({ code });\n return device.createRenderPipeline({\n layout,\n vertex: { module, entryPoint: \"vs\", buffers },\n fragment: {\n module,\n entryPoint: \"fs\",\n targets: [{ format, blend }],\n },\n primitive: { topology: \"triangle-strip\" },\n });\n };\n const segment = (\n stride: number,\n format: GPUVertexFormat,\n ): GPUVertexBufferLayout[] => [\n {\n arrayStride: stride,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 0, offset: 0, format }],\n },\n {\n arrayStride: stride,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 1, offset: 0, format }],\n },\n ];\n const pipelines = {\n line: pipeline(WGSL_LINE, segment(8, \"float32x2\")),\n area: pipeline(WGSL_AREA, segment(AREA_STRIDE * 4, \"float32x3\")),\n bar: pipeline(WGSL_BAR, [\n {\n arrayStride: BAR_STRIDE,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x3\" },\n { shaderLocation: 1, offset: 12, format: \"unorm8x4\" },\n ],\n },\n ]),\n scatter: pipeline(WGSL_SCATTER, [\n {\n arrayStride: SCATTER_STRIDE,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" },\n { shaderLocation: 1, offset: 8, format: \"float32\" },\n { shaderLocation: 2, offset: 12, format: \"unorm8x4\" },\n ],\n },\n ]),\n };\n\n const resources = new Map<string, ItemResources>();\n const uniformData = new Float32Array(UNIFORM_SIZE / 4);\n\n const vertexData = (item: RenderItem): ArrayBuffer | Float32Array => {\n switch (item.kind) {\n case \"line\":\n return item.points.subarray(0, item.count * 2);\n case \"area\":\n return item.points.subarray(0, item.count * AREA_STRIDE);\n default:\n return item.instances;\n }\n };\n\n const upload = (item: RenderItem): ItemResources => {\n let res = resources.get(item.key);\n if (res && res.version === item.version && res.kind === item.kind) {\n return res;\n }\n res?.vertex?.destroy();\n const data = vertexData(item);\n const size = Math.max(16, Math.ceil(data.byteLength / 4) * 4);\n const vertex =\n data.byteLength > 0\n ? device.createBuffer({ size, usage: BUFFER_VERTEX | BUFFER_COPY_DST })\n : null;\n if (vertex) {\n if (data instanceof Float32Array) {\n device.queue.writeBuffer(\n vertex,\n 0,\n data.buffer,\n data.byteOffset,\n data.byteLength,\n );\n } else {\n device.queue.writeBuffer(vertex, 0, data);\n }\n }\n if (!res) {\n const uniform = device.createBuffer({\n size: UNIFORM_SIZE,\n usage: BUFFER_UNIFORM | BUFFER_COPY_DST,\n });\n res = {\n version: item.version,\n kind: item.kind,\n vertex,\n uniform,\n bindGroup: device.createBindGroup({\n layout: bindGroupLayout,\n entries: [{ binding: 0, resource: { buffer: uniform } }],\n }),\n };\n resources.set(item.key, res);\n } else {\n res.version = item.version;\n res.kind = item.kind;\n res.vertex = vertex;\n }\n return res;\n };\n\n const params = (item: RenderItem, frame: RenderFrame): number[] => {\n switch (item.kind) {\n case \"line\":\n return [(item.width * frame.dpr) / 2, 0, 0, 0];\n case \"area\":\n return [0, item.opacity, 0, 0];\n case \"bar\":\n return [item.halfWidth, item.radius, item.inset, item.minHalf];\n default:\n return [item.opacity, item.stroke, 0, 0];\n }\n };\n\n const renderer: ChartRenderer = {\n kind: \"webgpu\" satisfies ChartRendererKind,\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n if (destroyed) return;\n const seen = new Set<string>();\n const encoder = device.createCommandEncoder();\n const pass = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: context.getCurrentTexture().createView(),\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n const t = frame.transform;\n for (const item of items) {\n seen.add(item.key);\n const [first, instances] = instanceRange(item, frame);\n if (instances <= 0) continue;\n const res = upload(item);\n if (!res.vertex) continue;\n uniformData.set(\n [\n t.xScale,\n t.xOffset,\n t.yScale,\n t.yOffset,\n frame.width,\n frame.height,\n frame.dpr,\n 0,\n ...item.color,\n ...params(item, frame),\n ],\n 0,\n );\n device.queue.writeBuffer(res.uniform, 0, uniformData);\n pass.setPipeline(pipelines[item.kind]);\n pass.setBindGroup(0, res.bindGroup);\n pass.setVertexBuffer(0, res.vertex);\n if (item.kind === \"line\") {\n pass.setVertexBuffer(1, res.vertex, 8);\n } else if (item.kind === \"area\") {\n pass.setVertexBuffer(1, res.vertex, AREA_STRIDE * 4);\n }\n pass.draw(4, instances, 0, first);\n }\n pass.end();\n device.queue.submit([encoder.finish()]);\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n res.vertex?.destroy();\n res.uniform.destroy();\n resources.delete(key);\n }\n }\n },\n destroy() {\n destroyed = true;\n for (const res of resources.values()) {\n res.vertex?.destroy();\n res.uniform.destroy();\n }\n resources.clear();\n context.unconfigure();\n device.destroy();\n },\n };\n return renderer;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"webgpu.cjs","names":["WGSL_LINE","WGSL_AREA","WGSL_BAR","WGSL_SCATTER","instanceRange","require_range","require_shaders","UNIFORM_SIZE","createWebGpuRenderer","gpu","adapter","fallback","requireHardware","device","context","canvas","format","destroyed","onLost","bindGroupLayout","layout","blend","pipeline","module","segment","stride","pipelines","resources","uniformData","vertexData","item","upload","res","data","size","vertex","uniform","params","frame","width","height","seen","encoder","pass","t","items","first","instances","key"],"sources":["../../../../../charts/src/engine/renderers/webgpu.ts"],"sourcesContent":["// WebGPU backend: one instanced draw per series.\n\nimport type { ChartRendererKind } from \"../types\";\nimport { instanceRange } from \"./range\";\nimport { WGSL_AREA, WGSL_BAR, WGSL_LINE, WGSL_SCATTER } from \"./shaders\";\nimport {\n AREA_STRIDE,\n BAR_STRIDE,\n SCATTER_STRIDE,\n type ChartRenderer,\n type RenderFrame,\n type RenderItem,\n type RendererLostHandler,\n} from \"./types\";\n\n// lib.dom has the WebGPU interfaces but not these constant objects\nconst BUFFER_VERTEX = 0x20;\nconst BUFFER_UNIFORM = 0x40;\nconst BUFFER_COPY_DST = 0x08;\nconst STAGE_VERTEX = 0x1;\nconst STAGE_FRAGMENT = 0x2;\n\nconst UNIFORM_SIZE = 64;\n\ninterface ItemResources {\n version: number;\n kind: RenderItem[\"kind\"];\n vertex: GPUBuffer | null;\n uniform: GPUBuffer;\n bindGroup: GPUBindGroup;\n}\n\ntype GpuNavigator = Navigator & { gpu?: GPU };\n\n/** Whether `navigator.gpu` exists (an adapter may still be unavailable) */\nexport const hasWebGpu = (): boolean =>\n typeof navigator !== \"undefined\" && !!(navigator as GpuNavigator).gpu;\n\nexport const createWebGpuRenderer = async (\n canvas: HTMLCanvasElement,\n onLost: RendererLostHandler,\n /** Refuses fallback (software) adapters */\n requireHardware = false,\n): Promise<ChartRenderer | null> => {\n const gpu = (navigator as GpuNavigator).gpu;\n if (!gpu) return null;\n const adapter = await gpu.requestAdapter();\n if (!adapter) return null;\n const fallback = adapter as GPUAdapter & {\n isFallbackAdapter?: boolean;\n info?: { isFallbackAdapter?: boolean };\n };\n if (\n requireHardware &&\n (fallback.info?.isFallbackAdapter || fallback.isFallbackAdapter)\n ) {\n return null;\n }\n const device = await adapter.requestDevice();\n const context = canvas.getContext(\"webgpu\") as GPUCanvasContext | null;\n if (!context) {\n device.destroy();\n return null;\n }\n const format = gpu.getPreferredCanvasFormat();\n context.configure({ device, format, alphaMode: \"premultiplied\" });\n\n let destroyed = false;\n void device.lost.then(() => {\n if (!destroyed) onLost();\n });\n\n const bindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: STAGE_VERTEX | STAGE_FRAGMENT,\n buffer: { type: \"uniform\" },\n },\n ],\n });\n const layout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n const blend: GPUBlendState = {\n color: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n alpha: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n };\n const pipeline = (code: string, buffers: GPUVertexBufferLayout[]) => {\n const module = device.createShaderModule({ code });\n return device.createRenderPipeline({\n layout,\n vertex: { module, entryPoint: \"vs\", buffers },\n fragment: {\n module,\n entryPoint: \"fs\",\n targets: [{ format, blend }],\n },\n primitive: { topology: \"triangle-strip\" },\n });\n };\n const segment = (\n stride: number,\n format: GPUVertexFormat,\n ): GPUVertexBufferLayout[] => [\n {\n arrayStride: stride,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 0, offset: 0, format }],\n },\n {\n arrayStride: stride,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 1, offset: 0, format }],\n },\n ];\n const pipelines = {\n line: pipeline(WGSL_LINE, segment(8, \"float32x2\")),\n area: pipeline(WGSL_AREA, segment(AREA_STRIDE * 4, \"float32x3\")),\n bar: pipeline(WGSL_BAR, [\n {\n arrayStride: BAR_STRIDE,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x3\" },\n { shaderLocation: 1, offset: 12, format: \"unorm8x4\" },\n ],\n },\n ]),\n scatter: pipeline(WGSL_SCATTER, [\n {\n arrayStride: SCATTER_STRIDE,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" },\n { shaderLocation: 1, offset: 8, format: \"float32\" },\n { shaderLocation: 2, offset: 12, format: \"unorm8x4\" },\n ],\n },\n ]),\n };\n\n const resources = new Map<string, ItemResources>();\n const uniformData = new Float32Array(UNIFORM_SIZE / 4);\n\n const vertexData = (item: RenderItem): ArrayBuffer | Float32Array => {\n switch (item.kind) {\n case \"line\":\n return item.points.subarray(0, item.count * 2);\n case \"area\":\n return item.points.subarray(0, item.count * AREA_STRIDE);\n default:\n return item.instances;\n }\n };\n\n const upload = (item: RenderItem): ItemResources => {\n let res = resources.get(item.key);\n if (res && res.version === item.version && res.kind === item.kind) {\n return res;\n }\n res?.vertex?.destroy();\n const data = vertexData(item);\n const size = Math.max(16, Math.ceil(data.byteLength / 4) * 4);\n const vertex =\n data.byteLength > 0\n ? device.createBuffer({ size, usage: BUFFER_VERTEX | BUFFER_COPY_DST })\n : null;\n if (vertex) {\n if (data instanceof Float32Array) {\n device.queue.writeBuffer(\n vertex,\n 0,\n data.buffer,\n data.byteOffset,\n data.byteLength,\n );\n } else {\n device.queue.writeBuffer(vertex, 0, data);\n }\n }\n if (!res) {\n const uniform = device.createBuffer({\n size: UNIFORM_SIZE,\n usage: BUFFER_UNIFORM | BUFFER_COPY_DST,\n });\n res = {\n version: item.version,\n kind: item.kind,\n vertex,\n uniform,\n bindGroup: device.createBindGroup({\n layout: bindGroupLayout,\n entries: [{ binding: 0, resource: { buffer: uniform } }],\n }),\n };\n resources.set(item.key, res);\n } else {\n res.version = item.version;\n res.kind = item.kind;\n res.vertex = vertex;\n }\n return res;\n };\n\n const params = (item: RenderItem, frame: RenderFrame): number[] => {\n switch (item.kind) {\n case \"line\":\n return [(item.width * frame.dpr) / 2, 0, 0, 0];\n case \"area\":\n return [item.flat ? 1 : 0, item.opacity, 0, 0];\n case \"bar\":\n return [item.halfWidth, item.radius, item.inset, item.minHalf];\n default:\n return [item.opacity, item.stroke, 0, 0];\n }\n };\n\n const renderer: ChartRenderer = {\n kind: \"webgpu\" satisfies ChartRendererKind,\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n if (destroyed) return;\n const seen = new Set<string>();\n const encoder = device.createCommandEncoder();\n const pass = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: context.getCurrentTexture().createView(),\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n const t = frame.transform;\n for (const item of items) {\n seen.add(item.key);\n const [first, instances] = instanceRange(item, frame);\n if (instances <= 0) continue;\n const res = upload(item);\n if (!res.vertex) continue;\n uniformData.set(\n [\n t.xScale,\n t.xOffset,\n t.yScale,\n t.yOffset,\n frame.width,\n frame.height,\n frame.dpr,\n 0,\n ...item.color,\n ...params(item, frame),\n ],\n 0,\n );\n device.queue.writeBuffer(res.uniform, 0, uniformData);\n pass.setPipeline(pipelines[item.kind]);\n pass.setBindGroup(0, res.bindGroup);\n pass.setVertexBuffer(0, res.vertex);\n if (item.kind === \"line\") {\n pass.setVertexBuffer(1, res.vertex, 8);\n } else if (item.kind === \"area\") {\n pass.setVertexBuffer(1, res.vertex, AREA_STRIDE * 4);\n }\n pass.draw(4, instances, 0, first);\n }\n pass.end();\n device.queue.submit([encoder.finish()]);\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n res.vertex?.destroy();\n res.uniform.destroy();\n resources.delete(key);\n }\n }\n },\n destroy() {\n destroyed = true;\n for (const res of resources.values()) {\n res.vertex?.destroy();\n res.uniform.destroy();\n }\n resources.clear();\n context.unconfigure();\n device.destroy();\n },\n };\n return renderer;\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgpu.js","names":["UNIFORM_SIZE","createWebGpuRenderer","gpu","adapter","fallback","requireHardware","device","context","canvas","format","destroyed","onLost","bindGroupLayout","layout","blend","pipeline","module","segment","stride","pipelines","WGSL_LINE","WGSL_AREA","WGSL_BAR","WGSL_SCATTER","resources","uniformData","vertexData","item","upload","res","data","size","vertex","uniform","params","frame","width","height","seen","encoder","pass","t","items","first","instances","instanceRange","key"],"sources":["../../../../../charts/src/engine/renderers/webgpu.ts"],"sourcesContent":["// WebGPU backend: one instanced draw per series.\n\nimport type { ChartRendererKind } from \"../types\";\nimport { instanceRange } from \"./range\";\nimport { WGSL_AREA, WGSL_BAR, WGSL_LINE, WGSL_SCATTER } from \"./shaders\";\nimport {\n AREA_STRIDE,\n BAR_STRIDE,\n SCATTER_STRIDE,\n type ChartRenderer,\n type RenderFrame,\n type RenderItem,\n type RendererLostHandler,\n} from \"./types\";\n\n// lib.dom has the WebGPU interfaces but not these constant objects\nconst BUFFER_VERTEX = 0x20;\nconst BUFFER_UNIFORM = 0x40;\nconst BUFFER_COPY_DST = 0x08;\nconst STAGE_VERTEX = 0x1;\nconst STAGE_FRAGMENT = 0x2;\n\nconst UNIFORM_SIZE = 64;\n\ninterface ItemResources {\n version: number;\n kind: RenderItem[\"kind\"];\n vertex: GPUBuffer | null;\n uniform: GPUBuffer;\n bindGroup: GPUBindGroup;\n}\n\ntype GpuNavigator = Navigator & { gpu?: GPU };\n\n/** Whether `navigator.gpu` exists (an adapter may still be unavailable) */\nexport const hasWebGpu = (): boolean =>\n typeof navigator !== \"undefined\" && !!(navigator as GpuNavigator).gpu;\n\nexport const createWebGpuRenderer = async (\n canvas: HTMLCanvasElement,\n onLost: RendererLostHandler,\n /** Refuses fallback (software) adapters */\n requireHardware = false,\n): Promise<ChartRenderer | null> => {\n const gpu = (navigator as GpuNavigator).gpu;\n if (!gpu) return null;\n const adapter = await gpu.requestAdapter();\n if (!adapter) return null;\n const fallback = adapter as GPUAdapter & {\n isFallbackAdapter?: boolean;\n info?: { isFallbackAdapter?: boolean };\n };\n if (\n requireHardware &&\n (fallback.info?.isFallbackAdapter || fallback.isFallbackAdapter)\n ) {\n return null;\n }\n const device = await adapter.requestDevice();\n const context = canvas.getContext(\"webgpu\") as GPUCanvasContext | null;\n if (!context) {\n device.destroy();\n return null;\n }\n const format = gpu.getPreferredCanvasFormat();\n context.configure({ device, format, alphaMode: \"premultiplied\" });\n\n let destroyed = false;\n void device.lost.then(() => {\n if (!destroyed) onLost();\n });\n\n const bindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: STAGE_VERTEX | STAGE_FRAGMENT,\n buffer: { type: \"uniform\" },\n },\n ],\n });\n const layout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n const blend: GPUBlendState = {\n color: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n alpha: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n };\n const pipeline = (code: string, buffers: GPUVertexBufferLayout[]) => {\n const module = device.createShaderModule({ code });\n return device.createRenderPipeline({\n layout,\n vertex: { module, entryPoint: \"vs\", buffers },\n fragment: {\n module,\n entryPoint: \"fs\",\n targets: [{ format, blend }],\n },\n primitive: { topology: \"triangle-strip\" },\n });\n };\n const segment = (\n stride: number,\n format: GPUVertexFormat,\n ): GPUVertexBufferLayout[] => [\n {\n arrayStride: stride,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 0, offset: 0, format }],\n },\n {\n arrayStride: stride,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 1, offset: 0, format }],\n },\n ];\n const pipelines = {\n line: pipeline(WGSL_LINE, segment(8, \"float32x2\")),\n area: pipeline(WGSL_AREA, segment(AREA_STRIDE * 4, \"float32x3\")),\n bar: pipeline(WGSL_BAR, [\n {\n arrayStride: BAR_STRIDE,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x3\" },\n { shaderLocation: 1, offset: 12, format: \"unorm8x4\" },\n ],\n },\n ]),\n scatter: pipeline(WGSL_SCATTER, [\n {\n arrayStride: SCATTER_STRIDE,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" },\n { shaderLocation: 1, offset: 8, format: \"float32\" },\n { shaderLocation: 2, offset: 12, format: \"unorm8x4\" },\n ],\n },\n ]),\n };\n\n const resources = new Map<string, ItemResources>();\n const uniformData = new Float32Array(UNIFORM_SIZE / 4);\n\n const vertexData = (item: RenderItem): ArrayBuffer | Float32Array => {\n switch (item.kind) {\n case \"line\":\n return item.points.subarray(0, item.count * 2);\n case \"area\":\n return item.points.subarray(0, item.count * AREA_STRIDE);\n default:\n return item.instances;\n }\n };\n\n const upload = (item: RenderItem): ItemResources => {\n let res = resources.get(item.key);\n if (res && res.version === item.version && res.kind === item.kind) {\n return res;\n }\n res?.vertex?.destroy();\n const data = vertexData(item);\n const size = Math.max(16, Math.ceil(data.byteLength / 4) * 4);\n const vertex =\n data.byteLength > 0\n ? device.createBuffer({ size, usage: BUFFER_VERTEX | BUFFER_COPY_DST })\n : null;\n if (vertex) {\n if (data instanceof Float32Array) {\n device.queue.writeBuffer(\n vertex,\n 0,\n data.buffer,\n data.byteOffset,\n data.byteLength,\n );\n } else {\n device.queue.writeBuffer(vertex, 0, data);\n }\n }\n if (!res) {\n const uniform = device.createBuffer({\n size: UNIFORM_SIZE,\n usage: BUFFER_UNIFORM | BUFFER_COPY_DST,\n });\n res = {\n version: item.version,\n kind: item.kind,\n vertex,\n uniform,\n bindGroup: device.createBindGroup({\n layout: bindGroupLayout,\n entries: [{ binding: 0, resource: { buffer: uniform } }],\n }),\n };\n resources.set(item.key, res);\n } else {\n res.version = item.version;\n res.kind = item.kind;\n res.vertex = vertex;\n }\n return res;\n };\n\n const params = (item: RenderItem, frame: RenderFrame): number[] => {\n switch (item.kind) {\n case \"line\":\n return [(item.width * frame.dpr) / 2, 0, 0, 0];\n case \"area\":\n return [0, item.opacity, 0, 0];\n case \"bar\":\n return [item.halfWidth, item.radius, item.inset, item.minHalf];\n default:\n return [item.opacity, item.stroke, 0, 0];\n }\n };\n\n const renderer: ChartRenderer = {\n kind: \"webgpu\" satisfies ChartRendererKind,\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n if (destroyed) return;\n const seen = new Set<string>();\n const encoder = device.createCommandEncoder();\n const pass = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: context.getCurrentTexture().createView(),\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n const t = frame.transform;\n for (const item of items) {\n seen.add(item.key);\n const [first, instances] = instanceRange(item, frame);\n if (instances <= 0) continue;\n const res = upload(item);\n if (!res.vertex) continue;\n uniformData.set(\n [\n t.xScale,\n t.xOffset,\n t.yScale,\n t.yOffset,\n frame.width,\n frame.height,\n frame.dpr,\n 0,\n ...item.color,\n ...params(item, frame),\n ],\n 0,\n );\n device.queue.writeBuffer(res.uniform, 0, uniformData);\n pass.setPipeline(pipelines[item.kind]);\n pass.setBindGroup(0, res.bindGroup);\n pass.setVertexBuffer(0, res.vertex);\n if (item.kind === \"line\") {\n pass.setVertexBuffer(1, res.vertex, 8);\n } else if (item.kind === \"area\") {\n pass.setVertexBuffer(1, res.vertex, AREA_STRIDE * 4);\n }\n pass.draw(4, instances, 0, first);\n }\n pass.end();\n device.queue.submit([encoder.finish()]);\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n res.vertex?.destroy();\n res.uniform.destroy();\n resources.delete(key);\n }\n }\n },\n destroy() {\n destroyed = true;\n for (const res of resources.values()) {\n res.vertex?.destroy();\n res.uniform.destroy();\n }\n resources.clear();\n context.unconfigure();\n device.destroy();\n },\n };\n return renderer;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"webgpu.js","names":["UNIFORM_SIZE","createWebGpuRenderer","gpu","adapter","fallback","requireHardware","device","context","canvas","format","destroyed","onLost","bindGroupLayout","layout","blend","pipeline","module","segment","stride","pipelines","WGSL_LINE","WGSL_AREA","WGSL_BAR","WGSL_SCATTER","resources","uniformData","vertexData","item","upload","res","data","size","vertex","uniform","params","frame","width","height","seen","encoder","pass","t","items","first","instances","instanceRange","key"],"sources":["../../../../../charts/src/engine/renderers/webgpu.ts"],"sourcesContent":["// WebGPU backend: one instanced draw per series.\n\nimport type { ChartRendererKind } from \"../types\";\nimport { instanceRange } from \"./range\";\nimport { WGSL_AREA, WGSL_BAR, WGSL_LINE, WGSL_SCATTER } from \"./shaders\";\nimport {\n AREA_STRIDE,\n BAR_STRIDE,\n SCATTER_STRIDE,\n type ChartRenderer,\n type RenderFrame,\n type RenderItem,\n type RendererLostHandler,\n} from \"./types\";\n\n// lib.dom has the WebGPU interfaces but not these constant objects\nconst BUFFER_VERTEX = 0x20;\nconst BUFFER_UNIFORM = 0x40;\nconst BUFFER_COPY_DST = 0x08;\nconst STAGE_VERTEX = 0x1;\nconst STAGE_FRAGMENT = 0x2;\n\nconst UNIFORM_SIZE = 64;\n\ninterface ItemResources {\n version: number;\n kind: RenderItem[\"kind\"];\n vertex: GPUBuffer | null;\n uniform: GPUBuffer;\n bindGroup: GPUBindGroup;\n}\n\ntype GpuNavigator = Navigator & { gpu?: GPU };\n\n/** Whether `navigator.gpu` exists (an adapter may still be unavailable) */\nexport const hasWebGpu = (): boolean =>\n typeof navigator !== \"undefined\" && !!(navigator as GpuNavigator).gpu;\n\nexport const createWebGpuRenderer = async (\n canvas: HTMLCanvasElement,\n onLost: RendererLostHandler,\n /** Refuses fallback (software) adapters */\n requireHardware = false,\n): Promise<ChartRenderer | null> => {\n const gpu = (navigator as GpuNavigator).gpu;\n if (!gpu) return null;\n const adapter = await gpu.requestAdapter();\n if (!adapter) return null;\n const fallback = adapter as GPUAdapter & {\n isFallbackAdapter?: boolean;\n info?: { isFallbackAdapter?: boolean };\n };\n if (\n requireHardware &&\n (fallback.info?.isFallbackAdapter || fallback.isFallbackAdapter)\n ) {\n return null;\n }\n const device = await adapter.requestDevice();\n const context = canvas.getContext(\"webgpu\") as GPUCanvasContext | null;\n if (!context) {\n device.destroy();\n return null;\n }\n const format = gpu.getPreferredCanvasFormat();\n context.configure({ device, format, alphaMode: \"premultiplied\" });\n\n let destroyed = false;\n void device.lost.then(() => {\n if (!destroyed) onLost();\n });\n\n const bindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: STAGE_VERTEX | STAGE_FRAGMENT,\n buffer: { type: \"uniform\" },\n },\n ],\n });\n const layout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n const blend: GPUBlendState = {\n color: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n alpha: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n };\n const pipeline = (code: string, buffers: GPUVertexBufferLayout[]) => {\n const module = device.createShaderModule({ code });\n return device.createRenderPipeline({\n layout,\n vertex: { module, entryPoint: \"vs\", buffers },\n fragment: {\n module,\n entryPoint: \"fs\",\n targets: [{ format, blend }],\n },\n primitive: { topology: \"triangle-strip\" },\n });\n };\n const segment = (\n stride: number,\n format: GPUVertexFormat,\n ): GPUVertexBufferLayout[] => [\n {\n arrayStride: stride,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 0, offset: 0, format }],\n },\n {\n arrayStride: stride,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 1, offset: 0, format }],\n },\n ];\n const pipelines = {\n line: pipeline(WGSL_LINE, segment(8, \"float32x2\")),\n area: pipeline(WGSL_AREA, segment(AREA_STRIDE * 4, \"float32x3\")),\n bar: pipeline(WGSL_BAR, [\n {\n arrayStride: BAR_STRIDE,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x3\" },\n { shaderLocation: 1, offset: 12, format: \"unorm8x4\" },\n ],\n },\n ]),\n scatter: pipeline(WGSL_SCATTER, [\n {\n arrayStride: SCATTER_STRIDE,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" },\n { shaderLocation: 1, offset: 8, format: \"float32\" },\n { shaderLocation: 2, offset: 12, format: \"unorm8x4\" },\n ],\n },\n ]),\n };\n\n const resources = new Map<string, ItemResources>();\n const uniformData = new Float32Array(UNIFORM_SIZE / 4);\n\n const vertexData = (item: RenderItem): ArrayBuffer | Float32Array => {\n switch (item.kind) {\n case \"line\":\n return item.points.subarray(0, item.count * 2);\n case \"area\":\n return item.points.subarray(0, item.count * AREA_STRIDE);\n default:\n return item.instances;\n }\n };\n\n const upload = (item: RenderItem): ItemResources => {\n let res = resources.get(item.key);\n if (res && res.version === item.version && res.kind === item.kind) {\n return res;\n }\n res?.vertex?.destroy();\n const data = vertexData(item);\n const size = Math.max(16, Math.ceil(data.byteLength / 4) * 4);\n const vertex =\n data.byteLength > 0\n ? device.createBuffer({ size, usage: BUFFER_VERTEX | BUFFER_COPY_DST })\n : null;\n if (vertex) {\n if (data instanceof Float32Array) {\n device.queue.writeBuffer(\n vertex,\n 0,\n data.buffer,\n data.byteOffset,\n data.byteLength,\n );\n } else {\n device.queue.writeBuffer(vertex, 0, data);\n }\n }\n if (!res) {\n const uniform = device.createBuffer({\n size: UNIFORM_SIZE,\n usage: BUFFER_UNIFORM | BUFFER_COPY_DST,\n });\n res = {\n version: item.version,\n kind: item.kind,\n vertex,\n uniform,\n bindGroup: device.createBindGroup({\n layout: bindGroupLayout,\n entries: [{ binding: 0, resource: { buffer: uniform } }],\n }),\n };\n resources.set(item.key, res);\n } else {\n res.version = item.version;\n res.kind = item.kind;\n res.vertex = vertex;\n }\n return res;\n };\n\n const params = (item: RenderItem, frame: RenderFrame): number[] => {\n switch (item.kind) {\n case \"line\":\n return [(item.width * frame.dpr) / 2, 0, 0, 0];\n case \"area\":\n return [item.flat ? 1 : 0, item.opacity, 0, 0];\n case \"bar\":\n return [item.halfWidth, item.radius, item.inset, item.minHalf];\n default:\n return [item.opacity, item.stroke, 0, 0];\n }\n };\n\n const renderer: ChartRenderer = {\n kind: \"webgpu\" satisfies ChartRendererKind,\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n if (destroyed) return;\n const seen = new Set<string>();\n const encoder = device.createCommandEncoder();\n const pass = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: context.getCurrentTexture().createView(),\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n const t = frame.transform;\n for (const item of items) {\n seen.add(item.key);\n const [first, instances] = instanceRange(item, frame);\n if (instances <= 0) continue;\n const res = upload(item);\n if (!res.vertex) continue;\n uniformData.set(\n [\n t.xScale,\n t.xOffset,\n t.yScale,\n t.yOffset,\n frame.width,\n frame.height,\n frame.dpr,\n 0,\n ...item.color,\n ...params(item, frame),\n ],\n 0,\n );\n device.queue.writeBuffer(res.uniform, 0, uniformData);\n pass.setPipeline(pipelines[item.kind]);\n pass.setBindGroup(0, res.bindGroup);\n pass.setVertexBuffer(0, res.vertex);\n if (item.kind === \"line\") {\n pass.setVertexBuffer(1, res.vertex, 8);\n } else if (item.kind === \"area\") {\n pass.setVertexBuffer(1, res.vertex, AREA_STRIDE * 4);\n }\n pass.draw(4, instances, 0, first);\n }\n pass.end();\n device.queue.submit([encoder.finish()]);\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n res.vertex?.destroy();\n res.uniform.destroy();\n resources.delete(key);\n }\n }\n },\n destroy() {\n destroyed = true;\n for (const res of resources.values()) {\n res.vertex?.destroy();\n res.uniform.destroy();\n }\n resources.clear();\n context.unconfigure();\n device.destroy();\n },\n };\n return renderer;\n};\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("./data.cjs"),t=require("./color.cjs"),n=require("./locale.cjs"),r=require("./layout.cjs"),i=require("./format.cjs"),a=require("./model.cjs"),o=require("./axis.cjs");var s={top:12,right:16,bottom:4,left:4},c=(e,t)=>t,l=(e,n)=>{let r=n.resolve??c;return(e??[]).map(e=>{if(e.type===`rect`){let i=e.color?r(e.color,n.primary):n.primary;return{type:`rect`,x0:e.x0,x1:e.x1,y0:e.y0,y1:e.y1,color:i,opacity:e.opacity??.08,label:e.label,labelPosition:e.labelPosition??`top-left`,labelColor:e.labelColor?r(e.labelColor,i):t.mix(i,n.text,.2)}}return e.type===`text`?{type:`text`,x:e.x,y:e.y,text:e.text,anchor:e.anchor??`center`,color:e.color?r(e.color,n.textMuted):n.textMuted,weight:e.weight??500}:{type:`line`,axis:e.axis,value:e.value,color:e.color?r(e.color,n.textMuted):n.textMuted,width:e.width??1,dash:[...e.dash??[4,4]],label:e.label}})},u=e=>{let{model:t,view:n,theme:i,width:a,height:c,measure:l}=e;if(t.horizontal)return f(e);let u=t.y.tickCount??(t.y.type===`category`?Math.max(1,Math.floor((c-40)/(i.fontSize+5))):c>=220?5:Math.max(2,Math.round((c-48)/52))),p=o.axisTicks(t.y,n.y,u),m=0;if(t.y.visible)for(let e of p.labels)m=Math.max(m,l(e));let h=d(t,p),g=0;if(h&&t.y2?.visible)for(let e of h.labels)g=Math.max(g,l(e));let _=48;if(t.x.type===`category`){_=0;let e=Math.max(1,Math.floor(t.x.categories.length/200));for(let n=0;n<t.x.categories.length;n+=e)_=Math.max(_,l(t.x.categories[n]))}let v={...s,...e.padding},y=r.computePlot({width:a,height:c,padding:v,yLabelWidth:t.y.visible?Math.ceil(m):0,y2LabelWidth:Math.ceil(g),y2Title:!!t.y2?.title&&!!t.y2.visible,xAxisVisible:t.x.visible,xTitle:!!t.x.title&&t.x.visible,yTitle:!!t.y.title&&t.y.visible,fontSize:i.fontSize});e.top&&(y.y+=e.top);let b=t.x.type===`category`?Math.max(1,Math.floor(y.width/(_+14))):t.x.tickCount??Math.max(3,Math.floor(y.width/88)),x=o.axisTicks(t.x,n.x,b);return{plot:y,scales:r.createScales(y,n,t.x.reverse,t.y.reverse),xTicks:x,yTicks:p,y2Ticks:h}},d=(e,t)=>{let n=e.y2,r=e.y2Map;if(!n||!r||!r.scale)return null;let a=t.values.map(e=>(e-r.offset)/r.scale),o=a.length>1?Math.abs(a[1]-a[0]):1,s=0;for(let e of a)s=Math.max(s,Math.abs(e));let c=n.format??i.tickFormatter(o,s,e.locale);return{values:t.values,labels:a.map(c),formatValue:n.format??e.formatValue}},f=e=>{let{model:t,view:n,theme:i,width:a,height:c,measure:l}=e,u=Math.max(1,Math.floor((c-40)/(i.fontSize+5))),d=t.x.tickCount??(t.x.type===`category`?u:c>=220?5:Math.max(2,Math.round((c-48)/52))),f=o.axisTicks(t.x,n.x,d),p=0;if(t.x.visible){if(t.x.type===`category`){let e=t.x.categories,n=Math.max(1,Math.floor(e.length/200));for(let r=0;r<e.length;r+=n){let n=t.x.format?t.x.format(r):e[r];p=Math.max(p,l(n))}}else for(let e of f.labels)p=Math.max(p,l(e))}let m={...s,...e.padding},h=r.computePlot({width:a,height:c,padding:m,yLabelWidth:t.x.visible?Math.ceil(p):0,xAxisVisible:t.y.visible,xTitle:!!t.y.title&&t.y.visible,yTitle:!!t.x.title&&t.x.visible,fontSize:i.fontSize});e.top&&(h.y+=e.top);let g=t.y.tickCount??(t.y.type===`category`?Math.max(1,Math.floor(h.width/60)):Math.max(3,Math.min(8,Math.floor(h.width/88)))),_=o.axisTicks(t.y,n.y,g);return{plot:h,scales:r.createScales(h,n,t.x.reverse,t.y.reverse,!0),xTicks:f,yTicks:_,y2Ticks:null}},p=(e,t,n,i)=>{let a=[],o=e.percent?e.formatValue:i?.formatValue??e.formatValue;for(let i of e.series){if(i.hidden||!i.showLabels)continue;if(i.type===`bar`&&i.barTop){let s=i.format??(i.yAxis===`right`?e.y2?.format??e.formatValue:o),{x:c,count:l}=i.cols,{y:u,y0:d,labels:f}=i.raw,p=i.barTop,[m,h]=t.x[0]<=t.x[1]?t.x:[t.x[1],t.x[0]];for(let t=0;t<l&&a.length<300;t++){let o=c[t]+i.barOffset;if(!Number.isFinite(u[t])||o<m||o>h)continue;let l=p[t]<(i.barBase?.[t]??0)!==e.y.reverse,g=r.toScreen(n,o,p[t]),_=i.floating&&d&&Number.isFinite(d[t]);if(_&&e.y.type===`time`&&!f?.[t])continue;let v=_?u[t]-(d?.[t]??0):0;a.push({x:g.x,y:g.y,r:0,text:f?.[t]??(_?`${v>0?`+`:``}${s(v)}`:s(u[t])),placement:n.horizontal?l?`left`:`right`:l?`below`:`above`})}continue}if(i.type!==`scatter`)continue;let{x:s,y:c,count:l,labels:u,size:d}=i.cols;if(u)for(let e=0;e<l&&a.length<300;e++){let o=u[e];if(!o)continue;let l=s[e],f=c[e];if(l<t.x[0]||l>t.x[1]||f<t.y[0]||f>t.y[1])continue;let p=d&&d[e]>0?d[e]:i.pointSize,m=r.toScreen(n,l,f);a.push({x:m.x,y:m.y,r:p/2,text:o})}}return a},m=e=>e.type===`bar`||e.type===`boxplot`?e.barOffset:0,h=(e,t,n)=>{let i=r.toScreen(n,e.cols.x[t]+m(e),a.plottedY(e,t));return{px:i.x,py:i.y}},g=(e,t,n,r,i,a,o)=>{let s=e.yToPx(r),c=e.yToPx(i);return Math.abs(a-t)<=n&&o>=Math.min(s,c)-2&&o<=Math.max(s,c)+2},_=(e,t,n,i,a)=>{let o=h(e,t,a),s=r.alongX(a,n,i),c=r.alongY(a,n,i),l=a.xToPx(e.cols.x[t]+m(e)),u=!1;if(e.type===`bar`&&e.barBase&&e.barTop)u=g(a,l,e.barHalfWidth/Math.abs(a.xPerPx),e.barBase[t],e.barTop[t],s,c);else if(e.type===`candlestick`||e.type===`boxplot`){let{high:n,low:r,y:i}=e.cols;u=g(a,l,Math.max(e.barHalfWidth/Math.abs(a.xPerPx),3),n?n[t]:i[t],r?r[t]:i[t],s,c)}return{series:e,index:t,px:o.px,py:o.py,dx:Math.abs(a.xToPx(e.cols.x[t])-s),dist:u?0:Math.hypot(o.px-n,o.py-i),inside:u}},v=(e,t)=>e.cols.size&&e.cols.size[t]>0?e.cols.size[t]:e.pointSize,y=new WeakMap,b=e=>{let t=e.cols.size;if(!t)return e.pointSize;let n=y.get(t);if(n===void 0){n=e.pointSize;for(let e=0;e<t.length;e++)t[e]>n&&(n=t[e]);y.set(t,n)}return n},x=(e,t,n,i,o)=>{let s=Math.max(b(e)/2+6,10)+o,c=r.toData(i,t,n),l=s*Math.abs(i.xPerPx),u=s*Math.abs(i.yPerPx),d=-1,f=1/0,{x:p,y:m}=e.cols;return a.gridOf(e).query(c.x-l,c.x+l,c.y-u,c.y+u,a=>{let s=r.toScreen(i,p[a],m[a]),c=Math.hypot(s.x-t,s.y-n);c<=Math.max(v(e,a)/2+4,8)+o&&c<=f&&(f=c,d=a)}),d},S=(e,t,n)=>{let{x:r,y:i}=e.cellHalf,{x:o,y:s}=e.cols,c=-1;return a.gridOf(e).query(t-r,t+r,n-i,n+i,a=>{e.cellColors?.[a]&&Math.abs(o[a]-t)<=r&&Math.abs(s[a]-n)<=i&&(c=a)}),c},C=(t,n)=>{let{x:r,y:i,count:a,sorted:o}=t.cols;if(o)return e.nearestIndex(r,i,a,n);let s=-1,c=1/0;for(let e=0;e<a;e++){if(!Number.isFinite(i[e]))continue;let t=Math.abs(r[e]-n);t<c&&(c=t,s=e)}return s},w=(e,n)=>{let r=e.pointColors?.[n],{open:i,high:a,low:o,value:s,y0:c,q1:l,q3:u,outliers:d,labels:f}=e.raw,p=f?.[n],m=r?t.toCss(r):e.colorCss,h={};if(e.type===`candlestick`){let r=i?i[n]:NaN;Number.isFinite(r)&&(h.open=r),a&&Number.isFinite(a[n])&&(h.high=a[n]),o&&Number.isFinite(o[n])&&(h.low=o[n]),m=t.toCss(e.raw.y[n]<r?e.downColor:e.upColor)}else if(e.type===`heatmap`){let r=s?s[n]:e.raw.y[n];Number.isFinite(r)&&(h.value=r);let i=e.cellColors?.[n];i&&(m=t.toCss(t.unpackColor(i)))}else if(e.type===`boxplot`){a&&Number.isFinite(a[n])&&(h.high=a[n]),o&&Number.isFinite(o[n])&&(h.low=o[n]),l&&Number.isFinite(l[n])&&(h.q1=l[n]),u&&Number.isFinite(u[n])&&(h.q3=u[n]);let e=d?.[n];e&&(h.outliers=e.length)}else c&&Number.isFinite(c[n])&&(h.y0=c[n]),e.type===`scatter`&&s&&Number.isFinite(s[n])&&(h.value=s[n]);return{seriesIndex:e.index,seriesId:e.id,seriesName:e.name,index:n,x:e.raw.x[n],y:e.raw.y[n],color:m,...p===void 0?{}:{label:p},...h}},T=(e,t)=>{if(!e.length)return null;e.sort((e,t)=>e.series.index-t.series.index);let n=e.map(e=>w(e.series,e.index)),r=n[0].x;return{items:n,x:r,xLabel:t?.formatValue(r)??String(r)}},E=(e,t,n,i,a,o=0)=>{let{plot:s}=t,c=6+o;if(i<s.x-c||i>s.x+s.width+c||a<s.y-c||a>s.y+s.height+c)return null;let l=r.toData(t,i,a),u=[],d=[];for(let n of e.series)if(!(n.hidden||n.cols.count===0)){if(n.type===`scatter`){let e=x(n,i,a,t,o);e>=0&&u.push(_(n,e,i,a,t))}else if(n.type===`heatmap`){let e=S(n,l.x,l.y);if(e>=0){let r=_(n,e,i,a,t);r.inside=!0,r.dist=0,u.push(r)}}else{let e=C(n,l.x);e>=0&&d.push(_(n,e,i,a,t))}}if(e.tooltipMode===`nearest`){let e=[...u,...d].filter(e=>e.inside||e.series.type===`scatter`||e.dist<=32+o);return e.length?T([e.reduce((e,t)=>t.dist<=e.dist?t:e)],n):null}if(!d.length)return u.length?T([u.reduce((e,t)=>t.dist<=e.dist?t:e)],n):null;let f=Math.min(...d.map(e=>e.dx)),p=e.x.type===`category`?.5/Math.abs(t.xPerPx):0,m=d.filter(e=>e.dx<=f+Math.max(1,p)),h=m.reduce((e,t)=>t.dx<e.dx?t:e),g=T([h,...m.filter(e=>e!==h),...u],n);return g&&(g.x=w(h.series,h.index).x,g.xLabel=n?.formatValue(g.x)??String(g.x)),g},D=(e,t)=>e===t||!!e&&!!t&&e.items.length===t.items.length&&e.items.every((e,n)=>e.index===t.items[n].index&&e.seriesIndex===t.items[n].seriesIndex),O={style:`percent`,minimumFractionDigits:2,maximumFractionDigits:2},k=(e,t,r,a=null)=>{let o=r?.formatValue??String,s=t=>t.format??(t.yAxis===`right`?a?.formatValue??e.y2?.format??e.formatValue:o),c=e.labels,l=t.items[0],u=l?e.series[l.seriesIndex]:null;if(t.items.length===1&&u?.type===`heatmap`){let n=e.y.type===`category`?e.y.categories[Math.round(l.y)]??o(l.y):o(l.y);return{title:`${t.xLabel} · ${n}`,titleColor:null,rows:[{color:l.color,name:l.label??u.name,value:l.value===void 0?`–`:(u.format??e.formatValue)(l.value)}]}}if(t.items.every(t=>e.series[t.seriesIndex].type===`scatter`)&&t.items.length===1){let n=t.items[0],r=e.series[n.seriesIndex],i=n.value===void 0?[]:[{color:null,name:r.valueName??c.value,value:(r.format??e.formatValue)(n.value)}];if(e.x.type===`category`)return{title:n.label??t.xLabel,titleColor:null,rows:[{color:n.color,name:n.seriesName,value:s(r)(n.y)},...i]};let a=[{color:null,name:e.x.title??c.x,value:t.xLabel},{color:null,name:(r.yAxis===`right`?e.y2?.title:e.y.title)??c.y,value:s(r)(n.y)},...i];return n.label!==void 0&&e.series.length>1&&a.push({color:null,name:``,value:n.seriesName}),{title:n.label??n.seriesName,titleColor:n.color,rows:a}}let d=[],f=[],p=t.items.length===1&&u?.type===`bar`&&e.x.type!==`category`&&l?.label!==void 0?l.label:null;for(let r of t.items){let t=e.series[r.seriesIndex],i=s(t);if(f.push(d.length),t.type===`candlestick`){let a=r.open!==void 0&&r.open!==0?(r.y-r.open)/Math.abs(r.open)*100:NaN;d.push({color:r.color,name:t.name,value:Number.isFinite(a)?`${a>=0?`+`:``}${n.numberFormat(e.locale,O).format(a/100)}`:``});let o=[[c.open,r.open],[c.high,r.high],[c.low,r.low],[c.close,r.y]];for(let[e,t]of o)t!==void 0&&Number.isFinite(t)&&d.push({color:null,name:e,value:i(t)});continue}if(t.type===`boxplot`){d.push({color:r.color,name:r.label?`${r.seriesName} · ${r.label}`:r.seriesName,value:``});let e=[[c.max,r.high],[c.q3,r.q3],[c.median,r.y],[c.q1,r.q1],[c.min,r.low]];for(let[t,n]of e)n!==void 0&&Number.isFinite(n)&&d.push({color:null,name:t,value:i(n)});r.outliers&&d.push({color:null,name:c.outliers,value:String(r.outliers)});continue}let a=i(r.y);if(r.y0!==void 0){let n=r.y-r.y0;a=t.type===`bar`&&e.y.type!==`time`?`${n>0?`+`:``}${i(n)}`:`${i(r.y0)} – ${i(r.y)}`}d.push({color:r.color,name:r.label&&p===null?`${r.seriesName} · ${r.label}`:r.seriesName,value:a})}if(e.percent){let n=new Map;for(let r of t.items){let t=A(e,r.seriesIndex);t!==null&&Number.isFinite(r.y)&&n.set(t,(n.get(t)??0)+Math.abs(r.y))}t.items.forEach((t,r)=>{let a=A(e,t.seriesIndex),o=a===null?void 0:n.get(a),s=d[f[r]];o&&s&&Number.isFinite(t.y)&&(s.value=`${(e.series[t.seriesIndex].format??e.formatValue)(t.y)} · ${i.formatPercent(Math.abs(t.y)/o*100,e.locale,!0)}`)})}return{title:p??t.xLabel,titleColor:null,rows:d}},A=(e,t)=>e.series[t].hidden?null:e.stacks[t],j=(e,n,i)=>{let a=[],{plot:o}=n,s=1/0,c=-1/0;for(let l of i.items){let i=e.series[l.seriesIndex];if(i.type===`bar`||i.type===`candlestick`||i.type===`boxplot`){let e=n.xToPx(l.x+m(i)),t=Math.max(i.barHalfWidth/Math.abs(n.xPerPx),1);s=Math.min(s,e-t),c=Math.max(c,e+t);continue}if(i.type===`heatmap`){let e=n.xToPx(l.x),t=n.yToPx(l.y),o=Math.abs(i.cellHalf.x/n.xPerPx),s=Math.abs(i.cellHalf.y/n.yPerPx);a.push({kind:`cell`,...r.screenRect(n,e-o,e+o,t-s,t+s)});continue}let{px:u,py:d}=h(i,l.index,n);if(u<o.x-1||u>o.x+o.width+1||d<o.y-1||d>o.y+o.height+1)continue;let f=i.type===`scatter`?v(i,l.index)+4:Math.max(9,i.lineWidth*2+5),p=i.pointColors?.[l.index]??i.color;a.push({kind:`dot`,x:u,y:d,size:f,color:l.color,halo:t.toCss(p,.2)})}if(c>s){let e=Math.max(4,(c-s)*.14),t=n.horizontal?o.y:o.x,r=t+(n.horizontal?o.height:o.width),i=Math.max(t,s-e),l=Math.min(r,c+e);l>i&&a.unshift({kind:`band`,...n.horizontal?{x:o.x,y:i,width:o.width,height:l-i}:{x:i,y:o.y,width:l-i,height:o.height}})}return a},M=e=>e===`scatter`?`dot`:e===`line`?`line`:`square`,N=(e,t,n)=>n??(e.tooltipMode===`axis`&&t.items.some(t=>{let n=e.series[t.seriesIndex].type;return n===`line`||n===`area`})&&!t.items.some(t=>{let n=e.series[t.seriesIndex].type;return n===`bar`||n===`candlestick`||n===`boxplot`})),P=(e,t,n,r)=>{if(!N(e,n,r))return null;let i=t.xToPx(n.items[0].x),a=t.horizontal?t.plot.y:t.plot.x,o=a+(t.horizontal?t.plot.height:t.plot.width);return i>=a&&i<=o?i:null};exports.DEFAULT_PADDING=s,exports.collectPointLabels=p,exports.crosshairAt=P,exports.dotSize=v,exports.fallbackResolve=c,exports.hitTest=E,exports.hoverItemOf=w,exports.hoverMarks=j,exports.layoutChart=u,exports.legendShape=M,exports.pointOf=h,exports.resolveAnnotations=l,exports.sameHover=D,exports.showsCrosshair=N,exports.tooltipContent=k;
|
|
1
|
+
const e=require("./data.cjs"),t=require("./color.cjs"),n=require("./layout.cjs"),r=require("./locale.cjs"),i=require("./format.cjs"),a=require("./model.cjs"),o=require("./axis.cjs");var s={top:12,right:16,bottom:4,left:4},c=(e,t)=>t,l=(e,n,r,i)=>{let a=n.resolve??c,o=e=>r&&e!==void 0?r(e):e,s=e=>i&&e!==void 0?i(e):e;return(e??[]).map(e=>{if(e.type===`rect`){let r=e.color?a(e.color,n.primary):n.primary;return{type:`rect`,x0:s(e.x0),x1:s(e.x1),y0:o(e.y0),y1:o(e.y1),color:r,opacity:e.opacity??.08,label:e.label,labelPosition:e.labelPosition??`top-left`,labelColor:e.labelColor?a(e.labelColor,r):t.mix(r,n.text,.2)}}return e.type===`text`?{type:`text`,x:s(e.x),y:o(e.y),text:e.text,anchor:e.anchor??`center`,color:e.color?a(e.color,n.textMuted):n.textMuted,weight:e.weight??500}:{type:`line`,axis:e.axis,value:e.axis===`y`?o(e.value):s(e.value),color:e.color?a(e.color,n.textMuted):n.textMuted,width:e.width??1,dash:[...e.dash??[4,4]],label:e.label}})},u=e=>{let{model:t,view:r,theme:i,width:a,height:c,measure:l}=e;if(t.horizontal)return f(e);let u=t.y.tickCount??(t.y.type===`category`?Math.max(1,Math.floor((c-40)/(i.fontSize+5))):c>=220?5:Math.max(2,Math.round((c-48)/52))),p=o.axisTicks(t.y,r.y,u),m=0;if(t.y.visible)for(let e of p.labels)m=Math.max(m,l(e));let h=d(t,p,r.y,u),g=0;if(h&&t.y2?.visible)for(let e of h.labels)g=Math.max(g,l(e));let _=48;if(t.x.type===`category`){_=0;let e=Math.max(1,Math.floor(t.x.categories.length/200));for(let n=0;n<t.x.categories.length;n+=e)_=Math.max(_,l(t.x.categories[n]))}let v={...s,...e.padding},y=n.computePlot({width:a,height:c,padding:v,yLabelWidth:t.y.visible?Math.ceil(m):0,y2LabelWidth:Math.ceil(g),y2Title:!!t.y2?.title&&!!t.y2.visible,xAxisVisible:t.x.visible,xTitle:!!t.x.title&&t.x.visible,yTitle:!!t.y.title&&t.y.visible,fontSize:i.fontSize});e.top&&(y.y+=e.top);let b=t.x.type===`category`?Math.max(1,Math.floor(y.width/(_+14))):t.x.tickCount??Math.max(3,Math.floor(y.width/88)),x=o.axisTicks(t.x,r.x,b);return{plot:y,scales:n.createScales(y,r,t.x.reverse,t.y.reverse),xTicks:x,yTicks:p,y2Ticks:h}},d=(e,t,n,r)=>{let a=e.y2,s=e.y2Map;if(!a||!s||!s.scale)return null;if(s.log){let e=(n[0]-s.offset)/s.scale,t=(n[1]-s.offset)/s.scale,i=o.axisTicks(a,[Math.min(e,t),Math.max(e,t)],r);return{...i,values:i.values.map(e=>e*s.scale+s.offset)}}let c=t.values.map(e=>(e-s.offset)/s.scale),l=c.length>1?Math.abs(c[1]-c[0]):1,u=0;for(let e of c)u=Math.max(u,Math.abs(e));let d=a.format??i.tickFormatter(l,u,e.locale);return{values:t.values,labels:c.map(d),formatValue:a.format??e.formatValue}},f=e=>{let{model:t,view:r,theme:i,width:a,height:c,measure:l}=e,u=Math.max(1,Math.floor((c-40)/(i.fontSize+5))),d=t.x.tickCount??(t.x.type===`category`?u:c>=220?5:Math.max(2,Math.round((c-48)/52))),f=o.axisTicks(t.x,r.x,d),p=0;if(t.x.visible){if(t.x.type===`category`){let e=t.x.categories,n=Math.max(1,Math.floor(e.length/200));for(let r=0;r<e.length;r+=n){let n=t.x.format?t.x.format(r):e[r];p=Math.max(p,l(n))}}else for(let e of f.labels)p=Math.max(p,l(e))}let m={...s,...e.padding},h=n.computePlot({width:a,height:c,padding:m,yLabelWidth:t.x.visible?Math.ceil(p):0,xAxisVisible:t.y.visible,xTitle:!!t.y.title&&t.y.visible,yTitle:!!t.x.title&&t.x.visible,fontSize:i.fontSize});e.top&&(h.y+=e.top);let g=t.y.tickCount??(t.y.type===`category`?Math.max(1,Math.floor(h.width/60)):Math.max(3,Math.min(8,Math.floor(h.width/88)))),_=o.axisTicks(t.y,r.y,g);return{plot:h,scales:n.createScales(h,r,t.x.reverse,t.y.reverse,!0),xTicks:f,yTicks:_,y2Ticks:null}},p=(e,t,r,i)=>{let a=[],o=e.percent?e.formatValue:i?.formatValue??e.formatValue;for(let i of e.series){if(i.hidden||!i.showLabels)continue;if(i.type===`bar`&&i.barTop){let s=i.format??(i.yAxis===`right`?e.y2?.format??e.formatValue:o),{x:c,count:l}=i.cols,{y:u,y0:d,labels:f}=i.raw,p=i.barTop,[m,h]=t.x[0]<=t.x[1]?t.x:[t.x[1],t.x[0]];for(let t=0;t<l&&a.length<300;t++){let o=c[t]+i.barOffset;if(!Number.isFinite(u[t])||o<m||o>h)continue;let l=p[t]<(i.barBase?.[t]??0)!==e.y.reverse,g=n.toScreen(r,o,p[t]),_=i.floating&&d&&Number.isFinite(d[t]);if(_&&e.y.type===`time`&&!f?.[t])continue;let v=_?u[t]-(d?.[t]??0):0;a.push({x:g.x,y:g.y,r:0,text:f?.[t]??(_?`${v>0?`+`:``}${s(v)}`:s(u[t])),placement:r.horizontal?l?`left`:`right`:l?`below`:`above`})}continue}if(i.type!==`scatter`)continue;let{x:s,y:c,count:l,labels:u,size:d}=i.cols;if(u)for(let e=0;e<l&&a.length<300;e++){let o=u[e];if(!o)continue;let l=s[e],f=c[e];if(l<t.x[0]||l>t.x[1]||f<t.y[0]||f>t.y[1])continue;let p=d&&d[e]>0?d[e]:i.pointSize,m=n.toScreen(r,l,f);a.push({x:m.x,y:m.y,r:p/2,text:o})}}return a},m=e=>e.type===`bar`||e.type===`boxplot`?e.barOffset:0,h=(e,t,r)=>{let i=n.toScreen(r,e.cols.x[t]+m(e),a.plottedY(e,t));return{px:i.x,py:i.y}},g=(e,t,n,r,i,a,o)=>{let s=e.yToPx(r),c=e.yToPx(i);return Math.abs(a-t)<=n&&o>=Math.min(s,c)-2&&o<=Math.max(s,c)+2},_=(e,t,r,i,a)=>{let o=h(e,t,a),s=n.alongX(a,r,i),c=n.alongY(a,r,i),l=a.xToPx(e.cols.x[t]+m(e)),u=!1;if(e.type===`bar`&&e.barBase&&e.barTop)u=g(a,l,e.barHalfWidth/Math.abs(a.xPerPx),e.barBase[t],e.barTop[t],s,c);else if(e.type===`candlestick`||e.type===`boxplot`){let{high:n,low:r,y:i}=e.cols;u=g(a,l,Math.max(e.barHalfWidth/Math.abs(a.xPerPx),3),n?n[t]:i[t],r?r[t]:i[t],s,c)}return{series:e,index:t,px:o.px,py:o.py,dx:Math.abs(a.xToPx(e.cols.x[t])-s),dist:u?0:Math.hypot(o.px-r,o.py-i),inside:u}},v=(e,t,r,i,a,o)=>{let s=e.cols.outliers?.[t];if(!s)return;let c=a.xToPx(e.cols.x[t]+m(e)),l=n.alongX(a,r,i)-c,u=n.alongY(a,r,i),d=e.outlierSize/2+4+o,f,p=d;return s.forEach((n,r)=>{let i=Math.hypot(l,a.yToPx(n)-u);i<=p&&(p=i,f=e.raw.outliers?.[t]?.[r]??n)}),f},y=(e,t)=>e.cols.size&&e.cols.size[t]>0?e.cols.size[t]:e.pointSize,b=new WeakMap,x=e=>{let t=e.cols.size;if(!t)return e.pointSize;let n=b.get(t);if(n===void 0){n=e.pointSize;for(let e=0;e<t.length;e++)t[e]>n&&(n=t[e]);b.set(t,n)}return n},S=(e,t,r,i,o)=>{let s=Math.max(x(e)/2+6,10)+o,c=n.toData(i,t,r),l=s*Math.abs(i.xPerPx),u=s*Math.abs(i.yPerPx),d=-1,f=1/0,{x:p,y:m}=e.cols;return a.gridOf(e).query(c.x-l,c.x+l,c.y-u,c.y+u,a=>{let s=n.toScreen(i,p[a],m[a]),c=Math.hypot(s.x-t,s.y-r);c<=Math.max(y(e,a)/2+4,8)+o&&c<=f&&(f=c,d=a)}),d},C=(e,t,n)=>{let{x:r,y:i}=e.cellHalf,{x:o,y:s}=e.cols,c=-1;return a.gridOf(e).query(t-r,t+r,n-i,n+i,a=>{e.cellColors?.[a]&&Math.abs(o[a]-t)<=r&&Math.abs(s[a]-n)<=i&&(c=a)}),c},w=(t,n)=>{let{x:r,y:i,count:a,sorted:o}=t.cols;if(o)return e.nearestIndex(r,i,a,n);let s=-1,c=1/0;for(let e=0;e<a;e++){if(!Number.isFinite(i[e]))continue;let t=Math.abs(r[e]-n);t<c&&(c=t,s=e)}return s},T=(e,n)=>{let r=e.pointColors?.[n],{open:i,high:a,low:o,value:s,y0:c,q1:l,q3:u,outliers:d,labels:f}=e.raw,p=f?.[n],m=r?t.toCss(r):e.colorCss,h={};if(e.type===`candlestick`){let r=i?i[n]:NaN;Number.isFinite(r)&&(h.open=r),a&&Number.isFinite(a[n])&&(h.high=a[n]),o&&Number.isFinite(o[n])&&(h.low=o[n]),m=t.toCss(e.raw.y[n]<r?e.downColor:e.upColor)}else if(e.type===`heatmap`){let r=s?s[n]:e.raw.y[n];Number.isFinite(r)&&(h.value=r);let i=e.cellColors?.[n];i&&(m=t.toCss(t.unpackColor(i)))}else if(e.type===`boxplot`){a&&Number.isFinite(a[n])&&(h.high=a[n]),o&&Number.isFinite(o[n])&&(h.low=o[n]),l&&Number.isFinite(l[n])&&(h.q1=l[n]),u&&Number.isFinite(u[n])&&(h.q3=u[n]);let e=d?.[n];e&&(h.outliers=e.length)}else c&&Number.isFinite(c[n])&&(h.y0=c[n]),e.type===`scatter`&&s&&Number.isFinite(s[n])&&(h.value=s[n]);return{seriesIndex:e.index,seriesId:e.id,seriesName:e.name,index:n,x:e.raw.x[n],y:e.raw.y[n],color:m,...p===void 0?{}:{label:p},...h}},E=(e,t)=>{if(!e.length)return null;e.sort((e,t)=>e.series.index-t.series.index);let n=e.map(e=>{let t=T(e.series,e.index);return e.outlier!==void 0&&(t.outlier=e.outlier),t}),r=n[0].x;return{items:n,x:r,xLabel:t?.formatValue(r)??String(r)}},D=(e,t,r,i,a,o=0)=>{let{plot:s}=t,c=6+o;if(i<s.x-c||i>s.x+s.width+c||a<s.y-c||a>s.y+s.height+c)return null;let l=n.toData(t,i,a),u=[],d=[];for(let n of e.series)if(!n.hidden&&n.tooltip&&n.cols.count!==0){if(n.type===`scatter`){let e=S(n,i,a,t,o);e>=0&&u.push(_(n,e,i,a,t))}else if(n.type===`heatmap`){let e=C(n,l.x,l.y);if(e>=0){let r=_(n,e,i,a,t);r.inside=!0,r.dist=0,u.push(r)}}else{let e=w(n,l.x);if(e<0)continue;let r=_(n,e,i,a,t);n.type===`boxplot`&&(r.outlier=v(n,e,i,a,t,o),r.outlier!==void 0&&(r.inside=!0,r.dist=0)),d.push(r)}}if(e.tooltipMode===`item`){let e=[...u,...d].filter(e=>e.inside||e.series.type===`scatter`||(e.series.type===`line`||e.series.type===`area`)&&e.dist<=8+o);return e.length?E([e.reduce((e,t)=>t.dist<e.dist||t.dist===e.dist&&t.series.index>e.series.index?t:e)],r):null}if(e.tooltipMode===`nearest`){let e=[...u,...d].filter(e=>e.inside||e.series.type===`scatter`||e.dist<=32+o);return e.length?E([e.reduce((e,t)=>t.dist<=e.dist?t:e)],r):null}if(!d.length)return u.length?E([u.reduce((e,t)=>t.dist<=e.dist?t:e)],r):null;let f=Math.min(...d.map(e=>e.dx)),p=e.x.type===`category`?.5/Math.abs(t.xPerPx):0,m=d.filter(e=>e.dx<=f+Math.max(1,p)),h=m.reduce((e,t)=>t.dx<e.dx?t:e),g=E([h,...m.filter(e=>e!==h),...u],r);return g&&(g.x=T(h.series,h.index).x,g.xLabel=r?.formatValue(g.x)??String(g.x)),g},O=(e,t)=>e===t||!!e&&!!t&&e.items.length===t.items.length&&e.items.every((e,n)=>e.index===t.items[n].index&&e.seriesIndex===t.items[n].seriesIndex),k={style:`percent`,minimumFractionDigits:2,maximumFractionDigits:2},A=(e,t)=>e.raw.details?.[t]?.map(e=>({color:null,name:e.name,value:e.value}))??[],j=(e,t,n,a=null)=>{let o=n?.formatValue??String,s=t=>t.format??(t.yAxis===`right`?a?.formatValue??e.y2?.format??e.formatValue:o),c=e.labels,l=t.items[0],u=l?e.series[l.seriesIndex]:null;if(t.items.length===1&&l&&u?.type===`bar`&&l.y0!==void 0&&e.y.type===`time`){let n=s(u);return{title:l.label??t.xLabel,titleColor:l.color,subtitle:l.label===void 0?u.name:`${t.xLabel} · ${u.name}`,rows:[{color:null,name:c.start,value:n(l.y0)},{color:null,name:c.end,value:n(l.y)},{color:null,name:c.duration,value:i.formatDuration(l.y-l.y0,e.locale)},...A(u,l.index)]}}if(t.items.length===1&&u?.type===`heatmap`){let n=e.y.type===`category`?e.y.categories[Math.round(l.y)]??o(l.y):o(l.y);return{title:`${t.xLabel} · ${n}`,titleColor:null,rows:[{color:l.color,name:l.label??u.name,value:l.value===void 0?`–`:(u.format??e.formatValue)(l.value)},...A(u,l.index)]}}if(t.items.every(t=>e.series[t.seriesIndex].type===`scatter`)&&t.items.length===1){let n=t.items[0],r=e.series[n.seriesIndex],i=n.value===void 0?[]:[{color:null,name:r.valueName??c.value,value:(r.format??e.formatValue)(n.value)}];if(e.x.type===`category`)return{title:n.label??t.xLabel,titleColor:null,rows:[{color:n.color,name:n.seriesName,value:s(r)(n.y)},...i,...A(r,n.index)]};let l=r.yAxis===`right`?a?.formatValue??e.y2?.format??e.formatValue:o,u=[{color:null,name:e.x.title??c.x,value:t.xLabel},{color:null,name:(r.yAxis===`right`?e.y2?.title:e.y.title)??c.y,value:(n.value===void 0?s(r):l)(n.y)},...i,...A(r,n.index)];return{title:n.label??n.seriesName,titleColor:n.color,...n.label!==void 0&&e.series.length>1?{subtitle:n.seriesName}:{},rows:u}}let d=[],f=[],p=t.items.length===1&&u?.type===`bar`&&e.x.type!==`category`&&l?.label!==void 0?l.label:null;for(let n of t.items){let t=e.series[n.seriesIndex],i=s(t);if(f.push(d.length),t.type===`candlestick`){let a=n.open!==void 0&&n.open!==0?(n.y-n.open)/Math.abs(n.open)*100:NaN;d.push({color:n.color,name:t.name,value:Number.isFinite(a)?`${a>=0?`+`:``}${r.numberFormat(e.locale,k).format(a/100)}`:``});let o=[[c.open,n.open],[c.high,n.high],[c.low,n.low],[c.close,n.y]];for(let[e,t]of o)t!==void 0&&Number.isFinite(t)&&d.push({color:null,name:e,value:i(t)});continue}if(t.type===`boxplot`){if(n.outlier!==void 0){d.push({color:n.color,name:n.label?`${n.seriesName} · ${n.label}`:n.seriesName,value:``},{color:null,name:c.outlier,value:i(n.outlier)});continue}d.push({color:n.color,name:n.label?`${n.seriesName} · ${n.label}`:n.seriesName,value:``});let e=[[c.max,n.high],[c.q3,n.q3],[c.median,n.y],[c.q1,n.q1],[c.min,n.low]];for(let[t,n]of e)n!==void 0&&Number.isFinite(n)&&d.push({color:null,name:t,value:i(n)});n.outliers&&d.push({color:null,name:c.outliers,value:String(n.outliers)});continue}let a=i(n.y);if(n.y0!==void 0){let r=n.y-n.y0;a=t.type===`bar`&&e.y.type!==`time`?`${r>0?`+`:``}${i(r)}`:`${i(n.y0)} – ${i(n.y)}`}d.push({color:n.color,name:n.label&&p===null?`${n.seriesName} · ${n.label}`:n.seriesName,value:a}),d.push(...A(t,n.index))}if(e.percent){let n=new Map;for(let r of t.items){let t=M(e,r.seriesIndex);t!==null&&Number.isFinite(r.y)&&n.set(t,(n.get(t)??0)+Math.abs(r.y))}t.items.forEach((t,r)=>{let a=M(e,t.seriesIndex),o=a===null?void 0:n.get(a),s=d[f[r]];o&&s&&Number.isFinite(t.y)&&(s.value=`${(e.series[t.seriesIndex].format??e.formatValue)(t.y)} · ${i.formatPercent(Math.abs(t.y)/o*100,e.locale,!0)}`)})}return{title:p??t.xLabel,titleColor:null,rows:d}},M=(e,t)=>e.series[t].hidden?null:e.stacks[t],N=(e,r,i)=>{let a=[],{plot:o}=r,s=1/0,c=-1/0;for(let l of i.items){let i=e.series[l.seriesIndex],u=i.cols.x[l.index]??l.x;if(i.type===`boxplot`&&l.outlier!==void 0){let e=n.toScreen(r,u+m(i),F(i,l));a.push({kind:`dot`,x:e.x,y:e.y,size:i.outlierSize+3,color:l.color,halo:t.toCss(i.pointColors?.[l.index]??i.color,.2)});continue}if(i.type===`bar`||i.type===`candlestick`||i.type===`boxplot`){let e=r.xToPx(u+m(i)),t=Math.max(i.barHalfWidth/Math.abs(r.xPerPx),1);s=Math.min(s,e-t),c=Math.max(c,e+t);continue}if(i.type===`heatmap`){let e=r.xToPx(u),s=r.yToPx(l.y),c=Math.abs(i.cellHalf.x/r.xPerPx),d=Math.abs(i.cellHalf.y/r.yPerPx),f=n.screenRect(r,e-c,e+c,s-d,s+d),p=n.heatCellStyle(f.width,f.height,i.radius),m=Math.max(o.y,f.y),h=Math.min(o.y+o.height,f.y+f.height),g=Math.max(o.x,f.x),_=Math.min(o.x+o.width,f.x+f.width);h>m&&a.push({kind:`guide`,x:o.x,y:m,width:o.width,height:h-m}),_>g&&a.push({kind:`guide`,x:g,y:o.y,width:_-g,height:o.height});let v=i.cellColors?.[l.index],y=v?t.unpackColor(v):i.color;a.push({kind:`cell`,x:f.x+p.inset,y:f.y+p.inset,width:Math.max(1,f.width-p.inset*2),height:Math.max(1,f.height-p.inset*2),color:l.color,ring:P(y),radius:p.radius});continue}let{px:d,py:f}=h(i,l.index,r);if(d<o.x-1||d>o.x+o.width+1||f<o.y-1||f>o.y+o.height+1)continue;let p=i.type===`scatter`?y(i,l.index)+4:Math.max(9,i.lineWidth*2+5),g=i.pointColors?.[l.index]??i.color;a.push({kind:`dot`,x:d,y:f,size:p,color:l.color,halo:t.toCss(g,.2)})}if(c>s){let e=Math.max(4,(c-s)*.14),t=r.horizontal?o.y:o.x,n=t+(r.horizontal?o.height:o.width),i=Math.max(t,s-e),l=Math.min(n,c+e);l>i&&a.unshift({kind:`band`,...r.horizontal?{x:o.x,y:i,width:o.width,height:l-i}:{x:i,y:o.y,width:l-i,height:o.height}})}return a},P=e=>t.luminance(e)>.45?`rgba(15, 23, 42, 0.78)`:`rgba(255, 255, 255, 0.9)`,F=(e,t)=>{let n=e.raw.outliers?.[t.index],r=n?n.indexOf(t.outlier??NaN):-1;return(r>=0?e.cols.outliers?.[t.index]?.[r]:void 0)??t.outlier??0},I=(e,r)=>{let i=[];for(let a of e.series){let e=a.connector;if(!e||a.hidden||a.type!==`bar`||!a.barTop)continue;let{x:o,count:s}=a.cols,c=a.barTop,l=a.barHalfWidth,[u,d]=r.view.x[0]<=r.view.x[1]?r.view.x:[r.view.x[1],r.view.x[0]],f=t.toCss(e.color,.75),p=-1;for(let t=0;t<s&&i.length<1200;t++)if(Number.isFinite(c[t])&&Number.isFinite(o[t])){if(p>=0&&o[t]+l>=u&&o[p]-l<=d){let s=n.toScreen(r,o[p]+a.barOffset+l,c[p]),u=n.toScreen(r,o[t]+a.barOffset-l,c[p]);i.push({x0:s.x,y0:s.y,x1:u.x,y1:u.y,color:f,width:e.width,dash:e.dash})}p=t}}return i},L=(e,n)=>{let r=n.resolve??c,i=t.toCss(n.textMuted,.85);return(e??[]).map(e=>({from:e.from,to:e.to,color:e.color?t.toCss(r(e.color,n.textMuted)):i}))},R={length:6,half:3.5},z=(e,t)=>{let n=new Map;for(let r of e.series){if(r.hidden||!r.tooltip||r.type!==`bar`&&r.type!==`scatter`)continue;let{x:e,y:i,count:a}=r.cols,o=r.type===`bar`&&r.barBase&&r.barTop,s=o?r.barHalfWidth/Math.abs(t.xPerPx):y(r,0)/2;for(let t=0;t<a;t++){let a=Math.round(e[t]);if(n.has(a))continue;let c=o?r.barBase[t]:i[t],l=o?r.barTop[t]:i[t];Number.isFinite(c)&&Number.isFinite(l)&&n.set(a,{at:e[t]+m(r),start:Math.min(c,l),end:Math.max(c,l),half:s,dot:!o})}}return n},B=(e,t,r)=>{if(!r.length||e.x.type!==`category`)return[];let i=z(e,t),a=new Map;e.x.categories.forEach((e,t)=>{a.has(e)||a.set(e,t)});let o=t.horizontal,s=(e,t)=>o?{x:e,y:t}:{x:t,y:e},c=e=>{let r=n.toScreen(t,0,e);return o?r.x:r.y},l=e=>{let r=n.toScreen(t,e,0);return o?r.y:r.x},u=Math.sign(c(t.view.y[1])-c(t.view.y[0]))||1,d=Math.abs(l(1)-l(0)),{length:f,half:p}=R,m=[];for(let e of r){let t=i.get(a.get(e.from)??NaN),n=i.get(a.get(e.to)??NaN);if(!t||!n||t===n)continue;let r=c(t.end)+(t.dot?u*t.half:0),o=l(t.at),h=c(n.start)-u*(n.dot?n.half+1:1),g=l(n.at),_=h-u*f,v=[s(r,o)],y=r+u*8;if(u*(_-y)>=0)v.push(s(y,o),s(y,g),s(_,g));else{let e=o+(Math.sign(g-o)||1)*Math.max(t.half+3,d/2),n=_-u*8;v.push(s(y,o),s(y,e),s(n,e),s(n,g),s(_,g))}m.push({points:v,head:[s(h,g),s(_,g-p),s(_,g+p)],color:e.color,width:1.25})}return m},V=12,H=e=>{if(!e.series.length||e.series.some(e=>e.type!==`heatmap`))return null;let n=e.series.find(e=>!e.hidden&&e.colorLut),r=n?.colorLut;if(!n||!r)return null;let i=[];for(let e=0;e<V;e++){let n=r[Math.round(e/11*(r.length-1))];i.push(t.toCss(t.unpackColor(n??0)))}let a=n.format??e.formatValue,[o,s]=n.valueRange,c=[{at:0,text:a(o)},{at:1,text:a(s)}],l=n.colorMidpoint;return l!==null&&l>o&&l<s&&c.splice(1,0,{at:.5,text:a(l)}),{seriesIndex:n.index,stops:i,labels:c}},U=(e,t,n)=>e===void 0?n>1||H(t)!==null:!!e,W=e=>e===`scatter`?`dot`:e===`line`?`line`:`square`,G=(e,t,n)=>n??(e.tooltipMode===`axis`&&t.items.some(t=>{let n=e.series[t.seriesIndex].type;return n===`line`||n===`area`})&&!t.items.some(t=>{let n=e.series[t.seriesIndex].type;return n===`bar`||n===`candlestick`||n===`boxplot`})),K=(e,t,n,r)=>{if(!G(e,n,r))return null;let i=n.items[0],o=t.xToPx(e.series[i.seriesIndex]?.cols.x[i.index]??a.toPlotX(e,i.x)),s=t.horizontal?t.plot.y:t.plot.x,c=s+(t.horizontal?t.plot.height:t.plot.width);return o>=s&&o<=c?o:null};exports.ARROW_HEAD=R,exports.DEFAULT_PADDING=s,exports.collectPointLabels=p,exports.colorLegend=H,exports.connectorSegments=I,exports.contrastRing=P,exports.crosshairAt=K,exports.dependencyArrows=B,exports.dotSize=y,exports.fallbackResolve=c,exports.hitTest=D,exports.hoverItemOf=T,exports.hoverMarks=N,exports.layoutChart=u,exports.legendShape=W,exports.legendShown=U,exports.pointOf=h,exports.resolveAnnotations=l,exports.resolveDependencies=L,exports.sameHover=O,exports.showsCrosshair=G,exports.tooltipContent=j;
|
|
2
2
|
//# sourceMappingURL=scene.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scene.cjs","names":["mix","axisTicks","computePlot","createScales","tickFormatter","toScreen","plottedY","alongX","alongY","toData","nearestIndex","toCss","unpackColor","numberFormat","formatPercent","screenRect","require_data","require_color","require_locale","require_layout","require_format","require_model","require_axis","DEFAULT_PADDING","fallbackResolve","fallback","resolveAnnotations","resolve","theme","annotations","a","color","layoutChart","input","model","layoutHorizontal","yCount","height","yTicks","view","yLabelWidth","label","measure","y2Ticks","rightTicks","y2LabelWidth","categoryWidth","step","i","padding","plot","xCount","xTicks","axis","map","raw","v","maxAbs","tick","rows","xLabelWidth","names","name","collectPointLabels","labels","axisFormat","series","format","texts","top","x0","x1","count","xv","x","y","reversed","p","s","y0","delta","text","xi","yi","d","size","slotOffset","pointOf","sc","onColumn","pa","pb","b","ax","center","half","ay","candidateOf","px","py","inside","high","low","dotSize","maxSizes","maxDot","sizes","max","nearestScatter","radius","slop","at","rx","ry","best","bestDist","cellAt","hx","hy","found","yv","nearestX","sorted","bestD","hoverItemOf","pc","index","extra","o","open","value","packed","q1","q3","out","outliers","eventOf","candidates","items","c","hitTest","margin","scatter","others","all","bestDx","bandPx","aligned","first","event","sameHover","it","CHANGE_PERCENT","tooltipContent","yFormat","formatOf","firstSeries","yName","valueRow","rowOf","binTitle","change","ohlc","stats","totals","stack","stackIdOf","total","row","k","seriesIndex","hoverMarks","marks","bandLo","bandHi","cx","cy","hw","hh","rgba","pad","lo","hi","legendShape","type","showsCrosshair","crosshair","crosshairAt"],"sources":["../../../../charts/src/engine/scene.ts"],"sourcesContent":["// The DOM-free half of a chart: annotations, layout, point labels, hit\n// testing and tooltip content. Shared by createChart (DOM + GPU),\n// createCanvasChart (any 2D context) and the React Native views.\n\nimport { axisTicks, type AxisTicks } from \"./axis\";\nimport { mix, toCss, unpackColor, type Rgba } from \"./color\";\nimport { nearestIndex } from \"./data\";\nimport { formatPercent, tickFormatter } from \"./format\";\nimport { numberFormat } from \"./locale\";\nimport {\n alongX,\n alongY,\n computePlot,\n createScales,\n screenRect,\n toData,\n toScreen,\n type Rect,\n type Scales,\n} from \"./layout\";\nimport { gridOf, plottedY, type ChartModel, type SeriesModel } from \"./model\";\nimport type { PointLabel, ResolvedAnnotation } from \"./overlay\";\nimport type { ChartTheme } from \"./theme\";\nimport type {\n ChartAnnotation,\n ChartHoverEvent,\n ChartHoverItem,\n ChartPadding,\n ChartView,\n} from \"./types\";\n\nexport const MAX_POINT_LABELS = 300;\nexport const DEFAULT_PADDING = { top: 12, right: 16, bottom: 4, left: 4 };\n\nexport const fallbackResolve = (_value: string, fallback: Rgba) => fallback;\n\n/** Annotation colors resolved against the theme */\nexport const resolveAnnotations = (\n annotations: readonly ChartAnnotation[] | undefined,\n theme: ChartTheme,\n): ResolvedAnnotation[] => {\n const resolve = theme.resolve ?? fallbackResolve;\n return (annotations ?? []).map((a) => {\n if (a.type === \"rect\") {\n const color = a.color ? resolve(a.color, theme.primary) : theme.primary;\n return {\n type: \"rect\",\n x0: a.x0,\n x1: a.x1,\n y0: a.y0,\n y1: a.y1,\n color,\n opacity: a.opacity ?? 0.08,\n label: a.label,\n labelPosition: a.labelPosition ?? \"top-left\",\n labelColor: a.labelColor\n ? resolve(a.labelColor, color)\n : mix(color, theme.text, 0.2),\n };\n }\n if (a.type === \"text\") {\n return {\n type: \"text\",\n x: a.x,\n y: a.y,\n text: a.text,\n anchor: a.anchor ?? \"center\",\n color: a.color ? resolve(a.color, theme.textMuted) : theme.textMuted,\n weight: a.weight ?? 500,\n };\n }\n return {\n type: \"line\",\n axis: a.axis,\n value: a.value,\n color: a.color ? resolve(a.color, theme.textMuted) : theme.textMuted,\n width: a.width ?? 1,\n dash: [...(a.dash ?? [4, 4])],\n label: a.label,\n };\n });\n};\n\nexport interface ChartLayout {\n plot: Rect;\n scales: Scales;\n xTicks: AxisTicks;\n yTicks: AxisTicks;\n /** Ticks of the right axis: at the left tick positions, labelled in right axis units */\n y2Ticks: AxisTicks | null;\n}\n\nexport interface LayoutInput {\n model: ChartModel;\n view: ChartView;\n theme: ChartTheme;\n /** Size of the drawing area (legend excluded), CSS pixels */\n width: number;\n height: number;\n padding?: ChartPadding;\n /** Offset of the drawing area (e.g. below a legend) */\n top?: number;\n /** Width of a tick label in the theme font */\n measure: (text: string) => number;\n}\n\n/** Ticks, room for the axes and the plot rectangle */\nexport const layoutChart = (input: LayoutInput): ChartLayout => {\n const { model, view, theme, width, height, measure } = input;\n if (model.horizontal) return layoutHorizontal(input);\n // same count as the nice range of the model (its ends are then ticks),\n // fewer on short charts; category rows get a label each when they fit\n const yCount =\n model.y.tickCount ??\n (model.y.type === \"category\"\n ? Math.max(1, Math.floor((height - 40) / (theme.fontSize + 5)))\n : height >= 220\n ? 5\n : Math.max(2, Math.round((height - 48) / 52)));\n const yTicks = axisTicks(model.y, view.y, yCount);\n let yLabelWidth = 0;\n if (model.y.visible) {\n for (const label of yTicks.labels)\n yLabelWidth = Math.max(yLabelWidth, measure(label));\n }\n const y2Ticks = rightTicks(model, yTicks);\n let y2LabelWidth = 0;\n if (y2Ticks && model.y2?.visible) {\n for (const label of y2Ticks.labels)\n y2LabelWidth = Math.max(y2LabelWidth, measure(label));\n }\n let categoryWidth = 48;\n if (model.x.type === \"category\") {\n categoryWidth = 0;\n const step = Math.max(1, Math.floor(model.x.categories.length / 200));\n for (let i = 0; i < model.x.categories.length; i += step) {\n categoryWidth = Math.max(categoryWidth, measure(model.x.categories[i]));\n }\n }\n const padding = { ...DEFAULT_PADDING, ...input.padding };\n const plot = computePlot({\n width,\n height,\n padding,\n yLabelWidth: model.y.visible ? Math.ceil(yLabelWidth) : 0,\n y2LabelWidth: Math.ceil(y2LabelWidth),\n y2Title: !!model.y2?.title && !!model.y2.visible,\n xAxisVisible: model.x.visible,\n xTitle: !!model.x.title && model.x.visible,\n yTitle: !!model.y.title && model.y.visible,\n fontSize: theme.fontSize,\n });\n if (input.top) plot.y += input.top;\n const xCount =\n model.x.type === \"category\"\n ? Math.max(1, Math.floor(plot.width / (categoryWidth + 14)))\n : (model.x.tickCount ?? Math.max(3, Math.floor(plot.width / 88)));\n const xTicks = axisTicks(model.x, view.x, xCount);\n const scales = createScales(plot, view, model.x.reverse, model.y.reverse);\n return { plot, scales, xTicks, yTicks, y2Ticks };\n};\n\n/** Right axis ticks: the left ticks labelled in right axis units */\nconst rightTicks = (model: ChartModel, yTicks: AxisTicks): AxisTicks | null => {\n const axis = model.y2;\n const map = model.y2Map;\n if (!axis || !map || !map.scale) return null;\n const raw = yTicks.values.map((v) => (v - map.offset) / map.scale);\n const step = raw.length > 1 ? Math.abs(raw[1] - raw[0]) : 1;\n let maxAbs = 0;\n for (const v of raw) maxAbs = Math.max(maxAbs, Math.abs(v));\n const tick = axis.format ?? tickFormatter(step, maxAbs, model.locale);\n return {\n values: yTicks.values,\n labels: raw.map(tick),\n formatValue: axis.format ?? model.formatValue,\n };\n};\n\n/** Horizontal charts: the x axis on the left, the values along the bottom */\nconst layoutHorizontal = (input: LayoutInput): ChartLayout => {\n const { model, view, theme, width, height, measure } = input;\n const rows = Math.max(1, Math.floor((height - 40) / (theme.fontSize + 5)));\n const xCount =\n model.x.tickCount ??\n (model.x.type === \"category\"\n ? rows\n : height >= 220\n ? 5\n : Math.max(2, Math.round((height - 48) / 52)));\n const xTicks = axisTicks(model.x, view.x, xCount);\n let xLabelWidth = 0;\n if (model.x.visible) {\n if (model.x.type === \"category\") {\n // every name (the visible ones change when zooming)\n const names = model.x.categories;\n const step = Math.max(1, Math.floor(names.length / 200));\n for (let i = 0; i < names.length; i += step) {\n const name = model.x.format ? model.x.format(i) : names[i];\n xLabelWidth = Math.max(xLabelWidth, measure(name));\n }\n } else {\n for (const label of xTicks.labels)\n xLabelWidth = Math.max(xLabelWidth, measure(label));\n }\n }\n const padding = { ...DEFAULT_PADDING, ...input.padding };\n const plot = computePlot({\n width,\n height,\n padding,\n yLabelWidth: model.x.visible ? Math.ceil(xLabelWidth) : 0,\n xAxisVisible: model.y.visible,\n xTitle: !!model.y.title && model.y.visible,\n yTitle: !!model.x.title && model.x.visible,\n fontSize: theme.fontSize,\n });\n if (input.top) plot.y += input.top;\n const yCount =\n model.y.tickCount ??\n (model.y.type === \"category\"\n ? Math.max(1, Math.floor(plot.width / 60))\n : Math.max(3, Math.min(8, Math.floor(plot.width / 88))));\n const yTicks = axisTicks(model.y, view.y, yCount);\n const scales = createScales(\n plot,\n view,\n model.x.reverse,\n model.y.reverse,\n true,\n );\n return { plot, scales, xTicks, yTicks, y2Ticks: null };\n};\n\n/** Labels of the visible scatter points and bar values (`showLabels`) */\nexport const collectPointLabels = (\n model: ChartModel,\n view: ChartView,\n s: Scales,\n yTicks?: AxisTicks | null,\n): PointLabel[] => {\n const labels: PointLabel[] = [];\n // 100% stacks: the axis shows percents, the labels the actual values\n const axisFormat = model.percent\n ? model.formatValue\n : (yTicks?.formatValue ?? model.formatValue);\n for (const series of model.series) {\n if (series.hidden || !series.showLabels) continue;\n if (series.type === \"bar\" && series.barTop) {\n // 100% stacks and right axis series: the values of the data\n const format =\n series.format ??\n (series.yAxis === \"right\"\n ? (model.y2?.format ?? model.formatValue)\n : axisFormat);\n const { x, count } = series.cols;\n const { y, y0, labels: texts } = series.raw;\n const top = series.barTop;\n const [x0, x1] = view.x[0] <= view.x[1] ? view.x : [view.x[1], view.x[0]];\n for (let i = 0; i < count && labels.length < MAX_POINT_LABELS; i++) {\n const xv = x[i] + series.barOffset;\n if (!Number.isFinite(y[i]) || xv < x0 || xv > x1) continue;\n // the end away from the base (the top, or the bottom of negative bars)\n const negative = top[i] < (series.barBase?.[i] ?? 0);\n const reversed = negative !== model.y.reverse;\n const p = toScreen(s, xv, top[i]);\n const step = series.floating && y0 && Number.isFinite(y0[i]);\n // ranges on a time axis (Gantt tasks) have no value to write\n if (step && model.y.type === \"time\" && !texts?.[i]) continue;\n const delta = step ? y[i] - (y0?.[i] ?? 0) : 0;\n labels.push({\n x: p.x,\n y: p.y,\n r: 0,\n text:\n texts?.[i] ??\n (step ? `${delta > 0 ? \"+\" : \"\"}${format(delta)}` : format(y[i])),\n placement: s.horizontal\n ? reversed\n ? \"left\"\n : \"right\"\n : reversed\n ? \"below\"\n : \"above\",\n });\n }\n continue;\n }\n if (series.type !== \"scatter\") continue;\n const { x, y, count, labels: texts, size } = series.cols;\n if (!texts) continue;\n for (let i = 0; i < count && labels.length < MAX_POINT_LABELS; i++) {\n const text = texts[i];\n if (!text) continue;\n const xi = x[i];\n const yi = y[i];\n if (xi < view.x[0] || xi > view.x[1] || yi < view.y[0] || yi > view.y[1])\n continue;\n const d = size && size[i] > 0 ? size[i] : series.pointSize;\n const p = toScreen(s, xi, yi);\n labels.push({ x: p.x, y: p.y, r: d / 2, text });\n }\n }\n return labels;\n};\n\n// ---------------------------------------------------------------- hit tests\n\ninterface Candidate {\n series: SeriesModel;\n index: number;\n /** Pixel position of the point */\n px: number;\n py: number;\n /** Distance along the x axis */\n dx: number;\n dist: number;\n inside: boolean;\n}\n\n/** Bars and box plots sit in a slot of their category */\nconst slotOffset = (s: SeriesModel) =>\n s.type === \"bar\" || s.type === \"boxplot\" ? s.barOffset : 0;\n\n/**\n * Screen position of a point (the end of a bar or stack, the close of a\n * candle, the median of a box)\n */\nexport const pointOf = (s: SeriesModel, i: number, sc: Scales) => {\n const p = toScreen(sc, s.cols.x[i] + slotOffset(s), plottedY(s, i));\n return { px: p.x, py: p.y };\n};\n\n/** Whether a pixel (along x, along y) is on a column from `a` to `b` */\nconst onColumn = (\n sc: Scales,\n center: number,\n half: number,\n a: number,\n b: number,\n ax: number,\n ay: number,\n) => {\n const pa = sc.yToPx(a);\n const pb = sc.yToPx(b);\n return (\n Math.abs(ax - center) <= half &&\n ay >= Math.min(pa, pb) - 2 &&\n ay <= Math.max(pa, pb) + 2\n );\n};\n\nconst candidateOf = (\n s: SeriesModel,\n i: number,\n px: number,\n py: number,\n sc: Scales,\n): Candidate => {\n const p = pointOf(s, i, sc);\n const ax = alongX(sc, px, py);\n const ay = alongY(sc, px, py);\n const center = sc.xToPx(s.cols.x[i] + slotOffset(s));\n let inside = false;\n if (s.type === \"bar\" && s.barBase && s.barTop) {\n const half = s.barHalfWidth / Math.abs(sc.xPerPx);\n inside = onColumn(sc, center, half, s.barBase[i], s.barTop[i], ax, ay);\n } else if (s.type === \"candlestick\" || s.type === \"boxplot\") {\n const { high, low, y } = s.cols;\n const half = Math.max(s.barHalfWidth / Math.abs(sc.xPerPx), 3);\n const a = high ? high[i] : y[i];\n const b = low ? low[i] : y[i];\n inside = onColumn(sc, center, half, a, b, ax, ay);\n }\n return {\n series: s,\n index: i,\n px: p.px,\n py: p.py,\n dx: Math.abs(sc.xToPx(s.cols.x[i]) - ax),\n dist: inside ? 0 : Math.hypot(p.px - px, p.py - py),\n inside,\n };\n};\n\n/** Diameter of a scatter dot */\nexport const dotSize = (s: SeriesModel, i: number) =>\n s.cols.size && s.cols.size[i] > 0 ? s.cols.size[i] : s.pointSize;\n\nconst maxSizes = new WeakMap<Float32Array, number>();\n\n/** Largest dot of a series (bubbles reach further than plain dots) */\nconst maxDot = (s: SeriesModel) => {\n const sizes = s.cols.size;\n if (!sizes) return s.pointSize;\n let max = maxSizes.get(sizes);\n if (max === undefined) {\n max = s.pointSize;\n for (let i = 0; i < sizes.length; i++) if (sizes[i] > max) max = sizes[i];\n maxSizes.set(sizes, max);\n }\n return max;\n};\n\nconst nearestScatter = (\n s: SeriesModel,\n px: number,\n py: number,\n sc: Scales,\n slop: number,\n) => {\n const radius = Math.max(maxDot(s) / 2 + 6, 10) + slop;\n const at = toData(sc, px, py);\n const rx = radius * Math.abs(sc.xPerPx);\n const ry = radius * Math.abs(sc.yPerPx);\n let best = -1;\n let bestDist = Infinity;\n const { x, y } = s.cols;\n gridOf(s).query(at.x - rx, at.x + rx, at.y - ry, at.y + ry, (i) => {\n const p = toScreen(sc, x[i], y[i]);\n const d = Math.hypot(p.x - px, p.y - py);\n const reach = Math.max(dotSize(s, i) / 2 + 4, 8) + slop;\n if (d <= reach && d <= bestDist) {\n bestDist = d;\n best = i;\n }\n });\n return best;\n};\n\n/** Heatmap cell containing a data position, -1 if none */\nconst cellAt = (s: SeriesModel, xv: number, yv: number) => {\n const { x: hx, y: hy } = s.cellHalf;\n const { x, y } = s.cols;\n let found = -1;\n gridOf(s).query(xv - hx, xv + hx, yv - hy, yv + hy, (i) => {\n if (\n s.cellColors?.[i] &&\n Math.abs(x[i] - xv) <= hx &&\n Math.abs(y[i] - yv) <= hy\n ) {\n found = i;\n }\n });\n return found;\n};\n\nconst nearestX = (s: SeriesModel, xv: number) => {\n const { x, y, count, sorted } = s.cols;\n if (sorted) return nearestIndex(x, y, count, xv);\n let best = -1;\n let bestD = Infinity;\n for (let i = 0; i < count; i++) {\n if (!Number.isFinite(y[i])) continue;\n const d = Math.abs(x[i] - xv);\n if (d < bestD) {\n bestD = d;\n best = i;\n }\n }\n return best;\n};\n\n/** Hover payload item of a point (values of the data, right axis included) */\nexport const hoverItemOf = (s: SeriesModel, index: number): ChartHoverItem => {\n const pc = s.pointColors?.[index];\n const { open, high, low, value, y0, q1, q3, outliers, labels } = s.raw;\n const label = labels?.[index];\n let color = pc ? toCss(pc) : s.colorCss;\n const extra: Partial<ChartHoverItem> = {};\n if (s.type === \"candlestick\") {\n const o = open ? open[index] : NaN;\n if (Number.isFinite(o)) extra.open = o;\n if (high && Number.isFinite(high[index])) extra.high = high[index];\n if (low && Number.isFinite(low[index])) extra.low = low[index];\n color = toCss(s.raw.y[index] < o ? s.downColor : s.upColor);\n } else if (s.type === \"heatmap\") {\n const v = value ? value[index] : s.raw.y[index];\n if (Number.isFinite(v)) extra.value = v;\n const packed = s.cellColors?.[index];\n if (packed) color = toCss(unpackColor(packed));\n } else if (s.type === \"boxplot\") {\n if (high && Number.isFinite(high[index])) extra.high = high[index];\n if (low && Number.isFinite(low[index])) extra.low = low[index];\n if (q1 && Number.isFinite(q1[index])) extra.q1 = q1[index];\n if (q3 && Number.isFinite(q3[index])) extra.q3 = q3[index];\n const out = outliers?.[index];\n if (out) extra.outliers = out.length;\n } else {\n if (y0 && Number.isFinite(y0[index])) extra.y0 = y0[index];\n if (s.type === \"scatter\" && value && Number.isFinite(value[index]))\n extra.value = value[index];\n }\n return {\n seriesIndex: s.index,\n seriesId: s.id,\n seriesName: s.name,\n index,\n x: s.raw.x[index],\n y: s.raw.y[index],\n color,\n ...(label !== undefined ? { label } : {}),\n ...extra,\n };\n};\n\nconst eventOf = (\n candidates: Candidate[],\n xTicks: AxisTicks | null,\n): ChartHoverEvent | null => {\n if (!candidates.length) return null;\n candidates.sort((a, b) => a.series.index - b.series.index);\n const items = candidates.map((c) => hoverItemOf(c.series, c.index));\n const x = items[0].x;\n return { items, x, xLabel: xTicks?.formatValue(x) ?? String(x) };\n};\n\n/**\n * Points under a pixel of the stage: the nearest point (scatter / `nearest`\n * tooltips) or every series at the nearest x (`axis` tooltips).\n * `slop` widens the reach of the dots (touch screens).\n */\nexport const hitTest = (\n model: ChartModel,\n sc: Scales,\n xTicks: AxisTicks | null,\n px: number,\n py: number,\n slop = 0,\n): ChartHoverEvent | null => {\n const { plot } = sc;\n const margin = 6 + slop;\n if (\n px < plot.x - margin ||\n px > plot.x + plot.width + margin ||\n py < plot.y - margin ||\n py > plot.y + plot.height + margin\n ) {\n return null;\n }\n const at = toData(sc, px, py);\n const scatter: Candidate[] = [];\n const others: Candidate[] = [];\n for (const s of model.series) {\n if (s.hidden || s.cols.count === 0) continue;\n if (s.type === \"scatter\") {\n const i = nearestScatter(s, px, py, sc, slop);\n if (i >= 0) scatter.push(candidateOf(s, i, px, py, sc));\n } else if (s.type === \"heatmap\") {\n const i = cellAt(s, at.x, at.y);\n if (i >= 0) {\n const c = candidateOf(s, i, px, py, sc);\n c.inside = true;\n c.dist = 0;\n scatter.push(c);\n }\n } else {\n const i = nearestX(s, at.x);\n if (i >= 0) others.push(candidateOf(s, i, px, py, sc));\n }\n }\n if (model.tooltipMode === \"nearest\") {\n const all = [...scatter, ...others].filter(\n (c) => c.inside || c.series.type === \"scatter\" || c.dist <= 32 + slop,\n );\n if (!all.length) return null;\n const best = all.reduce((a, b) => (b.dist <= a.dist ? b : a));\n return eventOf([best], xTicks);\n }\n if (!others.length) {\n if (!scatter.length) return null;\n return eventOf(\n [scatter.reduce((a, b) => (b.dist <= a.dist ? b : a))],\n xTicks,\n );\n }\n const bestDx = Math.min(...others.map((c) => c.dx));\n const bandPx = model.x.type === \"category\" ? 0.5 / Math.abs(sc.xPerPx) : 0;\n const aligned = others.filter((c) => c.dx <= bestDx + Math.max(1, bandPx));\n const first = aligned.reduce((a, b) => (b.dx < a.dx ? b : a));\n const ordered = [first, ...aligned.filter((c) => c !== first), ...scatter];\n const event = eventOf(ordered, xTicks);\n if (event) {\n event.x = hoverItemOf(first.series, first.index).x;\n event.xLabel = xTicks?.formatValue(event.x) ?? String(event.x);\n }\n return event;\n};\n\n/** Whether two hover payloads point at the same points */\nexport const sameHover = (\n a: ChartHoverEvent | null,\n b: ChartHoverEvent | null,\n): boolean =>\n a === b ||\n (!!a &&\n !!b &&\n a.items.length === b.items.length &&\n a.items.every(\n (it, i) =>\n it.index === b.items[i].index &&\n it.seriesIndex === b.items[i].seriesIndex,\n ));\n\n// ------------------------------------------------------------------ tooltip\n\n/** Change of a candlestick: `+1.25%` */\nconst CHANGE_PERCENT: Intl.NumberFormatOptions = {\n style: \"percent\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n};\n\nexport interface TooltipRow {\n /** Swatch color (CSS) */\n color: string | null;\n name: string;\n value: string;\n}\n\nexport interface TooltipContent {\n title: string;\n /** Swatch of the title (single scatter point) */\n titleColor: string | null;\n rows: TooltipRow[];\n}\n\n/**\n * Default tooltip content of a hover payload; `y2Ticks` formats the values\n * of the right axis series\n */\nexport const tooltipContent = (\n model: ChartModel,\n event: ChartHoverEvent,\n yTicks: AxisTicks | null,\n y2Ticks: AxisTicks | null = null,\n): TooltipContent => {\n const yFormat = yTicks?.formatValue ?? String;\n const formatOf = (s: SeriesModel) =>\n s.format ??\n (s.yAxis === \"right\"\n ? (y2Ticks?.formatValue ?? model.y2?.format ?? model.formatValue)\n : yFormat);\n const names = model.labels;\n const first = event.items[0];\n const firstSeries = first ? model.series[first.seriesIndex] : null;\n if (event.items.length === 1 && firstSeries?.type === \"heatmap\") {\n const yName =\n model.y.type === \"category\"\n ? (model.y.categories[Math.round(first.y)] ?? yFormat(first.y))\n : yFormat(first.y);\n return {\n title: `${event.xLabel} · ${yName}`,\n titleColor: null,\n rows: [\n {\n color: first.color,\n name: first.label ?? firstSeries.name,\n value:\n first.value === undefined\n ? \"–\"\n : (firstSeries.format ?? model.formatValue)(first.value),\n },\n ],\n };\n }\n const scatterOnly = event.items.every(\n (it) => model.series[it.seriesIndex].type === \"scatter\",\n );\n if (scatterOnly && event.items.length === 1) {\n const it = event.items[0];\n const s = model.series[it.seriesIndex];\n const valueRow: TooltipRow[] =\n it.value !== undefined\n ? [\n {\n color: null,\n name: s.valueName ?? names.value,\n value: (s.format ?? model.formatValue)(it.value),\n },\n ]\n : [];\n if (model.x.type === \"category\") {\n // a dot on a category (Gantt milestones, dot plots)\n return {\n title: it.label ?? event.xLabel,\n titleColor: null,\n rows: [\n { color: it.color, name: it.seriesName, value: formatOf(s)(it.y) },\n ...valueRow,\n ],\n };\n }\n const rows: TooltipRow[] = [\n { color: null, name: model.x.title ?? names.x, value: event.xLabel },\n {\n color: null,\n name:\n (s.yAxis === \"right\" ? model.y2?.title : model.y.title) ?? names.y,\n value: formatOf(s)(it.y),\n },\n ...valueRow,\n ];\n if (it.label !== undefined && model.series.length > 1)\n rows.push({ color: null, name: \"\", value: it.seriesName });\n return { title: it.label ?? it.seriesName, titleColor: it.color, rows };\n }\n const rows: TooltipRow[] = [];\n /** Row of every item */\n const rowOf: number[] = [];\n // one labelled bar on a numeric axis (a histogram bin): the label is the title\n const binTitle =\n event.items.length === 1 &&\n firstSeries?.type === \"bar\" &&\n model.x.type !== \"category\" &&\n first?.label !== undefined\n ? first.label\n : null;\n for (const it of event.items) {\n const s = model.series[it.seriesIndex];\n const format = formatOf(s);\n rowOf.push(rows.length);\n if (s.type === \"candlestick\") {\n const change =\n it.open !== undefined && it.open !== 0\n ? ((it.y - it.open) / Math.abs(it.open)) * 100\n : NaN;\n rows.push({\n color: it.color,\n name: s.name,\n value: Number.isFinite(change)\n ? `${change >= 0 ? \"+\" : \"\"}${numberFormat(model.locale, CHANGE_PERCENT).format(change / 100)}`\n : \"\",\n });\n const ohlc: [string, number | undefined][] = [\n [names.open, it.open],\n [names.high, it.high],\n [names.low, it.low],\n [names.close, it.y],\n ];\n for (const [name, v] of ohlc) {\n if (v !== undefined && Number.isFinite(v))\n rows.push({ color: null, name, value: format(v) });\n }\n continue;\n }\n if (s.type === \"boxplot\") {\n rows.push({\n color: it.color,\n name: it.label ? `${it.seriesName} · ${it.label}` : it.seriesName,\n value: \"\",\n });\n const stats: [string, number | undefined][] = [\n [names.max, it.high],\n [names.q3, it.q3],\n [names.median, it.y],\n [names.q1, it.q1],\n [names.min, it.low],\n ];\n for (const [name, v] of stats) {\n if (v !== undefined && Number.isFinite(v))\n rows.push({ color: null, name, value: format(v) });\n }\n if (it.outliers)\n rows.push({\n color: null,\n name: names.outliers,\n value: String(it.outliers),\n });\n continue;\n }\n let value = format(it.y);\n if (it.y0 !== undefined) {\n // waterfall steps: the change; time ranges and bands: both ends\n const delta = it.y - it.y0;\n value =\n s.type === \"bar\" && model.y.type !== \"time\"\n ? `${delta > 0 ? \"+\" : \"\"}${format(delta)}`\n : `${format(it.y0)} – ${format(it.y)}`;\n }\n rows.push({\n color: it.color,\n name:\n it.label && binTitle === null\n ? `${it.seriesName} · ${it.label}`\n : it.seriesName,\n value,\n });\n }\n if (model.percent) {\n // 100% stacks: the share of every value next to it\n const totals = new Map<string, number>();\n for (const it of event.items) {\n const stack = stackIdOf(model, it.seriesIndex);\n if (stack !== null && Number.isFinite(it.y))\n totals.set(stack, (totals.get(stack) ?? 0) + Math.abs(it.y));\n }\n event.items.forEach((it, k) => {\n const stack = stackIdOf(model, it.seriesIndex);\n const total = stack !== null ? totals.get(stack) : undefined;\n const row = rows[rowOf[k]];\n if (total && row && Number.isFinite(it.y)) {\n const format = model.series[it.seriesIndex].format ?? model.formatValue;\n row.value = `${format(it.y)} · ${formatPercent((Math.abs(it.y) / total) * 100, model.locale, true)}`;\n }\n });\n }\n return { title: binTitle ?? event.xLabel, titleColor: null, rows };\n};\n\n/** Stack of a series in a 100% chart (`null` when it is not stacked) */\nconst stackIdOf = (model: ChartModel, seriesIndex: number): string | null =>\n model.series[seriesIndex].hidden ? null : model.stacks[seriesIndex];\n\n/**\n * Shape of the hover marker of an item: a dot with a soft halo on a point,\n * a band behind the hovered bar group / candle, or the outline of a cell\n */\nexport type HoverMark =\n | {\n kind: \"dot\";\n x: number;\n y: number;\n size: number;\n color: string;\n /** Translucent series color of the halo around the dot */\n halo: string;\n }\n | { kind: \"band\"; x: number; y: number; width: number; height: number }\n | { kind: \"cell\"; x: number; y: number; width: number; height: number };\n\n/** Markers of the hovered points (pixels of the stage); bands come first */\nexport const hoverMarks = (\n model: ChartModel,\n sc: Scales,\n event: ChartHoverEvent,\n): HoverMark[] => {\n const marks: HoverMark[] = [];\n const { plot } = sc;\n let bandLo = Infinity;\n let bandHi = -Infinity;\n for (const it of event.items) {\n const s = model.series[it.seriesIndex];\n if (s.type === \"bar\" || s.type === \"candlestick\" || s.type === \"boxplot\") {\n const c = sc.xToPx(it.x + slotOffset(s));\n const half = Math.max(s.barHalfWidth / Math.abs(sc.xPerPx), 1);\n bandLo = Math.min(bandLo, c - half);\n bandHi = Math.max(bandHi, c + half);\n continue;\n }\n if (s.type === \"heatmap\") {\n const cx = sc.xToPx(it.x);\n const cy = sc.yToPx(it.y);\n const hw = Math.abs(s.cellHalf.x / sc.xPerPx);\n const hh = Math.abs(s.cellHalf.y / sc.yPerPx);\n marks.push({\n kind: \"cell\",\n ...screenRect(sc, cx - hw, cx + hw, cy - hh, cy + hh),\n });\n continue;\n }\n const { px, py } = pointOf(s, it.index, sc);\n if (\n px < plot.x - 1 ||\n px > plot.x + plot.width + 1 ||\n py < plot.y - 1 ||\n py > plot.y + plot.height + 1\n ) {\n continue;\n }\n const size =\n s.type === \"scatter\"\n ? dotSize(s, it.index) + 4\n : Math.max(9, s.lineWidth * 2 + 5);\n const rgba = s.pointColors?.[it.index] ?? s.color;\n marks.push({\n kind: \"dot\",\n x: px,\n y: py,\n size,\n color: it.color,\n halo: toCss(rgba, 0.2),\n });\n }\n if (bandHi > bandLo) {\n // the group of bars plus a margin, clipped to the plot\n const pad = Math.max(4, (bandHi - bandLo) * 0.14);\n const lo = sc.horizontal ? plot.y : plot.x;\n const hi = lo + (sc.horizontal ? plot.height : plot.width);\n const a = Math.max(lo, bandLo - pad);\n const b = Math.min(hi, bandHi + pad);\n if (b > a) {\n marks.unshift({\n kind: \"band\",\n ...(sc.horizontal\n ? { x: plot.x, y: a, width: plot.width, height: b - a }\n : { x: a, y: plot.y, width: b - a, height: plot.height }),\n });\n }\n }\n return marks;\n};\n\n/** Swatch of a series in the legend */\nexport const legendShape = (\n type: SeriesModel[\"type\"],\n): \"dot\" | \"line\" | \"square\" =>\n type === \"scatter\" ? \"dot\" : type === \"line\" ? \"line\" : \"square\";\n\n/** Whether the guide line follows the pointer */\nexport const showsCrosshair = (\n model: ChartModel,\n event: ChartHoverEvent,\n crosshair: boolean | undefined,\n) =>\n crosshair ??\n (model.tooltipMode === \"axis\" &&\n event.items.some((it) => {\n const type = model.series[it.seriesIndex].type;\n return type === \"line\" || type === \"area\";\n }) &&\n // bars get a band instead\n !event.items.some((it) => {\n const type = model.series[it.seriesIndex].type;\n return type === \"bar\" || type === \"candlestick\" || type === \"boxplot\";\n }));\n\n/** Pixel of the guide line along the x axis (`null` when hidden / outside the plot) */\nexport const crosshairAt = (\n model: ChartModel,\n sc: Scales,\n event: ChartHoverEvent,\n crosshair: boolean | undefined,\n): number | null => {\n if (!showsCrosshair(model, event, crosshair)) return null;\n const c = sc.xToPx(event.items[0].x);\n const lo = sc.horizontal ? sc.plot.y : sc.plot.x;\n const hi = lo + (sc.horizontal ? sc.plot.height : sc.plot.width);\n return c >= lo && c <= hi ? c : null;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scene.cjs","names":["mix","axisTicks","computePlot","createScales","tickFormatter","toScreen","plottedY","alongX","alongY","toData","nearestIndex","toCss","unpackColor","formatDuration","numberFormat","formatPercent","screenRect","heatCellStyle","luminance","toPlotX","require_data","require_color","require_layout","require_locale","require_format","require_model","require_axis","DEFAULT_PADDING","fallbackResolve","fallback","resolveAnnotations","resolve","theme","y","mapY","v","x","mapX","annotations","a","color","layoutChart","input","model","layoutHorizontal","yCount","height","yTicks","view","yLabelWidth","label","measure","y2Ticks","rightTicks","y2LabelWidth","categoryWidth","step","i","padding","plot","xCount","xTicks","axis","map","b","ticks","count","raw","maxAbs","tick","rows","xLabelWidth","names","name","collectPointLabels","labels","axisFormat","series","format","texts","top","x0","x1","xv","reversed","p","s","y0","delta","text","xi","yi","d","size","slotOffset","pointOf","sc","onColumn","pa","pb","ax","center","half","ay","candidateOf","px","py","inside","high","low","outlierAt","list","reach","slop","best","bestDist","k","dotSize","maxSizes","maxDot","sizes","max","nearestScatter","radius","at","rx","ry","cellAt","hx","hy","found","yv","nearestX","sorted","bestD","hoverItemOf","pc","index","extra","o","open","value","packed","q1","q3","out","outliers","eventOf","candidates","items","item","c","hitTest","margin","scatter","others","all","bestDx","bandPx","aligned","first","event","sameHover","it","CHANGE_PERCENT","detailRows","tooltipContent","yFormat","formatOf","firstSeries","yName","valueRow","yAxisFormat","rowOf","binTitle","change","ohlc","stats","totals","stack","stackIdOf","total","row","seriesIndex","hoverMarks","marks","bandLo","bandHi","itX","plottedOutlier","cx","cy","hw","hh","cell","style","bottom","left","right","fill","contrastRing","rgba","pad","lo","hi","connectorSegments","v0","v1","prev","resolveDependencies","muted","dependencies","ARROW_HEAD","rowSpans","bar","start","end","dependencyArrows","horizontal","pt","valuePx","categoryPx","dir","rowPx","ev","ca","sv","cb","base","length","points","exit","between","back","COLOR_STOPS","colorLegend","lut","stops","mid","legendShown","option","named","legendShape","type","showsCrosshair","crosshair","crosshairAt"],"sources":["../../../../charts/src/engine/scene.ts"],"sourcesContent":["// The DOM-free half of a chart: annotations, layout, point labels, hit\n// testing and tooltip content. Shared by createChart (DOM + GPU),\n// createCanvasChart (any 2D context) and the React Native views.\n\nimport { axisTicks, type AxisTicks } from \"./axis\";\nimport { luminance, mix, toCss, unpackColor, type Rgba } from \"./color\";\nimport { nearestIndex } from \"./data\";\nimport { formatDuration, formatPercent, tickFormatter } from \"./format\";\nimport { numberFormat } from \"./locale\";\nimport {\n alongX,\n alongY,\n computePlot,\n createScales,\n heatCellStyle,\n screenRect,\n toData,\n toScreen,\n type Rect,\n type Scales,\n} from \"./layout\";\nimport {\n gridOf,\n plottedY,\n toPlotX,\n type ChartModel,\n type SeriesModel,\n} from \"./model\";\nimport type { PointLabel, ResolvedAnnotation } from \"./overlay\";\nimport type { ChartTheme } from \"./theme\";\nimport type { Range } from \"./viewport\";\nimport type {\n ChartAnnotation,\n ChartDependency,\n ChartHoverEvent,\n ChartHoverItem,\n ChartOptions,\n ChartPadding,\n ChartView,\n} from \"./types\";\n\nexport const MAX_POINT_LABELS = 300;\nexport const DEFAULT_PADDING = { top: 12, right: 16, bottom: 4, left: 4 };\n\nexport const fallbackResolve = (_value: string, fallback: Rgba) => fallback;\n\n/**\n * Annotation colors resolved against the theme; `mapY` / `mapX` turn values\n * into plotted units (log axes)\n */\nexport const resolveAnnotations = (\n annotations: readonly ChartAnnotation[] | undefined,\n theme: ChartTheme,\n mapY?: (value: number) => number,\n mapX?: (value: number) => number,\n): ResolvedAnnotation[] => {\n const resolve = theme.resolve ?? fallbackResolve;\n const y = <T extends number | undefined>(v: T): T =>\n (mapY && v !== undefined ? mapY(v) : v) as T;\n const x = <T extends number | undefined>(v: T): T =>\n (mapX && v !== undefined ? mapX(v) : v) as T;\n return (annotations ?? []).map((a) => {\n if (a.type === \"rect\") {\n const color = a.color ? resolve(a.color, theme.primary) : theme.primary;\n return {\n type: \"rect\",\n x0: x(a.x0),\n x1: x(a.x1),\n y0: y(a.y0),\n y1: y(a.y1),\n color,\n opacity: a.opacity ?? 0.08,\n label: a.label,\n labelPosition: a.labelPosition ?? \"top-left\",\n labelColor: a.labelColor\n ? resolve(a.labelColor, color)\n : mix(color, theme.text, 0.2),\n };\n }\n if (a.type === \"text\") {\n return {\n type: \"text\",\n x: x(a.x),\n y: y(a.y),\n text: a.text,\n anchor: a.anchor ?? \"center\",\n color: a.color ? resolve(a.color, theme.textMuted) : theme.textMuted,\n weight: a.weight ?? 500,\n };\n }\n return {\n type: \"line\",\n axis: a.axis,\n value: a.axis === \"y\" ? y(a.value) : x(a.value),\n color: a.color ? resolve(a.color, theme.textMuted) : theme.textMuted,\n width: a.width ?? 1,\n dash: [...(a.dash ?? [4, 4])],\n label: a.label,\n };\n });\n};\n\nexport interface ChartLayout {\n plot: Rect;\n scales: Scales;\n xTicks: AxisTicks;\n yTicks: AxisTicks;\n /** Ticks of the right axis: at the left tick positions, labelled in right axis units */\n y2Ticks: AxisTicks | null;\n}\n\nexport interface LayoutInput {\n model: ChartModel;\n view: ChartView;\n theme: ChartTheme;\n /** Size of the drawing area (legend excluded), CSS pixels */\n width: number;\n height: number;\n padding?: ChartPadding;\n /** Offset of the drawing area (e.g. below a legend) */\n top?: number;\n /** Width of a tick label in the theme font */\n measure: (text: string) => number;\n}\n\n/** Ticks, room for the axes and the plot rectangle */\nexport const layoutChart = (input: LayoutInput): ChartLayout => {\n const { model, view, theme, width, height, measure } = input;\n if (model.horizontal) return layoutHorizontal(input);\n // same count as the nice range of the model (its ends are then ticks),\n // fewer on short charts; category rows get a label each when they fit\n const yCount =\n model.y.tickCount ??\n (model.y.type === \"category\"\n ? Math.max(1, Math.floor((height - 40) / (theme.fontSize + 5)))\n : height >= 220\n ? 5\n : Math.max(2, Math.round((height - 48) / 52)));\n const yTicks = axisTicks(model.y, view.y, yCount);\n let yLabelWidth = 0;\n if (model.y.visible) {\n for (const label of yTicks.labels)\n yLabelWidth = Math.max(yLabelWidth, measure(label));\n }\n const y2Ticks = rightTicks(model, yTicks, view.y, yCount);\n let y2LabelWidth = 0;\n if (y2Ticks && model.y2?.visible) {\n for (const label of y2Ticks.labels)\n y2LabelWidth = Math.max(y2LabelWidth, measure(label));\n }\n let categoryWidth = 48;\n if (model.x.type === \"category\") {\n categoryWidth = 0;\n const step = Math.max(1, Math.floor(model.x.categories.length / 200));\n for (let i = 0; i < model.x.categories.length; i += step) {\n categoryWidth = Math.max(categoryWidth, measure(model.x.categories[i]));\n }\n }\n const padding = { ...DEFAULT_PADDING, ...input.padding };\n const plot = computePlot({\n width,\n height,\n padding,\n yLabelWidth: model.y.visible ? Math.ceil(yLabelWidth) : 0,\n y2LabelWidth: Math.ceil(y2LabelWidth),\n y2Title: !!model.y2?.title && !!model.y2.visible,\n xAxisVisible: model.x.visible,\n xTitle: !!model.x.title && model.x.visible,\n yTitle: !!model.y.title && model.y.visible,\n fontSize: theme.fontSize,\n });\n if (input.top) plot.y += input.top;\n const xCount =\n model.x.type === \"category\"\n ? Math.max(1, Math.floor(plot.width / (categoryWidth + 14)))\n : (model.x.tickCount ?? Math.max(3, Math.floor(plot.width / 88)));\n const xTicks = axisTicks(model.x, view.x, xCount);\n const scales = createScales(plot, view, model.x.reverse, model.y.reverse);\n return { plot, scales, xTicks, yTicks, y2Ticks };\n};\n\n/**\n * Right axis ticks: the left ticks labelled in right axis units; log axes\n * get their own decades\n */\nconst rightTicks = (\n model: ChartModel,\n yTicks: AxisTicks,\n view: Range,\n count: number,\n): AxisTicks | null => {\n const axis = model.y2;\n const map = model.y2Map;\n if (!axis || !map || !map.scale) return null;\n if (map.log) {\n const a = (view[0] - map.offset) / map.scale;\n const b = (view[1] - map.offset) / map.scale;\n const ticks = axisTicks(axis, [Math.min(a, b), Math.max(a, b)], count);\n return {\n ...ticks,\n values: ticks.values.map((e) => e * map.scale + map.offset),\n };\n }\n const raw = yTicks.values.map((v) => (v - map.offset) / map.scale);\n const step = raw.length > 1 ? Math.abs(raw[1] - raw[0]) : 1;\n let maxAbs = 0;\n for (const v of raw) maxAbs = Math.max(maxAbs, Math.abs(v));\n const tick = axis.format ?? tickFormatter(step, maxAbs, model.locale);\n return {\n values: yTicks.values,\n labels: raw.map(tick),\n formatValue: axis.format ?? model.formatValue,\n };\n};\n\n/** Horizontal charts: the x axis on the left, the values along the bottom */\nconst layoutHorizontal = (input: LayoutInput): ChartLayout => {\n const { model, view, theme, width, height, measure } = input;\n const rows = Math.max(1, Math.floor((height - 40) / (theme.fontSize + 5)));\n const xCount =\n model.x.tickCount ??\n (model.x.type === \"category\"\n ? rows\n : height >= 220\n ? 5\n : Math.max(2, Math.round((height - 48) / 52)));\n const xTicks = axisTicks(model.x, view.x, xCount);\n let xLabelWidth = 0;\n if (model.x.visible) {\n if (model.x.type === \"category\") {\n // every name (the visible ones change when zooming)\n const names = model.x.categories;\n const step = Math.max(1, Math.floor(names.length / 200));\n for (let i = 0; i < names.length; i += step) {\n const name = model.x.format ? model.x.format(i) : names[i];\n xLabelWidth = Math.max(xLabelWidth, measure(name));\n }\n } else {\n for (const label of xTicks.labels)\n xLabelWidth = Math.max(xLabelWidth, measure(label));\n }\n }\n const padding = { ...DEFAULT_PADDING, ...input.padding };\n const plot = computePlot({\n width,\n height,\n padding,\n yLabelWidth: model.x.visible ? Math.ceil(xLabelWidth) : 0,\n xAxisVisible: model.y.visible,\n xTitle: !!model.y.title && model.y.visible,\n yTitle: !!model.x.title && model.x.visible,\n fontSize: theme.fontSize,\n });\n if (input.top) plot.y += input.top;\n const yCount =\n model.y.tickCount ??\n (model.y.type === \"category\"\n ? Math.max(1, Math.floor(plot.width / 60))\n : Math.max(3, Math.min(8, Math.floor(plot.width / 88))));\n const yTicks = axisTicks(model.y, view.y, yCount);\n const scales = createScales(\n plot,\n view,\n model.x.reverse,\n model.y.reverse,\n true,\n );\n return { plot, scales, xTicks, yTicks, y2Ticks: null };\n};\n\n/** Labels of the visible scatter points and bar values (`showLabels`) */\nexport const collectPointLabels = (\n model: ChartModel,\n view: ChartView,\n s: Scales,\n yTicks?: AxisTicks | null,\n): PointLabel[] => {\n const labels: PointLabel[] = [];\n // 100% stacks: the axis shows percents, the labels the actual values\n const axisFormat = model.percent\n ? model.formatValue\n : (yTicks?.formatValue ?? model.formatValue);\n for (const series of model.series) {\n if (series.hidden || !series.showLabels) continue;\n if (series.type === \"bar\" && series.barTop) {\n // 100% stacks and right axis series: the values of the data\n const format =\n series.format ??\n (series.yAxis === \"right\"\n ? (model.y2?.format ?? model.formatValue)\n : axisFormat);\n const { x, count } = series.cols;\n const { y, y0, labels: texts } = series.raw;\n const top = series.barTop;\n const [x0, x1] = view.x[0] <= view.x[1] ? view.x : [view.x[1], view.x[0]];\n for (let i = 0; i < count && labels.length < MAX_POINT_LABELS; i++) {\n const xv = x[i] + series.barOffset;\n if (!Number.isFinite(y[i]) || xv < x0 || xv > x1) continue;\n // the end away from the base (the top, or the bottom of negative bars)\n const negative = top[i] < (series.barBase?.[i] ?? 0);\n const reversed = negative !== model.y.reverse;\n const p = toScreen(s, xv, top[i]);\n const step = series.floating && y0 && Number.isFinite(y0[i]);\n // ranges on a time axis (Gantt tasks) have no value to write\n if (step && model.y.type === \"time\" && !texts?.[i]) continue;\n const delta = step ? y[i] - (y0?.[i] ?? 0) : 0;\n labels.push({\n x: p.x,\n y: p.y,\n r: 0,\n text:\n texts?.[i] ??\n (step ? `${delta > 0 ? \"+\" : \"\"}${format(delta)}` : format(y[i])),\n placement: s.horizontal\n ? reversed\n ? \"left\"\n : \"right\"\n : reversed\n ? \"below\"\n : \"above\",\n });\n }\n continue;\n }\n if (series.type !== \"scatter\") continue;\n const { x, y, count, labels: texts, size } = series.cols;\n if (!texts) continue;\n for (let i = 0; i < count && labels.length < MAX_POINT_LABELS; i++) {\n const text = texts[i];\n if (!text) continue;\n const xi = x[i];\n const yi = y[i];\n if (xi < view.x[0] || xi > view.x[1] || yi < view.y[0] || yi > view.y[1])\n continue;\n const d = size && size[i] > 0 ? size[i] : series.pointSize;\n const p = toScreen(s, xi, yi);\n labels.push({ x: p.x, y: p.y, r: d / 2, text });\n }\n }\n return labels;\n};\n\n// ---------------------------------------------------------------- hit tests\n\ninterface Candidate {\n series: SeriesModel;\n index: number;\n /** Pixel position of the point */\n px: number;\n py: number;\n /** Distance along the x axis */\n dx: number;\n dist: number;\n inside: boolean;\n /** Box plots: value of the outlier under the pointer */\n outlier?: number;\n}\n\n/** Bars and box plots sit in a slot of their category */\nconst slotOffset = (s: SeriesModel) =>\n s.type === \"bar\" || s.type === \"boxplot\" ? s.barOffset : 0;\n\n/**\n * Screen position of a point (the end of a bar or stack, the close of a\n * candle, the median of a box)\n */\nexport const pointOf = (s: SeriesModel, i: number, sc: Scales) => {\n const p = toScreen(sc, s.cols.x[i] + slotOffset(s), plottedY(s, i));\n return { px: p.x, py: p.y };\n};\n\n/** Whether a pixel (along x, along y) is on a column from `a` to `b` */\nconst onColumn = (\n sc: Scales,\n center: number,\n half: number,\n a: number,\n b: number,\n ax: number,\n ay: number,\n) => {\n const pa = sc.yToPx(a);\n const pb = sc.yToPx(b);\n return (\n Math.abs(ax - center) <= half &&\n ay >= Math.min(pa, pb) - 2 &&\n ay <= Math.max(pa, pb) + 2\n );\n};\n\nconst candidateOf = (\n s: SeriesModel,\n i: number,\n px: number,\n py: number,\n sc: Scales,\n): Candidate => {\n const p = pointOf(s, i, sc);\n const ax = alongX(sc, px, py);\n const ay = alongY(sc, px, py);\n const center = sc.xToPx(s.cols.x[i] + slotOffset(s));\n let inside = false;\n if (s.type === \"bar\" && s.barBase && s.barTop) {\n const half = s.barHalfWidth / Math.abs(sc.xPerPx);\n inside = onColumn(sc, center, half, s.barBase[i], s.barTop[i], ax, ay);\n } else if (s.type === \"candlestick\" || s.type === \"boxplot\") {\n const { high, low, y } = s.cols;\n const half = Math.max(s.barHalfWidth / Math.abs(sc.xPerPx), 3);\n const a = high ? high[i] : y[i];\n const b = low ? low[i] : y[i];\n inside = onColumn(sc, center, half, a, b, ax, ay);\n }\n return {\n series: s,\n index: i,\n px: p.px,\n py: p.py,\n dx: Math.abs(sc.xToPx(s.cols.x[i]) - ax),\n dist: inside ? 0 : Math.hypot(p.px - px, p.py - py),\n inside,\n };\n};\n\n/** Outlier of a box under a pixel (`undefined` when none is in reach) */\nconst outlierAt = (\n s: SeriesModel,\n i: number,\n px: number,\n py: number,\n sc: Scales,\n slop: number,\n): number | undefined => {\n const list = s.cols.outliers?.[i];\n if (!list) return undefined;\n const center = sc.xToPx(s.cols.x[i] + slotOffset(s));\n const ax = alongX(sc, px, py) - center;\n const ay = alongY(sc, px, py);\n const reach = s.outlierSize / 2 + 4 + slop;\n let best: number | undefined;\n let bestDist = reach;\n list.forEach((v, k) => {\n const d = Math.hypot(ax, sc.yToPx(v) - ay);\n if (d <= bestDist) {\n bestDist = d;\n // the value of the data (right axis series are mapped)\n best = s.raw.outliers?.[i]?.[k] ?? v;\n }\n });\n return best;\n};\n\n/** Diameter of a scatter dot */\nexport const dotSize = (s: SeriesModel, i: number) =>\n s.cols.size && s.cols.size[i] > 0 ? s.cols.size[i] : s.pointSize;\n\nconst maxSizes = new WeakMap<Float32Array, number>();\n\n/** Largest dot of a series (bubbles reach further than plain dots) */\nconst maxDot = (s: SeriesModel) => {\n const sizes = s.cols.size;\n if (!sizes) return s.pointSize;\n let max = maxSizes.get(sizes);\n if (max === undefined) {\n max = s.pointSize;\n for (let i = 0; i < sizes.length; i++) if (sizes[i] > max) max = sizes[i];\n maxSizes.set(sizes, max);\n }\n return max;\n};\n\nconst nearestScatter = (\n s: SeriesModel,\n px: number,\n py: number,\n sc: Scales,\n slop: number,\n) => {\n const radius = Math.max(maxDot(s) / 2 + 6, 10) + slop;\n const at = toData(sc, px, py);\n const rx = radius * Math.abs(sc.xPerPx);\n const ry = radius * Math.abs(sc.yPerPx);\n let best = -1;\n let bestDist = Infinity;\n const { x, y } = s.cols;\n gridOf(s).query(at.x - rx, at.x + rx, at.y - ry, at.y + ry, (i) => {\n const p = toScreen(sc, x[i], y[i]);\n const d = Math.hypot(p.x - px, p.y - py);\n const reach = Math.max(dotSize(s, i) / 2 + 4, 8) + slop;\n if (d <= reach && d <= bestDist) {\n bestDist = d;\n best = i;\n }\n });\n return best;\n};\n\n/** Heatmap cell containing a data position, -1 if none */\nconst cellAt = (s: SeriesModel, xv: number, yv: number) => {\n const { x: hx, y: hy } = s.cellHalf;\n const { x, y } = s.cols;\n let found = -1;\n gridOf(s).query(xv - hx, xv + hx, yv - hy, yv + hy, (i) => {\n if (\n s.cellColors?.[i] &&\n Math.abs(x[i] - xv) <= hx &&\n Math.abs(y[i] - yv) <= hy\n ) {\n found = i;\n }\n });\n return found;\n};\n\nconst nearestX = (s: SeriesModel, xv: number) => {\n const { x, y, count, sorted } = s.cols;\n if (sorted) return nearestIndex(x, y, count, xv);\n let best = -1;\n let bestD = Infinity;\n for (let i = 0; i < count; i++) {\n if (!Number.isFinite(y[i])) continue;\n const d = Math.abs(x[i] - xv);\n if (d < bestD) {\n bestD = d;\n best = i;\n }\n }\n return best;\n};\n\n/** Hover payload item of a point (values of the data, right axis included) */\nexport const hoverItemOf = (s: SeriesModel, index: number): ChartHoverItem => {\n const pc = s.pointColors?.[index];\n const { open, high, low, value, y0, q1, q3, outliers, labels } = s.raw;\n const label = labels?.[index];\n let color = pc ? toCss(pc) : s.colorCss;\n const extra: Partial<ChartHoverItem> = {};\n if (s.type === \"candlestick\") {\n const o = open ? open[index] : NaN;\n if (Number.isFinite(o)) extra.open = o;\n if (high && Number.isFinite(high[index])) extra.high = high[index];\n if (low && Number.isFinite(low[index])) extra.low = low[index];\n color = toCss(s.raw.y[index] < o ? s.downColor : s.upColor);\n } else if (s.type === \"heatmap\") {\n const v = value ? value[index] : s.raw.y[index];\n if (Number.isFinite(v)) extra.value = v;\n const packed = s.cellColors?.[index];\n if (packed) color = toCss(unpackColor(packed));\n } else if (s.type === \"boxplot\") {\n if (high && Number.isFinite(high[index])) extra.high = high[index];\n if (low && Number.isFinite(low[index])) extra.low = low[index];\n if (q1 && Number.isFinite(q1[index])) extra.q1 = q1[index];\n if (q3 && Number.isFinite(q3[index])) extra.q3 = q3[index];\n const out = outliers?.[index];\n if (out) extra.outliers = out.length;\n } else {\n if (y0 && Number.isFinite(y0[index])) extra.y0 = y0[index];\n if (s.type === \"scatter\" && value && Number.isFinite(value[index]))\n extra.value = value[index];\n }\n return {\n seriesIndex: s.index,\n seriesId: s.id,\n seriesName: s.name,\n index,\n x: s.raw.x[index],\n y: s.raw.y[index],\n color,\n ...(label !== undefined ? { label } : {}),\n ...extra,\n };\n};\n\nconst eventOf = (\n candidates: Candidate[],\n xTicks: AxisTicks | null,\n): ChartHoverEvent | null => {\n if (!candidates.length) return null;\n candidates.sort((a, b) => a.series.index - b.series.index);\n const items = candidates.map((c) => {\n const item = hoverItemOf(c.series, c.index);\n if (c.outlier !== undefined) item.outlier = c.outlier;\n return item;\n });\n const x = items[0].x;\n return { items, x, xLabel: xTicks?.formatValue(x) ?? String(x) };\n};\n\n/**\n * Points under a pixel of the stage: the nearest point (scatter / `nearest`\n * tooltips) or every series at the nearest x (`axis` tooltips).\n * `slop` widens the reach of the dots (touch screens).\n */\nexport const hitTest = (\n model: ChartModel,\n sc: Scales,\n xTicks: AxisTicks | null,\n px: number,\n py: number,\n slop = 0,\n): ChartHoverEvent | null => {\n const { plot } = sc;\n const margin = 6 + slop;\n if (\n px < plot.x - margin ||\n px > plot.x + plot.width + margin ||\n py < plot.y - margin ||\n py > plot.y + plot.height + margin\n ) {\n return null;\n }\n const at = toData(sc, px, py);\n const scatter: Candidate[] = [];\n const others: Candidate[] = [];\n for (const s of model.series) {\n if (s.hidden || !s.tooltip || s.cols.count === 0) continue;\n if (s.type === \"scatter\") {\n const i = nearestScatter(s, px, py, sc, slop);\n if (i >= 0) scatter.push(candidateOf(s, i, px, py, sc));\n } else if (s.type === \"heatmap\") {\n const i = cellAt(s, at.x, at.y);\n if (i >= 0) {\n const c = candidateOf(s, i, px, py, sc);\n c.inside = true;\n c.dist = 0;\n scatter.push(c);\n }\n } else {\n const i = nearestX(s, at.x);\n if (i < 0) continue;\n const c = candidateOf(s, i, px, py, sc);\n if (s.type === \"boxplot\") {\n c.outlier = outlierAt(s, i, px, py, sc, slop);\n if (c.outlier !== undefined) {\n c.inside = true;\n c.dist = 0;\n }\n }\n others.push(c);\n }\n }\n if (model.tooltipMode === \"item\") {\n // the shape under the pointer only: bars, boxes, cells, dots in reach\n // and lines within a few pixels; the last drawn wins\n const all = [...scatter, ...others].filter(\n (c) =>\n c.inside ||\n c.series.type === \"scatter\" ||\n ((c.series.type === \"line\" || c.series.type === \"area\") &&\n c.dist <= 8 + slop),\n );\n if (!all.length) return null;\n const best = all.reduce((a, b) =>\n b.dist < a.dist || (b.dist === a.dist && b.series.index > a.series.index)\n ? b\n : a,\n );\n return eventOf([best], xTicks);\n }\n if (model.tooltipMode === \"nearest\") {\n const all = [...scatter, ...others].filter(\n (c) => c.inside || c.series.type === \"scatter\" || c.dist <= 32 + slop,\n );\n if (!all.length) return null;\n const best = all.reduce((a, b) => (b.dist <= a.dist ? b : a));\n return eventOf([best], xTicks);\n }\n if (!others.length) {\n if (!scatter.length) return null;\n return eventOf(\n [scatter.reduce((a, b) => (b.dist <= a.dist ? b : a))],\n xTicks,\n );\n }\n const bestDx = Math.min(...others.map((c) => c.dx));\n const bandPx = model.x.type === \"category\" ? 0.5 / Math.abs(sc.xPerPx) : 0;\n const aligned = others.filter((c) => c.dx <= bestDx + Math.max(1, bandPx));\n const first = aligned.reduce((a, b) => (b.dx < a.dx ? b : a));\n const ordered = [first, ...aligned.filter((c) => c !== first), ...scatter];\n const event = eventOf(ordered, xTicks);\n if (event) {\n event.x = hoverItemOf(first.series, first.index).x;\n event.xLabel = xTicks?.formatValue(event.x) ?? String(event.x);\n }\n return event;\n};\n\n/** Whether two hover payloads point at the same points */\nexport const sameHover = (\n a: ChartHoverEvent | null,\n b: ChartHoverEvent | null,\n): boolean =>\n a === b ||\n (!!a &&\n !!b &&\n a.items.length === b.items.length &&\n a.items.every(\n (it, i) =>\n it.index === b.items[i].index &&\n it.seriesIndex === b.items[i].seriesIndex,\n ));\n\n// ------------------------------------------------------------------ tooltip\n\n/** Change of a candlestick: `+1.25%` */\nconst CHANGE_PERCENT: Intl.NumberFormatOptions = {\n style: \"percent\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n};\n\nexport interface TooltipRow {\n /** Swatch color (CSS) */\n color: string | null;\n name: string;\n value: string;\n}\n\nexport interface TooltipContent {\n title: string;\n /** Swatch of the title (single scatter point, Gantt task) */\n titleColor: string | null;\n /** Muted line below the title (the group of a Gantt task) */\n subtitle?: string;\n rows: TooltipRow[];\n}\n\n/** Extra rows of a point (`details` of its datum) */\nconst detailRows = (s: SeriesModel, index: number): TooltipRow[] =>\n s.raw.details?.[index]?.map((d) => ({\n color: null,\n name: d.name,\n value: d.value,\n })) ?? [];\n\n/**\n * Default tooltip content of a hover payload; `y2Ticks` formats the values\n * of the right axis series\n */\nexport const tooltipContent = (\n model: ChartModel,\n event: ChartHoverEvent,\n yTicks: AxisTicks | null,\n y2Ticks: AxisTicks | null = null,\n): TooltipContent => {\n const yFormat = yTicks?.formatValue ?? String;\n const formatOf = (s: SeriesModel) =>\n s.format ??\n (s.yAxis === \"right\"\n ? (y2Ticks?.formatValue ?? model.y2?.format ?? model.formatValue)\n : yFormat);\n const names = model.labels;\n const first = event.items[0];\n const firstSeries = first ? model.series[first.seriesIndex] : null;\n if (\n event.items.length === 1 &&\n first &&\n firstSeries?.type === \"bar\" &&\n first.y0 !== undefined &&\n model.y.type === \"time\"\n ) {\n // a task of a Gantt chart / timeline: its dates and its length\n const format = formatOf(firstSeries);\n const title = first.label ?? event.xLabel;\n return {\n title,\n titleColor: first.color,\n subtitle:\n first.label !== undefined\n ? `${event.xLabel} · ${firstSeries.name}`\n : firstSeries.name,\n rows: [\n { color: null, name: names.start, value: format(first.y0) },\n { color: null, name: names.end, value: format(first.y) },\n {\n color: null,\n name: names.duration,\n value: formatDuration(first.y - first.y0, model.locale),\n },\n ...detailRows(firstSeries, first.index),\n ],\n };\n }\n if (event.items.length === 1 && firstSeries?.type === \"heatmap\") {\n const yName =\n model.y.type === \"category\"\n ? (model.y.categories[Math.round(first.y)] ?? yFormat(first.y))\n : yFormat(first.y);\n return {\n title: `${event.xLabel} · ${yName}`,\n titleColor: null,\n rows: [\n {\n color: first.color,\n name: first.label ?? firstSeries.name,\n value:\n first.value === undefined\n ? \"–\"\n : (firstSeries.format ?? model.formatValue)(first.value),\n },\n ...detailRows(firstSeries, first.index),\n ],\n };\n }\n const scatterOnly = event.items.every(\n (it) => model.series[it.seriesIndex].type === \"scatter\",\n );\n if (scatterOnly && event.items.length === 1) {\n const it = event.items[0];\n const s = model.series[it.seriesIndex];\n const valueRow: TooltipRow[] =\n it.value !== undefined\n ? [\n {\n color: null,\n name: s.valueName ?? names.value,\n value: (s.format ?? model.formatValue)(it.value),\n },\n ]\n : [];\n if (model.x.type === \"category\") {\n // a dot on a category (Gantt milestones, dot plots)\n return {\n title: it.label ?? event.xLabel,\n titleColor: null,\n rows: [\n { color: it.color, name: it.seriesName, value: formatOf(s)(it.y) },\n ...valueRow,\n ...detailRows(s, it.index),\n ],\n };\n }\n const yAxisFormat =\n s.yAxis === \"right\"\n ? (y2Ticks?.formatValue ?? model.y2?.format ?? model.formatValue)\n : yFormat;\n const rows: TooltipRow[] = [\n { color: null, name: model.x.title ?? names.x, value: event.xLabel },\n {\n color: null,\n name:\n (s.yAxis === \"right\" ? model.y2?.title : model.y.title) ?? names.y,\n // bubbles: `format` is the one of their value, y keeps the axis one\n value: (it.value !== undefined ? yAxisFormat : formatOf(s))(it.y),\n },\n ...valueRow,\n ...detailRows(s, it.index),\n ];\n return {\n title: it.label ?? it.seriesName,\n titleColor: it.color,\n // a named point of a group: the group under its name\n ...(it.label !== undefined && model.series.length > 1\n ? { subtitle: it.seriesName }\n : {}),\n rows,\n };\n }\n const rows: TooltipRow[] = [];\n /** Row of every item */\n const rowOf: number[] = [];\n // one labelled bar on a numeric axis (a histogram bin): the label is the title\n const binTitle =\n event.items.length === 1 &&\n firstSeries?.type === \"bar\" &&\n model.x.type !== \"category\" &&\n first?.label !== undefined\n ? first.label\n : null;\n for (const it of event.items) {\n const s = model.series[it.seriesIndex];\n const format = formatOf(s);\n rowOf.push(rows.length);\n if (s.type === \"candlestick\") {\n const change =\n it.open !== undefined && it.open !== 0\n ? ((it.y - it.open) / Math.abs(it.open)) * 100\n : NaN;\n rows.push({\n color: it.color,\n name: s.name,\n value: Number.isFinite(change)\n ? `${change >= 0 ? \"+\" : \"\"}${numberFormat(model.locale, CHANGE_PERCENT).format(change / 100)}`\n : \"\",\n });\n const ohlc: [string, number | undefined][] = [\n [names.open, it.open],\n [names.high, it.high],\n [names.low, it.low],\n [names.close, it.y],\n ];\n for (const [name, v] of ohlc) {\n if (v !== undefined && Number.isFinite(v))\n rows.push({ color: null, name, value: format(v) });\n }\n continue;\n }\n if (s.type === \"boxplot\") {\n if (it.outlier !== undefined) {\n // an outlier: its value and its group\n rows.push(\n {\n color: it.color,\n name: it.label ? `${it.seriesName} · ${it.label}` : it.seriesName,\n value: \"\",\n },\n { color: null, name: names.outlier, value: format(it.outlier) },\n );\n continue;\n }\n rows.push({\n color: it.color,\n name: it.label ? `${it.seriesName} · ${it.label}` : it.seriesName,\n value: \"\",\n });\n const stats: [string, number | undefined][] = [\n [names.max, it.high],\n [names.q3, it.q3],\n [names.median, it.y],\n [names.q1, it.q1],\n [names.min, it.low],\n ];\n for (const [name, v] of stats) {\n if (v !== undefined && Number.isFinite(v))\n rows.push({ color: null, name, value: format(v) });\n }\n if (it.outliers)\n rows.push({\n color: null,\n name: names.outliers,\n value: String(it.outliers),\n });\n continue;\n }\n let value = format(it.y);\n if (it.y0 !== undefined) {\n // waterfall steps: the change; time ranges and bands: both ends\n const delta = it.y - it.y0;\n value =\n s.type === \"bar\" && model.y.type !== \"time\"\n ? `${delta > 0 ? \"+\" : \"\"}${format(delta)}`\n : `${format(it.y0)} – ${format(it.y)}`;\n }\n rows.push({\n color: it.color,\n name:\n it.label && binTitle === null\n ? `${it.seriesName} · ${it.label}`\n : it.seriesName,\n value,\n });\n rows.push(...detailRows(s, it.index));\n }\n if (model.percent) {\n // 100% stacks: the share of every value next to it\n const totals = new Map<string, number>();\n for (const it of event.items) {\n const stack = stackIdOf(model, it.seriesIndex);\n if (stack !== null && Number.isFinite(it.y))\n totals.set(stack, (totals.get(stack) ?? 0) + Math.abs(it.y));\n }\n event.items.forEach((it, k) => {\n const stack = stackIdOf(model, it.seriesIndex);\n const total = stack !== null ? totals.get(stack) : undefined;\n const row = rows[rowOf[k]];\n if (total && row && Number.isFinite(it.y)) {\n const format = model.series[it.seriesIndex].format ?? model.formatValue;\n row.value = `${format(it.y)} · ${formatPercent((Math.abs(it.y) / total) * 100, model.locale, true)}`;\n }\n });\n }\n return { title: binTitle ?? event.xLabel, titleColor: null, rows };\n};\n\n/** Stack of a series in a 100% chart (`null` when it is not stacked) */\nconst stackIdOf = (model: ChartModel, seriesIndex: number): string | null =>\n model.series[seriesIndex].hidden ? null : model.stacks[seriesIndex];\n\n/**\n * Shape of the hover marker of an item: a dot with a soft halo on a point,\n * a band behind the hovered bar group / candle, or the outline of a cell\n */\nexport type HoverMark =\n | {\n kind: \"dot\";\n x: number;\n y: number;\n size: number;\n color: string;\n /** Translucent series color of the halo around the dot */\n halo: string;\n }\n | { kind: \"band\"; x: number; y: number; width: number; height: number }\n | {\n /** Soft band over the row / column of a hovered cell (above the data) */\n kind: \"guide\";\n x: number;\n y: number;\n width: number;\n height: number;\n }\n | {\n /** The hovered cell, lifted, with a ring inside its edge */\n kind: \"cell\";\n x: number;\n y: number;\n width: number;\n height: number;\n /** Fill of the cell (CSS) */\n color: string;\n /** Ring color (CSS), contrasting with the fill */\n ring: string;\n radius: number;\n };\n\n/** Markers of the hovered points (pixels of the stage); bands come first */\nexport const hoverMarks = (\n model: ChartModel,\n sc: Scales,\n event: ChartHoverEvent,\n): HoverMark[] => {\n const marks: HoverMark[] = [];\n const { plot } = sc;\n let bandLo = Infinity;\n let bandHi = -Infinity;\n for (const it of event.items) {\n const s = model.series[it.seriesIndex];\n // plotted x (the logarithm on log x axes)\n const itX = s.cols.x[it.index] ?? it.x;\n if (s.type === \"boxplot\" && it.outlier !== undefined) {\n const p = toScreen(sc, itX + slotOffset(s), plottedOutlier(s, it));\n marks.push({\n kind: \"dot\",\n x: p.x,\n y: p.y,\n size: s.outlierSize + 3,\n color: it.color,\n halo: toCss(s.pointColors?.[it.index] ?? s.color, 0.2),\n });\n continue;\n }\n if (s.type === \"bar\" || s.type === \"candlestick\" || s.type === \"boxplot\") {\n const c = sc.xToPx(itX + slotOffset(s));\n const half = Math.max(s.barHalfWidth / Math.abs(sc.xPerPx), 1);\n bandLo = Math.min(bandLo, c - half);\n bandHi = Math.max(bandHi, c + half);\n continue;\n }\n if (s.type === \"heatmap\") {\n const cx = sc.xToPx(itX);\n const cy = sc.yToPx(it.y);\n const hw = Math.abs(s.cellHalf.x / sc.xPerPx);\n const hh = Math.abs(s.cellHalf.y / sc.yPerPx);\n const cell = screenRect(sc, cx - hw, cx + hw, cy - hh, cy + hh);\n const style = heatCellStyle(cell.width, cell.height, s.radius);\n // the row and the column, clipped to the plot\n const top = Math.max(plot.y, cell.y);\n const bottom = Math.min(plot.y + plot.height, cell.y + cell.height);\n const left = Math.max(plot.x, cell.x);\n const right = Math.min(plot.x + plot.width, cell.x + cell.width);\n if (bottom > top)\n marks.push({\n kind: \"guide\",\n x: plot.x,\n y: top,\n width: plot.width,\n height: bottom - top,\n });\n if (right > left)\n marks.push({\n kind: \"guide\",\n x: left,\n y: plot.y,\n width: right - left,\n height: plot.height,\n });\n const packed = s.cellColors?.[it.index];\n const fill = packed ? unpackColor(packed) : s.color;\n marks.push({\n kind: \"cell\",\n x: cell.x + style.inset,\n y: cell.y + style.inset,\n width: Math.max(1, cell.width - style.inset * 2),\n height: Math.max(1, cell.height - style.inset * 2),\n color: it.color,\n ring: contrastRing(fill),\n radius: style.radius,\n });\n continue;\n }\n const { px, py } = pointOf(s, it.index, sc);\n if (\n px < plot.x - 1 ||\n px > plot.x + plot.width + 1 ||\n py < plot.y - 1 ||\n py > plot.y + plot.height + 1\n ) {\n continue;\n }\n const size =\n s.type === \"scatter\"\n ? dotSize(s, it.index) + 4\n : Math.max(9, s.lineWidth * 2 + 5);\n const rgba = s.pointColors?.[it.index] ?? s.color;\n marks.push({\n kind: \"dot\",\n x: px,\n y: py,\n size,\n color: it.color,\n halo: toCss(rgba, 0.2),\n });\n }\n if (bandHi > bandLo) {\n // the group of bars plus a margin, clipped to the plot\n const pad = Math.max(4, (bandHi - bandLo) * 0.14);\n const lo = sc.horizontal ? plot.y : plot.x;\n const hi = lo + (sc.horizontal ? plot.height : plot.width);\n const a = Math.max(lo, bandLo - pad);\n const b = Math.min(hi, bandHi + pad);\n if (b > a) {\n marks.unshift({\n kind: \"band\",\n ...(sc.horizontal\n ? { x: plot.x, y: a, width: plot.width, height: b - a }\n : { x: a, y: plot.y, width: b - a, height: plot.height }),\n });\n }\n }\n return marks;\n};\n\n/** Ring of a hovered cell: light on dark fills, dark on light ones */\nexport const contrastRing = (fill: Rgba): string =>\n luminance(fill) > 0.45\n ? \"rgba(15, 23, 42, 0.78)\"\n : \"rgba(255, 255, 255, 0.9)\";\n\n/** Plotted value of the hovered outlier of a box */\nconst plottedOutlier = (s: SeriesModel, it: ChartHoverItem): number => {\n const raw = s.raw.outliers?.[it.index];\n const k = raw ? raw.indexOf(it.outlier ?? NaN) : -1;\n return (\n (k >= 0 ? s.cols.outliers?.[it.index]?.[k] : undefined) ?? it.outlier ?? 0\n );\n};\n\n/** A line from the end of a bar to the next bar, pixels of the stage */\nexport interface ConnectorSegment {\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n color: string;\n width: number;\n dash: number[];\n}\n\n/**\n * Connectors of the bar series (`connector`, waterfalls): from the end of\n * every bar to the next bar, at the value where the next one starts\n */\nexport const connectorSegments = (\n model: ChartModel,\n sc: Scales,\n): ConnectorSegment[] => {\n const out: ConnectorSegment[] = [];\n for (const s of model.series) {\n const c = s.connector;\n if (!c || s.hidden || s.type !== \"bar\" || !s.barTop) continue;\n const { x, count } = s.cols;\n const top = s.barTop;\n const half = s.barHalfWidth;\n const [v0, v1] =\n sc.view.x[0] <= sc.view.x[1] ? sc.view.x : [sc.view.x[1], sc.view.x[0]];\n const color = toCss(c.color, 0.75);\n let prev = -1;\n for (let i = 0; i < count && out.length < MAX_POINT_LABELS * 4; i++) {\n if (!Number.isFinite(top[i]) || !Number.isFinite(x[i])) continue;\n if (prev >= 0 && x[i] + half >= v0 && x[prev] - half <= v1) {\n const a = toScreen(sc, x[prev] + s.barOffset + half, top[prev]);\n const b = toScreen(sc, x[i] + s.barOffset - half, top[prev]);\n out.push({\n x0: a.x,\n y0: a.y,\n x1: b.x,\n y1: b.y,\n color,\n width: c.width,\n dash: c.dash,\n });\n }\n prev = i;\n }\n }\n return out;\n};\n\n/** A dependency with its color resolved against the theme */\nexport interface ResolvedDependency {\n from: string;\n to: string;\n color: string;\n}\n\n/** Colors of the dependency arrows (resolved once per options / theme) */\nexport const resolveDependencies = (\n dependencies: readonly ChartDependency[] | undefined,\n theme: ChartTheme,\n): ResolvedDependency[] => {\n const resolve = theme.resolve ?? fallbackResolve;\n const muted = toCss(theme.textMuted, 0.85);\n return (dependencies ?? []).map((d) => ({\n from: d.from,\n to: d.to,\n color: d.color ? toCss(resolve(d.color, theme.textMuted)) : muted,\n }));\n};\n\n/**\n * Elbow arrow between two bars, pixels of the stage: an axis-aligned\n * polyline ending at the base of a filled triangular head\n */\nexport interface DependencyArrow {\n /** Corners of the line, from the end of the predecessor to the base of the head */\n points: { x: number; y: number }[];\n /** Tip and the two base corners of the arrowhead */\n head: [\n { x: number; y: number },\n { x: number; y: number },\n { x: number; y: number },\n ];\n color: string;\n width: number;\n}\n\n/** Length and half width of the arrowheads, in CSS pixels */\nexport const ARROW_HEAD = { length: 6, half: 3.5 };\n\ninterface RowSpan {\n /** Category position of the bar center */\n at: number;\n start: number;\n end: number;\n /** Half thickness of the bar / radius of the dot in pixels */\n half: number;\n /** A dot (milestone): the arrows stop at its edge */\n dot: boolean;\n}\n\n/** Bars (or dots) of every category, the first visible one per category */\nconst rowSpans = (model: ChartModel, sc: Scales): Map<number, RowSpan> => {\n const rows = new Map<number, RowSpan>();\n for (const s of model.series) {\n if (s.hidden || !s.tooltip) continue;\n if (s.type !== \"bar\" && s.type !== \"scatter\") continue;\n const { x, y, count } = s.cols;\n const bar = s.type === \"bar\" && s.barBase && s.barTop;\n const half = bar ? s.barHalfWidth / Math.abs(sc.xPerPx) : dotSize(s, 0) / 2;\n for (let i = 0; i < count; i++) {\n const k = Math.round(x[i]);\n if (rows.has(k)) continue;\n const start = bar ? s.barBase![i] : y[i];\n const end = bar ? s.barTop![i] : y[i];\n if (!Number.isFinite(start) || !Number.isFinite(end)) continue;\n rows.set(k, {\n at: x[i] + slotOffset(s),\n start: Math.min(start, end),\n end: Math.max(start, end),\n half,\n dot: !bar,\n });\n }\n }\n return rows;\n};\n\n/**\n * Dependency arrows (`dependencies`, Gantt charts): from the end of the\n * predecessor to the start of the successor; when the successor starts\n * too early the line turns around between the rows\n */\nexport const dependencyArrows = (\n model: ChartModel,\n sc: Scales,\n dependencies: readonly ResolvedDependency[],\n): DependencyArrow[] => {\n if (!dependencies.length || model.x.type !== \"category\") return [];\n const rows = rowSpans(model, sc);\n const index = new Map<string, number>();\n model.x.categories.forEach((c, i) => {\n if (!index.has(c)) index.set(c, i);\n });\n // (value pixel, category pixel) -> stage pixels\n const horizontal = sc.horizontal;\n const pt = (v: number, c: number) =>\n horizontal ? { x: v, y: c } : { x: c, y: v };\n const valuePx = (value: number) => {\n const p = toScreen(sc, 0, value);\n return horizontal ? p.x : p.y;\n };\n const categoryPx = (at: number) => {\n const p = toScreen(sc, at, 0);\n return horizontal ? p.y : p.x;\n };\n const dir = Math.sign(valuePx(sc.view.y[1]) - valuePx(sc.view.y[0])) || 1;\n const rowPx = Math.abs(categoryPx(1) - categoryPx(0));\n const { length, half } = ARROW_HEAD;\n const gap = 8;\n const out: DependencyArrow[] = [];\n for (const d of dependencies) {\n const a = rows.get(index.get(d.from) ?? NaN);\n const b = rows.get(index.get(d.to) ?? NaN);\n if (!a || !b || a === b) continue;\n const ev = valuePx(a.end) + (a.dot ? dir * a.half : 0);\n const ca = categoryPx(a.at);\n const sv = valuePx(b.start) - dir * (b.dot ? b.half + 1 : 1);\n const cb = categoryPx(b.at);\n const base = sv - dir * length;\n const points = [pt(ev, ca)];\n const exit = ev + dir * gap;\n if (dir * (base - exit) >= 0) {\n // room before the successor: out, across the rows, in\n points.push(pt(exit, ca), pt(exit, cb), pt(base, cb));\n } else {\n // around: out, to the gap between the rows, back, across, in\n const side = Math.sign(cb - ca) || 1;\n const between = ca + side * Math.max(a.half + 3, rowPx / 2);\n const back = base - dir * gap;\n points.push(\n pt(exit, ca),\n pt(exit, between),\n pt(back, between),\n pt(back, cb),\n pt(base, cb),\n );\n }\n out.push({\n points,\n head: [pt(sv, cb), pt(base, cb - half), pt(base, cb + half)],\n color: d.color,\n width: 1.25,\n });\n }\n return out;\n};\n\n/** Visual map of a heatmap: its color ramp and the values at the ends */\nexport interface ColorLegend {\n seriesIndex: number;\n /** CSS colors at even steps from the lowest to the highest value */\n stops: string[];\n /** Labels along the ramp (`at`: 0-1): the ends, and the middle of diverging ramps */\n labels: { at: number; text: string }[];\n}\n\nconst COLOR_STOPS = 12;\n\n/**\n * Color legend of a heatmap chart (every series is a heatmap; the first\n * visible one), `null` otherwise\n */\nexport const colorLegend = (model: ChartModel): ColorLegend | null => {\n if (!model.series.length || model.series.some((s) => s.type !== \"heatmap\"))\n return null;\n const s = model.series.find((it) => !it.hidden && it.colorLut);\n const lut = s?.colorLut;\n if (!s || !lut) return null;\n const stops: string[] = [];\n for (let k = 0; k < COLOR_STOPS; k++) {\n const packed = lut[Math.round((k / (COLOR_STOPS - 1)) * (lut.length - 1))];\n stops.push(toCss(unpackColor(packed ?? 0)));\n }\n const format = s.format ?? model.formatValue;\n const [lo, hi] = s.valueRange;\n const labels = [\n { at: 0, text: format(lo) },\n { at: 1, text: format(hi) },\n ];\n const mid = s.colorMidpoint;\n if (mid !== null && mid > lo && mid < hi)\n labels.splice(1, 0, { at: 0.5, text: format(mid) });\n return { seriesIndex: s.index, stops, labels };\n};\n\n/** Whether the legend shows (`legend` option; heatmaps get their color legend) */\nexport const legendShown = (\n option: ChartOptions[\"legend\"],\n model: ChartModel,\n named: number,\n): boolean =>\n option === undefined ? named > 1 || colorLegend(model) !== null : !!option;\n\n/** Swatch of a series in the legend */\nexport const legendShape = (\n type: SeriesModel[\"type\"],\n): \"dot\" | \"line\" | \"square\" =>\n type === \"scatter\" ? \"dot\" : type === \"line\" ? \"line\" : \"square\";\n\n/** Whether the guide line follows the pointer */\nexport const showsCrosshair = (\n model: ChartModel,\n event: ChartHoverEvent,\n crosshair: boolean | undefined,\n) =>\n crosshair ??\n (model.tooltipMode === \"axis\" &&\n event.items.some((it) => {\n const type = model.series[it.seriesIndex].type;\n return type === \"line\" || type === \"area\";\n }) &&\n // bars get a band instead\n !event.items.some((it) => {\n const type = model.series[it.seriesIndex].type;\n return type === \"bar\" || type === \"candlestick\" || type === \"boxplot\";\n }));\n\n/** Pixel of the guide line along the x axis (`null` when hidden / outside the plot) */\nexport const crosshairAt = (\n model: ChartModel,\n sc: Scales,\n event: ChartHoverEvent,\n crosshair: boolean | undefined,\n): number | null => {\n if (!showsCrosshair(model, event, crosshair)) return null;\n const first = event.items[0];\n const c = sc.xToPx(\n model.series[first.seriesIndex]?.cols.x[first.index] ??\n toPlotX(model, first.x),\n );\n const lo = sc.horizontal ? sc.plot.y : sc.plot.x;\n const hi = lo + (sc.horizontal ? sc.plot.height : sc.plot.width);\n return c >= lo && c <= hi ? c : null;\n};\n"],"mappings":"sLA0CA,IAAa2B,EAAkB,CAAE,IAAK,GAAI,MAAO,GAAI,OAAQ,EAAG,KAAM,CAAE,EAE3DC,GAAmB,EAAgB,IAAmBC,EAMtDC,GACX,EACA,EACA,EACA,IACyB,CACzB,IAAMC,EAAUC,EAAM,SAAWJ,EAC3BK,EAAmC,GACtCC,GAAQC,IAAM,IAAA,GAAYD,EAAKC,CAAC,EAAIA,EACjCC,EAAmC,GACtCC,GAAQF,IAAM,IAAA,GAAYE,EAAKF,CAAC,EAAIA,EACvC,OAAQG,GAAe,CAAC,EAAA,CAAG,IAAK,GAAM,CACpC,GAAIC,EAAE,OAAS,OAAQ,CACrB,IAAMC,EAAQD,EAAE,MAAQR,EAAQQ,EAAE,MAAOP,EAAM,OAAO,EAAIA,EAAM,QAChE,MAAO,CACL,KAAM,OACN,GAAII,EAAEG,EAAE,EAAE,EACV,GAAIH,EAAEG,EAAE,EAAE,EACV,GAAIN,EAAEM,EAAE,EAAE,EACV,GAAIN,EAAEM,EAAE,EAAE,EACV,QACA,QAASA,EAAE,SAAW,IACtB,MAAOA,EAAE,MACT,cAAeA,EAAE,eAAiB,WAClC,WAAYA,EAAE,WACVR,EAAQQ,EAAE,WAAYC,CAAK,EAC3BxC,EAAAA,IAAIwC,EAAOR,EAAM,KAAM,EAAG,CAChC,CACF,CAYA,OAXIO,EAAE,OAAS,OACN,CACL,KAAM,OACN,EAAGH,EAAEG,EAAE,CAAC,EACR,EAAGN,EAAEM,EAAE,CAAC,EACR,KAAMA,EAAE,KACR,OAAQA,EAAE,QAAU,SACpB,MAAOA,EAAE,MAAQR,EAAQQ,EAAE,MAAOP,EAAM,SAAS,EAAIA,EAAM,UAC3D,OAAQO,EAAE,QAAU,GACtB,EAEK,CACL,KAAM,OACN,KAAMA,EAAE,KACR,MAAOA,EAAE,OAAS,IAAMN,EAAEM,EAAE,KAAK,EAAIH,EAAEG,EAAE,KAAK,EAC9C,MAAOA,EAAE,MAAQR,EAAQQ,EAAE,MAAOP,EAAM,SAAS,EAAIA,EAAM,UAC3D,MAAOO,EAAE,OAAS,EAClB,KAAM,CAAC,GAAIA,EAAE,MAAQ,CAAC,EAAG,CAAC,CAAE,EAC5B,MAAOA,EAAE,KACX,CACF,CAAC,CACH,EA0BaE,EAAe,GAAoC,CAC9D,GAAM,CAAE,QAAO,OAAM,QAAO,QAAO,SAAQ,WAAYC,EACvD,GAAIC,EAAM,WAAY,OAAOC,EAAiBF,CAAK,EAGnD,IAAMG,EACJF,EAAM,EAAE,YACPA,EAAM,EAAE,OAAS,WACd,KAAK,IAAI,EAAG,KAAK,OAAOG,EAAS,KAAOd,EAAM,SAAW,EAAE,CAAC,EAC5Dc,GAAU,IACR,EACA,KAAK,IAAI,EAAG,KAAK,OAAOA,EAAS,IAAM,EAAE,CAAC,GAC5CC,EAAS9C,EAAAA,UAAU0C,EAAM,EAAGK,EAAK,EAAGH,CAAM,EAC5CI,EAAc,EAClB,GAAIN,EAAM,EAAE,QACV,IAAK,IAAMO,KAASH,EAAO,OACzB,EAAc,KAAK,IAAIE,EAAaE,EAAQD,CAAK,CAAC,EAEtD,IAAME,EAAUC,EAAWV,EAAOI,EAAQC,EAAK,EAAGH,CAAM,EACpDS,EAAe,EACnB,GAAIF,GAAWT,EAAM,IAAI,QACvB,IAAK,IAAMO,KAASE,EAAQ,OAC1B,EAAe,KAAK,IAAIE,EAAcH,EAAQD,CAAK,CAAC,EAExD,IAAIK,EAAgB,GACpB,GAAIZ,EAAM,EAAE,OAAS,WAAY,CAC/B,EAAgB,EAChB,IAAMa,EAAO,KAAK,IAAI,EAAG,KAAK,MAAMb,EAAM,EAAE,WAAW,OAAS,GAAG,CAAC,EACpE,IAAK,IAAIc,EAAI,EAAGA,EAAId,EAAM,EAAE,WAAW,OAAQ,GAAKa,EAClD,EAAgB,KAAK,IAAID,EAAeJ,EAAQR,EAAM,EAAE,WAAWc,EAAE,CAAC,CAE1E,CACA,IAAMC,EAAU,CAAE,GAAG/B,EAAiB,GAAGe,EAAM,OAAQ,EACjDiB,EAAOzD,EAAAA,YAAY,CACvB,QACA,SACA,UACA,YAAayC,EAAM,EAAE,QAAU,KAAK,KAAKM,CAAW,EAAI,EACxD,aAAc,KAAK,KAAKK,CAAY,EACpC,QAAS,CAAC,CAACX,EAAM,IAAI,OAAS,CAAC,CAACA,EAAM,GAAG,QACzC,aAAcA,EAAM,EAAE,QACtB,OAAQ,CAAC,CAACA,EAAM,EAAE,OAASA,EAAM,EAAE,QACnC,OAAQ,CAAC,CAACA,EAAM,EAAE,OAASA,EAAM,EAAE,QACnC,SAAUX,EAAM,QAClB,CAAC,EACGU,EAAM,MAAK,EAAK,GAAKA,EAAM,KAC/B,IAAMkB,EACJjB,EAAM,EAAE,OAAS,WACb,KAAK,IAAI,EAAG,KAAK,MAAMgB,EAAK,OAASJ,EAAgB,GAAG,CAAC,EACxDZ,EAAM,EAAE,WAAa,KAAK,IAAI,EAAG,KAAK,MAAMgB,EAAK,MAAQ,EAAE,CAAC,EAC7DE,EAAS5D,EAAAA,UAAU0C,EAAM,EAAGK,EAAK,EAAGY,CAAM,EAEhD,MAAO,CAAE,OAAM,OADAzD,EAAAA,aAAawD,EAAMX,EAAML,EAAM,EAAE,QAASA,EAAM,EAAE,OAClD,EAAQ,SAAQ,SAAQ,SAAQ,CACjD,EAMMU,GACJ,EACA,EACA,EACA,IACqB,CACrB,IAAMS,EAAOnB,EAAM,GACboB,EAAMpB,EAAM,MAClB,GAAI,CAACmB,GAAQ,CAACC,GAAO,CAACA,EAAI,MAAO,OAAO,KACxC,GAAIA,EAAI,IAAK,CACX,IAAMxB,GAAKS,EAAK,GAAKe,EAAI,QAAUA,EAAI,MACjCC,GAAKhB,EAAK,GAAKe,EAAI,QAAUA,EAAI,MACjCE,EAAQhE,EAAAA,UAAU6D,EAAM,CAAC,KAAK,IAAIvB,EAAGyB,CAAC,EAAG,KAAK,IAAIzB,EAAGyB,CAAC,CAAC,EAAGE,CAAK,EACrE,MAAO,CACL,GAAGD,EACH,OAAQA,EAAM,OAAO,IAAK,GAAM,EAAIF,EAAI,MAAQA,EAAI,MAAM,CAC5D,CACF,CACA,IAAMI,EAAMpB,EAAO,OAAO,IAAK,IAAOZ,EAAI4B,EAAI,QAAUA,EAAI,KAAK,EAC3DP,EAAOW,EAAI,OAAS,EAAI,KAAK,IAAIA,EAAI,GAAKA,EAAI,EAAE,EAAI,EACtDC,EAAS,EACb,IAAK,IAAMjC,KAAKgC,EAAK,EAAS,KAAK,IAAIC,EAAQ,KAAK,IAAIjC,CAAC,CAAC,EAC1D,IAAMkC,EAAOP,EAAK,QAAU1D,EAAAA,cAAcoD,EAAMY,EAAQzB,EAAM,MAAM,EACpE,MAAO,CACL,OAAQI,EAAO,OACf,OAAQoB,EAAI,IAAIE,CAAI,EACpB,YAAaP,EAAK,QAAUnB,EAAM,WACpC,CACF,EAGMC,EAAoB,GAAoC,CAC5D,GAAM,CAAE,QAAO,OAAM,QAAO,QAAO,SAAQ,WAAYF,EACjD4B,EAAO,KAAK,IAAI,EAAG,KAAK,OAAOxB,EAAS,KAAOd,EAAM,SAAW,EAAE,CAAC,EACnE4B,EACJjB,EAAM,EAAE,YACPA,EAAM,EAAE,OAAS,WACd2B,EACAxB,GAAU,IACR,EACA,KAAK,IAAI,EAAG,KAAK,OAAOA,EAAS,IAAM,EAAE,CAAC,GAC5Ce,EAAS5D,EAAAA,UAAU0C,EAAM,EAAGK,EAAK,EAAGY,CAAM,EAC5CW,EAAc,EAClB,GAAI5B,EAAM,EAAE,QAAS,CACnB,GAAIA,EAAM,EAAE,OAAS,WAAY,CAE/B,IAAM6B,EAAQ7B,EAAM,EAAE,WAChBa,EAAO,KAAK,IAAI,EAAG,KAAK,MAAMgB,EAAM,OAAS,GAAG,CAAC,EACvD,IAAK,IAAIf,EAAI,EAAGA,EAAIe,EAAM,OAAQ,GAAKhB,EAAM,CAC3C,IAAMiB,EAAO9B,EAAM,EAAE,OAASA,EAAM,EAAE,OAAOc,CAAC,EAAIe,EAAMf,GACxD,EAAc,KAAK,IAAIc,EAAapB,EAAQsB,CAAI,CAAC,CACnD,CACF,MACE,IAAK,IAAMvB,KAASW,EAAO,OACzB,EAAc,KAAK,IAAIU,EAAapB,EAAQD,CAAK,CAAC,CAExD,CACA,IAAMQ,EAAU,CAAE,GAAG/B,EAAiB,GAAGe,EAAM,OAAQ,EACjDiB,EAAOzD,EAAAA,YAAY,CACvB,QACA,SACA,UACA,YAAayC,EAAM,EAAE,QAAU,KAAK,KAAK4B,CAAW,EAAI,EACxD,aAAc5B,EAAM,EAAE,QACtB,OAAQ,CAAC,CAACA,EAAM,EAAE,OAASA,EAAM,EAAE,QACnC,OAAQ,CAAC,CAACA,EAAM,EAAE,OAASA,EAAM,EAAE,QACnC,SAAUX,EAAM,QAClB,CAAC,EACGU,EAAM,MAAK,EAAK,GAAKA,EAAM,KAC/B,IAAMG,EACJF,EAAM,EAAE,YACPA,EAAM,EAAE,OAAS,WACd,KAAK,IAAI,EAAG,KAAK,MAAMgB,EAAK,MAAQ,EAAE,CAAC,EACvC,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,KAAK,MAAMA,EAAK,MAAQ,EAAE,CAAC,CAAC,GACpDZ,EAAS9C,EAAAA,UAAU0C,EAAM,EAAGK,EAAK,EAAGH,CAAM,EAQhD,MAAO,CAAE,OAAM,OAPA1C,EAAAA,aACbwD,EACAX,EACAL,EAAM,EAAE,QACRA,EAAM,EAAE,QACR,EAEa,EAAQ,SAAQ,SAAQ,QAAS,IAAK,CACvD,EAGa+B,GACX,EACA,EACA,EACA,IACiB,CACjB,IAAMC,EAAuB,CAAC,EAExBC,EAAajC,EAAM,QACrBA,EAAM,YACLI,GAAQ,aAAeJ,EAAM,YAClC,IAAK,IAAMkC,KAAUlC,EAAM,OAAQ,CACjC,GAAIkC,EAAO,QAAU,CAACA,EAAO,WAAY,SACzC,GAAIA,EAAO,OAAS,OAASA,EAAO,OAAQ,CAE1C,IAAMC,EACJD,EAAO,SACNA,EAAO,QAAU,QACblC,EAAM,IAAI,QAAUA,EAAM,YAC3BiC,GACA,CAAE,IAAG,SAAUC,EAAO,KACtB,CAAE,IAAG,KAAI,OAAQE,GAAUF,EAAO,IAClCG,EAAMH,EAAO,OACb,CAACI,EAAIC,GAAMlC,EAAK,EAAE,IAAMA,EAAK,EAAE,GAAKA,EAAK,EAAI,CAACA,EAAK,EAAE,GAAIA,EAAK,EAAE,EAAE,EACxE,IAAK,IAAIS,EAAI,EAAGA,EAAIS,GAASS,EAAO,OAAA,IAA2B,IAAK,CAClE,IAAMQ,EAAK/C,EAAEqB,GAAKoB,EAAO,UACzB,GAAI,CAAC,OAAO,SAAS5C,EAAEwB,EAAE,GAAK0B,EAAKF,GAAME,EAAKD,EAAI,SAGlD,IAAME,EADWJ,EAAIvB,IAAMoB,EAAO,UAAUpB,IAAM,KACpBd,EAAM,EAAE,QAChC0C,EAAIhF,EAAAA,SAASiF,EAAGH,EAAIH,EAAIvB,EAAE,EAC1BD,EAAOqB,EAAO,UAAYU,GAAM,OAAO,SAASA,EAAG9B,EAAE,EAE3D,GAAID,GAAQb,EAAM,EAAE,OAAS,QAAU,CAACoC,IAAQtB,GAAI,SACpD,IAAM+B,EAAQhC,EAAOvB,EAAEwB,IAAM8B,IAAK9B,IAAM,GAAK,EAC7CkB,EAAO,KAAK,CACV,EAAGU,EAAE,EACL,EAAGA,EAAE,EACL,EAAG,EACH,KACEN,IAAQtB,KACPD,EAAO,GAAGgC,EAAQ,EAAI,IAAM,KAAKV,EAAOU,CAAK,IAAMV,EAAO7C,EAAEwB,EAAE,GACjE,UAAW6B,EAAE,WACTF,EACE,OACA,QACFA,EACE,QACA,OACR,CAAC,CACH,CACA,QACF,CACA,GAAIP,EAAO,OAAS,UAAW,SAC/B,GAAM,CAAE,IAAG,IAAG,QAAO,OAAQE,EAAO,QAASF,EAAO,KACpD,GAAKE,EACL,IAAK,IAAItB,EAAI,EAAGA,EAAIS,GAASS,EAAO,OAAA,IAA2B,IAAK,CAClE,IAAMc,EAAOV,EAAMtB,GACnB,GAAI,CAACgC,EAAM,SACX,IAAMC,EAAKtD,EAAEqB,GACPkC,EAAK1D,EAAEwB,GACb,GAAIiC,EAAK1C,EAAK,EAAE,IAAM0C,EAAK1C,EAAK,EAAE,IAAM2C,EAAK3C,EAAK,EAAE,IAAM2C,EAAK3C,EAAK,EAAE,GACpE,SACF,IAAM4C,EAAIC,GAAQA,EAAKpC,GAAK,EAAIoC,EAAKpC,GAAKoB,EAAO,UAC3CQ,EAAIhF,EAAAA,SAASiF,EAAGI,EAAIC,CAAE,EAC5BhB,EAAO,KAAK,CAAE,EAAGU,EAAE,EAAG,EAAGA,EAAE,EAAG,EAAGO,EAAI,EAAG,MAAK,CAAC,CAChD,CACF,CACA,OAAOjB,CACT,EAmBMmB,EAAc,GAClBR,EAAE,OAAS,OAASA,EAAE,OAAS,UAAYA,EAAE,UAAY,EAM9CS,GAAW,EAAgB,EAAW,IAAe,CAChE,IAAMV,EAAIhF,EAAAA,SAAS2F,EAAIV,EAAE,KAAK,EAAE7B,GAAKqC,EAAWR,CAAC,EAAGhF,EAAAA,SAASgF,EAAG7B,CAAC,CAAC,EAClE,MAAO,CAAE,GAAI4B,EAAE,EAAG,GAAIA,EAAE,CAAE,CAC5B,EAGMY,GACJ,EACA,EACA,EACA,EACA,EACA,EACA,IACG,CACH,IAAMC,EAAKF,EAAG,MAAMzD,CAAC,EACf4D,EAAKH,EAAG,MAAMhC,CAAC,EACrB,OACE,KAAK,IAAIoC,EAAKC,CAAM,GAAKC,GACzBC,GAAM,KAAK,IAAIL,EAAIC,CAAE,EAAI,GACzBI,GAAM,KAAK,IAAIL,EAAIC,CAAE,EAAI,CAE7B,EAEMK,GACJ,EACA,EACA,EACA,EACA,IACc,CACd,IAAMnB,EAAIU,EAAQT,EAAG7B,EAAGuC,CAAE,EACpBI,EAAK7F,EAAAA,OAAOyF,EAAIS,EAAIC,CAAE,EACtBH,EAAK/F,EAAAA,OAAOwF,EAAIS,EAAIC,CAAE,EACtBL,EAASL,EAAG,MAAMV,EAAE,KAAK,EAAE7B,GAAKqC,EAAWR,CAAC,CAAC,EAC/CqB,EAAS,GACb,GAAIrB,EAAE,OAAS,OAASA,EAAE,SAAWA,EAAE,OAErC,EAASW,EAASD,EAAIK,EADTf,EAAE,aAAe,KAAK,IAAIU,EAAG,MAAM,EACZV,EAAE,QAAQ7B,GAAI6B,EAAE,OAAO7B,GAAI2C,EAAIG,CAAE,OAChE,GAAIjB,EAAE,OAAS,eAAiBA,EAAE,OAAS,UAAW,CAC3D,GAAM,CAAE,OAAM,MAAK,KAAMA,EAAE,KAI3B,EAASW,EAASD,EAAIK,EAHT,KAAK,IAAIf,EAAE,aAAe,KAAK,IAAIU,EAAG,MAAM,EAAG,CAG9B,EAFpBY,EAAOA,EAAKnD,GAAKxB,EAAEwB,GACnBoD,EAAMA,EAAIpD,GAAKxB,EAAEwB,GACe2C,EAAIG,CAAE,CAClD,CACA,MAAO,CACL,OAAQjB,EACR,MAAO7B,EACP,GAAI4B,EAAE,GACN,GAAIA,EAAE,GACN,GAAI,KAAK,IAAIW,EAAG,MAAMV,EAAE,KAAK,EAAE7B,EAAE,EAAI2C,CAAE,EACvC,KAAMO,EAAS,EAAI,KAAK,MAAMtB,EAAE,GAAKoB,EAAIpB,EAAE,GAAKqB,CAAE,EAClD,QACF,CACF,EAGMI,GACJ,EACA,EACA,EACA,EACA,EACA,IACuB,CACvB,IAAMC,EAAOzB,EAAE,KAAK,WAAW7B,GAC/B,GAAI,CAACsD,EAAM,OACX,IAAMV,EAASL,EAAG,MAAMV,EAAE,KAAK,EAAE7B,GAAKqC,EAAWR,CAAC,CAAC,EAC7Cc,EAAK7F,EAAAA,OAAOyF,EAAIS,EAAIC,CAAE,EAAIL,EAC1BE,EAAK/F,EAAAA,OAAOwF,EAAIS,EAAIC,CAAE,EACtBM,EAAQ1B,EAAE,YAAc,EAAI,EAAI2B,EAClCC,EACAC,EAAWH,EASf,OARAD,EAAK,SAAS,EAAG,IAAM,CACrB,IAAMnB,EAAI,KAAK,MAAMQ,EAAIJ,EAAG,MAAM7D,CAAC,EAAIoE,CAAE,EACrCX,GAAKuB,IACP,EAAWvB,EAEX,EAAON,EAAE,IAAI,WAAW7B,EAAE,GAAG2D,IAAMjF,EAEvC,CAAC,EACM+E,CACT,EAGaG,GAAW,EAAgB,IACtC/B,EAAE,KAAK,MAAQA,EAAE,KAAK,KAAK7B,GAAK,EAAI6B,EAAE,KAAK,KAAK7B,GAAK6B,EAAE,UAEnDgC,EAAW,IAAI,QAGfC,EAAU,GAAmB,CACjC,IAAMC,EAAQlC,EAAE,KAAK,KACrB,GAAI,CAACkC,EAAO,OAAOlC,EAAE,UACrB,IAAImC,EAAMH,EAAS,IAAIE,CAAK,EAC5B,GAAIC,IAAQ,IAAA,GAAW,CACrB,EAAMnC,EAAE,UACR,IAAK,IAAI7B,EAAI,EAAGA,EAAI+D,EAAM,OAAQ,IAASA,EAAM/D,GAAKgE,IAAK,EAAMD,EAAM/D,IACvE6D,EAAS,IAAIE,EAAOC,CAAG,CACzB,CACA,OAAOA,CACT,EAEMC,GACJ,EACA,EACA,EACA,EACA,IACG,CACH,IAAMC,EAAS,KAAK,IAAIJ,EAAOjC,CAAC,EAAI,EAAI,EAAG,EAAE,EAAI2B,EAC3CW,EAAKnH,EAAAA,OAAOuF,EAAIS,EAAIC,CAAE,EACtBmB,EAAKF,EAAS,KAAK,IAAI3B,EAAG,MAAM,EAChC8B,EAAKH,EAAS,KAAK,IAAI3B,EAAG,MAAM,EAClCkB,EAAO,GACPC,EAAW,IACT,CAAE,IAAG,KAAM7B,EAAE,KAUnB,OATA7D,EAAA,OAAO6D,CAAC,CAAC,CAAC,MAAMsC,EAAG,EAAIC,EAAID,EAAG,EAAIC,EAAID,EAAG,EAAIE,EAAIF,EAAG,EAAIE,EAAK,GAAM,CACjE,IAAMzC,EAAIhF,EAAAA,SAAS2F,EAAI5D,EAAEqB,GAAIxB,EAAEwB,EAAE,EAC3BmC,EAAI,KAAK,MAAMP,EAAE,EAAIoB,EAAIpB,EAAE,EAAIqB,CAAE,EAEnCd,GADU,KAAK,IAAIyB,EAAQ/B,EAAG7B,CAAC,EAAI,EAAI,EAAG,CAAC,EAAIwD,GACjCrB,GAAKuB,IACrB,EAAWvB,EACX,EAAOnC,EAEX,CAAC,EACMyD,CACT,EAGMa,GAAU,EAAgB,EAAY,IAAe,CACzD,GAAM,CAAE,EAAGC,EAAI,EAAGC,GAAO3C,EAAE,SACrB,CAAE,IAAG,KAAMA,EAAE,KACf4C,EAAQ,GAUZ,OATAzG,EAAA,OAAO6D,CAAC,CAAC,CAAC,MAAMH,EAAK6C,EAAI7C,EAAK6C,EAAIG,EAAKF,EAAIE,EAAKF,EAAK,GAAM,CAEvD3C,EAAE,aAAa7B,IACf,KAAK,IAAIrB,EAAEqB,GAAK0B,CAAE,GAAK6C,GACvB,KAAK,IAAI/F,EAAEwB,GAAK0E,CAAE,GAAKF,IAEvB,EAAQxE,EAEZ,CAAC,EACMyE,CACT,EAEME,GAAY,EAAgB,IAAe,CAC/C,GAAM,CAAE,IAAG,IAAG,QAAO,UAAW9C,EAAE,KAClC,GAAI+C,EAAQ,OAAO3H,EAAAA,aAAa0B,EAAGH,EAAGiC,EAAOiB,CAAE,EAC/C,IAAI+B,EAAO,GACPoB,EAAQ,IACZ,IAAK,IAAI7E,EAAI,EAAGA,EAAIS,EAAO,IAAK,CAC9B,GAAI,CAAC,OAAO,SAASjC,EAAEwB,EAAE,EAAG,SAC5B,IAAMmC,EAAI,KAAK,IAAIxD,EAAEqB,GAAK0B,CAAE,EACxBS,EAAI0C,IACN,EAAQ1C,EACR,EAAOnC,EAEX,CACA,OAAOyD,CACT,EAGaqB,GAAe,EAAgB,IAAkC,CAC5E,IAAMC,EAAKlD,EAAE,cAAcmD,GACrB,CAAE,OAAM,OAAM,MAAK,QAAO,KAAI,KAAI,KAAI,WAAU,UAAWnD,EAAE,IAC7DpC,EAAQyB,IAAS8D,GACnBjG,EAAQgG,EAAK7H,EAAAA,MAAM6H,CAAE,EAAIlD,EAAE,SACzBoD,EAAiC,CAAC,EACxC,GAAIpD,EAAE,OAAS,cAAe,CAC5B,IAAMqD,EAAIC,EAAOA,EAAKH,GAAS,IAC3B,OAAO,SAASE,CAAC,IAAG,EAAM,KAAOA,GACjC/B,GAAQ,OAAO,SAASA,EAAK6B,EAAM,IAAG,EAAM,KAAO7B,EAAK6B,IACxD5B,GAAO,OAAO,SAASA,EAAI4B,EAAM,IAAG,EAAM,IAAM5B,EAAI4B,IACxD,EAAQ9H,EAAAA,MAAM2E,EAAE,IAAI,EAAEmD,GAASE,EAAIrD,EAAE,UAAYA,EAAE,OAAO,CAC5D,MAAO,GAAIA,EAAE,OAAS,UAAW,CAC/B,IAAMnD,EAAI0G,EAAQA,EAAMJ,GAASnD,EAAE,IAAI,EAAEmD,GACrC,OAAO,SAAStG,CAAC,IAAG,EAAM,MAAQA,GACtC,IAAM2G,EAASxD,EAAE,aAAamD,GAC1BK,IAAQ,EAAQnI,EAAAA,MAAMC,EAAAA,YAAYkI,CAAM,CAAC,EAC/C,MAAO,GAAIxD,EAAE,OAAS,UAAW,CAC3BsB,GAAQ,OAAO,SAASA,EAAK6B,EAAM,IAAG,EAAM,KAAO7B,EAAK6B,IACxD5B,GAAO,OAAO,SAASA,EAAI4B,EAAM,IAAG,EAAM,IAAM5B,EAAI4B,IACpDM,GAAM,OAAO,SAASA,EAAGN,EAAM,IAAG,EAAM,GAAKM,EAAGN,IAChDO,GAAM,OAAO,SAASA,EAAGP,EAAM,IAAG,EAAM,GAAKO,EAAGP,IACpD,IAAMQ,EAAMC,IAAWT,GACnBQ,IAAK,EAAM,SAAWA,EAAI,OAChC,MACM1D,GAAM,OAAO,SAASA,EAAGkD,EAAM,IAAG,EAAM,GAAKlD,EAAGkD,IAChDnD,EAAE,OAAS,WAAauD,GAAS,OAAO,SAASA,EAAMJ,EAAM,IAC/D,EAAM,MAAQI,EAAMJ,IAExB,MAAO,CACL,YAAanD,EAAE,MACf,SAAUA,EAAE,GACZ,WAAYA,EAAE,KACd,QACA,EAAGA,EAAE,IAAI,EAAEmD,GACX,EAAGnD,EAAE,IAAI,EAAEmD,GACX,QACA,GAAIvF,IAAU,IAAA,GAAwB,CAAC,EAAb,CAAE,OAAM,EAClC,GAAGwF,CACL,CACF,EAEMS,GACJ,EACA,IAC2B,CAC3B,GAAI,CAACC,EAAW,OAAQ,OAAO,KAC/BA,EAAW,MAAM,EAAG,IAAM7G,EAAE,OAAO,MAAQyB,EAAE,OAAO,KAAK,EACzD,IAAMqF,EAAQD,EAAW,IAAK,GAAM,CAClC,IAAME,EAAOf,EAAYgB,EAAE,OAAQA,EAAE,KAAK,EAE1C,OADIA,EAAE,UAAY,IAAA,KAAW,EAAK,QAAUA,EAAE,SACvCD,CACT,CAAC,EACKlH,EAAIiH,EAAM,EAAE,CAAC,EACnB,MAAO,CAAE,QAAO,IAAG,OAAQxF,GAAQ,YAAYzB,CAAC,GAAK,OAAOA,CAAC,CAAE,CACjE,EAOaoH,GACX,EACA,EACA,EACA,EACA,EACA,EAAO,IACoB,CAC3B,GAAM,CAAE,QAASxD,EACXyD,EAAS,EAAIxC,EACnB,GACER,EAAK9C,EAAK,EAAI8F,GACdhD,EAAK9C,EAAK,EAAIA,EAAK,MAAQ8F,GAC3B/C,EAAK/C,EAAK,EAAI8F,GACd/C,EAAK/C,EAAK,EAAIA,EAAK,OAAS8F,EAE5B,OAAO,KAET,IAAM7B,EAAKnH,EAAAA,OAAOuF,EAAIS,EAAIC,CAAE,EACtBgD,EAAuB,CAAC,EACxBC,EAAsB,CAAC,EAC7B,IAAK,IAAMrE,KAAK3C,EAAM,OACpB,GAAI,GAAE,QAAW2C,EAAE,SAAWA,EAAE,KAAK,QAAU,EAC/C,IAAIA,EAAE,OAAS,UAAW,CACxB,IAAM7B,EAAIiE,EAAepC,EAAGmB,EAAIC,EAAIV,EAAIiB,CAAI,EACxCxD,GAAK,GAAGiG,EAAQ,KAAKlD,EAAYlB,EAAG7B,EAAGgD,EAAIC,EAAIV,CAAE,CAAC,CACxD,MAAO,GAAIV,EAAE,OAAS,UAAW,CAC/B,IAAM7B,EAAIsE,EAAOzC,EAAGsC,EAAG,EAAGA,EAAG,CAAC,EAC9B,GAAInE,GAAK,EAAG,CACV,IAAM8F,EAAI/C,EAAYlB,EAAG7B,EAAGgD,EAAIC,EAAIV,CAAE,EACtC,EAAE,OAAS,GACX,EAAE,KAAO,EACT0D,EAAQ,KAAKH,CAAC,CAChB,CACF,KAAO,CACL,IAAM9F,EAAI2E,EAAS9C,EAAGsC,EAAG,CAAC,EAC1B,GAAInE,EAAI,EAAG,SACX,IAAM8F,EAAI/C,EAAYlB,EAAG7B,EAAGgD,EAAIC,EAAIV,CAAE,EAClCV,EAAE,OAAS,YACb,EAAE,QAAUwB,EAAUxB,EAAG7B,EAAGgD,EAAIC,EAAIV,EAAIiB,CAAI,EACxCsC,EAAE,UAAY,IAAA,KAChB,EAAE,OAAS,GACX,EAAE,KAAO,IAGbI,EAAO,KAAKJ,CAAC,CACf,EAEF,GAAI5G,EAAM,cAAgB,OAAQ,CAGhC,IAAMiH,EAAM,CAAC,GAAGF,EAAS,GAAGC,CAAM,CAAC,CAAC,OACjC,GACCJ,EAAE,QACFA,EAAE,OAAO,OAAS,YAChBA,EAAE,OAAO,OAAS,QAAUA,EAAE,OAAO,OAAS,SAC9CA,EAAE,MAAQ,EAAItC,CACpB,EAOA,OANK2C,EAAI,OAMFT,EAAQ,CALFS,EAAI,QAAQ,EAAG,IAC1B5F,EAAE,KAAOzB,EAAE,MAASyB,EAAE,OAASzB,EAAE,MAAQyB,EAAE,OAAO,MAAQzB,EAAE,OAAO,MAC/DyB,EACAzB,CAEU,CAAI,EAAGsB,CAAM,EANL,IAO1B,CACA,GAAIlB,EAAM,cAAgB,UAAW,CACnC,IAAMiH,EAAM,CAAC,GAAGF,EAAS,GAAGC,CAAM,CAAC,CAAC,OACjC,GAAMJ,EAAE,QAAUA,EAAE,OAAO,OAAS,WAAaA,EAAE,MAAQ,GAAKtC,CACnE,EAGA,OAFK2C,EAAI,OAEFT,EAAQ,CADFS,EAAI,QAAQ,EAAG,IAAO5F,EAAE,MAAQzB,EAAE,KAAOyB,EAAIzB,CAC1C,CAAI,EAAGsB,CAAM,EAFL,IAG1B,CACA,GAAI,CAAC8F,EAAO,OAEV,OADKD,EAAQ,OACNP,EACL,CAACO,EAAQ,QAAQ,EAAG,IAAO1F,EAAE,MAAQzB,EAAE,KAAOyB,EAAIzB,CAAE,CAAC,EACrDsB,CACF,EAJ4B,KAM9B,IAAMgG,EAAS,KAAK,IAAI,GAAGF,EAAO,IAAK,GAAMJ,EAAE,EAAE,CAAC,EAC5CO,EAASnH,EAAM,EAAE,OAAS,WAAa,GAAM,KAAK,IAAIqD,EAAG,MAAM,EAAI,EACnE+D,EAAUJ,EAAO,OAAQ,GAAMJ,EAAE,IAAMM,EAAS,KAAK,IAAI,EAAGC,CAAM,CAAC,EACnEE,EAAQD,EAAQ,QAAQ,EAAG,IAAO/F,EAAE,GAAKzB,EAAE,GAAKyB,EAAIzB,CAAE,EAEtD0H,EAAQd,EAAQ,CADLa,EAAO,GAAGD,EAAQ,OAAQ,GAAMR,IAAMS,CAAK,EAAG,GAAGN,CAC5C,EAAS7F,CAAM,EAKrC,OAJIoG,IACF,EAAM,EAAI1B,EAAYyB,EAAM,OAAQA,EAAM,KAAK,CAAC,CAAC,EACjD,EAAM,OAASnG,GAAQ,YAAYoG,EAAM,CAAC,GAAK,OAAOA,EAAM,CAAC,GAExDA,CACT,EAGaC,GACX,EACA,IAEA3H,IAAMyB,GACL,CAAC,CAACzB,GACD,CAAC,CAACyB,GACFzB,EAAE,MAAM,SAAWyB,EAAE,MAAM,QAC3BzB,EAAE,MAAM,OACL,EAAI,IACH4H,EAAG,QAAUnG,EAAE,MAAMP,EAAE,CAAC,OACxB0G,EAAG,cAAgBnG,EAAE,MAAMP,EAAE,CAAC,WAClC,EAKE2G,EAA2C,CAC/C,MAAO,UACP,sBAAuB,EACvB,sBAAuB,CACzB,EAmBMC,GAAc,EAAgB,IAClC/E,EAAE,IAAI,UAAUmD,EAAM,EAAE,IAAK,IAAO,CAClC,MAAO,KACP,KAAM7C,EAAE,KACR,MAAOA,EAAE,KACX,EAAE,GAAK,CAAC,EAMG0E,GACX,EACA,EACA,EACA,EAA4B,OACT,CACnB,IAAMC,EAAUxH,GAAQ,aAAe,OACjCyH,EAAY,GAChBlF,EAAE,SACDA,EAAE,QAAU,QACRlC,GAAS,aAAeT,EAAM,IAAI,QAAUA,EAAM,YACnD4H,GACA/F,EAAQ7B,EAAM,OACdqH,EAAQC,EAAM,MAAM,GACpBQ,EAAcT,EAAQrH,EAAM,OAAOqH,EAAM,aAAe,KAC9D,GACEC,EAAM,MAAM,SAAW,GACvBD,GACAS,GAAa,OAAS,OACtBT,EAAM,KAAO,IAAA,IACbrH,EAAM,EAAE,OAAS,OACjB,CAEA,IAAMmC,EAAS0F,EAASC,CAAW,EAEnC,MAAO,CACL,MAFYT,EAAM,OAASC,EAAM,OAGjC,WAAYD,EAAM,MAClB,SACEA,EAAM,QAAU,IAAA,GAEZS,EAAY,KADZ,GAAGR,EAAM,OAAO,KAAKQ,EAAY,OAEvC,KAAM,CACJ,CAAE,MAAO,KAAM,KAAMjG,EAAM,MAAO,MAAOM,EAAOkF,EAAM,EAAE,CAAE,EAC1D,CAAE,MAAO,KAAM,KAAMxF,EAAM,IAAK,MAAOM,EAAOkF,EAAM,CAAC,CAAE,EACvD,CACE,MAAO,KACP,KAAMxF,EAAM,SACZ,MAAO3D,EAAAA,eAAemJ,EAAM,EAAIA,EAAM,GAAIrH,EAAM,MAAM,CACxD,EACA,GAAG0H,EAAWI,EAAaT,EAAM,KAAK,CACxC,CACF,CACF,CACA,GAAIC,EAAM,MAAM,SAAW,GAAKQ,GAAa,OAAS,UAAW,CAC/D,IAAMC,EACJ/H,EAAM,EAAE,OAAS,WACZA,EAAM,EAAE,WAAW,KAAK,MAAMqH,EAAM,CAAC,IAAMO,EAAQP,EAAM,CAAC,EAC3DO,EAAQP,EAAM,CAAC,EACrB,MAAO,CACL,MAAO,GAAGC,EAAM,OAAO,KAAKS,IAC5B,WAAY,KACZ,KAAM,CACJ,CACE,MAAOV,EAAM,MACb,KAAMA,EAAM,OAASS,EAAY,KACjC,MACET,EAAM,QAAU,IAAA,GACZ,KACCS,EAAY,QAAU9H,EAAM,YAAA,CAAaqH,EAAM,KAAK,CAC7D,EACA,GAAGK,EAAWI,EAAaT,EAAM,KAAK,CACxC,CACF,CACF,CAIA,GAHoBC,EAAM,MAAM,MAC7B,GAAOtH,EAAM,OAAOwH,EAAG,YAAY,CAAC,OAAS,SAE5C,GAAeF,EAAM,MAAM,SAAW,EAAG,CAC3C,IAAME,EAAKF,EAAM,MAAM,GACjB3E,EAAI3C,EAAM,OAAOwH,EAAG,aACpBQ,EACJR,EAAG,QAAU,IAAA,GAQT,CAAC,EAPD,CACE,CACE,MAAO,KACP,KAAM7E,EAAE,WAAad,EAAM,MAC3B,OAAQc,EAAE,QAAU3C,EAAM,YAAA,CAAawH,EAAG,KAAK,CACjD,CACF,EAEN,GAAIxH,EAAM,EAAE,OAAS,WAEnB,MAAO,CACL,MAAOwH,EAAG,OAASF,EAAM,OACzB,WAAY,KACZ,KAAM,CACJ,CAAE,MAAOE,EAAG,MAAO,KAAMA,EAAG,WAAY,MAAOK,EAASlF,CAAC,CAAC,CAAC6E,EAAG,CAAC,CAAE,EACjE,GAAGQ,EACH,GAAGN,EAAW/E,EAAG6E,EAAG,KAAK,CAC3B,CACF,EAEF,IAAMS,EACJtF,EAAE,QAAU,QACPlC,GAAS,aAAeT,EAAM,IAAI,QAAUA,EAAM,YACnD4H,EACAjG,EAAqB,CACzB,CAAE,MAAO,KAAM,KAAM3B,EAAM,EAAE,OAAS6B,EAAM,EAAG,MAAOyF,EAAM,MAAO,EACnE,CACE,MAAO,KACP,MACG3E,EAAE,QAAU,QAAU3C,EAAM,IAAI,MAAQA,EAAM,EAAE,QAAU6B,EAAM,EAEnE,OAAQ2F,EAAG,QAAU,IAAA,GAA0BK,EAASlF,CAAC,EAAxBsF,EAAwB,CAAGT,EAAG,CAAC,CAClE,EACA,GAAGQ,EACH,GAAGN,EAAW/E,EAAG6E,EAAG,KAAK,CAC3B,EACA,MAAO,CACL,MAAOA,EAAG,OAASA,EAAG,WACtB,WAAYA,EAAG,MAEf,GAAIA,EAAG,QAAU,IAAA,IAAaxH,EAAM,OAAO,OAAS,EAChD,CAAE,SAAUwH,EAAG,UAAW,EAC1B,CAAC,EACL,MACF,CACF,CACA,IAAM7F,EAAqB,CAAC,EAEtBuG,EAAkB,CAAC,EAEnBC,EACJb,EAAM,MAAM,SAAW,GACvBQ,GAAa,OAAS,OACtB9H,EAAM,EAAE,OAAS,YACjBqH,GAAO,QAAU,IAAA,GACbA,EAAM,MACN,KACN,IAAK,IAAMG,KAAMF,EAAM,MAAO,CAC5B,IAAM3E,EAAI3C,EAAM,OAAOwH,EAAG,aACpBrF,EAAS0F,EAASlF,CAAC,EAEzB,GADAuF,EAAM,KAAKvG,EAAK,MAAM,EAClBgB,EAAE,OAAS,cAAe,CAC5B,IAAMyF,EACJZ,EAAG,OAAS,IAAA,IAAaA,EAAG,OAAS,GAC/BA,EAAG,EAAIA,EAAG,MAAQ,KAAK,IAAIA,EAAG,IAAI,EAAK,IACzC,IACN7F,EAAK,KAAK,CACR,MAAO6F,EAAG,MACV,KAAM7E,EAAE,KACR,MAAO,OAAO,SAASyF,CAAM,EACzB,GAAGA,GAAU,EAAI,IAAM,KAAKjK,EAAAA,aAAa6B,EAAM,OAAQyH,CAAc,CAAC,CAAC,OAAOW,EAAS,GAAG,IAC1F,EACN,CAAC,EACD,IAAMC,EAAuC,CAC3C,CAACxG,EAAM,KAAM2F,EAAG,IAAI,EACpB,CAAC3F,EAAM,KAAM2F,EAAG,IAAI,EACpB,CAAC3F,EAAM,IAAK2F,EAAG,GAAG,EAClB,CAAC3F,EAAM,MAAO2F,EAAG,CAAC,CACpB,EACA,IAAK,GAAM,CAAC1F,EAAMtC,KAAM6I,EAClB7I,IAAM,IAAA,IAAa,OAAO,SAASA,CAAC,GACtCmC,EAAK,KAAK,CAAE,MAAO,KAAM,OAAM,MAAOQ,EAAO3C,CAAC,CAAE,CAAC,EAErD,QACF,CACA,GAAImD,EAAE,OAAS,UAAW,CACxB,GAAI6E,EAAG,UAAY,IAAA,GAAW,CAE5B7F,EAAK,KACH,CACE,MAAO6F,EAAG,MACV,KAAMA,EAAG,MAAQ,GAAGA,EAAG,WAAW,KAAKA,EAAG,QAAUA,EAAG,WACvD,MAAO,EACT,EACA,CAAE,MAAO,KAAM,KAAM3F,EAAM,QAAS,MAAOM,EAAOqF,EAAG,OAAO,CAAE,CAChE,EACA,QACF,CACA7F,EAAK,KAAK,CACR,MAAO6F,EAAG,MACV,KAAMA,EAAG,MAAQ,GAAGA,EAAG,WAAW,KAAKA,EAAG,QAAUA,EAAG,WACvD,MAAO,EACT,CAAC,EACD,IAAMc,EAAwC,CAC5C,CAACzG,EAAM,IAAK2F,EAAG,IAAI,EACnB,CAAC3F,EAAM,GAAI2F,EAAG,EAAE,EAChB,CAAC3F,EAAM,OAAQ2F,EAAG,CAAC,EACnB,CAAC3F,EAAM,GAAI2F,EAAG,EAAE,EAChB,CAAC3F,EAAM,IAAK2F,EAAG,GAAG,CACpB,EACA,IAAK,GAAM,CAAC1F,EAAMtC,KAAM8I,EAClB9I,IAAM,IAAA,IAAa,OAAO,SAASA,CAAC,GACtCmC,EAAK,KAAK,CAAE,MAAO,KAAM,OAAM,MAAOQ,EAAO3C,CAAC,CAAE,CAAC,EAEjDgI,EAAG,UACL7F,EAAK,KAAK,CACR,MAAO,KACP,KAAME,EAAM,SACZ,MAAO,OAAO2F,EAAG,QAAQ,CAC3B,CAAC,EACH,QACF,CACA,IAAItB,EAAQ/D,EAAOqF,EAAG,CAAC,EACvB,GAAIA,EAAG,KAAO,IAAA,GAAW,CAEvB,IAAM3E,EAAQ2E,EAAG,EAAIA,EAAG,GACxB,EACE7E,EAAE,OAAS,OAAS3C,EAAM,EAAE,OAAS,OACjC,GAAG6C,EAAQ,EAAI,IAAM,KAAKV,EAAOU,CAAK,IACtC,GAAGV,EAAOqF,EAAG,EAAE,EAAE,KAAKrF,EAAOqF,EAAG,CAAC,GACzC,CACA7F,EAAK,KAAK,CACR,MAAO6F,EAAG,MACV,KACEA,EAAG,OAASW,IAAa,KACrB,GAAGX,EAAG,WAAW,KAAKA,EAAG,QACzBA,EAAG,WACT,OACF,CAAC,EACD7F,EAAK,KAAK,GAAG+F,EAAW/E,EAAG6E,EAAG,KAAK,CAAC,CACtC,CACA,GAAIxH,EAAM,QAAS,CAEjB,IAAMuI,EAAS,IAAI,IACnB,IAAK,IAAMf,KAAMF,EAAM,MAAO,CAC5B,IAAMkB,EAAQC,EAAUzI,EAAOwH,EAAG,WAAW,EACzCgB,IAAU,MAAQ,OAAO,SAAShB,EAAG,CAAC,GACxCe,EAAO,IAAIC,GAAQD,EAAO,IAAIC,CAAK,GAAK,GAAK,KAAK,IAAIhB,EAAG,CAAC,CAAC,CAC/D,CACAF,EAAM,MAAM,SAAS,EAAI,IAAM,CAC7B,IAAMkB,EAAQC,EAAUzI,EAAOwH,EAAG,WAAW,EACvCkB,EAAQF,IAAU,KAA2B,IAAA,GAApBD,EAAO,IAAIC,CAAK,EACzCG,EAAMhH,EAAKuG,EAAMzD,IACnBiE,GAASC,GAAO,OAAO,SAASnB,EAAG,CAAC,IAEtC,EAAI,MAAQ,IADGxH,EAAM,OAAOwH,EAAG,YAAY,CAAC,QAAUxH,EAAM,YAAA,CACtCwH,EAAG,CAAC,EAAE,KAAKpJ,EAAAA,cAAe,KAAK,IAAIoJ,EAAG,CAAC,EAAIkB,EAAS,IAAK1I,EAAM,OAAQ,EAAI,IAErG,CAAC,CACH,CACA,MAAO,CAAE,MAAOmI,GAAYb,EAAM,OAAQ,WAAY,KAAM,MAAK,CACnE,EAGMmB,GAAa,EAAmB,IACpCzI,EAAM,OAAO4I,EAAY,CAAC,OAAS,KAAO5I,EAAM,OAAO4I,GAwC5CC,GACX,EACA,EACA,IACgB,CAChB,IAAMC,EAAqB,CAAC,EACtB,CAAE,QAASzF,EACb0F,EAAS,IACTC,EAAS,KACb,IAAK,IAAMxB,KAAMF,EAAM,MAAO,CAC5B,IAAM3E,EAAI3C,EAAM,OAAOwH,EAAG,aAEpByB,EAAMtG,EAAE,KAAK,EAAE6E,EAAG,QAAUA,EAAG,EACrC,GAAI7E,EAAE,OAAS,WAAa6E,EAAG,UAAY,IAAA,GAAW,CACpD,IAAM9E,EAAIhF,EAAAA,SAAS2F,EAAI4F,EAAM9F,EAAWR,CAAC,EAAGuG,EAAevG,EAAG6E,CAAE,CAAC,EACjEsB,EAAM,KAAK,CACT,KAAM,MACN,EAAGpG,EAAE,EACL,EAAGA,EAAE,EACL,KAAMC,EAAE,YAAc,EACtB,MAAO6E,EAAG,MACV,KAAMxJ,EAAAA,MAAM2E,EAAE,cAAc6E,EAAG,QAAU7E,EAAE,MAAO,EAAG,CACvD,CAAC,EACD,QACF,CACA,GAAIA,EAAE,OAAS,OAASA,EAAE,OAAS,eAAiBA,EAAE,OAAS,UAAW,CACxE,IAAMiE,EAAIvD,EAAG,MAAM4F,EAAM9F,EAAWR,CAAC,CAAC,EAChCgB,EAAO,KAAK,IAAIhB,EAAE,aAAe,KAAK,IAAIU,EAAG,MAAM,EAAG,CAAC,EAC7D,EAAS,KAAK,IAAI0F,EAAQnC,EAAIjD,CAAI,EAClC,EAAS,KAAK,IAAIqF,EAAQpC,EAAIjD,CAAI,EAClC,QACF,CACA,GAAIhB,EAAE,OAAS,UAAW,CACxB,IAAMwG,EAAK9F,EAAG,MAAM4F,CAAG,EACjBG,EAAK/F,EAAG,MAAMmE,EAAG,CAAC,EAClB6B,EAAK,KAAK,IAAI1G,EAAE,SAAS,EAAIU,EAAG,MAAM,EACtCiG,EAAK,KAAK,IAAI3G,EAAE,SAAS,EAAIU,EAAG,MAAM,EACtCkG,EAAOlL,EAAAA,WAAWgF,EAAI8F,EAAKE,EAAIF,EAAKE,EAAID,EAAKE,EAAIF,EAAKE,CAAE,EACxDE,EAAQlL,EAAAA,cAAciL,EAAK,MAAOA,EAAK,OAAQ5G,EAAE,MAAM,EAEvDN,EAAM,KAAK,IAAIrB,EAAK,EAAGuI,EAAK,CAAC,EAC7BE,EAAS,KAAK,IAAIzI,EAAK,EAAIA,EAAK,OAAQuI,EAAK,EAAIA,EAAK,MAAM,EAC5DG,EAAO,KAAK,IAAI1I,EAAK,EAAGuI,EAAK,CAAC,EAC9BI,EAAQ,KAAK,IAAI3I,EAAK,EAAIA,EAAK,MAAOuI,EAAK,EAAIA,EAAK,KAAK,EAC3DE,EAASpH,GACXyG,EAAM,KAAK,CACT,KAAM,QACN,EAAG9H,EAAK,EACR,EAAGqB,EACH,MAAOrB,EAAK,MACZ,OAAQyI,EAASpH,CACnB,CAAC,EACCsH,EAAQD,GACVZ,EAAM,KAAK,CACT,KAAM,QACN,EAAGY,EACH,EAAG1I,EAAK,EACR,MAAO2I,EAAQD,EACf,OAAQ1I,EAAK,MACf,CAAC,EACH,IAAMmF,EAASxD,EAAE,aAAa6E,EAAG,OAC3BoC,EAAOzD,EAASlI,EAAAA,YAAYkI,CAAM,EAAIxD,EAAE,MAC9CmG,EAAM,KAAK,CACT,KAAM,OACN,EAAGS,EAAK,EAAIC,EAAM,MAClB,EAAGD,EAAK,EAAIC,EAAM,MAClB,MAAO,KAAK,IAAI,EAAGD,EAAK,MAAQC,EAAM,MAAQ,CAAC,EAC/C,OAAQ,KAAK,IAAI,EAAGD,EAAK,OAASC,EAAM,MAAQ,CAAC,EACjD,MAAOhC,EAAG,MACV,KAAMqC,EAAaD,CAAI,EACvB,OAAQJ,EAAM,MAChB,CAAC,EACD,QACF,CACA,GAAM,CAAE,KAAI,MAAOpG,EAAQT,EAAG6E,EAAG,MAAOnE,CAAE,EAC1C,GACES,EAAK9C,EAAK,EAAI,GACd8C,EAAK9C,EAAK,EAAIA,EAAK,MAAQ,GAC3B+C,EAAK/C,EAAK,EAAI,GACd+C,EAAK/C,EAAK,EAAIA,EAAK,OAAS,EAE5B,SAEF,IAAMkC,EACJP,EAAE,OAAS,UACP+B,EAAQ/B,EAAG6E,EAAG,KAAK,EAAI,EACvB,KAAK,IAAI,EAAG7E,EAAE,UAAY,EAAI,CAAC,EAC/BmH,EAAOnH,EAAE,cAAc6E,EAAG,QAAU7E,EAAE,MAC5CmG,EAAM,KAAK,CACT,KAAM,MACN,EAAGhF,EACH,EAAGC,EACH,OACA,MAAOyD,EAAG,MACV,KAAMxJ,EAAAA,MAAM8L,EAAM,EAAG,CACvB,CAAC,CACH,CACA,GAAId,EAASD,EAAQ,CAEnB,IAAMgB,EAAM,KAAK,IAAI,GAAIf,EAASD,GAAU,GAAI,EAC1CiB,EAAK3G,EAAG,WAAarC,EAAK,EAAIA,EAAK,EACnCiJ,EAAKD,GAAM3G,EAAG,WAAarC,EAAK,OAASA,EAAK,OAC9CpB,EAAI,KAAK,IAAIoK,EAAIjB,EAASgB,CAAG,EAC7B1I,EAAI,KAAK,IAAI4I,EAAIjB,EAASe,CAAG,EAC/B1I,EAAIzB,GACNkJ,EAAM,QAAQ,CACZ,KAAM,OACN,GAAIzF,EAAG,WACH,CAAE,EAAGrC,EAAK,EAAG,EAAGpB,EAAG,MAAOoB,EAAK,MAAO,OAAQK,EAAIzB,CAAE,EACpD,CAAE,EAAGA,EAAG,EAAGoB,EAAK,EAAG,MAAOK,EAAIzB,EAAG,OAAQoB,EAAK,MAAO,CAC3D,CAAC,CAEL,CACA,OAAO8H,CACT,EAGae,EAAgB,GAC3BtL,EAAAA,UAAUqL,CAAI,EAAI,IACd,yBACA,2BAGAV,GAAkB,EAAgB,IAA+B,CACrE,IAAM1H,EAAMmB,EAAE,IAAI,WAAW6E,EAAG,OAC1B/C,EAAIjD,EAAMA,EAAI,QAAQgG,EAAG,SAAW,GAAG,EAAI,GACjD,OACG/C,GAAK,EAAI9B,EAAE,KAAK,WAAW6E,EAAG,MAAM,GAAG/C,GAAK,IAAA,KAAc+C,EAAG,SAAW,CAE7E,EAiBa0C,GACX,EACA,IACuB,CACvB,IAAM5D,EAA0B,CAAC,EACjC,IAAK,IAAM3D,KAAK3C,EAAM,OAAQ,CAC5B,IAAM4G,EAAIjE,EAAE,UACZ,GAAI,CAACiE,GAAKjE,EAAE,QAAUA,EAAE,OAAS,OAAS,CAACA,EAAE,OAAQ,SACrD,GAAM,CAAE,IAAG,SAAUA,EAAE,KACjBN,EAAMM,EAAE,OACRgB,EAAOhB,EAAE,aACT,CAACwH,EAAIC,GACT/G,EAAG,KAAK,EAAE,IAAMA,EAAG,KAAK,EAAE,GAAKA,EAAG,KAAK,EAAI,CAACA,EAAG,KAAK,EAAE,GAAIA,EAAG,KAAK,EAAE,EAAE,EAClExD,EAAQ7B,EAAAA,MAAM4I,EAAE,MAAO,GAAI,EAC7ByD,EAAO,GACX,IAAK,IAAIvJ,EAAI,EAAGA,EAAIS,GAAS+E,EAAI,OAAA,KAA+B,IAC9D,GAAK,OAAO,SAASjE,EAAIvB,EAAE,GAAM,OAAO,SAASrB,EAAEqB,EAAE,EACrD,IAAIuJ,GAAQ,GAAK5K,EAAEqB,GAAK6C,GAAQwG,GAAM1K,EAAE4K,GAAQ1G,GAAQyG,EAAI,CAC1D,IAAMxK,EAAIlC,EAAAA,SAAS2F,EAAI5D,EAAE4K,GAAQ1H,EAAE,UAAYgB,EAAMtB,EAAIgI,EAAK,EACxDhJ,EAAI3D,EAAAA,SAAS2F,EAAI5D,EAAEqB,GAAK6B,EAAE,UAAYgB,EAAMtB,EAAIgI,EAAK,EAC3D/D,EAAI,KAAK,CACP,GAAI1G,EAAE,EACN,GAAIA,EAAE,EACN,GAAIyB,EAAE,EACN,GAAIA,EAAE,EACN,QACA,MAAOuF,EAAE,MACT,KAAMA,EAAE,IACV,CAAC,CACH,CACA,EAAO9F,CADP,CAGJ,CACA,OAAOwF,CACT,EAUagE,GACX,EACA,IACyB,CACzB,IAAMlL,EAAUC,EAAM,SAAWJ,EAC3BsL,EAAQvM,EAAAA,MAAMqB,EAAM,UAAW,GAAI,EACzC,OAAQmL,GAAgB,CAAC,EAAA,CAAG,IAAK,IAAO,CACtC,KAAMvH,EAAE,KACR,GAAIA,EAAE,GACN,MAAOA,EAAE,MAAQjF,EAAAA,MAAMoB,EAAQ6D,EAAE,MAAO5D,EAAM,SAAS,CAAC,EAAIkL,CAC9D,EAAE,CACJ,EAoBaE,EAAa,CAAE,OAAQ,EAAG,KAAM,GAAI,EAc3CC,GAAY,EAAmB,IAAqC,CACxE,IAAM/I,EAAO,IAAI,IACjB,IAAK,IAAMgB,KAAK3C,EAAM,OAAQ,CAE5B,GADI2C,EAAE,QAAU,CAACA,EAAE,SACfA,EAAE,OAAS,OAASA,EAAE,OAAS,UAAW,SAC9C,GAAM,CAAE,IAAG,IAAG,SAAUA,EAAE,KACpBgI,EAAMhI,EAAE,OAAS,OAASA,EAAE,SAAWA,EAAE,OACzCgB,EAAOgH,EAAMhI,EAAE,aAAe,KAAK,IAAIU,EAAG,MAAM,EAAIqB,EAAQ/B,EAAG,CAAC,EAAI,EAC1E,IAAK,IAAI7B,EAAI,EAAGA,EAAIS,EAAO,IAAK,CAC9B,IAAMkD,EAAI,KAAK,MAAMhF,EAAEqB,EAAE,EACzB,GAAIa,EAAK,IAAI8C,CAAC,EAAG,SACjB,IAAMmG,EAAQD,EAAMhI,EAAE,QAAS7B,GAAKxB,EAAEwB,GAChC+J,EAAMF,EAAMhI,EAAE,OAAQ7B,GAAKxB,EAAEwB,GAC9B,OAAO,SAAS8J,CAAK,GAAM,OAAO,SAASC,CAAG,GACnDlJ,EAAK,IAAI8C,EAAG,CACV,GAAIhF,EAAEqB,GAAKqC,EAAWR,CAAC,EACvB,MAAO,KAAK,IAAIiI,EAAOC,CAAG,EAC1B,IAAK,KAAK,IAAID,EAAOC,CAAG,EACxB,OACA,IAAK,CAACF,CACR,CAAC,CACH,CACF,CACA,OAAOhJ,CACT,EAOamJ,GACX,EACA,EACA,IACsB,CACtB,GAAI,CAACN,EAAa,QAAUxK,EAAM,EAAE,OAAS,WAAY,MAAO,CAAC,EACjE,IAAM2B,EAAO+I,EAAS1K,EAAOqD,CAAE,EACzByC,EAAQ,IAAI,IAClB9F,EAAM,EAAE,WAAW,SAAS,EAAG,IAAM,CAC9B8F,EAAM,IAAIc,CAAC,GAAGd,EAAM,IAAIc,EAAG9F,CAAC,CACnC,CAAC,EAED,IAAMiK,EAAa1H,EAAG,WAChB2H,GAAM,EAAW,IACrBD,EAAa,CAAE,EAAGvL,EAAG,EAAGoH,CAAE,EAAI,CAAE,EAAGA,EAAG,EAAGpH,CAAE,EACvCyL,EAAW,GAAkB,CACjC,IAAMvI,EAAIhF,EAAAA,SAAS2F,EAAI,EAAG6C,CAAK,EAC/B,OAAO6E,EAAarI,EAAE,EAAIA,EAAE,CAC9B,EACMwI,EAAc,GAAe,CACjC,IAAMxI,EAAIhF,EAAAA,SAAS2F,EAAI4B,EAAI,CAAC,EAC5B,OAAO8F,EAAarI,EAAE,EAAIA,EAAE,CAC9B,EACMyI,EAAM,KAAK,KAAKF,EAAQ5H,EAAG,KAAK,EAAE,EAAE,EAAI4H,EAAQ5H,EAAG,KAAK,EAAE,EAAE,CAAC,GAAK,EAClE+H,EAAQ,KAAK,IAAIF,EAAW,CAAC,EAAIA,EAAW,CAAC,CAAC,EAC9C,CAAE,SAAQ,QAAST,EAEnBnE,EAAyB,CAAC,EAChC,IAAK,IAAMrD,KAAKuH,EAAc,CAC5B,IAAM5K,EAAI+B,EAAK,IAAImE,EAAM,IAAI7C,EAAE,IAAI,GAAK,GAAG,EACrC5B,EAAIM,EAAK,IAAImE,EAAM,IAAI7C,EAAE,EAAE,GAAK,GAAG,EACzC,GAAI,CAACrD,GAAK,CAACyB,GAAKzB,IAAMyB,EAAG,SACzB,IAAMgK,EAAKJ,EAAQrL,EAAE,GAAG,GAAKA,EAAE,IAAMuL,EAAMvL,EAAE,KAAO,GAC9C0L,EAAKJ,EAAWtL,EAAE,EAAE,EACpB2L,EAAKN,EAAQ5J,EAAE,KAAK,EAAI8J,GAAO9J,EAAE,IAAMA,EAAE,KAAO,EAAI,GACpDmK,EAAKN,EAAW7J,EAAE,EAAE,EACpBoK,EAAOF,EAAKJ,EAAMO,EAClBC,EAAS,CAACX,EAAGK,EAAIC,CAAE,CAAC,EACpBM,EAAOP,EAAKF,EAAM,EACxB,GAAIA,GAAOM,EAAOG,IAAS,EAEzBD,EAAO,KAAKX,EAAGY,EAAMN,CAAE,EAAGN,EAAGY,EAAMJ,CAAE,EAAGR,EAAGS,EAAMD,CAAE,CAAC,MAC/C,CAGL,IAAMK,EAAUP,GADH,KAAK,KAAKE,EAAKF,CAAE,GAAK,GACP,KAAK,IAAI1L,EAAE,KAAO,EAAGwL,EAAQ,CAAC,EACpDU,EAAOL,EAAON,EAAM,EAC1BQ,EAAO,KACLX,EAAGY,EAAMN,CAAE,EACXN,EAAGY,EAAMC,CAAO,EAChBb,EAAGc,EAAMD,CAAO,EAChBb,EAAGc,EAAMN,CAAE,EACXR,EAAGS,EAAMD,CAAE,CACb,CACF,CACAlF,EAAI,KAAK,CACP,SACA,KAAM,CAAC0E,EAAGO,EAAIC,CAAE,EAAGR,EAAGS,EAAMD,EAAK7H,CAAI,EAAGqH,EAAGS,EAAMD,EAAK7H,CAAI,CAAC,EAC3D,MAAOV,EAAE,MACT,MAAO,IACT,CAAC,CACH,CACA,OAAOqD,CACT,EAWMyF,EAAc,GAMPC,EAAe,GAA0C,CACpE,GAAI,CAAChM,EAAM,OAAO,QAAUA,EAAM,OAAO,KAAM,GAAM2C,EAAE,OAAS,SAAS,EACvE,OAAO,KACT,IAAMA,EAAI3C,EAAM,OAAO,KAAM,GAAO,CAACwH,EAAG,QAAUA,EAAG,QAAQ,EACvDyE,EAAMtJ,GAAG,SACf,GAAI,CAACA,GAAK,CAACsJ,EAAK,OAAO,KACvB,IAAMC,EAAkB,CAAC,EACzB,IAAK,IAAIzH,EAAI,EAAGA,EAAIsH,EAAa,IAAK,CACpC,IAAM5F,EAAS8F,EAAI,KAAK,MAAOxH,EAAK,IAAqBwH,EAAI,OAAS,EAAE,GACxEC,EAAM,KAAKlO,EAAAA,MAAMC,EAAAA,YAAYkI,GAAU,CAAC,CAAC,CAAC,CAC5C,CACA,IAAMhE,EAASQ,EAAE,QAAU3C,EAAM,YAC3B,CAACgK,EAAIC,GAAMtH,EAAE,WACbX,EAAS,CACb,CAAE,GAAI,EAAG,KAAMG,EAAO6H,CAAE,CAAE,EAC1B,CAAE,GAAI,EAAG,KAAM7H,EAAO8H,CAAE,CAAE,CAC5B,EACMkC,EAAMxJ,EAAE,cAGd,OAFIwJ,IAAQ,MAAQA,EAAMnC,GAAMmC,EAAMlC,GACpCjI,EAAO,OAAO,EAAG,EAAG,CAAE,GAAI,GAAK,KAAMG,EAAOgK,CAAG,CAAE,CAAC,EAC7C,CAAE,YAAaxJ,EAAE,MAAO,QAAO,QAAO,CAC/C,EAGayJ,GACX,EACA,EACA,IAEAC,IAAW,IAAA,GAAYC,EAAQ,GAAKN,EAAYhM,CAAK,IAAM,KAAO,CAAC,CAACqM,EAGzDE,EACX,GAEAC,IAAS,UAAY,MAAQA,IAAS,OAAS,OAAS,SAG7CC,GACX,EACA,EACA,IAEAC,IACC1M,EAAM,cAAgB,QACrBsH,EAAM,MAAM,KAAM,GAAO,CACvB,IAAMkF,EAAOxM,EAAM,OAAOwH,EAAG,YAAY,CAAC,KAC1C,OAAOgF,IAAS,QAAUA,IAAS,MACrC,CAAC,GAED,CAAClF,EAAM,MAAM,KAAM,GAAO,CACxB,IAAMkF,EAAOxM,EAAM,OAAOwH,EAAG,YAAY,CAAC,KAC1C,OAAOgF,IAAS,OAASA,IAAS,eAAiBA,IAAS,SAC9D,CAAC,GAGQG,GACX,EACA,EACA,EACA,IACkB,CAClB,GAAI,CAACF,EAAezM,EAAOsH,EAAOoF,CAAS,EAAG,OAAO,KACrD,IAAMrF,EAAQC,EAAM,MAAM,GACpBV,EAAIvD,EAAG,MACXrD,EAAM,OAAOqH,EAAM,YAAY,EAAE,KAAK,EAAEA,EAAM,QAC5C7I,EAAAA,QAAQwB,EAAOqH,EAAM,CAAC,CAC1B,EACM2C,EAAK3G,EAAG,WAAaA,EAAG,KAAK,EAAIA,EAAG,KAAK,EACzC4G,EAAKD,GAAM3G,EAAG,WAAaA,EAAG,KAAK,OAASA,EAAG,KAAK,OAC1D,OAAOuD,GAAKoD,GAAMpD,GAAKqD,EAAKrD,EAAI,IAClC"}
|