minerva-design 1.4.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/README.md +21 -21
- package/custom-elements.json +4047 -1703
- package/dist/angular/fesm2022/minerva-angular.mjs +1436 -5
- package/dist/angular/fesm2022/minerva-angular.mjs.map +1 -1
- package/dist/angular/types/minerva-angular.d.ts +573 -4
- package/dist/charts/canvas.d.cts +2 -2
- package/dist/charts/canvas.d.ts +2 -2
- package/dist/charts/core.cjs +1 -1
- package/dist/charts/core.d.cts +6 -4
- package/dist/charts/core.d.ts +6 -4
- package/dist/charts/core.js +24 -16
- package/dist/charts/engine/axis.cjs +1 -1
- package/dist/charts/engine/axis.cjs.map +1 -1
- package/dist/charts/engine/axis.js +42 -19
- package/dist/charts/engine/axis.js.map +1 -1
- package/dist/charts/engine/canvas.cjs +1 -1
- package/dist/charts/engine/canvas.cjs.map +1 -1
- package/dist/charts/engine/canvas.js +154 -127
- package/dist/charts/engine/canvas.js.map +1 -1
- package/dist/charts/engine/chart.cjs +1 -1
- package/dist/charts/engine/chart.cjs.map +1 -1
- package/dist/charts/engine/chart.js +365 -251
- package/dist/charts/engine/chart.js.map +1 -1
- package/dist/charts/engine/color.cjs +1 -1
- package/dist/charts/engine/color.cjs.map +1 -1
- package/dist/charts/engine/color.d.cts +18 -0
- package/dist/charts/engine/color.d.ts +18 -0
- package/dist/charts/engine/color.js +48 -2
- package/dist/charts/engine/color.js.map +1 -1
- package/dist/charts/engine/controller.cjs +2 -2
- package/dist/charts/engine/controller.cjs.map +1 -1
- package/dist/charts/engine/controller.d.cts +32 -1
- package/dist/charts/engine/controller.d.ts +32 -1
- package/dist/charts/engine/controller.js +310 -263
- package/dist/charts/engine/controller.js.map +1 -1
- package/dist/charts/engine/data.cjs +1 -1
- package/dist/charts/engine/data.cjs.map +1 -1
- package/dist/charts/engine/data.d.cts +3 -1
- package/dist/charts/engine/data.d.ts +3 -1
- package/dist/charts/engine/data.js +6 -4
- package/dist/charts/engine/data.js.map +1 -1
- package/dist/charts/engine/defaults.cjs +2 -0
- package/dist/charts/engine/defaults.cjs.map +1 -0
- package/dist/charts/engine/defaults.d.cts +20 -0
- package/dist/charts/engine/defaults.d.ts +20 -0
- package/dist/charts/engine/defaults.js +35 -0
- package/dist/charts/engine/defaults.js.map +1 -0
- package/dist/charts/engine/format.cjs +1 -1
- package/dist/charts/engine/format.cjs.map +1 -1
- package/dist/charts/engine/format.d.cts +6 -0
- package/dist/charts/engine/format.d.ts +6 -0
- package/dist/charts/engine/format.js +15 -2
- package/dist/charts/engine/format.js.map +1 -1
- package/dist/charts/engine/graph/chart.cjs +2 -0
- package/dist/charts/engine/graph/chart.cjs.map +1 -0
- package/dist/charts/engine/graph/chart.d.cts +3 -0
- package/dist/charts/engine/graph/chart.d.ts +3 -0
- package/dist/charts/engine/graph/chart.js +1565 -0
- package/dist/charts/engine/graph/chart.js.map +1 -0
- package/dist/charts/engine/graph/circular.cjs +2 -0
- package/dist/charts/engine/graph/circular.cjs.map +1 -0
- package/dist/charts/engine/graph/circular.d.cts +16 -0
- package/dist/charts/engine/graph/circular.d.ts +16 -0
- package/dist/charts/engine/graph/circular.js +62 -0
- package/dist/charts/engine/graph/circular.js.map +1 -0
- package/dist/charts/engine/graph/dag.cjs +2 -0
- package/dist/charts/engine/graph/dag.cjs.map +1 -0
- package/dist/charts/engine/graph/dag.d.cts +34 -0
- package/dist/charts/engine/graph/dag.d.ts +34 -0
- package/dist/charts/engine/graph/dag.js +314 -0
- package/dist/charts/engine/graph/dag.js.map +1 -0
- package/dist/charts/engine/graph/dom.cjs +2 -0
- package/dist/charts/engine/graph/dom.cjs.map +1 -0
- package/dist/charts/engine/graph/dom.d.cts +23 -0
- package/dist/charts/engine/graph/dom.d.ts +23 -0
- package/dist/charts/engine/graph/dom.js +158 -0
- package/dist/charts/engine/graph/dom.js.map +1 -0
- package/dist/charts/engine/graph/force.cjs +2 -0
- package/dist/charts/engine/graph/force.cjs.map +1 -0
- package/dist/charts/engine/graph/force.d.cts +67 -0
- package/dist/charts/engine/graph/force.d.ts +67 -0
- package/dist/charts/engine/graph/force.js +325 -0
- package/dist/charts/engine/graph/force.js.map +1 -0
- package/dist/charts/engine/graph/geometry.cjs +2 -0
- package/dist/charts/engine/graph/geometry.cjs.map +1 -0
- package/dist/charts/engine/graph/geometry.d.cts +37 -0
- package/dist/charts/engine/graph/geometry.d.ts +37 -0
- package/dist/charts/engine/graph/geometry.js +144 -0
- package/dist/charts/engine/graph/geometry.js.map +1 -0
- package/dist/charts/engine/graph/index.cjs +1 -0
- package/dist/charts/engine/graph/index.d.cts +6 -0
- package/dist/charts/engine/graph/index.d.ts +6 -0
- package/dist/charts/engine/graph/index.js +6 -0
- package/dist/charts/engine/graph/labels.cjs +2 -0
- package/dist/charts/engine/graph/labels.cjs.map +1 -0
- package/dist/charts/engine/graph/labels.d.cts +12 -0
- package/dist/charts/engine/graph/labels.d.ts +12 -0
- package/dist/charts/engine/graph/labels.js +128 -0
- package/dist/charts/engine/graph/labels.js.map +1 -0
- package/dist/charts/engine/graph/model.cjs +2 -0
- package/dist/charts/engine/graph/model.cjs.map +1 -0
- package/dist/charts/engine/graph/model.d.cts +43 -0
- package/dist/charts/engine/graph/model.d.ts +43 -0
- package/dist/charts/engine/graph/model.js +88 -0
- package/dist/charts/engine/graph/model.js.map +1 -0
- package/dist/charts/engine/graph/sizing.cjs +2 -0
- package/dist/charts/engine/graph/sizing.cjs.map +1 -0
- package/dist/charts/engine/graph/sizing.d.cts +33 -0
- package/dist/charts/engine/graph/sizing.d.ts +33 -0
- package/dist/charts/engine/graph/sizing.js +60 -0
- package/dist/charts/engine/graph/sizing.js.map +1 -0
- package/dist/charts/engine/graph/tree.cjs +2 -0
- package/dist/charts/engine/graph/tree.cjs.map +1 -0
- package/dist/charts/engine/graph/tree.d.cts +30 -0
- package/dist/charts/engine/graph/tree.d.ts +30 -0
- package/dist/charts/engine/graph/tree.js +218 -0
- package/dist/charts/engine/graph/tree.js.map +1 -0
- package/dist/charts/engine/graph/types.d.cts +626 -0
- package/dist/charts/engine/graph/types.d.ts +626 -0
- package/dist/charts/engine/graph/worker.cjs +46 -0
- package/dist/charts/engine/graph/worker.cjs.map +1 -0
- package/dist/charts/engine/graph/worker.d.cts +36 -0
- package/dist/charts/engine/graph/worker.d.ts +36 -0
- package/dist/charts/engine/graph/worker.js +129 -0
- package/dist/charts/engine/graph/worker.js.map +1 -0
- package/dist/charts/engine/items.cjs +1 -1
- package/dist/charts/engine/items.cjs.map +1 -1
- package/dist/charts/engine/items.d.cts +15 -2
- package/dist/charts/engine/items.d.ts +15 -2
- package/dist/charts/engine/items.js +131 -112
- package/dist/charts/engine/items.js.map +1 -1
- package/dist/charts/engine/labels.cjs +1 -1
- package/dist/charts/engine/labels.cjs.map +1 -1
- package/dist/charts/engine/labels.js +28 -4
- package/dist/charts/engine/labels.js.map +1 -1
- package/dist/charts/engine/layout.cjs +1 -1
- package/dist/charts/engine/layout.cjs.map +1 -1
- package/dist/charts/engine/layout.d.cts +9 -0
- package/dist/charts/engine/layout.d.ts +9 -0
- package/dist/charts/engine/layout.js +11 -2
- package/dist/charts/engine/layout.js.map +1 -1
- package/dist/charts/engine/model.cjs +1 -1
- package/dist/charts/engine/model.cjs.map +1 -1
- package/dist/charts/engine/model.d.cts +40 -3
- package/dist/charts/engine/model.d.ts +40 -3
- package/dist/charts/engine/model.js +246 -165
- package/dist/charts/engine/model.js.map +1 -1
- package/dist/charts/engine/orderbook/format.cjs +1 -1
- package/dist/charts/engine/orderbook/format.cjs.map +1 -1
- package/dist/charts/engine/orderbook/format.d.cts +3 -2
- package/dist/charts/engine/orderbook/format.d.ts +3 -2
- package/dist/charts/engine/orderbook/format.js +5 -5
- package/dist/charts/engine/orderbook/format.js.map +1 -1
- package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
- package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
- package/dist/charts/engine/orderbook/heatmap.js +527 -408
- package/dist/charts/engine/orderbook/heatmap.js.map +1 -1
- package/dist/charts/engine/orderbook/layout.cjs +2 -0
- package/dist/charts/engine/orderbook/layout.cjs.map +1 -0
- package/dist/charts/engine/orderbook/layout.d.cts +37 -0
- package/dist/charts/engine/orderbook/layout.d.ts +37 -0
- package/dist/charts/engine/orderbook/layout.js +70 -0
- package/dist/charts/engine/orderbook/layout.js.map +1 -0
- package/dist/charts/engine/orderbook/tape.cjs +1 -1
- package/dist/charts/engine/orderbook/tape.cjs.map +1 -1
- package/dist/charts/engine/orderbook/tape.js +1 -1
- package/dist/charts/engine/orderbook/tape.js.map +1 -1
- package/dist/charts/engine/orderbook/types.d.cts +18 -2
- package/dist/charts/engine/orderbook/types.d.ts +18 -2
- package/dist/charts/engine/overlay.cjs +1 -1
- package/dist/charts/engine/overlay.cjs.map +1 -1
- package/dist/charts/engine/overlay.d.cts +10 -0
- package/dist/charts/engine/overlay.d.ts +10 -0
- package/dist/charts/engine/overlay.js +6 -0
- package/dist/charts/engine/overlay.js.map +1 -1
- package/dist/charts/engine/presets.cjs +2 -2
- package/dist/charts/engine/presets.cjs.map +1 -1
- package/dist/charts/engine/presets.d.cts +25 -3
- package/dist/charts/engine/presets.d.ts +25 -3
- package/dist/charts/engine/presets.js +115 -101
- package/dist/charts/engine/presets.js.map +1 -1
- package/dist/charts/engine/renderers/detect.cjs +1 -1
- package/dist/charts/engine/renderers/detect.cjs.map +1 -1
- package/dist/charts/engine/renderers/detect.d.cts +2 -1
- package/dist/charts/engine/renderers/detect.d.ts +2 -1
- package/dist/charts/engine/renderers/detect.js +23 -21
- package/dist/charts/engine/renderers/detect.js.map +1 -1
- package/dist/charts/engine/scene.cjs +1 -1
- package/dist/charts/engine/scene.cjs.map +1 -1
- package/dist/charts/engine/scene.d.cts +57 -4
- package/dist/charts/engine/scene.d.ts +57 -4
- package/dist/charts/engine/scene.js +335 -182
- package/dist/charts/engine/scene.js.map +1 -1
- package/dist/charts/engine/shapes/bullet.cjs +1 -1
- package/dist/charts/engine/shapes/bullet.cjs.map +1 -1
- package/dist/charts/engine/shapes/bullet.js +110 -110
- package/dist/charts/engine/shapes/bullet.js.map +1 -1
- package/dist/charts/engine/shapes/chart.cjs +1 -1
- package/dist/charts/engine/shapes/chart.cjs.map +1 -1
- package/dist/charts/engine/shapes/chart.js +4 -1
- package/dist/charts/engine/shapes/chart.js.map +1 -1
- package/dist/charts/engine/shapes/chord.cjs +2 -0
- package/dist/charts/engine/shapes/chord.cjs.map +1 -0
- package/dist/charts/engine/shapes/chord.d.cts +18 -0
- package/dist/charts/engine/shapes/chord.d.ts +18 -0
- package/dist/charts/engine/shapes/chord.js +414 -0
- package/dist/charts/engine/shapes/chord.js.map +1 -0
- package/dist/charts/engine/shapes/draw.cjs +1 -1
- package/dist/charts/engine/shapes/draw.cjs.map +1 -1
- package/dist/charts/engine/shapes/draw.d.cts +5 -1
- package/dist/charts/engine/shapes/draw.d.ts +5 -1
- package/dist/charts/engine/shapes/draw.js +47 -17
- package/dist/charts/engine/shapes/draw.js.map +1 -1
- package/dist/charts/engine/shapes/hit.cjs +1 -1
- package/dist/charts/engine/shapes/hit.cjs.map +1 -1
- package/dist/charts/engine/shapes/hit.d.cts +3 -1
- package/dist/charts/engine/shapes/hit.d.ts +3 -1
- package/dist/charts/engine/shapes/hit.js +75 -46
- package/dist/charts/engine/shapes/hit.js.map +1 -1
- package/dist/charts/engine/shapes/index.d.cts +3 -2
- package/dist/charts/engine/shapes/index.d.ts +3 -2
- package/dist/charts/engine/shapes/labels.cjs +1 -1
- package/dist/charts/engine/shapes/labels.cjs.map +1 -1
- package/dist/charts/engine/shapes/labels.js +12 -4
- package/dist/charts/engine/shapes/labels.js.map +1 -1
- package/dist/charts/engine/shapes/layout.cjs +2 -2
- package/dist/charts/engine/shapes/layout.cjs.map +1 -1
- package/dist/charts/engine/shapes/layout.d.cts +3 -1
- package/dist/charts/engine/shapes/layout.d.ts +3 -1
- package/dist/charts/engine/shapes/layout.js +106 -78
- package/dist/charts/engine/shapes/layout.js.map +1 -1
- package/dist/charts/engine/shapes/scene.cjs +1 -1
- package/dist/charts/engine/shapes/scene.cjs.map +1 -1
- package/dist/charts/engine/shapes/scene.d.cts +33 -3
- package/dist/charts/engine/shapes/scene.d.ts +33 -3
- package/dist/charts/engine/shapes/scene.js +62 -19
- package/dist/charts/engine/shapes/scene.js.map +1 -1
- package/dist/charts/engine/shapes/types.d.cts +119 -8
- package/dist/charts/engine/shapes/types.d.ts +119 -8
- package/dist/charts/engine/signature.cjs +1 -1
- package/dist/charts/engine/signature.cjs.map +1 -1
- package/dist/charts/engine/signature.js +1 -1
- package/dist/charts/engine/signature.js.map +1 -1
- package/dist/charts/engine/three-d/canvas2d.cjs +1 -1
- package/dist/charts/engine/three-d/canvas2d.cjs.map +1 -1
- package/dist/charts/engine/three-d/canvas2d.d.cts +5 -2
- package/dist/charts/engine/three-d/canvas2d.d.ts +5 -2
- package/dist/charts/engine/three-d/canvas2d.js +89 -65
- package/dist/charts/engine/three-d/canvas2d.js.map +1 -1
- package/dist/charts/engine/three-d/detect.cjs +1 -1
- package/dist/charts/engine/three-d/detect.cjs.map +1 -1
- package/dist/charts/engine/three-d/detect.d.cts +3 -2
- package/dist/charts/engine/three-d/detect.d.ts +3 -2
- package/dist/charts/engine/three-d/detect.js +22 -20
- package/dist/charts/engine/three-d/detect.js.map +1 -1
- package/dist/charts/engine/three-d/geometry.cjs +1 -1
- package/dist/charts/engine/three-d/geometry.cjs.map +1 -1
- package/dist/charts/engine/three-d/geometry.d.cts +6 -0
- package/dist/charts/engine/three-d/geometry.d.ts +6 -0
- package/dist/charts/engine/three-d/geometry.js +106 -90
- package/dist/charts/engine/three-d/geometry.js.map +1 -1
- package/dist/charts/engine/three-d/model.cjs +1 -1
- package/dist/charts/engine/three-d/model.cjs.map +1 -1
- package/dist/charts/engine/three-d/model.d.cts +2 -0
- package/dist/charts/engine/three-d/model.d.ts +2 -0
- package/dist/charts/engine/three-d/model.js +2 -0
- package/dist/charts/engine/three-d/model.js.map +1 -1
- package/dist/charts/engine/three-d/overlay.cjs +1 -1
- package/dist/charts/engine/three-d/overlay.cjs.map +1 -1
- package/dist/charts/engine/three-d/overlay.js +43 -36
- package/dist/charts/engine/three-d/overlay.js.map +1 -1
- package/dist/charts/engine/three-d/render-types.cjs +1 -1
- package/dist/charts/engine/three-d/render-types.cjs.map +1 -1
- package/dist/charts/engine/three-d/render-types.d.cts +24 -3
- package/dist/charts/engine/three-d/render-types.d.ts +24 -3
- package/dist/charts/engine/three-d/render-types.js +6 -7
- package/dist/charts/engine/three-d/render-types.js.map +1 -1
- package/dist/charts/engine/three-d/shaders.cjs +63 -28
- package/dist/charts/engine/three-d/shaders.cjs.map +1 -1
- package/dist/charts/engine/three-d/shaders.d.cts +2 -3
- package/dist/charts/engine/three-d/shaders.d.ts +2 -3
- package/dist/charts/engine/three-d/shaders.js +41 -22
- package/dist/charts/engine/three-d/shaders.js.map +1 -1
- package/dist/charts/engine/three-d/sort.cjs +1 -1
- package/dist/charts/engine/three-d/sort.cjs.map +1 -1
- package/dist/charts/engine/three-d/sort.d.cts +15 -4
- package/dist/charts/engine/three-d/sort.d.ts +15 -4
- package/dist/charts/engine/three-d/sort.js +117 -43
- package/dist/charts/engine/three-d/sort.js.map +1 -1
- package/dist/charts/engine/three-d/types.d.cts +27 -0
- package/dist/charts/engine/three-d/types.d.ts +27 -0
- package/dist/charts/engine/three-d/webgl.cjs +1 -1
- package/dist/charts/engine/three-d/webgl.cjs.map +1 -1
- package/dist/charts/engine/three-d/webgl.js +15 -13
- package/dist/charts/engine/three-d/webgl.js.map +1 -1
- package/dist/charts/engine/three-d/webgpu.cjs +1 -1
- package/dist/charts/engine/three-d/webgpu.cjs.map +1 -1
- package/dist/charts/engine/three-d/webgpu.js +50 -39
- package/dist/charts/engine/three-d/webgpu.js.map +1 -1
- package/dist/charts/engine/trading/chart.cjs +1 -1
- package/dist/charts/engine/trading/chart.cjs.map +1 -1
- package/dist/charts/engine/trading/chart.d.cts +10 -0
- package/dist/charts/engine/trading/chart.d.ts +10 -0
- package/dist/charts/engine/trading/chart.js +1475 -776
- package/dist/charts/engine/trading/chart.js.map +1 -1
- package/dist/charts/engine/trading/drawings.cjs +2 -1
- package/dist/charts/engine/trading/drawings.cjs.map +1 -1
- package/dist/charts/engine/trading/drawings.d.cts +47 -9
- package/dist/charts/engine/trading/drawings.d.ts +47 -9
- package/dist/charts/engine/trading/drawings.js +338 -75
- package/dist/charts/engine/trading/drawings.js.map +1 -1
- package/dist/charts/engine/trading/format.cjs +1 -1
- package/dist/charts/engine/trading/format.cjs.map +1 -1
- package/dist/charts/engine/trading/format.d.cts +13 -0
- package/dist/charts/engine/trading/format.d.ts +13 -0
- package/dist/charts/engine/trading/format.js +51 -19
- package/dist/charts/engine/trading/format.js.map +1 -1
- package/dist/charts/engine/trading/index.cjs +1 -1
- package/dist/charts/engine/trading/index.d.cts +2 -1
- package/dist/charts/engine/trading/index.d.ts +2 -1
- package/dist/charts/engine/trading/index.js +4 -3
- package/dist/charts/engine/trading/indicators.cjs +1 -1
- package/dist/charts/engine/trading/indicators.cjs.map +1 -1
- package/dist/charts/engine/trading/indicators.d.cts +180 -10
- package/dist/charts/engine/trading/indicators.d.ts +180 -10
- package/dist/charts/engine/trading/indicators.js +449 -173
- package/dist/charts/engine/trading/indicators.js.map +1 -1
- package/dist/charts/engine/trading/labels.cjs +1 -1
- package/dist/charts/engine/trading/labels.cjs.map +1 -1
- package/dist/charts/engine/trading/labels.js +84 -4
- package/dist/charts/engine/trading/labels.js.map +1 -1
- package/dist/charts/engine/trading/store.cjs +1 -1
- package/dist/charts/engine/trading/store.cjs.map +1 -1
- package/dist/charts/engine/trading/store.d.cts +21 -0
- package/dist/charts/engine/trading/store.d.ts +21 -0
- package/dist/charts/engine/trading/store.js +22 -1
- package/dist/charts/engine/trading/store.js.map +1 -1
- package/dist/charts/engine/trading/studies.cjs +1 -1
- package/dist/charts/engine/trading/studies.cjs.map +1 -1
- package/dist/charts/engine/trading/studies.d.cts +41 -8
- package/dist/charts/engine/trading/studies.d.ts +41 -8
- package/dist/charts/engine/trading/studies.js +349 -93
- package/dist/charts/engine/trading/studies.js.map +1 -1
- package/dist/charts/engine/trading/sync.cjs +2 -0
- package/dist/charts/engine/trading/sync.cjs.map +1 -0
- package/dist/charts/engine/trading/sync.d.cts +8 -0
- package/dist/charts/engine/trading/sync.d.ts +8 -0
- package/dist/charts/engine/trading/sync.js +25 -0
- package/dist/charts/engine/trading/sync.js.map +1 -0
- package/dist/charts/engine/trading/types.d.cts +484 -9
- package/dist/charts/engine/trading/types.d.ts +484 -9
- package/dist/charts/engine/types.d.cts +82 -8
- package/dist/charts/engine/types.d.ts +82 -8
- package/dist/charts/index.cjs +1 -1
- package/dist/charts/index.d.cts +3 -2
- package/dist/charts/index.d.ts +3 -2
- package/dist/charts/index.js +30 -22
- package/dist/charts/react/charts.cjs +1 -1
- package/dist/charts/react/charts.cjs.map +1 -1
- package/dist/charts/react/charts.js +46 -34
- package/dist/charts/react/charts.js.map +1 -1
- package/dist/charts/react/graph.cjs +2 -0
- package/dist/charts/react/graph.cjs.map +1 -0
- package/dist/charts/react/graph.d.cts +213 -0
- package/dist/charts/react/graph.d.ts +213 -0
- package/dist/charts/react/graph.js +159 -0
- package/dist/charts/react/graph.js.map +1 -0
- package/dist/charts/react/shapes.cjs +1 -1
- package/dist/charts/react/shapes.cjs.map +1 -1
- package/dist/charts/react/shapes.d.cts +87 -4
- package/dist/charts/react/shapes.d.ts +87 -4
- package/dist/charts/react/shapes.js +55 -12
- package/dist/charts/react/shapes.js.map +1 -1
- package/dist/charts/react/trading.cjs +1 -1
- package/dist/charts/react/trading.cjs.map +1 -1
- package/dist/charts/react/trading.d.cts +53 -1
- package/dist/charts/react/trading.d.ts +53 -1
- package/dist/charts/react/trading.js +68 -37
- package/dist/charts/react/trading.js.map +1 -1
- package/dist/charts/react/types.d.cts +11 -0
- package/dist/charts/react/types.d.ts +11 -0
- package/dist/core/contracts.cjs +1 -1
- package/dist/core/contracts.cjs.map +1 -1
- package/dist/core/contracts.js +1 -1
- package/dist/core/contracts.js.map +1 -1
- package/dist/native/charts/src/canvas.cjs +1 -1
- package/dist/native/charts/src/canvas.js +3 -3
- package/dist/native/charts/src/engine/axis.cjs +1 -1
- package/dist/native/charts/src/engine/axis.cjs.map +1 -1
- package/dist/native/charts/src/engine/axis.js +42 -19
- package/dist/native/charts/src/engine/axis.js.map +1 -1
- package/dist/native/charts/src/engine/color.cjs +1 -1
- package/dist/native/charts/src/engine/color.cjs.map +1 -1
- package/dist/native/charts/src/engine/color.js +47 -5
- package/dist/native/charts/src/engine/color.js.map +1 -1
- package/dist/native/charts/src/engine/controller.cjs +2 -2
- package/dist/native/charts/src/engine/controller.cjs.map +1 -1
- package/dist/native/charts/src/engine/controller.js +300 -253
- package/dist/native/charts/src/engine/controller.js.map +1 -1
- package/dist/native/charts/src/engine/data.cjs +1 -1
- package/dist/native/charts/src/engine/data.cjs.map +1 -1
- package/dist/native/charts/src/engine/data.js +6 -4
- package/dist/native/charts/src/engine/data.js.map +1 -1
- package/dist/native/charts/src/engine/format.cjs +1 -1
- package/dist/native/charts/src/engine/format.cjs.map +1 -1
- package/dist/native/charts/src/engine/format.js +15 -2
- package/dist/native/charts/src/engine/format.js.map +1 -1
- package/dist/native/charts/src/engine/labels.cjs +1 -1
- package/dist/native/charts/src/engine/labels.cjs.map +1 -1
- package/dist/native/charts/src/engine/labels.js +28 -4
- package/dist/native/charts/src/engine/labels.js.map +1 -1
- package/dist/native/charts/src/engine/layout.cjs +1 -1
- package/dist/native/charts/src/engine/layout.cjs.map +1 -1
- package/dist/native/charts/src/engine/layout.js +11 -2
- package/dist/native/charts/src/engine/layout.js.map +1 -1
- package/dist/native/charts/src/engine/model.cjs +1 -1
- package/dist/native/charts/src/engine/model.cjs.map +1 -1
- package/dist/native/charts/src/engine/model.js +252 -171
- package/dist/native/charts/src/engine/model.js.map +1 -1
- package/dist/native/charts/src/engine/overlay.cjs.map +1 -1
- package/dist/native/charts/src/engine/overlay.js.map +1 -1
- package/dist/native/charts/src/engine/presets.cjs +2 -2
- package/dist/native/charts/src/engine/presets.cjs.map +1 -1
- package/dist/native/charts/src/engine/presets.js +104 -90
- package/dist/native/charts/src/engine/presets.js.map +1 -1
- package/dist/native/charts/src/engine/scene.cjs +1 -1
- package/dist/native/charts/src/engine/scene.cjs.map +1 -1
- package/dist/native/charts/src/engine/scene.js +341 -188
- package/dist/native/charts/src/engine/scene.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/bullet.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/bullet.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/bullet.js +110 -110
- package/dist/native/charts/src/engine/shapes/bullet.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/calendar.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/calendar.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/calendar.js +21 -16
- package/dist/native/charts/src/engine/shapes/calendar.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/chord.cjs +2 -0
- package/dist/native/charts/src/engine/shapes/chord.cjs.map +1 -0
- package/dist/native/charts/src/engine/shapes/chord.js +414 -0
- package/dist/native/charts/src/engine/shapes/chord.js.map +1 -0
- package/dist/native/charts/src/engine/shapes/draw.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/draw.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/draw.js +47 -17
- package/dist/native/charts/src/engine/shapes/draw.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/hit.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/hit.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/hit.js +73 -44
- package/dist/native/charts/src/engine/shapes/hit.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/labels.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/labels.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/labels.js +12 -4
- package/dist/native/charts/src/engine/shapes/labels.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/layout.cjs +2 -2
- package/dist/native/charts/src/engine/shapes/layout.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/layout.js +117 -90
- package/dist/native/charts/src/engine/shapes/layout.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/scene.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/scene.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/scene.js +62 -19
- package/dist/native/charts/src/engine/shapes/scene.js.map +1 -1
- package/dist/native/components/Chart/scene.cjs +1 -1
- package/dist/native/components/Chart/scene.cjs.map +1 -1
- package/dist/native/components/Chart/scene.js +140 -71
- package/dist/native/components/Chart/scene.js.map +1 -1
- package/dist/native/components/Charts/charts.cjs +1 -1
- package/dist/native/components/Charts/charts.cjs.map +1 -1
- package/dist/native/components/Charts/charts.js +54 -42
- package/dist/native/components/Charts/charts.js.map +1 -1
- package/dist/native/components/Charts/types.d.cts +11 -0
- package/dist/native/components/Charts/types.d.ts +11 -0
- package/dist/native/components/ShapeChart/ShapeChartBase.cjs +1 -1
- package/dist/native/components/ShapeChart/ShapeChartBase.cjs.map +1 -1
- package/dist/native/components/ShapeChart/ShapeChartBase.js +1 -0
- package/dist/native/components/ShapeChart/ShapeChartBase.js.map +1 -1
- package/dist/native/components/ShapeChart/charts.cjs +1 -1
- package/dist/native/components/ShapeChart/charts.cjs.map +1 -1
- package/dist/native/components/ShapeChart/charts.d.cts +6 -1
- package/dist/native/components/ShapeChart/charts.d.ts +6 -1
- package/dist/native/components/ShapeChart/charts.js +138 -96
- package/dist/native/components/ShapeChart/charts.js.map +1 -1
- package/dist/native/components/ShapeChart/draw.cjs +1 -1
- package/dist/native/components/ShapeChart/draw.cjs.map +1 -1
- package/dist/native/components/ShapeChart/draw.d.cts +1 -1
- package/dist/native/components/ShapeChart/draw.d.ts +1 -1
- package/dist/native/components/ShapeChart/draw.js +26 -17
- package/dist/native/components/ShapeChart/draw.js.map +1 -1
- package/dist/native/components/ShapeChart/geometry.cjs +1 -1
- package/dist/native/components/ShapeChart/geometry.cjs.map +1 -1
- package/dist/native/components/ShapeChart/geometry.js +138 -59
- package/dist/native/components/ShapeChart/geometry.js.map +1 -1
- package/dist/native/components/ShapeChart/index.cjs +1 -1
- package/dist/native/components/ShapeChart/index.d.cts +1 -1
- package/dist/native/components/ShapeChart/index.d.ts +1 -1
- package/dist/native/components/ShapeChart/index.js +2 -2
- package/dist/native/components/ShapeChart/recorder.cjs +1 -1
- package/dist/native/components/ShapeChart/recorder.cjs.map +1 -1
- package/dist/native/components/ShapeChart/recorder.d.cts +10 -1
- package/dist/native/components/ShapeChart/recorder.d.ts +10 -1
- package/dist/native/components/ShapeChart/recorder.js +19 -10
- package/dist/native/components/ShapeChart/recorder.js.map +1 -1
- package/dist/native/components/ShapeChart/types.d.cts +92 -7
- package/dist/native/components/ShapeChart/types.d.ts +92 -7
- package/dist/native/index.cjs +1 -1
- package/dist/native/index.js +2 -2
- package/dist/native/source/components/Chart/scene.tsx +158 -14
- package/dist/native/source/components/Charts/charts.tsx +30 -2
- package/dist/native/source/components/Charts/types.ts +11 -0
- package/dist/native/source/components/ShapeChart/ShapeChartBase.tsx +2 -0
- package/dist/native/source/components/ShapeChart/charts.tsx +91 -35
- package/dist/native/source/components/ShapeChart/draw.tsx +39 -8
- package/dist/native/source/components/ShapeChart/geometry.ts +189 -8
- package/dist/native/source/components/ShapeChart/index.ts +1 -0
- package/dist/native/source/components/ShapeChart/recorder.ts +20 -5
- package/dist/native/source/components/ShapeChart/types.ts +96 -5
- package/dist/native/source/manifest.ts +1 -0
- package/dist/taro/charts.d.ts +25 -5
- package/dist/taro/index.js +3900 -2836
- package/dist/taro/shape-charts.d.ts +96 -4
- package/dist/uni/AreaChart.vue.d.ts +5 -1
- package/dist/uni/Badge.vue.d.ts +1 -1
- package/dist/uni/BarChart.vue.d.ts +5 -1
- package/dist/uni/BoxPlotChart.vue.d.ts +8 -0
- package/dist/uni/BubbleChart.vue.d.ts +4 -0
- package/dist/uni/BulletChart.vue.d.ts +4 -0
- package/dist/uni/CalendarHeatmap.vue.d.ts +2 -0
- package/dist/uni/CandlestickChart.vue.d.ts +4 -0
- package/dist/uni/Chart.vue.d.ts +4 -0
- package/dist/uni/ChordChart.vue +93 -0
- package/dist/uni/ChordChart.vue.d.ts +136 -0
- package/dist/uni/DonutChart.vue.d.ts +4 -0
- package/dist/uni/FunnelChart.vue.d.ts +4 -0
- package/dist/uni/GanttChart.vue.d.ts +4 -0
- package/dist/uni/GaugeChart.vue.d.ts +4 -0
- package/dist/uni/HeatmapChart.vue.d.ts +8 -2
- package/dist/uni/HistogramChart.vue.d.ts +4 -0
- package/dist/uni/HorizontalBarChart.vue.d.ts +3 -1
- package/dist/uni/LineChart.vue.d.ts +4 -0
- package/dist/uni/MixedChart.vue.d.ts +4 -0
- package/dist/uni/PieChart.vue.d.ts +4 -0
- package/dist/uni/QuadrantChart.vue.d.ts +4 -0
- package/dist/uni/RadarChart.vue.d.ts +4 -0
- package/dist/uni/RadialBarChart.vue.d.ts +4 -0
- package/dist/uni/RangeAreaChart.vue.d.ts +4 -0
- package/dist/uni/SankeyChart.vue.d.ts +4 -0
- package/dist/uni/ScatterChart.vue.d.ts +4 -0
- package/dist/uni/Sparkline.vue.d.ts +4 -0
- package/dist/uni/SunburstChart.vue.d.ts +4 -0
- package/dist/uni/ToastProvider.vue.d.ts +1 -1
- package/dist/uni/TreemapChart.vue.d.ts +4 -0
- package/dist/uni/WaterfallChart.vue.d.ts +9 -0
- package/dist/uni/chart-canvas.d.ts +3 -0
- package/dist/uni/chart-canvas.js +4 -0
- package/dist/uni/chart-types.d.ts +28 -4
- package/dist/uni/chart-types.js +26 -2
- package/dist/uni/charts-canvas.js +1 -1
- package/dist/uni/index.d.ts +2 -1
- package/dist/uni/index.js +1 -0
- package/dist/uni/manifest.d.ts +7 -0
- package/dist/uni/manifest.js +10 -0
- package/dist/uni/named-chart-options.d.ts +9 -2
- package/dist/uni/named-chart-options.js +18 -1
- package/dist/uni/shape-chart-canvas.d.ts +3 -1
- package/dist/uni/shape-chart-canvas.js +15 -24
- package/dist/uni/shape-chart-types.d.ts +52 -2
- package/dist/uni/shape-chart-types.js +44 -0
- package/dist/vue/charts-global.d.ts +48 -0
- package/dist/vue/charts.d.ts +18 -0
- package/dist/vue/charts.js +56 -0
- package/dist/vue/charts.js.map +1 -0
- package/dist/vue/components/Chart/BoxPlotChart.vue.d.ts +8 -0
- package/dist/vue/components/Chart/BoxPlotChart.vue.js.map +1 -1
- package/dist/vue/components/Chart/BoxPlotChart.vue_vue_type_script_setup_true_lang.js +8 -2
- package/dist/vue/components/Chart/BoxPlotChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/vue/components/Chart/ChordChart.vue.d.ts +153 -0
- package/dist/vue/components/Chart/ChordChart.vue.js +7 -0
- package/dist/vue/components/Chart/ChordChart.vue.js.map +1 -0
- package/dist/vue/components/Chart/ChordChart.vue_vue_type_script_setup_true_lang.js +81 -0
- package/dist/vue/components/Chart/ChordChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/vue/components/Chart/DependencyGraph.vue.d.ts +179 -0
- package/dist/vue/components/Chart/DependencyGraph.vue.js +7 -0
- package/dist/vue/components/Chart/DependencyGraph.vue.js.map +1 -0
- package/dist/vue/components/Chart/DependencyGraph.vue_vue_type_script_setup_true_lang.js +65 -0
- package/dist/vue/components/Chart/DependencyGraph.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/vue/components/Chart/GanttChart.vue.d.ts +4 -0
- package/dist/vue/components/Chart/GanttChart.vue.js.map +1 -1
- package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js +4 -1
- package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/vue/components/Chart/GraphChart.vue.d.ts +184 -0
- package/dist/vue/components/Chart/GraphChart.vue.js +7 -0
- package/dist/vue/components/Chart/GraphChart.vue.js.map +1 -0
- package/dist/vue/components/Chart/GraphChart.vue_vue_type_script_setup_true_lang.js +62 -0
- package/dist/vue/components/Chart/GraphChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/vue/components/Chart/HeatmapChart.vue.d.ts +9 -5
- package/dist/vue/components/Chart/HeatmapChart.vue.js.map +1 -1
- package/dist/vue/components/Chart/HeatmapChart.vue_vue_type_script_setup_true_lang.js +3 -1
- package/dist/vue/components/Chart/HeatmapChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/vue/components/Chart/OrderBookHeatmap.vue.d.ts +2 -0
- package/dist/vue/components/Chart/TimeAndSales.vue.d.ts +2 -0
- package/dist/vue/components/Chart/TradingChart.vue.d.ts +49 -1
- package/dist/vue/components/Chart/TradingChart.vue.js.map +1 -1
- package/dist/vue/components/Chart/TradingChart.vue_vue_type_script_setup_true_lang.js +31 -0
- package/dist/vue/components/Chart/TradingChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/vue/components/Chart/TreeChart.vue.d.ts +172 -0
- package/dist/vue/components/Chart/TreeChart.vue.js +7 -0
- package/dist/vue/components/Chart/TreeChart.vue.js.map +1 -0
- package/dist/vue/components/Chart/TreeChart.vue_vue_type_script_setup_true_lang.js +56 -0
- package/dist/vue/components/Chart/TreeChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/vue/components/Chart/WaterfallChart.vue.d.ts +12 -1
- package/dist/vue/components/Chart/WaterfallChart.vue.js.map +1 -1
- package/dist/vue/components/Chart/WaterfallChart.vue_vue_type_script_setup_true_lang.js +8 -2
- package/dist/vue/components/Chart/WaterfallChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/vue/components/Chart/graph.d.ts +153 -0
- package/dist/vue/components/Chart/graph.js +135 -0
- package/dist/vue/components/Chart/graph.js.map +1 -0
- package/dist/vue/components/Chart/index.d.ts +5 -1
- package/dist/vue/components/Chart/index.js +5 -1
- package/dist/vue/components/Chart/orderbook.d.ts +5 -1
- package/dist/vue/components/Chart/orderbook.js +2 -0
- package/dist/vue/components/Chart/orderbook.js.map +1 -1
- package/dist/vue/components/Chart/trading.d.ts +24 -2
- package/dist/vue/components/Chart/trading.js +8 -0
- package/dist/vue/components/Chart/trading.js.map +1 -1
- package/dist/vue/components/Chart/types.d.ts +74 -2
- package/dist/vue/global.d.ts +2 -38
- package/dist/vue/groups/charts.js +10 -2
- package/dist/vue/groups/charts.js.map +1 -1
- package/dist/vue/index.js +6 -2
- package/dist/vue/internal/register.d.ts +7 -0
- package/dist/vue/internal/register.js +14 -0
- package/dist/vue/internal/register.js.map +1 -0
- package/dist/vue/plugin.d.ts +9 -4
- package/dist/vue/plugin.js +6 -11
- package/dist/vue/plugin.js.map +1 -1
- package/dist/weapp/charts/canvas.js +1687 -147
- package/dist/weapp/charts/core.js +1 -0
- package/dist/weapp/chord-chart/index.js +1 -0
- package/dist/weapp/chord-chart/index.json +1 -0
- package/dist/weapp/chord-chart/index.wxml +1 -0
- package/dist/weapp/chord-chart/index.wxss +1 -0
- package/dist/weapp/controls.js +92 -32
- package/dist/weapp/types.d.ts +87 -4
- package/dist/web-components/components/chart/charts.d.ts +4 -2
- package/dist/web-components/components/chart/charts.js +8 -1
- package/dist/web-components/components/chart/charts.js.map +1 -1
- package/dist/web-components/components/chart/extended.d.ts +17 -7
- package/dist/web-components/components/chart/extended.js +23 -9
- package/dist/web-components/components/chart/extended.js.map +1 -1
- package/dist/web-components/components/chart/shapes-extended.d.ts +37 -1
- package/dist/web-components/components/chart/shapes-extended.js +27 -1
- package/dist/web-components/components/chart/shapes-extended.js.map +1 -1
- package/dist/web-components/components/graph/graph.d.ts +154 -0
- package/dist/web-components/components/graph/graph.js +149 -0
- package/dist/web-components/components/graph/graph.js.map +1 -0
- package/dist/web-components/components/trading-chart/trading-chart.d.ts +49 -2
- package/dist/web-components/components/trading-chart/trading-chart.js +62 -0
- package/dist/web-components/components/trading-chart/trading-chart.js.map +1 -1
- package/dist/web-components/elements/chart.d.ts +1 -1
- package/dist/web-components/elements/chart.js +6 -5
- package/dist/web-components/elements/chart.js.map +1 -1
- package/dist/web-components/elements/graph.d.ts +2 -0
- package/dist/web-components/elements/graph.js +12 -0
- package/dist/web-components/elements/graph.js.map +1 -0
- package/dist/web-components/html-custom-data.json +273 -4
- package/dist/web-components/types/react.d.ts +63 -4
- package/dist/web-components/types/solid.d.ts +55 -8
- package/dist/web-components/types/svelte.d.ts +55 -8
- package/dist/web-components/types/vue.d.ts +55 -4
- package/package.json +16 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hit.cjs","names":["TAU","padAngleAt","sectorPad","require_scene","require_draw","VERTEX_RADIUS","wrapFrom","d","a","from","pointInSector","dx","x","s","dy","y","span","half","off","pointInPolygon","n","points","inside","i","j","xi","yi","xj","yj","polygonArea","nodeContains","node","pad","pointNearLink","LINK_SEGMENTS","left","right","xm","at","u","t","b0","b1","b2","b3","px","py","k","qx","qy","len2","clampUnit","v","hitRadar","radar","scene","best","bestD","area","index","indicator","diff","angle","hitTestShapes","enter","valid","it","current","hoverAnchor","item","hover","ind","stepHover","items","pos","first","direction","forward","step","count","next"],"sources":["../../../../../charts/src/engine/shapes/hit.ts"],"sourcesContent":["// Hit testing of a ShapeScene and keyboard navigation between its items.\n\nimport { padAngleAt, sectorPad } from \"./draw\";\nimport {\n TAU,\n type LinkNode,\n type ShapeHover,\n type ShapeNode,\n type ShapeScene,\n} from \"./scene\";\n\n/** Distance (px) under which a radar vertex is picked */\nconst VERTEX_RADIUS = 12;\n\n/** Angle `a` brought into [from, from + 2π) */\nconst wrapFrom = (a: number, from: number) => {\n let d = (a - from) % TAU;\n if (d < 0) d += TAU;\n return from + d;\n};\n\n/** Whether a point is in an annular sector (gaps included, corners approximated) */\nexport const pointInSector = (\n x: number,\n y: number,\n s: {\n cx: number;\n cy: number;\n r0: number;\n r1: number;\n a0: number;\n a1: number;\n pad?: number;\n },\n): boolean => {\n const dx = x - s.cx;\n const dy = y - s.cy;\n const d = Math.hypot(dx, dy);\n if (d > s.r1 || d < s.r0) return false;\n const span = s.a1 - s.a0;\n if (span >= TAU - 1e-6) return true;\n if (span <= 0) return false;\n const a = wrapFrom(Math.atan2(dy, dx), s.a0);\n const half = (s.pad ?? 0) / 2;\n const off = half > 0 ? padAngleAt(half, d) : 0;\n return a >= s.a0 + off && a <= s.a1 - off;\n};\n\n/** Even-odd test of a point in a polygon given as a flat x, y list */\nexport const pointInPolygon = (\n x: number,\n y: number,\n points: readonly number[],\n): boolean => {\n const n = points.length >> 1;\n let inside = false;\n for (let i = 0, j = n - 1; i < n; j = i++) {\n const xi = points[i * 2];\n const yi = points[i * 2 + 1];\n const xj = points[j * 2];\n const yj = points[j * 2 + 1];\n if (yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi)\n inside = !inside;\n }\n return inside;\n};\n\nconst polygonArea = (points: readonly number[]) => {\n const n = points.length >> 1;\n let a = 0;\n for (let i = 0, j = n - 1; i < n; j = i++)\n a += points[j * 2] * points[i * 2 + 1] - points[i * 2] * points[j * 2 + 1];\n return Math.abs(a) / 2;\n};\n\nconst nodeContains = (node: ShapeNode, x: number, y: number): boolean => {\n switch (node.kind) {\n case \"sector\":\n return pointInSector(x, y, { ...node, pad: sectorPad(node) });\n case \"polygon\":\n return (\n pointInPolygon(x, y, node.points) &&\n !(node.hole && pointInPolygon(x, y, node.hole))\n );\n case \"rect\": {\n const pad = node.hitPad ?? 0;\n return (\n x >= node.x - pad &&\n x <= node.x + node.width + pad &&\n y >= node.y - pad &&\n y <= node.y + node.height + pad\n );\n }\n case \"circle\":\n return Math.hypot(x - node.cx, y - node.cy) <= node.r;\n case \"arc\": {\n const d = Math.hypot(x - node.cx, y - node.cy);\n if (Math.abs(d - node.r) > node.width / 2 + (node.hitPad ?? 4))\n return false;\n if (node.a1 - node.a0 >= TAU - 1e-6) return true;\n const a = wrapFrom(Math.atan2(y - node.cy, x - node.cx), node.a0);\n return a <= node.a1;\n }\n case \"link\":\n return pointNearLink(x, y, node);\n default:\n return false;\n }\n};\n\n/** Segments of the polyline approximating a link's center curve */\nconst LINK_SEGMENTS = 24;\n\n/** Whether a point is within a sankey link (its thickness, plus 2 px) */\nexport const pointNearLink = (x: number, y: number, node: LinkNode) => {\n const half = Math.max(1, node.width) / 2 + 2;\n const left = Math.min(node.x0, node.x1);\n const right = Math.max(node.x0, node.x1);\n if (x < left - half || x > right + half) return false;\n if (\n y < Math.min(node.y0, node.y1) - half ||\n y > Math.max(node.y0, node.y1) + half\n )\n return false;\n const xm = (node.x0 + node.x1) / 2;\n // cubic Bézier (x0, y0) (xm, y0) (xm, y1) (x1, y1)\n const at = (t: number): [number, number] => {\n const u = 1 - t;\n const b0 = u * u * u;\n const b1 = 3 * u * u * t;\n const b2 = 3 * u * t * t;\n const b3 = t * t * t;\n return [\n b0 * node.x0 + (b1 + b2) * xm + b3 * node.x1,\n (b0 + b1) * node.y0 + (b2 + b3) * node.y1,\n ];\n };\n let [px, py] = at(0);\n for (let k = 1; k <= LINK_SEGMENTS; k++) {\n const [qx, qy] = at(k / LINK_SEGMENTS);\n const dx = qx - px;\n const dy = qy - py;\n const len2 = dx * dx + dy * dy;\n const s = len2 > 0 ? clampUnit(((x - px) * dx + (y - py) * dy) / len2) : 0;\n if (Math.hypot(x - (px + s * dx), y - (py + s * dy)) <= half) return true;\n px = qx;\n py = qy;\n }\n return false;\n};\n\nconst clampUnit = (v: number) => (v < 0 ? 0 : v > 1 ? 1 : v);\n\n/** Radar: the vertex under the pointer, else the smallest polygon containing it */\nconst hitRadar = (\n scene: ShapeScene,\n x: number,\n y: number,\n): ShapeHover | null => {\n const radar = scene.radar;\n if (!radar || !radar.series.length) return null;\n let best: ShapeHover | null = null;\n let bestD = VERTEX_RADIUS;\n for (const s of radar.series) {\n for (let k = 0; k < s.points.length >> 1; k++) {\n const d = Math.hypot(x - s.points[k * 2], y - s.points[k * 2 + 1]);\n if (d <= bestD) {\n bestD = d;\n best = { index: s.index, indicator: k };\n }\n }\n }\n if (best) return best;\n let area = Infinity;\n let index = -1;\n for (const s of radar.series) {\n if (s.points.length < 6 || !pointInPolygon(x, y, s.points)) continue;\n const a = polygonArea(s.points);\n if (a < area) {\n area = a;\n index = s.index;\n }\n }\n if (index < 0) return null;\n // nearest indicator by angle\n const a = Math.atan2(y - radar.cy, x - radar.cx);\n let indicator = 0;\n let diff = Infinity;\n radar.angles.forEach((angle, k) => {\n const d = Math.abs(wrapFrom(a - angle + Math.PI, 0) - Math.PI);\n if (d < diff) {\n diff = d;\n indicator = k;\n }\n });\n return { index, indicator };\n};\n\n/**\n * Item under a point (CSS pixels). `current` is the hovered item: its\n * popped-out geometry also counts so a moved slice keeps the hover.\n */\nexport const hitTestShapes = (\n scene: ShapeScene,\n x: number,\n y: number,\n current: ShapeHover | null = null,\n): ShapeHover | null => {\n if (scene.empty) return null;\n if (scene.type === \"radar\") return hitRadar(scene, x, y);\n const enter = scene.enter;\n if (enter && enter.scale > 0 && enter.scale !== 1) {\n x = enter.cx + (x - enter.cx) / enter.scale;\n y = enter.cy + (y - enter.cy) / enter.scale;\n }\n const valid = new Set(scene.items.map((it) => it.index));\n for (let i = scene.nodes.length - 1; i >= 0; i--) {\n const node = scene.nodes[i];\n if (node.hit === undefined || !valid.has(node.hit)) continue;\n if (node.kind === \"text\" || node.kind === \"line\") continue;\n if (nodeContains(node, x, y)) return { index: node.hit };\n if (current?.index === node.hit && node.shift) {\n const [dx, dy] = node.shift;\n if (nodeContains(node, x - dx, y - dy)) return { index: node.hit };\n }\n }\n return null;\n};\n\n/** Where the tooltip of a keyboard-focused item goes */\nexport const hoverAnchor = (\n scene: ShapeScene,\n hover: ShapeHover,\n): { x: number; y: number } | null => {\n const item = scene.items.find((it) => it.index === hover.index);\n if (!item) return null;\n const ind =\n hover.indicator !== undefined ? item.indicators?.[hover.indicator] : null;\n return ind ? { x: ind.x, y: ind.y } : { x: item.x, y: item.y };\n};\n\n/**\n * Next focused item for the arrow keys: `next` / `prev` walk the items\n * (radar: the indicators of the series), `up` / `down` the radar series.\n */\nexport const stepHover = (\n scene: ShapeScene,\n current: ShapeHover | null,\n direction: \"next\" | \"prev\" | \"up\" | \"down\",\n): ShapeHover | null => {\n const items = scene.items;\n if (!items.length) return null;\n const pos = current\n ? items.findIndex((it) => it.index === current.index)\n : -1;\n const radar = scene.type === \"radar\";\n if (pos < 0) {\n const first =\n direction === \"prev\" || direction === \"up\" ? items.length - 1 : 0;\n return radar\n ? { index: items[first].index, indicator: 0 }\n : { index: items[first].index };\n }\n const forward = direction === \"next\" || direction === \"down\";\n if (scene.steps) {\n const step =\n direction === \"next\" || direction === \"prev\"\n ? scene.steps.next\n : scene.steps.down;\n const target = items[pos + (forward ? step : -step)];\n return { index: (target ?? items[pos]).index };\n }\n if (radar && (direction === \"next\" || direction === \"prev\")) {\n const count = items[pos].indicators?.length ?? 1;\n const k = current?.indicator ?? 0;\n return {\n index: items[pos].index,\n indicator: (k + (forward ? 1 : -1) + count) % count,\n };\n }\n const next = items[(pos + (forward ? 1 : -1) + items.length) % items.length];\n return radar\n ? { index: next.index, indicator: current?.indicator ?? 0 }\n : { index: next.index };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hit.cjs","names":["TAU","padAngleAt","sectorPad","ribbonIsLoop","loopControl","require_scene","require_draw","VERTEX_RADIUS","wrapFrom","d","a","from","pointInSector","dx","x","s","dy","y","span","half","off","pointInPolygon","n","points","inside","i","j","xi","yi","xj","yj","polygonArea","nodeContains","node","pad","pointNearLink","ribbonOutline","LINK_SEGMENTS","left","right","xm","at","u","t","b0","b1","b2","b3","px","py","k","qx","qy","len2","clampUnit","v","pts","arc","r","steps","a1","a0","cx","radius","cy","quad","x0","y0","p0","hitRadar","radar","scene","best","bestD","area","index","indicator","diff","angle","hitTestShapes","enter","valid","it","current","hoverAnchor","item","hover","ind","stepHover","items","pos","first","direction","forward","step","count","next"],"sources":["../../../../../charts/src/engine/shapes/hit.ts"],"sourcesContent":["// Hit testing of a ShapeScene and keyboard navigation between its items.\n\nimport { loopControl, padAngleAt, ribbonIsLoop, sectorPad } from \"./draw\";\nimport {\n TAU,\n type LinkNode,\n type RibbonNode,\n type ShapeHover,\n type ShapeNode,\n type ShapeScene,\n} from \"./scene\";\n\n/** Distance (px) under which a radar vertex is picked */\nconst VERTEX_RADIUS = 12;\n\n/** Angle `a` brought into [from, from + 2π) */\nconst wrapFrom = (a: number, from: number) => {\n let d = (a - from) % TAU;\n if (d < 0) d += TAU;\n return from + d;\n};\n\n/** Whether a point is in an annular sector (gaps included, corners approximated) */\nexport const pointInSector = (\n x: number,\n y: number,\n s: {\n cx: number;\n cy: number;\n r0: number;\n r1: number;\n a0: number;\n a1: number;\n pad?: number;\n },\n): boolean => {\n const dx = x - s.cx;\n const dy = y - s.cy;\n const d = Math.hypot(dx, dy);\n if (d > s.r1 || d < s.r0) return false;\n const span = s.a1 - s.a0;\n if (span >= TAU - 1e-6) return true;\n if (span <= 0) return false;\n const a = wrapFrom(Math.atan2(dy, dx), s.a0);\n const half = (s.pad ?? 0) / 2;\n const off = half > 0 ? padAngleAt(half, d) : 0;\n return a >= s.a0 + off && a <= s.a1 - off;\n};\n\n/** Even-odd test of a point in a polygon given as a flat x, y list */\nexport const pointInPolygon = (\n x: number,\n y: number,\n points: readonly number[],\n): boolean => {\n const n = points.length >> 1;\n let inside = false;\n for (let i = 0, j = n - 1; i < n; j = i++) {\n const xi = points[i * 2];\n const yi = points[i * 2 + 1];\n const xj = points[j * 2];\n const yj = points[j * 2 + 1];\n if (yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi)\n inside = !inside;\n }\n return inside;\n};\n\nconst polygonArea = (points: readonly number[]) => {\n const n = points.length >> 1;\n let a = 0;\n for (let i = 0, j = n - 1; i < n; j = i++)\n a += points[j * 2] * points[i * 2 + 1] - points[i * 2] * points[j * 2 + 1];\n return Math.abs(a) / 2;\n};\n\nconst nodeContains = (node: ShapeNode, x: number, y: number): boolean => {\n switch (node.kind) {\n case \"sector\":\n return pointInSector(x, y, { ...node, pad: sectorPad(node) });\n case \"polygon\":\n return (\n pointInPolygon(x, y, node.points) &&\n !(node.hole && pointInPolygon(x, y, node.hole))\n );\n case \"rect\": {\n const pad = node.hitPad ?? 0;\n return (\n x >= node.x - pad &&\n x <= node.x + node.width + pad &&\n y >= node.y - pad &&\n y <= node.y + node.height + pad\n );\n }\n case \"circle\":\n return Math.hypot(x - node.cx, y - node.cy) <= node.r;\n case \"arc\": {\n const d = Math.hypot(x - node.cx, y - node.cy);\n if (Math.abs(d - node.r) > node.width / 2 + (node.hitPad ?? 4))\n return false;\n if (node.a1 - node.a0 >= TAU - 1e-6) return true;\n const a = wrapFrom(Math.atan2(y - node.cy, x - node.cx), node.a0);\n return a <= node.a1;\n }\n case \"link\":\n return pointNearLink(x, y, node);\n case \"ribbon\":\n return (\n Math.hypot(x - node.cx, y - node.cy) <= node.r + 1 &&\n pointInPolygon(x, y, ribbonOutline(node))\n );\n default:\n return false;\n }\n};\n\n/** Segments of the polyline approximating a link's center curve */\nconst LINK_SEGMENTS = 24;\n\n/** Whether a point is within a sankey link (its thickness, plus 2 px) */\nexport const pointNearLink = (x: number, y: number, node: LinkNode) => {\n const half = Math.max(1, node.width) / 2 + 2;\n const left = Math.min(node.x0, node.x1);\n const right = Math.max(node.x0, node.x1);\n if (x < left - half || x > right + half) return false;\n if (\n y < Math.min(node.y0, node.y1) - half ||\n y > Math.max(node.y0, node.y1) + half\n )\n return false;\n const xm = (node.x0 + node.x1) / 2;\n // cubic Bézier (x0, y0) (xm, y0) (xm, y1) (x1, y1)\n const at = (t: number): [number, number] => {\n const u = 1 - t;\n const b0 = u * u * u;\n const b1 = 3 * u * u * t;\n const b2 = 3 * u * t * t;\n const b3 = t * t * t;\n return [\n b0 * node.x0 + (b1 + b2) * xm + b3 * node.x1,\n (b0 + b1) * node.y0 + (b2 + b3) * node.y1,\n ];\n };\n let [px, py] = at(0);\n for (let k = 1; k <= LINK_SEGMENTS; k++) {\n const [qx, qy] = at(k / LINK_SEGMENTS);\n const dx = qx - px;\n const dy = qy - py;\n const len2 = dx * dx + dy * dy;\n const s = len2 > 0 ? clampUnit(((x - px) * dx + (y - py) * dy) / len2) : 0;\n if (Math.hypot(x - (px + s * dx), y - (py + s * dy)) <= half) return true;\n px = qx;\n py = qy;\n }\n return false;\n};\n\nconst clampUnit = (v: number) => (v < 0 ? 0 : v > 1 ? 1 : v);\n\n/** Polygon (flat x, y list) approximating a chord ribbon, as drawn */\nexport const ribbonOutline = (node: RibbonNode): number[] => {\n const { cx, cy, r } = node;\n const pts: number[] = [];\n const arc = (a0: number, a1: number, radius = r) => {\n const steps = Math.max(1, Math.ceil((a1 - a0) / 0.06));\n for (let k = 0; k <= steps; k++) {\n const a = a0 + ((a1 - a0) * k) / steps;\n pts.push(cx + radius * Math.cos(a), cy + radius * Math.sin(a));\n }\n };\n // quadratic from the last point to (x, y), control (qx, qy)\n const quad = (qx: number, qy: number, x: number, y: number) => {\n const x0 = pts[pts.length - 2];\n const y0 = pts[pts.length - 1];\n for (let k = 1; k <= 16; k++) {\n const t = k / 16;\n const u = 1 - t;\n pts.push(\n u * u * x0 + 2 * u * t * qx + t * t * x,\n u * u * y0 + 2 * u * t * qy + t * t * y,\n );\n }\n };\n const at = (a: number, radius = r): [number, number] => [\n cx + radius * Math.cos(a),\n cy + radius * Math.sin(a),\n ];\n arc(node.s0, Math.max(node.s0, node.s1));\n const s = at(node.s0);\n if (ribbonIsLoop(node)) {\n const [qx, qy] = loopControl(node);\n quad(qx, qy, s[0], s[1]);\n return pts;\n }\n if (node.head > 0) {\n const p0 = at(node.t0, r - node.head);\n quad(cx, cy, p0[0], p0[1]);\n pts.push(...at((node.t0 + node.t1) / 2), ...at(node.t1, r - node.head));\n } else {\n const t = at(node.t0);\n quad(cx, cy, t[0], t[1]);\n arc(node.t0, Math.max(node.t0, node.t1));\n }\n quad(cx, cy, s[0], s[1]);\n return pts;\n};\n\n/** Radar: the vertex under the pointer, else the smallest polygon containing it */\nconst hitRadar = (\n scene: ShapeScene,\n x: number,\n y: number,\n): ShapeHover | null => {\n const radar = scene.radar;\n if (!radar || !radar.series.length) return null;\n let best: ShapeHover | null = null;\n let bestD = VERTEX_RADIUS;\n for (const s of radar.series) {\n for (let k = 0; k < s.points.length >> 1; k++) {\n const d = Math.hypot(x - s.points[k * 2], y - s.points[k * 2 + 1]);\n if (d <= bestD) {\n bestD = d;\n best = { index: s.index, indicator: k };\n }\n }\n }\n if (best) return best;\n let area = Infinity;\n let index = -1;\n for (const s of radar.series) {\n if (s.points.length < 6 || !pointInPolygon(x, y, s.points)) continue;\n const a = polygonArea(s.points);\n if (a < area) {\n area = a;\n index = s.index;\n }\n }\n if (index < 0) return null;\n // nearest indicator by angle\n const a = Math.atan2(y - radar.cy, x - radar.cx);\n let indicator = 0;\n let diff = Infinity;\n radar.angles.forEach((angle, k) => {\n const d = Math.abs(wrapFrom(a - angle + Math.PI, 0) - Math.PI);\n if (d < diff) {\n diff = d;\n indicator = k;\n }\n });\n return { index, indicator };\n};\n\n/**\n * Item under a point (CSS pixels). `current` is the hovered item: its\n * popped-out geometry also counts so a moved slice keeps the hover.\n */\nexport const hitTestShapes = (\n scene: ShapeScene,\n x: number,\n y: number,\n current: ShapeHover | null = null,\n): ShapeHover | null => {\n if (scene.empty) return null;\n if (scene.type === \"radar\") return hitRadar(scene, x, y);\n const enter = scene.enter;\n if (enter && enter.scale > 0 && enter.scale !== 1) {\n x = enter.cx + (x - enter.cx) / enter.scale;\n y = enter.cy + (y - enter.cy) / enter.scale;\n }\n const valid = new Set(scene.items.map((it) => it.index));\n for (let i = scene.nodes.length - 1; i >= 0; i--) {\n const node = scene.nodes[i];\n if (node.hit === undefined || !valid.has(node.hit)) continue;\n if (node.kind === \"text\" || node.kind === \"line\") continue;\n if (nodeContains(node, x, y)) return { index: node.hit };\n if (current?.index === node.hit && node.shift) {\n const [dx, dy] = node.shift;\n if (nodeContains(node, x - dx, y - dy)) return { index: node.hit };\n }\n }\n return null;\n};\n\n/** Where the tooltip of a keyboard-focused item goes */\nexport const hoverAnchor = (\n scene: ShapeScene,\n hover: ShapeHover,\n): { x: number; y: number } | null => {\n const item = scene.items.find((it) => it.index === hover.index);\n if (!item) return null;\n const ind =\n hover.indicator !== undefined ? item.indicators?.[hover.indicator] : null;\n return ind ? { x: ind.x, y: ind.y } : { x: item.x, y: item.y };\n};\n\n/**\n * Next focused item for the arrow keys: `next` / `prev` walk the items\n * (radar: the indicators of the series), `up` / `down` the radar series.\n */\nexport const stepHover = (\n scene: ShapeScene,\n current: ShapeHover | null,\n direction: \"next\" | \"prev\" | \"up\" | \"down\",\n): ShapeHover | null => {\n const items = scene.items;\n if (!items.length) return null;\n const pos = current\n ? items.findIndex((it) => it.index === current.index)\n : -1;\n const radar = scene.type === \"radar\";\n if (pos < 0) {\n const first =\n direction === \"prev\" || direction === \"up\" ? items.length - 1 : 0;\n return radar\n ? { index: items[first].index, indicator: 0 }\n : { index: items[first].index };\n }\n const forward = direction === \"next\" || direction === \"down\";\n if (scene.steps) {\n const step =\n direction === \"next\" || direction === \"prev\"\n ? scene.steps.next\n : scene.steps.down;\n const target = items[pos + (forward ? step : -step)];\n return { index: (target ?? items[pos]).index };\n }\n if (radar && (direction === \"next\" || direction === \"prev\")) {\n const count = items[pos].indicators?.length ?? 1;\n const k = current?.indicator ?? 0;\n return {\n index: items[pos].index,\n indicator: (k + (forward ? 1 : -1) + count) % count,\n };\n }\n const next = items[(pos + (forward ? 1 : -1) + items.length) % items.length];\n return radar\n ? { index: next.index, indicator: current?.indicator ?? 0 }\n : { index: next.index };\n};\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { LinkNode, ShapeHover, ShapeScene } from './scene.cjs';
|
|
1
|
+
import { LinkNode, RibbonNode, ShapeHover, ShapeScene } from './scene.cjs';
|
|
2
2
|
/** Whether a point is in an annular sector (gaps included, corners approximated) */
|
|
3
3
|
export declare const pointInSector: (x: number, y: number, s: {
|
|
4
4
|
cx: number;
|
|
@@ -13,6 +13,8 @@ export declare const pointInSector: (x: number, y: number, s: {
|
|
|
13
13
|
export declare const pointInPolygon: (x: number, y: number, points: readonly number[]) => boolean;
|
|
14
14
|
/** Whether a point is within a sankey link (its thickness, plus 2 px) */
|
|
15
15
|
export declare const pointNearLink: (x: number, y: number, node: LinkNode) => boolean;
|
|
16
|
+
/** Polygon (flat x, y list) approximating a chord ribbon, as drawn */
|
|
17
|
+
export declare const ribbonOutline: (node: RibbonNode) => number[];
|
|
16
18
|
/**
|
|
17
19
|
* Item under a point (CSS pixels). `current` is the hovered item: its
|
|
18
20
|
* popped-out geometry also counts so a moved slice keeps the hover.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { LinkNode, ShapeHover, ShapeScene } from './scene.js';
|
|
1
|
+
import { LinkNode, RibbonNode, ShapeHover, ShapeScene } from './scene.js';
|
|
2
2
|
/** Whether a point is in an annular sector (gaps included, corners approximated) */
|
|
3
3
|
export declare const pointInSector: (x: number, y: number, s: {
|
|
4
4
|
cx: number;
|
|
@@ -13,6 +13,8 @@ export declare const pointInSector: (x: number, y: number, s: {
|
|
|
13
13
|
export declare const pointInPolygon: (x: number, y: number, points: readonly number[]) => boolean;
|
|
14
14
|
/** Whether a point is within a sankey link (its thickness, plus 2 px) */
|
|
15
15
|
export declare const pointNearLink: (x: number, y: number, node: LinkNode) => boolean;
|
|
16
|
+
/** Polygon (flat x, y list) approximating a chord ribbon, as drawn */
|
|
17
|
+
export declare const ribbonOutline: (node: RibbonNode) => number[];
|
|
16
18
|
/**
|
|
17
19
|
* Item under a point (CSS pixels). `current` is the hovered item: its
|
|
18
20
|
* popped-out geometry also counts so a moved slice keeps the hover.
|
|
@@ -1,105 +1,134 @@
|
|
|
1
1
|
import { TAU as e } from "./scene.js";
|
|
2
|
-
import {
|
|
2
|
+
import { loopControl as t, padAngleAt as n, ribbonIsLoop as r, sectorPad as i } from "./draw.js";
|
|
3
3
|
//#region src/engine/shapes/hit.ts
|
|
4
|
-
var
|
|
4
|
+
var a = 12, o = (t, n) => {
|
|
5
5
|
let r = (t - n) % e;
|
|
6
6
|
return r < 0 && (r += e), n + r;
|
|
7
|
-
},
|
|
8
|
-
let
|
|
9
|
-
if (c >
|
|
10
|
-
let l =
|
|
7
|
+
}, s = (t, r, i) => {
|
|
8
|
+
let a = t - i.cx, s = r - i.cy, c = Math.hypot(a, s);
|
|
9
|
+
if (c > i.r1 || c < i.r0) return !1;
|
|
10
|
+
let l = i.a1 - i.a0;
|
|
11
11
|
if (l >= e - 1e-6) return !0;
|
|
12
12
|
if (l <= 0) return !1;
|
|
13
|
-
let u =
|
|
14
|
-
return u >=
|
|
15
|
-
},
|
|
13
|
+
let u = o(Math.atan2(s, a), i.a0), d = (i.pad ?? 0) / 2, f = d > 0 ? n(d, c) : 0;
|
|
14
|
+
return u >= i.a0 + f && u <= i.a1 - f;
|
|
15
|
+
}, c = (e, t, n) => {
|
|
16
16
|
let r = n.length >> 1, i = !1;
|
|
17
17
|
for (let a = 0, o = r - 1; a < r; o = a++) {
|
|
18
18
|
let r = n[a * 2], s = n[a * 2 + 1], c = n[o * 2], l = n[o * 2 + 1];
|
|
19
19
|
s > t != l > t && e < (c - r) * (t - s) / (l - s) + r && (i = !i);
|
|
20
20
|
}
|
|
21
21
|
return i;
|
|
22
|
-
},
|
|
22
|
+
}, l = (e) => {
|
|
23
23
|
let t = e.length >> 1, n = 0;
|
|
24
24
|
for (let r = 0, i = t - 1; r < t; i = r++) n += e[i * 2] * e[r * 2 + 1] - e[r * 2] * e[i * 2 + 1];
|
|
25
25
|
return Math.abs(n) / 2;
|
|
26
|
-
},
|
|
26
|
+
}, u = (t, n, r) => {
|
|
27
27
|
switch (t.kind) {
|
|
28
|
-
case "sector": return
|
|
28
|
+
case "sector": return s(n, r, {
|
|
29
29
|
...t,
|
|
30
|
-
pad:
|
|
30
|
+
pad: i(t)
|
|
31
31
|
});
|
|
32
|
-
case "polygon": return
|
|
32
|
+
case "polygon": return c(n, r, t.points) && !(t.hole && c(n, r, t.hole));
|
|
33
33
|
case "rect": {
|
|
34
34
|
let e = t.hitPad ?? 0;
|
|
35
|
-
return
|
|
35
|
+
return n >= t.x - e && n <= t.x + t.width + e && r >= t.y - e && r <= t.y + t.height + e;
|
|
36
36
|
}
|
|
37
|
-
case "circle": return Math.hypot(
|
|
37
|
+
case "circle": return Math.hypot(n - t.cx, r - t.cy) <= t.r;
|
|
38
38
|
case "arc": {
|
|
39
|
-
let
|
|
40
|
-
return Math.abs(
|
|
39
|
+
let i = Math.hypot(n - t.cx, r - t.cy);
|
|
40
|
+
return Math.abs(i - t.r) > t.width / 2 + (t.hitPad ?? 4) ? !1 : t.a1 - t.a0 >= e - 1e-6 || o(Math.atan2(r - t.cy, n - t.cx), t.a0) <= t.a1;
|
|
41
41
|
}
|
|
42
|
-
case "link": return
|
|
42
|
+
case "link": return f(n, r, t);
|
|
43
|
+
case "ribbon": return Math.hypot(n - t.cx, r - t.cy) <= t.r + 1 && c(n, r, m(t));
|
|
43
44
|
default: return !1;
|
|
44
45
|
}
|
|
45
|
-
},
|
|
46
|
+
}, d = 24, f = (e, t, n) => {
|
|
46
47
|
let r = Math.max(1, n.width) / 2 + 2, i = Math.min(n.x0, n.x1), a = Math.max(n.x0, n.x1);
|
|
47
48
|
if (e < i - r || e > a + r || t < Math.min(n.y0, n.y1) - r || t > Math.max(n.y0, n.y1) + r) return !1;
|
|
48
49
|
let o = (n.x0 + n.x1) / 2, s = (e) => {
|
|
49
50
|
let t = 1 - e, r = t * t * t, i = 3 * t * t * e, a = 3 * t * e * e, s = e * e * e;
|
|
50
51
|
return [r * n.x0 + (i + a) * o + s * n.x1, (r + i) * n.y0 + (a + s) * n.y1];
|
|
51
|
-
}, [c,
|
|
52
|
-
for (let n = 1; n <=
|
|
53
|
-
let [i, a] = s(n /
|
|
54
|
-
if (Math.hypot(e - (c + m * o), t - (
|
|
55
|
-
c = i,
|
|
52
|
+
}, [c, l] = s(0);
|
|
53
|
+
for (let n = 1; n <= d; n++) {
|
|
54
|
+
let [i, a] = s(n / d), o = i - c, u = a - l, f = o * o + u * u, m = f > 0 ? p(((e - c) * o + (t - l) * u) / f) : 0;
|
|
55
|
+
if (Math.hypot(e - (c + m * o), t - (l + m * u)) <= r) return !0;
|
|
56
|
+
c = i, l = a;
|
|
56
57
|
}
|
|
57
58
|
return !1;
|
|
58
|
-
},
|
|
59
|
-
let a = e
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
59
|
+
}, p = (e) => e < 0 ? 0 : e > 1 ? 1 : e, m = (e) => {
|
|
60
|
+
let { cx: n, cy: i, r: a } = e, o = [], s = (e, t, r = a) => {
|
|
61
|
+
let s = Math.max(1, Math.ceil((t - e) / .06));
|
|
62
|
+
for (let a = 0; a <= s; a++) {
|
|
63
|
+
let c = e + (t - e) * a / s;
|
|
64
|
+
o.push(n + r * Math.cos(c), i + r * Math.sin(c));
|
|
65
|
+
}
|
|
66
|
+
}, c = (e, t, n, r) => {
|
|
67
|
+
let i = o[o.length - 2], a = o[o.length - 1];
|
|
68
|
+
for (let s = 1; s <= 16; s++) {
|
|
69
|
+
let c = s / 16, l = 1 - c;
|
|
70
|
+
o.push(l * l * i + 2 * l * c * e + c * c * n, l * l * a + 2 * l * c * t + c * c * r);
|
|
71
|
+
}
|
|
72
|
+
}, l = (e, t = a) => [n + t * Math.cos(e), i + t * Math.sin(e)];
|
|
73
|
+
s(e.s0, Math.max(e.s0, e.s1));
|
|
74
|
+
let u = l(e.s0);
|
|
75
|
+
if (r(e)) {
|
|
76
|
+
let [n, r] = t(e);
|
|
77
|
+
return c(n, r, u[0], u[1]), o;
|
|
78
|
+
}
|
|
79
|
+
if (e.head > 0) {
|
|
80
|
+
let t = l(e.t0, a - e.head);
|
|
81
|
+
c(n, i, t[0], t[1]), o.push(...l((e.t0 + e.t1) / 2), ...l(e.t1, a - e.head));
|
|
82
|
+
} else {
|
|
83
|
+
let t = l(e.t0);
|
|
84
|
+
c(n, i, t[0], t[1]), s(e.t0, Math.max(e.t0, e.t1));
|
|
85
|
+
}
|
|
86
|
+
return c(n, i, u[0], u[1]), o;
|
|
87
|
+
}, h = (e, t, n) => {
|
|
88
|
+
let r = e.radar;
|
|
89
|
+
if (!r || !r.series.length) return null;
|
|
90
|
+
let i = null, s = a;
|
|
91
|
+
for (let e of r.series) for (let r = 0; r < e.points.length >> 1; r++) {
|
|
92
|
+
let a = Math.hypot(t - e.points[r * 2], n - e.points[r * 2 + 1]);
|
|
93
|
+
a <= s && (s = a, i = {
|
|
65
94
|
index: e.index,
|
|
66
95
|
indicator: r
|
|
67
96
|
});
|
|
68
97
|
}
|
|
69
|
-
if (
|
|
98
|
+
if (i) return i;
|
|
70
99
|
let u = Infinity, d = -1;
|
|
71
|
-
for (let e of
|
|
72
|
-
if (e.points.length < 6 || !
|
|
73
|
-
let r =
|
|
100
|
+
for (let e of r.series) {
|
|
101
|
+
if (e.points.length < 6 || !c(t, n, e.points)) continue;
|
|
102
|
+
let r = l(e.points);
|
|
74
103
|
r < u && (u = r, d = e.index);
|
|
75
104
|
}
|
|
76
105
|
if (d < 0) return null;
|
|
77
|
-
let f = Math.atan2(n -
|
|
78
|
-
return
|
|
79
|
-
let n = Math.abs(
|
|
106
|
+
let f = Math.atan2(n - r.cy, t - r.cx), p = 0, m = Infinity;
|
|
107
|
+
return r.angles.forEach((e, t) => {
|
|
108
|
+
let n = Math.abs(o(f - e + Math.PI, 0) - Math.PI);
|
|
80
109
|
n < m && (m = n, p = t);
|
|
81
110
|
}), {
|
|
82
111
|
index: d,
|
|
83
112
|
indicator: p
|
|
84
113
|
};
|
|
85
|
-
},
|
|
114
|
+
}, g = (e, t, n, r = null) => {
|
|
86
115
|
if (e.empty) return null;
|
|
87
|
-
if (e.type === "radar") return
|
|
116
|
+
if (e.type === "radar") return h(e, t, n);
|
|
88
117
|
let i = e.enter;
|
|
89
118
|
i && i.scale > 0 && i.scale !== 1 && (t = i.cx + (t - i.cx) / i.scale, n = i.cy + (n - i.cy) / i.scale);
|
|
90
119
|
let a = new Set(e.items.map((e) => e.index));
|
|
91
120
|
for (let i = e.nodes.length - 1; i >= 0; i--) {
|
|
92
121
|
let o = e.nodes[i];
|
|
93
122
|
if (o.hit !== void 0 && a.has(o.hit) && o.kind !== "text" && o.kind !== "line") {
|
|
94
|
-
if (
|
|
123
|
+
if (u(o, t, n)) return { index: o.hit };
|
|
95
124
|
if (r?.index === o.hit && o.shift) {
|
|
96
125
|
let [e, r] = o.shift;
|
|
97
|
-
if (
|
|
126
|
+
if (u(o, t - e, n - r)) return { index: o.hit };
|
|
98
127
|
}
|
|
99
128
|
}
|
|
100
129
|
}
|
|
101
130
|
return null;
|
|
102
|
-
},
|
|
131
|
+
}, _ = (e, t) => {
|
|
103
132
|
let n = e.items.find((e) => e.index === t.index);
|
|
104
133
|
if (!n) return null;
|
|
105
134
|
let r = t.indicator === void 0 ? null : n.indicators?.[t.indicator];
|
|
@@ -110,7 +139,7 @@ var r = 12, i = (t, n) => {
|
|
|
110
139
|
x: n.x,
|
|
111
140
|
y: n.y
|
|
112
141
|
};
|
|
113
|
-
},
|
|
142
|
+
}, v = (e, t, n) => {
|
|
114
143
|
let r = e.items;
|
|
115
144
|
if (!r.length) return null;
|
|
116
145
|
let i = t ? r.findIndex((e) => e.index === t.index) : -1, a = e.type === "radar";
|
|
@@ -140,6 +169,6 @@ var r = 12, i = (t, n) => {
|
|
|
140
169
|
} : { index: s.index };
|
|
141
170
|
};
|
|
142
171
|
//#endregion
|
|
143
|
-
export {
|
|
172
|
+
export { g as hitTestShapes, _ as hoverAnchor, c as pointInPolygon, s as pointInSector, f as pointNearLink, m as ribbonOutline, v as stepHover };
|
|
144
173
|
|
|
145
174
|
//# sourceMappingURL=hit.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hit.js","names":["VERTEX_RADIUS","wrapFrom","d","a","from","TAU","pointInSector","dx","x","s","dy","y","span","half","off","padAngleAt","pointInPolygon","n","points","inside","i","j","xi","yi","xj","yj","polygonArea","nodeContains","node","sectorPad","pad","pointNearLink","LINK_SEGMENTS","left","right","xm","at","u","t","b0","b1","b2","b3","px","py","k","qx","qy","len2","clampUnit","v","hitRadar","radar","scene","best","bestD","area","index","indicator","diff","angle","hitTestShapes","enter","valid","it","current","hoverAnchor","item","hover","ind","stepHover","items","pos","first","direction","forward","step","count","next"],"sources":["../../../../../charts/src/engine/shapes/hit.ts"],"sourcesContent":["// Hit testing of a ShapeScene and keyboard navigation between its items.\n\nimport { padAngleAt, sectorPad } from \"./draw\";\nimport {\n TAU,\n type LinkNode,\n type ShapeHover,\n type ShapeNode,\n type ShapeScene,\n} from \"./scene\";\n\n/** Distance (px) under which a radar vertex is picked */\nconst VERTEX_RADIUS = 12;\n\n/** Angle `a` brought into [from, from + 2π) */\nconst wrapFrom = (a: number, from: number) => {\n let d = (a - from) % TAU;\n if (d < 0) d += TAU;\n return from + d;\n};\n\n/** Whether a point is in an annular sector (gaps included, corners approximated) */\nexport const pointInSector = (\n x: number,\n y: number,\n s: {\n cx: number;\n cy: number;\n r0: number;\n r1: number;\n a0: number;\n a1: number;\n pad?: number;\n },\n): boolean => {\n const dx = x - s.cx;\n const dy = y - s.cy;\n const d = Math.hypot(dx, dy);\n if (d > s.r1 || d < s.r0) return false;\n const span = s.a1 - s.a0;\n if (span >= TAU - 1e-6) return true;\n if (span <= 0) return false;\n const a = wrapFrom(Math.atan2(dy, dx), s.a0);\n const half = (s.pad ?? 0) / 2;\n const off = half > 0 ? padAngleAt(half, d) : 0;\n return a >= s.a0 + off && a <= s.a1 - off;\n};\n\n/** Even-odd test of a point in a polygon given as a flat x, y list */\nexport const pointInPolygon = (\n x: number,\n y: number,\n points: readonly number[],\n): boolean => {\n const n = points.length >> 1;\n let inside = false;\n for (let i = 0, j = n - 1; i < n; j = i++) {\n const xi = points[i * 2];\n const yi = points[i * 2 + 1];\n const xj = points[j * 2];\n const yj = points[j * 2 + 1];\n if (yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi)\n inside = !inside;\n }\n return inside;\n};\n\nconst polygonArea = (points: readonly number[]) => {\n const n = points.length >> 1;\n let a = 0;\n for (let i = 0, j = n - 1; i < n; j = i++)\n a += points[j * 2] * points[i * 2 + 1] - points[i * 2] * points[j * 2 + 1];\n return Math.abs(a) / 2;\n};\n\nconst nodeContains = (node: ShapeNode, x: number, y: number): boolean => {\n switch (node.kind) {\n case \"sector\":\n return pointInSector(x, y, { ...node, pad: sectorPad(node) });\n case \"polygon\":\n return (\n pointInPolygon(x, y, node.points) &&\n !(node.hole && pointInPolygon(x, y, node.hole))\n );\n case \"rect\": {\n const pad = node.hitPad ?? 0;\n return (\n x >= node.x - pad &&\n x <= node.x + node.width + pad &&\n y >= node.y - pad &&\n y <= node.y + node.height + pad\n );\n }\n case \"circle\":\n return Math.hypot(x - node.cx, y - node.cy) <= node.r;\n case \"arc\": {\n const d = Math.hypot(x - node.cx, y - node.cy);\n if (Math.abs(d - node.r) > node.width / 2 + (node.hitPad ?? 4))\n return false;\n if (node.a1 - node.a0 >= TAU - 1e-6) return true;\n const a = wrapFrom(Math.atan2(y - node.cy, x - node.cx), node.a0);\n return a <= node.a1;\n }\n case \"link\":\n return pointNearLink(x, y, node);\n default:\n return false;\n }\n};\n\n/** Segments of the polyline approximating a link's center curve */\nconst LINK_SEGMENTS = 24;\n\n/** Whether a point is within a sankey link (its thickness, plus 2 px) */\nexport const pointNearLink = (x: number, y: number, node: LinkNode) => {\n const half = Math.max(1, node.width) / 2 + 2;\n const left = Math.min(node.x0, node.x1);\n const right = Math.max(node.x0, node.x1);\n if (x < left - half || x > right + half) return false;\n if (\n y < Math.min(node.y0, node.y1) - half ||\n y > Math.max(node.y0, node.y1) + half\n )\n return false;\n const xm = (node.x0 + node.x1) / 2;\n // cubic Bézier (x0, y0) (xm, y0) (xm, y1) (x1, y1)\n const at = (t: number): [number, number] => {\n const u = 1 - t;\n const b0 = u * u * u;\n const b1 = 3 * u * u * t;\n const b2 = 3 * u * t * t;\n const b3 = t * t * t;\n return [\n b0 * node.x0 + (b1 + b2) * xm + b3 * node.x1,\n (b0 + b1) * node.y0 + (b2 + b3) * node.y1,\n ];\n };\n let [px, py] = at(0);\n for (let k = 1; k <= LINK_SEGMENTS; k++) {\n const [qx, qy] = at(k / LINK_SEGMENTS);\n const dx = qx - px;\n const dy = qy - py;\n const len2 = dx * dx + dy * dy;\n const s = len2 > 0 ? clampUnit(((x - px) * dx + (y - py) * dy) / len2) : 0;\n if (Math.hypot(x - (px + s * dx), y - (py + s * dy)) <= half) return true;\n px = qx;\n py = qy;\n }\n return false;\n};\n\nconst clampUnit = (v: number) => (v < 0 ? 0 : v > 1 ? 1 : v);\n\n/** Radar: the vertex under the pointer, else the smallest polygon containing it */\nconst hitRadar = (\n scene: ShapeScene,\n x: number,\n y: number,\n): ShapeHover | null => {\n const radar = scene.radar;\n if (!radar || !radar.series.length) return null;\n let best: ShapeHover | null = null;\n let bestD = VERTEX_RADIUS;\n for (const s of radar.series) {\n for (let k = 0; k < s.points.length >> 1; k++) {\n const d = Math.hypot(x - s.points[k * 2], y - s.points[k * 2 + 1]);\n if (d <= bestD) {\n bestD = d;\n best = { index: s.index, indicator: k };\n }\n }\n }\n if (best) return best;\n let area = Infinity;\n let index = -1;\n for (const s of radar.series) {\n if (s.points.length < 6 || !pointInPolygon(x, y, s.points)) continue;\n const a = polygonArea(s.points);\n if (a < area) {\n area = a;\n index = s.index;\n }\n }\n if (index < 0) return null;\n // nearest indicator by angle\n const a = Math.atan2(y - radar.cy, x - radar.cx);\n let indicator = 0;\n let diff = Infinity;\n radar.angles.forEach((angle, k) => {\n const d = Math.abs(wrapFrom(a - angle + Math.PI, 0) - Math.PI);\n if (d < diff) {\n diff = d;\n indicator = k;\n }\n });\n return { index, indicator };\n};\n\n/**\n * Item under a point (CSS pixels). `current` is the hovered item: its\n * popped-out geometry also counts so a moved slice keeps the hover.\n */\nexport const hitTestShapes = (\n scene: ShapeScene,\n x: number,\n y: number,\n current: ShapeHover | null = null,\n): ShapeHover | null => {\n if (scene.empty) return null;\n if (scene.type === \"radar\") return hitRadar(scene, x, y);\n const enter = scene.enter;\n if (enter && enter.scale > 0 && enter.scale !== 1) {\n x = enter.cx + (x - enter.cx) / enter.scale;\n y = enter.cy + (y - enter.cy) / enter.scale;\n }\n const valid = new Set(scene.items.map((it) => it.index));\n for (let i = scene.nodes.length - 1; i >= 0; i--) {\n const node = scene.nodes[i];\n if (node.hit === undefined || !valid.has(node.hit)) continue;\n if (node.kind === \"text\" || node.kind === \"line\") continue;\n if (nodeContains(node, x, y)) return { index: node.hit };\n if (current?.index === node.hit && node.shift) {\n const [dx, dy] = node.shift;\n if (nodeContains(node, x - dx, y - dy)) return { index: node.hit };\n }\n }\n return null;\n};\n\n/** Where the tooltip of a keyboard-focused item goes */\nexport const hoverAnchor = (\n scene: ShapeScene,\n hover: ShapeHover,\n): { x: number; y: number } | null => {\n const item = scene.items.find((it) => it.index === hover.index);\n if (!item) return null;\n const ind =\n hover.indicator !== undefined ? item.indicators?.[hover.indicator] : null;\n return ind ? { x: ind.x, y: ind.y } : { x: item.x, y: item.y };\n};\n\n/**\n * Next focused item for the arrow keys: `next` / `prev` walk the items\n * (radar: the indicators of the series), `up` / `down` the radar series.\n */\nexport const stepHover = (\n scene: ShapeScene,\n current: ShapeHover | null,\n direction: \"next\" | \"prev\" | \"up\" | \"down\",\n): ShapeHover | null => {\n const items = scene.items;\n if (!items.length) return null;\n const pos = current\n ? items.findIndex((it) => it.index === current.index)\n : -1;\n const radar = scene.type === \"radar\";\n if (pos < 0) {\n const first =\n direction === \"prev\" || direction === \"up\" ? items.length - 1 : 0;\n return radar\n ? { index: items[first].index, indicator: 0 }\n : { index: items[first].index };\n }\n const forward = direction === \"next\" || direction === \"down\";\n if (scene.steps) {\n const step =\n direction === \"next\" || direction === \"prev\"\n ? scene.steps.next\n : scene.steps.down;\n const target = items[pos + (forward ? step : -step)];\n return { index: (target ?? items[pos]).index };\n }\n if (radar && (direction === \"next\" || direction === \"prev\")) {\n const count = items[pos].indicators?.length ?? 1;\n const k = current?.indicator ?? 0;\n return {\n index: items[pos].index,\n indicator: (k + (forward ? 1 : -1) + count) % count,\n };\n }\n const next = items[(pos + (forward ? 1 : -1) + items.length) % items.length];\n return radar\n ? { index: next.index, indicator: current?.indicator ?? 0 }\n : { index: next.index };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hit.js","names":["VERTEX_RADIUS","wrapFrom","d","a","from","TAU","pointInSector","dx","x","s","dy","y","span","half","off","padAngleAt","pointInPolygon","n","points","inside","i","j","xi","yi","xj","yj","polygonArea","nodeContains","node","sectorPad","pad","pointNearLink","ribbonOutline","LINK_SEGMENTS","left","right","xm","at","u","t","b0","b1","b2","b3","px","py","k","qx","qy","len2","clampUnit","v","pts","arc","r","steps","a1","a0","cx","radius","cy","quad","x0","y0","ribbonIsLoop","loopControl","p0","hitRadar","radar","scene","best","bestD","area","index","indicator","diff","angle","hitTestShapes","enter","valid","it","current","hoverAnchor","item","hover","ind","stepHover","items","pos","first","direction","forward","step","count","next"],"sources":["../../../../../charts/src/engine/shapes/hit.ts"],"sourcesContent":["// Hit testing of a ShapeScene and keyboard navigation between its items.\n\nimport { loopControl, padAngleAt, ribbonIsLoop, sectorPad } from \"./draw\";\nimport {\n TAU,\n type LinkNode,\n type RibbonNode,\n type ShapeHover,\n type ShapeNode,\n type ShapeScene,\n} from \"./scene\";\n\n/** Distance (px) under which a radar vertex is picked */\nconst VERTEX_RADIUS = 12;\n\n/** Angle `a` brought into [from, from + 2π) */\nconst wrapFrom = (a: number, from: number) => {\n let d = (a - from) % TAU;\n if (d < 0) d += TAU;\n return from + d;\n};\n\n/** Whether a point is in an annular sector (gaps included, corners approximated) */\nexport const pointInSector = (\n x: number,\n y: number,\n s: {\n cx: number;\n cy: number;\n r0: number;\n r1: number;\n a0: number;\n a1: number;\n pad?: number;\n },\n): boolean => {\n const dx = x - s.cx;\n const dy = y - s.cy;\n const d = Math.hypot(dx, dy);\n if (d > s.r1 || d < s.r0) return false;\n const span = s.a1 - s.a0;\n if (span >= TAU - 1e-6) return true;\n if (span <= 0) return false;\n const a = wrapFrom(Math.atan2(dy, dx), s.a0);\n const half = (s.pad ?? 0) / 2;\n const off = half > 0 ? padAngleAt(half, d) : 0;\n return a >= s.a0 + off && a <= s.a1 - off;\n};\n\n/** Even-odd test of a point in a polygon given as a flat x, y list */\nexport const pointInPolygon = (\n x: number,\n y: number,\n points: readonly number[],\n): boolean => {\n const n = points.length >> 1;\n let inside = false;\n for (let i = 0, j = n - 1; i < n; j = i++) {\n const xi = points[i * 2];\n const yi = points[i * 2 + 1];\n const xj = points[j * 2];\n const yj = points[j * 2 + 1];\n if (yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi)\n inside = !inside;\n }\n return inside;\n};\n\nconst polygonArea = (points: readonly number[]) => {\n const n = points.length >> 1;\n let a = 0;\n for (let i = 0, j = n - 1; i < n; j = i++)\n a += points[j * 2] * points[i * 2 + 1] - points[i * 2] * points[j * 2 + 1];\n return Math.abs(a) / 2;\n};\n\nconst nodeContains = (node: ShapeNode, x: number, y: number): boolean => {\n switch (node.kind) {\n case \"sector\":\n return pointInSector(x, y, { ...node, pad: sectorPad(node) });\n case \"polygon\":\n return (\n pointInPolygon(x, y, node.points) &&\n !(node.hole && pointInPolygon(x, y, node.hole))\n );\n case \"rect\": {\n const pad = node.hitPad ?? 0;\n return (\n x >= node.x - pad &&\n x <= node.x + node.width + pad &&\n y >= node.y - pad &&\n y <= node.y + node.height + pad\n );\n }\n case \"circle\":\n return Math.hypot(x - node.cx, y - node.cy) <= node.r;\n case \"arc\": {\n const d = Math.hypot(x - node.cx, y - node.cy);\n if (Math.abs(d - node.r) > node.width / 2 + (node.hitPad ?? 4))\n return false;\n if (node.a1 - node.a0 >= TAU - 1e-6) return true;\n const a = wrapFrom(Math.atan2(y - node.cy, x - node.cx), node.a0);\n return a <= node.a1;\n }\n case \"link\":\n return pointNearLink(x, y, node);\n case \"ribbon\":\n return (\n Math.hypot(x - node.cx, y - node.cy) <= node.r + 1 &&\n pointInPolygon(x, y, ribbonOutline(node))\n );\n default:\n return false;\n }\n};\n\n/** Segments of the polyline approximating a link's center curve */\nconst LINK_SEGMENTS = 24;\n\n/** Whether a point is within a sankey link (its thickness, plus 2 px) */\nexport const pointNearLink = (x: number, y: number, node: LinkNode) => {\n const half = Math.max(1, node.width) / 2 + 2;\n const left = Math.min(node.x0, node.x1);\n const right = Math.max(node.x0, node.x1);\n if (x < left - half || x > right + half) return false;\n if (\n y < Math.min(node.y0, node.y1) - half ||\n y > Math.max(node.y0, node.y1) + half\n )\n return false;\n const xm = (node.x0 + node.x1) / 2;\n // cubic Bézier (x0, y0) (xm, y0) (xm, y1) (x1, y1)\n const at = (t: number): [number, number] => {\n const u = 1 - t;\n const b0 = u * u * u;\n const b1 = 3 * u * u * t;\n const b2 = 3 * u * t * t;\n const b3 = t * t * t;\n return [\n b0 * node.x0 + (b1 + b2) * xm + b3 * node.x1,\n (b0 + b1) * node.y0 + (b2 + b3) * node.y1,\n ];\n };\n let [px, py] = at(0);\n for (let k = 1; k <= LINK_SEGMENTS; k++) {\n const [qx, qy] = at(k / LINK_SEGMENTS);\n const dx = qx - px;\n const dy = qy - py;\n const len2 = dx * dx + dy * dy;\n const s = len2 > 0 ? clampUnit(((x - px) * dx + (y - py) * dy) / len2) : 0;\n if (Math.hypot(x - (px + s * dx), y - (py + s * dy)) <= half) return true;\n px = qx;\n py = qy;\n }\n return false;\n};\n\nconst clampUnit = (v: number) => (v < 0 ? 0 : v > 1 ? 1 : v);\n\n/** Polygon (flat x, y list) approximating a chord ribbon, as drawn */\nexport const ribbonOutline = (node: RibbonNode): number[] => {\n const { cx, cy, r } = node;\n const pts: number[] = [];\n const arc = (a0: number, a1: number, radius = r) => {\n const steps = Math.max(1, Math.ceil((a1 - a0) / 0.06));\n for (let k = 0; k <= steps; k++) {\n const a = a0 + ((a1 - a0) * k) / steps;\n pts.push(cx + radius * Math.cos(a), cy + radius * Math.sin(a));\n }\n };\n // quadratic from the last point to (x, y), control (qx, qy)\n const quad = (qx: number, qy: number, x: number, y: number) => {\n const x0 = pts[pts.length - 2];\n const y0 = pts[pts.length - 1];\n for (let k = 1; k <= 16; k++) {\n const t = k / 16;\n const u = 1 - t;\n pts.push(\n u * u * x0 + 2 * u * t * qx + t * t * x,\n u * u * y0 + 2 * u * t * qy + t * t * y,\n );\n }\n };\n const at = (a: number, radius = r): [number, number] => [\n cx + radius * Math.cos(a),\n cy + radius * Math.sin(a),\n ];\n arc(node.s0, Math.max(node.s0, node.s1));\n const s = at(node.s0);\n if (ribbonIsLoop(node)) {\n const [qx, qy] = loopControl(node);\n quad(qx, qy, s[0], s[1]);\n return pts;\n }\n if (node.head > 0) {\n const p0 = at(node.t0, r - node.head);\n quad(cx, cy, p0[0], p0[1]);\n pts.push(...at((node.t0 + node.t1) / 2), ...at(node.t1, r - node.head));\n } else {\n const t = at(node.t0);\n quad(cx, cy, t[0], t[1]);\n arc(node.t0, Math.max(node.t0, node.t1));\n }\n quad(cx, cy, s[0], s[1]);\n return pts;\n};\n\n/** Radar: the vertex under the pointer, else the smallest polygon containing it */\nconst hitRadar = (\n scene: ShapeScene,\n x: number,\n y: number,\n): ShapeHover | null => {\n const radar = scene.radar;\n if (!radar || !radar.series.length) return null;\n let best: ShapeHover | null = null;\n let bestD = VERTEX_RADIUS;\n for (const s of radar.series) {\n for (let k = 0; k < s.points.length >> 1; k++) {\n const d = Math.hypot(x - s.points[k * 2], y - s.points[k * 2 + 1]);\n if (d <= bestD) {\n bestD = d;\n best = { index: s.index, indicator: k };\n }\n }\n }\n if (best) return best;\n let area = Infinity;\n let index = -1;\n for (const s of radar.series) {\n if (s.points.length < 6 || !pointInPolygon(x, y, s.points)) continue;\n const a = polygonArea(s.points);\n if (a < area) {\n area = a;\n index = s.index;\n }\n }\n if (index < 0) return null;\n // nearest indicator by angle\n const a = Math.atan2(y - radar.cy, x - radar.cx);\n let indicator = 0;\n let diff = Infinity;\n radar.angles.forEach((angle, k) => {\n const d = Math.abs(wrapFrom(a - angle + Math.PI, 0) - Math.PI);\n if (d < diff) {\n diff = d;\n indicator = k;\n }\n });\n return { index, indicator };\n};\n\n/**\n * Item under a point (CSS pixels). `current` is the hovered item: its\n * popped-out geometry also counts so a moved slice keeps the hover.\n */\nexport const hitTestShapes = (\n scene: ShapeScene,\n x: number,\n y: number,\n current: ShapeHover | null = null,\n): ShapeHover | null => {\n if (scene.empty) return null;\n if (scene.type === \"radar\") return hitRadar(scene, x, y);\n const enter = scene.enter;\n if (enter && enter.scale > 0 && enter.scale !== 1) {\n x = enter.cx + (x - enter.cx) / enter.scale;\n y = enter.cy + (y - enter.cy) / enter.scale;\n }\n const valid = new Set(scene.items.map((it) => it.index));\n for (let i = scene.nodes.length - 1; i >= 0; i--) {\n const node = scene.nodes[i];\n if (node.hit === undefined || !valid.has(node.hit)) continue;\n if (node.kind === \"text\" || node.kind === \"line\") continue;\n if (nodeContains(node, x, y)) return { index: node.hit };\n if (current?.index === node.hit && node.shift) {\n const [dx, dy] = node.shift;\n if (nodeContains(node, x - dx, y - dy)) return { index: node.hit };\n }\n }\n return null;\n};\n\n/** Where the tooltip of a keyboard-focused item goes */\nexport const hoverAnchor = (\n scene: ShapeScene,\n hover: ShapeHover,\n): { x: number; y: number } | null => {\n const item = scene.items.find((it) => it.index === hover.index);\n if (!item) return null;\n const ind =\n hover.indicator !== undefined ? item.indicators?.[hover.indicator] : null;\n return ind ? { x: ind.x, y: ind.y } : { x: item.x, y: item.y };\n};\n\n/**\n * Next focused item for the arrow keys: `next` / `prev` walk the items\n * (radar: the indicators of the series), `up` / `down` the radar series.\n */\nexport const stepHover = (\n scene: ShapeScene,\n current: ShapeHover | null,\n direction: \"next\" | \"prev\" | \"up\" | \"down\",\n): ShapeHover | null => {\n const items = scene.items;\n if (!items.length) return null;\n const pos = current\n ? items.findIndex((it) => it.index === current.index)\n : -1;\n const radar = scene.type === \"radar\";\n if (pos < 0) {\n const first =\n direction === \"prev\" || direction === \"up\" ? items.length - 1 : 0;\n return radar\n ? { index: items[first].index, indicator: 0 }\n : { index: items[first].index };\n }\n const forward = direction === \"next\" || direction === \"down\";\n if (scene.steps) {\n const step =\n direction === \"next\" || direction === \"prev\"\n ? scene.steps.next\n : scene.steps.down;\n const target = items[pos + (forward ? step : -step)];\n return { index: (target ?? items[pos]).index };\n }\n if (radar && (direction === \"next\" || direction === \"prev\")) {\n const count = items[pos].indicators?.length ?? 1;\n const k = current?.indicator ?? 0;\n return {\n index: items[pos].index,\n indicator: (k + (forward ? 1 : -1) + count) % count,\n };\n }\n const next = items[(pos + (forward ? 1 : -1) + items.length) % items.length];\n return radar\n ? { index: next.index, indicator: current?.indicator ?? 0 }\n : { index: next.index };\n};\n"],"mappings":";;;AAaA,IAAMA,IAAgB,IAGhBC,KAAY,GAAW,MAAiB;CAC5C,IAAIC,KAAKC,IAAIC,KAAQC;CAErB,OADIH,IAAI,MAAG,KAAKG,IACTD,IAAOF;AAChB,GAGaI,KACX,GACA,GACA,MASY;CACZ,IAAMC,IAAKC,IAAIC,EAAE,IACXC,IAAKC,IAAIF,EAAE,IACXP,IAAI,KAAK,MAAMK,GAAIG,CAAE;CAC3B,IAAIR,IAAIO,EAAE,MAAMP,IAAIO,EAAE,IAAI,OAAO;CACjC,IAAMG,IAAOH,EAAE,KAAKA,EAAE;CACtB,IAAIG,KAAQP,IAAM,MAAM,OAAO;CAC/B,IAAIO,KAAQ,GAAG,OAAO;CACtB,IAAMT,IAAIF,EAAS,KAAK,MAAMS,GAAIH,CAAE,GAAGE,EAAE,EAAE,GACrCI,KAAQJ,EAAE,OAAO,KAAK,GACtBK,IAAMD,IAAO,IAAIE,EAAWF,GAAMX,CAAC,IAAI;CAC7C,OAAOC,KAAKM,EAAE,KAAKK,KAAOX,KAAKM,EAAE,KAAKK;AACxC,GAGaE,KACX,GACA,GACA,MACY;CACZ,IAAMC,IAAIC,EAAO,UAAU,GACvBC,IAAS;CACb,KAAK,IAAIC,IAAI,GAAGC,IAAIJ,IAAI,GAAGG,IAAIH,GAAG,IAAI,KAAK;EACzC,IAAMK,IAAKJ,EAAOE,IAAI,IAChBG,IAAKL,EAAOE,IAAI,IAAI,IACpBI,IAAKN,EAAOG,IAAI,IAChBI,IAAKP,EAAOG,IAAI,IAAI;EAC1B,AAAIE,IAAKZ,KAAMc,IAAKd,KAAKH,KAAMgB,IAAKF,MAAOX,IAAIY,MAAQE,IAAKF,KAAMD,MAChE,IAAS,CAACH;CACd;CACA,OAAOA;AACT,GAEMO,KAAe,MAA8B;CACjD,IAAMT,IAAIC,EAAO,UAAU,GACvBf,IAAI;CACR,KAAK,IAAIiB,IAAI,GAAGC,IAAIJ,IAAI,GAAGG,IAAIH,GAAG,IAAI,KACpC,KAAKC,EAAOG,IAAI,KAAKH,EAAOE,IAAI,IAAI,KAAKF,EAAOE,IAAI,KAAKF,EAAOG,IAAI,IAAI;CAC1E,OAAO,KAAK,IAAIlB,CAAC,IAAI;AACvB,GAEMwB,KAAgB,GAAiB,GAAW,MAAuB;CACvE,QAAQC,EAAK,MAAb;EACE,KAAK,UACH,OAAOtB,EAAcE,GAAGG,GAAG;GAAE,GAAGiB;GAAM,KAAKC,EAAUD,CAAI;EAAE,CAAC;EAC9D,KAAK,WACH,OACEZ,EAAeR,GAAGG,GAAGiB,EAAK,MAAM,KAChC,EAAEA,EAAK,QAAQZ,EAAeR,GAAGG,GAAGiB,EAAK,IAAI;EAEjD,KAAK,QAAQ;GACX,IAAME,IAAMF,EAAK,UAAU;GAC3B,OACEpB,KAAKoB,EAAK,IAAIE,KACdtB,KAAKoB,EAAK,IAAIA,EAAK,QAAQE,KAC3BnB,KAAKiB,EAAK,IAAIE,KACdnB,KAAKiB,EAAK,IAAIA,EAAK,SAASE;EAEhC;EACA,KAAK,UACH,OAAO,KAAK,MAAMtB,IAAIoB,EAAK,IAAIjB,IAAIiB,EAAK,EAAE,KAAKA,EAAK;EACtD,KAAK,OAAO;GACV,IAAM1B,IAAI,KAAK,MAAMM,IAAIoB,EAAK,IAAIjB,IAAIiB,EAAK,EAAE;GAK7C,OAJI,KAAK,IAAI1B,IAAI0B,EAAK,CAAC,IAAIA,EAAK,QAAQ,KAAKA,EAAK,UAAU,KACnD,KACLA,EAAK,KAAKA,EAAK,MAAMvB,IAAM,QACrBJ,EAAS,KAAK,MAAMU,IAAIiB,EAAK,IAAIpB,IAAIoB,EAAK,EAAE,GAAGA,EAAK,EACvD,KAAKA,EAAK;EACnB;EACA,KAAK,QACH,OAAOG,EAAcvB,GAAGG,GAAGiB,CAAI;EACjC,KAAK,UACH,OACE,KAAK,MAAMpB,IAAIoB,EAAK,IAAIjB,IAAIiB,EAAK,EAAE,KAAKA,EAAK,IAAI,KACjDZ,EAAeR,GAAGG,GAAGqB,EAAcJ,CAAI,CAAC;EAE5C,SACE,OAAO;CACX;AACF,GAGMK,IAAgB,IAGTF,KAAiB,GAAW,GAAW,MAAmB;CACrE,IAAMlB,IAAO,KAAK,IAAI,GAAGe,EAAK,KAAK,IAAI,IAAI,GACrCM,IAAO,KAAK,IAAIN,EAAK,IAAIA,EAAK,EAAE,GAChCO,IAAQ,KAAK,IAAIP,EAAK,IAAIA,EAAK,EAAE;CAEvC,IADIpB,IAAI0B,IAAOrB,KAAQL,IAAI2B,IAAQtB,KAEjCF,IAAI,KAAK,IAAIiB,EAAK,IAAIA,EAAK,EAAE,IAAIf,KACjCF,IAAI,KAAK,IAAIiB,EAAK,IAAIA,EAAK,EAAE,IAAIf,GAEjC,OAAO;CACT,IAAMuB,KAAMR,EAAK,KAAKA,EAAK,MAAM,GAE3BS,KAAM,MAAgC;EAC1C,IAAMC,IAAI,IAAIC,GACRC,IAAKF,IAAIA,IAAIA,GACbG,IAAK,IAAIH,IAAIA,IAAIC,GACjBG,IAAK,IAAIJ,IAAIC,IAAIA,GACjBI,IAAKJ,IAAIA,IAAIA;EACnB,OAAO,CACLC,IAAKZ,EAAK,MAAMa,IAAKC,KAAMN,IAAKO,IAAKf,EAAK,KACzCY,IAAKC,KAAMb,EAAK,MAAMc,IAAKC,KAAMf,EAAK,EACzC;CACF,GACI,CAACgB,GAAIC,KAAMR,EAAG,CAAC;CACnB,KAAK,IAAIS,IAAI,GAAGA,KAAKb,GAAe,KAAK;EACvC,IAAM,CAACc,GAAIC,KAAMX,EAAGS,IAAIb,CAAa,GAC/B1B,IAAKwC,IAAKH,GACVlC,IAAKsC,IAAKH,GACVI,IAAO1C,IAAKA,IAAKG,IAAKA,GACtBD,IAAIwC,IAAO,IAAIC,IAAY1C,IAAIoC,KAAMrC,KAAMI,IAAIkC,KAAMnC,KAAMuC,CAAI,IAAI;EACzE,IAAI,KAAK,MAAMzC,KAAKoC,IAAKnC,IAAIF,IAAKI,KAAKkC,IAAKpC,IAAIC,EAAG,KAAKG,GAAM,OAAO;EAErE,AADA,IAAKkC,GACL,IAAKC;CACP;CACA,OAAO;AACT,GAEME,KAAa,MAAeC,IAAI,IAAI,IAAIA,IAAI,IAAI,IAAIA,GAG7CnB,KAAiB,MAA+B;CAC3D,IAAM,EAAE,OAAI,OAAI,SAAMJ,GAChBwB,IAAgB,CAAC,GACjBC,KAAO,GAAY,GAAY,IAASC,MAAM;EAClD,IAAMC,IAAQ,KAAK,IAAI,GAAG,KAAK,MAAMC,IAAKC,KAAM,GAAI,CAAC;EACrD,KAAK,IAAIX,IAAI,GAAGA,KAAKS,GAAO,KAAK;GAC/B,IAAMpD,IAAIsD,KAAOD,IAAKC,KAAMX,IAAKS;GACjC,EAAI,KAAKG,IAAKC,IAAS,KAAK,IAAIxD,CAAC,GAAGyD,IAAKD,IAAS,KAAK,IAAIxD,CAAC,CAAC;EAC/D;CACF,GAEM0D,KAAQ,GAAY,GAAY,GAAW,MAAc;EAC7D,IAAMC,IAAKV,EAAIA,EAAI,SAAS,IACtBW,IAAKX,EAAIA,EAAI,SAAS;EAC5B,KAAK,IAAIN,IAAI,GAAGA,KAAK,IAAI,KAAK;GAC5B,IAAMP,IAAIO,IAAI,IACRR,IAAI,IAAIC;GACd,EAAI,KACFD,IAAIA,IAAIwB,IAAK,IAAIxB,IAAIC,IAAIQ,IAAKR,IAAIA,IAAI/B,GACtC8B,IAAIA,IAAIyB,IAAK,IAAIzB,IAAIC,IAAIS,IAAKT,IAAIA,IAAI5B,CACxC;EACF;CACF,GACM0B,KAAM,GAAW,IAASiB,MAAwB,CACtDI,IAAKC,IAAS,KAAK,IAAIxD,CAAC,GACxByD,IAAKD,IAAS,KAAK,IAAIxD,CAAC,CAC1B;CACA,EAAIyB,EAAK,IAAI,KAAK,IAAIA,EAAK,IAAIA,EAAK,EAAE,CAAC;CACvC,IAAMnB,IAAI4B,EAAGT,EAAK,EAAE;CACpB,IAAIoC,EAAapC,CAAI,GAAG;EACtB,IAAM,CAACmB,GAAIC,KAAMiB,EAAYrC,CAAI;EAEjC,OADAiC,EAAKd,GAAIC,GAAIvC,EAAE,IAAIA,EAAE,EAAE,GAChB2C;CACT;CACA,IAAIxB,EAAK,OAAO,GAAG;EACjB,IAAMsC,IAAK7B,EAAGT,EAAK,IAAI0B,IAAI1B,EAAK,IAAI;EAEpC,AADAiC,EAAKH,GAAIE,GAAIM,EAAG,IAAIA,EAAG,EAAE,GACzBd,EAAI,KAAK,GAAGf,GAAIT,EAAK,KAAKA,EAAK,MAAM,CAAC,GAAG,GAAGS,EAAGT,EAAK,IAAI0B,IAAI1B,EAAK,IAAI,CAAC;CACxE,OAAO;EACL,IAAM,IAAIS,EAAGT,EAAK,EAAE;EAEpB,AADAiC,EAAKH,GAAIE,GAAI,EAAE,IAAI,EAAE,EAAE,GACvBP,EAAIzB,EAAK,IAAI,KAAK,IAAIA,EAAK,IAAIA,EAAK,EAAE,CAAC;CACzC;CAEA,OADAiC,EAAKH,GAAIE,GAAInD,EAAE,IAAIA,EAAE,EAAE,GAChB2C;AACT,GAGMe,KACJ,GACA,GACA,MACsB;CACtB,IAAMC,IAAQC,EAAM;CACpB,IAAI,CAACD,KAAS,CAACA,EAAM,OAAO,QAAQ,OAAO;CAC3C,IAAIE,IAA0B,MAC1BC,IAAQvE;CACZ,KAAK,IAAMS,KAAK2D,EAAM,QACpB,KAAK,IAAItB,IAAI,GAAGA,IAAIrC,EAAE,OAAO,UAAU,GAAG,KAAK;EAC7C,IAAMP,IAAI,KAAK,MAAMM,IAAIC,EAAE,OAAOqC,IAAI,IAAInC,IAAIF,EAAE,OAAOqC,IAAI,IAAI,EAAE;EACjE,AAAI5C,KAAKqE,MACP,IAAQrE,GACR,IAAO;GAAE,OAAOO,EAAE;GAAO,WAAWqC;EAAE;CAE1C;CAEF,IAAIwB,GAAM,OAAOA;CACjB,IAAIE,IAAO,UACPC,IAAQ;CACZ,KAAK,IAAMhE,KAAK2D,EAAM,QAAQ;EAC5B,IAAI3D,EAAE,OAAO,SAAS,KAAK,CAACO,EAAeR,GAAGG,GAAGF,EAAE,MAAM,GAAG;EAC5D,IAAMN,IAAIuB,EAAYjB,EAAE,MAAM;EAC9B,AAAIN,IAAIqE,MACN,IAAOrE,GACP,IAAQM,EAAE;CAEd;CACA,IAAIgE,IAAQ,GAAG,OAAO;CAEtB,IAAMtE,IAAI,KAAK,MAAMQ,IAAIyD,EAAM,IAAI5D,IAAI4D,EAAM,EAAE,GAC3CM,IAAY,GACZC,IAAO;CAQX,OAPAP,EAAM,OAAO,SAAS,GAAO,MAAM;EACjC,IAAMlE,IAAI,KAAK,IAAID,EAASE,IAAIyE,IAAQ,KAAK,IAAI,CAAC,IAAI,KAAK,EAAE;EAC7D,AAAI1E,IAAIyE,MACN,IAAOzE,GACP,IAAY4C;CAEhB,CAAC,GACM;EAAE;EAAO;CAAU;AAC5B,GAMa+B,KACX,GACA,GACA,GACA,IAA6B,SACP;CACtB,IAAIR,EAAM,OAAO,OAAO;CACxB,IAAIA,EAAM,SAAS,SAAS,OAAOF,EAASE,GAAO7D,GAAGG,CAAC;CACvD,IAAMmE,IAAQT,EAAM;CACpB,AAAIS,KAASA,EAAM,QAAQ,KAAKA,EAAM,UAAU,MAC9C,IAAIA,EAAM,MAAMtE,IAAIsE,EAAM,MAAMA,EAAM,OACtC,IAAIA,EAAM,MAAMnE,IAAImE,EAAM,MAAMA,EAAM;CAExC,IAAMC,IAAQ,IAAI,IAAIV,EAAM,MAAM,KAAK,MAAOW,EAAG,KAAK,CAAC;CACvD,KAAK,IAAI,IAAIX,EAAM,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;EAChD,IAAMzC,IAAOyC,EAAM,MAAM;EACzB,IAAIzC,EAAK,QAAQ,KAAA,KAAcmD,EAAM,IAAInD,EAAK,GAAG,KAC7CA,EAAK,SAAS,UAAUA,EAAK,SAAS,QAC1C;OAAID,EAAaC,GAAMpB,GAAGG,CAAC,GAAG,OAAO,EAAE,OAAOiB,EAAK,IAAI;GACvD,IAAIqD,GAAS,UAAUrD,EAAK,OAAOA,EAAK,OAAO;IAC7C,IAAM,CAACrB,GAAIG,KAAMkB,EAAK;IACtB,IAAID,EAAaC,GAAMpB,IAAID,GAAII,IAAID,CAAE,GAAG,OAAO,EAAE,OAAOkB,EAAK,IAAI;GACnE;EAJuD;CAKzD;CACA,OAAO;AACT,GAGasD,KACX,GACA,MACoC;CACpC,IAAMC,IAAOd,EAAM,MAAM,MAAM,MAAOW,EAAG,UAAUI,EAAM,KAAK;CAC9D,IAAI,CAACD,GAAM,OAAO;CAClB,IAAME,IACJD,EAAM,cAAc,KAAA,IAAiD,OAArCD,EAAK,aAAaC,EAAM;CAC1D,OAAOC,IAAM;EAAE,GAAGA,EAAI;EAAG,GAAGA,EAAI;CAAE,IAAI;EAAE,GAAGF,EAAK;EAAG,GAAGA,EAAK;CAAE;AAC/D,GAMaG,KACX,GACA,GACA,MACsB;CACtB,IAAMC,IAAQlB,EAAM;CACpB,IAAI,CAACkB,EAAM,QAAQ,OAAO;CAC1B,IAAMC,IAAMP,IACRM,EAAM,WAAW,MAAOP,EAAG,UAAUC,EAAQ,KAAK,IAClD,IACEb,IAAQC,EAAM,SAAS;CAC7B,IAAImB,IAAM,GAAG;EACX,IAAMC,IACJC,MAAc,UAAUA,MAAc,OAAOH,EAAM,SAAS,IAAI;EAClE,OAAOnB,IACH;GAAE,OAAOmB,EAAME,EAAM,CAAC;GAAO,WAAW;EAAE,IAC1C,EAAE,OAAOF,EAAME,EAAM,CAAC,MAAM;CAClC;CACA,IAAME,IAAUD,MAAc,UAAUA,MAAc;CACtD,IAAIrB,EAAM,OAAO;EACf,IAAMuB,IACJF,MAAc,UAAUA,MAAc,SAClCrB,EAAM,MAAM,OACZA,EAAM,MAAM;EAElB,OAAO,EAAE,QADMkB,EAAMC,KAAOG,IAAUC,IAAO,CAACA,OACnBL,EAAMC,GAAA,CAAM,MAAM;CAC/C;CACA,IAAIpB,MAAUsB,MAAc,UAAUA,MAAc,SAAS;EAC3D,IAAMG,IAAQN,EAAMC,EAAI,CAAC,YAAY,UAAU,GACzC1C,IAAImC,GAAS,aAAa;EAChC,OAAO;GACL,OAAOM,EAAMC,EAAI,CAAC;GAClB,YAAY1C,KAAK6C,IAAU,IAAI,MAAME,KAASA;EAChD;CACF;CACA,IAAMC,IAAOP,GAAOC,KAAOG,IAAU,IAAI,MAAMJ,EAAM,UAAUA,EAAM;CACrE,OAAOnB,IACH;EAAE,OAAO0B,EAAK;EAAO,WAAWb,GAAS,aAAa;CAAE,IACxD,EAAE,OAAOa,EAAK,MAAM;AAC1B"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
export { createShapeChart } from './chart.cjs';
|
|
2
2
|
export { createCanvasShapeChart, type CanvasShapeChartConfig, type CanvasShapeChartInstance, } from './canvas.cjs';
|
|
3
3
|
export { drawShapeLegend, drawShapeScene, drawShapeTooltip } from './draw.cjs';
|
|
4
|
-
export { hitTestShapes, hoverAnchor, pointInPolygon, pointInSector, stepHover, } from './hit.cjs';
|
|
4
|
+
export { hitTestShapes, hoverAnchor, pointInPolygon, pointInSector, ribbonOutline, stepHover, } from './hit.cjs';
|
|
5
5
|
export { describeChart, describeScene, hoverEvent, layoutShapeLegend, layoutShapeScene, layoutShapeTooltip, placeShapeTooltip, shapeLegend, shapeValues, tooltipContent, type ShapeLayoutInput, type ShapeLegendBox, type ShapeTooltipBox, type ShapeTooltipContent, } from './layout.cjs';
|
|
6
6
|
export { gaugeBandIndex } from './gauge.cjs';
|
|
7
7
|
export { squarify, treemapLeaves } from './treemap.cjs';
|
|
8
8
|
export { resolveSankey, sankeyColumns } from './sankey.cjs';
|
|
9
9
|
export { calendarDay, calendarIso, localeWeekStart } from './calendar.cjs';
|
|
10
10
|
export { bulletScale } from './bullet.cjs';
|
|
11
|
+
export { resolveChord, type ChordModel } from './chord.cjs';
|
|
11
12
|
export type { MeasureText, ShapeHover, ShapeItem, ShapeLegendEntry, ShapeNode, ShapeRect, ShapeScene, ShapeTooltipRow, } from './scene.cjs';
|
|
12
|
-
export type { BulletChartOptions, BulletDatum, CalendarDate, CalendarDatum, CalendarHeatmapOptions, FunnelChartOptions, GaugeBand, GaugeChartOptions, PieChartOptions, RadarChartOptions, RadarIndicator, RadarSeries, RadialBarChartOptions, RadialBarDatum, SankeyChartOptions, SankeyLink, SankeyNode, ShapeChartCommonOptions, ShapeChartEventMap, ShapeChartInstance, ShapeChartLabels, ShapeChartOptions, ShapeChartType, ShapeDatum, ShapeDrillEvent, ShapeHoverEvent, ShapeLegendOptions, ShapeToggleEvent, ShapeTooltipOptions, SunburstChartOptions, TreemapChartOptions, TreemapNode, } from './types.cjs';
|
|
13
|
+
export type { BulletChartOptions, BulletDatum, CalendarDate, CalendarDatum, CalendarHeatmapOptions, ChordChartOptions, ChordGroup, ChordLink, FunnelChartOptions, GaugeBand, GaugeChartOptions, PieChartOptions, RadarChartOptions, RadarIndicator, RadarSeries, RadialBarChartOptions, RadialBarDatum, SankeyChartOptions, SankeyLink, SankeyNode, ShapeChartCommonOptions, ShapeChartEventMap, ShapeChartInstance, ShapeChartLabels, ShapeChartOptions, ShapeChartType, ShapeDatum, ShapeDrillEvent, ShapeHoverEvent, ShapeLegendOptions, ShapeToggleEvent, ShapeTooltipOptions, SunburstChartOptions, TreemapChartOptions, TreemapNode, } from './types.cjs';
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
export { createShapeChart } from './chart.js';
|
|
2
2
|
export { createCanvasShapeChart, type CanvasShapeChartConfig, type CanvasShapeChartInstance, } from './canvas.js';
|
|
3
3
|
export { drawShapeLegend, drawShapeScene, drawShapeTooltip } from './draw.js';
|
|
4
|
-
export { hitTestShapes, hoverAnchor, pointInPolygon, pointInSector, stepHover, } from './hit.js';
|
|
4
|
+
export { hitTestShapes, hoverAnchor, pointInPolygon, pointInSector, ribbonOutline, stepHover, } from './hit.js';
|
|
5
5
|
export { describeChart, describeScene, hoverEvent, layoutShapeLegend, layoutShapeScene, layoutShapeTooltip, placeShapeTooltip, shapeLegend, shapeValues, tooltipContent, type ShapeLayoutInput, type ShapeLegendBox, type ShapeTooltipBox, type ShapeTooltipContent, } from './layout.js';
|
|
6
6
|
export { gaugeBandIndex } from './gauge.js';
|
|
7
7
|
export { squarify, treemapLeaves } from './treemap.js';
|
|
8
8
|
export { resolveSankey, sankeyColumns } from './sankey.js';
|
|
9
9
|
export { calendarDay, calendarIso, localeWeekStart } from './calendar.js';
|
|
10
10
|
export { bulletScale } from './bullet.js';
|
|
11
|
+
export { resolveChord, type ChordModel } from './chord.js';
|
|
11
12
|
export type { MeasureText, ShapeHover, ShapeItem, ShapeLegendEntry, ShapeNode, ShapeRect, ShapeScene, ShapeTooltipRow, } from './scene.js';
|
|
12
|
-
export type { BulletChartOptions, BulletDatum, CalendarDate, CalendarDatum, CalendarHeatmapOptions, FunnelChartOptions, GaugeBand, GaugeChartOptions, PieChartOptions, RadarChartOptions, RadarIndicator, RadarSeries, RadialBarChartOptions, RadialBarDatum, SankeyChartOptions, SankeyLink, SankeyNode, ShapeChartCommonOptions, ShapeChartEventMap, ShapeChartInstance, ShapeChartLabels, ShapeChartOptions, ShapeChartType, ShapeDatum, ShapeDrillEvent, ShapeHoverEvent, ShapeLegendOptions, ShapeToggleEvent, ShapeTooltipOptions, SunburstChartOptions, TreemapChartOptions, TreemapNode, } from './types.js';
|
|
13
|
+
export type { BulletChartOptions, BulletDatum, CalendarDate, CalendarDatum, CalendarHeatmapOptions, ChordChartOptions, ChordGroup, ChordLink, FunnelChartOptions, GaugeBand, GaugeChartOptions, PieChartOptions, RadarChartOptions, RadarIndicator, RadarSeries, RadialBarChartOptions, RadialBarDatum, SankeyChartOptions, SankeyLink, SankeyNode, ShapeChartCommonOptions, ShapeChartEventMap, ShapeChartInstance, ShapeChartLabels, ShapeChartOptions, ShapeChartType, ShapeDatum, ShapeDrillEvent, ShapeHoverEvent, ShapeLegendOptions, ShapeToggleEvent, ShapeTooltipOptions, SunburstChartOptions, TreemapChartOptions, TreemapNode, } from './types.js';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../locale.cjs");var t={en:{noData:`No data`,value:`Value`,share:`Share`,ofFirstStage:`Of first stage`,conversion:`Conversion`,ofRange:`Of range`,ofName:`Of {name}`,incoming:`Incoming`,outgoing:`Outgoing`,max:`Max`,progress:`Progress`,target:`Target`,ofTarget:`Of target`,range:`Range`,series:`Series {index}`,pieChart:`Pie chart`,donutChart:`Donut chart`,roseChart:`Rose chart`,radarChart:`Radar chart`,gaugeChart:`Gauge`,gaugeChartNamed:`Gauge: {label}`,funnelChart:`Funnel chart`,treemapChart:`Treemap`,sankeyChart:`Sankey diagram`,sunburstChart:`Sunburst chart`,radialBarChart:`Radial bar chart`,calendarHeatmap:`Calendar heatmap`,bulletChart:`Bullet chart`},zh:{noData:`暂无数据`,value:`数值`,share:`占比`,ofFirstStage:`占首阶段`,conversion:`转化率`,ofRange:`占量程`,ofName:`占{name}`,incoming:`流入`,outgoing:`流出`,max:`最大值`,progress:`进度`,target:`目标`,ofTarget:`目标达成`,range:`区间`,series:`系列 {index}`,pieChart:`饼图`,donutChart:`环形图`,roseChart:`玫瑰图`,radarChart:`雷达图`,gaugeChart:`仪表盘`,gaugeChartNamed:`仪表盘:{label}`,funnelChart:`漏斗图`,treemapChart:`矩形树图`,sankeyChart:`桑基图`,sunburstChart:`旭日图`,radialBarChart:`径向条形图`,calendarHeatmap:`日历热力图`,bulletChart
|
|
1
|
+
const e=require("../locale.cjs");var t={en:{noData:`No data`,value:`Value`,share:`Share`,ofFirstStage:`Of first stage`,conversion:`Conversion`,ofRange:`Of range`,ofName:`Of {name}`,incoming:`Incoming`,outgoing:`Outgoing`,max:`Max`,progress:`Progress`,target:`Target`,ofTarget:`Of target`,range:`Range`,reverse:`Reverse`,series:`Series {index}`,pieChart:`Pie chart`,donutChart:`Donut chart`,roseChart:`Rose chart`,radarChart:`Radar chart`,gaugeChart:`Gauge`,gaugeChartNamed:`Gauge: {label}`,funnelChart:`Funnel chart`,treemapChart:`Treemap`,sankeyChart:`Sankey diagram`,sunburstChart:`Sunburst chart`,radialBarChart:`Radial bar chart`,calendarHeatmap:`Calendar heatmap`,bulletChart:`Bullet chart`,chordChart:`Chord diagram`},zh:{noData:`暂无数据`,value:`数值`,share:`占比`,ofFirstStage:`占首阶段`,conversion:`转化率`,ofRange:`占量程`,ofName:`占{name}`,incoming:`流入`,outgoing:`流出`,max:`最大值`,progress:`进度`,target:`目标`,ofTarget:`目标达成`,range:`区间`,reverse:`反向`,series:`系列 {index}`,pieChart:`饼图`,donutChart:`环形图`,roseChart:`玫瑰图`,radarChart:`雷达图`,gaugeChart:`仪表盘`,gaugeChartNamed:`仪表盘:{label}`,funnelChart:`漏斗图`,treemapChart:`矩形树图`,sankeyChart:`桑基图`,sunburstChart:`旭日图`,radialBarChart:`径向条形图`,calendarHeatmap:`日历热力图`,bulletChart:`子弹图`,chordChart:`弦图`},ja:{noData:`データなし`,value:`値`,share:`割合`,ofFirstStage:`初段階比`,conversion:`転換率`,ofRange:`範囲比`,ofName:`{name}比`,incoming:`流入`,outgoing:`流出`,max:`最大`,progress:`進捗`,target:`目標`,ofTarget:`目標達成率`,range:`範囲`,reverse:`逆方向`,series:`系列 {index}`,pieChart:`円グラフ`,donutChart:`ドーナツグラフ`,roseChart:`鶏頭図`,radarChart:`レーダーチャート`,gaugeChart:`ゲージ`,gaugeChartNamed:`ゲージ:{label}`,funnelChart:`ファネルチャート`,treemapChart:`ツリーマップ`,sankeyChart:`サンキー図`,sunburstChart:`サンバースト図`,radialBarChart:`円形棒グラフ`,calendarHeatmap:`カレンダーヒートマップ`,bulletChart:`ブレットグラフ`,chordChart:`コードダイアグラム`},fr:{noData:`Aucune donnée`,value:`Valeur`,share:`Part`,ofFirstStage:`Part de la 1re étape`,conversion:`Conversion`,ofRange:`Part de la plage`,ofName:`Part de {name}`,incoming:`Entrées`,outgoing:`Sorties`,max:`Max`,progress:`Progression`,target:`Objectif`,ofTarget:`Atteinte de l’objectif`,range:`Plage`,reverse:`Sens inverse`,series:`Série {index}`,pieChart:`Graphique circulaire`,donutChart:`Graphique en anneau`,roseChart:`Diagramme de Nightingale`,radarChart:`Graphique radar`,gaugeChart:`Jauge`,gaugeChartNamed:`Jauge : {label}`,funnelChart:`Graphique en entonnoir`,treemapChart:`Treemap`,sankeyChart:`Diagramme de Sankey`,sunburstChart:`Diagramme en rayons de soleil`,radialBarChart:`Graphique à barres radiales`,calendarHeatmap:`Calendrier thermique`,bulletChart:`Graphique à puces`,chordChart:`Diagramme d’accords`}},n=n=>e.localeLabels(t,n.locale,n.texts),r=(e,t)=>e.replace(/\{(\w+)\}/g,(e,n)=>n in t?String(t[n]):e),i=t=>{let n=e.resolveLocale(t),r=e.compactUnits(n);return t=>{if(!Number.isFinite(t))return String(t);if(Object.is(t,-0)||t===0)return`0`;let i=Math.abs(t);for(let[a,o]of r)if(i>=a)return e.numberFormat(n,{maximumFractionDigits:2}).format(t/a)+o;if(i<1e-4)return t.toExponential(1);let a=Math.floor(Math.log10(i)+1e-9),o=Math.min(6,Math.max(0,-a)+2);return e.numberFormat(n,{maximumFractionDigits:o}).format(t)}},a=t=>{let n=e.resolveLocale(t);return t=>Number.isFinite(t)?e.numberFormat(n,{style:`percent`,minimumFractionDigits:1,maximumFractionDigits:1}).format(t):`–`};exports.SHAPE_LABELS=t,exports.interpolate=r,exports.localeFormat=i,exports.localePercent=a,exports.shapeLabels=n;
|
|
2
2
|
//# sourceMappingURL=labels.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"labels.cjs","names":["localeLabels","resolveLocale","compactUnits","numberFormat","require_locale","SHAPE_LABELS","shapeLabels","o","interpolate","template","key","values","all","localeFormat","tag","locale","units","value","abs","unit","suffix","magnitude","decimals","localePercent","share"],"sources":["../../../../../charts/src/engine/shapes/labels.ts"],"sourcesContent":["// Language of the shape charts: built-in texts (tooltip rows, accessible\n// names, \"No data\") and locale-aware number / percent formatting. The locale\n// is resolved on every layout, so a page language switch followed by a\n// re-render updates the texts.\n\nimport {\n compactUnits,\n localeLabels,\n numberFormat,\n resolveLocale,\n type LabelDictionary,\n} from \"../locale\";\nimport type { ShapeChartLabels, ShapeChartOptions } from \"./types\";\n\nexport const SHAPE_LABELS: LabelDictionary<ShapeChartLabels> = {\n en: {\n noData: \"No data\",\n value: \"Value\",\n share: \"Share\",\n ofFirstStage: \"Of first stage\",\n conversion: \"Conversion\",\n ofRange: \"Of range\",\n ofName: \"Of {name}\",\n incoming: \"Incoming\",\n outgoing: \"Outgoing\",\n max: \"Max\",\n progress: \"Progress\",\n target: \"Target\",\n ofTarget: \"Of target\",\n range: \"Range\",\n series: \"Series {index}\",\n pieChart: \"Pie chart\",\n donutChart: \"Donut chart\",\n roseChart: \"Rose chart\",\n radarChart: \"Radar chart\",\n gaugeChart: \"Gauge\",\n gaugeChartNamed: \"Gauge: {label}\",\n funnelChart: \"Funnel chart\",\n treemapChart: \"Treemap\",\n sankeyChart: \"Sankey diagram\",\n sunburstChart: \"Sunburst chart\",\n radialBarChart: \"Radial bar chart\",\n calendarHeatmap: \"Calendar heatmap\",\n bulletChart: \"Bullet chart\",\n },\n zh: {\n noData: \"暂无数据\",\n value: \"数值\",\n share: \"占比\",\n ofFirstStage: \"占首阶段\",\n conversion: \"转化率\",\n ofRange: \"占量程\",\n ofName: \"占{name}\",\n incoming: \"流入\",\n outgoing: \"流出\",\n max: \"最大值\",\n progress: \"进度\",\n target: \"目标\",\n ofTarget: \"目标达成\",\n range: \"区间\",\n series: \"系列 {index}\",\n pieChart: \"饼图\",\n donutChart: \"环形图\",\n roseChart: \"玫瑰图\",\n radarChart: \"雷达图\",\n gaugeChart: \"仪表盘\",\n gaugeChartNamed: \"仪表盘:{label}\",\n funnelChart: \"漏斗图\",\n treemapChart: \"矩形树图\",\n sankeyChart: \"桑基图\",\n sunburstChart: \"旭日图\",\n radialBarChart: \"径向条形图\",\n calendarHeatmap: \"日历热力图\",\n bulletChart: \"子弹图\",\n },\n ja: {\n noData: \"データなし\",\n value: \"値\",\n share: \"割合\",\n ofFirstStage: \"初段階比\",\n conversion: \"転換率\",\n ofRange: \"範囲比\",\n ofName: \"{name}比\",\n incoming: \"流入\",\n outgoing: \"流出\",\n max: \"最大\",\n progress: \"進捗\",\n target: \"目標\",\n ofTarget: \"目標達成率\",\n range: \"範囲\",\n series: \"系列 {index}\",\n pieChart: \"円グラフ\",\n donutChart: \"ドーナツグラフ\",\n roseChart: \"鶏頭図\",\n radarChart: \"レーダーチャート\",\n gaugeChart: \"ゲージ\",\n gaugeChartNamed: \"ゲージ:{label}\",\n funnelChart: \"ファネルチャート\",\n treemapChart: \"ツリーマップ\",\n sankeyChart: \"サンキー図\",\n sunburstChart: \"サンバースト図\",\n radialBarChart: \"円形棒グラフ\",\n calendarHeatmap: \"カレンダーヒートマップ\",\n bulletChart: \"ブレットグラフ\",\n },\n fr: {\n noData: \"Aucune donnée\",\n value: \"Valeur\",\n share: \"Part\",\n ofFirstStage: \"Part de la 1re étape\",\n conversion: \"Conversion\",\n ofRange: \"Part de la plage\",\n ofName: \"Part de {name}\",\n incoming: \"Entrées\",\n outgoing: \"Sorties\",\n max: \"Max\",\n progress: \"Progression\",\n target: \"Objectif\",\n ofTarget: \"Atteinte de l’objectif\",\n range: \"Plage\",\n series: \"Série {index}\",\n pieChart: \"Graphique circulaire\",\n donutChart: \"Graphique en anneau\",\n roseChart: \"Diagramme de Nightingale\",\n radarChart: \"Graphique radar\",\n gaugeChart: \"Jauge\",\n gaugeChartNamed: \"Jauge : {label}\",\n funnelChart: \"Graphique en entonnoir\",\n treemapChart: \"Treemap\",\n sankeyChart: \"Diagramme de Sankey\",\n sunburstChart: \"Diagramme en rayons de soleil\",\n radialBarChart: \"Graphique à barres radiales\",\n calendarHeatmap: \"Calendrier thermique\",\n bulletChart: \"Graphique à puces\",\n },\n};\n\n/** Texts of a chart: its `locale` (the page language by default) and `texts` overrides */\nexport const shapeLabels = (\n o: Pick<ShapeChartOptions, \"locale\" | \"texts\">,\n): ShapeChartLabels => localeLabels(SHAPE_LABELS, o.locale, o.texts);\n\n/** Replaces the `{key}` placeholders of a text */\nexport const interpolate = (\n template: string,\n values: Record<string, string | number>,\n): string =>\n template.replace(/\\{(\\w+)\\}/g, (all, key: string) =>\n key in values ? String(values[key]) : all,\n );\n\n/**\n * Compact number of a locale: `1.23k` / `12.3万` / `1,2 k`; small values\n * keep enough decimals to be told apart\n */\nexport const localeFormat = (locale?: string) => {\n const tag = resolveLocale(locale);\n const units = compactUnits(tag);\n return (value: number): string => {\n if (!Number.isFinite(value)) return String(value);\n if (Object.is(value, -0) || value === 0) return \"0\";\n const abs = Math.abs(value);\n for (const [unit, suffix] of units)\n if (abs >= unit)\n return (\n numberFormat(tag, { maximumFractionDigits: 2 }).format(value / unit) +\n suffix\n );\n if (abs < 1e-4) return value.toExponential(1);\n // at least two decimals, two more than the magnitude (0.0123, 1.25)\n const magnitude = Math.floor(Math.log10(abs) + 1e-9);\n const decimals = Math.min(6, Math.max(0, -magnitude) + 2);\n return numberFormat(tag, { maximumFractionDigits: decimals }).format(value);\n };\n};\n\n/** Share 0-1 as a locale percent with one decimal: `40.0%`, `40,0 %` */\nexport const localePercent = (locale?: string) => {\n const tag = resolveLocale(locale);\n return (share: number): string =>\n Number.isFinite(share)\n ? numberFormat(tag, {\n style: \"percent\",\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n }).format(share)\n : \"–\";\n};\n"],"mappings":"iCAcA,IAAaK,EAAkD,CAC7D,GAAI,CACF,OAAQ,UACR,MAAO,QACP,MAAO,QACP,aAAc,iBACd,WAAY,aACZ,QAAS,WACT,OAAQ,YACR,SAAU,WACV,SAAU,WACV,IAAK,MACL,SAAU,WACV,OAAQ,SACR,SAAU,YACV,MAAO,QACP,OAAQ,iBACR,SAAU,YACV,WAAY,cACZ,UAAW,aACX,WAAY,cACZ,WAAY,QACZ,gBAAiB,iBACjB,YAAa,eACb,aAAc,UACd,YAAa,iBACb,cAAe,iBACf,eAAgB,mBAChB,gBAAiB,mBACjB,YAAa,
|
|
1
|
+
{"version":3,"file":"labels.cjs","names":["localeLabels","resolveLocale","compactUnits","numberFormat","require_locale","SHAPE_LABELS","shapeLabels","o","interpolate","template","key","values","all","localeFormat","tag","locale","units","value","abs","unit","suffix","magnitude","decimals","localePercent","share"],"sources":["../../../../../charts/src/engine/shapes/labels.ts"],"sourcesContent":["// Language of the shape charts: built-in texts (tooltip rows, accessible\n// names, \"No data\") and locale-aware number / percent formatting. The locale\n// is resolved on every layout, so a page language switch followed by a\n// re-render updates the texts.\n\nimport {\n compactUnits,\n localeLabels,\n numberFormat,\n resolveLocale,\n type LabelDictionary,\n} from \"../locale\";\nimport type { ShapeChartLabels, ShapeChartOptions } from \"./types\";\n\nexport const SHAPE_LABELS: LabelDictionary<ShapeChartLabels> = {\n en: {\n noData: \"No data\",\n value: \"Value\",\n share: \"Share\",\n ofFirstStage: \"Of first stage\",\n conversion: \"Conversion\",\n ofRange: \"Of range\",\n ofName: \"Of {name}\",\n incoming: \"Incoming\",\n outgoing: \"Outgoing\",\n max: \"Max\",\n progress: \"Progress\",\n target: \"Target\",\n ofTarget: \"Of target\",\n range: \"Range\",\n reverse: \"Reverse\",\n series: \"Series {index}\",\n pieChart: \"Pie chart\",\n donutChart: \"Donut chart\",\n roseChart: \"Rose chart\",\n radarChart: \"Radar chart\",\n gaugeChart: \"Gauge\",\n gaugeChartNamed: \"Gauge: {label}\",\n funnelChart: \"Funnel chart\",\n treemapChart: \"Treemap\",\n sankeyChart: \"Sankey diagram\",\n sunburstChart: \"Sunburst chart\",\n radialBarChart: \"Radial bar chart\",\n calendarHeatmap: \"Calendar heatmap\",\n bulletChart: \"Bullet chart\",\n chordChart: \"Chord diagram\",\n },\n zh: {\n noData: \"暂无数据\",\n value: \"数值\",\n share: \"占比\",\n ofFirstStage: \"占首阶段\",\n conversion: \"转化率\",\n ofRange: \"占量程\",\n ofName: \"占{name}\",\n incoming: \"流入\",\n outgoing: \"流出\",\n max: \"最大值\",\n progress: \"进度\",\n target: \"目标\",\n ofTarget: \"目标达成\",\n range: \"区间\",\n reverse: \"反向\",\n series: \"系列 {index}\",\n pieChart: \"饼图\",\n donutChart: \"环形图\",\n roseChart: \"玫瑰图\",\n radarChart: \"雷达图\",\n gaugeChart: \"仪表盘\",\n gaugeChartNamed: \"仪表盘:{label}\",\n funnelChart: \"漏斗图\",\n treemapChart: \"矩形树图\",\n sankeyChart: \"桑基图\",\n sunburstChart: \"旭日图\",\n radialBarChart: \"径向条形图\",\n calendarHeatmap: \"日历热力图\",\n bulletChart: \"子弹图\",\n chordChart: \"弦图\",\n },\n ja: {\n noData: \"データなし\",\n value: \"値\",\n share: \"割合\",\n ofFirstStage: \"初段階比\",\n conversion: \"転換率\",\n ofRange: \"範囲比\",\n ofName: \"{name}比\",\n incoming: \"流入\",\n outgoing: \"流出\",\n max: \"最大\",\n progress: \"進捗\",\n target: \"目標\",\n ofTarget: \"目標達成率\",\n range: \"範囲\",\n reverse: \"逆方向\",\n series: \"系列 {index}\",\n pieChart: \"円グラフ\",\n donutChart: \"ドーナツグラフ\",\n roseChart: \"鶏頭図\",\n radarChart: \"レーダーチャート\",\n gaugeChart: \"ゲージ\",\n gaugeChartNamed: \"ゲージ:{label}\",\n funnelChart: \"ファネルチャート\",\n treemapChart: \"ツリーマップ\",\n sankeyChart: \"サンキー図\",\n sunburstChart: \"サンバースト図\",\n radialBarChart: \"円形棒グラフ\",\n calendarHeatmap: \"カレンダーヒートマップ\",\n bulletChart: \"ブレットグラフ\",\n chordChart: \"コードダイアグラム\",\n },\n fr: {\n noData: \"Aucune donnée\",\n value: \"Valeur\",\n share: \"Part\",\n ofFirstStage: \"Part de la 1re étape\",\n conversion: \"Conversion\",\n ofRange: \"Part de la plage\",\n ofName: \"Part de {name}\",\n incoming: \"Entrées\",\n outgoing: \"Sorties\",\n max: \"Max\",\n progress: \"Progression\",\n target: \"Objectif\",\n ofTarget: \"Atteinte de l’objectif\",\n range: \"Plage\",\n reverse: \"Sens inverse\",\n series: \"Série {index}\",\n pieChart: \"Graphique circulaire\",\n donutChart: \"Graphique en anneau\",\n roseChart: \"Diagramme de Nightingale\",\n radarChart: \"Graphique radar\",\n gaugeChart: \"Jauge\",\n gaugeChartNamed: \"Jauge : {label}\",\n funnelChart: \"Graphique en entonnoir\",\n treemapChart: \"Treemap\",\n sankeyChart: \"Diagramme de Sankey\",\n sunburstChart: \"Diagramme en rayons de soleil\",\n radialBarChart: \"Graphique à barres radiales\",\n calendarHeatmap: \"Calendrier thermique\",\n bulletChart: \"Graphique à puces\",\n chordChart: \"Diagramme d’accords\",\n },\n};\n\n/** Texts of a chart: its `locale` (the page language by default) and `texts` overrides */\nexport const shapeLabels = (\n o: Pick<ShapeChartOptions, \"locale\" | \"texts\">,\n): ShapeChartLabels => localeLabels(SHAPE_LABELS, o.locale, o.texts);\n\n/** Replaces the `{key}` placeholders of a text */\nexport const interpolate = (\n template: string,\n values: Record<string, string | number>,\n): string =>\n template.replace(/\\{(\\w+)\\}/g, (all, key: string) =>\n key in values ? String(values[key]) : all,\n );\n\n/**\n * Compact number of a locale: `1.23k` / `12.3万` / `1,2 k`; small values\n * keep enough decimals to be told apart\n */\nexport const localeFormat = (locale?: string) => {\n const tag = resolveLocale(locale);\n const units = compactUnits(tag);\n return (value: number): string => {\n if (!Number.isFinite(value)) return String(value);\n if (Object.is(value, -0) || value === 0) return \"0\";\n const abs = Math.abs(value);\n for (const [unit, suffix] of units)\n if (abs >= unit)\n return (\n numberFormat(tag, { maximumFractionDigits: 2 }).format(value / unit) +\n suffix\n );\n if (abs < 1e-4) return value.toExponential(1);\n // at least two decimals, two more than the magnitude (0.0123, 1.25)\n const magnitude = Math.floor(Math.log10(abs) + 1e-9);\n const decimals = Math.min(6, Math.max(0, -magnitude) + 2);\n return numberFormat(tag, { maximumFractionDigits: decimals }).format(value);\n };\n};\n\n/** Share 0-1 as a locale percent with one decimal: `40.0%`, `40,0 %` */\nexport const localePercent = (locale?: string) => {\n const tag = resolveLocale(locale);\n return (share: number): string =>\n Number.isFinite(share)\n ? numberFormat(tag, {\n style: \"percent\",\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n }).format(share)\n : \"–\";\n};\n"],"mappings":"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"}
|
|
@@ -16,6 +16,7 @@ var i = {
|
|
|
16
16
|
target: "Target",
|
|
17
17
|
ofTarget: "Of target",
|
|
18
18
|
range: "Range",
|
|
19
|
+
reverse: "Reverse",
|
|
19
20
|
series: "Series {index}",
|
|
20
21
|
pieChart: "Pie chart",
|
|
21
22
|
donutChart: "Donut chart",
|
|
@@ -29,7 +30,8 @@ var i = {
|
|
|
29
30
|
sunburstChart: "Sunburst chart",
|
|
30
31
|
radialBarChart: "Radial bar chart",
|
|
31
32
|
calendarHeatmap: "Calendar heatmap",
|
|
32
|
-
bulletChart: "Bullet chart"
|
|
33
|
+
bulletChart: "Bullet chart",
|
|
34
|
+
chordChart: "Chord diagram"
|
|
33
35
|
},
|
|
34
36
|
zh: {
|
|
35
37
|
noData: "暂无数据",
|
|
@@ -46,6 +48,7 @@ var i = {
|
|
|
46
48
|
target: "目标",
|
|
47
49
|
ofTarget: "目标达成",
|
|
48
50
|
range: "区间",
|
|
51
|
+
reverse: "反向",
|
|
49
52
|
series: "系列 {index}",
|
|
50
53
|
pieChart: "饼图",
|
|
51
54
|
donutChart: "环形图",
|
|
@@ -59,7 +62,8 @@ var i = {
|
|
|
59
62
|
sunburstChart: "旭日图",
|
|
60
63
|
radialBarChart: "径向条形图",
|
|
61
64
|
calendarHeatmap: "日历热力图",
|
|
62
|
-
bulletChart: "子弹图"
|
|
65
|
+
bulletChart: "子弹图",
|
|
66
|
+
chordChart: "弦图"
|
|
63
67
|
},
|
|
64
68
|
ja: {
|
|
65
69
|
noData: "データなし",
|
|
@@ -76,6 +80,7 @@ var i = {
|
|
|
76
80
|
target: "目標",
|
|
77
81
|
ofTarget: "目標達成率",
|
|
78
82
|
range: "範囲",
|
|
83
|
+
reverse: "逆方向",
|
|
79
84
|
series: "系列 {index}",
|
|
80
85
|
pieChart: "円グラフ",
|
|
81
86
|
donutChart: "ドーナツグラフ",
|
|
@@ -89,7 +94,8 @@ var i = {
|
|
|
89
94
|
sunburstChart: "サンバースト図",
|
|
90
95
|
radialBarChart: "円形棒グラフ",
|
|
91
96
|
calendarHeatmap: "カレンダーヒートマップ",
|
|
92
|
-
bulletChart: "ブレットグラフ"
|
|
97
|
+
bulletChart: "ブレットグラフ",
|
|
98
|
+
chordChart: "コードダイアグラム"
|
|
93
99
|
},
|
|
94
100
|
fr: {
|
|
95
101
|
noData: "Aucune donnée",
|
|
@@ -106,6 +112,7 @@ var i = {
|
|
|
106
112
|
target: "Objectif",
|
|
107
113
|
ofTarget: "Atteinte de l’objectif",
|
|
108
114
|
range: "Plage",
|
|
115
|
+
reverse: "Sens inverse",
|
|
109
116
|
series: "Série {index}",
|
|
110
117
|
pieChart: "Graphique circulaire",
|
|
111
118
|
donutChart: "Graphique en anneau",
|
|
@@ -119,7 +126,8 @@ var i = {
|
|
|
119
126
|
sunburstChart: "Diagramme en rayons de soleil",
|
|
120
127
|
radialBarChart: "Graphique à barres radiales",
|
|
121
128
|
calendarHeatmap: "Calendrier thermique",
|
|
122
|
-
bulletChart: "Graphique à puces"
|
|
129
|
+
bulletChart: "Graphique à puces",
|
|
130
|
+
chordChart: "Diagramme d’accords"
|
|
123
131
|
}
|
|
124
132
|
}, a = (e) => t(i, e.locale, e.texts), o = (e, t) => e.replace(/\{(\w+)\}/g, (e, n) => n in t ? String(t[n]) : e), s = (t) => {
|
|
125
133
|
let i = r(t), a = e(i);
|