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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host.js","names":["styleElement","assign","TOOLTIP_STYLE","createHost","doc","container","win","root","config","canvas","ctx","createTooltip","tip","tooltip","summary","summaryText","summaryAt","destroyed","frameId","timeoutId","pending","visible","raf","cb","run","host","now","schedule","readTheme","width","height","dpr","w","h","tw","th","left","prefer","x","top","y","text","resizeObserver","intersection","unwatchTheme","entry","entries","watchTheme","createEmitter","handlers","set","event","handler","payload","localPoint","rect","element","tooltipHtml","key","title","rows","r","head","label","value","row","l","v"],"sources":["../../../../../charts/src/engine/orderbook/host.ts"],"sourcesContent":["// DOM host of the order book widgets: a sized Canvas2D layer, a frame\n// scheduler coalescing any number of updates into one requestAnimationFrame,\n// paused while the widget is off screen, theme watching, resize observing,\n// a tooltip and a tiny event emitter.\n\nimport { styleElement } from \"../dom\";\nimport { readTheme, watchTheme, type ChartTheme } from \"../theme\";\n\nexport interface HostConfig {\n /** Class of the root element */\n className: string;\n /** Draws a frame; returns `true` to get another one (animations) */\n draw(now: number): boolean;\n /** The theme changed (colors must be resolved again) */\n onTheme?(): void;\n}\n\nexport interface Host {\n readonly doc: Document;\n readonly root: HTMLDivElement;\n readonly canvas: HTMLCanvasElement;\n readonly ctx: CanvasRenderingContext2D | null;\n readonly tooltip: HTMLDivElement;\n /** Size of the widget in CSS pixels, read at the start of every frame */\n width: number;\n height: number;\n dpr: number;\n theme: ChartTheme;\n /** Requests a frame (coalesced) */\n invalidate(): void;\n /** Sizes the canvas to the root; `false` when it has no size */\n measure(): boolean;\n /** Places the tooltip next to a point, inside the widget */\n placeTooltip(\n tip: HTMLElement,\n x: number,\n y: number,\n prefer?: \"left\" | \"right\",\n ): void;\n /** New tooltip element (one is created with the host) */\n createTooltip(): HTMLDivElement;\n /** Text read by screen readers (visually hidden, updated at most once a second) */\n describe(text: string): void;\n destroy(): void;\n}\n\n/** Tooltip look of the chart engine (dom.ts), copied for the widgets */\nconst TOOLTIP_STYLE: Partial<CSSStyleDeclaration> = {\n position: \"absolute\",\n left: \"0\",\n top: \"0\",\n zIndex: \"2\",\n display: \"none\",\n pointerEvents: \"none\",\n padding: \"6px 10px\",\n borderRadius: \"8px\",\n border:\n \"1px solid color-mix(in srgb, var(--border-color, #e5e7eb) 60%, transparent)\",\n background: \"var(--surface-elevated-color, var(--background-color, #fff))\",\n color: \"var(--text-color, #1f2937)\",\n boxShadow:\n \"0 12px 32px -8px rgba(15, 23, 42, 0.18), 0 4px 10px -4px rgba(15, 23, 42, 0.1)\",\n fontSize: \"12px\",\n lineHeight: \"18px\",\n whiteSpace: \"nowrap\",\n fontVariantNumeric: \"tabular-nums\",\n};\n\nexport const createHost = (\n container: HTMLElement,\n config: HostConfig,\n): Host => {\n const doc = container.ownerDocument;\n const win = doc.defaultView;\n const root = styleElement(doc.createElement(\"div\"), {\n position: \"relative\",\n width: \"100%\",\n height: \"100%\",\n minHeight: \"0\",\n overflow: \"hidden\",\n userSelect: \"none\",\n fontFamily: \"var(--font-family-sans, system-ui, sans-serif)\",\n color: \"var(--text-color, #1f2937)\",\n borderRadius: \"inherit\",\n }) as HTMLDivElement;\n root.className = `minerva-orderbook ${config.className}`;\n const canvas = styleElement(doc.createElement(\"canvas\"), {\n position: \"absolute\",\n left: \"0\",\n top: \"0\",\n pointerEvents: \"none\",\n }) as HTMLCanvasElement;\n canvas.setAttribute(\"aria-hidden\", \"true\");\n let ctx: CanvasRenderingContext2D | null;\n try {\n ctx = canvas.getContext(\"2d\");\n } catch {\n ctx = null;\n }\n root.appendChild(canvas);\n container.appendChild(root);\n\n const createTooltip = () => {\n const tip = styleElement(\n doc.createElement(\"div\"),\n TOOLTIP_STYLE,\n ) as HTMLDivElement;\n tip.className = \"minerva-orderbook-tooltip\";\n tip.setAttribute(\"role\", \"tooltip\");\n root.appendChild(tip);\n return tip;\n };\n const tooltip = createTooltip();\n\n const summary = styleElement(doc.createElement(\"div\"), {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n overflow: \"hidden\",\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n whiteSpace: \"nowrap\",\n });\n root.appendChild(summary);\n let summaryText = \"\";\n let summaryAt = -Infinity;\n\n let destroyed = false;\n let frameId = 0;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n let pending = false;\n let visible = true;\n\n const raf =\n win && typeof win.requestAnimationFrame === \"function\"\n ? (cb: (t: number) => void) => win.requestAnimationFrame(cb)\n : null;\n\n const run = () => {\n frameId = 0;\n timeoutId = null;\n if (destroyed) return;\n pending = false;\n if (!host.measure()) return;\n const now =\n typeof performance !== \"undefined\" ? performance.now() : Date.now();\n if (config.draw(now)) host.invalidate();\n };\n\n const schedule = () => {\n if (frameId || timeoutId !== null || destroyed) return;\n if (raf) frameId = raf(run);\n else timeoutId = setTimeout(run, 16);\n };\n\n const host: Host = {\n doc,\n root,\n canvas,\n ctx,\n tooltip,\n width: 0,\n height: 0,\n dpr: 1,\n theme: readTheme(root),\n invalidate() {\n pending = true;\n if (visible) schedule();\n },\n measure() {\n const width = root.clientWidth;\n const height = root.clientHeight;\n if (width <= 0 || height <= 0) return false;\n const dpr = win?.devicePixelRatio || 1;\n const w = Math.max(1, Math.round(width * dpr));\n const h = Math.max(1, Math.round(height * dpr));\n if (canvas.width !== w) canvas.width = w;\n if (canvas.height !== h) canvas.height = h;\n if (host.width !== width || host.height !== height) {\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n }\n host.width = width;\n host.height = height;\n host.dpr = dpr;\n return true;\n },\n placeTooltip(tip, x, y, prefer = \"right\") {\n const tw = tip.offsetWidth;\n const th = tip.offsetHeight;\n const gap = 14;\n let left = prefer === \"right\" ? x + gap : x - gap - tw;\n if (left + tw > host.width - 4) left = x - gap - tw;\n if (left < 4) left = Math.min(x + gap, host.width - tw - 4);\n const top = Math.max(4, Math.min(y - th / 2, host.height - th - 4));\n tip.style.transform = `translate(${Math.round(Math.max(4, left))}px, ${Math.round(top)}px)`;\n },\n createTooltip,\n describe(text) {\n if (text === summaryText) return;\n const now = Date.now();\n if (now - summaryAt < 1000 && summaryText) return;\n summaryAt = now;\n summaryText = text;\n summary.textContent = text;\n },\n destroy() {\n destroyed = true;\n if (frameId && win) win.cancelAnimationFrame(frameId);\n if (timeoutId !== null) clearTimeout(timeoutId);\n resizeObserver?.disconnect();\n intersection?.disconnect();\n unwatchTheme();\n root.remove();\n },\n };\n\n const resizeObserver =\n typeof ResizeObserver === \"function\"\n ? new ResizeObserver(() => host.invalidate())\n : null;\n resizeObserver?.observe(root);\n\n // no frames while off screen: updates only touch the data, the next\n // visible frame draws the latest state\n const intersection =\n win && typeof win.IntersectionObserver === \"function\"\n ? new win.IntersectionObserver((entries) => {\n const entry = entries[entries.length - 1];\n if (!entry) return;\n visible = entry.isIntersecting;\n if (visible && pending) schedule();\n })\n : null;\n intersection?.observe(root);\n\n const unwatchTheme = watchTheme(() => {\n if (destroyed) return;\n host.theme = readTheme(root);\n config.onTheme?.();\n host.invalidate();\n });\n\n return host;\n};\n\n/** Minimal typed event emitter */\nexport const createEmitter = <M extends object>() => {\n const handlers = new Map<keyof M, Set<(payload: never) => void>>();\n return {\n on<K extends keyof M>(event: K, handler: (payload: M[K]) => void) {\n let set = handlers.get(event);\n if (!set) handlers.set(event, (set = new Set()));\n set.add(handler as (payload: never) => void);\n return () => {\n set.delete(handler as (payload: never) => void);\n };\n },\n emit<K extends keyof M>(event: K, payload: M[K]) {\n const set = handlers.get(event);\n if (!set) return;\n for (const handler of set) (handler as (p: M[K]) => void)(payload);\n },\n has(event: keyof M) {\n return (handlers.get(event)?.size ?? 0) > 0;\n },\n clear() {\n handlers.clear();\n },\n };\n};\n\n/** Pointer position relative to an element */\nexport const localPoint = (\n element: HTMLElement,\n event: { clientX: number; clientY: number },\n): [number, number] => {\n const rect = element.getBoundingClientRect();\n return [event.clientX - rect.left, event.clientY - rect.top];\n};\n\n/** Rows of a tooltip: label / value pairs, an optional colored title */\nexport const tooltipHtml = (\n doc: Document,\n tip: HTMLElement,\n title: { text: string; color?: string } | null,\n rows: readonly (readonly [string, string])[],\n) => {\n // the content only changes when the hovered values do\n const key = `${title?.text ?? \"\"}|${title?.color ?? \"\"}|${rows.map((r) => r.join(\"=\")).join(\"|\")}`;\n if (tip.dataset.key === key) return;\n tip.dataset.key = key;\n tip.textContent = \"\";\n if (title) {\n const head = styleElement(doc.createElement(\"div\"), {\n fontWeight: \"600\",\n marginBottom: \"2px\",\n color: title.color ?? \"inherit\",\n });\n head.textContent = title.text;\n tip.appendChild(head);\n }\n for (const [label, value] of rows) {\n const row = styleElement(doc.createElement(\"div\"), {\n display: \"flex\",\n justifyContent: \"space-between\",\n gap: \"16px\",\n });\n const l = styleElement(doc.createElement(\"span\"), {\n color: \"var(--text-secondary-color, #6b7280)\",\n });\n l.textContent = label;\n const v = styleElement(doc.createElement(\"span\"), { fontWeight: \"500\" });\n v.textContent = value;\n row.append(l, v);\n tip.appendChild(row);\n }\n};\n"],"mappings":";;;AA+CA,IAAME,IAA8C;CAClD,UAAU;CACV,MAAM;CACN,KAAK;CACL,QAAQ;CACR,SAAS;CACT,eAAe;CACf,SAAS;CACT,cAAc;CACd,QACE;CACF,YAAY;CACZ,OAAO;CACP,WACE;CACF,UAAU;CACV,YAAY;CACZ,YAAY;CACZ,oBAAoB;AACtB,GAEaC,KACX,GACA,MACS;CACT,IAAMC,IAAMC,EAAU,eAChBC,IAAMF,EAAI,aACVG,IAAOP,EAAaI,EAAI,cAAc,KAAK,GAAG;EAClD,UAAU;EACV,OAAO;EACP,QAAQ;EACR,WAAW;EACX,UAAU;EACV,YAAY;EACZ,YAAY;EACZ,OAAO;EACP,cAAc;CAChB,CAAC;CACD,EAAK,YAAY,qBAAqBI,EAAO;CAC7C,IAAMC,IAAST,EAAaI,EAAI,cAAc,QAAQ,GAAG;EACvD,UAAU;EACV,MAAM;EACN,KAAK;EACL,eAAe;CACjB,CAAC;CACD,EAAO,aAAa,eAAe,MAAM;CACzC,IAAIM;CACJ,IAAI;EACF,IAAMD,EAAO,WAAW,IAAI;CAC9B,QAAQ;EACN,IAAM;CACR;CAEA,AADAF,EAAK,YAAYE,CAAM,GACvBJ,EAAU,YAAYE,CAAI;CAE1B,IAAMI,UAAsB;EAC1B,IAAMC,IAAMZ,EACVI,EAAI,cAAc,KAAK,GACvBF,CACF;EAIA,OAHA,EAAI,YAAY,6BAChBU,EAAI,aAAa,QAAQ,SAAS,GAClCL,EAAK,YAAYK,CAAG,GACbA;CACT,GACMC,IAAUF,EAAc,GAExBG,IAAUd,EAAaI,EAAI,cAAc,KAAK,GAAG;EACrD,UAAU;EACV,OAAO;EACP,QAAQ;EACR,UAAU;EACV,MAAM;EACN,UAAU;EACV,YAAY;CACd,CAAC;CACD,EAAK,YAAYU,CAAO;CACxB,IAAIC,IAAc,IACdC,IAAY,WAEZC,IAAY,IACZC,IAAU,GACVC,IAAkD,MAClDC,IAAU,IACVC,IAAU,IAERC,IACJhB,KAAO,OAAOA,EAAI,yBAA0B,cACvC,MAA4BA,EAAI,sBAAsBiB,CAAE,IACzD,MAEAC,UAAY;EAKhB,IAJA,IAAU,GACV,IAAY,MACRP,MACJ,IAAU,IACN,CAACQ,EAAK,QAAQ,IAAG;EACrB,IAAMC,IACJ,OAAO,cAAgB,MAAc,YAAY,IAAI,IAAI,KAAK,IAAI;EACpE,AAAIlB,EAAO,KAAKkB,CAAG,KAAGD,EAAK,WAAW;CACxC,GAEME,UAAiB;EACrB,AAAIT,KAAWC,MAAc,QAAQF,MACjCK,IAAK,IAAUA,EAAIE,CAAG,IACrB,IAAY,WAAWA,GAAK,EAAE;CACrC,GAEMC,IAAa;EACjB;EACA;EACA;EACA;EACA;EACA,OAAO;EACP,QAAQ;EACR,KAAK;EACL,OAAOG,EAAUrB,CAAI;EACrB,aAAa;GAEX,AADA,IAAU,IACNc,KAASM,EAAS;EACxB;EACA,UAAU;GACR,IAAME,IAAQtB,EAAK,aACbuB,IAASvB,EAAK;GACpB,IAAIsB,KAAS,KAAKC,KAAU,GAAG,OAAO;GACtC,IAAMC,IAAMzB,GAAK,oBAAoB,GAC/B0B,IAAI,KAAK,IAAI,GAAG,KAAK,MAAMH,IAAQE,CAAG,CAAC,GACvCE,IAAI,KAAK,IAAI,GAAG,KAAK,MAAMH,IAASC,CAAG,CAAC;GAU9C,OATItB,EAAO,UAAUuB,MAAG,EAAO,QAAQA,IACnCvB,EAAO,WAAWwB,MAAG,EAAO,SAASA,KACrCR,EAAK,UAAUI,KAASJ,EAAK,WAAWK,OAC1C,EAAO,MAAM,QAAQ,GAAGD,EAAM,KAC9B,EAAO,MAAM,SAAS,GAAGC,EAAO,MAElC,EAAK,QAAQD,GACb,EAAK,SAASC,GACd,EAAK,MAAMC,GACJ;EACT;EACA,aAAa,GAAK,GAAG,GAAG,IAAS,SAAS;GACxC,IAAMG,IAAKtB,EAAI,aACTuB,IAAKvB,EAAI,cAEXwB,IAAOC,MAAW,UAAUC,IAAI,KAAMA,IAAI,KAAMJ;GAEpD,AADIE,IAAOF,IAAKT,EAAK,QAAQ,MAAG,IAAOa,IAAI,KAAMJ,IAC7CE,IAAO,MAAG,IAAO,KAAK,IAAIE,IAAI,IAAKb,EAAK,QAAQS,IAAK,CAAC;GAC1D,IAAMK,IAAM,KAAK,IAAI,GAAG,KAAK,IAAIC,IAAIL,IAAK,GAAGV,EAAK,SAASU,IAAK,CAAC,CAAC;GAClE,EAAI,MAAM,YAAY,aAAa,KAAK,MAAM,KAAK,IAAI,GAAGC,CAAI,CAAC,EAAE,MAAM,KAAK,MAAMG,CAAG,EAAE;EACzF;EACA;EACA,SAAS,GAAM;GACb,IAAIE,MAAS1B,GAAa;GAC1B,IAAMW,IAAM,KAAK,IAAI;GACrB,AAAIA,IAAMV,IAAY,OAAQD,MAC9B,IAAYW,GACZ,IAAce,GACd,EAAQ,cAAcA;EACxB;EACA,UAAU;GAOR,AANA,IAAY,IACRvB,KAAWZ,KAAKA,EAAI,qBAAqBY,CAAO,GAChDC,MAAc,QAAM,aAAaA,CAAS,GAC9CuB,GAAgB,WAAW,GAC3BC,GAAc,WAAW,GACzBC,EAAa,GACbrC,EAAK,OAAO;EACd;CACF,GAEMmC,IACJ,OAAO,kBAAmB,aACtB,IAAI,qBAAqBjB,EAAK,WAAW,CAAC,IAC1C;CACN,GAAgB,QAAQlB,CAAI;CAI5B,IAAMoC,IACJrC,KAAO,OAAOA,EAAI,wBAAyB,aACvC,IAAIA,EAAI,sBAAsB,MAAY;EACxC,IAAMuC,IAAQC,EAAQA,EAAQ,SAAS;EACvC,AAAKD,MACL,IAAUA,EAAM,gBACZxB,KAAWD,KAASO,EAAS;CACnC,CAAC,IACD;CACN,GAAc,QAAQpB,CAAI;CAE1B,IAAMqC,IAAeG,QAAiB;EACpC,AAAI9B,MACJ,EAAK,QAAQW,EAAUrB,CAAI,GAC3BC,EAAO,UAAU,GACjBiB,EAAK,WAAW;CAClB,CAAC;CAED,OAAOA;AACT,GAGauB,UAAwC;CACnD,IAAMC,oBAAW,IAAI,IAA4C;CACjE,OAAO;EACL,GAAsB,GAAU,GAAkC;GAChE,IAAIC,IAAMD,EAAS,IAAIE,CAAK;GAG5B,OAFKD,KAAKD,EAAS,IAAIE,GAAQ,oBAAM,IAAI,IAAI,CAAE,GAC/CD,EAAI,IAAIE,CAAmC,SAC9B;IACX,EAAI,OAAOA,CAAmC;GAChD;EACF;EACA,KAAwB,GAAU,GAAe;GAC/C,IAAMF,IAAMD,EAAS,IAAIE,CAAK;GAC9B,IAAKD,GACL,KAAK,IAAME,KAAWF,GAAK,EAA+BG,CAAO;EACnE;EACA,IAAI,GAAgB;GAClB,QAAQJ,EAAS,IAAIE,CAAK,CAAC,EAAE,QAAQ,KAAK;EAC5C;EACA,QAAQ;GACN,EAAS,MAAM;EACjB;CACF;AACF,GAGaG,KACX,GACA,MACqB;CACrB,IAAMC,IAAOC,EAAQ,sBAAsB;CAC3C,OAAO,CAACL,EAAM,UAAUI,EAAK,MAAMJ,EAAM,UAAUI,EAAK,GAAG;AAC7D,GAGaE,KACX,GACA,GACA,GACA,MACG;CAEH,IAAMC,IAAM,GAAGC,GAAO,QAAQ,GAAG,GAAGA,GAAO,SAAS,GAAG,GAAGC,EAAK,KAAK,MAAMC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG;CAC/F,IAAIjD,EAAI,QAAQ,QAAQ8C,GAGxB;MAFA,EAAI,QAAQ,MAAMA,GAClB,EAAI,cAAc,IACdC,GAAO;GACT,IAAMG,IAAO9D,EAAaI,EAAI,cAAc,KAAK,GAAG;IAClD,YAAY;IACZ,cAAc;IACd,OAAOuD,EAAM,SAAS;GACxB,CAAC;GAED,AADA,EAAK,cAAcA,EAAM,MACzB/C,EAAI,YAAYkD,CAAI;EACtB;EACA,KAAK,IAAM,CAACC,GAAOC,MAAUJ,GAAM;GACjC,IAAMK,IAAMjE,EAAaI,EAAI,cAAc,KAAK,GAAG;IACjD,SAAS;IACT,gBAAgB;IAChB,KAAK;GACP,CAAC,GACK8D,IAAIlE,EAAaI,EAAI,cAAc,MAAM,GAAG,EAChD,OAAO,uCACT,CAAC;GACD,EAAE,cAAc2D;GAChB,IAAMI,IAAInE,EAAaI,EAAI,cAAc,MAAM,GAAG,EAAE,YAAY,MAAM,CAAC;GAGvE,AAFA,EAAE,cAAc4D,GAChBC,EAAI,OAAOC,GAAGC,CAAC,GACfvD,EAAI,YAAYqD,CAAG;EACrB;CAfA;AAgBF"}
|
|
1
|
+
{"version":3,"file":"host.js","names":["styleElement","assign","TOOLTIP_STYLE","createHost","doc","container","win","root","config","canvas","ctx","createTooltip","tip","tooltip","summary","summaryText","summaryAt","destroyed","frameId","timeoutId","pending","visible","raf","cb","run","host","now","schedule","readTheme","width","height","dpr","w","h","tw","th","left","prefer","x","top","y","text","resizeObserver","intersection","unwatchTheme","entry","entries","watchTheme","createEmitter","handlers","set","event","handler","payload","localPoint","rect","element","tooltipHtml","badge","title","key","rows","r","head","tag","dot","label","value","row","l","v"],"sources":["../../../../../charts/src/engine/orderbook/host.ts"],"sourcesContent":["// DOM host of the order book widgets: a sized Canvas2D layer, a frame\n// scheduler coalescing any number of updates into one requestAnimationFrame,\n// paused while the widget is off screen, theme watching, resize observing,\n// a tooltip and a tiny event emitter.\n\nimport { styleElement } from \"../dom\";\nimport { readTheme, watchTheme, type ChartTheme } from \"../theme\";\n\nexport interface HostConfig {\n /** Class of the root element */\n className: string;\n /** Draws a frame; returns `true` to get another one (animations) */\n draw(now: number): boolean;\n /** The theme changed (colors must be resolved again) */\n onTheme?(): void;\n}\n\nexport interface Host {\n readonly doc: Document;\n readonly root: HTMLDivElement;\n readonly canvas: HTMLCanvasElement;\n readonly ctx: CanvasRenderingContext2D | null;\n readonly tooltip: HTMLDivElement;\n /** Size of the widget in CSS pixels, read at the start of every frame */\n width: number;\n height: number;\n dpr: number;\n theme: ChartTheme;\n /** Requests a frame (coalesced) */\n invalidate(): void;\n /** Sizes the canvas to the root; `false` when it has no size */\n measure(): boolean;\n /** Places the tooltip next to a point, inside the widget */\n placeTooltip(\n tip: HTMLElement,\n x: number,\n y: number,\n prefer?: \"left\" | \"right\",\n ): void;\n /** New tooltip element (one is created with the host) */\n createTooltip(): HTMLDivElement;\n /** Text read by screen readers (visually hidden, updated at most once a second) */\n describe(text: string): void;\n destroy(): void;\n}\n\n/** Tooltip look of the chart engine (dom.ts), copied for the widgets */\nconst TOOLTIP_STYLE: Partial<CSSStyleDeclaration> = {\n position: \"absolute\",\n left: \"0\",\n top: \"0\",\n zIndex: \"2\",\n display: \"none\",\n pointerEvents: \"none\",\n padding: \"6px 10px\",\n borderRadius: \"8px\",\n border:\n \"1px solid color-mix(in srgb, var(--border-color, #e5e7eb) 60%, transparent)\",\n background: \"var(--surface-elevated-color, var(--background-color, #fff))\",\n color: \"var(--text-color, #1f2937)\",\n boxShadow:\n \"0 12px 32px -8px rgba(15, 23, 42, 0.18), 0 4px 10px -4px rgba(15, 23, 42, 0.1)\",\n fontSize: \"12px\",\n lineHeight: \"18px\",\n whiteSpace: \"nowrap\",\n fontVariantNumeric: \"tabular-nums\",\n};\n\nexport const createHost = (\n container: HTMLElement,\n config: HostConfig,\n): Host => {\n const doc = container.ownerDocument;\n const win = doc.defaultView;\n const root = styleElement(doc.createElement(\"div\"), {\n position: \"relative\",\n width: \"100%\",\n height: \"100%\",\n minHeight: \"0\",\n overflow: \"hidden\",\n userSelect: \"none\",\n fontFamily: \"var(--font-family-sans, system-ui, sans-serif)\",\n color: \"var(--text-color, #1f2937)\",\n borderRadius: \"inherit\",\n }) as HTMLDivElement;\n root.className = `minerva-orderbook ${config.className}`;\n const canvas = styleElement(doc.createElement(\"canvas\"), {\n position: \"absolute\",\n left: \"0\",\n top: \"0\",\n pointerEvents: \"none\",\n }) as HTMLCanvasElement;\n canvas.setAttribute(\"aria-hidden\", \"true\");\n let ctx: CanvasRenderingContext2D | null;\n try {\n ctx = canvas.getContext(\"2d\");\n } catch {\n ctx = null;\n }\n root.appendChild(canvas);\n container.appendChild(root);\n\n const createTooltip = () => {\n const tip = styleElement(\n doc.createElement(\"div\"),\n TOOLTIP_STYLE,\n ) as HTMLDivElement;\n tip.className = \"minerva-orderbook-tooltip\";\n tip.setAttribute(\"role\", \"tooltip\");\n root.appendChild(tip);\n return tip;\n };\n const tooltip = createTooltip();\n\n const summary = styleElement(doc.createElement(\"div\"), {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n overflow: \"hidden\",\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n whiteSpace: \"nowrap\",\n });\n root.appendChild(summary);\n let summaryText = \"\";\n let summaryAt = -Infinity;\n\n let destroyed = false;\n let frameId = 0;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n let pending = false;\n let visible = true;\n\n const raf =\n win && typeof win.requestAnimationFrame === \"function\"\n ? (cb: (t: number) => void) => win.requestAnimationFrame(cb)\n : null;\n\n const run = () => {\n frameId = 0;\n timeoutId = null;\n if (destroyed) return;\n pending = false;\n if (!host.measure()) return;\n const now =\n typeof performance !== \"undefined\" ? performance.now() : Date.now();\n if (config.draw(now)) host.invalidate();\n };\n\n const schedule = () => {\n if (frameId || timeoutId !== null || destroyed) return;\n if (raf) frameId = raf(run);\n else timeoutId = setTimeout(run, 16);\n };\n\n const host: Host = {\n doc,\n root,\n canvas,\n ctx,\n tooltip,\n width: 0,\n height: 0,\n dpr: 1,\n theme: readTheme(root),\n invalidate() {\n pending = true;\n if (visible) schedule();\n },\n measure() {\n const width = root.clientWidth;\n const height = root.clientHeight;\n if (width <= 0 || height <= 0) return false;\n const dpr = win?.devicePixelRatio || 1;\n const w = Math.max(1, Math.round(width * dpr));\n const h = Math.max(1, Math.round(height * dpr));\n if (canvas.width !== w) canvas.width = w;\n if (canvas.height !== h) canvas.height = h;\n if (host.width !== width || host.height !== height) {\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n }\n host.width = width;\n host.height = height;\n host.dpr = dpr;\n return true;\n },\n placeTooltip(tip, x, y, prefer = \"right\") {\n const tw = tip.offsetWidth;\n const th = tip.offsetHeight;\n const gap = 14;\n let left = prefer === \"right\" ? x + gap : x - gap - tw;\n if (left + tw > host.width - 4) left = x - gap - tw;\n if (left < 4) left = Math.min(x + gap, host.width - tw - 4);\n const top = Math.max(4, Math.min(y - th / 2, host.height - th - 4));\n tip.style.transform = `translate(${Math.round(Math.max(4, left))}px, ${Math.round(top)}px)`;\n },\n createTooltip,\n describe(text) {\n if (text === summaryText) return;\n const now = Date.now();\n if (now - summaryAt < 1000 && summaryText) return;\n summaryAt = now;\n summaryText = text;\n summary.textContent = text;\n },\n destroy() {\n destroyed = true;\n if (frameId && win) win.cancelAnimationFrame(frameId);\n if (timeoutId !== null) clearTimeout(timeoutId);\n resizeObserver?.disconnect();\n intersection?.disconnect();\n unwatchTheme();\n root.remove();\n },\n };\n\n const resizeObserver =\n typeof ResizeObserver === \"function\"\n ? new ResizeObserver(() => host.invalidate())\n : null;\n resizeObserver?.observe(root);\n\n // no frames while off screen: updates only touch the data, the next\n // visible frame draws the latest state\n const intersection =\n win && typeof win.IntersectionObserver === \"function\"\n ? new win.IntersectionObserver((entries) => {\n const entry = entries[entries.length - 1];\n if (!entry) return;\n visible = entry.isIntersecting;\n if (visible && pending) schedule();\n })\n : null;\n intersection?.observe(root);\n\n const unwatchTheme = watchTheme(() => {\n if (destroyed) return;\n host.theme = readTheme(root);\n config.onTheme?.();\n host.invalidate();\n });\n\n return host;\n};\n\n/** Minimal typed event emitter */\nexport const createEmitter = <M extends object>() => {\n const handlers = new Map<keyof M, Set<(payload: never) => void>>();\n return {\n on<K extends keyof M>(event: K, handler: (payload: M[K]) => void) {\n let set = handlers.get(event);\n if (!set) handlers.set(event, (set = new Set()));\n set.add(handler as (payload: never) => void);\n return () => {\n set.delete(handler as (payload: never) => void);\n };\n },\n emit<K extends keyof M>(event: K, payload: M[K]) {\n const set = handlers.get(event);\n if (!set) return;\n for (const handler of set) (handler as (p: M[K]) => void)(payload);\n },\n has(event: keyof M) {\n return (handlers.get(event)?.size ?? 0) > 0;\n },\n clear() {\n handlers.clear();\n },\n };\n};\n\n/** Pointer position relative to an element */\nexport const localPoint = (\n element: HTMLElement,\n event: { clientX: number; clientY: number },\n): [number, number] => {\n const rect = element.getBoundingClientRect();\n return [event.clientX - rect.left, event.clientY - rect.top];\n};\n\n/**\n * Rows of a tooltip: label / value pairs, an optional title (colored text,\n * and a badge: a colored dot and a short text at its right)\n */\nexport const tooltipHtml = (\n doc: Document,\n tip: HTMLElement,\n title: {\n text: string;\n color?: string;\n badge?: { text: string; color: string };\n } | null,\n rows: readonly (readonly [string, string])[],\n) => {\n // the content only changes when the hovered values do\n const badge = title?.badge;\n const key = `${title?.text ?? \"\"}|${title?.color ?? \"\"}|${badge ? `${badge.text}:${badge.color}` : \"\"}|${rows.map((r) => r.join(\"=\")).join(\"|\")}`;\n if (tip.dataset.key === key) return;\n tip.dataset.key = key;\n tip.textContent = \"\";\n if (title) {\n const head = styleElement(doc.createElement(\"div\"), {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: \"12px\",\n fontWeight: \"600\",\n marginBottom: \"2px\",\n color: title.color ?? \"inherit\",\n });\n const text = doc.createElement(\"span\");\n text.textContent = title.text;\n head.appendChild(text);\n if (badge) {\n const tag = styleElement(doc.createElement(\"span\"), {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"5px\",\n fontWeight: \"500\",\n color: badge.color,\n });\n tag.className = \"minerva-orderbook-tooltip-badge\";\n const dot = styleElement(doc.createElement(\"span\"), {\n width: \"7px\",\n height: \"7px\",\n borderRadius: \"50%\",\n background: badge.color,\n flex: \"none\",\n });\n tag.append(dot, doc.createTextNode(badge.text));\n head.appendChild(tag);\n }\n tip.appendChild(head);\n }\n for (const [label, value] of rows) {\n const row = styleElement(doc.createElement(\"div\"), {\n display: \"flex\",\n justifyContent: \"space-between\",\n gap: \"16px\",\n });\n const l = styleElement(doc.createElement(\"span\"), {\n color: \"var(--text-secondary-color, #6b7280)\",\n });\n l.textContent = label;\n const v = styleElement(doc.createElement(\"span\"), { fontWeight: \"500\" });\n v.textContent = value;\n row.append(l, v);\n tip.appendChild(row);\n }\n};\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../color.cjs"),t=require("../locale.cjs"),n=require("./book.cjs"),r=require("./format.cjs"),i=require("./host.cjs");var a={en:{price:`Price`,size:`Size`,total:`Total`,spread:`Spread`,average:`Avg. price`,sum:`Sum`,notional:`Notional`,buyShare:`B`,sellShare:`S`,bid:`Bid`,ask:`Ask`,basisPoints:`bp`,name:`Order book`},zh:{price:`价格`,size:`数量`,total:`累计`,spread:`价差`,average:`均价`,sum:`累计数量`,notional:`累计金额`,buyShare:`买`,sellShare:`卖`,bid:`买一`,ask:`卖一`,basisPoints:`基点`,name:`订单簿`},ja:{price:`価格`,size:`数量`,total:`累計`,spread:`スプレッド`,average:`平均価格`,sum:`累計数量`,notional:`累計金額`,buyShare:`買`,sellShare:`売`,bid:`最良買気配`,ask:`最良売気配`,basisPoints:`bp`,name:`板情報`},fr:{price:`Prix`,size:`Quantité`,total:`Cumul`,spread:`Écart`,average:`Prix moyen`,sum:`Somme`,notional:`Montant`,buyShare:`A`,sellShare:`V`,bid:`Meilleur achat`,ask:`Meilleure vente`,basisPoints:`pb`,name:`Carnet d’ordres`}},o=[`price`,`size`,`total`],s=(s,c={})=>{let l=c,u=n.createOrderBookStore(),d=i.createEmitter(),f=r.createFormatters(l,2,4),p=f.price,m=t.localeLabels(a,l.locale,l.labels),h=!1,g={up:[0,0,0,1],down:[0,0,0,1]},_=null,v=NaN,y=0,b=new Map,x={bid:[NaN,NaN],ask:[NaN,NaN]},S=!1,C=[],w=null,T=null,E=``,D=null,O=20,k=i.createHost(s,{className:`minerva-order-book`,draw:F,onTheme:()=>{g=r.sideColors(k.theme,l)}}),{root:A,doc:ee}=k;A.tabIndex=0,A.setAttribute(`role`,`figure`),A.style.cursor=`default`;let te=()=>m,j=()=>{let e=l.grouping??0,t=n.inferPriceDecimals(u);f=r.createFormatters(l,e>0?Math.max(n.decimalsOf(e),0):t,n.inferSizeDecimals(u));let i=r.numberFormat(l.locale,Math.max(f.priceDecimals,l.grouping?t:0));p=l.formatPrice?f.price:e=>Number.isFinite(e)?i.format(e):`–`},M=()=>{m=t.localeLabels(a,l.locale,l.labels),A.setAttribute(`aria-label`,l.ariaLabel??m.name)},N=()=>{M(),g=r.sideColors(k.theme,l),j(),b=new Map,S=!1,k.invalidate()},P=(e,t)=>{let{price:n,size:r,count:i}=u.levels(e,{step:l.grouping??0,limit:t}),a=[],o=0,s=0;for(let t=0;t<i;t++){let i=n[t],c=r[t];o+=c,s+=c*i,a.push({side:e,index:t,price:i,size:c,sum:o,notional:s,average:s/o,y:0})}return a};function F(t){let n=k.ctx;if(!n)return!1;let{width:a,height:s,dpr:c,theme:m}=k,h=te(),A=l.mode??`both`,j=a<260,M=l.fontSize??(j?11:12),N=O=Math.max(12,l.rowHeight??(j?18:20)),F=l.header===!1?0:N+2,L=l.spreadRow===!1?0:Math.round(N*1.7),R=l.imbalance===!1?0:24,z=A===`both`?2:1,B=Math.max(0,s-F-L-R),V=Math.max(0,l.rows??Math.floor(B/N/z)),H=j?6:10;n.setTransform(c,0,0,c,0,0),n.clearRect(0,0,a,s);let U=A===`bids`?[]:P(`ask`,V),W=A===`asks`?[]:P(`bid`,V),G=F,K=G;if(A!==`bids`){for(let e of U)e.y=K+(V-1-e.index)*N;G+=V*N}let ne=A===`bids`?F:G;A===`bids`?G=F+L:G+=L;let re=G;for(let e of W)e.y=re+e.index*N;C=[...U,...W];let ie=A===`asks`?K+V*N:ne,q=(l.columns??o).filter((e,t,n)=>n.indexOf(e)===t),J=j&&q.length>2?q.slice(0,2):q,Y=J.length,ae=a-H*2,X=J.map((e,t)=>t===0?H:H+ae*(t===Y-1?1:.24+.76*t/(Y-1))),Z=l.depthBars??`cumulative`,Q=0;for(let e of C)Q=Math.max(Q,Z===`level`?e.size:e.sum);let oe=l.flash!==!1,se=Math.max(1,l.flashDuration??450),ce=new Map,le=!1,ue=e=>{let t=x[e.side];return S&&e.price>t[0]&&e.price<t[1]};for(let e of C){let n=`${e.side}:${e.price}`,r=b.get(n),i;i=r?r.size===e.size?r:{size:e.size,at:t,grew:e.size>r.size}:{size:e.size,at:ue(e)?t:-1/0,grew:!0},ce.set(n,i)}b=ce,S=!0;for(let e of[`bid`,`ask`]){let t=(e===`bid`?W:U).map(e=>e.price);x[e]=t.length?[Math.min(...t),Math.max(...t)]:[NaN,NaN]}if(D=null,w){let[e,t]=w;e>=0&&e<=a&&(D=C.find(e=>t>=e.y&&t<e.y+N)??null)}else if(T){let e=T.side===`ask`?U:W;D=e[Math.min(T.index,e.length-1)]??null}let de=l.largeOrderThreshold??1/0,fe=e.toCss(m.text),$=e.toCss(m.textMuted);F&&(n.font=r.fontOf(m,l,400,M-1),n.fillStyle=$,n.textBaseline=`middle`,J.forEach((e,t)=>{n.textAlign=t===0?`left`:`right`,n.fillText(h[e],X[t],N/2+1)}));for(let i of C){let o=i.side===`bid`?g.up:g.down,s=`${i.side}:${i.price}`,c=i.size>=de;if(D&&D.side===i.side&&i.index<=D.index&&(n.fillStyle=e.toCss(m.text,i===D?.09:.045),n.fillRect(0,i.y,a,N)),Z!==`none`&&Q>0){let t=(Z===`level`?i.size:i.sum)/Q*a;n.fillStyle=e.toCss(o,.14),n.fillRect(a-t,i.y+1,t,N-2)}c&&(n.fillStyle=e.toCss(o,.16),n.fillRect(0,i.y+1,a,N-2),n.fillStyle=e.toCss(o),n.
|
|
1
|
+
const e=require("../color.cjs"),t=require("../locale.cjs"),n=require("./book.cjs"),r=require("./format.cjs"),i=require("./host.cjs");var a={en:{price:`Price`,size:`Size`,total:`Total`,spread:`Spread`,average:`Avg. price`,sum:`Sum`,notional:`Notional`,buyShare:`B`,sellShare:`S`,bid:`Bid`,ask:`Ask`,basisPoints:`bp`,name:`Order book`},zh:{price:`价格`,size:`数量`,total:`累计`,spread:`价差`,average:`均价`,sum:`累计数量`,notional:`累计金额`,buyShare:`买`,sellShare:`卖`,bid:`买一`,ask:`卖一`,basisPoints:`基点`,name:`订单簿`},ja:{price:`価格`,size:`数量`,total:`累計`,spread:`スプレッド`,average:`平均価格`,sum:`累計数量`,notional:`累計金額`,buyShare:`買`,sellShare:`売`,bid:`最良買気配`,ask:`最良売気配`,basisPoints:`bp`,name:`板情報`},fr:{price:`Prix`,size:`Quantité`,total:`Cumul`,spread:`Écart`,average:`Prix moyen`,sum:`Somme`,notional:`Montant`,buyShare:`A`,sellShare:`V`,bid:`Meilleur achat`,ask:`Meilleure vente`,basisPoints:`pb`,name:`Carnet d’ordres`}},o=[`price`,`size`,`total`],s=(s,c={})=>{let l=c,u=n.createOrderBookStore(),d=i.createEmitter(),f=r.createFormatters(l,2,4),p=f.price,m=t.localeLabels(a,l.locale,l.labels),h=!1,g={up:[0,0,0,1],down:[0,0,0,1]},_=null,v=NaN,y=0,b=new Map,x={bid:[NaN,NaN],ask:[NaN,NaN]},S=!1,C=[],w=null,T=null,E=``,D=null,O=20,k=i.createHost(s,{className:`minerva-order-book`,draw:F,onTheme:()=>{g=r.sideColors(k.theme,l)}}),{root:A,doc:ee}=k;A.tabIndex=0,A.setAttribute(`role`,`figure`),A.style.cursor=`default`;let te=()=>m,j=()=>{let e=l.grouping??0,t=n.inferPriceDecimals(u);f=r.createFormatters(l,e>0?Math.max(n.decimalsOf(e),0):t,n.inferSizeDecimals(u));let i=r.numberFormat(l.locale,Math.max(f.priceDecimals,l.grouping?t:0));p=l.formatPrice?f.price:e=>Number.isFinite(e)?i.format(e):`–`},M=()=>{m=t.localeLabels(a,l.locale,l.labels),A.setAttribute(`aria-label`,l.ariaLabel??m.name)},N=()=>{M(),g=r.sideColors(k.theme,l),j(),b=new Map,S=!1,k.invalidate()},P=(e,t)=>{let{price:n,size:r,count:i}=u.levels(e,{step:l.grouping??0,limit:t}),a=[],o=0,s=0;for(let t=0;t<i;t++){let i=n[t],c=r[t];o+=c,s+=c*i,a.push({side:e,index:t,price:i,size:c,sum:o,notional:s,average:s/o,y:0})}return a};function F(t){let n=k.ctx;if(!n)return!1;let{width:a,height:s,dpr:c,theme:m}=k,h=te(),A=l.mode??`both`,j=a<260,M=l.fontSize??(j?11:12),N=O=Math.max(12,l.rowHeight??(j?18:20)),F=l.header===!1?0:N+2,L=l.spreadRow===!1?0:Math.round(N*1.7),R=l.imbalance===!1?0:24,z=A===`both`?2:1,B=Math.max(0,s-F-L-R),V=Math.max(0,l.rows??Math.floor(B/N/z)),H=j?6:10;n.setTransform(c,0,0,c,0,0),n.clearRect(0,0,a,s);let U=A===`bids`?[]:P(`ask`,V),W=A===`asks`?[]:P(`bid`,V),G=F,K=G;if(A!==`bids`){for(let e of U)e.y=K+(V-1-e.index)*N;G+=V*N}let ne=A===`bids`?F:G;A===`bids`?G=F+L:G+=L;let re=G;for(let e of W)e.y=re+e.index*N;C=[...U,...W];let ie=A===`asks`?K+V*N:ne,q=(l.columns??o).filter((e,t,n)=>n.indexOf(e)===t),J=j&&q.length>2?q.slice(0,2):q,Y=J.length,ae=a-H*2,X=J.map((e,t)=>t===0?H:H+ae*(t===Y-1?1:.24+.76*t/(Y-1))),Z=l.depthBars??`cumulative`,Q=0;for(let e of C)Q=Math.max(Q,Z===`level`?e.size:e.sum);let oe=l.flash!==!1,se=Math.max(1,l.flashDuration??450),ce=new Map,le=!1,ue=e=>{let t=x[e.side];return S&&e.price>t[0]&&e.price<t[1]};for(let e of C){let n=`${e.side}:${e.price}`,r=b.get(n),i;i=r?r.size===e.size?r:{size:e.size,at:t,grew:e.size>r.size}:{size:e.size,at:ue(e)?t:-1/0,grew:!0},ce.set(n,i)}b=ce,S=!0;for(let e of[`bid`,`ask`]){let t=(e===`bid`?W:U).map(e=>e.price);x[e]=t.length?[Math.min(...t),Math.max(...t)]:[NaN,NaN]}if(D=null,w){let[e,t]=w;e>=0&&e<=a&&(D=C.find(e=>t>=e.y&&t<e.y+N)??null)}else if(T){let e=T.side===`ask`?U:W;D=e[Math.min(T.index,e.length-1)]??null}let de=l.largeOrderThreshold??1/0,fe=e.toCss(m.text),$=e.toCss(m.textMuted);F&&(n.font=r.fontOf(m,l,400,M-1),n.fillStyle=$,n.textBaseline=`middle`,J.forEach((e,t)=>{n.textAlign=t===0?`left`:`right`,n.fillText(h[e],X[t],N/2+1)}));for(let i of C){let o=i.side===`bid`?g.up:g.down,s=`${i.side}:${i.price}`,c=i.size>=de;if(D&&D.side===i.side&&i.index<=D.index&&(n.fillStyle=e.toCss(m.text,i===D?.09:.045),n.fillRect(0,i.y,a,N)),Z!==`none`&&Q>0){let t=(Z===`level`?i.size:i.sum)/Q*a;n.fillStyle=e.toCss(o,.14),n.fillRect(a-t,i.y+1,t,N-2)}c&&(n.fillStyle=e.toCss(o,.16),n.fillRect(0,i.y+1,a,N-2),n.fillStyle=e.toCss(o),n.beginPath(),n.arc(H/2,i.y+N/2,Math.min(2.5,H/2-1),0,Math.PI*2),n.fill());let u=b.get(s),d=0;if(oe&&u&&Number.isFinite(u.at)){let e=(t-u.at)/se;e<1&&(d=(1-e)*(1-e),le=!0)}n.textBaseline=`middle`;let p=i.y+N/2+.5;J.forEach((t,a)=>{if(n.textAlign=a===0?`left`:`right`,t===`price`)n.font=r.fontOf(m,l,500,M),n.fillStyle=e.toCss(o),n.fillText(f.price(i.price),X[a]+(c&&a===0?4:0),p);else if(t===`size`){n.font=r.fontOf(m,l,c?700:400,M);let t=f.size(i.size);if(d>0&&u){let s=n.measureText(t).width+10,c=a===0?X[a]-5:X[a]-s+5;n.fillStyle=e.toCss(u.grew?o:m.textMuted,(u.grew?.45:.3)*d),r.roundRect(n,c,i.y+2,s,N-4,3),n.fill()}n.fillStyle=fe,n.fillText(t,X[a],p)}else n.font=r.fontOf(m,l,400,M),n.fillStyle=$,n.fillText(l.total===`quote`?f.notional(i.notional):f.total(i.sum),X[a],p)})}if(D){n.strokeStyle=e.toCss(m.textMuted,.7),n.setLineDash([3,3]),n.beginPath();let t=D.side===`bid`?D.y+N-.5:D.y+.5;n.moveTo(0,t),n.lineTo(a,t),n.stroke(),n.setLineDash([])}if(L){let t=u.mid(),i=_??t;Number.isFinite(i)&&i!==v&&(Number.isFinite(v)&&(y=i>v?1:i<v?-1:y),v=i);let o=ie;n.fillStyle=e.toCss(m.text,.035),n.fillRect(0,o,a,L),n.strokeStyle=e.toCss(m.grid),n.beginPath(),n.moveTo(0,Math.round(o)+.5),n.lineTo(a,Math.round(o)+.5),n.moveTo(0,Math.round(o+L)-.5),n.lineTo(a,Math.round(o+L)-.5),n.stroke();let s=y>0?g.up:y<0?g.down:m.text,c=o+L/2+.5;n.textBaseline=`middle`,n.textAlign=`left`,n.font=r.fontOf(m,l,700,M+(j?2:4)),n.fillStyle=e.toCss(s);let d=p(i);n.fillText(d,H,c);let b=H+n.measureText(d).width+6;if(y!==0){let e=j?4:5;n.beginPath(),y>0?(n.moveTo(b,c+e*.6),n.lineTo(b+e,c-e*.7),n.lineTo(b+e*2,c+e*.6)):(n.moveTo(b,c-e*.6),n.lineTo(b+e,c+e*.7),n.lineTo(b+e*2,c-e*.6)),n.closePath(),n.fill(),b+=e*2+6}let x=u.spread();if(Number.isFinite(x)){n.textAlign=`right`,n.font=r.fontOf(m,l,400,M-1);let e=x/t*1e4,i=`${p(x)} · ${f.fixed(e,e<10?2:1)} ${h.basisPoints}`;if(n.fillStyle=fe,n.fillText(i,a-H,c),!j){let e=n.measureText(i).width;n.fillStyle=$;let t=`${h.spread}`;a-H-e-8-n.measureText(t).width>b&&n.fillText(t,a-H-e-8,c)}}}if(R){let t=0,i=0;for(let e of W)t+=e.size;for(let e of U)i+=e.size;let o=t+i,c=o>0?t/o:.5,u=s-R+6,d=R-10,p=a-H*2,_=H+p*c;n.save(),r.roundRect(n,H,u,p,d,3),n.clip(),n.fillStyle=e.toCss(g.up,.22),n.fillRect(H,u,_-H,d),n.fillStyle=e.toCss(g.down,.22),n.fillRect(_,u,H+p-_,d),n.restore(),n.fillStyle=e.toCss(m.background),n.fillRect(_-1,u,2,d),n.font=r.fontOf(m,l,600,M-1),n.textBaseline=`middle`,n.textAlign=`left`,n.fillStyle=e.toCss(g.up);let v=u+d/2+.5;n.fillText(`${h.buyShare} ${f.percent(c,1,!1)}`,H+6,v),n.textAlign=`right`,n.fillStyle=e.toCss(g.down),n.fillText(`${f.percent(1-c,1,!1)} ${h.sellShare}`,H+p-6,v)}if(D&&l.tooltip!==!1){let t=D.side===`bid`?g.up:g.down;i.tooltipHtml(ee,k.tooltip,{text:f.price(D.price),color:e.toCss(t)},[[h.average,p(D.average)],[h.sum,f.total(D.sum)],[h.notional,f.notional(D.notional)]]),k.tooltip.style.display=`block`;let n=w?w[0]:a*.4;k.placeTooltip(k.tooltip,n,D.y+N/2,n>a/2?`left`:`right`)}else k.tooltip.style.display=`none`;let pe=D?`${D.side}|${D.index}|${D.price}|${D.size}|${D.sum}`:``;pe!==E&&(E=pe,d.emit(`hover`,D?I(D):null));let me=u.bestBid(),he=u.bestAsk();return k.describe(`${l.ariaLabel??h.name}. ${h.bid} ${p(me)}, ${h.ask} ${p(he)}, ${h.spread} ${p(he-me)}.`),le}let I=e=>({side:e.side,index:e.index,price:e.price,size:e.size,sum:e.sum,notional:e.notional,average:e.average}),L=e=>{w=i.localPoint(A,e),T=null,k.invalidate()},R=()=>{w=null,k.invalidate()},z=e=>{let[t,n]=i.localPoint(A,e),r=C.find(e=>n>=e.y&&n<e.y+O);r&&t>=0&&d.emit(`levelClick`,I(r))},B=e=>{let t=[],n=C.filter(e=>e.side===`ask`),i=C.filter(e=>e.side===`bid`);for(let e=n.length-1;e>=0;e--)t.push({side:`ask`,index:e});for(let e=0;e<i.length;e++)t.push({side:`bid`,index:e});if(!t.length)return;let a=T?t.findIndex(e=>e.side===T.side&&e.index===T.index):-1;switch(e.key){case`ArrowDown`:case`ArrowUp`:{let i=e.key===`ArrowDown`;T=t[a>=0?r.clamp(a+(i?1:-1),0,t.length-1):i?Math.min(n.length,t.length-1):Math.max(0,n.length-1)]??null,w=null,k.invalidate();break}case`Enter`:case` `:D&&d.emit(`levelClick`,I(D));break;case`Escape`:T=null,k.invalidate();break;default:return}e.preventDefault()},V=()=>{T&&(T=null,k.invalidate())};A.addEventListener(`pointermove`,L),A.addEventListener(`pointerleave`,R),A.addEventListener(`click`,z),A.addEventListener(`keydown`,B),A.addEventListener(`blur`,V);let H=()=>{!h&&u.count(`bid`)+u.count(`ask`)>0&&(h=!0,j()),k.invalidate()};return N(),{setBook(e){u.setSnapshot(e),h=!1,H()},applyDeltas(e){n.applyDeltas(u,e)&&H()},clear(){u.clear(),h=!1,b=new Map,S=!1,k.invalidate()},setLastPrice(e){_=e!==null&&Number.isFinite(e)?e:null,k.invalidate()},setOptions(e){let t=(e.grouping??0)!==(l.grouping??0)||e.mode!==l.mode;l=e,t?N():(M(),g=r.sideColors(k.theme,l),j(),k.invalidate())},getStore:()=>u,on:(e,t)=>d.on(e,t),resize(){k.invalidate()},destroy(){A.removeEventListener(`pointermove`,L),A.removeEventListener(`pointerleave`,R),A.removeEventListener(`click`,z),A.removeEventListener(`keydown`,B),A.removeEventListener(`blur`,V),d.clear(),k.destroy()}}};exports.createOrderBook=s;
|
|
2
2
|
//# sourceMappingURL=ladder.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ladder.cjs","names":["createOrderBookStore","createEmitter","createFormatters","localeLabels","createHost","sideColors","inferPriceDecimals","decimalsOf","inferSizeDecimals","numberFormat","toCss","fontOf","localPoint","clamp","applyDeltas","require_color","require_locale","require_book","require_format","require_host","LABELS","COLUMNS","createOrderBook","options","initial","store","emitter","fmt","finePrice","texts","inferred","colors","lastPrice","previousLast","lastDirection","flashes","shownRange","drawn","rows","hoverAt","keyRow","hoverKey","hovered","rowHeight","host","container","root","labels","refreshFormat","grouping","raw","fine","v","applyTexts","applyOptions","sideRows","side","out","sum","notional","i","count","p","price","s","size","draw","ctx","l","mode","compact","width","fontSize","rh","headerH","spreadH","imbalanceH","sides","avail","height","perSide","pad","dpr","asks","bids","y","asksTop","row","spreadY","bidsTop","spreadTop","cols","all","c","shownCols","n","inner","colX","j","barsMode","barMax","flash","duration","nextFlashes","animating","inside","range","key","previous","entry","now","prices","r","hx","hy","list","threshold","text","theme","muted","color","large","w","f","flashAlpha","age","ty","label","x","edge","mid","shown","sy","dirColor","cy","priceText","spread","bps","right","rw","bidSum","askSum","share","by","bh","bw","split","doc","ax","toEvent","bb","ba","onPointerMove","event","onPointerLeave","onClick","onKeyDown","order","current","o","down","onBlur","changed","snapshot","deltas","regroup","next","handler"],"sources":["../../../../../charts/src/engine/orderbook/ladder.ts"],"sourcesContent":["// createOrderBook: the price ladder (asks above the spread row, bids below)\n// drawn with Canvas2D. Any number of deltas between two frames cost one\n// draw of the visible rows; changed levels flash, walls stand out, hovering\n// sums the levels up to the pointer.\n\nimport { toCss, type Rgba } from \"../color\";\nimport {\n applyDeltas,\n createOrderBookStore,\n decimalsOf,\n inferPriceDecimals,\n inferSizeDecimals,\n} from \"./book\";\nimport {\n clamp,\n createFormatters,\n fontOf,\n numberFormat,\n roundRect,\n sideColors,\n type Formatters,\n} from \"./format\";\nimport { localeLabels, type LabelDictionary } from \"../locale\";\nimport { createEmitter, createHost, localPoint, tooltipHtml } from \"./host\";\nimport type {\n OrderBookEventMap,\n OrderBookInstance,\n OrderBookLabels,\n OrderBookLevelEvent,\n OrderBookOptions,\n OrderBookSide,\n} from \"./types\";\n\nconst LABELS: LabelDictionary<OrderBookLabels> = {\n en: {\n price: \"Price\",\n size: \"Size\",\n total: \"Total\",\n spread: \"Spread\",\n average: \"Avg. price\",\n sum: \"Sum\",\n notional: \"Notional\",\n buyShare: \"B\",\n sellShare: \"S\",\n bid: \"Bid\",\n ask: \"Ask\",\n basisPoints: \"bp\",\n name: \"Order book\",\n },\n zh: {\n price: \"价格\",\n size: \"数量\",\n total: \"累计\",\n spread: \"价差\",\n average: \"均价\",\n sum: \"累计数量\",\n notional: \"累计金额\",\n buyShare: \"买\",\n sellShare: \"卖\",\n bid: \"买一\",\n ask: \"卖一\",\n basisPoints: \"基点\",\n name: \"订单簿\",\n },\n ja: {\n price: \"価格\",\n size: \"数量\",\n total: \"累計\",\n spread: \"スプレッド\",\n average: \"平均価格\",\n sum: \"累計数量\",\n notional: \"累計金額\",\n buyShare: \"買\",\n sellShare: \"売\",\n bid: \"最良買気配\",\n ask: \"最良売気配\",\n basisPoints: \"bp\",\n name: \"板情報\",\n },\n fr: {\n price: \"Prix\",\n size: \"Quantité\",\n total: \"Cumul\",\n spread: \"Écart\",\n average: \"Prix moyen\",\n sum: \"Somme\",\n notional: \"Montant\",\n buyShare: \"A\",\n sellShare: \"V\",\n bid: \"Meilleur achat\",\n ask: \"Meilleure vente\",\n basisPoints: \"pb\",\n name: \"Carnet d’ordres\",\n },\n};\n\nconst COLUMNS = [\"price\", \"size\", \"total\"] as const;\n\ninterface Row extends OrderBookLevelEvent {\n /** Top of the row, CSS pixels */\n y: number;\n}\n\ninterface Flash {\n size: number;\n at: number;\n grew: boolean;\n}\n\n/**\n * Creates an order book ladder in `container`: asks, spread row and bids\n * with depth bars, grouping, flashes on changes and a hover summary.\n */\nexport const createOrderBook = (\n container: HTMLElement,\n initial: OrderBookOptions = {},\n): OrderBookInstance => {\n let options = initial;\n const store = createOrderBookStore();\n const emitter = createEmitter<OrderBookEventMap>();\n let fmt: Formatters = createFormatters(options, 2, 4);\n let finePrice = fmt.price;\n /** Texts in the locale, resolved on every option update */\n let texts = localeLabels(LABELS, options.locale, options.labels);\n let inferred = false;\n let colors = { up: [0, 0, 0, 1] as Rgba, down: [0, 0, 0, 1] as Rgba };\n let lastPrice: number | null = null;\n let previousLast = NaN;\n let lastDirection = 0;\n let flashes = new Map<string, Flash>();\n /** Price range of the rows of the previous frame, per side */\n const shownRange: Record<OrderBookSide, [number, number]> = {\n bid: [NaN, NaN],\n ask: [NaN, NaN],\n };\n let drawn = false;\n let rows: Row[] = [];\n let hoverAt: [number, number] | null = null;\n /** Keyboard selection: side and index from the spread */\n let keyRow: { side: OrderBookSide; index: number } | null = null;\n let hoverKey = \"\";\n let hovered: Row | null = null;\n let rowHeight = 20;\n\n const host = createHost(container, {\n className: \"minerva-order-book\",\n draw,\n onTheme: () => {\n colors = sideColors(host.theme, options);\n },\n });\n const { root, doc } = host;\n root.tabIndex = 0;\n root.setAttribute(\"role\", \"figure\");\n root.style.cursor = \"default\";\n\n const labels = () => texts;\n\n const refreshFormat = () => {\n const grouping = options.grouping ?? 0;\n const raw = inferPriceDecimals(store);\n fmt = createFormatters(\n options,\n grouping > 0 ? Math.max(decimalsOf(grouping), 0) : raw,\n inferSizeDecimals(store),\n );\n // the spread row keeps the raw tick precision (a 0.1 spread is not \"0\")\n const fine = numberFormat(\n options.locale,\n Math.max(fmt.priceDecimals, options.grouping ? raw : 0),\n );\n finePrice = options.formatPrice\n ? fmt.price\n : (v) => (Number.isFinite(v) ? fine.format(v) : \"–\");\n };\n\n const applyTexts = () => {\n texts = localeLabels(LABELS, options.locale, options.labels);\n root.setAttribute(\"aria-label\", options.ariaLabel ?? texts.name);\n };\n\n const applyOptions = () => {\n applyTexts();\n colors = sideColors(host.theme, options);\n refreshFormat();\n // grouping changes the rows: no flash for the new buckets\n flashes = new Map();\n drawn = false;\n host.invalidate();\n };\n\n /** Levels of a side with their cumulative values */\n const sideRows = (side: OrderBookSide, limit: number): Row[] => {\n const { price, size, count } = store.levels(side, {\n step: options.grouping ?? 0,\n limit,\n });\n const out: Row[] = [];\n let sum = 0;\n let notional = 0;\n for (let i = 0; i < count; i++) {\n const p = price[i]!;\n const s = size[i]!;\n sum += s;\n notional += s * p;\n out.push({\n side,\n index: i,\n price: p,\n size: s,\n sum,\n notional,\n average: notional / sum,\n y: 0,\n });\n }\n return out;\n };\n\n function draw(now: number): boolean {\n const ctx = host.ctx;\n if (!ctx) return false;\n const { width, height, dpr, theme } = host;\n const l = labels();\n const mode = options.mode ?? \"both\";\n const compact = width < 260;\n const fontSize = options.fontSize ?? (compact ? 11 : 12);\n const rh = (rowHeight = Math.max(\n 12,\n options.rowHeight ?? (compact ? 18 : 20),\n ));\n const headerH = options.header === false ? 0 : rh + 2;\n const spreadH = options.spreadRow === false ? 0 : Math.round(rh * 1.7);\n const imbalanceH = options.imbalance === false ? 0 : 24;\n const sides = mode === \"both\" ? 2 : 1;\n const avail = Math.max(0, height - headerH - spreadH - imbalanceH);\n const perSide = Math.max(0, options.rows ?? Math.floor(avail / rh / sides));\n const pad = compact ? 6 : 10;\n\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, width, height);\n\n const asks = mode === \"bids\" ? [] : sideRows(\"ask\", perSide);\n const bids = mode === \"asks\" ? [] : sideRows(\"bid\", perSide);\n\n // vertical layout\n let y = headerH;\n const asksTop = y;\n if (mode !== \"bids\") {\n for (const row of asks) row.y = asksTop + (perSide - 1 - row.index) * rh;\n y += perSide * rh;\n }\n const spreadY = mode === \"bids\" ? headerH : y;\n if (mode !== \"bids\") y += spreadH;\n else y = headerH + spreadH;\n const bidsTop = y;\n for (const row of bids) row.y = bidsTop + row.index * rh;\n rows = [...asks, ...bids];\n const spreadTop = mode === \"asks\" ? asksTop + perSide * rh : spreadY;\n\n // columns\n const cols = (options.columns ?? COLUMNS).filter(\n (c, i, all) => all.indexOf(c) === i,\n );\n const shownCols = compact && cols.length > 2 ? cols.slice(0, 2) : cols;\n const n = shownCols.length;\n const inner = width - pad * 2;\n const colX = shownCols.map((_, j) =>\n j === 0\n ? pad\n : pad + inner * (j === n - 1 ? 1 : 0.24 + (0.76 * j) / (n - 1)),\n );\n\n // depth bar scale\n const barsMode = options.depthBars ?? \"cumulative\";\n let barMax = 0;\n for (const row of rows) {\n barMax = Math.max(barMax, barsMode === \"level\" ? row.size : row.sum);\n }\n\n // flashes: compare with the sizes of the previous frame\n const flash = options.flash !== false;\n const duration = Math.max(1, options.flashDuration ?? 450);\n const nextFlashes = new Map<string, Flash>();\n let animating = false;\n const inside = (row: Row) => {\n const range = shownRange[row.side];\n return drawn && row.price > range[0] && row.price < range[1];\n };\n for (const row of rows) {\n const key = `${row.side}:${row.price}`;\n const previous = flashes.get(key);\n let entry: Flash;\n // a level scrolling into view is not new: only levels appearing\n // between the rows already shown flash\n if (!previous)\n entry = {\n size: row.size,\n at: inside(row) ? now : -Infinity,\n grew: true,\n };\n else if (previous.size !== row.size)\n entry = { size: row.size, at: now, grew: row.size > previous.size };\n else entry = previous;\n nextFlashes.set(key, entry);\n }\n flashes = nextFlashes;\n drawn = true;\n for (const side of [\"bid\", \"ask\"] as const) {\n const list = side === \"bid\" ? bids : asks;\n const prices = list.map((r) => r.price);\n shownRange[side] = prices.length\n ? [Math.min(...prices), Math.max(...prices)]\n : [NaN, NaN];\n }\n\n // hover: rows from the spread to the hovered one\n hovered = null;\n if (hoverAt) {\n const [hx, hy] = hoverAt;\n if (hx >= 0 && hx <= width)\n hovered = rows.find((r) => hy >= r.y && hy < r.y + rh) ?? null;\n } else if (keyRow) {\n const list = keyRow.side === \"ask\" ? asks : bids;\n hovered = list[Math.min(keyRow.index, list.length - 1)] ?? null;\n }\n\n const threshold = options.largeOrderThreshold ?? Infinity;\n const text = toCss(theme.text);\n const muted = toCss(theme.textMuted);\n\n // header\n if (headerH) {\n ctx.font = fontOf(theme, options, 400, fontSize - 1);\n ctx.fillStyle = muted;\n ctx.textBaseline = \"middle\";\n shownCols.forEach((c, j) => {\n ctx.textAlign = j === 0 ? \"left\" : \"right\";\n ctx.fillText(l[c], colX[j]!, rh / 2 + 1);\n });\n }\n\n // rows\n for (const row of rows) {\n const color = row.side === \"bid\" ? colors.up : colors.down;\n const key = `${row.side}:${row.price}`;\n const large = row.size >= threshold;\n // hover band (cumulative selection)\n if (hovered && hovered.side === row.side && row.index <= hovered.index) {\n ctx.fillStyle = toCss(theme.text, row === hovered ? 0.09 : 0.045);\n ctx.fillRect(0, row.y, width, rh);\n }\n // depth bar\n if (barsMode !== \"none\" && barMax > 0) {\n const value = barsMode === \"level\" ? row.size : row.sum;\n const w = (value / barMax) * width;\n ctx.fillStyle = toCss(color, 0.14);\n ctx.fillRect(width - w, row.y + 1, w, rh - 2);\n }\n if (large) {\n ctx.fillStyle = toCss(color, 0.16);\n ctx.fillRect(0, row.y + 1, width, rh - 2);\n ctx.fillStyle = toCss(color);\n ctx.fillRect(0, row.y + 2, 3, rh - 4);\n }\n // flash: behind the size that changed (a whole-row flash makes a\n // ladder at 200 updates/s flicker)\n const f = flashes.get(key);\n let flashAlpha = 0;\n if (flash && f && Number.isFinite(f.at)) {\n const age = (now - f.at) / duration;\n if (age < 1) {\n flashAlpha = (1 - age) * (1 - age);\n animating = true;\n }\n }\n // texts\n ctx.textBaseline = \"middle\";\n const ty = row.y + rh / 2 + 0.5;\n shownCols.forEach((c, j) => {\n ctx.textAlign = j === 0 ? \"left\" : \"right\";\n if (c === \"price\") {\n ctx.font = fontOf(theme, options, 500, fontSize);\n ctx.fillStyle = toCss(color);\n ctx.fillText(\n fmt.price(row.price),\n colX[j]! + (large && j === 0 ? 4 : 0),\n ty,\n );\n } else if (c === \"size\") {\n ctx.font = fontOf(theme, options, large ? 700 : 400, fontSize);\n const label = fmt.size(row.size);\n if (flashAlpha > 0 && f) {\n const w = ctx.measureText(label).width + 10;\n const x = j === 0 ? colX[j]! - 5 : colX[j]! - w + 5;\n ctx.fillStyle = toCss(\n f.grew ? color : theme.textMuted,\n (f.grew ? 0.45 : 0.3) * flashAlpha,\n );\n roundRect(ctx, x, row.y + 2, w, rh - 4, 3);\n ctx.fill();\n }\n ctx.fillStyle = text;\n ctx.fillText(label, colX[j]!, ty);\n } else {\n ctx.font = fontOf(theme, options, 400, fontSize);\n ctx.fillStyle = muted;\n ctx.fillText(\n options.total === \"quote\"\n ? fmt.notional(row.notional)\n : fmt.total(row.sum),\n colX[j]!,\n ty,\n );\n }\n });\n }\n if (hovered) {\n // edge of the selection\n ctx.strokeStyle = toCss(theme.textMuted, 0.7);\n ctx.setLineDash([3, 3]);\n ctx.beginPath();\n const edge =\n hovered.side === \"bid\" ? hovered.y + rh - 0.5 : hovered.y + 0.5;\n ctx.moveTo(0, edge);\n ctx.lineTo(width, edge);\n ctx.stroke();\n ctx.setLineDash([]);\n }\n\n // spread row\n if (spreadH) {\n const mid = store.mid();\n const shown = lastPrice ?? mid;\n if (Number.isFinite(shown) && shown !== previousLast) {\n if (Number.isFinite(previousLast))\n lastDirection =\n shown > previousLast\n ? 1\n : shown < previousLast\n ? -1\n : lastDirection;\n previousLast = shown;\n }\n const sy = spreadTop;\n ctx.fillStyle = toCss(theme.text, 0.035);\n ctx.fillRect(0, sy, width, spreadH);\n ctx.strokeStyle = toCss(theme.grid);\n ctx.beginPath();\n ctx.moveTo(0, Math.round(sy) + 0.5);\n ctx.lineTo(width, Math.round(sy) + 0.5);\n ctx.moveTo(0, Math.round(sy + spreadH) - 0.5);\n ctx.lineTo(width, Math.round(sy + spreadH) - 0.5);\n ctx.stroke();\n const dirColor =\n lastDirection > 0\n ? colors.up\n : lastDirection < 0\n ? colors.down\n : theme.text;\n const cy = sy + spreadH / 2 + 0.5;\n ctx.textBaseline = \"middle\";\n ctx.textAlign = \"left\";\n ctx.font = fontOf(theme, options, 700, fontSize + (compact ? 2 : 4));\n ctx.fillStyle = toCss(dirColor);\n const priceText = finePrice(shown);\n ctx.fillText(priceText, pad, cy);\n let x = pad + ctx.measureText(priceText).width + 6;\n if (lastDirection !== 0) {\n // arrow of the last move\n const s = compact ? 4 : 5;\n ctx.beginPath();\n if (lastDirection > 0) {\n ctx.moveTo(x, cy + s * 0.6);\n ctx.lineTo(x + s, cy - s * 0.7);\n ctx.lineTo(x + s * 2, cy + s * 0.6);\n } else {\n ctx.moveTo(x, cy - s * 0.6);\n ctx.lineTo(x + s, cy + s * 0.7);\n ctx.lineTo(x + s * 2, cy - s * 0.6);\n }\n ctx.closePath();\n ctx.fill();\n x += s * 2 + 6;\n }\n const spread = store.spread();\n if (Number.isFinite(spread)) {\n ctx.textAlign = \"right\";\n ctx.font = fontOf(theme, options, 400, fontSize - 1);\n const bps = (spread / mid) * 1e4;\n const right = `${finePrice(spread)} · ${fmt.fixed(bps, bps < 10 ? 2 : 1)} ${l.basisPoints}`;\n ctx.fillStyle = text;\n ctx.fillText(right, width - pad, cy);\n if (!compact) {\n const rw = ctx.measureText(right).width;\n ctx.fillStyle = muted;\n const label = `${l.spread}`;\n if (width - pad - rw - 8 - ctx.measureText(label).width > x)\n ctx.fillText(label, width - pad - rw - 8, cy);\n }\n }\n }\n\n // imbalance bar\n if (imbalanceH) {\n let bidSum = 0;\n let askSum = 0;\n for (const r of bids) bidSum += r.size;\n for (const r of asks) askSum += r.size;\n const all = bidSum + askSum;\n const share = all > 0 ? bidSum / all : 0.5;\n const by = height - imbalanceH + 6;\n const bh = imbalanceH - 10;\n const bw = width - pad * 2;\n const split = pad + bw * share;\n ctx.save();\n roundRect(ctx, pad, by, bw, bh, 3);\n ctx.clip();\n ctx.fillStyle = toCss(colors.up, 0.22);\n ctx.fillRect(pad, by, split - pad, bh);\n ctx.fillStyle = toCss(colors.down, 0.22);\n ctx.fillRect(split, by, pad + bw - split, bh);\n ctx.restore();\n ctx.fillStyle = toCss(theme.background);\n ctx.fillRect(split - 1, by, 2, bh);\n ctx.font = fontOf(theme, options, 600, fontSize - 1);\n ctx.textBaseline = \"middle\";\n ctx.textAlign = \"left\";\n ctx.fillStyle = toCss(colors.up);\n const mid = by + bh / 2 + 0.5;\n ctx.fillText(\n `${l.buyShare} ${fmt.percent(share, 1, false)}`,\n pad + 6,\n mid,\n );\n ctx.textAlign = \"right\";\n ctx.fillStyle = toCss(colors.down);\n ctx.fillText(\n `${fmt.percent(1 - share, 1, false)} ${l.sellShare}`,\n pad + bw - 6,\n mid,\n );\n }\n\n // tooltip and hover event\n if (hovered && options.tooltip !== false) {\n const color = hovered.side === \"bid\" ? colors.up : colors.down;\n tooltipHtml(\n doc,\n host.tooltip,\n { text: fmt.price(hovered.price), color: toCss(color) },\n [\n [l.average, finePrice(hovered.average)],\n [l.sum, fmt.total(hovered.sum)],\n [l.notional, fmt.notional(hovered.notional)],\n ],\n );\n host.tooltip.style.display = \"block\";\n const ax = hoverAt ? hoverAt[0] : width * 0.4;\n host.placeTooltip(\n host.tooltip,\n ax,\n hovered.y + rh / 2,\n ax > width / 2 ? \"left\" : \"right\",\n );\n } else {\n host.tooltip.style.display = \"none\";\n }\n const key = hovered\n ? `${hovered.side}|${hovered.index}|${hovered.price}|${hovered.size}|${hovered.sum}`\n : \"\";\n if (key !== hoverKey) {\n hoverKey = key;\n emitter.emit(\"hover\", hovered ? toEvent(hovered) : null);\n }\n\n const bb = store.bestBid();\n const ba = store.bestAsk();\n host.describe(\n `${options.ariaLabel ?? l.name}. ${l.bid} ${finePrice(bb)}, ${l.ask} ${finePrice(ba)}, ${l.spread} ${finePrice(ba - bb)}.`,\n );\n return animating;\n }\n\n const toEvent = (row: Row): OrderBookLevelEvent => ({\n side: row.side,\n index: row.index,\n price: row.price,\n size: row.size,\n sum: row.sum,\n notional: row.notional,\n average: row.average,\n });\n\n // ---------------------------------------------------------- interaction\n\n const onPointerMove = (event: PointerEvent) => {\n hoverAt = localPoint(root, event);\n keyRow = null;\n host.invalidate();\n };\n const onPointerLeave = () => {\n hoverAt = null;\n host.invalidate();\n };\n const onClick = (event: MouseEvent) => {\n const [x, y] = localPoint(root, event);\n const row = rows.find((r) => y >= r.y && y < r.y + rowHeight);\n if (row && x >= 0) emitter.emit(\"levelClick\", toEvent(row));\n };\n const onKeyDown = (event: KeyboardEvent) => {\n const order: { side: OrderBookSide; index: number }[] = [];\n const asks = rows.filter((r) => r.side === \"ask\");\n const bids = rows.filter((r) => r.side === \"bid\");\n for (let i = asks.length - 1; i >= 0; i--)\n order.push({ side: \"ask\", index: i });\n for (let i = 0; i < bids.length; i++) order.push({ side: \"bid\", index: i });\n if (!order.length) return;\n const current = keyRow\n ? order.findIndex(\n (o) => o.side === keyRow!.side && o.index === keyRow!.index,\n )\n : -1;\n switch (event.key) {\n case \"ArrowDown\":\n case \"ArrowUp\": {\n const down = event.key === \"ArrowDown\";\n // first press: the best level on that side of the spread\n const next =\n current >= 0\n ? clamp(current + (down ? 1 : -1), 0, order.length - 1)\n : down\n ? Math.min(asks.length, order.length - 1)\n : Math.max(0, asks.length - 1);\n keyRow = order[next] ?? null;\n hoverAt = null;\n host.invalidate();\n break;\n }\n case \"Enter\":\n case \" \":\n if (hovered) emitter.emit(\"levelClick\", toEvent(hovered));\n break;\n case \"Escape\":\n keyRow = null;\n host.invalidate();\n break;\n default:\n return;\n }\n event.preventDefault();\n };\n const onBlur = () => {\n if (keyRow) {\n keyRow = null;\n host.invalidate();\n }\n };\n root.addEventListener(\"pointermove\", onPointerMove);\n root.addEventListener(\"pointerleave\", onPointerLeave);\n root.addEventListener(\"click\", onClick);\n root.addEventListener(\"keydown\", onKeyDown);\n root.addEventListener(\"blur\", onBlur);\n\n const changed = () => {\n if (!inferred && store.count(\"bid\") + store.count(\"ask\") > 0) {\n inferred = true;\n refreshFormat();\n }\n host.invalidate();\n };\n\n const instance: OrderBookInstance = {\n setBook(snapshot) {\n store.setSnapshot(snapshot);\n inferred = false;\n changed();\n },\n applyDeltas(deltas) {\n if (applyDeltas(store, deltas)) changed();\n },\n clear() {\n store.clear();\n inferred = false;\n flashes = new Map();\n drawn = false;\n host.invalidate();\n },\n setLastPrice(price) {\n lastPrice = price !== null && Number.isFinite(price) ? price : null;\n host.invalidate();\n },\n setOptions(next) {\n const regroup =\n (next.grouping ?? 0) !== (options.grouping ?? 0) ||\n next.mode !== options.mode;\n options = next;\n if (regroup) applyOptions();\n else {\n applyTexts();\n colors = sideColors(host.theme, options);\n refreshFormat();\n host.invalidate();\n }\n },\n getStore: () => store,\n on: (event, handler) => emitter.on(event, handler),\n resize() {\n host.invalidate();\n },\n destroy() {\n root.removeEventListener(\"pointermove\", onPointerMove);\n root.removeEventListener(\"pointerleave\", onPointerLeave);\n root.removeEventListener(\"click\", onClick);\n root.removeEventListener(\"keydown\", onKeyDown);\n root.removeEventListener(\"blur\", onBlur);\n emitter.clear();\n host.destroy();\n },\n };\n applyOptions();\n return instance;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ladder.cjs","names":["createOrderBookStore","createEmitter","createFormatters","localeLabels","createHost","sideColors","inferPriceDecimals","decimalsOf","inferSizeDecimals","numberFormat","toCss","fontOf","localPoint","clamp","applyDeltas","require_color","require_locale","require_book","require_format","require_host","LABELS","COLUMNS","createOrderBook","options","initial","store","emitter","fmt","finePrice","texts","inferred","colors","lastPrice","previousLast","lastDirection","flashes","shownRange","drawn","rows","hoverAt","keyRow","hoverKey","hovered","rowHeight","host","container","root","labels","refreshFormat","grouping","raw","fine","v","applyTexts","applyOptions","sideRows","side","out","sum","notional","i","count","p","price","s","size","draw","ctx","l","mode","compact","width","fontSize","rh","headerH","spreadH","imbalanceH","sides","avail","height","perSide","pad","dpr","asks","bids","y","asksTop","row","spreadY","bidsTop","spreadTop","cols","all","c","shownCols","n","inner","colX","j","barsMode","barMax","flash","duration","nextFlashes","animating","inside","range","key","previous","entry","now","prices","r","hx","hy","list","threshold","text","theme","muted","color","large","w","f","flashAlpha","age","ty","label","x","edge","mid","shown","sy","dirColor","cy","priceText","spread","bps","right","rw","bidSum","askSum","share","by","bh","bw","split","doc","ax","toEvent","bb","ba","onPointerMove","event","onPointerLeave","onClick","onKeyDown","order","current","o","down","onBlur","changed","snapshot","deltas","regroup","next","handler"],"sources":["../../../../../charts/src/engine/orderbook/ladder.ts"],"sourcesContent":["// createOrderBook: the price ladder (asks above the spread row, bids below)\n// drawn with Canvas2D. Any number of deltas between two frames cost one\n// draw of the visible rows; changed levels flash, walls stand out, hovering\n// sums the levels up to the pointer.\n\nimport { toCss, type Rgba } from \"../color\";\nimport {\n applyDeltas,\n createOrderBookStore,\n decimalsOf,\n inferPriceDecimals,\n inferSizeDecimals,\n} from \"./book\";\nimport {\n clamp,\n createFormatters,\n fontOf,\n numberFormat,\n roundRect,\n sideColors,\n type Formatters,\n} from \"./format\";\nimport { localeLabels, type LabelDictionary } from \"../locale\";\nimport { createEmitter, createHost, localPoint, tooltipHtml } from \"./host\";\nimport type {\n OrderBookEventMap,\n OrderBookInstance,\n OrderBookLabels,\n OrderBookLevelEvent,\n OrderBookOptions,\n OrderBookSide,\n} from \"./types\";\n\nconst LABELS: LabelDictionary<OrderBookLabels> = {\n en: {\n price: \"Price\",\n size: \"Size\",\n total: \"Total\",\n spread: \"Spread\",\n average: \"Avg. price\",\n sum: \"Sum\",\n notional: \"Notional\",\n buyShare: \"B\",\n sellShare: \"S\",\n bid: \"Bid\",\n ask: \"Ask\",\n basisPoints: \"bp\",\n name: \"Order book\",\n },\n zh: {\n price: \"价格\",\n size: \"数量\",\n total: \"累计\",\n spread: \"价差\",\n average: \"均价\",\n sum: \"累计数量\",\n notional: \"累计金额\",\n buyShare: \"买\",\n sellShare: \"卖\",\n bid: \"买一\",\n ask: \"卖一\",\n basisPoints: \"基点\",\n name: \"订单簿\",\n },\n ja: {\n price: \"価格\",\n size: \"数量\",\n total: \"累計\",\n spread: \"スプレッド\",\n average: \"平均価格\",\n sum: \"累計数量\",\n notional: \"累計金額\",\n buyShare: \"買\",\n sellShare: \"売\",\n bid: \"最良買気配\",\n ask: \"最良売気配\",\n basisPoints: \"bp\",\n name: \"板情報\",\n },\n fr: {\n price: \"Prix\",\n size: \"Quantité\",\n total: \"Cumul\",\n spread: \"Écart\",\n average: \"Prix moyen\",\n sum: \"Somme\",\n notional: \"Montant\",\n buyShare: \"A\",\n sellShare: \"V\",\n bid: \"Meilleur achat\",\n ask: \"Meilleure vente\",\n basisPoints: \"pb\",\n name: \"Carnet d’ordres\",\n },\n};\n\nconst COLUMNS = [\"price\", \"size\", \"total\"] as const;\n\ninterface Row extends OrderBookLevelEvent {\n /** Top of the row, CSS pixels */\n y: number;\n}\n\ninterface Flash {\n size: number;\n at: number;\n grew: boolean;\n}\n\n/**\n * Creates an order book ladder in `container`: asks, spread row and bids\n * with depth bars, grouping, flashes on changes and a hover summary.\n */\nexport const createOrderBook = (\n container: HTMLElement,\n initial: OrderBookOptions = {},\n): OrderBookInstance => {\n let options = initial;\n const store = createOrderBookStore();\n const emitter = createEmitter<OrderBookEventMap>();\n let fmt: Formatters = createFormatters(options, 2, 4);\n let finePrice = fmt.price;\n /** Texts in the locale, resolved on every option update */\n let texts = localeLabels(LABELS, options.locale, options.labels);\n let inferred = false;\n let colors = { up: [0, 0, 0, 1] as Rgba, down: [0, 0, 0, 1] as Rgba };\n let lastPrice: number | null = null;\n let previousLast = NaN;\n let lastDirection = 0;\n let flashes = new Map<string, Flash>();\n /** Price range of the rows of the previous frame, per side */\n const shownRange: Record<OrderBookSide, [number, number]> = {\n bid: [NaN, NaN],\n ask: [NaN, NaN],\n };\n let drawn = false;\n let rows: Row[] = [];\n let hoverAt: [number, number] | null = null;\n /** Keyboard selection: side and index from the spread */\n let keyRow: { side: OrderBookSide; index: number } | null = null;\n let hoverKey = \"\";\n let hovered: Row | null = null;\n let rowHeight = 20;\n\n const host = createHost(container, {\n className: \"minerva-order-book\",\n draw,\n onTheme: () => {\n colors = sideColors(host.theme, options);\n },\n });\n const { root, doc } = host;\n root.tabIndex = 0;\n root.setAttribute(\"role\", \"figure\");\n root.style.cursor = \"default\";\n\n const labels = () => texts;\n\n const refreshFormat = () => {\n const grouping = options.grouping ?? 0;\n const raw = inferPriceDecimals(store);\n fmt = createFormatters(\n options,\n grouping > 0 ? Math.max(decimalsOf(grouping), 0) : raw,\n inferSizeDecimals(store),\n );\n // the spread row keeps the raw tick precision (a 0.1 spread is not \"0\")\n const fine = numberFormat(\n options.locale,\n Math.max(fmt.priceDecimals, options.grouping ? raw : 0),\n );\n finePrice = options.formatPrice\n ? fmt.price\n : (v) => (Number.isFinite(v) ? fine.format(v) : \"–\");\n };\n\n const applyTexts = () => {\n texts = localeLabels(LABELS, options.locale, options.labels);\n root.setAttribute(\"aria-label\", options.ariaLabel ?? texts.name);\n };\n\n const applyOptions = () => {\n applyTexts();\n colors = sideColors(host.theme, options);\n refreshFormat();\n // grouping changes the rows: no flash for the new buckets\n flashes = new Map();\n drawn = false;\n host.invalidate();\n };\n\n /** Levels of a side with their cumulative values */\n const sideRows = (side: OrderBookSide, limit: number): Row[] => {\n const { price, size, count } = store.levels(side, {\n step: options.grouping ?? 0,\n limit,\n });\n const out: Row[] = [];\n let sum = 0;\n let notional = 0;\n for (let i = 0; i < count; i++) {\n const p = price[i]!;\n const s = size[i]!;\n sum += s;\n notional += s * p;\n out.push({\n side,\n index: i,\n price: p,\n size: s,\n sum,\n notional,\n average: notional / sum,\n y: 0,\n });\n }\n return out;\n };\n\n function draw(now: number): boolean {\n const ctx = host.ctx;\n if (!ctx) return false;\n const { width, height, dpr, theme } = host;\n const l = labels();\n const mode = options.mode ?? \"both\";\n const compact = width < 260;\n const fontSize = options.fontSize ?? (compact ? 11 : 12);\n const rh = (rowHeight = Math.max(\n 12,\n options.rowHeight ?? (compact ? 18 : 20),\n ));\n const headerH = options.header === false ? 0 : rh + 2;\n const spreadH = options.spreadRow === false ? 0 : Math.round(rh * 1.7);\n const imbalanceH = options.imbalance === false ? 0 : 24;\n const sides = mode === \"both\" ? 2 : 1;\n const avail = Math.max(0, height - headerH - spreadH - imbalanceH);\n const perSide = Math.max(0, options.rows ?? Math.floor(avail / rh / sides));\n const pad = compact ? 6 : 10;\n\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, width, height);\n\n const asks = mode === \"bids\" ? [] : sideRows(\"ask\", perSide);\n const bids = mode === \"asks\" ? [] : sideRows(\"bid\", perSide);\n\n // vertical layout\n let y = headerH;\n const asksTop = y;\n if (mode !== \"bids\") {\n for (const row of asks) row.y = asksTop + (perSide - 1 - row.index) * rh;\n y += perSide * rh;\n }\n const spreadY = mode === \"bids\" ? headerH : y;\n if (mode !== \"bids\") y += spreadH;\n else y = headerH + spreadH;\n const bidsTop = y;\n for (const row of bids) row.y = bidsTop + row.index * rh;\n rows = [...asks, ...bids];\n const spreadTop = mode === \"asks\" ? asksTop + perSide * rh : spreadY;\n\n // columns\n const cols = (options.columns ?? COLUMNS).filter(\n (c, i, all) => all.indexOf(c) === i,\n );\n const shownCols = compact && cols.length > 2 ? cols.slice(0, 2) : cols;\n const n = shownCols.length;\n const inner = width - pad * 2;\n const colX = shownCols.map((_, j) =>\n j === 0\n ? pad\n : pad + inner * (j === n - 1 ? 1 : 0.24 + (0.76 * j) / (n - 1)),\n );\n\n // depth bar scale\n const barsMode = options.depthBars ?? \"cumulative\";\n let barMax = 0;\n for (const row of rows) {\n barMax = Math.max(barMax, barsMode === \"level\" ? row.size : row.sum);\n }\n\n // flashes: compare with the sizes of the previous frame\n const flash = options.flash !== false;\n const duration = Math.max(1, options.flashDuration ?? 450);\n const nextFlashes = new Map<string, Flash>();\n let animating = false;\n const inside = (row: Row) => {\n const range = shownRange[row.side];\n return drawn && row.price > range[0] && row.price < range[1];\n };\n for (const row of rows) {\n const key = `${row.side}:${row.price}`;\n const previous = flashes.get(key);\n let entry: Flash;\n // a level scrolling into view is not new: only levels appearing\n // between the rows already shown flash\n if (!previous)\n entry = {\n size: row.size,\n at: inside(row) ? now : -Infinity,\n grew: true,\n };\n else if (previous.size !== row.size)\n entry = { size: row.size, at: now, grew: row.size > previous.size };\n else entry = previous;\n nextFlashes.set(key, entry);\n }\n flashes = nextFlashes;\n drawn = true;\n for (const side of [\"bid\", \"ask\"] as const) {\n const list = side === \"bid\" ? bids : asks;\n const prices = list.map((r) => r.price);\n shownRange[side] = prices.length\n ? [Math.min(...prices), Math.max(...prices)]\n : [NaN, NaN];\n }\n\n // hover: rows from the spread to the hovered one\n hovered = null;\n if (hoverAt) {\n const [hx, hy] = hoverAt;\n if (hx >= 0 && hx <= width)\n hovered = rows.find((r) => hy >= r.y && hy < r.y + rh) ?? null;\n } else if (keyRow) {\n const list = keyRow.side === \"ask\" ? asks : bids;\n hovered = list[Math.min(keyRow.index, list.length - 1)] ?? null;\n }\n\n const threshold = options.largeOrderThreshold ?? Infinity;\n const text = toCss(theme.text);\n const muted = toCss(theme.textMuted);\n\n // header\n if (headerH) {\n ctx.font = fontOf(theme, options, 400, fontSize - 1);\n ctx.fillStyle = muted;\n ctx.textBaseline = \"middle\";\n shownCols.forEach((c, j) => {\n ctx.textAlign = j === 0 ? \"left\" : \"right\";\n ctx.fillText(l[c], colX[j]!, rh / 2 + 1);\n });\n }\n\n // rows\n for (const row of rows) {\n const color = row.side === \"bid\" ? colors.up : colors.down;\n const key = `${row.side}:${row.price}`;\n const large = row.size >= threshold;\n // hover band (cumulative selection)\n if (hovered && hovered.side === row.side && row.index <= hovered.index) {\n ctx.fillStyle = toCss(theme.text, row === hovered ? 0.09 : 0.045);\n ctx.fillRect(0, row.y, width, rh);\n }\n // depth bar\n if (barsMode !== \"none\" && barMax > 0) {\n const value = barsMode === \"level\" ? row.size : row.sum;\n const w = (value / barMax) * width;\n ctx.fillStyle = toCss(color, 0.14);\n ctx.fillRect(width - w, row.y + 1, w, rh - 2);\n }\n if (large) {\n ctx.fillStyle = toCss(color, 0.16);\n ctx.fillRect(0, row.y + 1, width, rh - 2);\n // a small dot in the left padding marks the large level (no accent bar)\n ctx.fillStyle = toCss(color);\n ctx.beginPath();\n ctx.arc(\n pad / 2,\n row.y + rh / 2,\n Math.min(2.5, pad / 2 - 1),\n 0,\n Math.PI * 2,\n );\n ctx.fill();\n }\n // flash: behind the size that changed (a whole-row flash makes a\n // ladder at 200 updates/s flicker)\n const f = flashes.get(key);\n let flashAlpha = 0;\n if (flash && f && Number.isFinite(f.at)) {\n const age = (now - f.at) / duration;\n if (age < 1) {\n flashAlpha = (1 - age) * (1 - age);\n animating = true;\n }\n }\n // texts\n ctx.textBaseline = \"middle\";\n const ty = row.y + rh / 2 + 0.5;\n shownCols.forEach((c, j) => {\n ctx.textAlign = j === 0 ? \"left\" : \"right\";\n if (c === \"price\") {\n ctx.font = fontOf(theme, options, 500, fontSize);\n ctx.fillStyle = toCss(color);\n ctx.fillText(\n fmt.price(row.price),\n colX[j]! + (large && j === 0 ? 4 : 0),\n ty,\n );\n } else if (c === \"size\") {\n ctx.font = fontOf(theme, options, large ? 700 : 400, fontSize);\n const label = fmt.size(row.size);\n if (flashAlpha > 0 && f) {\n const w = ctx.measureText(label).width + 10;\n const x = j === 0 ? colX[j]! - 5 : colX[j]! - w + 5;\n ctx.fillStyle = toCss(\n f.grew ? color : theme.textMuted,\n (f.grew ? 0.45 : 0.3) * flashAlpha,\n );\n roundRect(ctx, x, row.y + 2, w, rh - 4, 3);\n ctx.fill();\n }\n ctx.fillStyle = text;\n ctx.fillText(label, colX[j]!, ty);\n } else {\n ctx.font = fontOf(theme, options, 400, fontSize);\n ctx.fillStyle = muted;\n ctx.fillText(\n options.total === \"quote\"\n ? fmt.notional(row.notional)\n : fmt.total(row.sum),\n colX[j]!,\n ty,\n );\n }\n });\n }\n if (hovered) {\n // edge of the selection\n ctx.strokeStyle = toCss(theme.textMuted, 0.7);\n ctx.setLineDash([3, 3]);\n ctx.beginPath();\n const edge =\n hovered.side === \"bid\" ? hovered.y + rh - 0.5 : hovered.y + 0.5;\n ctx.moveTo(0, edge);\n ctx.lineTo(width, edge);\n ctx.stroke();\n ctx.setLineDash([]);\n }\n\n // spread row\n if (spreadH) {\n const mid = store.mid();\n const shown = lastPrice ?? mid;\n if (Number.isFinite(shown) && shown !== previousLast) {\n if (Number.isFinite(previousLast))\n lastDirection =\n shown > previousLast\n ? 1\n : shown < previousLast\n ? -1\n : lastDirection;\n previousLast = shown;\n }\n const sy = spreadTop;\n ctx.fillStyle = toCss(theme.text, 0.035);\n ctx.fillRect(0, sy, width, spreadH);\n ctx.strokeStyle = toCss(theme.grid);\n ctx.beginPath();\n ctx.moveTo(0, Math.round(sy) + 0.5);\n ctx.lineTo(width, Math.round(sy) + 0.5);\n ctx.moveTo(0, Math.round(sy + spreadH) - 0.5);\n ctx.lineTo(width, Math.round(sy + spreadH) - 0.5);\n ctx.stroke();\n const dirColor =\n lastDirection > 0\n ? colors.up\n : lastDirection < 0\n ? colors.down\n : theme.text;\n const cy = sy + spreadH / 2 + 0.5;\n ctx.textBaseline = \"middle\";\n ctx.textAlign = \"left\";\n ctx.font = fontOf(theme, options, 700, fontSize + (compact ? 2 : 4));\n ctx.fillStyle = toCss(dirColor);\n const priceText = finePrice(shown);\n ctx.fillText(priceText, pad, cy);\n let x = pad + ctx.measureText(priceText).width + 6;\n if (lastDirection !== 0) {\n // arrow of the last move\n const s = compact ? 4 : 5;\n ctx.beginPath();\n if (lastDirection > 0) {\n ctx.moveTo(x, cy + s * 0.6);\n ctx.lineTo(x + s, cy - s * 0.7);\n ctx.lineTo(x + s * 2, cy + s * 0.6);\n } else {\n ctx.moveTo(x, cy - s * 0.6);\n ctx.lineTo(x + s, cy + s * 0.7);\n ctx.lineTo(x + s * 2, cy - s * 0.6);\n }\n ctx.closePath();\n ctx.fill();\n x += s * 2 + 6;\n }\n const spread = store.spread();\n if (Number.isFinite(spread)) {\n ctx.textAlign = \"right\";\n ctx.font = fontOf(theme, options, 400, fontSize - 1);\n const bps = (spread / mid) * 1e4;\n const right = `${finePrice(spread)} · ${fmt.fixed(bps, bps < 10 ? 2 : 1)} ${l.basisPoints}`;\n ctx.fillStyle = text;\n ctx.fillText(right, width - pad, cy);\n if (!compact) {\n const rw = ctx.measureText(right).width;\n ctx.fillStyle = muted;\n const label = `${l.spread}`;\n if (width - pad - rw - 8 - ctx.measureText(label).width > x)\n ctx.fillText(label, width - pad - rw - 8, cy);\n }\n }\n }\n\n // imbalance bar\n if (imbalanceH) {\n let bidSum = 0;\n let askSum = 0;\n for (const r of bids) bidSum += r.size;\n for (const r of asks) askSum += r.size;\n const all = bidSum + askSum;\n const share = all > 0 ? bidSum / all : 0.5;\n const by = height - imbalanceH + 6;\n const bh = imbalanceH - 10;\n const bw = width - pad * 2;\n const split = pad + bw * share;\n ctx.save();\n roundRect(ctx, pad, by, bw, bh, 3);\n ctx.clip();\n ctx.fillStyle = toCss(colors.up, 0.22);\n ctx.fillRect(pad, by, split - pad, bh);\n ctx.fillStyle = toCss(colors.down, 0.22);\n ctx.fillRect(split, by, pad + bw - split, bh);\n ctx.restore();\n ctx.fillStyle = toCss(theme.background);\n ctx.fillRect(split - 1, by, 2, bh);\n ctx.font = fontOf(theme, options, 600, fontSize - 1);\n ctx.textBaseline = \"middle\";\n ctx.textAlign = \"left\";\n ctx.fillStyle = toCss(colors.up);\n const mid = by + bh / 2 + 0.5;\n ctx.fillText(\n `${l.buyShare} ${fmt.percent(share, 1, false)}`,\n pad + 6,\n mid,\n );\n ctx.textAlign = \"right\";\n ctx.fillStyle = toCss(colors.down);\n ctx.fillText(\n `${fmt.percent(1 - share, 1, false)} ${l.sellShare}`,\n pad + bw - 6,\n mid,\n );\n }\n\n // tooltip and hover event\n if (hovered && options.tooltip !== false) {\n const color = hovered.side === \"bid\" ? colors.up : colors.down;\n tooltipHtml(\n doc,\n host.tooltip,\n { text: fmt.price(hovered.price), color: toCss(color) },\n [\n [l.average, finePrice(hovered.average)],\n [l.sum, fmt.total(hovered.sum)],\n [l.notional, fmt.notional(hovered.notional)],\n ],\n );\n host.tooltip.style.display = \"block\";\n const ax = hoverAt ? hoverAt[0] : width * 0.4;\n host.placeTooltip(\n host.tooltip,\n ax,\n hovered.y + rh / 2,\n ax > width / 2 ? \"left\" : \"right\",\n );\n } else {\n host.tooltip.style.display = \"none\";\n }\n const key = hovered\n ? `${hovered.side}|${hovered.index}|${hovered.price}|${hovered.size}|${hovered.sum}`\n : \"\";\n if (key !== hoverKey) {\n hoverKey = key;\n emitter.emit(\"hover\", hovered ? toEvent(hovered) : null);\n }\n\n const bb = store.bestBid();\n const ba = store.bestAsk();\n host.describe(\n `${options.ariaLabel ?? l.name}. ${l.bid} ${finePrice(bb)}, ${l.ask} ${finePrice(ba)}, ${l.spread} ${finePrice(ba - bb)}.`,\n );\n return animating;\n }\n\n const toEvent = (row: Row): OrderBookLevelEvent => ({\n side: row.side,\n index: row.index,\n price: row.price,\n size: row.size,\n sum: row.sum,\n notional: row.notional,\n average: row.average,\n });\n\n // ---------------------------------------------------------- interaction\n\n const onPointerMove = (event: PointerEvent) => {\n hoverAt = localPoint(root, event);\n keyRow = null;\n host.invalidate();\n };\n const onPointerLeave = () => {\n hoverAt = null;\n host.invalidate();\n };\n const onClick = (event: MouseEvent) => {\n const [x, y] = localPoint(root, event);\n const row = rows.find((r) => y >= r.y && y < r.y + rowHeight);\n if (row && x >= 0) emitter.emit(\"levelClick\", toEvent(row));\n };\n const onKeyDown = (event: KeyboardEvent) => {\n const order: { side: OrderBookSide; index: number }[] = [];\n const asks = rows.filter((r) => r.side === \"ask\");\n const bids = rows.filter((r) => r.side === \"bid\");\n for (let i = asks.length - 1; i >= 0; i--)\n order.push({ side: \"ask\", index: i });\n for (let i = 0; i < bids.length; i++) order.push({ side: \"bid\", index: i });\n if (!order.length) return;\n const current = keyRow\n ? order.findIndex(\n (o) => o.side === keyRow!.side && o.index === keyRow!.index,\n )\n : -1;\n switch (event.key) {\n case \"ArrowDown\":\n case \"ArrowUp\": {\n const down = event.key === \"ArrowDown\";\n // first press: the best level on that side of the spread\n const next =\n current >= 0\n ? clamp(current + (down ? 1 : -1), 0, order.length - 1)\n : down\n ? Math.min(asks.length, order.length - 1)\n : Math.max(0, asks.length - 1);\n keyRow = order[next] ?? null;\n hoverAt = null;\n host.invalidate();\n break;\n }\n case \"Enter\":\n case \" \":\n if (hovered) emitter.emit(\"levelClick\", toEvent(hovered));\n break;\n case \"Escape\":\n keyRow = null;\n host.invalidate();\n break;\n default:\n return;\n }\n event.preventDefault();\n };\n const onBlur = () => {\n if (keyRow) {\n keyRow = null;\n host.invalidate();\n }\n };\n root.addEventListener(\"pointermove\", onPointerMove);\n root.addEventListener(\"pointerleave\", onPointerLeave);\n root.addEventListener(\"click\", onClick);\n root.addEventListener(\"keydown\", onKeyDown);\n root.addEventListener(\"blur\", onBlur);\n\n const changed = () => {\n if (!inferred && store.count(\"bid\") + store.count(\"ask\") > 0) {\n inferred = true;\n refreshFormat();\n }\n host.invalidate();\n };\n\n const instance: OrderBookInstance = {\n setBook(snapshot) {\n store.setSnapshot(snapshot);\n inferred = false;\n changed();\n },\n applyDeltas(deltas) {\n if (applyDeltas(store, deltas)) changed();\n },\n clear() {\n store.clear();\n inferred = false;\n flashes = new Map();\n drawn = false;\n host.invalidate();\n },\n setLastPrice(price) {\n lastPrice = price !== null && Number.isFinite(price) ? price : null;\n host.invalidate();\n },\n setOptions(next) {\n const regroup =\n (next.grouping ?? 0) !== (options.grouping ?? 0) ||\n next.mode !== options.mode;\n options = next;\n if (regroup) applyOptions();\n else {\n applyTexts();\n colors = sideColors(host.theme, options);\n refreshFormat();\n host.invalidate();\n }\n },\n getStore: () => store,\n on: (event, handler) => emitter.on(event, handler),\n resize() {\n host.invalidate();\n },\n destroy() {\n root.removeEventListener(\"pointermove\", onPointerMove);\n root.removeEventListener(\"pointerleave\", onPointerLeave);\n root.removeEventListener(\"click\", onClick);\n root.removeEventListener(\"keydown\", onKeyDown);\n root.removeEventListener(\"blur\", onBlur);\n emitter.clear();\n host.destroy();\n },\n };\n applyOptions();\n return instance;\n};\n"],"mappings":"qIAiCA,IAAMoB,EAA2C,CAC/C,GAAI,CACF,MAAO,QACP,KAAM,OACN,MAAO,QACP,OAAQ,SACR,QAAS,aACT,IAAK,MACL,SAAU,WACV,SAAU,IACV,UAAW,IACX,IAAK,MACL,IAAK,MACL,YAAa,KACb,KAAM,YACR,EACA,GAAI,CACF,MAAO,KACP,KAAM,KACN,MAAO,KACP,OAAQ,KACR,QAAS,KACT,IAAK,OACL,SAAU,OACV,SAAU,IACV,UAAW,IACX,IAAK,KACL,IAAK,KACL,YAAa,KACb,KAAM,KACR,EACA,GAAI,CACF,MAAO,KACP,KAAM,KACN,MAAO,KACP,OAAQ,QACR,QAAS,OACT,IAAK,OACL,SAAU,OACV,SAAU,IACV,UAAW,IACX,IAAK,QACL,IAAK,QACL,YAAa,KACb,KAAM,KACR,EACA,GAAI,CACF,MAAO,OACP,KAAM,WACN,MAAO,QACP,OAAQ,QACR,QAAS,aACT,IAAK,QACL,SAAU,UACV,SAAU,IACV,UAAW,IACX,IAAK,iBACL,IAAK,kBACL,YAAa,KACb,KAAM,iBACR,CACF,EAEMC,EAAU,CAAC,QAAS,OAAQ,OAAO,EAiB5BC,GACX,EACA,EAA4B,CAAC,IACP,CACtB,IAAIC,EAAUC,EACRC,EAAQzB,EAAAA,qBAAqB,EAC7B0B,EAAUzB,EAAAA,cAAiC,EAC7C0B,EAAkBzB,EAAAA,iBAAiBqB,EAAS,EAAG,CAAC,EAChDK,EAAYD,EAAI,MAEhBE,EAAQ1B,EAAAA,aAAaiB,EAAQG,EAAQ,OAAQA,EAAQ,MAAM,EAC3DO,EAAW,GACXC,EAAS,CAAE,GAAI,CAAC,EAAG,EAAG,EAAG,CAAC,EAAW,KAAM,CAAC,EAAG,EAAG,EAAG,CAAC,CAAU,EAChEC,EAA2B,KAC3BC,EAAe,IACfC,EAAgB,EAChBC,EAAU,IAAI,IAEZC,EAAsD,CAC1D,IAAK,CAAC,IAAK,GAAG,EACd,IAAK,CAAC,IAAK,GAAG,CAChB,EACIC,EAAQ,GACRC,EAAc,CAAC,EACfC,EAAmC,KAEnCC,EAAwD,KACxDC,EAAW,GACXC,EAAsB,KACtBC,EAAY,GAEVC,EAAOxC,EAAAA,WAAWyC,EAAW,CACjC,UAAW,qBACX,OACA,YAAe,CACb,EAASxC,EAAAA,WAAWuC,EAAK,MAAOrB,CAAO,CACzC,CACF,CAAC,EACK,CAAE,OAAM,QAAQqB,EACtB,EAAK,SAAW,EAChBE,EAAK,aAAa,OAAQ,QAAQ,EAClC,EAAK,MAAM,OAAS,UAEpB,IAAMC,OAAelB,EAEfmB,MAAsB,CAC1B,IAAMC,EAAW1B,EAAQ,UAAY,EAC/B2B,EAAM5C,EAAAA,mBAAmBmB,CAAK,EACpC,EAAMvB,EAAAA,iBACJqB,EACA0B,EAAW,EAAI,KAAK,IAAI1C,EAAAA,WAAW0C,CAAQ,EAAG,CAAC,EAAIC,EACnD1C,EAAAA,kBAAkBiB,CAAK,CACzB,EAEA,IAAM0B,EAAO1C,EAAAA,aACXc,EAAQ,OACR,KAAK,IAAII,EAAI,cAAeJ,EAAQ,SAAW2B,EAAM,CAAC,CACxD,EACA,EAAY3B,EAAQ,YAChBI,EAAI,MACH,GAAO,OAAO,SAASyB,CAAC,EAAID,EAAK,OAAOC,CAAC,EAAI,GACpD,EAEMC,MAAmB,CACvB,EAAQlD,EAAAA,aAAaiB,EAAQG,EAAQ,OAAQA,EAAQ,MAAM,EAC3DuB,EAAK,aAAa,aAAcvB,EAAQ,WAAaM,EAAM,IAAI,CACjE,EAEMyB,MAAqB,CACzBD,EAAW,EACX,EAAShD,EAAAA,WAAWuC,EAAK,MAAOrB,CAAO,EACvCyB,EAAc,EAEd,EAAU,IAAI,IACd,EAAQ,GACRJ,EAAK,WAAW,CAClB,EAGMW,GAAY,EAAqB,IAAyB,CAC9D,GAAM,CAAE,QAAO,OAAM,SAAU9B,EAAM,OAAO+B,EAAM,CAChD,KAAMjC,EAAQ,UAAY,EAC1B,OACF,CAAC,EACKkC,EAAa,CAAC,EAChBC,EAAM,EACNC,EAAW,EACf,IAAK,IAAIC,EAAI,EAAGA,EAAIC,EAAO,IAAK,CAC9B,IAAMC,EAAIC,EAAMH,GACVI,EAAIC,EAAKL,GACf,GAAOI,EACP,GAAYA,EAAIF,EAChBL,EAAI,KAAK,CACP,OACA,MAAOG,EACP,MAAOE,EACP,KAAME,EACN,MACA,WACA,QAASL,EAAWD,EACpB,EAAG,CACL,CAAC,CACH,CACA,OAAOD,CACT,EAEA,SAASS,EAAK,EAAsB,CAClC,IAAMC,EAAMvB,EAAK,IACjB,GAAI,CAACuB,EAAK,MAAO,GACjB,GAAM,CAAE,QAAO,SAAQ,MAAK,SAAUvB,EAChCwB,EAAIrB,GAAO,EACXsB,EAAO9C,EAAQ,MAAQ,OACvB+C,EAAUC,EAAQ,IAClBC,EAAWjD,EAAQ,WAAa+C,EAAU,GAAK,IAC/CG,EAAM,EAAY,KAAK,IAC3B,GACAlD,EAAQ,YAAc+C,EAAU,GAAK,GACvC,EACMI,EAAUnD,EAAQ,SAAW,GAAQ,EAAIkD,EAAK,EAC9CE,EAAUpD,EAAQ,YAAc,GAAQ,EAAI,KAAK,MAAMkD,EAAK,GAAG,EAC/DG,EAAarD,EAAQ,YAAc,GAAQ,EAAI,GAC/CsD,EAAQR,IAAS,OAAS,EAAI,EAC9BS,EAAQ,KAAK,IAAI,EAAGC,EAASL,EAAUC,EAAUC,CAAU,EAC3DI,EAAU,KAAK,IAAI,EAAGzD,EAAQ,MAAQ,KAAK,MAAMuD,EAAQL,EAAKI,CAAK,CAAC,EACpEI,EAAMX,EAAU,EAAI,GAE1BH,EAAI,aAAae,EAAK,EAAG,EAAGA,EAAK,EAAG,CAAC,EACrCf,EAAI,UAAU,EAAG,EAAGI,EAAOQ,CAAM,EAEjC,IAAMI,EAAOd,IAAS,OAAS,CAAC,EAAId,EAAS,MAAOyB,CAAO,EACrDI,EAAOf,IAAS,OAAS,CAAC,EAAId,EAAS,MAAOyB,CAAO,EAGvDK,EAAIX,EACFY,EAAUD,EAChB,GAAIhB,IAAS,OAAQ,CACnB,IAAK,IAAMkB,KAAOJ,EAAM,EAAI,EAAIG,GAAWN,EAAU,EAAIO,EAAI,OAASd,EACtE,GAAKO,EAAUP,CACjB,CACA,IAAMe,GAAUnB,IAAS,OAASK,EAAUW,EACxChB,IAAS,OACR,EAAIK,EAAUC,EADE,GAAKA,EAE1B,IAAMc,GAAUJ,EAChB,IAAK,IAAME,KAAOH,EAAM,EAAI,EAAIK,GAAUF,EAAI,MAAQd,EACtD,EAAO,CAAC,GAAGU,EAAM,GAAGC,CAAI,EACxB,IAAMM,GAAYrB,IAAS,OAASiB,EAAUN,EAAUP,EAAKe,GAGvDG,GAAQpE,EAAQ,SAAWF,EAAA,CAAS,QACvC,EAAG,EAAG,IAAQuE,EAAI,QAAQC,CAAC,IAAMjC,CACpC,EACMkC,EAAYxB,GAAWqB,EAAK,OAAS,EAAIA,EAAK,MAAM,EAAG,CAAC,EAAIA,EAC5DI,EAAID,EAAU,OACdE,GAAQzB,EAAQU,EAAM,EACtBgB,EAAOH,EAAU,KAAK,EAAG,IAC7BI,IAAM,EACFjB,EACAA,EAAMe,IAASE,IAAMH,EAAI,EAAI,EAAI,IAAQ,IAAOG,GAAMH,EAAI,GAChE,EAGMI,EAAW5E,EAAQ,WAAa,aAClC6E,EAAS,EACb,IAAK,IAAMb,KAAOjD,EAChB,EAAS,KAAK,IAAI8D,EAAQD,IAAa,QAAUZ,EAAI,KAAOA,EAAI,GAAG,EAIrE,IAAMc,GAAQ9E,EAAQ,QAAU,GAC1B+E,GAAW,KAAK,IAAI,EAAG/E,EAAQ,eAAiB,GAAG,EACnDgF,GAAc,IAAI,IACpBC,GAAY,GACVC,GAAU,GAAa,CAC3B,IAAMC,EAAQtE,EAAWmD,EAAI,MAC7B,OAAOlD,GAASkD,EAAI,MAAQmB,EAAM,IAAMnB,EAAI,MAAQmB,EAAM,EAC5D,EACA,IAAK,IAAMnB,KAAOjD,EAAM,CACtB,IAAMqE,EAAM,GAAGpB,EAAI,KAAK,GAAGA,EAAI,QACzBqB,EAAWzE,EAAQ,IAAIwE,CAAG,EAC5BE,EAGJ,AACEA,EADGD,EAMIA,EAAS,OAASrB,EAAI,KAElBqB,EADH,CAAE,KAAMrB,EAAI,KAAM,GAAIuB,EAAK,KAAMvB,EAAI,KAAOqB,EAAS,IAAK,EAN1D,CACN,KAAMrB,EAAI,KACV,GAAIkB,GAAOlB,CAAG,EAAIuB,EAAM,KACxB,KAAM,EACR,EAIFP,GAAY,IAAII,EAAKE,CAAK,CAC5B,CACA,EAAUN,GACV,EAAQ,GACR,IAAK,IAAM/C,IAAQ,CAAC,MAAO,KAAK,EAAY,CAE1C,IAAMuD,GADOvD,IAAS,MAAQ4B,EAAOD,EAAA,CACjB,IAAK,GAAM6B,EAAE,KAAK,EACtC,EAAWxD,GAAQuD,EAAO,OACtB,CAAC,KAAK,IAAI,GAAGA,CAAM,EAAG,KAAK,IAAI,GAAGA,CAAM,CAAC,EACzC,CAAC,IAAK,GAAG,CACf,CAIA,GADA,EAAU,KACNxE,EAAS,CACX,GAAM,CAAC0E,EAAIC,GAAM3E,EACb0E,GAAM,GAAKA,GAAM1C,IACnB,EAAUjC,EAAK,KAAM,GAAM4E,GAAMF,EAAE,GAAKE,EAAKF,EAAE,EAAIvC,CAAE,GAAK,KAC9D,MAAO,GAAIjC,EAAQ,CACjB,IAAM2E,EAAO3E,EAAO,OAAS,MAAQ2C,EAAOC,EAC5C,EAAU+B,EAAK,KAAK,IAAI3E,EAAO,MAAO2E,EAAK,OAAS,CAAC,IAAM,IAC7D,CAEA,IAAMC,GAAY7F,EAAQ,qBAAuB,IAC3C8F,GAAO3G,EAAAA,MAAM4G,EAAM,IAAI,EACvBC,EAAQ7G,EAAAA,MAAM4G,EAAM,SAAS,EAG/B5C,IACF,EAAI,KAAO/D,EAAAA,OAAO2G,EAAO/F,EAAS,IAAKiD,EAAW,CAAC,EACnD,EAAI,UAAY+C,EAChB,EAAI,aAAe,SACnBzB,EAAU,SAAS,EAAG,IAAM,CAC1B,EAAI,UAAYI,IAAM,EAAI,OAAS,QACnC/B,EAAI,SAASC,EAAEyB,GAAII,EAAKC,GAAKzB,EAAK,EAAI,CAAC,CACzC,CAAC,GAIH,IAAK,IAAMc,KAAOjD,EAAM,CACtB,IAAMkF,EAAQjC,EAAI,OAAS,MAAQxD,EAAO,GAAKA,EAAO,KAChD4E,EAAM,GAAGpB,EAAI,KAAK,GAAGA,EAAI,QACzBkC,EAAQlC,EAAI,MAAQ6B,GAO1B,GALI1E,GAAWA,EAAQ,OAAS6C,EAAI,MAAQA,EAAI,OAAS7C,EAAQ,QAC/D,EAAI,UAAYhC,EAAAA,MAAM4G,EAAM,KAAM/B,IAAQ7C,EAAU,IAAO,IAAK,EAChEyB,EAAI,SAAS,EAAGoB,EAAI,EAAGhB,EAAOE,CAAE,GAG9B0B,IAAa,QAAUC,EAAS,EAAG,CAErC,IAAMsB,GADQvB,IAAa,QAAUZ,EAAI,KAAOA,EAAI,KACjCa,EAAU7B,EAC7B,EAAI,UAAY7D,EAAAA,MAAM8G,EAAO,GAAI,EACjCrD,EAAI,SAASI,EAAQmD,EAAGnC,EAAI,EAAI,EAAGmC,EAAGjD,EAAK,CAAC,CAC9C,CACIgD,IACF,EAAI,UAAY/G,EAAAA,MAAM8G,EAAO,GAAI,EACjCrD,EAAI,SAAS,EAAGoB,EAAI,EAAI,EAAGhB,EAAOE,EAAK,CAAC,EAExC,EAAI,UAAY/D,EAAAA,MAAM8G,CAAK,EAC3BrD,EAAI,UAAU,EACdA,EAAI,IACFc,EAAM,EACNM,EAAI,EAAId,EAAK,EACb,KAAK,IAAI,IAAKQ,EAAM,EAAI,CAAC,EACzB,EACA,KAAK,GAAK,CACZ,EACAd,EAAI,KAAK,GAIX,IAAMwD,EAAIxF,EAAQ,IAAIwE,CAAG,EACrBiB,EAAa,EACjB,GAAIvB,IAASsB,GAAK,OAAO,SAASA,EAAE,EAAE,EAAG,CACvC,IAAME,GAAOf,EAAMa,EAAE,IAAMrB,GACvBuB,EAAM,IACR,GAAc,EAAIA,IAAQ,EAAIA,GAC9B,GAAY,GAEhB,CAEA,EAAI,aAAe,SACnB,IAAMC,EAAKvC,EAAI,EAAId,EAAK,EAAI,GAC5BqB,EAAU,SAAS,EAAG,IAAM,CAE1B,GADA,EAAI,UAAYI,IAAM,EAAI,OAAS,QAC/BL,IAAM,QACR,EAAI,KAAOlF,EAAAA,OAAO2G,EAAO/F,EAAS,IAAKiD,CAAQ,EAC/C,EAAI,UAAY9D,EAAAA,MAAM8G,CAAK,EAC3BrD,EAAI,SACFxC,EAAI,MAAM4D,EAAI,KAAK,EACnBU,EAAKC,IAAOuB,GAASvB,IAAM,EAAI,EAAI,GACnC4B,CACF,OACK,GAAIjC,IAAM,OAAQ,CACvB,EAAI,KAAOlF,EAAAA,OAAO2G,EAAO/F,EAASkG,EAAQ,IAAM,IAAKjD,CAAQ,EAC7D,IAAMuD,EAAQpG,EAAI,KAAK4D,EAAI,IAAI,EAC/B,GAAIqC,EAAa,GAAKD,EAAG,CACvB,IAAMD,EAAIvD,EAAI,YAAY4D,CAAK,CAAC,CAAC,MAAQ,GACnCC,EAAI9B,IAAM,EAAID,EAAKC,GAAM,EAAID,EAAKC,GAAMwB,EAAI,EAClD,EAAI,UAAYhH,EAAAA,MACdiH,EAAE,KAAOH,EAAQF,EAAM,WACtBK,EAAE,KAAO,IAAO,IAAOC,CAC1B,EACA1G,EAAA,UAAUiD,EAAK6D,EAAGzC,EAAI,EAAI,EAAGmC,EAAGjD,EAAK,EAAG,CAAC,EACzCN,EAAI,KAAK,CACX,CACA,EAAI,UAAYkD,GAChBlD,EAAI,SAAS4D,EAAO9B,EAAKC,GAAK4B,CAAE,CAClC,KACE,GAAI,KAAOnH,EAAAA,OAAO2G,EAAO/F,EAAS,IAAKiD,CAAQ,EAC/C,EAAI,UAAY+C,EAChBpD,EAAI,SACF5C,EAAQ,QAAU,QACdI,EAAI,SAAS4D,EAAI,QAAQ,EACzB5D,EAAI,MAAM4D,EAAI,GAAG,EACrBU,EAAKC,GACL4B,CACF,CAEJ,CAAC,CACH,CACA,GAAIpF,EAAS,CAEX,EAAI,YAAchC,EAAAA,MAAM4G,EAAM,UAAW,EAAG,EAC5CnD,EAAI,YAAY,CAAC,EAAG,CAAC,CAAC,EACtBA,EAAI,UAAU,EACd,IAAM8D,EACJvF,EAAQ,OAAS,MAAQA,EAAQ,EAAI+B,EAAK,GAAM/B,EAAQ,EAAI,GAC9DyB,EAAI,OAAO,EAAG8D,CAAI,EAClB9D,EAAI,OAAOI,EAAO0D,CAAI,EACtB9D,EAAI,OAAO,EACXA,EAAI,YAAY,CAAC,CAAC,CACpB,CAGA,GAAIQ,EAAS,CACX,IAAMuD,EAAMzG,EAAM,IAAI,EAChB0G,EAAQnG,GAAakG,EACvB,OAAO,SAASC,CAAK,GAAKA,IAAUlG,IAClC,OAAO,SAASA,CAAY,IAC9B,EACEkG,EAAQlG,EACJ,EACAkG,EAAQlG,EACN,GACAC,GACV,EAAeiG,GAEjB,IAAMC,EAAK1C,GACX,EAAI,UAAYhF,EAAAA,MAAM4G,EAAM,KAAM,IAAK,EACvCnD,EAAI,SAAS,EAAGiE,EAAI7D,EAAOI,CAAO,EAClC,EAAI,YAAcjE,EAAAA,MAAM4G,EAAM,IAAI,EAClCnD,EAAI,UAAU,EACdA,EAAI,OAAO,EAAG,KAAK,MAAMiE,CAAE,EAAI,EAAG,EAClCjE,EAAI,OAAOI,EAAO,KAAK,MAAM6D,CAAE,EAAI,EAAG,EACtCjE,EAAI,OAAO,EAAG,KAAK,MAAMiE,EAAKzD,CAAO,EAAI,EAAG,EAC5CR,EAAI,OAAOI,EAAO,KAAK,MAAM6D,EAAKzD,CAAO,EAAI,EAAG,EAChDR,EAAI,OAAO,EACX,IAAMkE,EACJnG,EAAgB,EACZH,EAAO,GACPG,EAAgB,EACdH,EAAO,KACPuF,EAAM,KACRgB,EAAKF,EAAKzD,EAAU,EAAI,GAC9B,EAAI,aAAe,SACnB,EAAI,UAAY,OAChB,EAAI,KAAOhE,EAAAA,OAAO2G,EAAO/F,EAAS,IAAKiD,GAAYF,EAAU,EAAI,EAAE,EACnE,EAAI,UAAY5D,EAAAA,MAAM2H,CAAQ,EAC9B,IAAME,EAAY3G,EAAUuG,CAAK,EACjChE,EAAI,SAASoE,EAAWtD,EAAKqD,CAAE,EAC/B,IAAIN,EAAI/C,EAAMd,EAAI,YAAYoE,CAAS,CAAC,CAAC,MAAQ,EACjD,GAAIrG,IAAkB,EAAG,CAEvB,IAAM8B,EAAIM,EAAU,EAAI,EACxBH,EAAI,UAAU,EACVjC,EAAgB,GAClBiC,EAAI,OAAO6D,EAAGM,EAAKtE,EAAI,EAAG,EAC1BG,EAAI,OAAO6D,EAAIhE,EAAGsE,EAAKtE,EAAI,EAAG,EAC9BG,EAAI,OAAO6D,EAAIhE,EAAI,EAAGsE,EAAKtE,EAAI,EAAG,IAElCG,EAAI,OAAO6D,EAAGM,EAAKtE,EAAI,EAAG,EAC1BG,EAAI,OAAO6D,EAAIhE,EAAGsE,EAAKtE,EAAI,EAAG,EAC9BG,EAAI,OAAO6D,EAAIhE,EAAI,EAAGsE,EAAKtE,EAAI,EAAG,GAEpCG,EAAI,UAAU,EACdA,EAAI,KAAK,EACT,GAAKH,EAAI,EAAI,CACf,CACA,IAAMwE,EAAS/G,EAAM,OAAO,EAC5B,GAAI,OAAO,SAAS+G,CAAM,EAAG,CAC3B,EAAI,UAAY,QAChB,EAAI,KAAO7H,EAAAA,OAAO2G,EAAO/F,EAAS,IAAKiD,EAAW,CAAC,EACnD,IAAMiE,EAAOD,EAASN,EAAO,IACvBQ,EAAQ,GAAG9G,EAAU4G,CAAM,EAAE,KAAK7G,EAAI,MAAM8G,EAAKA,EAAM,GAAK,EAAI,CAAC,EAAE,GAAGrE,EAAE,cAG9E,GAFA,EAAI,UAAYiD,GAChBlD,EAAI,SAASuE,EAAOnE,EAAQU,EAAKqD,CAAE,EAC/B,CAAChE,EAAS,CACZ,IAAMqE,EAAKxE,EAAI,YAAYuE,CAAK,CAAC,CAAC,MAClC,EAAI,UAAYnB,EAChB,IAAMQ,EAAQ,GAAG3D,EAAE,SACfG,EAAQU,EAAM0D,EAAK,EAAIxE,EAAI,YAAY4D,CAAK,CAAC,CAAC,MAAQC,GACxD7D,EAAI,SAAS4D,EAAOxD,EAAQU,EAAM0D,EAAK,EAAGL,CAAE,CAChD,CACF,CACF,CAGA,GAAI1D,EAAY,CACd,IAAIgE,EAAS,EACTC,EAAS,EACb,IAAK,IAAM7B,KAAK5B,EAAM,GAAU4B,EAAE,KAClC,IAAK,IAAMA,KAAK7B,EAAM,GAAU6B,EAAE,KAClC,IAAMpB,EAAMgD,EAASC,EACfC,EAAQlD,EAAM,EAAIgD,EAAShD,EAAM,GACjCmD,EAAKhE,EAASH,EAAa,EAC3BoE,EAAKpE,EAAa,GAClBqE,EAAK1E,EAAQU,EAAM,EACnBiE,EAAQjE,EAAMgE,EAAKH,EACzB3E,EAAI,KAAK,EACTjD,EAAA,UAAUiD,EAAKc,EAAK8D,EAAIE,EAAID,EAAI,CAAC,EACjC7E,EAAI,KAAK,EACT,EAAI,UAAYzD,EAAAA,MAAMqB,EAAO,GAAI,GAAI,EACrCoC,EAAI,SAASc,EAAK8D,EAAIG,EAAQjE,EAAK+D,CAAE,EACrC,EAAI,UAAYtI,EAAAA,MAAMqB,EAAO,KAAM,GAAI,EACvCoC,EAAI,SAAS+E,EAAOH,EAAI9D,EAAMgE,EAAKC,EAAOF,CAAE,EAC5C7E,EAAI,QAAQ,EACZ,EAAI,UAAYzD,EAAAA,MAAM4G,EAAM,UAAU,EACtCnD,EAAI,SAAS+E,EAAQ,EAAGH,EAAI,EAAGC,CAAE,EACjC,EAAI,KAAOrI,EAAAA,OAAO2G,EAAO/F,EAAS,IAAKiD,EAAW,CAAC,EACnD,EAAI,aAAe,SACnB,EAAI,UAAY,OAChB,EAAI,UAAY9D,EAAAA,MAAMqB,EAAO,EAAE,EAC/B,IAAMmG,EAAMa,EAAKC,EAAK,EAAI,GAC1B7E,EAAI,SACF,GAAGC,EAAE,SAAS,GAAGzC,EAAI,QAAQmH,EAAO,EAAG,EAAK,IAC5C7D,EAAM,EACNiD,CACF,EACA,EAAI,UAAY,QAChB,EAAI,UAAYxH,EAAAA,MAAMqB,EAAO,IAAI,EACjCoC,EAAI,SACF,GAAGxC,EAAI,QAAQ,EAAImH,EAAO,EAAG,EAAK,EAAE,GAAG1E,EAAE,YACzCa,EAAMgE,EAAK,EACXf,CACF,CACF,CAGA,GAAIxF,GAAWnB,EAAQ,UAAY,GAAO,CACxC,IAAMiG,EAAQ9E,EAAQ,OAAS,MAAQX,EAAO,GAAKA,EAAO,KAC1DZ,EAAA,YACEgI,GACAvG,EAAK,QACL,CAAE,KAAMjB,EAAI,MAAMe,EAAQ,KAAK,EAAG,MAAOhC,EAAAA,MAAM8G,CAAK,CAAE,EACtD,CACE,CAACpD,EAAE,QAASxC,EAAUc,EAAQ,OAAO,CAAC,EACtC,CAAC0B,EAAE,IAAKzC,EAAI,MAAMe,EAAQ,GAAG,CAAC,EAC9B,CAAC0B,EAAE,SAAUzC,EAAI,SAASe,EAAQ,QAAQ,CAAC,CAC7C,CACF,EACA,EAAK,QAAQ,MAAM,QAAU,QAC7B,IAAM0G,EAAK7G,EAAUA,EAAQ,GAAKgC,EAAQ,GAC1C3B,EAAK,aACHA,EAAK,QACLwG,EACA1G,EAAQ,EAAI+B,EAAK,EACjB2E,EAAK7E,EAAQ,EAAI,OAAS,OAC5B,CACF,KACE,GAAK,QAAQ,MAAM,QAAU,OAE/B,IAAMoC,GAAMjE,EACR,GAAGA,EAAQ,KAAK,GAAGA,EAAQ,MAAM,GAAGA,EAAQ,MAAM,GAAGA,EAAQ,KAAK,GAAGA,EAAQ,MAC7E,GACAiE,KAAQlE,IACV,EAAWkE,GACXjF,EAAQ,KAAK,QAASgB,EAAU2G,EAAQ3G,CAAO,EAAI,IAAI,GAGzD,IAAM4G,GAAK7H,EAAM,QAAQ,EACnB8H,GAAK9H,EAAM,QAAQ,EAIzB,OAHAmB,EAAK,SACH,GAAGrB,EAAQ,WAAa6C,EAAE,KAAK,IAAIA,EAAE,IAAI,GAAGxC,EAAU0H,EAAE,EAAE,IAAIlF,EAAE,IAAI,GAAGxC,EAAU2H,EAAE,EAAE,IAAInF,EAAE,OAAO,GAAGxC,EAAU2H,GAAKD,EAAE,EAAE,EAC1H,EACO9C,EACT,CAEA,IAAM6C,EAAW,IAAmC,CAClD,KAAM9D,EAAI,KACV,MAAOA,EAAI,MACX,MAAOA,EAAI,MACX,KAAMA,EAAI,KACV,IAAKA,EAAI,IACT,SAAUA,EAAI,SACd,QAASA,EAAI,OACf,GAIMiE,EAAiB,GAAwB,CAC7C,EAAU5I,EAAAA,WAAWkC,EAAM2G,CAAK,EAChC,EAAS,KACT7G,EAAK,WAAW,CAClB,EACM8G,MAAuB,CAC3B,EAAU,KACV9G,EAAK,WAAW,CAClB,EACM+G,EAAW,GAAsB,CACrC,GAAM,CAAC3B,EAAG3C,GAAKzE,EAAAA,WAAWkC,EAAM2G,CAAK,EAC/BlE,EAAMjD,EAAK,KAAM,GAAM+C,GAAK2B,EAAE,GAAK3B,EAAI2B,EAAE,EAAIrE,CAAS,EACxD4C,GAAOyC,GAAK,GAAGtG,EAAQ,KAAK,aAAc2H,EAAQ9D,CAAG,CAAC,CAC5D,EACMqE,EAAa,GAAyB,CAC1C,IAAMC,EAAkD,CAAC,EACnD1E,EAAO7C,EAAK,OAAQ,GAAM0E,EAAE,OAAS,KAAK,EAC1C5B,EAAO9C,EAAK,OAAQ,GAAM0E,EAAE,OAAS,KAAK,EAChD,IAAK,IAAIpD,EAAIuB,EAAK,OAAS,EAAGvB,GAAK,EAAG,IACpCiG,EAAM,KAAK,CAAE,KAAM,MAAO,MAAOjG,CAAE,CAAC,EACtC,IAAK,IAAIA,EAAI,EAAGA,EAAIwB,EAAK,OAAQ,IAAKyE,EAAM,KAAK,CAAE,KAAM,MAAO,MAAOjG,CAAE,CAAC,EAC1E,GAAI,CAACiG,EAAM,OAAQ,OACnB,IAAMC,EAAUtH,EACZqH,EAAM,UACH,GAAME,EAAE,OAASvH,EAAQ,MAAQuH,EAAE,QAAUvH,EAAQ,KACxD,EACA,GACJ,OAAQiH,EAAM,IAAd,CACE,IAAK,YACL,IAAK,UAAW,CACd,IAAMO,EAAOP,EAAM,MAAQ,YAQ3B,EAASI,EALPC,GAAW,EACPjJ,EAAAA,MAAMiJ,GAAWE,EAAO,EAAI,IAAK,EAAGH,EAAM,OAAS,CAAC,EACpDG,EACE,KAAK,IAAI7E,EAAK,OAAQ0E,EAAM,OAAS,CAAC,EACtC,KAAK,IAAI,EAAG1E,EAAK,OAAS,CAAC,IACX,KACxB,EAAU,KACVvC,EAAK,WAAW,EAChB,KACF,CACA,IAAK,QACL,IAAK,IACCF,GAAShB,EAAQ,KAAK,aAAc2H,EAAQ3G,CAAO,CAAC,EACxD,MACF,IAAK,SACH,EAAS,KACTE,EAAK,WAAW,EAChB,MACF,QACE,MACJ,CACA6G,EAAM,eAAe,CACvB,EACMQ,MAAe,CACfzH,IACF,EAAS,KACTI,EAAK,WAAW,EAEpB,EACAE,EAAK,iBAAiB,cAAe0G,CAAa,EAClD1G,EAAK,iBAAiB,eAAgB4G,CAAc,EACpD5G,EAAK,iBAAiB,QAAS6G,CAAO,EACtC7G,EAAK,iBAAiB,UAAW8G,CAAS,EAC1C9G,EAAK,iBAAiB,OAAQmH,CAAM,EAEpC,IAAMC,MAAgB,CAChB,CAACpI,GAAYL,EAAM,MAAM,KAAK,EAAIA,EAAM,MAAM,KAAK,EAAI,IACzD,EAAW,GACXuB,EAAc,GAEhBJ,EAAK,WAAW,CAClB,EAmDA,OADAU,EAAa,EACN,CAhDL,QAAQ,EAAU,CAChB7B,EAAM,YAAY0I,CAAQ,EAC1B,EAAW,GACXD,EAAQ,CACV,EACA,YAAY,EAAQ,CACdpJ,EAAAA,YAAYW,EAAO2I,CAAM,GAAGF,EAAQ,CAC1C,EACA,OAAQ,CACNzI,EAAM,MAAM,EACZ,EAAW,GACX,EAAU,IAAI,IACd,EAAQ,GACRmB,EAAK,WAAW,CAClB,EACA,aAAa,EAAO,CAClB,EAAYmB,IAAU,MAAQ,OAAO,SAASA,CAAK,EAAIA,EAAQ,KAC/DnB,EAAK,WAAW,CAClB,EACA,WAAW,EAAM,CACf,IAAMyH,GACHC,EAAK,UAAY,MAAQ/I,EAAQ,UAAY,IAC9C+I,EAAK,OAAS/I,EAAQ,KACxB,EAAU+I,EACND,EAAS/G,EAAa,GAExBD,EAAW,EACX,EAAShD,EAAAA,WAAWuC,EAAK,MAAOrB,CAAO,EACvCyB,EAAc,EACdJ,EAAK,WAAW,EAEpB,EACA,aAAgBnB,EAChB,IAAK,EAAO,IAAYC,EAAQ,GAAG+H,EAAOc,CAAO,EACjD,QAAS,CACP3H,EAAK,WAAW,CAClB,EACA,SAAU,CACRE,EAAK,oBAAoB,cAAe0G,CAAa,EACrD1G,EAAK,oBAAoB,eAAgB4G,CAAc,EACvD5G,EAAK,oBAAoB,QAAS6G,CAAO,EACzC7G,EAAK,oBAAoB,UAAW8G,CAAS,EAC7C9G,EAAK,oBAAoB,OAAQmH,CAAM,EACvCvI,EAAQ,MAAM,EACdkB,EAAK,QAAQ,CACf,CAGK,CACT"}
|
|
@@ -178,7 +178,7 @@ var _ = {
|
|
|
178
178
|
let t = (Z === "level" ? i.size : i.sum) / Q * r;
|
|
179
179
|
n.fillStyle = e(a, .14), n.fillRect(r - t, i.y + 1, t, p - 2);
|
|
180
180
|
}
|
|
181
|
-
c && (n.fillStyle = e(a, .16), n.fillRect(0, i.y + 1, r, p - 2), n.fillStyle = e(a), n.
|
|
181
|
+
c && (n.fillStyle = e(a, .16), n.fillRect(0, i.y + 1, r, p - 2), n.fillStyle = e(a), n.beginPath(), n.arc(E / 2, i.y + p / 2, Math.min(2.5, E / 2 - 1), 0, Math.PI * 2), n.fill());
|
|
182
182
|
let u = j.get(s), m = 0;
|
|
183
183
|
if (se && u && Number.isFinite(u.at)) {
|
|
184
184
|
let e = (t - u.at) / ce;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ladder.js","names":["LABELS","COLUMNS","createOrderBook","options","initial","store","createOrderBookStore","emitter","createEmitter","fmt","createFormatters","finePrice","texts","localeLabels","inferred","colors","lastPrice","previousLast","lastDirection","flashes","shownRange","drawn","rows","hoverAt","keyRow","hoverKey","hovered","rowHeight","host","createHost","container","sideColors","root","labels","refreshFormat","grouping","raw","inferPriceDecimals","decimalsOf","inferSizeDecimals","fine","numberFormat","v","applyTexts","applyOptions","sideRows","side","out","sum","notional","i","count","p","price","s","size","draw","ctx","l","mode","compact","width","fontSize","rh","headerH","spreadH","imbalanceH","sides","avail","height","perSide","pad","dpr","asks","bids","y","asksTop","row","spreadY","bidsTop","spreadTop","cols","all","c","shownCols","n","inner","colX","j","barsMode","barMax","flash","duration","nextFlashes","animating","inside","range","key","previous","entry","now","prices","r","hx","hy","list","threshold","text","toCss","theme","muted","fontOf","color","large","w","f","flashAlpha","age","ty","label","x","roundRect","edge","mid","shown","sy","dirColor","cy","priceText","spread","bps","right","rw","bidSum","askSum","share","by","bh","bw","split","tooltipHtml","doc","ax","toEvent","bb","ba","onPointerMove","localPoint","event","onPointerLeave","onClick","onKeyDown","order","current","o","down","clamp","onBlur","changed","snapshot","applyDeltas","deltas","regroup","next","handler"],"sources":["../../../../../charts/src/engine/orderbook/ladder.ts"],"sourcesContent":["// createOrderBook: the price ladder (asks above the spread row, bids below)\n// drawn with Canvas2D. Any number of deltas between two frames cost one\n// draw of the visible rows; changed levels flash, walls stand out, hovering\n// sums the levels up to the pointer.\n\nimport { toCss, type Rgba } from \"../color\";\nimport {\n applyDeltas,\n createOrderBookStore,\n decimalsOf,\n inferPriceDecimals,\n inferSizeDecimals,\n} from \"./book\";\nimport {\n clamp,\n createFormatters,\n fontOf,\n numberFormat,\n roundRect,\n sideColors,\n type Formatters,\n} from \"./format\";\nimport { localeLabels, type LabelDictionary } from \"../locale\";\nimport { createEmitter, createHost, localPoint, tooltipHtml } from \"./host\";\nimport type {\n OrderBookEventMap,\n OrderBookInstance,\n OrderBookLabels,\n OrderBookLevelEvent,\n OrderBookOptions,\n OrderBookSide,\n} from \"./types\";\n\nconst LABELS: LabelDictionary<OrderBookLabels> = {\n en: {\n price: \"Price\",\n size: \"Size\",\n total: \"Total\",\n spread: \"Spread\",\n average: \"Avg. price\",\n sum: \"Sum\",\n notional: \"Notional\",\n buyShare: \"B\",\n sellShare: \"S\",\n bid: \"Bid\",\n ask: \"Ask\",\n basisPoints: \"bp\",\n name: \"Order book\",\n },\n zh: {\n price: \"价格\",\n size: \"数量\",\n total: \"累计\",\n spread: \"价差\",\n average: \"均价\",\n sum: \"累计数量\",\n notional: \"累计金额\",\n buyShare: \"买\",\n sellShare: \"卖\",\n bid: \"买一\",\n ask: \"卖一\",\n basisPoints: \"基点\",\n name: \"订单簿\",\n },\n ja: {\n price: \"価格\",\n size: \"数量\",\n total: \"累計\",\n spread: \"スプレッド\",\n average: \"平均価格\",\n sum: \"累計数量\",\n notional: \"累計金額\",\n buyShare: \"買\",\n sellShare: \"売\",\n bid: \"最良買気配\",\n ask: \"最良売気配\",\n basisPoints: \"bp\",\n name: \"板情報\",\n },\n fr: {\n price: \"Prix\",\n size: \"Quantité\",\n total: \"Cumul\",\n spread: \"Écart\",\n average: \"Prix moyen\",\n sum: \"Somme\",\n notional: \"Montant\",\n buyShare: \"A\",\n sellShare: \"V\",\n bid: \"Meilleur achat\",\n ask: \"Meilleure vente\",\n basisPoints: \"pb\",\n name: \"Carnet d’ordres\",\n },\n};\n\nconst COLUMNS = [\"price\", \"size\", \"total\"] as const;\n\ninterface Row extends OrderBookLevelEvent {\n /** Top of the row, CSS pixels */\n y: number;\n}\n\ninterface Flash {\n size: number;\n at: number;\n grew: boolean;\n}\n\n/**\n * Creates an order book ladder in `container`: asks, spread row and bids\n * with depth bars, grouping, flashes on changes and a hover summary.\n */\nexport const createOrderBook = (\n container: HTMLElement,\n initial: OrderBookOptions = {},\n): OrderBookInstance => {\n let options = initial;\n const store = createOrderBookStore();\n const emitter = createEmitter<OrderBookEventMap>();\n let fmt: Formatters = createFormatters(options, 2, 4);\n let finePrice = fmt.price;\n /** Texts in the locale, resolved on every option update */\n let texts = localeLabels(LABELS, options.locale, options.labels);\n let inferred = false;\n let colors = { up: [0, 0, 0, 1] as Rgba, down: [0, 0, 0, 1] as Rgba };\n let lastPrice: number | null = null;\n let previousLast = NaN;\n let lastDirection = 0;\n let flashes = new Map<string, Flash>();\n /** Price range of the rows of the previous frame, per side */\n const shownRange: Record<OrderBookSide, [number, number]> = {\n bid: [NaN, NaN],\n ask: [NaN, NaN],\n };\n let drawn = false;\n let rows: Row[] = [];\n let hoverAt: [number, number] | null = null;\n /** Keyboard selection: side and index from the spread */\n let keyRow: { side: OrderBookSide; index: number } | null = null;\n let hoverKey = \"\";\n let hovered: Row | null = null;\n let rowHeight = 20;\n\n const host = createHost(container, {\n className: \"minerva-order-book\",\n draw,\n onTheme: () => {\n colors = sideColors(host.theme, options);\n },\n });\n const { root, doc } = host;\n root.tabIndex = 0;\n root.setAttribute(\"role\", \"figure\");\n root.style.cursor = \"default\";\n\n const labels = () => texts;\n\n const refreshFormat = () => {\n const grouping = options.grouping ?? 0;\n const raw = inferPriceDecimals(store);\n fmt = createFormatters(\n options,\n grouping > 0 ? Math.max(decimalsOf(grouping), 0) : raw,\n inferSizeDecimals(store),\n );\n // the spread row keeps the raw tick precision (a 0.1 spread is not \"0\")\n const fine = numberFormat(\n options.locale,\n Math.max(fmt.priceDecimals, options.grouping ? raw : 0),\n );\n finePrice = options.formatPrice\n ? fmt.price\n : (v) => (Number.isFinite(v) ? fine.format(v) : \"–\");\n };\n\n const applyTexts = () => {\n texts = localeLabels(LABELS, options.locale, options.labels);\n root.setAttribute(\"aria-label\", options.ariaLabel ?? texts.name);\n };\n\n const applyOptions = () => {\n applyTexts();\n colors = sideColors(host.theme, options);\n refreshFormat();\n // grouping changes the rows: no flash for the new buckets\n flashes = new Map();\n drawn = false;\n host.invalidate();\n };\n\n /** Levels of a side with their cumulative values */\n const sideRows = (side: OrderBookSide, limit: number): Row[] => {\n const { price, size, count } = store.levels(side, {\n step: options.grouping ?? 0,\n limit,\n });\n const out: Row[] = [];\n let sum = 0;\n let notional = 0;\n for (let i = 0; i < count; i++) {\n const p = price[i]!;\n const s = size[i]!;\n sum += s;\n notional += s * p;\n out.push({\n side,\n index: i,\n price: p,\n size: s,\n sum,\n notional,\n average: notional / sum,\n y: 0,\n });\n }\n return out;\n };\n\n function draw(now: number): boolean {\n const ctx = host.ctx;\n if (!ctx) return false;\n const { width, height, dpr, theme } = host;\n const l = labels();\n const mode = options.mode ?? \"both\";\n const compact = width < 260;\n const fontSize = options.fontSize ?? (compact ? 11 : 12);\n const rh = (rowHeight = Math.max(\n 12,\n options.rowHeight ?? (compact ? 18 : 20),\n ));\n const headerH = options.header === false ? 0 : rh + 2;\n const spreadH = options.spreadRow === false ? 0 : Math.round(rh * 1.7);\n const imbalanceH = options.imbalance === false ? 0 : 24;\n const sides = mode === \"both\" ? 2 : 1;\n const avail = Math.max(0, height - headerH - spreadH - imbalanceH);\n const perSide = Math.max(0, options.rows ?? Math.floor(avail / rh / sides));\n const pad = compact ? 6 : 10;\n\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, width, height);\n\n const asks = mode === \"bids\" ? [] : sideRows(\"ask\", perSide);\n const bids = mode === \"asks\" ? [] : sideRows(\"bid\", perSide);\n\n // vertical layout\n let y = headerH;\n const asksTop = y;\n if (mode !== \"bids\") {\n for (const row of asks) row.y = asksTop + (perSide - 1 - row.index) * rh;\n y += perSide * rh;\n }\n const spreadY = mode === \"bids\" ? headerH : y;\n if (mode !== \"bids\") y += spreadH;\n else y = headerH + spreadH;\n const bidsTop = y;\n for (const row of bids) row.y = bidsTop + row.index * rh;\n rows = [...asks, ...bids];\n const spreadTop = mode === \"asks\" ? asksTop + perSide * rh : spreadY;\n\n // columns\n const cols = (options.columns ?? COLUMNS).filter(\n (c, i, all) => all.indexOf(c) === i,\n );\n const shownCols = compact && cols.length > 2 ? cols.slice(0, 2) : cols;\n const n = shownCols.length;\n const inner = width - pad * 2;\n const colX = shownCols.map((_, j) =>\n j === 0\n ? pad\n : pad + inner * (j === n - 1 ? 1 : 0.24 + (0.76 * j) / (n - 1)),\n );\n\n // depth bar scale\n const barsMode = options.depthBars ?? \"cumulative\";\n let barMax = 0;\n for (const row of rows) {\n barMax = Math.max(barMax, barsMode === \"level\" ? row.size : row.sum);\n }\n\n // flashes: compare with the sizes of the previous frame\n const flash = options.flash !== false;\n const duration = Math.max(1, options.flashDuration ?? 450);\n const nextFlashes = new Map<string, Flash>();\n let animating = false;\n const inside = (row: Row) => {\n const range = shownRange[row.side];\n return drawn && row.price > range[0] && row.price < range[1];\n };\n for (const row of rows) {\n const key = `${row.side}:${row.price}`;\n const previous = flashes.get(key);\n let entry: Flash;\n // a level scrolling into view is not new: only levels appearing\n // between the rows already shown flash\n if (!previous)\n entry = {\n size: row.size,\n at: inside(row) ? now : -Infinity,\n grew: true,\n };\n else if (previous.size !== row.size)\n entry = { size: row.size, at: now, grew: row.size > previous.size };\n else entry = previous;\n nextFlashes.set(key, entry);\n }\n flashes = nextFlashes;\n drawn = true;\n for (const side of [\"bid\", \"ask\"] as const) {\n const list = side === \"bid\" ? bids : asks;\n const prices = list.map((r) => r.price);\n shownRange[side] = prices.length\n ? [Math.min(...prices), Math.max(...prices)]\n : [NaN, NaN];\n }\n\n // hover: rows from the spread to the hovered one\n hovered = null;\n if (hoverAt) {\n const [hx, hy] = hoverAt;\n if (hx >= 0 && hx <= width)\n hovered = rows.find((r) => hy >= r.y && hy < r.y + rh) ?? null;\n } else if (keyRow) {\n const list = keyRow.side === \"ask\" ? asks : bids;\n hovered = list[Math.min(keyRow.index, list.length - 1)] ?? null;\n }\n\n const threshold = options.largeOrderThreshold ?? Infinity;\n const text = toCss(theme.text);\n const muted = toCss(theme.textMuted);\n\n // header\n if (headerH) {\n ctx.font = fontOf(theme, options, 400, fontSize - 1);\n ctx.fillStyle = muted;\n ctx.textBaseline = \"middle\";\n shownCols.forEach((c, j) => {\n ctx.textAlign = j === 0 ? \"left\" : \"right\";\n ctx.fillText(l[c], colX[j]!, rh / 2 + 1);\n });\n }\n\n // rows\n for (const row of rows) {\n const color = row.side === \"bid\" ? colors.up : colors.down;\n const key = `${row.side}:${row.price}`;\n const large = row.size >= threshold;\n // hover band (cumulative selection)\n if (hovered && hovered.side === row.side && row.index <= hovered.index) {\n ctx.fillStyle = toCss(theme.text, row === hovered ? 0.09 : 0.045);\n ctx.fillRect(0, row.y, width, rh);\n }\n // depth bar\n if (barsMode !== \"none\" && barMax > 0) {\n const value = barsMode === \"level\" ? row.size : row.sum;\n const w = (value / barMax) * width;\n ctx.fillStyle = toCss(color, 0.14);\n ctx.fillRect(width - w, row.y + 1, w, rh - 2);\n }\n if (large) {\n ctx.fillStyle = toCss(color, 0.16);\n ctx.fillRect(0, row.y + 1, width, rh - 2);\n ctx.fillStyle = toCss(color);\n ctx.fillRect(0, row.y + 2, 3, rh - 4);\n }\n // flash: behind the size that changed (a whole-row flash makes a\n // ladder at 200 updates/s flicker)\n const f = flashes.get(key);\n let flashAlpha = 0;\n if (flash && f && Number.isFinite(f.at)) {\n const age = (now - f.at) / duration;\n if (age < 1) {\n flashAlpha = (1 - age) * (1 - age);\n animating = true;\n }\n }\n // texts\n ctx.textBaseline = \"middle\";\n const ty = row.y + rh / 2 + 0.5;\n shownCols.forEach((c, j) => {\n ctx.textAlign = j === 0 ? \"left\" : \"right\";\n if (c === \"price\") {\n ctx.font = fontOf(theme, options, 500, fontSize);\n ctx.fillStyle = toCss(color);\n ctx.fillText(\n fmt.price(row.price),\n colX[j]! + (large && j === 0 ? 4 : 0),\n ty,\n );\n } else if (c === \"size\") {\n ctx.font = fontOf(theme, options, large ? 700 : 400, fontSize);\n const label = fmt.size(row.size);\n if (flashAlpha > 0 && f) {\n const w = ctx.measureText(label).width + 10;\n const x = j === 0 ? colX[j]! - 5 : colX[j]! - w + 5;\n ctx.fillStyle = toCss(\n f.grew ? color : theme.textMuted,\n (f.grew ? 0.45 : 0.3) * flashAlpha,\n );\n roundRect(ctx, x, row.y + 2, w, rh - 4, 3);\n ctx.fill();\n }\n ctx.fillStyle = text;\n ctx.fillText(label, colX[j]!, ty);\n } else {\n ctx.font = fontOf(theme, options, 400, fontSize);\n ctx.fillStyle = muted;\n ctx.fillText(\n options.total === \"quote\"\n ? fmt.notional(row.notional)\n : fmt.total(row.sum),\n colX[j]!,\n ty,\n );\n }\n });\n }\n if (hovered) {\n // edge of the selection\n ctx.strokeStyle = toCss(theme.textMuted, 0.7);\n ctx.setLineDash([3, 3]);\n ctx.beginPath();\n const edge =\n hovered.side === \"bid\" ? hovered.y + rh - 0.5 : hovered.y + 0.5;\n ctx.moveTo(0, edge);\n ctx.lineTo(width, edge);\n ctx.stroke();\n ctx.setLineDash([]);\n }\n\n // spread row\n if (spreadH) {\n const mid = store.mid();\n const shown = lastPrice ?? mid;\n if (Number.isFinite(shown) && shown !== previousLast) {\n if (Number.isFinite(previousLast))\n lastDirection =\n shown > previousLast\n ? 1\n : shown < previousLast\n ? -1\n : lastDirection;\n previousLast = shown;\n }\n const sy = spreadTop;\n ctx.fillStyle = toCss(theme.text, 0.035);\n ctx.fillRect(0, sy, width, spreadH);\n ctx.strokeStyle = toCss(theme.grid);\n ctx.beginPath();\n ctx.moveTo(0, Math.round(sy) + 0.5);\n ctx.lineTo(width, Math.round(sy) + 0.5);\n ctx.moveTo(0, Math.round(sy + spreadH) - 0.5);\n ctx.lineTo(width, Math.round(sy + spreadH) - 0.5);\n ctx.stroke();\n const dirColor =\n lastDirection > 0\n ? colors.up\n : lastDirection < 0\n ? colors.down\n : theme.text;\n const cy = sy + spreadH / 2 + 0.5;\n ctx.textBaseline = \"middle\";\n ctx.textAlign = \"left\";\n ctx.font = fontOf(theme, options, 700, fontSize + (compact ? 2 : 4));\n ctx.fillStyle = toCss(dirColor);\n const priceText = finePrice(shown);\n ctx.fillText(priceText, pad, cy);\n let x = pad + ctx.measureText(priceText).width + 6;\n if (lastDirection !== 0) {\n // arrow of the last move\n const s = compact ? 4 : 5;\n ctx.beginPath();\n if (lastDirection > 0) {\n ctx.moveTo(x, cy + s * 0.6);\n ctx.lineTo(x + s, cy - s * 0.7);\n ctx.lineTo(x + s * 2, cy + s * 0.6);\n } else {\n ctx.moveTo(x, cy - s * 0.6);\n ctx.lineTo(x + s, cy + s * 0.7);\n ctx.lineTo(x + s * 2, cy - s * 0.6);\n }\n ctx.closePath();\n ctx.fill();\n x += s * 2 + 6;\n }\n const spread = store.spread();\n if (Number.isFinite(spread)) {\n ctx.textAlign = \"right\";\n ctx.font = fontOf(theme, options, 400, fontSize - 1);\n const bps = (spread / mid) * 1e4;\n const right = `${finePrice(spread)} · ${fmt.fixed(bps, bps < 10 ? 2 : 1)} ${l.basisPoints}`;\n ctx.fillStyle = text;\n ctx.fillText(right, width - pad, cy);\n if (!compact) {\n const rw = ctx.measureText(right).width;\n ctx.fillStyle = muted;\n const label = `${l.spread}`;\n if (width - pad - rw - 8 - ctx.measureText(label).width > x)\n ctx.fillText(label, width - pad - rw - 8, cy);\n }\n }\n }\n\n // imbalance bar\n if (imbalanceH) {\n let bidSum = 0;\n let askSum = 0;\n for (const r of bids) bidSum += r.size;\n for (const r of asks) askSum += r.size;\n const all = bidSum + askSum;\n const share = all > 0 ? bidSum / all : 0.5;\n const by = height - imbalanceH + 6;\n const bh = imbalanceH - 10;\n const bw = width - pad * 2;\n const split = pad + bw * share;\n ctx.save();\n roundRect(ctx, pad, by, bw, bh, 3);\n ctx.clip();\n ctx.fillStyle = toCss(colors.up, 0.22);\n ctx.fillRect(pad, by, split - pad, bh);\n ctx.fillStyle = toCss(colors.down, 0.22);\n ctx.fillRect(split, by, pad + bw - split, bh);\n ctx.restore();\n ctx.fillStyle = toCss(theme.background);\n ctx.fillRect(split - 1, by, 2, bh);\n ctx.font = fontOf(theme, options, 600, fontSize - 1);\n ctx.textBaseline = \"middle\";\n ctx.textAlign = \"left\";\n ctx.fillStyle = toCss(colors.up);\n const mid = by + bh / 2 + 0.5;\n ctx.fillText(\n `${l.buyShare} ${fmt.percent(share, 1, false)}`,\n pad + 6,\n mid,\n );\n ctx.textAlign = \"right\";\n ctx.fillStyle = toCss(colors.down);\n ctx.fillText(\n `${fmt.percent(1 - share, 1, false)} ${l.sellShare}`,\n pad + bw - 6,\n mid,\n );\n }\n\n // tooltip and hover event\n if (hovered && options.tooltip !== false) {\n const color = hovered.side === \"bid\" ? colors.up : colors.down;\n tooltipHtml(\n doc,\n host.tooltip,\n { text: fmt.price(hovered.price), color: toCss(color) },\n [\n [l.average, finePrice(hovered.average)],\n [l.sum, fmt.total(hovered.sum)],\n [l.notional, fmt.notional(hovered.notional)],\n ],\n );\n host.tooltip.style.display = \"block\";\n const ax = hoverAt ? hoverAt[0] : width * 0.4;\n host.placeTooltip(\n host.tooltip,\n ax,\n hovered.y + rh / 2,\n ax > width / 2 ? \"left\" : \"right\",\n );\n } else {\n host.tooltip.style.display = \"none\";\n }\n const key = hovered\n ? `${hovered.side}|${hovered.index}|${hovered.price}|${hovered.size}|${hovered.sum}`\n : \"\";\n if (key !== hoverKey) {\n hoverKey = key;\n emitter.emit(\"hover\", hovered ? toEvent(hovered) : null);\n }\n\n const bb = store.bestBid();\n const ba = store.bestAsk();\n host.describe(\n `${options.ariaLabel ?? l.name}. ${l.bid} ${finePrice(bb)}, ${l.ask} ${finePrice(ba)}, ${l.spread} ${finePrice(ba - bb)}.`,\n );\n return animating;\n }\n\n const toEvent = (row: Row): OrderBookLevelEvent => ({\n side: row.side,\n index: row.index,\n price: row.price,\n size: row.size,\n sum: row.sum,\n notional: row.notional,\n average: row.average,\n });\n\n // ---------------------------------------------------------- interaction\n\n const onPointerMove = (event: PointerEvent) => {\n hoverAt = localPoint(root, event);\n keyRow = null;\n host.invalidate();\n };\n const onPointerLeave = () => {\n hoverAt = null;\n host.invalidate();\n };\n const onClick = (event: MouseEvent) => {\n const [x, y] = localPoint(root, event);\n const row = rows.find((r) => y >= r.y && y < r.y + rowHeight);\n if (row && x >= 0) emitter.emit(\"levelClick\", toEvent(row));\n };\n const onKeyDown = (event: KeyboardEvent) => {\n const order: { side: OrderBookSide; index: number }[] = [];\n const asks = rows.filter((r) => r.side === \"ask\");\n const bids = rows.filter((r) => r.side === \"bid\");\n for (let i = asks.length - 1; i >= 0; i--)\n order.push({ side: \"ask\", index: i });\n for (let i = 0; i < bids.length; i++) order.push({ side: \"bid\", index: i });\n if (!order.length) return;\n const current = keyRow\n ? order.findIndex(\n (o) => o.side === keyRow!.side && o.index === keyRow!.index,\n )\n : -1;\n switch (event.key) {\n case \"ArrowDown\":\n case \"ArrowUp\": {\n const down = event.key === \"ArrowDown\";\n // first press: the best level on that side of the spread\n const next =\n current >= 0\n ? clamp(current + (down ? 1 : -1), 0, order.length - 1)\n : down\n ? Math.min(asks.length, order.length - 1)\n : Math.max(0, asks.length - 1);\n keyRow = order[next] ?? null;\n hoverAt = null;\n host.invalidate();\n break;\n }\n case \"Enter\":\n case \" \":\n if (hovered) emitter.emit(\"levelClick\", toEvent(hovered));\n break;\n case \"Escape\":\n keyRow = null;\n host.invalidate();\n break;\n default:\n return;\n }\n event.preventDefault();\n };\n const onBlur = () => {\n if (keyRow) {\n keyRow = null;\n host.invalidate();\n }\n };\n root.addEventListener(\"pointermove\", onPointerMove);\n root.addEventListener(\"pointerleave\", onPointerLeave);\n root.addEventListener(\"click\", onClick);\n root.addEventListener(\"keydown\", onKeyDown);\n root.addEventListener(\"blur\", onBlur);\n\n const changed = () => {\n if (!inferred && store.count(\"bid\") + store.count(\"ask\") > 0) {\n inferred = true;\n refreshFormat();\n }\n host.invalidate();\n };\n\n const instance: OrderBookInstance = {\n setBook(snapshot) {\n store.setSnapshot(snapshot);\n inferred = false;\n changed();\n },\n applyDeltas(deltas) {\n if (applyDeltas(store, deltas)) changed();\n },\n clear() {\n store.clear();\n inferred = false;\n flashes = new Map();\n drawn = false;\n host.invalidate();\n },\n setLastPrice(price) {\n lastPrice = price !== null && Number.isFinite(price) ? price : null;\n host.invalidate();\n },\n setOptions(next) {\n const regroup =\n (next.grouping ?? 0) !== (options.grouping ?? 0) ||\n next.mode !== options.mode;\n options = next;\n if (regroup) applyOptions();\n else {\n applyTexts();\n colors = sideColors(host.theme, options);\n refreshFormat();\n host.invalidate();\n }\n },\n getStore: () => store,\n on: (event, handler) => emitter.on(event, handler),\n resize() {\n host.invalidate();\n },\n destroy() {\n root.removeEventListener(\"pointermove\", onPointerMove);\n root.removeEventListener(\"pointerleave\", onPointerLeave);\n root.removeEventListener(\"click\", onClick);\n root.removeEventListener(\"keydown\", onKeyDown);\n root.removeEventListener(\"blur\", onBlur);\n emitter.clear();\n host.destroy();\n },\n };\n applyOptions();\n return instance;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ladder.js","names":["LABELS","COLUMNS","createOrderBook","options","initial","store","createOrderBookStore","emitter","createEmitter","fmt","createFormatters","finePrice","texts","localeLabels","inferred","colors","lastPrice","previousLast","lastDirection","flashes","shownRange","drawn","rows","hoverAt","keyRow","hoverKey","hovered","rowHeight","host","createHost","container","sideColors","root","labels","refreshFormat","grouping","raw","inferPriceDecimals","decimalsOf","inferSizeDecimals","fine","numberFormat","v","applyTexts","applyOptions","sideRows","side","out","sum","notional","i","count","p","price","s","size","draw","ctx","l","mode","compact","width","fontSize","rh","headerH","spreadH","imbalanceH","sides","avail","height","perSide","pad","dpr","asks","bids","y","asksTop","row","spreadY","bidsTop","spreadTop","cols","all","c","shownCols","n","inner","colX","j","barsMode","barMax","flash","duration","nextFlashes","animating","inside","range","key","previous","entry","now","prices","r","hx","hy","list","threshold","text","toCss","theme","muted","fontOf","color","large","w","f","flashAlpha","age","ty","label","x","roundRect","edge","mid","shown","sy","dirColor","cy","priceText","spread","bps","right","rw","bidSum","askSum","share","by","bh","bw","split","tooltipHtml","doc","ax","toEvent","bb","ba","onPointerMove","localPoint","event","onPointerLeave","onClick","onKeyDown","order","current","o","down","clamp","onBlur","changed","snapshot","applyDeltas","deltas","regroup","next","handler"],"sources":["../../../../../charts/src/engine/orderbook/ladder.ts"],"sourcesContent":["// createOrderBook: the price ladder (asks above the spread row, bids below)\n// drawn with Canvas2D. Any number of deltas between two frames cost one\n// draw of the visible rows; changed levels flash, walls stand out, hovering\n// sums the levels up to the pointer.\n\nimport { toCss, type Rgba } from \"../color\";\nimport {\n applyDeltas,\n createOrderBookStore,\n decimalsOf,\n inferPriceDecimals,\n inferSizeDecimals,\n} from \"./book\";\nimport {\n clamp,\n createFormatters,\n fontOf,\n numberFormat,\n roundRect,\n sideColors,\n type Formatters,\n} from \"./format\";\nimport { localeLabels, type LabelDictionary } from \"../locale\";\nimport { createEmitter, createHost, localPoint, tooltipHtml } from \"./host\";\nimport type {\n OrderBookEventMap,\n OrderBookInstance,\n OrderBookLabels,\n OrderBookLevelEvent,\n OrderBookOptions,\n OrderBookSide,\n} from \"./types\";\n\nconst LABELS: LabelDictionary<OrderBookLabels> = {\n en: {\n price: \"Price\",\n size: \"Size\",\n total: \"Total\",\n spread: \"Spread\",\n average: \"Avg. price\",\n sum: \"Sum\",\n notional: \"Notional\",\n buyShare: \"B\",\n sellShare: \"S\",\n bid: \"Bid\",\n ask: \"Ask\",\n basisPoints: \"bp\",\n name: \"Order book\",\n },\n zh: {\n price: \"价格\",\n size: \"数量\",\n total: \"累计\",\n spread: \"价差\",\n average: \"均价\",\n sum: \"累计数量\",\n notional: \"累计金额\",\n buyShare: \"买\",\n sellShare: \"卖\",\n bid: \"买一\",\n ask: \"卖一\",\n basisPoints: \"基点\",\n name: \"订单簿\",\n },\n ja: {\n price: \"価格\",\n size: \"数量\",\n total: \"累計\",\n spread: \"スプレッド\",\n average: \"平均価格\",\n sum: \"累計数量\",\n notional: \"累計金額\",\n buyShare: \"買\",\n sellShare: \"売\",\n bid: \"最良買気配\",\n ask: \"最良売気配\",\n basisPoints: \"bp\",\n name: \"板情報\",\n },\n fr: {\n price: \"Prix\",\n size: \"Quantité\",\n total: \"Cumul\",\n spread: \"Écart\",\n average: \"Prix moyen\",\n sum: \"Somme\",\n notional: \"Montant\",\n buyShare: \"A\",\n sellShare: \"V\",\n bid: \"Meilleur achat\",\n ask: \"Meilleure vente\",\n basisPoints: \"pb\",\n name: \"Carnet d’ordres\",\n },\n};\n\nconst COLUMNS = [\"price\", \"size\", \"total\"] as const;\n\ninterface Row extends OrderBookLevelEvent {\n /** Top of the row, CSS pixels */\n y: number;\n}\n\ninterface Flash {\n size: number;\n at: number;\n grew: boolean;\n}\n\n/**\n * Creates an order book ladder in `container`: asks, spread row and bids\n * with depth bars, grouping, flashes on changes and a hover summary.\n */\nexport const createOrderBook = (\n container: HTMLElement,\n initial: OrderBookOptions = {},\n): OrderBookInstance => {\n let options = initial;\n const store = createOrderBookStore();\n const emitter = createEmitter<OrderBookEventMap>();\n let fmt: Formatters = createFormatters(options, 2, 4);\n let finePrice = fmt.price;\n /** Texts in the locale, resolved on every option update */\n let texts = localeLabels(LABELS, options.locale, options.labels);\n let inferred = false;\n let colors = { up: [0, 0, 0, 1] as Rgba, down: [0, 0, 0, 1] as Rgba };\n let lastPrice: number | null = null;\n let previousLast = NaN;\n let lastDirection = 0;\n let flashes = new Map<string, Flash>();\n /** Price range of the rows of the previous frame, per side */\n const shownRange: Record<OrderBookSide, [number, number]> = {\n bid: [NaN, NaN],\n ask: [NaN, NaN],\n };\n let drawn = false;\n let rows: Row[] = [];\n let hoverAt: [number, number] | null = null;\n /** Keyboard selection: side and index from the spread */\n let keyRow: { side: OrderBookSide; index: number } | null = null;\n let hoverKey = \"\";\n let hovered: Row | null = null;\n let rowHeight = 20;\n\n const host = createHost(container, {\n className: \"minerva-order-book\",\n draw,\n onTheme: () => {\n colors = sideColors(host.theme, options);\n },\n });\n const { root, doc } = host;\n root.tabIndex = 0;\n root.setAttribute(\"role\", \"figure\");\n root.style.cursor = \"default\";\n\n const labels = () => texts;\n\n const refreshFormat = () => {\n const grouping = options.grouping ?? 0;\n const raw = inferPriceDecimals(store);\n fmt = createFormatters(\n options,\n grouping > 0 ? Math.max(decimalsOf(grouping), 0) : raw,\n inferSizeDecimals(store),\n );\n // the spread row keeps the raw tick precision (a 0.1 spread is not \"0\")\n const fine = numberFormat(\n options.locale,\n Math.max(fmt.priceDecimals, options.grouping ? raw : 0),\n );\n finePrice = options.formatPrice\n ? fmt.price\n : (v) => (Number.isFinite(v) ? fine.format(v) : \"–\");\n };\n\n const applyTexts = () => {\n texts = localeLabels(LABELS, options.locale, options.labels);\n root.setAttribute(\"aria-label\", options.ariaLabel ?? texts.name);\n };\n\n const applyOptions = () => {\n applyTexts();\n colors = sideColors(host.theme, options);\n refreshFormat();\n // grouping changes the rows: no flash for the new buckets\n flashes = new Map();\n drawn = false;\n host.invalidate();\n };\n\n /** Levels of a side with their cumulative values */\n const sideRows = (side: OrderBookSide, limit: number): Row[] => {\n const { price, size, count } = store.levels(side, {\n step: options.grouping ?? 0,\n limit,\n });\n const out: Row[] = [];\n let sum = 0;\n let notional = 0;\n for (let i = 0; i < count; i++) {\n const p = price[i]!;\n const s = size[i]!;\n sum += s;\n notional += s * p;\n out.push({\n side,\n index: i,\n price: p,\n size: s,\n sum,\n notional,\n average: notional / sum,\n y: 0,\n });\n }\n return out;\n };\n\n function draw(now: number): boolean {\n const ctx = host.ctx;\n if (!ctx) return false;\n const { width, height, dpr, theme } = host;\n const l = labels();\n const mode = options.mode ?? \"both\";\n const compact = width < 260;\n const fontSize = options.fontSize ?? (compact ? 11 : 12);\n const rh = (rowHeight = Math.max(\n 12,\n options.rowHeight ?? (compact ? 18 : 20),\n ));\n const headerH = options.header === false ? 0 : rh + 2;\n const spreadH = options.spreadRow === false ? 0 : Math.round(rh * 1.7);\n const imbalanceH = options.imbalance === false ? 0 : 24;\n const sides = mode === \"both\" ? 2 : 1;\n const avail = Math.max(0, height - headerH - spreadH - imbalanceH);\n const perSide = Math.max(0, options.rows ?? Math.floor(avail / rh / sides));\n const pad = compact ? 6 : 10;\n\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, width, height);\n\n const asks = mode === \"bids\" ? [] : sideRows(\"ask\", perSide);\n const bids = mode === \"asks\" ? [] : sideRows(\"bid\", perSide);\n\n // vertical layout\n let y = headerH;\n const asksTop = y;\n if (mode !== \"bids\") {\n for (const row of asks) row.y = asksTop + (perSide - 1 - row.index) * rh;\n y += perSide * rh;\n }\n const spreadY = mode === \"bids\" ? headerH : y;\n if (mode !== \"bids\") y += spreadH;\n else y = headerH + spreadH;\n const bidsTop = y;\n for (const row of bids) row.y = bidsTop + row.index * rh;\n rows = [...asks, ...bids];\n const spreadTop = mode === \"asks\" ? asksTop + perSide * rh : spreadY;\n\n // columns\n const cols = (options.columns ?? COLUMNS).filter(\n (c, i, all) => all.indexOf(c) === i,\n );\n const shownCols = compact && cols.length > 2 ? cols.slice(0, 2) : cols;\n const n = shownCols.length;\n const inner = width - pad * 2;\n const colX = shownCols.map((_, j) =>\n j === 0\n ? pad\n : pad + inner * (j === n - 1 ? 1 : 0.24 + (0.76 * j) / (n - 1)),\n );\n\n // depth bar scale\n const barsMode = options.depthBars ?? \"cumulative\";\n let barMax = 0;\n for (const row of rows) {\n barMax = Math.max(barMax, barsMode === \"level\" ? row.size : row.sum);\n }\n\n // flashes: compare with the sizes of the previous frame\n const flash = options.flash !== false;\n const duration = Math.max(1, options.flashDuration ?? 450);\n const nextFlashes = new Map<string, Flash>();\n let animating = false;\n const inside = (row: Row) => {\n const range = shownRange[row.side];\n return drawn && row.price > range[0] && row.price < range[1];\n };\n for (const row of rows) {\n const key = `${row.side}:${row.price}`;\n const previous = flashes.get(key);\n let entry: Flash;\n // a level scrolling into view is not new: only levels appearing\n // between the rows already shown flash\n if (!previous)\n entry = {\n size: row.size,\n at: inside(row) ? now : -Infinity,\n grew: true,\n };\n else if (previous.size !== row.size)\n entry = { size: row.size, at: now, grew: row.size > previous.size };\n else entry = previous;\n nextFlashes.set(key, entry);\n }\n flashes = nextFlashes;\n drawn = true;\n for (const side of [\"bid\", \"ask\"] as const) {\n const list = side === \"bid\" ? bids : asks;\n const prices = list.map((r) => r.price);\n shownRange[side] = prices.length\n ? [Math.min(...prices), Math.max(...prices)]\n : [NaN, NaN];\n }\n\n // hover: rows from the spread to the hovered one\n hovered = null;\n if (hoverAt) {\n const [hx, hy] = hoverAt;\n if (hx >= 0 && hx <= width)\n hovered = rows.find((r) => hy >= r.y && hy < r.y + rh) ?? null;\n } else if (keyRow) {\n const list = keyRow.side === \"ask\" ? asks : bids;\n hovered = list[Math.min(keyRow.index, list.length - 1)] ?? null;\n }\n\n const threshold = options.largeOrderThreshold ?? Infinity;\n const text = toCss(theme.text);\n const muted = toCss(theme.textMuted);\n\n // header\n if (headerH) {\n ctx.font = fontOf(theme, options, 400, fontSize - 1);\n ctx.fillStyle = muted;\n ctx.textBaseline = \"middle\";\n shownCols.forEach((c, j) => {\n ctx.textAlign = j === 0 ? \"left\" : \"right\";\n ctx.fillText(l[c], colX[j]!, rh / 2 + 1);\n });\n }\n\n // rows\n for (const row of rows) {\n const color = row.side === \"bid\" ? colors.up : colors.down;\n const key = `${row.side}:${row.price}`;\n const large = row.size >= threshold;\n // hover band (cumulative selection)\n if (hovered && hovered.side === row.side && row.index <= hovered.index) {\n ctx.fillStyle = toCss(theme.text, row === hovered ? 0.09 : 0.045);\n ctx.fillRect(0, row.y, width, rh);\n }\n // depth bar\n if (barsMode !== \"none\" && barMax > 0) {\n const value = barsMode === \"level\" ? row.size : row.sum;\n const w = (value / barMax) * width;\n ctx.fillStyle = toCss(color, 0.14);\n ctx.fillRect(width - w, row.y + 1, w, rh - 2);\n }\n if (large) {\n ctx.fillStyle = toCss(color, 0.16);\n ctx.fillRect(0, row.y + 1, width, rh - 2);\n // a small dot in the left padding marks the large level (no accent bar)\n ctx.fillStyle = toCss(color);\n ctx.beginPath();\n ctx.arc(\n pad / 2,\n row.y + rh / 2,\n Math.min(2.5, pad / 2 - 1),\n 0,\n Math.PI * 2,\n );\n ctx.fill();\n }\n // flash: behind the size that changed (a whole-row flash makes a\n // ladder at 200 updates/s flicker)\n const f = flashes.get(key);\n let flashAlpha = 0;\n if (flash && f && Number.isFinite(f.at)) {\n const age = (now - f.at) / duration;\n if (age < 1) {\n flashAlpha = (1 - age) * (1 - age);\n animating = true;\n }\n }\n // texts\n ctx.textBaseline = \"middle\";\n const ty = row.y + rh / 2 + 0.5;\n shownCols.forEach((c, j) => {\n ctx.textAlign = j === 0 ? \"left\" : \"right\";\n if (c === \"price\") {\n ctx.font = fontOf(theme, options, 500, fontSize);\n ctx.fillStyle = toCss(color);\n ctx.fillText(\n fmt.price(row.price),\n colX[j]! + (large && j === 0 ? 4 : 0),\n ty,\n );\n } else if (c === \"size\") {\n ctx.font = fontOf(theme, options, large ? 700 : 400, fontSize);\n const label = fmt.size(row.size);\n if (flashAlpha > 0 && f) {\n const w = ctx.measureText(label).width + 10;\n const x = j === 0 ? colX[j]! - 5 : colX[j]! - w + 5;\n ctx.fillStyle = toCss(\n f.grew ? color : theme.textMuted,\n (f.grew ? 0.45 : 0.3) * flashAlpha,\n );\n roundRect(ctx, x, row.y + 2, w, rh - 4, 3);\n ctx.fill();\n }\n ctx.fillStyle = text;\n ctx.fillText(label, colX[j]!, ty);\n } else {\n ctx.font = fontOf(theme, options, 400, fontSize);\n ctx.fillStyle = muted;\n ctx.fillText(\n options.total === \"quote\"\n ? fmt.notional(row.notional)\n : fmt.total(row.sum),\n colX[j]!,\n ty,\n );\n }\n });\n }\n if (hovered) {\n // edge of the selection\n ctx.strokeStyle = toCss(theme.textMuted, 0.7);\n ctx.setLineDash([3, 3]);\n ctx.beginPath();\n const edge =\n hovered.side === \"bid\" ? hovered.y + rh - 0.5 : hovered.y + 0.5;\n ctx.moveTo(0, edge);\n ctx.lineTo(width, edge);\n ctx.stroke();\n ctx.setLineDash([]);\n }\n\n // spread row\n if (spreadH) {\n const mid = store.mid();\n const shown = lastPrice ?? mid;\n if (Number.isFinite(shown) && shown !== previousLast) {\n if (Number.isFinite(previousLast))\n lastDirection =\n shown > previousLast\n ? 1\n : shown < previousLast\n ? -1\n : lastDirection;\n previousLast = shown;\n }\n const sy = spreadTop;\n ctx.fillStyle = toCss(theme.text, 0.035);\n ctx.fillRect(0, sy, width, spreadH);\n ctx.strokeStyle = toCss(theme.grid);\n ctx.beginPath();\n ctx.moveTo(0, Math.round(sy) + 0.5);\n ctx.lineTo(width, Math.round(sy) + 0.5);\n ctx.moveTo(0, Math.round(sy + spreadH) - 0.5);\n ctx.lineTo(width, Math.round(sy + spreadH) - 0.5);\n ctx.stroke();\n const dirColor =\n lastDirection > 0\n ? colors.up\n : lastDirection < 0\n ? colors.down\n : theme.text;\n const cy = sy + spreadH / 2 + 0.5;\n ctx.textBaseline = \"middle\";\n ctx.textAlign = \"left\";\n ctx.font = fontOf(theme, options, 700, fontSize + (compact ? 2 : 4));\n ctx.fillStyle = toCss(dirColor);\n const priceText = finePrice(shown);\n ctx.fillText(priceText, pad, cy);\n let x = pad + ctx.measureText(priceText).width + 6;\n if (lastDirection !== 0) {\n // arrow of the last move\n const s = compact ? 4 : 5;\n ctx.beginPath();\n if (lastDirection > 0) {\n ctx.moveTo(x, cy + s * 0.6);\n ctx.lineTo(x + s, cy - s * 0.7);\n ctx.lineTo(x + s * 2, cy + s * 0.6);\n } else {\n ctx.moveTo(x, cy - s * 0.6);\n ctx.lineTo(x + s, cy + s * 0.7);\n ctx.lineTo(x + s * 2, cy - s * 0.6);\n }\n ctx.closePath();\n ctx.fill();\n x += s * 2 + 6;\n }\n const spread = store.spread();\n if (Number.isFinite(spread)) {\n ctx.textAlign = \"right\";\n ctx.font = fontOf(theme, options, 400, fontSize - 1);\n const bps = (spread / mid) * 1e4;\n const right = `${finePrice(spread)} · ${fmt.fixed(bps, bps < 10 ? 2 : 1)} ${l.basisPoints}`;\n ctx.fillStyle = text;\n ctx.fillText(right, width - pad, cy);\n if (!compact) {\n const rw = ctx.measureText(right).width;\n ctx.fillStyle = muted;\n const label = `${l.spread}`;\n if (width - pad - rw - 8 - ctx.measureText(label).width > x)\n ctx.fillText(label, width - pad - rw - 8, cy);\n }\n }\n }\n\n // imbalance bar\n if (imbalanceH) {\n let bidSum = 0;\n let askSum = 0;\n for (const r of bids) bidSum += r.size;\n for (const r of asks) askSum += r.size;\n const all = bidSum + askSum;\n const share = all > 0 ? bidSum / all : 0.5;\n const by = height - imbalanceH + 6;\n const bh = imbalanceH - 10;\n const bw = width - pad * 2;\n const split = pad + bw * share;\n ctx.save();\n roundRect(ctx, pad, by, bw, bh, 3);\n ctx.clip();\n ctx.fillStyle = toCss(colors.up, 0.22);\n ctx.fillRect(pad, by, split - pad, bh);\n ctx.fillStyle = toCss(colors.down, 0.22);\n ctx.fillRect(split, by, pad + bw - split, bh);\n ctx.restore();\n ctx.fillStyle = toCss(theme.background);\n ctx.fillRect(split - 1, by, 2, bh);\n ctx.font = fontOf(theme, options, 600, fontSize - 1);\n ctx.textBaseline = \"middle\";\n ctx.textAlign = \"left\";\n ctx.fillStyle = toCss(colors.up);\n const mid = by + bh / 2 + 0.5;\n ctx.fillText(\n `${l.buyShare} ${fmt.percent(share, 1, false)}`,\n pad + 6,\n mid,\n );\n ctx.textAlign = \"right\";\n ctx.fillStyle = toCss(colors.down);\n ctx.fillText(\n `${fmt.percent(1 - share, 1, false)} ${l.sellShare}`,\n pad + bw - 6,\n mid,\n );\n }\n\n // tooltip and hover event\n if (hovered && options.tooltip !== false) {\n const color = hovered.side === \"bid\" ? colors.up : colors.down;\n tooltipHtml(\n doc,\n host.tooltip,\n { text: fmt.price(hovered.price), color: toCss(color) },\n [\n [l.average, finePrice(hovered.average)],\n [l.sum, fmt.total(hovered.sum)],\n [l.notional, fmt.notional(hovered.notional)],\n ],\n );\n host.tooltip.style.display = \"block\";\n const ax = hoverAt ? hoverAt[0] : width * 0.4;\n host.placeTooltip(\n host.tooltip,\n ax,\n hovered.y + rh / 2,\n ax > width / 2 ? \"left\" : \"right\",\n );\n } else {\n host.tooltip.style.display = \"none\";\n }\n const key = hovered\n ? `${hovered.side}|${hovered.index}|${hovered.price}|${hovered.size}|${hovered.sum}`\n : \"\";\n if (key !== hoverKey) {\n hoverKey = key;\n emitter.emit(\"hover\", hovered ? toEvent(hovered) : null);\n }\n\n const bb = store.bestBid();\n const ba = store.bestAsk();\n host.describe(\n `${options.ariaLabel ?? l.name}. ${l.bid} ${finePrice(bb)}, ${l.ask} ${finePrice(ba)}, ${l.spread} ${finePrice(ba - bb)}.`,\n );\n return animating;\n }\n\n const toEvent = (row: Row): OrderBookLevelEvent => ({\n side: row.side,\n index: row.index,\n price: row.price,\n size: row.size,\n sum: row.sum,\n notional: row.notional,\n average: row.average,\n });\n\n // ---------------------------------------------------------- interaction\n\n const onPointerMove = (event: PointerEvent) => {\n hoverAt = localPoint(root, event);\n keyRow = null;\n host.invalidate();\n };\n const onPointerLeave = () => {\n hoverAt = null;\n host.invalidate();\n };\n const onClick = (event: MouseEvent) => {\n const [x, y] = localPoint(root, event);\n const row = rows.find((r) => y >= r.y && y < r.y + rowHeight);\n if (row && x >= 0) emitter.emit(\"levelClick\", toEvent(row));\n };\n const onKeyDown = (event: KeyboardEvent) => {\n const order: { side: OrderBookSide; index: number }[] = [];\n const asks = rows.filter((r) => r.side === \"ask\");\n const bids = rows.filter((r) => r.side === \"bid\");\n for (let i = asks.length - 1; i >= 0; i--)\n order.push({ side: \"ask\", index: i });\n for (let i = 0; i < bids.length; i++) order.push({ side: \"bid\", index: i });\n if (!order.length) return;\n const current = keyRow\n ? order.findIndex(\n (o) => o.side === keyRow!.side && o.index === keyRow!.index,\n )\n : -1;\n switch (event.key) {\n case \"ArrowDown\":\n case \"ArrowUp\": {\n const down = event.key === \"ArrowDown\";\n // first press: the best level on that side of the spread\n const next =\n current >= 0\n ? clamp(current + (down ? 1 : -1), 0, order.length - 1)\n : down\n ? Math.min(asks.length, order.length - 1)\n : Math.max(0, asks.length - 1);\n keyRow = order[next] ?? null;\n hoverAt = null;\n host.invalidate();\n break;\n }\n case \"Enter\":\n case \" \":\n if (hovered) emitter.emit(\"levelClick\", toEvent(hovered));\n break;\n case \"Escape\":\n keyRow = null;\n host.invalidate();\n break;\n default:\n return;\n }\n event.preventDefault();\n };\n const onBlur = () => {\n if (keyRow) {\n keyRow = null;\n host.invalidate();\n }\n };\n root.addEventListener(\"pointermove\", onPointerMove);\n root.addEventListener(\"pointerleave\", onPointerLeave);\n root.addEventListener(\"click\", onClick);\n root.addEventListener(\"keydown\", onKeyDown);\n root.addEventListener(\"blur\", onBlur);\n\n const changed = () => {\n if (!inferred && store.count(\"bid\") + store.count(\"ask\") > 0) {\n inferred = true;\n refreshFormat();\n }\n host.invalidate();\n };\n\n const instance: OrderBookInstance = {\n setBook(snapshot) {\n store.setSnapshot(snapshot);\n inferred = false;\n changed();\n },\n applyDeltas(deltas) {\n if (applyDeltas(store, deltas)) changed();\n },\n clear() {\n store.clear();\n inferred = false;\n flashes = new Map();\n drawn = false;\n host.invalidate();\n },\n setLastPrice(price) {\n lastPrice = price !== null && Number.isFinite(price) ? price : null;\n host.invalidate();\n },\n setOptions(next) {\n const regroup =\n (next.grouping ?? 0) !== (options.grouping ?? 0) ||\n next.mode !== options.mode;\n options = next;\n if (regroup) applyOptions();\n else {\n applyTexts();\n colors = sideColors(host.theme, options);\n refreshFormat();\n host.invalidate();\n }\n },\n getStore: () => store,\n on: (event, handler) => emitter.on(event, handler),\n resize() {\n host.invalidate();\n },\n destroy() {\n root.removeEventListener(\"pointermove\", onPointerMove);\n root.removeEventListener(\"pointerleave\", onPointerLeave);\n root.removeEventListener(\"click\", onClick);\n root.removeEventListener(\"keydown\", onKeyDown);\n root.removeEventListener(\"blur\", onBlur);\n emitter.clear();\n host.destroy();\n },\n };\n applyOptions();\n return instance;\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e=(e,t,n,r,i,a=2)=>{let[o,s]=i,c=e.map((e,t)=>({label:e,i:t})).filter(({label:e})=>Number.isFinite(e.y)).sort((e,t)=>e.label.y-t.label.y||e.i-t.i),l=t=>{let n=0;t.items.forEach((r,i)=>{n+=e[r].y-t.offsets[i]});let r=n/t.items.length;t.top=Math.max(o,Math.min(r,s-t.height))},u=[];for(let{label:e,i:t}of c){let n={items:[t],offsets:[e.h/2],height:e.h,top:e.y-e.h/2};for(l(n),u.push(n);u.length>1;){let e=u[u.length-1],t=u[u.length-2];if(t.top+t.height+a<=e.top)break;let n=t.height+a;t.items.push(...e.items),t.offsets.push(...e.offsets.map(e=>e+n)),t.height+=a+e.height,u.pop(),l(t)}}let d=e.map(()=>null);for(let e of u)e.items.forEach((t,n)=>{d[t]=e.top+e.offsets[n]});let f=(e,t,n,r)=>Math.abs(e-n)<(t+r)/2+a;t&&d.forEach((n,r)=>{n!==null&&f(n,e[r].h,t.y,t.h)&&(d[r]=null)});let p=[];return d.forEach((t,n)=>{t!==null&&p.push({y:t,h:e[n].h})}),t&&p.push(t),{pinned:d,ticks:n.map(e=>e-r/2>=o&&e+r/2<=s&&!p.some(t=>f(e,r,t.y,t.h)))}},t=(e,t,n,r,i)=>{if(!Number.isFinite(t)||!Number.isFinite(n))return e?[e[0],e[1]]:[NaN,NaN];let a=i!==void 0&&i>0?i:Math.max(r,(n-t)*1.6);if(e&&Number.isFinite(e[0])&&Number.isFinite(e[1])){let r=e[1]-e[0],o=r*.12,s=t>=e[0]+o&&n<=e[1]-o,c=i!==void 0&&i>0?Math.abs(r/i-1)<1e-6:r<=a*1.8;if(s&&c)return[e[0],e[1]]}let o=(t+n)/2;return[o-a/2,o+a/2]},n=(e,t,n,r)=>[t-(Number.isFinite(e)?Math.max(Math.min(r,n),Math.min(n,t-e)):n),t],r=e=>{if(!(e>0)||!Number.isFinite(e))return 0;let t=10**Math.floor(Math.log10(e));for(let n of[1,1.2,1.5,2,2.5,3,4,5,6,8,10])if(n*t>=e*(1-1e-9))return+(n*t).toPrecision(12);return 10*t};exports.fineCeil=r,exports.fitPriceRange=t,exports.fitTimeRange=n,exports.layoutAxisLabels=e;
|
|
2
|
+
//# sourceMappingURL=layout.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.cjs","names":["layoutAxisLabels","top","bottom","bounds","order","pinned","label","a","b","place","sum","block","item","k","ideal","blocks","i","last","previous","gap","shift","o","centers","overlaps","ah","bh","hover","y","shown","ticks","tickHeight","fitPriceRange","lo","hi","current","want","fixedSpan","minSpan","span","margin","inside","sized","center","fitTimeRange","right","first","window","fineCeil","value","power","m"],"sources":["../../../../../charts/src/engine/orderbook/layout.ts"],"sourcesContent":["// Pure layout helpers of the order book widgets: price-axis label collision\n// resolution and the view fitting of the liquidity heatmap.\n\n/** A label on a vertical axis: center and height, in pixels */\nexport interface AxisLabel {\n y: number;\n h: number;\n}\n\n/** Result of `layoutAxisLabels` */\nexport interface AxisLabelLayout {\n /** Centers of the pinned labels (moved apart), `null` when hidden by the hover label */\n pinned: (number | null)[];\n /** Whether each tick label stays visible */\n ticks: boolean[];\n}\n\n/**\n * Resolves the collisions of the labels of a price axis. Priority: the\n * hover label stays where it is and hides the pinned labels it covers;\n * pinned labels (best bid / ask, last trade) never overlap each other: a\n * group of overlapping ones is stacked, in order, around their desired\n * positions and kept within `bounds`; tick labels under any of them are\n * hidden.\n */\nexport const layoutAxisLabels = (\n pinned: readonly AxisLabel[],\n hover: AxisLabel | null,\n ticks: readonly number[],\n tickHeight: number,\n bounds: readonly [number, number],\n gap = 2,\n): AxisLabelLayout => {\n const [top, bottom] = bounds;\n // blocks of stacked labels, top to bottom\n interface Block {\n items: number[];\n /** Offset of each item's center from the block's top */\n offsets: number[];\n height: number;\n top: number;\n }\n const order = pinned\n .map((label, i) => ({ label, i }))\n .filter(({ label }) => Number.isFinite(label.y))\n .sort((a, b) => a.label.y - b.label.y || a.i - b.i);\n const place = (block: Block) => {\n let sum = 0;\n block.items.forEach((item, k) => {\n sum += pinned[item]!.y - block.offsets[k]!;\n });\n const ideal = sum / block.items.length;\n block.top = Math.max(top, Math.min(ideal, bottom - block.height));\n };\n const blocks: Block[] = [];\n for (const { label, i } of order) {\n const block: Block = {\n items: [i],\n offsets: [label.h / 2],\n height: label.h,\n top: label.y - label.h / 2,\n };\n place(block);\n blocks.push(block);\n // merge with the blocks above while they overlap\n while (blocks.length > 1) {\n const last = blocks[blocks.length - 1]!;\n const previous = blocks[blocks.length - 2]!;\n if (previous.top + previous.height + gap <= last.top) break;\n const shift = previous.height + gap;\n previous.items.push(...last.items);\n previous.offsets.push(...last.offsets.map((o) => o + shift));\n previous.height += gap + last.height;\n blocks.pop();\n place(previous);\n }\n }\n const centers: (number | null)[] = pinned.map(() => null);\n for (const block of blocks) {\n block.items.forEach((item, k) => {\n centers[item] = block.top + block.offsets[k]!;\n });\n }\n const overlaps = (a: number, ah: number, b: number, bh: number) =>\n Math.abs(a - b) < (ah + bh) / 2 + gap;\n if (hover) {\n centers.forEach((y, i) => {\n if (y !== null && overlaps(y, pinned[i]!.h, hover.y, hover.h))\n centers[i] = null;\n });\n }\n const shown: AxisLabel[] = [];\n centers.forEach((y, i) => {\n if (y !== null) shown.push({ y, h: pinned[i]!.h });\n });\n if (hover) shown.push(hover);\n return {\n pinned: centers,\n ticks: ticks.map(\n (y) =>\n y - tickHeight / 2 >= top &&\n y + tickHeight / 2 <= bottom &&\n !shown.some((label) => overlaps(y, tickHeight, label.y, label.h)),\n ),\n };\n};\n\n/**\n * Price range of a following heatmap view, with hysteresis: the current\n * range is kept while the traded prices (`lo` – `hi`, best bid / ask of the\n * window) stay inside its inner part and it is not much too wide; otherwise\n * a range centered on them, `minSpan` or 1.6 × their spread high. With\n * `fixedSpan` (the user zoomed the prices) only the center moves.\n */\nexport const fitPriceRange = (\n current: readonly [number, number] | null,\n lo: number,\n hi: number,\n minSpan: number,\n fixedSpan?: number,\n): [number, number] => {\n if (!Number.isFinite(lo) || !Number.isFinite(hi)) {\n return current ? [current[0], current[1]] : [NaN, NaN];\n }\n const want =\n fixedSpan !== undefined && fixedSpan > 0\n ? fixedSpan\n : Math.max(minSpan, (hi - lo) * 1.6);\n if (current && Number.isFinite(current[0]) && Number.isFinite(current[1])) {\n const span = current[1] - current[0];\n const margin = span * 0.12;\n const inside = lo >= current[0] + margin && hi <= current[1] - margin;\n const sized =\n fixedSpan !== undefined && fixedSpan > 0\n ? Math.abs(span / fixedSpan - 1) < 1e-6\n : span <= want * 1.8;\n if (inside && sized) return [current[0], current[1]];\n }\n const center = (lo + hi) / 2;\n return [center - want / 2, center + want / 2];\n};\n\n/**\n * Time range of a following heatmap view ending at `right`: `window` wide\n * once the data covers it; before that, the span of the data (at least\n * `minSpan`), so a short history fills the plot from the left.\n */\nexport const fitTimeRange = (\n first: number,\n right: number,\n window: number,\n minSpan: number,\n): [number, number] => {\n const span = Number.isFinite(first)\n ? Math.max(Math.min(minSpan, window), Math.min(window, right - first))\n : window;\n return [right - span, right];\n};\n\n/** Smallest \"nice\" number (1, 2, 2.5, 5 × 10ⁿ) at least `value` */\nexport const niceCeil = (value: number): number => {\n if (!(value > 0) || !Number.isFinite(value)) return 0;\n const power = 10 ** Math.floor(Math.log10(value));\n for (const m of [1, 2, 2.5, 5, 10]) {\n if (m * power >= value * (1 - 1e-9)) return m * power;\n }\n return 10 * power;\n};\n\n/**\n * Smallest number of a fine \"nice\" series (1, 1.2, 1.5, 2, 2.5, 3, 4, 5,\n * 6, 8 × 10ⁿ) at least `value`: a scale at most a third above the value\n */\nexport const fineCeil = (value: number): number => {\n if (!(value > 0) || !Number.isFinite(value)) return 0;\n const power = 10 ** Math.floor(Math.log10(value));\n for (const m of [1, 1.2, 1.5, 2, 2.5, 3, 4, 5, 6, 8, 10]) {\n if (m * power >= value * (1 - 1e-9)) return +(m * power).toPrecision(12);\n }\n return 10 * power;\n};\n"],"mappings":"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"}
|