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":"drawings.js","names":["FIB_LEVELS","FIB_COLORS","anchorCount","tool","screenPoints","drawing","m","p","distanceToSegment","dx","b","a","dy","len2","t","extendStart","extendEnd","hitDrawing","pts","i","q","tolerance","near","d","x0","x1","level","y","y0","y1","setDash","style","ctx","width","extend","len","k","roundRect","x","w","h","r","paintDrawing","state","c","line","paintFib","paintMeasure","p1","p2","ys","color","price","rising","midX","midY","arrow","from","to","angle","change","percent","bars","lines","widths","lx","ly"],"sources":["../../../../../charts/src/engine/trading/drawings.ts"],"sourcesContent":["// Drawings of the price pane: geometry in CSS pixels, hit tests and\n// Canvas2D painting. Anchors are stored as (time, price) so drawings stay\n// on their bars when the chart scrolls, zooms or receives new bars.\n\nimport type {\n TradingDrawing,\n TradingDrawingPoint,\n TradingDrawingTool,\n TradingLineStyle,\n} from \"./types\";\n\n/** Converts between anchors and the pixels of the price pane */\nexport interface DrawingMapper {\n /** x (CSS px) of a logical bar index */\n x(index: number): number;\n /** y (CSS px) of a price */\n y(price: number): number;\n /** Logical index of a time (extrapolated outside the bars) */\n index(time: number): number;\n /** Plot rectangle of the price pane */\n left: number;\n right: number;\n top: number;\n bottom: number;\n}\n\nexport interface Point {\n x: number;\n y: number;\n}\n\n/** Fibonacci retracement levels */\nexport const FIB_LEVELS = [0, 0.236, 0.382, 0.5, 0.618, 0.786, 1];\nconst FIB_COLORS = [\n \"#787b86\",\n \"#f23645\",\n \"#ff9800\",\n \"#4caf50\",\n \"#089981\",\n \"#2962ff\",\n \"#787b86\",\n];\n\n/** Number of anchors of a tool */\nexport const anchorCount = (tool: Exclude<TradingDrawingTool, \"cursor\">) =>\n tool === \"horizontalLine\" || tool === \"verticalLine\" ? 1 : 2;\n\nexport const screenPoints = (\n drawing: TradingDrawing,\n m: DrawingMapper,\n): Point[] =>\n drawing.points.map((p) => ({ x: m.x(m.index(p.time)), y: m.y(p.price) }));\n\nconst distanceToSegment = (\n p: Point,\n a: Point,\n b: Point,\n extendStart: boolean,\n extendEnd: boolean,\n) => {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const len2 = dx * dx + dy * dy;\n if (len2 === 0) return Math.hypot(p.x - a.x, p.y - a.y);\n let t = ((p.x - a.x) * dx + (p.y - a.y) * dy) / len2;\n if (!extendStart) t = Math.max(0, t);\n if (!extendEnd) t = Math.min(1, t);\n return Math.hypot(p.x - (a.x + t * dx), p.y - (a.y + t * dy));\n};\n\n/** Part of a drawing under the pointer */\nexport type DrawingHit = { part: \"handle\"; index: number } | { part: \"body\" };\n\nexport const hitDrawing = (\n drawing: TradingDrawing,\n m: DrawingMapper,\n p: Point,\n tolerance = 6,\n): DrawingHit | null => {\n const pts = screenPoints(drawing, m);\n for (let i = 0; i < pts.length; i++) {\n const q = pts[i];\n if (Math.hypot(q.x - p.x, q.y - p.y) <= tolerance + 2)\n return { part: \"handle\", index: i };\n }\n const [a, b] = pts;\n if (!a) return null;\n const near = (d: number) =>\n d <= tolerance ? { part: \"body\" as const } : null;\n switch (drawing.type) {\n case \"horizontalLine\":\n return near(Math.abs(p.y - a.y));\n case \"verticalLine\":\n return near(Math.abs(p.x - a.x));\n case \"trendLine\":\n return b ? near(distanceToSegment(p, a, b, false, false)) : null;\n case \"ray\":\n return b ? near(distanceToSegment(p, a, b, false, true)) : null;\n case \"extendedLine\":\n return b ? near(distanceToSegment(p, a, b, true, true)) : null;\n case \"fibRetracement\": {\n if (!b) return null;\n const x0 = Math.min(a.x, b.x);\n const x1 = Math.max(a.x, b.x);\n if (p.x < x0 - tolerance || p.x > x1 + tolerance) return null;\n for (const level of FIB_LEVELS) {\n const y = b.y + (a.y - b.y) * level;\n if (Math.abs(p.y - y) <= tolerance) return { part: \"body\" };\n }\n return null;\n }\n default: {\n // rectangle, measure: inside or on the outline\n if (!b) return null;\n const x0 = Math.min(a.x, b.x) - tolerance;\n const x1 = Math.max(a.x, b.x) + tolerance;\n const y0 = Math.min(a.y, b.y) - tolerance;\n const y1 = Math.max(a.y, b.y) + tolerance;\n return p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1\n ? { part: \"body\" }\n : null;\n }\n }\n};\n\nexport const setDash = (\n ctx: CanvasRenderingContext2D,\n style: TradingLineStyle | undefined,\n width: number,\n) => {\n if (style === \"dashed\") ctx.setLineDash([6, 4]);\n else if (style === \"dotted\") ctx.setLineDash([Math.max(1, width), 3]);\n else ctx.setLineDash([]);\n};\n\n/** Values and helpers the painter needs from the chart */\nexport interface DrawingPaintContext {\n /** Resolved CSS color of a drawing */\n color: string;\n /** Text color on the plot */\n text: string;\n /** Background of the plot (handles) */\n background: string;\n /** Up / down colors (measure) */\n up: string;\n down: string;\n font: string;\n formatPrice(price: number): string;\n formatPercent(value: number): string;\n /** `\"24 bars, 2d 4h\"` */\n formatSpan(bars: number, ms: number): string;\n /** Readable text color on a fill */\n textOn(fill: string): string;\n}\n\n/** Point at the end of a line through `a` and `b`, far past the plot */\nconst extend = (a: Point, b: Point, m: DrawingMapper): Point => {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const len = Math.hypot(dx, dy);\n if (!len) return b;\n const k = (Math.abs(m.right - m.left) + Math.abs(m.bottom - m.top)) * 4;\n return { x: a.x + (dx / len) * k, y: a.y + (dy / len) * k };\n};\n\nconst roundRect = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n) => {\n ctx.beginPath();\n if (typeof ctx.roundRect === \"function\") ctx.roundRect(x, y, w, h, r);\n else ctx.rect(x, y, w, h);\n};\n\n/** Paints a drawing (the context is clipped to the price pane) */\nexport const paintDrawing = (\n ctx: CanvasRenderingContext2D,\n drawing: TradingDrawing,\n m: DrawingMapper,\n c: DrawingPaintContext,\n state: { selected: boolean; hovered: boolean },\n): void => {\n const pts = screenPoints(drawing, m);\n const [a, b] = pts;\n if (!a) return;\n const width = (drawing.lineWidth ?? 1.5) + (state.hovered ? 0.5 : 0);\n ctx.save();\n ctx.lineWidth = width;\n ctx.strokeStyle = c.color;\n ctx.fillStyle = c.color;\n ctx.font = c.font;\n setDash(ctx, drawing.lineStyle, width);\n const line = (p: Point, q: Point) => {\n ctx.beginPath();\n ctx.moveTo(p.x, p.y);\n ctx.lineTo(q.x, q.y);\n ctx.stroke();\n };\n switch (drawing.type) {\n case \"horizontalLine\":\n line({ x: m.left, y: a.y }, { x: m.right, y: a.y });\n break;\n case \"verticalLine\":\n line({ x: a.x, y: m.top }, { x: a.x, y: m.bottom });\n break;\n case \"trendLine\":\n if (b) line(a, b);\n break;\n case \"ray\":\n if (b) line(a, extend(a, b, m));\n break;\n case \"extendedLine\":\n if (b) line(extend(b, a, m), extend(a, b, m));\n break;\n case \"rectangle\":\n if (b) {\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n const w = Math.abs(b.x - a.x);\n const h = Math.abs(b.y - a.y);\n ctx.globalAlpha = 0.12;\n ctx.fillRect(x, y, w, h);\n ctx.globalAlpha = 1;\n ctx.strokeRect(x, y, w, h);\n }\n break;\n case \"fibRetracement\":\n if (b) paintFib(ctx, drawing, a, b, c);\n break;\n case \"measure\":\n if (b) paintMeasure(ctx, drawing, a, b, m, c);\n break;\n }\n if (state.selected || state.hovered) {\n ctx.setLineDash([]);\n ctx.lineWidth = 1.5;\n for (const p of pts) {\n ctx.beginPath();\n ctx.arc(p.x, p.y, state.selected ? 4.5 : 3.5, 0, Math.PI * 2);\n ctx.fillStyle = c.background;\n ctx.fill();\n ctx.strokeStyle = c.color;\n ctx.stroke();\n }\n }\n ctx.restore();\n};\n\nconst paintFib = (\n ctx: CanvasRenderingContext2D,\n drawing: TradingDrawing,\n a: Point,\n b: Point,\n c: DrawingPaintContext,\n) => {\n const x0 = Math.min(a.x, b.x);\n const x1 = Math.max(a.x, b.x);\n const p1 = drawing.points[0]?.price ?? 0;\n const p2 = drawing.points[1]?.price ?? 0;\n const ys = FIB_LEVELS.map((level) => b.y + (a.y - b.y) * level);\n // bands between levels\n for (let i = 0; i + 1 < FIB_LEVELS.length; i++) {\n ctx.globalAlpha = 0.08;\n ctx.fillStyle = drawing.color ? c.color : FIB_COLORS[i + 1];\n ctx.fillRect(\n x0,\n Math.min(ys[i], ys[i + 1]),\n x1 - x0,\n Math.abs(ys[i + 1] - ys[i]),\n );\n }\n ctx.globalAlpha = 1;\n ctx.textBaseline = \"bottom\";\n ctx.textAlign = \"left\";\n FIB_LEVELS.forEach((level, i) => {\n const y = Math.round(ys[i]) + 0.5;\n const color = drawing.color ? c.color : FIB_COLORS[i];\n ctx.strokeStyle = color;\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.moveTo(x0, y);\n ctx.lineTo(x1, y);\n ctx.stroke();\n const price = p2 + (p1 - p2) * level;\n ctx.fillText(`${level} (${c.formatPrice(price)})`, x0 + 4, y - 2);\n });\n // the trend line between the anchors\n ctx.setLineDash([4, 4]);\n ctx.strokeStyle = c.color;\n ctx.globalAlpha = 0.6;\n ctx.beginPath();\n ctx.moveTo(a.x, a.y);\n ctx.lineTo(b.x, b.y);\n ctx.stroke();\n ctx.globalAlpha = 1;\n};\n\nconst paintMeasure = (\n ctx: CanvasRenderingContext2D,\n drawing: TradingDrawing,\n a: Point,\n b: Point,\n m: DrawingMapper,\n c: DrawingPaintContext,\n) => {\n const [p1, p2] = drawing.points as [TradingDrawingPoint, TradingDrawingPoint];\n const rising = p2.price >= p1.price;\n const color = drawing.color ? c.color : rising ? c.up : c.down;\n const x0 = Math.min(a.x, b.x);\n const x1 = Math.max(a.x, b.x);\n const y0 = Math.min(a.y, b.y);\n const y1 = Math.max(a.y, b.y);\n ctx.setLineDash([]);\n ctx.fillStyle = color;\n ctx.globalAlpha = 0.14;\n ctx.fillRect(x0, y0, x1 - x0, y1 - y0);\n ctx.globalAlpha = 1;\n ctx.strokeStyle = color;\n ctx.lineWidth = 1;\n // arrows across the box\n const midX = Math.round((x0 + x1) / 2) + 0.5;\n const midY = Math.round((y0 + y1) / 2) + 0.5;\n const arrow = (from: Point, to: Point) => {\n ctx.beginPath();\n ctx.moveTo(from.x, from.y);\n ctx.lineTo(to.x, to.y);\n ctx.stroke();\n const angle = Math.atan2(to.y - from.y, to.x - from.x);\n ctx.beginPath();\n ctx.moveTo(to.x, to.y);\n ctx.lineTo(\n to.x - 6 * Math.cos(angle - 0.5),\n to.y - 6 * Math.sin(angle - 0.5),\n );\n ctx.lineTo(\n to.x - 6 * Math.cos(angle + 0.5),\n to.y - 6 * Math.sin(angle + 0.5),\n );\n ctx.closePath();\n ctx.fill();\n };\n if (y1 - y0 > 10)\n arrow({ x: midX, y: rising ? y1 : y0 }, { x: midX, y: rising ? y0 : y1 });\n if (x1 - x0 > 10)\n arrow(\n { x: a.x < b.x ? x0 : x1, y: midY },\n { x: a.x < b.x ? x1 : x0, y: midY },\n );\n // label\n const change = p2.price - p1.price;\n const percent = p1.price ? (change / p1.price) * 100 : NaN;\n const bars = Math.round(m.index(p2.time) - m.index(p1.time));\n const lines = [\n `${change >= 0 ? \"+\" : \"−\"}${c.formatPrice(Math.abs(change))} (${c.formatPercent(percent)})`,\n c.formatSpan(bars, p2.time - p1.time),\n ];\n const widths = lines.map((t) => ctx.measureText(t).width);\n const w = Math.max(...widths) + 16;\n const h = 38;\n const lx = (x0 + x1) / 2 - w / 2;\n const below = !rising;\n const ly = below ? y1 + 6 : y0 - h - 6;\n roundRect(ctx, lx, ly, w, h, 4);\n ctx.fillStyle = color;\n ctx.fill();\n ctx.fillStyle = c.textOn(color);\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(lines[0], lx + w / 2, ly + 11);\n ctx.fillText(lines[1], lx + w / 2, ly + 27);\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"drawings.js","names":["FIB_LEVELS","FIB_COLORS","anchorCount","tool","isFillable","type","isPosition","drawingPrices","pts","drawing","first","xs","index","p","lo","hi","from","to","prices","b","c","xa","dx","t","offset","screenPoints","m","channelLines","a","dy","pitchforkLines","mid","dir","positionGeometry","entry","target","stop","handlePoints","g","edge","parallel","box","moveHandle","points","point","distanceToSegment","len2","extendStart","extendEnd","inPolygon","inside","i","j","q","hitDrawing","handles","tolerance","near","d","inRect","x0","x1","y0","y1","r","lines","top","bottom","level","y","setDash","style","ctx","width","extend","len","k","roundRect","x","w","h","paintDrawing","third","state","filled","line","shade","alpha","paintArrow","far","paintFib","paintMeasure","paintText","angle","head","size","lineHeight","inset","paintPosition","long","color","change","price","reward","risk","ratio","texts","label","tw","text","above","fill","targetUp","parts","move","percent","value","center","labelX","p1","p2","ys","rising","midX","midY","arrow","bars","widths","lx","ly"],"sources":["../../../../../charts/src/engine/trading/drawings.ts"],"sourcesContent":["// Drawings: geometry in CSS pixels, handles, hit tests and Canvas2D\n// painting. Anchors are stored as (time, price) so drawings stay on their\n// bars when the chart scrolls, zooms or receives new bars; a drawing lives\n// in a pane (the price pane or an indicator pane) and uses its scale.\n\nimport type {\n TradingDrawing,\n TradingDrawingPoint,\n TradingDrawingTool,\n TradingLineStyle,\n} from \"./types\";\n\n/** Converts between anchors and the pixels of a pane */\nexport interface DrawingMapper {\n /** x (CSS px) of a logical bar index */\n x(index: number): number;\n /** y (CSS px) of a price */\n y(price: number): number;\n /** Logical index of a time (extrapolated outside the bars) */\n index(time: number): number;\n /** Plot rectangle of the pane */\n left: number;\n right: number;\n top: number;\n bottom: number;\n}\n\nexport interface Point {\n x: number;\n y: number;\n}\n\n/** Rectangle in CSS pixels (text boxes, measured when painted) */\nexport interface Box {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\ntype DrawingType = Exclude<TradingDrawingTool, \"cursor\">;\n\n/** Fibonacci retracement levels */\nexport const FIB_LEVELS = [0, 0.236, 0.382, 0.5, 0.618, 0.786, 1];\nconst FIB_COLORS = [\n \"#787b86\",\n \"#f23645\",\n \"#ff9800\",\n \"#4caf50\",\n \"#089981\",\n \"#2962ff\",\n \"#787b86\",\n];\n\n/** Clicks that create a drawing (positions get a default target and stop) */\nexport const anchorCount = (tool: DrawingType): number => {\n switch (tool) {\n case \"horizontalLine\":\n case \"verticalLine\":\n case \"text\":\n case \"longPosition\":\n case \"shortPosition\":\n return 1;\n case \"parallelChannel\":\n case \"pitchfork\":\n return 3;\n default:\n return 2;\n }\n};\n\n/** Drawings with an area that `fill` can turn off */\nexport const isFillable = (type: DrawingType): boolean =>\n type === \"rectangle\" ||\n type === \"parallelChannel\" ||\n type === \"pitchfork\" ||\n type === \"fibRetracement\" ||\n type === \"text\";\n\nexport const isPosition = (type: DrawingType): boolean =>\n type === \"longPosition\" || type === \"shortPosition\";\n\n/**\n * Prices a drawing spans when it overlaps the bars `[from, to]` (logical\n * indices), for `autoscaleIncludesDrawings`: its anchors and the parallel of\n * channels; horizontal lines always count, vertical lines never\n */\nexport const drawingPrices = (\n drawing: TradingDrawing,\n index: (time: number) => number,\n from: number,\n to: number,\n): number[] => {\n const pts = drawing.points;\n const first = pts[0];\n if (!first || drawing.type === \"verticalLine\") return [];\n if (drawing.type === \"horizontalLine\")\n return Number.isFinite(first.price) ? [first.price] : [];\n const xs = pts.map((p) => index(p.time));\n let lo = Math.min(...xs);\n let hi = Math.max(...xs);\n // lines extended past their anchors\n if (drawing.type === \"ray\" || drawing.type === \"pitchfork\") hi = Infinity;\n if (drawing.type === \"extendedLine\") {\n lo = -Infinity;\n hi = Infinity;\n }\n if (hi < from || lo > to) return [];\n const prices = pts.map((p) => p.price);\n const b = pts[1];\n const c = pts[2];\n if (drawing.type === \"parallelChannel\" && b && c) {\n const xa = xs[0] ?? 0;\n const dx = (xs[1] ?? 0) - xa;\n const t = dx ? ((xs[2] ?? 0) - xa) / dx : 0;\n const offset = c.price - (first.price + t * (b.price - first.price));\n prices.push(first.price + offset, b.price + offset);\n }\n return prices.filter(Number.isFinite);\n};\n\nexport const screenPoints = (\n drawing: TradingDrawing,\n m: DrawingMapper,\n): Point[] =>\n drawing.points.map((p) => ({ x: m.x(m.index(p.time)), y: m.y(p.price) }));\n\n/** Lines of a parallel channel: the base line and the parallel through the third anchor */\nconst channelLines = (a: Point, b: Point, c: Point) => {\n const dx = b.x - a.x;\n const t = dx ? (c.x - a.x) / dx : 0;\n const dy = c.y - (a.y + t * (b.y - a.y));\n return {\n base: [a, b] as const,\n parallel: [\n { x: a.x, y: a.y + dy },\n { x: b.x, y: b.y + dy },\n ] as const,\n };\n};\n\n/** Median line of a pitchfork: from the pivot through the middle of the other anchors */\nconst pitchforkLines = (a: Point, b: Point, c: Point) => {\n const mid = { x: (b.x + c.x) / 2, y: (b.y + c.y) / 2 };\n const dir = { x: mid.x - a.x, y: mid.y - a.y };\n return {\n median: [a, mid] as const,\n upper: [b, { x: b.x + dir.x, y: b.y + dir.y }] as const,\n lower: [c, { x: c.x + dir.x, y: c.y + dir.y }] as const,\n };\n};\n\n/** Pixels of a position drawing: the box and its three prices */\nconst positionGeometry = (pts: Point[]) => {\n const [entry, target, stop] = pts;\n if (!entry || !target || !stop) return null;\n const x0 = Math.min(entry.x, target.x);\n const x1 = Math.max(entry.x, target.x);\n return { x0, x1, entry: entry.y, target: target.y, stop: stop.y };\n};\n\n/** Handles of a drawing, in the order `moveHandle` understands */\nexport const handlePoints = (\n drawing: TradingDrawing,\n m: DrawingMapper,\n box?: Box,\n): Point[] => {\n const pts = screenPoints(drawing, m);\n if (isPosition(drawing.type)) {\n const g = positionGeometry(pts);\n const entry = pts[0];\n if (!g || !entry) return pts.slice(0, 1);\n const edge = pts[1] ? pts[1].x : entry.x;\n return [\n { x: entry.x, y: g.entry },\n { x: entry.x, y: g.target },\n { x: entry.x, y: g.stop },\n { x: edge, y: g.entry },\n ];\n }\n if (drawing.type === \"parallelChannel\") {\n const [a, b, c] = pts;\n if (!a || !b || !c) return pts;\n const { parallel } = channelLines(a, b, c);\n return [\n a,\n b,\n {\n x: (parallel[0].x + parallel[1].x) / 2,\n y: (parallel[0].y + parallel[1].y) / 2,\n },\n ];\n }\n if (drawing.type === \"text\" && box && pts[0]) return [pts[0]];\n return pts;\n};\n\n/** New anchors after dragging handle `index` to `point` */\nexport const moveHandle = (\n drawing: TradingDrawing,\n index: number,\n point: TradingDrawingPoint,\n): TradingDrawingPoint[] => {\n const points = [...drawing.points];\n if (isPosition(drawing.type)) {\n const [entry, target, stop] = points;\n if (!entry || !target || !stop) return points;\n switch (index) {\n case 0:\n return [point, target, stop];\n case 1:\n return [entry, { ...target, price: point.price }, stop];\n case 2:\n return [entry, target, { ...stop, price: point.price }];\n default:\n return [\n entry,\n { ...target, time: point.time },\n { ...stop, time: point.time },\n ];\n }\n }\n if (index >= 0 && index < points.length) points[index] = point;\n return points;\n};\n\nconst distanceToSegment = (\n p: Point,\n a: Point,\n b: Point,\n extendStart: boolean,\n extendEnd: boolean,\n) => {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const len2 = dx * dx + dy * dy;\n if (len2 === 0) return Math.hypot(p.x - a.x, p.y - a.y);\n let t = ((p.x - a.x) * dx + (p.y - a.y) * dy) / len2;\n if (!extendStart) t = Math.max(0, t);\n if (!extendEnd) t = Math.min(1, t);\n return Math.hypot(p.x - (a.x + t * dx), p.y - (a.y + t * dy));\n};\n\n/** Whether `p` is inside the quadrilateral `q` (convex or not, even-odd rule) */\nconst inPolygon = (p: Point, q: readonly Point[]) => {\n let inside = false;\n for (let i = 0, j = q.length - 1; i < q.length; j = i++) {\n const a = q[i];\n const b = q[j];\n if (!a || !b) continue;\n if (\n a.y > p.y !== b.y > p.y &&\n p.x < ((b.x - a.x) * (p.y - a.y)) / (b.y - a.y || 1e-9) + a.x\n )\n inside = !inside;\n }\n return inside;\n};\n\n/** Part of a drawing under the pointer */\nexport type DrawingHit = { part: \"handle\"; index: number } | { part: \"body\" };\n\nexport const hitDrawing = (\n drawing: TradingDrawing,\n m: DrawingMapper,\n p: Point,\n tolerance = 6,\n box?: Box,\n): DrawingHit | null => {\n const handles = handlePoints(drawing, m, box);\n for (let i = 0; i < handles.length; i++) {\n const q = handles[i];\n if (q && Math.hypot(q.x - p.x, q.y - p.y) <= tolerance + 2)\n return { part: \"handle\", index: i };\n }\n const pts = screenPoints(drawing, m);\n const [a, b, c] = pts;\n if (!a) return null;\n const near = (d: number) =>\n d <= tolerance ? { part: \"body\" as const } : null;\n const inRect = (x0: number, y0: number, x1: number, y1: number) =>\n p.x >= Math.min(x0, x1) - tolerance &&\n p.x <= Math.max(x0, x1) + tolerance &&\n p.y >= Math.min(y0, y1) - tolerance &&\n p.y <= Math.max(y0, y1) + tolerance;\n switch (drawing.type) {\n case \"horizontalLine\":\n return near(Math.abs(p.y - a.y));\n case \"verticalLine\":\n return near(Math.abs(p.x - a.x));\n case \"trendLine\":\n case \"arrow\":\n return b ? near(distanceToSegment(p, a, b, false, false)) : null;\n case \"ray\":\n return b ? near(distanceToSegment(p, a, b, false, true)) : null;\n case \"extendedLine\":\n return b ? near(distanceToSegment(p, a, b, true, true)) : null;\n case \"text\": {\n const r = box ?? { x: a.x, y: a.y, w: 40, h: 22 };\n return inRect(r.x, r.y, r.x + r.w, r.y + r.h) ? { part: \"body\" } : null;\n }\n case \"parallelChannel\": {\n if (!b || !c) return null;\n const { parallel } = channelLines(a, b, c);\n if (inPolygon(p, [a, b, parallel[1], parallel[0]]))\n return { part: \"body\" };\n return near(\n Math.min(\n distanceToSegment(p, a, b, false, false),\n distanceToSegment(p, parallel[0], parallel[1], false, false),\n ),\n );\n }\n case \"pitchfork\": {\n if (!b || !c) return null;\n const lines = pitchforkLines(a, b, c);\n return near(\n Math.min(\n distanceToSegment(p, lines.median[0], lines.median[1], false, true),\n distanceToSegment(p, lines.upper[0], lines.upper[1], false, true),\n distanceToSegment(p, lines.lower[0], lines.lower[1], false, true),\n distanceToSegment(p, b, c, false, false),\n ),\n );\n }\n case \"longPosition\":\n case \"shortPosition\": {\n const g = positionGeometry(pts);\n if (!g) return null;\n const top = Math.min(g.target, g.stop);\n const bottom = Math.max(g.target, g.stop);\n return inRect(g.x0, top, g.x1, bottom) ? { part: \"body\" } : null;\n }\n case \"fibRetracement\": {\n if (!b) return null;\n const x0 = Math.min(a.x, b.x);\n const x1 = Math.max(a.x, b.x);\n if (p.x < x0 - tolerance || p.x > x1 + tolerance) return null;\n for (const level of FIB_LEVELS) {\n const y = b.y + (a.y - b.y) * level;\n if (Math.abs(p.y - y) <= tolerance) return { part: \"body\" };\n }\n return null;\n }\n default:\n // rectangle, measure: inside or on the outline\n return b && inRect(a.x, a.y, b.x, b.y) ? { part: \"body\" } : null;\n }\n};\n\nexport const setDash = (\n ctx: CanvasRenderingContext2D,\n style: TradingLineStyle | undefined,\n width: number,\n) => {\n if (style === \"dashed\") ctx.setLineDash([6, 4]);\n else if (style === \"dotted\") ctx.setLineDash([Math.max(1, width), 3]);\n else ctx.setLineDash([]);\n};\n\n/** Texts of the position tools (templates of the chart labels) */\nexport interface PositionTexts {\n target: string;\n stop: string;\n riskReward: string;\n profit: string;\n long: string;\n short: string;\n}\n\n/** Values and helpers the painter needs from the chart */\nexport interface DrawingPaintContext {\n /** Resolved CSS color of a drawing */\n color: string;\n /** Text color on the plot */\n text: string;\n /** Background of the plot (handles) */\n background: string;\n /** Up / down colors (measure, positions) */\n up: string;\n down: string;\n font: string;\n /** Font family of the text drawings */\n fontFamily: string;\n formatPrice(price: number): string;\n formatPercent(value: number): string;\n /** `\"24 bars, 2d 4h\"` */\n formatSpan(bars: number, ms: number): string;\n /** Readable text color on a fill */\n textOn(fill: string): string;\n /** Default text of a text drawing */\n defaultText: string;\n /** Texts of the position tools */\n position: PositionTexts;\n /** Last price (profit of the position tools) */\n last: number;\n /** Fills `{name}` placeholders */\n fill(template: string, values: Record<string, string | number>): string;\n}\n\n/** Point at the end of a line through `a` and `b`, far past the plot */\nconst extend = (a: Point, b: Point, m: DrawingMapper): Point => {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const len = Math.hypot(dx, dy);\n if (!len) return b;\n const k = (Math.abs(m.right - m.left) + Math.abs(m.bottom - m.top)) * 4;\n return { x: a.x + (dx / len) * k, y: a.y + (dy / len) * k };\n};\n\nconst roundRect = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n) => {\n ctx.beginPath();\n if (typeof ctx.roundRect === \"function\") ctx.roundRect(x, y, w, h, r);\n else ctx.rect(x, y, w, h);\n};\n\n/**\n * Paints a drawing (the context is clipped to its pane). Returns the box of\n * a text drawing, used by the hit tests.\n */\nexport const paintDrawing = (\n ctx: CanvasRenderingContext2D,\n drawing: TradingDrawing,\n m: DrawingMapper,\n c: DrawingPaintContext,\n state: { selected: boolean; hovered: boolean },\n): Box | null => {\n const pts = screenPoints(drawing, m);\n const [a, b, third] = pts;\n if (!a) return null;\n const width = (drawing.lineWidth ?? 1.5) + (state.hovered ? 0.5 : 0);\n const filled = drawing.fill !== false;\n let box: Box | null = null;\n ctx.save();\n ctx.lineWidth = width;\n ctx.strokeStyle = c.color;\n ctx.fillStyle = c.color;\n ctx.font = c.font;\n ctx.lineCap = \"round\";\n setDash(ctx, drawing.lineStyle, width);\n const line = (p: Point, q: Point) => {\n ctx.beginPath();\n ctx.moveTo(p.x, p.y);\n ctx.lineTo(q.x, q.y);\n ctx.stroke();\n };\n const shade = (points: readonly Point[], alpha = 0.1) => {\n if (!filled) return;\n ctx.save();\n ctx.globalAlpha = alpha;\n ctx.beginPath();\n points.forEach((p, i) => (i ? ctx.lineTo(p.x, p.y) : ctx.moveTo(p.x, p.y)));\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n };\n switch (drawing.type) {\n case \"horizontalLine\":\n line({ x: m.left, y: a.y }, { x: m.right, y: a.y });\n break;\n case \"verticalLine\":\n line({ x: a.x, y: m.top }, { x: a.x, y: m.bottom });\n break;\n case \"trendLine\":\n if (b) line(a, b);\n break;\n case \"arrow\":\n if (b) paintArrow(ctx, a, b, width);\n break;\n case \"ray\":\n if (b) line(a, extend(a, b, m));\n break;\n case \"extendedLine\":\n if (b) line(extend(b, a, m), extend(a, b, m));\n break;\n case \"rectangle\":\n if (b) {\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n shade([\n { x, y },\n { x: x + Math.abs(b.x - a.x), y },\n { x: x + Math.abs(b.x - a.x), y: y + Math.abs(b.y - a.y) },\n { x, y: y + Math.abs(b.y - a.y) },\n ]);\n ctx.strokeRect(x, y, Math.abs(b.x - a.x), Math.abs(b.y - a.y));\n }\n break;\n case \"parallelChannel\":\n if (b && third) {\n const { parallel } = channelLines(a, b, third);\n shade([a, b, parallel[1], parallel[0]]);\n line(a, b);\n line(parallel[0], parallel[1]);\n // the middle line, dashed\n ctx.save();\n ctx.globalAlpha = 0.55;\n ctx.setLineDash([4, 4]);\n line(\n { x: a.x, y: (a.y + parallel[0].y) / 2 },\n { x: b.x, y: (b.y + parallel[1].y) / 2 },\n );\n ctx.restore();\n } else if (b) {\n line(a, b);\n }\n break;\n case \"pitchfork\":\n if (b && third) {\n const lines = pitchforkLines(a, b, third);\n const far = (p: readonly [Point, Point]) => extend(p[0], p[1], m);\n shade([b, far(lines.upper), far(lines.lower), third], 0.07);\n line(lines.median[0], far(lines.median));\n line(b, far(lines.upper));\n line(third, far(lines.lower));\n ctx.save();\n ctx.globalAlpha = 0.55;\n ctx.setLineDash([4, 4]);\n line(b, third);\n ctx.restore();\n } else if (b) {\n line(a, b);\n }\n break;\n case \"fibRetracement\":\n if (b) paintFib(ctx, drawing, a, b, c, filled, m);\n break;\n case \"measure\":\n if (b) paintMeasure(ctx, drawing, a, b, m, c);\n break;\n case \"text\":\n box = paintText(ctx, drawing, a, c, filled);\n break;\n case \"longPosition\":\n case \"shortPosition\":\n paintPosition(ctx, drawing, pts, m, c);\n break;\n }\n if (state.selected || state.hovered) {\n ctx.setLineDash([]);\n ctx.lineWidth = 1.5;\n for (const p of handlePoints(drawing, m, box ?? undefined)) {\n ctx.beginPath();\n ctx.arc(p.x, p.y, state.selected ? 4.5 : 3.5, 0, Math.PI * 2);\n ctx.fillStyle = c.background;\n ctx.fill();\n ctx.strokeStyle = c.color;\n ctx.stroke();\n }\n }\n ctx.restore();\n return box;\n};\n\nconst paintArrow = (\n ctx: CanvasRenderingContext2D,\n a: Point,\n b: Point,\n width: number,\n) => {\n const angle = Math.atan2(b.y - a.y, b.x - a.x);\n const head = 8 + width * 2;\n const len = Math.hypot(b.x - a.x, b.y - a.y);\n // the shaft stops inside the head so the tip stays sharp\n const k = len > head ? (len - head * 0.6) / len : 0;\n ctx.beginPath();\n ctx.moveTo(a.x, a.y);\n ctx.lineTo(a.x + (b.x - a.x) * k, a.y + (b.y - a.y) * k);\n ctx.stroke();\n ctx.setLineDash([]);\n ctx.beginPath();\n ctx.moveTo(b.x, b.y);\n ctx.lineTo(\n b.x - head * Math.cos(angle - 0.42),\n b.y - head * Math.sin(angle - 0.42),\n );\n ctx.lineTo(\n b.x - head * Math.cos(angle + 0.42),\n b.y - head * Math.sin(angle + 0.42),\n );\n ctx.closePath();\n ctx.fill();\n};\n\nconst paintText = (\n ctx: CanvasRenderingContext2D,\n drawing: TradingDrawing,\n a: Point,\n c: DrawingPaintContext,\n filled: boolean,\n): Box => {\n const size = drawing.fontSize ?? 13;\n const lines = (drawing.text || c.defaultText).split(\"\\n\");\n ctx.font = `500 ${size}px ${c.fontFamily}`;\n const lineHeight = Math.round(size * 1.35);\n // a note card: room for the colored dot before the text\n const inset = filled ? 22 : 10;\n const w = Math.max(...lines.map((t) => ctx.measureText(t).width)) + inset + 8;\n const h = lines.length * lineHeight + 10;\n const box = { x: a.x, y: a.y, w, h };\n ctx.setLineDash([]);\n if (filled) {\n // a note card: the plot background tinted, a subtle border all around\n // and a colored dot\n roundRect(ctx, a.x + 0.5, a.y + 0.5, w - 1, h - 1, 5);\n ctx.globalAlpha = 0.94;\n ctx.fillStyle = c.background;\n ctx.fill();\n ctx.globalAlpha = 0.1;\n ctx.fillStyle = c.color;\n ctx.fill();\n ctx.globalAlpha = 0.55;\n ctx.lineWidth = 1;\n ctx.strokeStyle = c.color;\n ctx.stroke();\n ctx.globalAlpha = 1;\n ctx.fillStyle = c.color;\n ctx.beginPath();\n ctx.arc(a.x + 11, a.y + 5 + lineHeight / 2, 3.5, 0, Math.PI * 2);\n ctx.fill();\n }\n ctx.fillStyle = filled ? c.text : c.color;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n lines.forEach((t, i) =>\n ctx.fillText(t, a.x + inset, a.y + 5 + lineHeight * (i + 0.5)),\n );\n return box;\n};\n\nconst paintPosition = (\n ctx: CanvasRenderingContext2D,\n drawing: TradingDrawing,\n pts: Point[],\n m: DrawingMapper,\n c: DrawingPaintContext,\n) => {\n const g = positionGeometry(pts);\n const [entry, target, stop] = drawing.points;\n if (!g || !entry || !target || !stop) return;\n const long = drawing.type === \"longPosition\";\n const w = Math.max(1, g.x1 - g.x0);\n ctx.setLineDash([]);\n // the reward zone and the risk zone\n for (const [y, color] of [\n [g.target, c.up],\n [g.stop, c.down],\n ] as const) {\n ctx.globalAlpha = 0.16;\n ctx.fillStyle = color;\n ctx.fillRect(g.x0, Math.min(y, g.entry), w, Math.abs(y - g.entry));\n ctx.globalAlpha = 0.7;\n ctx.strokeStyle = color;\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(g.x0, Math.round(y) + 0.5);\n ctx.lineTo(g.x1, Math.round(y) + 0.5);\n ctx.stroke();\n }\n ctx.globalAlpha = 1;\n ctx.strokeStyle = c.text;\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(g.x0, Math.round(g.entry) + 0.5);\n ctx.lineTo(g.x1, Math.round(g.entry) + 0.5);\n ctx.stroke();\n const dir = long ? 1 : -1;\n const change = (price: number) =>\n c.formatPercent(((price - entry.price) / entry.price) * 100);\n const reward = Math.abs(target.price - entry.price);\n const risk = Math.abs(entry.price - stop.price);\n const ratio = risk > 0 ? reward / risk : NaN;\n const texts = c.position;\n const label = (text: string, y: number, fill: string, above: boolean) => {\n ctx.font = c.font;\n const tw = ctx.measureText(text).width + 14;\n const x = Math.max(\n m.left + 2,\n Math.min(g.x0 + w / 2 - tw / 2, m.right - tw - 2),\n );\n const top = above ? y - 24 : y + 4;\n roundRect(ctx, x, top, tw, 20, 4);\n ctx.fillStyle = fill;\n ctx.fill();\n ctx.fillStyle = c.textOn(fill);\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(text, x + tw / 2, top + 10.5);\n };\n const targetUp = g.target < g.entry;\n label(\n c.fill(texts.target, {\n price: c.formatPrice(target.price),\n change: change(target.price),\n }),\n g.target,\n c.up,\n targetUp,\n );\n label(\n c.fill(texts.stop, {\n price: c.formatPrice(stop.price),\n change: change(stop.price),\n }),\n g.stop,\n c.down,\n !targetUp,\n );\n // the side, the ratio and the profit at the last price\n const parts = [\n long ? texts.long : texts.short,\n c.fill(texts.riskReward, {\n ratio: Number.isFinite(ratio) ? ratio.toFixed(2) : \"–\",\n }),\n ];\n if (Number.isFinite(c.last) && entry.price) {\n const move = (c.last - entry.price) * dir;\n const percent = c.formatPercent((move / entry.price) * 100);\n const value =\n drawing.quantity !== undefined\n ? `${move * drawing.quantity >= 0 ? \"+\" : \"−\"}${c.formatPrice(Math.abs(move * drawing.quantity))} (${percent})`\n : percent;\n parts.push(c.fill(texts.profit, { value }));\n }\n ctx.font = c.font;\n const text = parts.join(\" · \");\n const tw = ctx.measureText(text).width + 16;\n const x = Math.max(\n m.left + 2,\n Math.min(g.x0 + w / 2 - tw / 2, m.right - tw - 2),\n );\n const center = g.entry - 10;\n roundRect(ctx, x, center, tw, 20, 4);\n ctx.fillStyle = c.text;\n ctx.fill();\n ctx.fillStyle = c.background;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(text, x + tw / 2, center + 10.5);\n};\n\nconst paintFib = (\n ctx: CanvasRenderingContext2D,\n drawing: TradingDrawing,\n a: Point,\n b: Point,\n c: DrawingPaintContext,\n filled: boolean,\n m: DrawingMapper,\n) => {\n const x0 = Math.min(a.x, b.x);\n const x1 = Math.max(a.x, b.x);\n // labels stay readable when the left anchor is scrolled out\n const labelX = Math.max(x0, m.left) + 4;\n const p1 = drawing.points[0]?.price ?? 0;\n const p2 = drawing.points[1]?.price ?? 0;\n const ys = FIB_LEVELS.map((level) => b.y + (a.y - b.y) * level);\n // bands between levels\n if (filled) {\n for (let i = 0; i + 1 < FIB_LEVELS.length; i++) {\n ctx.globalAlpha = 0.08;\n ctx.fillStyle = drawing.color ? c.color : (FIB_COLORS[i + 1] ?? c.color);\n ctx.fillRect(\n x0,\n Math.min(ys[i] ?? 0, ys[i + 1] ?? 0),\n x1 - x0,\n Math.abs((ys[i + 1] ?? 0) - (ys[i] ?? 0)),\n );\n }\n }\n ctx.globalAlpha = 1;\n ctx.textBaseline = \"bottom\";\n ctx.textAlign = \"left\";\n FIB_LEVELS.forEach((level, i) => {\n const y = Math.round(ys[i] ?? 0) + 0.5;\n const color = drawing.color ? c.color : (FIB_COLORS[i] ?? c.color);\n ctx.strokeStyle = color;\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.moveTo(x0, y);\n ctx.lineTo(x1, y);\n ctx.stroke();\n const price = p2 + (p1 - p2) * level;\n ctx.fillText(`${level} (${c.formatPrice(price)})`, labelX, y - 2);\n });\n // the trend line between the anchors\n ctx.setLineDash([4, 4]);\n ctx.strokeStyle = c.color;\n ctx.globalAlpha = 0.6;\n ctx.beginPath();\n ctx.moveTo(a.x, a.y);\n ctx.lineTo(b.x, b.y);\n ctx.stroke();\n ctx.globalAlpha = 1;\n};\n\nconst paintMeasure = (\n ctx: CanvasRenderingContext2D,\n drawing: TradingDrawing,\n a: Point,\n b: Point,\n m: DrawingMapper,\n c: DrawingPaintContext,\n) => {\n const [p1, p2] = drawing.points as [TradingDrawingPoint, TradingDrawingPoint];\n const rising = p2.price >= p1.price;\n const color = drawing.color ? c.color : rising ? c.up : c.down;\n const x0 = Math.min(a.x, b.x);\n const x1 = Math.max(a.x, b.x);\n const y0 = Math.min(a.y, b.y);\n const y1 = Math.max(a.y, b.y);\n ctx.setLineDash([]);\n ctx.fillStyle = color;\n ctx.globalAlpha = 0.14;\n ctx.fillRect(x0, y0, x1 - x0, y1 - y0);\n ctx.globalAlpha = 1;\n ctx.strokeStyle = color;\n ctx.lineWidth = 1;\n // arrows across the box\n const midX = Math.round((x0 + x1) / 2) + 0.5;\n const midY = Math.round((y0 + y1) / 2) + 0.5;\n const arrow = (from: Point, to: Point) => {\n ctx.beginPath();\n ctx.moveTo(from.x, from.y);\n ctx.lineTo(to.x, to.y);\n ctx.stroke();\n const angle = Math.atan2(to.y - from.y, to.x - from.x);\n ctx.beginPath();\n ctx.moveTo(to.x, to.y);\n ctx.lineTo(\n to.x - 6 * Math.cos(angle - 0.5),\n to.y - 6 * Math.sin(angle - 0.5),\n );\n ctx.lineTo(\n to.x - 6 * Math.cos(angle + 0.5),\n to.y - 6 * Math.sin(angle + 0.5),\n );\n ctx.closePath();\n ctx.fill();\n };\n if (y1 - y0 > 10)\n arrow({ x: midX, y: rising ? y1 : y0 }, { x: midX, y: rising ? y0 : y1 });\n if (x1 - x0 > 10)\n arrow(\n { x: a.x < b.x ? x0 : x1, y: midY },\n { x: a.x < b.x ? x1 : x0, y: midY },\n );\n // label\n const change = p2.price - p1.price;\n const percent = p1.price ? (change / p1.price) * 100 : NaN;\n const bars = Math.round(m.index(p2.time) - m.index(p1.time));\n const lines = [\n `${change >= 0 ? \"+\" : \"−\"}${c.formatPrice(Math.abs(change))} (${c.formatPercent(percent)})`,\n c.formatSpan(bars, p2.time - p1.time),\n ];\n const widths = lines.map((t) => ctx.measureText(t).width);\n const w = Math.max(...widths) + 16;\n const h = 38;\n const lx = (x0 + x1) / 2 - w / 2;\n const below = !rising;\n // flip inside the pane when the label would leave it\n let ly = below ? y1 + 6 : y0 - h - 6;\n if (ly < m.top + 2) ly = y1 + 6;\n if (ly + h > m.bottom - 2) ly = Math.max(m.top + 2, y0 - h - 6);\n roundRect(ctx, lx, ly, w, h, 4);\n ctx.fillStyle = color;\n ctx.fill();\n ctx.fillStyle = c.textOn(color);\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(lines[0] ?? \"\", lx + w / 2, ly + 11);\n ctx.fillText(lines[1] ?? \"\", lx + w / 2, ly + 27);\n};\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../locale.cjs");var t=6e4,n=36e5,r=864e5,i=(t,n)=>e.numberFormat(e.resolveLocale(t),n),a=(e,t,n)=>{let r=0,i=Math.max(0,n-300,t);for(let t=i;t<n;t++){let n=Math.abs(e[t]);if(Number.isFinite(n))for(;r<8;){let e=n*10**r;if(Math.abs(e-Math.round(e))<1e-8*Math.max(1,e))break;r++}}return r},
|
|
1
|
+
const e=require("../locale.cjs");var t=6e4,n=36e5,r=864e5,i=(t,n)=>e.numberFormat(e.resolveLocale(t),n),a=new Set([`CN`,`TW`,`JP`,`KR`]),o=new Set([`zh`,`ja`,`ko`]),s=e=>{let t=e.split(/[-_]/),n=t.slice(1).find(e=>/^([A-Za-z]{2}|\d{3})$/.test(e));return n?a.has(n.toUpperCase()):o.has((t[0]??``).toLowerCase())},c=(e,t,n)=>{let r=0,i=Math.max(0,n-300,t);for(let t=i;t<n;t++){let n=Math.abs(e[t]);if(Number.isFinite(n))for(;r<8;){let e=n*10**r;if(Math.abs(e-Math.round(e))<1e-8*Math.max(1,e))break;r++}}return r},l=(e,t)=>{let n=Math.max(0,Math.min(12,Math.round(e))),r=i(t,{minimumFractionDigits:n,maximumFractionDigits:n});return e=>Number.isFinite(e)?u(r.format(e)):`–`},u=e=>e.replace(`-`,`−`),d=(t,n)=>{if(!Number.isFinite(t))return`–`;let r=i(n,{maximumFractionDigits:2}),a=Math.abs(t);for(let[i,o]of e.compactUnits(n))if(a>=i*.999995)return u(`${r.format(t/i)}${o}`);return u(r.format(t))},f=(e,t,n=2)=>{if(!Number.isFinite(e))return`–`;let r=i(t,{minimumFractionDigits:n,maximumFractionDigits:n}).format(Math.abs(e));return`${Math.abs(e)<.5*10**-n?``:e>0?`+`:`−`}${r}%`},p=(e,t,n)=>Number.isFinite(e)?u(i(n,{minimumFractionDigits:t,maximumFractionDigits:t}).format(e)):`–`,m=new Map,h=(t,n)=>{let r=`${t??``}|${JSON.stringify(n)}`,i=m.get(r);if(!i){let a={...n,timeZone:`UTC`};try{i=new Intl.DateTimeFormat(e.resolveLocale(t),a)}catch{i=new Intl.DateTimeFormat(`en`,a)}m.set(r,i)}return i},g=(e,t)=>typeof e==`number`?e:e(t),_=new Map,v=new Map,y=15*t,b=e=>x(e)!==null,x=e=>{let t=_.get(e);if(t===void 0){try{t=new Intl.DateTimeFormat(`en-US`,{timeZone:e,hourCycle:`h23`,year:`numeric`,month:`numeric`,day:`numeric`,hour:`numeric`,minute:`numeric`})}catch{t=null}_.set(e,t)}return t},S=(e,n)=>{let r=x(n);if(!r||!Number.isFinite(e))return-new Date(Number.isFinite(e)?e:0).getTimezoneOffset();let i=v.get(n);i||v.set(n,i=new Map);let a=Math.floor(e/y),o=i.get(a);if(o===void 0){let e=a*y,n={};for(let t of r.formatToParts(e))t.type!==`literal`&&(n[t.type]=Number(t.value));let s=Date.UTC(n.year??1970,(n.month??1)-1,n.day??1,(n.hour??0)%24,n.minute??0);o=Math.round((s-e)/t),i.size>5e4&&i.clear(),i.set(a,o)}return o},C=(e,r)=>{if(!Number.isFinite(e))return 70;let i=new Date(e),a=new Date(r);if(i.getUTCFullYear()!==a.getUTCFullYear())return 70;if(i.getUTCMonth()!==a.getUTCMonth())return 60;if(i.getUTCDate()!==a.getUTCDate())return 50;let o=[[12*n,46],[6*n,45],[3*n,44],[n,43],[30*t,34],[15*t,33],[5*t,32],[t,31],[3e4,24],[15e3,23],[5e3,22],[1e3,21]];for(let[t,n]of o)if(Math.floor(e/t)!==Math.floor(r/t))return n;return 10},w=(e,t,n,r)=>t>=70?h(n,{year:`numeric`}).format(e):t>=60?h(n,{month:`short`}).format(e):t>=50?r?h(n,{month:`short`,day:`numeric`}).format(e):h(n,{day:`numeric`}).format(e):t>=30?h(n,{hour:`2-digit`,minute:`2-digit`,hourCycle:`h23`}).format(e):h(n,{hour:`2-digit`,minute:`2-digit`,second:`2-digit`,hourCycle:`h23`}).format(e),T=(e,t)=>{let n=e.map((e,t)=>t).sort((t,n)=>e[n].weight-e[t].weight||t-n),r=[],i=[];for(let a of n){let n=e[a],o=0,s=r.length;for(;o<s;){let e=o+s>>>1;r[e]<n.x?o=e+1:s=e}let c=o>0?r[o-1]:-1/0,l=o<r.length?r[o]:1/0;n.x-c<t||l-n.x<t||(r.splice(o,0,n.x),i.push(n))}return i.sort((e,t)=>e.x-t.x)},E=(e,t,n)=>{let r={weekday:`short`,year:`numeric`,month:`short`,day:`numeric`};return t>=864e5?h(n,r).format(e):h(n,{...r,hour:`2-digit`,minute:`2-digit`,...t<6e4?{second:`2-digit`}:{},hourCycle:`h23`}).format(e)},D=(e,t={days:`{count}d`,hours:`{count}h`})=>{let n=Math.max(0,Math.floor(e/1e3)),r=e=>String(e).padStart(2,`0`);if(n>=86400){let e=String(Math.floor(n/86400)),i=r(Math.floor(n%86400/3600));return`${t.days.replace(`{count}`,e)} ${t.hours.replace(`{count}`,i)}`}return n>=3600?`${r(Math.floor(n/3600))}:${r(Math.floor(n%3600/60))}:${r(n%60)}`:`${r(Math.floor(n/60))}:${r(n%60)}`},O=(e,t)=>{let n=[];for(let r=Math.max(1,t-64);r<t;r++){let t=e[r]-e[r-1];t>0&&Number.isFinite(t)&&n.push(t)}return n.length?(n.sort((e,t)=>e-t),n[Math.floor(n.length*.25)]):r};exports.DAY=r,exports.HOUR=n,exports.MINUTE=t,exports.boundaryWeight=C,exports.dateFormat=h,exports.detectPrecision=c,exports.formatCountdown=D,exports.formatCrosshairTime=E,exports.formatFixed=p,exports.formatPercent=f,exports.formatVolume=d,exports.inferTimeframe=O,exports.isTimeZone=b,exports.offsetOf=g,exports.pickTicks=T,exports.priceFormatter=l,exports.redUpLocale=s,exports.tickText=w,exports.typographicMinus=u,exports.zoneOffset=S;
|
|
2
2
|
//# sourceMappingURL=format.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.cjs","names":["sharedNumberFormat","resolveLocale","compactUnits","require_locale","MINUTE","HOUR","DAY","numberFormat","locale","options","detectPrecision","decimals","start","to","from","i","v","values","scaled","priceFormatter","p","precision","format","value","formatVolume","abs","unit","suffix","formatPercent","text","formatFixed","dateFormats","dateFormat","key","full","offsetAt","utcOffset","time","shiftTime","boundaryWeight","prev","a","b","steps","weight","tickText","intraday","pickTicks","order","candidates","kept","result","c","lo","hi","mid","left","right","minGap","formatCrosshairTime","date","timeframeMs","shifted","formatCountdown","s","ms","pad","days","hours","units","inferTimeframe","gaps","n","d"],"sources":["../../../../../charts/src/engine/trading/format.ts"],"sourcesContent":["// Formatting of prices, volumes and times, and the labels of the time axis.\n// `locale` is resolved by the caller (`resolveLocale`) on hot paths.\n\nimport {\n compactUnits,\n numberFormat as sharedNumberFormat,\n resolveLocale,\n} from \"../locale\";\n\nexport const MINUTE = 60_000;\nexport const HOUR = 3_600_000;\nexport const DAY = 86_400_000;\n\nconst numberFormat = (\n locale: string | undefined,\n options: Intl.NumberFormatOptions,\n): Intl.NumberFormat => sharedNumberFormat(resolveLocale(locale), options);\n\n/** Decimals needed by the prices (0-8), detected from a sample of them */\nexport const detectPrecision = (\n values: ArrayLike<number>,\n from: number,\n to: number,\n): number => {\n let decimals = 0;\n const start = Math.max(0, to - 300, from);\n for (let i = start; i < to; i++) {\n const v = Math.abs(values[i]);\n if (!Number.isFinite(v)) continue;\n while (decimals < 8) {\n const scaled = v * 10 ** decimals;\n if (Math.abs(scaled - Math.round(scaled)) < 1e-8 * Math.max(1, scaled))\n break;\n decimals++;\n }\n }\n return decimals;\n};\n\n/** Price formatter: fixed decimals, grouped digits of `locale` */\nexport const priceFormatter = (\n precision: number,\n locale: string | undefined,\n): ((value: number) => string) => {\n const p = Math.max(0, Math.min(12, Math.round(precision)));\n const format = numberFormat(locale, {\n minimumFractionDigits: p,\n maximumFractionDigits: p,\n });\n return (value) => (Number.isFinite(value) ? format.format(value) : \"–\");\n};\n\n/** `12345678` -> `12.35M` (`1234.57万` in Chinese and Japanese) */\nexport const formatVolume = (value: number, locale?: string): string => {\n if (!Number.isFinite(value)) return \"–\";\n const format = numberFormat(locale, { maximumFractionDigits: 2 });\n const abs = Math.abs(value);\n for (const [unit, suffix] of compactUnits(locale)) {\n // 999,999 shows as 1M, not 1,000k\n if (abs >= unit * 0.999995)\n return `${format.format(value / unit)}${suffix}`;\n }\n return format.format(value);\n};\n\n/** `+1.25%` */\nexport const formatPercent = (\n value: number,\n locale?: string,\n decimals = 2,\n): string => {\n if (!Number.isFinite(value)) return \"–\";\n const text = numberFormat(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(Math.abs(value));\n const zero = Math.abs(value) < 0.5 * 10 ** -decimals;\n return `${zero ? \"\" : value > 0 ? \"+\" : \"−\"}${text}%`;\n};\n\n/** Any value with `decimals` decimals (indicator panes) */\nexport const formatFixed = (\n value: number,\n decimals: number,\n locale?: string,\n): string =>\n Number.isFinite(value)\n ? numberFormat(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(value)\n : \"–\";\n\n// ------------------------------------------------------------------ times\n\nconst dateFormats = new Map<string, Intl.DateTimeFormat>();\n\n/** Formats shifted times with the UTC getters (the offset is applied before) */\nexport const dateFormat = (\n locale: string | undefined,\n options: Intl.DateTimeFormatOptions,\n): Intl.DateTimeFormat => {\n const key = `${locale ?? \"\"}|${JSON.stringify(options)}`;\n let format = dateFormats.get(key);\n if (!format) {\n const full = { ...options, timeZone: \"UTC\" };\n try {\n format = new Intl.DateTimeFormat(resolveLocale(locale), full);\n } catch {\n format = new Intl.DateTimeFormat(\"en\", full);\n }\n dateFormats.set(key, format);\n }\n return format;\n};\n\n/** Offset of the displayed time from UTC, in minutes, at `time` */\nexport const offsetAt = (time: number, utcOffset: number | undefined) =>\n utcOffset ?? -new Date(Number.isFinite(time) ? time : 0).getTimezoneOffset();\n\n/** Time shifted so that the UTC getters read the displayed time */\nexport const shiftTime = (time: number, utcOffset: number | undefined) =>\n time + offsetAt(time, utcOffset) * MINUTE;\n\n/**\n * Weight of the boundary between two consecutive (shifted) bar times: the\n * largest calendar unit that changes (year 70, month 60, day 50, hours\n * 43-46, minutes 31-34, seconds 21-24, 10 otherwise)\n */\nexport const boundaryWeight = (prev: number, time: number): number => {\n if (!Number.isFinite(prev)) return 70;\n const a = new Date(prev);\n const b = new Date(time);\n if (a.getUTCFullYear() !== b.getUTCFullYear()) return 70;\n if (a.getUTCMonth() !== b.getUTCMonth()) return 60;\n if (a.getUTCDate() !== b.getUTCDate()) return 50;\n const steps: readonly [number, number][] = [\n [12 * HOUR, 46],\n [6 * HOUR, 45],\n [3 * HOUR, 44],\n [HOUR, 43],\n [30 * MINUTE, 34],\n [15 * MINUTE, 33],\n [5 * MINUTE, 32],\n [MINUTE, 31],\n [30_000, 24],\n [15_000, 23],\n [5_000, 22],\n [1_000, 21],\n ];\n for (const [unit, weight] of steps) {\n if (Math.floor(prev / unit) !== Math.floor(time / unit)) return weight;\n }\n return 10;\n};\n\n/** A label of the time axis */\nexport interface TimeTick {\n /** x in CSS pixels */\n x: number;\n text: string;\n /** Larger unit (new day of an intraday chart, new month / year) */\n bold: boolean;\n}\n\n/** Text of a tick of weight `weight` at the shifted time `time` */\nexport const tickText = (\n time: number,\n weight: number,\n locale: string | undefined,\n intraday: boolean,\n): string => {\n if (weight >= 70) return dateFormat(locale, { year: \"numeric\" }).format(time);\n if (weight >= 60) return dateFormat(locale, { month: \"short\" }).format(time);\n if (weight >= 50) {\n return intraday\n ? dateFormat(locale, { month: \"short\", day: \"numeric\" }).format(time)\n : dateFormat(locale, { day: \"numeric\" }).format(time);\n }\n if (weight >= 30)\n return dateFormat(locale, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hourCycle: \"h23\",\n }).format(time);\n return dateFormat(locale, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hourCycle: \"h23\",\n }).format(time);\n};\n\n/**\n * Picks the time labels: candidates by decreasing weight, each kept when\n * no kept label is closer than `minGap` pixels\n */\nexport const pickTicks = (\n candidates: readonly { x: number; weight: number; time: number }[],\n minGap: number,\n): { x: number; weight: number; time: number }[] => {\n const order = candidates\n .map((_, i) => i)\n .sort((a, b) => candidates[b].weight - candidates[a].weight || a - b);\n const kept: number[] = [];\n const result: { x: number; weight: number; time: number }[] = [];\n for (const i of order) {\n const c = candidates[i];\n // binary search of the kept x positions\n let lo = 0;\n let hi = kept.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (kept[mid] < c.x) lo = mid + 1;\n else hi = mid;\n }\n const left = lo > 0 ? kept[lo - 1] : -Infinity;\n const right = lo < kept.length ? kept[lo] : Infinity;\n if (c.x - left < minGap || right - c.x < minGap) continue;\n kept.splice(lo, 0, c.x);\n result.push(c);\n }\n return result.sort((a, b) => a.x - b.x);\n};\n\n/** Full time of the crosshair label (`Tue 12 Mar '24 14:35`) */\nexport const formatCrosshairTime = (\n shifted: number,\n timeframeMs: number,\n locale: string | undefined,\n): string => {\n const date: Intl.DateTimeFormatOptions = {\n weekday: \"short\",\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n };\n if (timeframeMs >= DAY) return dateFormat(locale, date).format(shifted);\n return dateFormat(locale, {\n ...date,\n hour: \"2-digit\",\n minute: \"2-digit\",\n ...(timeframeMs < MINUTE ? { second: \"2-digit\" } : {}),\n hourCycle: \"h23\",\n }).format(shifted);\n};\n\n/**\n * Time left before a bar closes: `42`, `04:59`, `03:04:59`, `2d 04h` (the\n * day and hour templates replace `{count}`)\n */\nexport const formatCountdown = (\n ms: number,\n units: { days: string; hours: string } = {\n days: \"{count}d\",\n hours: \"{count}h\",\n },\n): string => {\n const s = Math.max(0, Math.floor(ms / 1000));\n const pad = (v: number) => String(v).padStart(2, \"0\");\n if (s >= 86_400) {\n const days = String(Math.floor(s / 86_400));\n const hours = pad(Math.floor((s % 86_400) / 3600));\n return `${units.days.replace(\"{count}\", days)} ${units.hours.replace(\"{count}\", hours)}`;\n }\n if (s >= 3600)\n return `${pad(Math.floor(s / 3600))}:${pad(Math.floor((s % 3600) / 60))}:${pad(s % 60)}`;\n return `${pad(Math.floor(s / 60))}:${pad(s % 60)}`;\n};\n\n/** Typical duration between bars: the median of the last gaps */\nexport const inferTimeframe = (time: ArrayLike<number>, n: number): number => {\n const gaps: number[] = [];\n for (let i = Math.max(1, n - 64); i < n; i++) {\n const d = time[i] - time[i - 1];\n if (d > 0 && Number.isFinite(d)) gaps.push(d);\n }\n if (!gaps.length) return DAY;\n gaps.sort((a, b) => a - b);\n // the smallest frequent gap: weekends and nights make larger ones\n return gaps[Math.floor(gaps.length * 0.25)];\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"format.cjs","names":["sharedNumberFormat","resolveLocale","compactUnits","require_locale","MINUTE","HOUR","DAY","numberFormat","locale","options","RED_UP_REGIONS","RED_UP_LANGUAGES","redUpLocale","parts","region","part","detectPrecision","decimals","start","to","from","i","v","values","scaled","priceFormatter","p","precision","format","value","typographicMinus","text","formatVolume","abs","unit","suffix","formatPercent","formatFixed","dateFormats","dateFormat","key","full","offsetOf","offset","time","zoneFormats","zoneOffsets","QUARTER","isTimeZone","zoneFormat","timeZone","zoneOffset","cache","bucket","at","local","boundaryWeight","prev","a","b","steps","weight","tickText","intraday","pickTicks","order","candidates","kept","result","c","lo","hi","mid","left","right","minGap","formatCrosshairTime","date","timeframeMs","shifted","formatCountdown","s","ms","pad","days","hours","units","inferTimeframe","gaps","n","d"],"sources":["../../../../../charts/src/engine/trading/format.ts"],"sourcesContent":["// Formatting of prices, volumes and times, and the labels of the time axis.\n// `locale` is resolved by the caller (`resolveLocale`) on hot paths.\n\nimport {\n compactUnits,\n numberFormat as sharedNumberFormat,\n resolveLocale,\n} from \"../locale\";\n\nexport const MINUTE = 60_000;\nexport const HOUR = 3_600_000;\nexport const DAY = 86_400_000;\n\nconst numberFormat = (\n locale: string | undefined,\n options: Intl.NumberFormatOptions,\n): Intl.NumberFormat => sharedNumberFormat(resolveLocale(locale), options);\n\nconst RED_UP_REGIONS = new Set([\"CN\", \"TW\", \"JP\", \"KR\"]);\nconst RED_UP_LANGUAGES = new Set([\"zh\", \"ja\", \"ko\"]);\n\n/**\n * Whether the markets of `locale` show rising prices in red (`colorConvention:\n * \"auto\"`): regions CN, TW, JP and KR, or Chinese / Japanese / Korean without a\n * region (`zh-Hant` too; `zh-HK` / `zh-SG` follow the global convention)\n */\nexport const redUpLocale = (locale: string): boolean => {\n const parts = locale.split(/[-_]/);\n const region = parts\n .slice(1)\n .find((part) => /^([A-Za-z]{2}|\\d{3})$/.test(part));\n if (region) return RED_UP_REGIONS.has(region.toUpperCase());\n return RED_UP_LANGUAGES.has((parts[0] ?? \"\").toLowerCase());\n};\n\n/** Decimals needed by the prices (0-8), detected from a sample of them */\nexport const detectPrecision = (\n values: ArrayLike<number>,\n from: number,\n to: number,\n): number => {\n let decimals = 0;\n const start = Math.max(0, to - 300, from);\n for (let i = start; i < to; i++) {\n const v = Math.abs(values[i]);\n if (!Number.isFinite(v)) continue;\n while (decimals < 8) {\n const scaled = v * 10 ** decimals;\n if (Math.abs(scaled - Math.round(scaled)) < 1e-8 * Math.max(1, scaled))\n break;\n decimals++;\n }\n }\n return decimals;\n};\n\n/** Price formatter: fixed decimals, grouped digits of `locale` */\nexport const priceFormatter = (\n precision: number,\n locale: string | undefined,\n): ((value: number) => string) => {\n const p = Math.max(0, Math.min(12, Math.round(precision)));\n const format = numberFormat(locale, {\n minimumFractionDigits: p,\n maximumFractionDigits: p,\n });\n return (value) =>\n Number.isFinite(value) ? typographicMinus(format.format(value)) : \"–\";\n};\n\n/** The minus sign (U+2212) instead of the hyphen-minus of `Intl` */\nexport const typographicMinus = (text: string): string =>\n text.replace(\"-\", \"−\");\n\n/** `12345678` -> `12.35M` (`1234.57万` in Chinese and Japanese) */\nexport const formatVolume = (value: number, locale?: string): string => {\n if (!Number.isFinite(value)) return \"–\";\n const format = numberFormat(locale, { maximumFractionDigits: 2 });\n const abs = Math.abs(value);\n for (const [unit, suffix] of compactUnits(locale)) {\n // 999,999 shows as 1M, not 1,000k\n if (abs >= unit * 0.999995)\n return typographicMinus(`${format.format(value / unit)}${suffix}`);\n }\n return typographicMinus(format.format(value));\n};\n\n/** `+1.25%` */\nexport const formatPercent = (\n value: number,\n locale?: string,\n decimals = 2,\n): string => {\n if (!Number.isFinite(value)) return \"–\";\n const text = numberFormat(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(Math.abs(value));\n const zero = Math.abs(value) < 0.5 * 10 ** -decimals;\n return `${zero ? \"\" : value > 0 ? \"+\" : \"−\"}${text}%`;\n};\n\n/** Any value with `decimals` decimals (indicator panes) */\nexport const formatFixed = (\n value: number,\n decimals: number,\n locale?: string,\n): string =>\n Number.isFinite(value)\n ? typographicMinus(\n numberFormat(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(value),\n )\n : \"–\";\n\n// ------------------------------------------------------------------ times\n\nconst dateFormats = new Map<string, Intl.DateTimeFormat>();\n\n/** Formats shifted times with the UTC getters (the offset is applied before) */\nexport const dateFormat = (\n locale: string | undefined,\n options: Intl.DateTimeFormatOptions,\n): Intl.DateTimeFormat => {\n const key = `${locale ?? \"\"}|${JSON.stringify(options)}`;\n let format = dateFormats.get(key);\n if (!format) {\n const full = { ...options, timeZone: \"UTC\" };\n try {\n format = new Intl.DateTimeFormat(resolveLocale(locale), full);\n } catch {\n format = new Intl.DateTimeFormat(\"en\", full);\n }\n dateFormats.set(key, format);\n }\n return format;\n};\n\n/** Offset of the displayed time from UTC, in minutes, at `time` */\nexport const offsetAt = (time: number, utcOffset: number | undefined) =>\n utcOffset ?? -new Date(Number.isFinite(time) ? time : 0).getTimezoneOffset();\n\n/** Offset from UTC in minutes: fixed, or a function of the time (time zones) */\nexport type UtcOffset = number | ((time: number) => number);\n\nexport const offsetOf = (offset: UtcOffset, time: number): number =>\n typeof offset === \"number\" ? offset : offset(time);\n\nconst zoneFormats = new Map<string, Intl.DateTimeFormat | null>();\nconst zoneOffsets = new Map<string, Map<number, number>>();\nconst QUARTER = 15 * MINUTE;\n\n/** Whether `timeZone` is a time zone known to `Intl` (`\"UTC\"`, `\"Asia/Shanghai\"`) */\nexport const isTimeZone = (timeZone: string): boolean =>\n zoneFormat(timeZone) !== null;\n\nconst zoneFormat = (timeZone: string) => {\n let format = zoneFormats.get(timeZone);\n if (format === undefined) {\n try {\n format = new Intl.DateTimeFormat(\"en-US\", {\n timeZone,\n hourCycle: \"h23\",\n year: \"numeric\",\n month: \"numeric\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"numeric\",\n });\n } catch {\n format = null;\n }\n zoneFormats.set(timeZone, format);\n }\n return format;\n};\n\n/**\n * Offset of an IANA time zone from UTC at `time`, in minutes (daylight\n * saving included). Cached per quarter of an hour: zones change their\n * offset on quarter hours, and the time axis asks for every bar.\n */\nexport const zoneOffset = (time: number, timeZone: string): number => {\n const format = zoneFormat(timeZone);\n if (!format || !Number.isFinite(time))\n return -new Date(Number.isFinite(time) ? time : 0).getTimezoneOffset();\n let cache = zoneOffsets.get(timeZone);\n if (!cache) zoneOffsets.set(timeZone, (cache = new Map()));\n const bucket = Math.floor(time / QUARTER);\n let offset = cache.get(bucket);\n if (offset === undefined) {\n const at = bucket * QUARTER;\n const parts: Record<string, number> = {};\n for (const part of format.formatToParts(at))\n if (part.type !== \"literal\") parts[part.type] = Number(part.value);\n const local = Date.UTC(\n parts.year ?? 1970,\n (parts.month ?? 1) - 1,\n parts.day ?? 1,\n (parts.hour ?? 0) % 24,\n parts.minute ?? 0,\n );\n offset = Math.round((local - at) / MINUTE);\n if (cache.size > 50_000) cache.clear();\n cache.set(bucket, offset);\n }\n return offset;\n};\n\n/** Time shifted so that the UTC getters read the displayed time */\nexport const shiftTime = (time: number, utcOffset: number | undefined) =>\n time + offsetAt(time, utcOffset) * MINUTE;\n\n/**\n * Weight of the boundary between two consecutive (shifted) bar times: the\n * largest calendar unit that changes (year 70, month 60, day 50, hours\n * 43-46, minutes 31-34, seconds 21-24, 10 otherwise)\n */\nexport const boundaryWeight = (prev: number, time: number): number => {\n if (!Number.isFinite(prev)) return 70;\n const a = new Date(prev);\n const b = new Date(time);\n if (a.getUTCFullYear() !== b.getUTCFullYear()) return 70;\n if (a.getUTCMonth() !== b.getUTCMonth()) return 60;\n if (a.getUTCDate() !== b.getUTCDate()) return 50;\n const steps: readonly [number, number][] = [\n [12 * HOUR, 46],\n [6 * HOUR, 45],\n [3 * HOUR, 44],\n [HOUR, 43],\n [30 * MINUTE, 34],\n [15 * MINUTE, 33],\n [5 * MINUTE, 32],\n [MINUTE, 31],\n [30_000, 24],\n [15_000, 23],\n [5_000, 22],\n [1_000, 21],\n ];\n for (const [unit, weight] of steps) {\n if (Math.floor(prev / unit) !== Math.floor(time / unit)) return weight;\n }\n return 10;\n};\n\n/** A label of the time axis */\nexport interface TimeTick {\n /** x in CSS pixels */\n x: number;\n text: string;\n /** Larger unit (new day of an intraday chart, new month / year) */\n bold: boolean;\n}\n\n/** Text of a tick of weight `weight` at the shifted time `time` */\nexport const tickText = (\n time: number,\n weight: number,\n locale: string | undefined,\n intraday: boolean,\n): string => {\n if (weight >= 70) return dateFormat(locale, { year: \"numeric\" }).format(time);\n if (weight >= 60) return dateFormat(locale, { month: \"short\" }).format(time);\n if (weight >= 50) {\n return intraday\n ? dateFormat(locale, { month: \"short\", day: \"numeric\" }).format(time)\n : dateFormat(locale, { day: \"numeric\" }).format(time);\n }\n if (weight >= 30)\n return dateFormat(locale, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hourCycle: \"h23\",\n }).format(time);\n return dateFormat(locale, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hourCycle: \"h23\",\n }).format(time);\n};\n\n/**\n * Picks the time labels: candidates by decreasing weight, each kept when\n * no kept label is closer than `minGap` pixels\n */\nexport const pickTicks = (\n candidates: readonly { x: number; weight: number; time: number }[],\n minGap: number,\n): { x: number; weight: number; time: number }[] => {\n const order = candidates\n .map((_, i) => i)\n .sort((a, b) => candidates[b].weight - candidates[a].weight || a - b);\n const kept: number[] = [];\n const result: { x: number; weight: number; time: number }[] = [];\n for (const i of order) {\n const c = candidates[i];\n // binary search of the kept x positions\n let lo = 0;\n let hi = kept.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (kept[mid] < c.x) lo = mid + 1;\n else hi = mid;\n }\n const left = lo > 0 ? kept[lo - 1] : -Infinity;\n const right = lo < kept.length ? kept[lo] : Infinity;\n if (c.x - left < minGap || right - c.x < minGap) continue;\n kept.splice(lo, 0, c.x);\n result.push(c);\n }\n return result.sort((a, b) => a.x - b.x);\n};\n\n/** Full time of the crosshair label (`Tue 12 Mar '24 14:35`) */\nexport const formatCrosshairTime = (\n shifted: number,\n timeframeMs: number,\n locale: string | undefined,\n): string => {\n const date: Intl.DateTimeFormatOptions = {\n weekday: \"short\",\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n };\n if (timeframeMs >= DAY) return dateFormat(locale, date).format(shifted);\n return dateFormat(locale, {\n ...date,\n hour: \"2-digit\",\n minute: \"2-digit\",\n ...(timeframeMs < MINUTE ? { second: \"2-digit\" } : {}),\n hourCycle: \"h23\",\n }).format(shifted);\n};\n\n/**\n * Time left before a bar closes: `42`, `04:59`, `03:04:59`, `2d 04h` (the\n * day and hour templates replace `{count}`)\n */\nexport const formatCountdown = (\n ms: number,\n units: { days: string; hours: string } = {\n days: \"{count}d\",\n hours: \"{count}h\",\n },\n): string => {\n const s = Math.max(0, Math.floor(ms / 1000));\n const pad = (v: number) => String(v).padStart(2, \"0\");\n if (s >= 86_400) {\n const days = String(Math.floor(s / 86_400));\n const hours = pad(Math.floor((s % 86_400) / 3600));\n return `${units.days.replace(\"{count}\", days)} ${units.hours.replace(\"{count}\", hours)}`;\n }\n if (s >= 3600)\n return `${pad(Math.floor(s / 3600))}:${pad(Math.floor((s % 3600) / 60))}:${pad(s % 60)}`;\n return `${pad(Math.floor(s / 60))}:${pad(s % 60)}`;\n};\n\n/** Typical duration between bars: the median of the last gaps */\nexport const inferTimeframe = (time: ArrayLike<number>, n: number): number => {\n const gaps: number[] = [];\n for (let i = Math.max(1, n - 64); i < n; i++) {\n const d = time[i] - time[i - 1];\n if (d > 0 && Number.isFinite(d)) gaps.push(d);\n }\n if (!gaps.length) return DAY;\n gaps.sort((a, b) => a - b);\n // the smallest frequent gap: weekends and nights make larger ones\n return gaps[Math.floor(gaps.length * 0.25)];\n};\n"],"mappings":"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"}
|
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
export declare const MINUTE = 60000;
|
|
2
2
|
export declare const HOUR = 3600000;
|
|
3
3
|
export declare const DAY = 86400000;
|
|
4
|
+
/**
|
|
5
|
+
* Whether the markets of `locale` show rising prices in red (`colorConvention:
|
|
6
|
+
* "auto"`): regions CN, TW, JP and KR, or Chinese / Japanese / Korean without a
|
|
7
|
+
* region (`zh-Hant` too; `zh-HK` / `zh-SG` follow the global convention)
|
|
8
|
+
*/
|
|
9
|
+
export declare const redUpLocale: (locale: string) => boolean;
|
|
4
10
|
/** Decimals needed by the prices (0-8), detected from a sample of them */
|
|
5
11
|
export declare const detectPrecision: (values: ArrayLike<number>, from: number, to: number) => number;
|
|
6
12
|
/** Price formatter: fixed decimals, grouped digits of `locale` */
|
|
7
13
|
export declare const priceFormatter: (precision: number, locale: string | undefined) => ((value: number) => string);
|
|
14
|
+
/** The minus sign (U+2212) instead of the hyphen-minus of `Intl` */
|
|
15
|
+
export declare const typographicMinus: (text: string) => string;
|
|
8
16
|
/** `12345678` -> `12.35M` (`1234.57万` in Chinese and Japanese) */
|
|
9
17
|
export declare const formatVolume: (value: number, locale?: string) => string;
|
|
10
18
|
/** `+1.25%` */
|
|
@@ -15,6 +23,17 @@ export declare const formatFixed: (value: number, decimals: number, locale?: str
|
|
|
15
23
|
export declare const dateFormat: (locale: string | undefined, options: Intl.DateTimeFormatOptions) => Intl.DateTimeFormat;
|
|
16
24
|
/** Offset of the displayed time from UTC, in minutes, at `time` */
|
|
17
25
|
export declare const offsetAt: (time: number, utcOffset: number | undefined) => number;
|
|
26
|
+
/** Offset from UTC in minutes: fixed, or a function of the time (time zones) */
|
|
27
|
+
export type UtcOffset = number | ((time: number) => number);
|
|
28
|
+
export declare const offsetOf: (offset: UtcOffset, time: number) => number;
|
|
29
|
+
/** Whether `timeZone` is a time zone known to `Intl` (`"UTC"`, `"Asia/Shanghai"`) */
|
|
30
|
+
export declare const isTimeZone: (timeZone: string) => boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Offset of an IANA time zone from UTC at `time`, in minutes (daylight
|
|
33
|
+
* saving included). Cached per quarter of an hour: zones change their
|
|
34
|
+
* offset on quarter hours, and the time axis asks for every bar.
|
|
35
|
+
*/
|
|
36
|
+
export declare const zoneOffset: (time: number, timeZone: string) => number;
|
|
18
37
|
/** Time shifted so that the UTC getters read the displayed time */
|
|
19
38
|
export declare const shiftTime: (time: number, utcOffset: number | undefined) => number;
|
|
20
39
|
/**
|
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
export declare const MINUTE = 60000;
|
|
2
2
|
export declare const HOUR = 3600000;
|
|
3
3
|
export declare const DAY = 86400000;
|
|
4
|
+
/**
|
|
5
|
+
* Whether the markets of `locale` show rising prices in red (`colorConvention:
|
|
6
|
+
* "auto"`): regions CN, TW, JP and KR, or Chinese / Japanese / Korean without a
|
|
7
|
+
* region (`zh-Hant` too; `zh-HK` / `zh-SG` follow the global convention)
|
|
8
|
+
*/
|
|
9
|
+
export declare const redUpLocale: (locale: string) => boolean;
|
|
4
10
|
/** Decimals needed by the prices (0-8), detected from a sample of them */
|
|
5
11
|
export declare const detectPrecision: (values: ArrayLike<number>, from: number, to: number) => number;
|
|
6
12
|
/** Price formatter: fixed decimals, grouped digits of `locale` */
|
|
7
13
|
export declare const priceFormatter: (precision: number, locale: string | undefined) => ((value: number) => string);
|
|
14
|
+
/** The minus sign (U+2212) instead of the hyphen-minus of `Intl` */
|
|
15
|
+
export declare const typographicMinus: (text: string) => string;
|
|
8
16
|
/** `12345678` -> `12.35M` (`1234.57万` in Chinese and Japanese) */
|
|
9
17
|
export declare const formatVolume: (value: number, locale?: string) => string;
|
|
10
18
|
/** `+1.25%` */
|
|
@@ -15,6 +23,17 @@ export declare const formatFixed: (value: number, decimals: number, locale?: str
|
|
|
15
23
|
export declare const dateFormat: (locale: string | undefined, options: Intl.DateTimeFormatOptions) => Intl.DateTimeFormat;
|
|
16
24
|
/** Offset of the displayed time from UTC, in minutes, at `time` */
|
|
17
25
|
export declare const offsetAt: (time: number, utcOffset: number | undefined) => number;
|
|
26
|
+
/** Offset from UTC in minutes: fixed, or a function of the time (time zones) */
|
|
27
|
+
export type UtcOffset = number | ((time: number) => number);
|
|
28
|
+
export declare const offsetOf: (offset: UtcOffset, time: number) => number;
|
|
29
|
+
/** Whether `timeZone` is a time zone known to `Intl` (`"UTC"`, `"Asia/Shanghai"`) */
|
|
30
|
+
export declare const isTimeZone: (timeZone: string) => boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Offset of an IANA time zone from UTC at `time`, in minutes (daylight
|
|
33
|
+
* saving included). Cached per quarter of an hour: zones change their
|
|
34
|
+
* offset on quarter hours, and the time axis asks for every bar.
|
|
35
|
+
*/
|
|
36
|
+
export declare const zoneOffset: (time: number, timeZone: string) => number;
|
|
18
37
|
/** Time shifted so that the UTC getters read the displayed time */
|
|
19
38
|
export declare const shiftTime: (time: number, utcOffset: number | undefined) => number;
|
|
20
39
|
/**
|
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
import { compactUnits as e, numberFormat as t, resolveLocale as n } from "../locale.js";
|
|
2
2
|
//#region src/engine/trading/format.ts
|
|
3
|
-
var r = 6e4, i = 36e5, a = 864e5, o = (e, r) => t(n(e), r), s =
|
|
3
|
+
var r = 6e4, i = 36e5, a = 864e5, o = (e, r) => t(n(e), r), s = /* @__PURE__ */ new Set([
|
|
4
|
+
"CN",
|
|
5
|
+
"TW",
|
|
6
|
+
"JP",
|
|
7
|
+
"KR"
|
|
8
|
+
]), c = /* @__PURE__ */ new Set([
|
|
9
|
+
"zh",
|
|
10
|
+
"ja",
|
|
11
|
+
"ko"
|
|
12
|
+
]), l = (e) => {
|
|
13
|
+
let t = e.split(/[-_]/), n = t.slice(1).find((e) => /^([A-Za-z]{2}|\d{3})$/.test(e));
|
|
14
|
+
return n ? s.has(n.toUpperCase()) : c.has((t[0] ?? "").toLowerCase());
|
|
15
|
+
}, u = (e, t, n) => {
|
|
4
16
|
let r = 0, i = Math.max(0, n - 300, t);
|
|
5
17
|
for (let t = i; t < n; t++) {
|
|
6
18
|
let n = Math.abs(e[t]);
|
|
@@ -11,29 +23,29 @@ var r = 6e4, i = 36e5, a = 864e5, o = (e, r) => t(n(e), r), s = (e, t, n) => {
|
|
|
11
23
|
}
|
|
12
24
|
}
|
|
13
25
|
return r;
|
|
14
|
-
},
|
|
26
|
+
}, d = (e, t) => {
|
|
15
27
|
let n = Math.max(0, Math.min(12, Math.round(e))), r = o(t, {
|
|
16
28
|
minimumFractionDigits: n,
|
|
17
29
|
maximumFractionDigits: n
|
|
18
30
|
});
|
|
19
|
-
return (e) => Number.isFinite(e) ? r.format(e) : "–";
|
|
20
|
-
},
|
|
31
|
+
return (e) => Number.isFinite(e) ? f(r.format(e)) : "–";
|
|
32
|
+
}, f = (e) => e.replace("-", "−"), p = (t, n) => {
|
|
21
33
|
if (!Number.isFinite(t)) return "–";
|
|
22
34
|
let r = o(n, { maximumFractionDigits: 2 }), i = Math.abs(t);
|
|
23
|
-
for (let [a, o] of e(n)) if (i >= a * .999995) return `${r.format(t / a)}${o}
|
|
24
|
-
return r.format(t);
|
|
25
|
-
},
|
|
35
|
+
for (let [a, o] of e(n)) if (i >= a * .999995) return f(`${r.format(t / a)}${o}`);
|
|
36
|
+
return f(r.format(t));
|
|
37
|
+
}, m = (e, t, n = 2) => {
|
|
26
38
|
if (!Number.isFinite(e)) return "–";
|
|
27
39
|
let r = o(t, {
|
|
28
40
|
minimumFractionDigits: n,
|
|
29
41
|
maximumFractionDigits: n
|
|
30
42
|
}).format(Math.abs(e));
|
|
31
43
|
return `${Math.abs(e) < .5 * 10 ** -n ? "" : e > 0 ? "+" : "−"}${r}%`;
|
|
32
|
-
},
|
|
44
|
+
}, h = (e, t, n) => Number.isFinite(e) ? f(o(n, {
|
|
33
45
|
minimumFractionDigits: t,
|
|
34
46
|
maximumFractionDigits: t
|
|
35
|
-
}).format(e) : "–",
|
|
36
|
-
let r = `${e ?? ""}|${JSON.stringify(t)}`, i =
|
|
47
|
+
}).format(e)) : "–", g = /* @__PURE__ */ new Map(), _ = (e, t) => {
|
|
48
|
+
let r = `${e ?? ""}|${JSON.stringify(t)}`, i = g.get(r);
|
|
37
49
|
if (!i) {
|
|
38
50
|
let a = {
|
|
39
51
|
...t,
|
|
@@ -44,10 +56,42 @@ var r = 6e4, i = 36e5, a = 864e5, o = (e, r) => t(n(e), r), s = (e, t, n) => {
|
|
|
44
56
|
} catch {
|
|
45
57
|
i = new Intl.DateTimeFormat("en", a);
|
|
46
58
|
}
|
|
47
|
-
|
|
59
|
+
g.set(r, i);
|
|
48
60
|
}
|
|
49
61
|
return i;
|
|
50
|
-
},
|
|
62
|
+
}, v = (e, t) => typeof e == "number" ? e : e(t), y = /* @__PURE__ */ new Map(), b = /* @__PURE__ */ new Map(), x = 15 * r, S = (e) => C(e) !== null, C = (e) => {
|
|
63
|
+
let t = y.get(e);
|
|
64
|
+
if (t === void 0) {
|
|
65
|
+
try {
|
|
66
|
+
t = new Intl.DateTimeFormat("en-US", {
|
|
67
|
+
timeZone: e,
|
|
68
|
+
hourCycle: "h23",
|
|
69
|
+
year: "numeric",
|
|
70
|
+
month: "numeric",
|
|
71
|
+
day: "numeric",
|
|
72
|
+
hour: "numeric",
|
|
73
|
+
minute: "numeric"
|
|
74
|
+
});
|
|
75
|
+
} catch {
|
|
76
|
+
t = null;
|
|
77
|
+
}
|
|
78
|
+
y.set(e, t);
|
|
79
|
+
}
|
|
80
|
+
return t;
|
|
81
|
+
}, w = (e, t) => {
|
|
82
|
+
let n = C(t);
|
|
83
|
+
if (!n || !Number.isFinite(e)) return -new Date(Number.isFinite(e) ? e : 0).getTimezoneOffset();
|
|
84
|
+
let i = b.get(t);
|
|
85
|
+
i || b.set(t, i = /* @__PURE__ */ new Map());
|
|
86
|
+
let a = Math.floor(e / x), o = i.get(a);
|
|
87
|
+
if (o === void 0) {
|
|
88
|
+
let e = a * x, t = {};
|
|
89
|
+
for (let r of n.formatToParts(e)) r.type !== "literal" && (t[r.type] = Number(r.value));
|
|
90
|
+
let s = Date.UTC(t.year ?? 1970, (t.month ?? 1) - 1, t.day ?? 1, (t.hour ?? 0) % 24, t.minute ?? 0);
|
|
91
|
+
o = Math.round((s - e) / r), i.size > 5e4 && i.clear(), i.set(a, o);
|
|
92
|
+
}
|
|
93
|
+
return o;
|
|
94
|
+
}, T = (e, t) => {
|
|
51
95
|
if (!Number.isFinite(e)) return 70;
|
|
52
96
|
let n = new Date(e), a = new Date(t);
|
|
53
97
|
if (n.getUTCFullYear() !== a.getUTCFullYear()) return 70;
|
|
@@ -69,19 +113,19 @@ var r = 6e4, i = 36e5, a = 864e5, o = (e, r) => t(n(e), r), s = (e, t, n) => {
|
|
|
69
113
|
];
|
|
70
114
|
for (let [n, r] of o) if (Math.floor(e / n) !== Math.floor(t / n)) return r;
|
|
71
115
|
return 10;
|
|
72
|
-
},
|
|
116
|
+
}, E = (e, t, n, r) => t >= 70 ? _(n, { year: "numeric" }).format(e) : t >= 60 ? _(n, { month: "short" }).format(e) : t >= 50 ? r ? _(n, {
|
|
73
117
|
month: "short",
|
|
74
118
|
day: "numeric"
|
|
75
|
-
}).format(e) :
|
|
119
|
+
}).format(e) : _(n, { day: "numeric" }).format(e) : t >= 30 ? _(n, {
|
|
76
120
|
hour: "2-digit",
|
|
77
121
|
minute: "2-digit",
|
|
78
122
|
hourCycle: "h23"
|
|
79
|
-
}).format(e) :
|
|
123
|
+
}).format(e) : _(n, {
|
|
80
124
|
hour: "2-digit",
|
|
81
125
|
minute: "2-digit",
|
|
82
126
|
second: "2-digit",
|
|
83
127
|
hourCycle: "h23"
|
|
84
|
-
}).format(e),
|
|
128
|
+
}).format(e), D = (e, t) => {
|
|
85
129
|
let n = e.map((e, t) => t).sort((t, n) => e[n].weight - e[t].weight || t - n), r = [], i = [];
|
|
86
130
|
for (let a of n) {
|
|
87
131
|
let n = e[a], o = 0, s = r.length;
|
|
@@ -93,21 +137,21 @@ var r = 6e4, i = 36e5, a = 864e5, o = (e, r) => t(n(e), r), s = (e, t, n) => {
|
|
|
93
137
|
n.x - c < t || l - n.x < t || (r.splice(o, 0, n.x), i.push(n));
|
|
94
138
|
}
|
|
95
139
|
return i.sort((e, t) => e.x - t.x);
|
|
96
|
-
},
|
|
140
|
+
}, O = (e, t, n) => {
|
|
97
141
|
let r = {
|
|
98
142
|
weekday: "short",
|
|
99
143
|
year: "numeric",
|
|
100
144
|
month: "short",
|
|
101
145
|
day: "numeric"
|
|
102
146
|
};
|
|
103
|
-
return t >= 864e5 ?
|
|
147
|
+
return t >= 864e5 ? _(n, r).format(e) : _(n, {
|
|
104
148
|
...r,
|
|
105
149
|
hour: "2-digit",
|
|
106
150
|
minute: "2-digit",
|
|
107
151
|
...t < 6e4 ? { second: "2-digit" } : {},
|
|
108
152
|
hourCycle: "h23"
|
|
109
153
|
}).format(e);
|
|
110
|
-
},
|
|
154
|
+
}, k = (e, t = {
|
|
111
155
|
days: "{count}d",
|
|
112
156
|
hours: "{count}h"
|
|
113
157
|
}) => {
|
|
@@ -117,7 +161,7 @@ var r = 6e4, i = 36e5, a = 864e5, o = (e, r) => t(n(e), r), s = (e, t, n) => {
|
|
|
117
161
|
return `${t.days.replace("{count}", e)} ${t.hours.replace("{count}", i)}`;
|
|
118
162
|
}
|
|
119
163
|
return n >= 3600 ? `${r(Math.floor(n / 3600))}:${r(Math.floor(n % 3600 / 60))}:${r(n % 60)}` : `${r(Math.floor(n / 60))}:${r(n % 60)}`;
|
|
120
|
-
},
|
|
164
|
+
}, A = (e, t) => {
|
|
121
165
|
let n = [];
|
|
122
166
|
for (let r = Math.max(1, t - 64); r < t; r++) {
|
|
123
167
|
let t = e[r] - e[r - 1];
|
|
@@ -126,6 +170,6 @@ var r = 6e4, i = 36e5, a = 864e5, o = (e, r) => t(n(e), r), s = (e, t, n) => {
|
|
|
126
170
|
return n.length ? (n.sort((e, t) => e - t), n[Math.floor(n.length * .25)]) : a;
|
|
127
171
|
};
|
|
128
172
|
//#endregion
|
|
129
|
-
export { a as DAY, i as HOUR, r as MINUTE,
|
|
173
|
+
export { a as DAY, i as HOUR, r as MINUTE, T as boundaryWeight, _ as dateFormat, u as detectPrecision, k as formatCountdown, O as formatCrosshairTime, h as formatFixed, m as formatPercent, p as formatVolume, A as inferTimeframe, S as isTimeZone, v as offsetOf, D as pickTicks, d as priceFormatter, l as redUpLocale, E as tickText, f as typographicMinus, w as zoneOffset };
|
|
130
174
|
|
|
131
175
|
//# sourceMappingURL=format.js.map
|