minerva-design 1.1.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/dist/charts/canvas.d.cts +10 -0
- package/dist/charts/canvas.d.ts +10 -0
- package/dist/charts/core.cjs +1 -1
- package/dist/charts/core.d.cts +8 -1
- package/dist/charts/core.d.ts +8 -1
- package/dist/charts/core.js +6 -1
- package/dist/charts/engine/canvas.cjs +2 -0
- package/dist/charts/engine/canvas.cjs.map +1 -0
- package/dist/charts/engine/canvas.d.cts +85 -0
- package/dist/charts/engine/canvas.d.ts +85 -0
- package/dist/charts/engine/canvas.js +177 -0
- package/dist/charts/engine/canvas.js.map +1 -0
- package/dist/charts/engine/chart.cjs +1 -2
- package/dist/charts/engine/chart.cjs.map +1 -1
- package/dist/charts/engine/chart.js +450 -489
- 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 +27 -0
- package/dist/charts/engine/color.d.ts +27 -0
- package/dist/charts/engine/color.js +100 -4
- package/dist/charts/engine/color.js.map +1 -1
- package/dist/charts/engine/controller.cjs +3 -0
- package/dist/charts/engine/controller.cjs.map +1 -0
- package/dist/charts/engine/controller.d.cts +188 -0
- package/dist/charts/engine/controller.d.ts +188 -0
- package/dist/charts/engine/controller.js +592 -0
- package/dist/charts/engine/controller.js.map +1 -0
- package/dist/charts/engine/curve.cjs +2 -0
- package/dist/charts/engine/curve.cjs.map +1 -0
- package/dist/charts/engine/curve.d.cts +15 -0
- package/dist/charts/engine/curve.d.ts +15 -0
- package/dist/charts/engine/curve.js +56 -0
- package/dist/charts/engine/curve.js.map +1 -0
- package/dist/charts/engine/data.cjs +1 -1
- package/dist/charts/engine/data.cjs.map +1 -1
- package/dist/charts/engine/data.d.cts +15 -2
- package/dist/charts/engine/data.d.ts +15 -2
- package/dist/charts/engine/data.js +98 -38
- package/dist/charts/engine/data.js.map +1 -1
- package/dist/charts/engine/dom.cjs +1 -1
- package/dist/charts/engine/dom.cjs.map +1 -1
- package/dist/charts/engine/dom.d.cts +5 -3
- package/dist/charts/engine/dom.d.ts +5 -3
- package/dist/charts/engine/dom.js +27 -22
- package/dist/charts/engine/dom.js.map +1 -1
- package/dist/charts/engine/items.cjs +1 -1
- package/dist/charts/engine/items.cjs.map +1 -1
- package/dist/charts/engine/items.js +132 -61
- package/dist/charts/engine/items.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 +32 -5
- package/dist/charts/engine/model.d.ts +32 -5
- package/dist/charts/engine/model.js +226 -109
- package/dist/charts/engine/model.js.map +1 -1
- package/dist/charts/engine/overlay.cjs +1 -1
- package/dist/charts/engine/overlay.cjs.map +1 -1
- package/dist/charts/engine/overlay.d.cts +19 -1
- package/dist/charts/engine/overlay.d.ts +19 -1
- package/dist/charts/engine/overlay.js +77 -63
- package/dist/charts/engine/overlay.js.map +1 -1
- package/dist/charts/engine/presets.cjs +3 -0
- package/dist/charts/engine/presets.cjs.map +1 -0
- package/dist/charts/engine/presets.d.cts +169 -0
- package/dist/charts/engine/presets.d.ts +169 -0
- package/dist/charts/engine/presets.js +240 -0
- package/dist/charts/engine/presets.js.map +1 -0
- package/dist/charts/engine/renderers/canvas2d.cjs +1 -1
- package/dist/charts/engine/renderers/canvas2d.cjs.map +1 -1
- package/dist/charts/engine/renderers/canvas2d.d.cts +17 -1
- package/dist/charts/engine/renderers/canvas2d.d.ts +17 -1
- package/dist/charts/engine/renderers/canvas2d.js +176 -101
- package/dist/charts/engine/renderers/canvas2d.js.map +1 -1
- package/dist/charts/engine/renderers/range.cjs +1 -1
- package/dist/charts/engine/renderers/range.cjs.map +1 -1
- package/dist/charts/engine/renderers/range.js +4 -4
- package/dist/charts/engine/renderers/range.js.map +1 -1
- package/dist/charts/engine/renderers/shaders.cjs +37 -19
- package/dist/charts/engine/renderers/shaders.cjs.map +1 -1
- package/dist/charts/engine/renderers/shaders.d.cts +2 -2
- package/dist/charts/engine/renderers/shaders.d.ts +2 -2
- package/dist/charts/engine/renderers/shaders.js +37 -19
- package/dist/charts/engine/renderers/shaders.js.map +1 -1
- package/dist/charts/engine/renderers/types.cjs.map +1 -1
- package/dist/charts/engine/renderers/types.d.cts +11 -4
- package/dist/charts/engine/renderers/types.d.ts +11 -4
- package/dist/charts/engine/renderers/types.js.map +1 -1
- package/dist/charts/engine/renderers/webgl2.cjs +1 -1
- package/dist/charts/engine/renderers/webgl2.cjs.map +1 -1
- package/dist/charts/engine/renderers/webgl2.js +33 -12
- package/dist/charts/engine/renderers/webgl2.js.map +1 -1
- package/dist/charts/engine/renderers/webgpu.cjs +1 -1
- package/dist/charts/engine/renderers/webgpu.cjs.map +1 -1
- package/dist/charts/engine/renderers/webgpu.js +18 -15
- package/dist/charts/engine/renderers/webgpu.js.map +1 -1
- package/dist/charts/engine/scene.cjs +2 -0
- package/dist/charts/engine/scene.cjs.map +1 -0
- package/dist/charts/engine/scene.d.cts +102 -0
- package/dist/charts/engine/scene.d.ts +102 -0
- package/dist/charts/engine/scene.js +353 -0
- package/dist/charts/engine/scene.js.map +1 -0
- package/dist/charts/engine/shapes/canvas.cjs +2 -0
- package/dist/charts/engine/shapes/canvas.cjs.map +1 -0
- package/dist/charts/engine/shapes/canvas.d.cts +58 -0
- package/dist/charts/engine/shapes/canvas.d.ts +58 -0
- package/dist/charts/engine/shapes/canvas.js +159 -0
- package/dist/charts/engine/shapes/canvas.js.map +1 -0
- package/dist/charts/engine/shapes/chart.cjs +2 -0
- package/dist/charts/engine/shapes/chart.cjs.map +1 -0
- package/dist/charts/engine/shapes/chart.d.cts +6 -0
- package/dist/charts/engine/shapes/chart.d.ts +6 -0
- package/dist/charts/engine/shapes/chart.js +273 -0
- package/dist/charts/engine/shapes/chart.js.map +1 -0
- package/dist/charts/engine/shapes/draw.cjs +2 -0
- package/dist/charts/engine/shapes/draw.cjs.map +1 -0
- package/dist/charts/engine/shapes/draw.d.cts +20 -0
- package/dist/charts/engine/shapes/draw.d.ts +20 -0
- package/dist/charts/engine/shapes/draw.js +152 -0
- package/dist/charts/engine/shapes/draw.js.map +1 -0
- package/dist/charts/engine/shapes/funnel.cjs +2 -0
- package/dist/charts/engine/shapes/funnel.cjs.map +1 -0
- package/dist/charts/engine/shapes/funnel.d.cts +6 -0
- package/dist/charts/engine/shapes/funnel.d.ts +6 -0
- package/dist/charts/engine/shapes/funnel.js +149 -0
- package/dist/charts/engine/shapes/funnel.js.map +1 -0
- package/dist/charts/engine/shapes/gauge.cjs +2 -0
- package/dist/charts/engine/shapes/gauge.cjs.map +1 -0
- package/dist/charts/engine/shapes/gauge.d.cts +7 -0
- package/dist/charts/engine/shapes/gauge.d.ts +7 -0
- package/dist/charts/engine/shapes/gauge.js +173 -0
- package/dist/charts/engine/shapes/gauge.js.map +1 -0
- package/dist/charts/engine/shapes/hit.cjs +2 -0
- package/dist/charts/engine/shapes/hit.cjs.map +1 -0
- package/dist/charts/engine/shapes/hit.d.cts +28 -0
- package/dist/charts/engine/shapes/hit.d.ts +28 -0
- package/dist/charts/engine/shapes/hit.js +124 -0
- package/dist/charts/engine/shapes/hit.js.map +1 -0
- package/dist/charts/engine/shapes/index.d.cts +9 -0
- package/dist/charts/engine/shapes/index.d.ts +9 -0
- package/dist/charts/engine/shapes/layout.cjs +3 -0
- package/dist/charts/engine/shapes/layout.cjs.map +1 -0
- package/dist/charts/engine/shapes/layout.d.cts +88 -0
- package/dist/charts/engine/shapes/layout.d.ts +88 -0
- package/dist/charts/engine/shapes/layout.js +266 -0
- package/dist/charts/engine/shapes/layout.js.map +1 -0
- package/dist/charts/engine/shapes/pie.cjs +2 -0
- package/dist/charts/engine/shapes/pie.cjs.map +1 -0
- package/dist/charts/engine/shapes/pie.d.cts +20 -0
- package/dist/charts/engine/shapes/pie.d.ts +20 -0
- package/dist/charts/engine/shapes/pie.js +302 -0
- package/dist/charts/engine/shapes/pie.js.map +1 -0
- package/dist/charts/engine/shapes/radar.cjs +2 -0
- package/dist/charts/engine/shapes/radar.cjs.map +1 -0
- package/dist/charts/engine/shapes/radar.d.cts +8 -0
- package/dist/charts/engine/shapes/radar.d.ts +8 -0
- package/dist/charts/engine/shapes/radar.js +197 -0
- package/dist/charts/engine/shapes/radar.js.map +1 -0
- package/dist/charts/engine/shapes/runtime.cjs +2 -0
- package/dist/charts/engine/shapes/runtime.cjs.map +1 -0
- package/dist/charts/engine/shapes/runtime.d.cts +29 -0
- package/dist/charts/engine/shapes/runtime.d.ts +29 -0
- package/dist/charts/engine/shapes/runtime.js +97 -0
- package/dist/charts/engine/shapes/runtime.js.map +1 -0
- package/dist/charts/engine/shapes/scene.cjs +2 -0
- package/dist/charts/engine/shapes/scene.cjs.map +1 -0
- package/dist/charts/engine/shapes/scene.d.cts +257 -0
- package/dist/charts/engine/shapes/scene.d.ts +257 -0
- package/dist/charts/engine/shapes/scene.js +123 -0
- package/dist/charts/engine/shapes/scene.js.map +1 -0
- package/dist/charts/engine/shapes/treemap.cjs +2 -0
- package/dist/charts/engine/shapes/treemap.cjs.map +1 -0
- package/dist/charts/engine/shapes/treemap.d.cts +14 -0
- package/dist/charts/engine/shapes/treemap.d.ts +14 -0
- package/dist/charts/engine/shapes/treemap.js +213 -0
- package/dist/charts/engine/shapes/treemap.js.map +1 -0
- package/dist/charts/engine/shapes/types.d.cts +292 -0
- package/dist/charts/engine/shapes/types.d.ts +292 -0
- package/dist/charts/engine/signature.cjs +2 -0
- package/dist/charts/engine/signature.cjs.map +1 -0
- package/dist/charts/engine/signature.d.cts +9 -0
- package/dist/charts/engine/signature.d.ts +9 -0
- package/dist/charts/engine/signature.js +13 -0
- package/dist/charts/engine/signature.js.map +1 -0
- package/dist/charts/engine/theme.cjs +1 -1
- package/dist/charts/engine/theme.cjs.map +1 -1
- package/dist/charts/engine/theme.d.cts +35 -2
- package/dist/charts/engine/theme.d.ts +35 -2
- package/dist/charts/engine/theme.js +66 -26
- package/dist/charts/engine/theme.js.map +1 -1
- package/dist/charts/engine/types.d.cts +139 -11
- package/dist/charts/engine/types.d.ts +139 -11
- package/dist/charts/index.cjs +1 -1
- package/dist/charts/index.d.cts +4 -2
- package/dist/charts/index.d.ts +4 -2
- package/dist/charts/index.js +8 -2
- package/dist/charts/react/Chart.cjs +1 -1
- package/dist/charts/react/Chart.cjs.map +1 -1
- package/dist/charts/react/Chart.d.cts +18 -4
- package/dist/charts/react/Chart.d.ts +18 -4
- package/dist/charts/react/Chart.js +102 -41
- package/dist/charts/react/Chart.js.map +1 -1
- package/dist/charts/react/charts.cjs +1 -1
- package/dist/charts/react/charts.cjs.map +1 -1
- package/dist/charts/react/charts.d.cts +11 -3
- package/dist/charts/react/charts.d.ts +11 -3
- package/dist/charts/react/charts.js +221 -144
- package/dist/charts/react/charts.js.map +1 -1
- package/dist/charts/react/shapes.cjs +2 -0
- package/dist/charts/react/shapes.cjs.map +1 -0
- package/dist/charts/react/shapes.d.cts +255 -0
- package/dist/charts/react/shapes.d.ts +255 -0
- package/dist/charts/react/shapes.js +242 -0
- package/dist/charts/react/shapes.js.map +1 -0
- package/dist/charts/react/types.d.cts +100 -63
- package/dist/charts/react/types.d.ts +100 -63
- package/dist/native/charts/src/canvas.cjs +1 -0
- package/dist/native/charts/src/canvas.js +6 -0
- package/dist/native/charts/src/engine/axis.cjs +2 -0
- package/dist/native/charts/src/engine/axis.cjs.map +1 -0
- package/dist/native/charts/src/engine/axis.js +38 -0
- package/dist/native/charts/src/engine/axis.js.map +1 -0
- package/dist/native/charts/src/engine/canvas.cjs +1 -0
- package/dist/native/charts/src/engine/canvas.js +1 -0
- package/dist/native/charts/src/engine/color.cjs +2 -0
- package/dist/native/charts/src/engine/color.cjs.map +1 -0
- package/dist/native/charts/src/engine/color.js +139 -0
- package/dist/native/charts/src/engine/color.js.map +1 -0
- package/dist/native/charts/src/engine/controller.cjs +3 -0
- package/dist/native/charts/src/engine/controller.cjs.map +1 -0
- package/dist/native/charts/src/engine/controller.js +592 -0
- package/dist/native/charts/src/engine/controller.js.map +1 -0
- package/dist/native/charts/src/engine/curve.cjs +2 -0
- package/dist/native/charts/src/engine/curve.cjs.map +1 -0
- package/dist/native/charts/src/engine/curve.js +56 -0
- package/dist/native/charts/src/engine/curve.js.map +1 -0
- package/dist/native/charts/src/engine/data.cjs +2 -0
- package/dist/native/charts/src/engine/data.cjs.map +1 -0
- package/dist/native/charts/src/engine/data.js +164 -0
- package/dist/native/charts/src/engine/data.js.map +1 -0
- package/dist/native/charts/src/engine/decimate.cjs +2 -0
- package/dist/native/charts/src/engine/decimate.cjs.map +1 -0
- package/dist/native/charts/src/engine/decimate.js +28 -0
- package/dist/native/charts/src/engine/decimate.js.map +1 -0
- package/dist/native/charts/src/engine/format.cjs +2 -0
- package/dist/native/charts/src/engine/format.cjs.map +1 -0
- package/dist/native/charts/src/engine/format.js +34 -0
- package/dist/native/charts/src/engine/format.js.map +1 -0
- package/dist/native/charts/src/engine/layout.cjs +2 -0
- package/dist/native/charts/src/engine/layout.cjs.map +1 -0
- package/dist/native/charts/src/engine/layout.js +26 -0
- package/dist/native/charts/src/engine/layout.js.map +1 -0
- package/dist/native/charts/src/engine/model.cjs +2 -0
- package/dist/native/charts/src/engine/model.cjs.map +1 -0
- package/dist/native/charts/src/engine/model.js +292 -0
- package/dist/native/charts/src/engine/model.js.map +1 -0
- package/dist/native/charts/src/engine/overlay.cjs +2 -0
- package/dist/native/charts/src/engine/overlay.cjs.map +1 -0
- package/dist/native/charts/src/engine/overlay.js +49 -0
- package/dist/native/charts/src/engine/overlay.js.map +1 -0
- package/dist/native/charts/src/engine/presets.cjs +3 -0
- package/dist/native/charts/src/engine/presets.cjs.map +1 -0
- package/dist/native/charts/src/engine/presets.js +154 -0
- package/dist/native/charts/src/engine/presets.js.map +1 -0
- package/dist/native/charts/src/engine/scale.cjs +2 -0
- package/dist/native/charts/src/engine/scale.cjs.map +1 -0
- package/dist/native/charts/src/engine/scale.js +37 -0
- package/dist/native/charts/src/engine/scale.js.map +1 -0
- package/dist/native/charts/src/engine/scene.cjs +2 -0
- package/dist/native/charts/src/engine/scene.cjs.map +1 -0
- package/dist/native/charts/src/engine/scene.js +353 -0
- package/dist/native/charts/src/engine/scene.js.map +1 -0
- package/dist/native/charts/src/engine/spatial.cjs +2 -0
- package/dist/native/charts/src/engine/spatial.cjs.map +1 -0
- package/dist/native/charts/src/engine/spatial.js +53 -0
- package/dist/native/charts/src/engine/spatial.js.map +1 -0
- package/dist/native/charts/src/engine/theme.cjs +2 -0
- package/dist/native/charts/src/engine/theme.cjs.map +1 -0
- package/dist/native/charts/src/engine/theme.js +62 -0
- package/dist/native/charts/src/engine/theme.js.map +1 -0
- package/dist/native/charts/src/engine/time.cjs +2 -0
- package/dist/native/charts/src/engine/time.cjs.map +1 -0
- package/dist/native/charts/src/engine/time.js +189 -0
- package/dist/native/charts/src/engine/time.js.map +1 -0
- package/dist/native/charts/src/engine/viewport.cjs +2 -0
- package/dist/native/charts/src/engine/viewport.cjs.map +1 -0
- package/dist/native/charts/src/engine/viewport.js +12 -0
- package/dist/native/charts/src/engine/viewport.js.map +1 -0
- package/dist/native/components/Chart/ChartBase.cjs +2 -0
- package/dist/native/components/Chart/ChartBase.cjs.map +1 -0
- package/dist/native/components/Chart/ChartBase.d.cts +29 -0
- package/dist/native/components/Chart/ChartBase.d.ts +29 -0
- package/dist/native/components/Chart/ChartBase.js +287 -0
- package/dist/native/components/Chart/ChartBase.js.map +1 -0
- package/dist/native/components/Chart/charts.cjs +2 -0
- package/dist/native/components/Chart/charts.cjs.map +1 -0
- package/dist/native/components/Chart/charts.d.cts +19 -0
- package/dist/native/components/Chart/charts.d.ts +19 -0
- package/dist/native/components/Chart/charts.js +173 -0
- package/dist/native/components/Chart/charts.js.map +1 -0
- package/dist/native/components/Chart/index.cjs +1 -0
- package/dist/native/components/Chart/index.d.cts +2 -0
- package/dist/native/components/Chart/index.d.ts +2 -0
- package/dist/native/components/Chart/index.js +2 -0
- package/dist/native/components/Chart/measure.cjs +2 -0
- package/dist/native/components/Chart/measure.cjs.map +1 -0
- package/dist/native/components/Chart/measure.d.cts +5 -0
- package/dist/native/components/Chart/measure.d.ts +5 -0
- package/dist/native/components/Chart/measure.js +11 -0
- package/dist/native/components/Chart/measure.js.map +1 -0
- package/dist/native/components/Chart/scene.cjs +2 -0
- package/dist/native/components/Chart/scene.cjs.map +1 -0
- package/dist/native/components/Chart/scene.d.cts +41 -0
- package/dist/native/components/Chart/scene.d.ts +41 -0
- package/dist/native/components/Chart/scene.js +431 -0
- package/dist/native/components/Chart/scene.js.map +1 -0
- package/dist/native/components/Chart/theme.cjs +2 -0
- package/dist/native/components/Chart/theme.cjs.map +1 -0
- package/dist/native/components/Chart/theme.d.cts +10 -0
- package/dist/native/components/Chart/theme.d.ts +10 -0
- package/dist/native/components/Chart/theme.js +10 -0
- package/dist/native/components/Chart/theme.js.map +1 -0
- package/dist/native/components/Chart/types.d.cts +129 -0
- package/dist/native/components/Chart/types.d.ts +129 -0
- package/dist/native/index.cjs +1 -1
- package/dist/native/index.d.cts +1 -0
- package/dist/native/index.d.ts +1 -0
- package/dist/native/index.js +6 -4
- package/dist/native/manifest.d.cts +7 -0
- package/dist/native/manifest.d.ts +7 -0
- package/dist/native/source/components/Chart/ChartBase.tsx +545 -0
- package/dist/native/source/components/Chart/charts.tsx +291 -0
- package/dist/native/source/components/Chart/index.ts +8 -0
- package/dist/native/source/components/Chart/measure.ts +50 -0
- package/dist/native/source/components/Chart/scene.tsx +1021 -0
- package/dist/native/source/components/Chart/theme.ts +16 -0
- package/dist/native/source/components/Chart/types.ts +194 -0
- package/dist/native/source/index.ts +1 -0
- package/dist/native/source/manifest.ts +14 -0
- package/dist/taro/charts.d.ts +144 -0
- package/dist/taro/index.d.ts +1 -0
- package/dist/taro/index.js +3544 -618
- package/dist/uni/BarChart.vue +75 -0
- package/dist/uni/BarChart.vue.d.ts +111 -0
- package/dist/uni/Chart.vue +68 -0
- package/dist/uni/Chart.vue.d.ts +100 -0
- package/dist/uni/LineChart.vue +75 -0
- package/dist/uni/LineChart.vue.d.ts +111 -0
- package/dist/uni/ProgressIndicator.vue.d.ts +1 -1
- package/dist/uni/QuadrantChart.vue +184 -0
- package/dist/uni/QuadrantChart.vue.d.ts +173 -0
- package/dist/uni/ScatterChart.vue +69 -0
- package/dist/uni/ScatterChart.vue.d.ts +100 -0
- package/dist/uni/chart-canvas.d.ts +68 -0
- package/dist/uni/chart-canvas.js +363 -0
- package/dist/uni/chart-types.d.ts +135 -0
- package/dist/uni/chart-types.js +84 -0
- package/dist/uni/charts-canvas.d.ts +1 -0
- package/dist/uni/charts-canvas.js +10 -0
- package/dist/uni/index.d.ts +6 -0
- package/dist/uni/index.js +6 -0
- package/dist/weapp/bar-chart/index.js +1 -0
- package/dist/weapp/bar-chart/index.json +1 -0
- package/dist/weapp/bar-chart/index.wxml +1 -0
- package/dist/weapp/bar-chart/index.wxss +1 -0
- package/dist/weapp/chart/index.js +1 -0
- package/dist/weapp/chart/index.json +1 -0
- package/dist/weapp/chart/index.wxml +1 -0
- package/dist/weapp/chart/index.wxss +1 -0
- package/dist/weapp/controls.js +4760 -266
- package/dist/weapp/line-chart/index.js +1 -0
- package/dist/weapp/line-chart/index.json +1 -0
- package/dist/weapp/line-chart/index.wxml +1 -0
- package/dist/weapp/line-chart/index.wxss +1 -0
- package/dist/weapp/quadrant-chart/index.js +1 -0
- package/dist/weapp/quadrant-chart/index.json +1 -0
- package/dist/weapp/quadrant-chart/index.wxml +1 -0
- package/dist/weapp/quadrant-chart/index.wxss +1 -0
- package/dist/weapp/scatter-chart/index.js +1 -0
- package/dist/weapp/scatter-chart/index.json +1 -0
- package/dist/weapp/scatter-chart/index.wxml +1 -0
- package/dist/weapp/scatter-chart/index.wxss +1 -0
- package/dist/weapp/types.d.ts +295 -0
- package/package.json +21 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"color.js","names":["clamp01","v","parseHex","h","hex","expand","channel","i","hasAlpha","parseComponent","part","scale","splitArgs","main","alpha","args","parts","parseColor","value","input","match","probeContext","parseWithCanvas","canvas","ctx","r","g","b","a","resolveColor","direct","computed","element","probe","parsed","fallback","toCss","c","packColor","mix","t"],"sources":["../../../../charts/src/engine/color.ts"],"sourcesContent":["// Color parsing to straight (non-premultiplied) RGBA in 0-1.\n\nexport type Rgba = readonly [number, number, number, number];\n\nconst clamp01 = (v: number) => (v < 0 ? 0 : v > 1 ? 1 : v);\n\nconst parseHex = (hex: string): Rgba | null => {\n const h = hex.slice(1);\n if (!/^[0-9a-f]+$/i.test(h)) return null;\n const expand = h.length === 3 || h.length === 4;\n if (!expand && h.length !== 6 && h.length !== 8) return null;\n const channel = (i: number) =>\n expand\n ? parseInt(h[i] + h[i], 16) / 255\n : parseInt(h.slice(i * 2, i * 2 + 2), 16) / 255;\n const hasAlpha = h.length === 4 || h.length === 8;\n return [channel(0), channel(1), channel(2), hasAlpha ? channel(3) : 1];\n};\n\nconst parseComponent = (part: string, scale: number): number => {\n const v = parseFloat(part);\n if (Number.isNaN(v)) return 0;\n return part.trim().endsWith(\"%\") ? v / 100 : v / scale;\n};\n\n/** Splits `a b c / d` or `a, b, c, d` */\nconst splitArgs = (args: string): string[] => {\n const [main, alpha] = args.split(\"/\");\n const parts = main.split(/[\\s,]+/).filter(Boolean);\n if (alpha !== undefined) parts.push(alpha.trim());\n return parts;\n};\n\n/**\n * Parses the color syntaxes returned by `getComputedStyle` (`rgb()`,\n * `rgba()`, `color(srgb ...)`) and hex colors; `null` for anything else\n * (named colors, `oklch()`, ... are resolved by `resolveColor`).\n */\nexport const parseColor = (input: string): Rgba | null => {\n const value = input.trim().toLowerCase();\n if (value.startsWith(\"#\")) return parseHex(value);\n if (value === \"transparent\") return [0, 0, 0, 0];\n let match = /^rgba?\\((.*)\\)$/.exec(value);\n if (match) {\n const parts = splitArgs(match[1]);\n if (parts.length < 3) return null;\n return [\n clamp01(parseComponent(parts[0], 255)),\n clamp01(parseComponent(parts[1], 255)),\n clamp01(parseComponent(parts[2], 255)),\n parts[3] === undefined ? 1 : clamp01(parseComponent(parts[3], 1)),\n ];\n }\n match = /^color\\(srgb\\s+(.*)\\)$/.exec(value);\n if (match) {\n const parts = splitArgs(match[1]);\n if (parts.length < 3) return null;\n return [\n clamp01(parseComponent(parts[0], 1)),\n clamp01(parseComponent(parts[1], 1)),\n clamp01(parseComponent(parts[2], 1)),\n parts[3] === undefined ? 1 : clamp01(parseComponent(parts[3], 1)),\n ];\n }\n return null;\n};\n\nlet probeContext: CanvasRenderingContext2D | null | undefined;\n\n/** Lets the browser convert any CSS color (named, hsl, oklch, color-mix, ...) */\nconst parseWithCanvas = (value: string): Rgba | null => {\n if (typeof document === \"undefined\") return null;\n if (probeContext === undefined) {\n const canvas = document.createElement(\"canvas\");\n canvas.width = 1;\n canvas.height = 1;\n probeContext = canvas.getContext(\"2d\", { willReadFrequently: true });\n }\n const ctx = probeContext;\n if (!ctx) return null;\n ctx.clearRect(0, 0, 1, 1);\n ctx.fillStyle = \"#000\";\n ctx.fillStyle = value;\n ctx.fillRect(0, 0, 1, 1);\n const [r, g, b, a] = ctx.getImageData(0, 0, 1, 1).data;\n if (a === 0) return [0, 0, 0, 0];\n // getImageData returns premultiplied-then-unpremultiplied values\n return [r / 255, g / 255, b / 255, a / 255];\n};\n\n/**\n * Resolves a CSS color in the context of `element`: `var(--x)`,\n * `color-mix()`, named colors, ... Falls back to `fallback` when the color\n * cannot be resolved (e.g. outside a browser).\n */\nexport const resolveColor = (\n value: string,\n element: Element | null,\n fallback: Rgba = [0.4, 0.4, 0.4, 1],\n): Rgba => {\n const direct = parseColor(value);\n if (direct) return direct;\n let computed = value;\n if (element && typeof getComputedStyle === \"function\") {\n const probe = element.ownerDocument.createElement(\"span\");\n probe.style.display = \"none\";\n probe.style.color = value;\n element.appendChild(probe);\n computed = getComputedStyle(probe).color || value;\n probe.remove();\n const parsed = parseColor(computed);\n if (parsed) return parsed;\n }\n return parseWithCanvas(computed) ?? fallback;\n};\n\nconst hex2 = (v: number) =>\n Math.round(clamp01(v) * 255)\n .toString(16)\n .padStart(2, \"0\");\n\n/** `rgba()` string usable by Canvas2D and the DOM */\nexport const toCss = (c: Rgba, alpha = 1): string =>\n `rgba(${Math.round(c[0] * 255)}, ${Math.round(c[1] * 255)}, ${Math.round(c[2] * 255)}, ${+(c[3] * alpha).toFixed(3)})`;\n\n/** `#rrggbb` (alpha dropped) */\nexport const toHex = (c: Rgba): string =>\n `#${hex2(c[0])}${hex2(c[1])}${hex2(c[2])}`;\n\n/** Packs a color as little-endian `unorm8x4` (r in the lowest byte) */\nexport const packColor = (c: Rgba): number =>\n ((Math.round(clamp01(c[3]) * 255) << 24) |\n (Math.round(clamp01(c[2]) * 255) << 16) |\n (Math.round(clamp01(c[1]) * 255) << 8) |\n Math.round(clamp01(c[0]) * 255)) >>>\n 0;\n\n/** Mixes two colors (t = 0 -> a, 1 -> b) */\nexport const mix = (a: Rgba, b: Rgba, t: number): Rgba => [\n a[0] + (b[0] - a[0]) * t,\n a[1] + (b[1] - a[1]) * t,\n a[2] + (b[2] - a[2]) * t,\n a[3] + (b[3] - a[3]) * t,\n];\n\n/** Relative luminance (sRGB approximation) */\nexport const luminance = (c: Rgba): number =>\n 0.2126 * c[0] + 0.7152 * c[1] + 0.0722 * c[2];\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"color.js","names":["clamp01","v","parseHex","h","hex","expand","channel","i","hasAlpha","parseComponent","part","scale","splitArgs","main","alpha","args","parts","parseColor","value","input","match","probeContext","parseWithCanvas","canvas","ctx","r","g","b","a","resolveColor","direct","computed","element","probe","parsed","resolveStaticColor","fallback","parseVar","ref","depth","defined","variables","NAMED","domColorResolver","UNRESOLVED","memoizeColorResolver","cache","hit","resolved","resolve","sameColor","toCss","c","packColor","mix","t","unpackColor","packed","rampColor","stops","p"],"sources":["../../../../charts/src/engine/color.ts"],"sourcesContent":["// Color parsing to straight (non-premultiplied) RGBA in 0-1.\n\nexport type Rgba = readonly [number, number, number, number];\n\nconst clamp01 = (v: number) => (v < 0 ? 0 : v > 1 ? 1 : v);\n\nconst parseHex = (hex: string): Rgba | null => {\n const h = hex.slice(1);\n if (!/^[0-9a-f]+$/i.test(h)) return null;\n const expand = h.length === 3 || h.length === 4;\n if (!expand && h.length !== 6 && h.length !== 8) return null;\n const channel = (i: number) =>\n expand\n ? parseInt(h[i] + h[i], 16) / 255\n : parseInt(h.slice(i * 2, i * 2 + 2), 16) / 255;\n const hasAlpha = h.length === 4 || h.length === 8;\n return [channel(0), channel(1), channel(2), hasAlpha ? channel(3) : 1];\n};\n\nconst parseComponent = (part: string, scale: number): number => {\n const v = parseFloat(part);\n if (Number.isNaN(v)) return 0;\n return part.trim().endsWith(\"%\") ? v / 100 : v / scale;\n};\n\n/** Splits `a b c / d` or `a, b, c, d` */\nconst splitArgs = (args: string): string[] => {\n const [main, alpha] = args.split(\"/\");\n const parts = main.split(/[\\s,]+/).filter(Boolean);\n if (alpha !== undefined) parts.push(alpha.trim());\n return parts;\n};\n\n/**\n * Parses the color syntaxes returned by `getComputedStyle` (`rgb()`,\n * `rgba()`, `color(srgb ...)`) and hex colors; `null` for anything else\n * (named colors, `oklch()`, ... are resolved by `resolveColor`).\n */\nexport const parseColor = (input: string): Rgba | null => {\n const value = input.trim().toLowerCase();\n if (value.startsWith(\"#\")) return parseHex(value);\n if (value === \"transparent\") return [0, 0, 0, 0];\n let match = /^rgba?\\((.*)\\)$/.exec(value);\n if (match) {\n const parts = splitArgs(match[1]);\n if (parts.length < 3) return null;\n return [\n clamp01(parseComponent(parts[0], 255)),\n clamp01(parseComponent(parts[1], 255)),\n clamp01(parseComponent(parts[2], 255)),\n parts[3] === undefined ? 1 : clamp01(parseComponent(parts[3], 1)),\n ];\n }\n match = /^color\\(srgb\\s+(.*)\\)$/.exec(value);\n if (match) {\n const parts = splitArgs(match[1]);\n if (parts.length < 3) return null;\n return [\n clamp01(parseComponent(parts[0], 1)),\n clamp01(parseComponent(parts[1], 1)),\n clamp01(parseComponent(parts[2], 1)),\n parts[3] === undefined ? 1 : clamp01(parseComponent(parts[3], 1)),\n ];\n }\n return null;\n};\n\nlet probeContext: CanvasRenderingContext2D | null | undefined;\n\n/** Lets the browser convert any CSS color (named, hsl, oklch, color-mix, ...) */\nconst parseWithCanvas = (value: string): Rgba | null => {\n if (typeof document === \"undefined\") return null;\n if (probeContext === undefined) {\n const canvas = document.createElement(\"canvas\");\n canvas.width = 1;\n canvas.height = 1;\n probeContext = canvas.getContext(\"2d\", { willReadFrequently: true });\n }\n const ctx = probeContext;\n if (!ctx) return null;\n ctx.clearRect(0, 0, 1, 1);\n ctx.fillStyle = \"#000\";\n ctx.fillStyle = value;\n ctx.fillRect(0, 0, 1, 1);\n const [r, g, b, a] = ctx.getImageData(0, 0, 1, 1).data;\n if (a === 0) return [0, 0, 0, 0];\n // getImageData returns premultiplied-then-unpremultiplied values\n return [r / 255, g / 255, b / 255, a / 255];\n};\n\n/**\n * Resolves a CSS color in the context of `element`: `var(--x)`,\n * `color-mix()`, named colors, ... Falls back to `fallback` when the color\n * cannot be resolved (e.g. outside a browser).\n */\nexport const resolveColor = (\n value: string,\n element: Element | null,\n fallback: Rgba = [0.4, 0.4, 0.4, 1],\n): Rgba => {\n const direct = parseColor(value);\n if (direct) return direct;\n let computed = value;\n if (element && typeof getComputedStyle === \"function\") {\n const probe = element.ownerDocument.createElement(\"span\");\n probe.style.display = \"none\";\n probe.style.color = value;\n element.appendChild(probe);\n computed = getComputedStyle(probe).color || value;\n probe.remove();\n const parsed = parseColor(computed);\n if (parsed) return parsed;\n }\n return parseWithCanvas(computed) ?? resolveStaticColor(value, {}, fallback);\n};\n\n/** Resolves a color to RGBA, falling back to `fallback` */\nexport type ColorResolver = (value: string, fallback: Rgba) => Rgba;\n\n/** Splits the arguments of `var(--name, fallback)` (the fallback may contain commas) */\nconst parseVar = (\n value: string,\n): { name: string; fallback?: string } | null => {\n const match = /^var\\(\\s*(--[\\w-]+)\\s*(?:,([\\s\\S]*))?\\)$/.exec(value.trim());\n if (!match) return null;\n const fallback = match[2]?.trim();\n return { name: match[1], ...(fallback ? { fallback } : {}) };\n};\n\n/**\n * Resolves a color without a DOM (mini-programs, React Native, workers):\n * hex, `rgb()`, `transparent` and `var(--name, fallback)` looked up in\n * `variables` (nested fallbacks included).\n */\nexport const resolveStaticColor = (\n value: string,\n variables: Readonly<Record<string, string>> = {},\n fallback: Rgba = [0.4, 0.4, 0.4, 1],\n depth = 0,\n): Rgba => {\n const direct = parseColor(value);\n if (direct) return direct;\n const ref = depth < 8 ? parseVar(value) : null;\n if (ref) {\n const defined = variables[ref.name];\n if (defined)\n return resolveStaticColor(defined, variables, fallback, depth + 1);\n if (ref.fallback)\n return resolveStaticColor(ref.fallback, variables, fallback, depth + 1);\n }\n return NAMED[value.trim().toLowerCase()] ?? fallback;\n};\n\nconst NAMED: Record<string, Rgba> = {\n black: [0, 0, 0, 1],\n white: [1, 1, 1, 1],\n red: [1, 0, 0, 1],\n green: [0, 128 / 255, 0, 1],\n blue: [0, 0, 1, 1],\n gray: [128 / 255, 128 / 255, 128 / 255, 1],\n grey: [128 / 255, 128 / 255, 128 / 255, 1],\n orange: [1, 165 / 255, 0, 1],\n};\n\n/** Resolver of the DOM: CSS variables and any CSS color syntax of `element` */\nexport const domColorResolver =\n (element: Element | null): ColorResolver =>\n (value, fallback) =>\n resolveColor(value, element, fallback);\n\n/** A resolver remembering its results; `null` marks unresolvable colors */\nexport interface MemoizedColorResolver extends ColorResolver {\n readonly cache: ReadonlyMap<string, Rgba | null>;\n}\n\nconst UNRESOLVED: Rgba = [NaN, NaN, NaN, NaN];\n\n/**\n * Caches the colors of `resolve` by input string (DOM probes force a style\n * recalculation). `resolve` must return `fallback` itself when it cannot\n * resolve a color, as the resolvers of this module do. Create a new one to\n * invalidate it (e.g. when the theme changes).\n */\nexport const memoizeColorResolver = (\n resolve: ColorResolver,\n): MemoizedColorResolver => {\n const cache = new Map<string, Rgba | null>();\n const memoized = (value: string, fallback: Rgba): Rgba => {\n let hit = cache.get(value);\n if (hit === undefined) {\n const resolved = resolve(value, UNRESOLVED);\n hit = resolved === UNRESOLVED ? null : resolved;\n cache.set(value, hit);\n }\n return hit ?? fallback;\n };\n return Object.assign(memoized, { cache });\n};\n\n/** Same channels (both `null` included) */\nexport const sameColor = (a: Rgba | null, b: Rgba | null): boolean =>\n a === b ||\n (!!a &&\n !!b &&\n a[0] === b[0] &&\n a[1] === b[1] &&\n a[2] === b[2] &&\n a[3] === b[3]);\n\nconst hex2 = (v: number) =>\n Math.round(clamp01(v) * 255)\n .toString(16)\n .padStart(2, \"0\");\n\n/** `rgba()` string usable by Canvas2D and the DOM */\nexport const toCss = (c: Rgba, alpha = 1): string =>\n `rgba(${Math.round(c[0] * 255)}, ${Math.round(c[1] * 255)}, ${Math.round(c[2] * 255)}, ${+(c[3] * alpha).toFixed(3)})`;\n\n/** `#rrggbb` (alpha dropped) */\nexport const toHex = (c: Rgba): string =>\n `#${hex2(c[0])}${hex2(c[1])}${hex2(c[2])}`;\n\n/** Packs a color as little-endian `unorm8x4` (r in the lowest byte) */\nexport const packColor = (c: Rgba): number =>\n ((Math.round(clamp01(c[3]) * 255) << 24) |\n (Math.round(clamp01(c[2]) * 255) << 16) |\n (Math.round(clamp01(c[1]) * 255) << 8) |\n Math.round(clamp01(c[0]) * 255)) >>>\n 0;\n\n/** Mixes two colors (t = 0 -> a, 1 -> b) */\nexport const mix = (a: Rgba, b: Rgba, t: number): Rgba => [\n a[0] + (b[0] - a[0]) * t,\n a[1] + (b[1] - a[1]) * t,\n a[2] + (b[2] - a[2]) * t,\n a[3] + (b[3] - a[3]) * t,\n];\n\n/** Inverse of `packColor` */\nexport const unpackColor = (packed: number): Rgba => [\n (packed & 0xff) / 255,\n ((packed >>> 8) & 0xff) / 255,\n ((packed >>> 16) & 0xff) / 255,\n ((packed >>> 24) & 0xff) / 255,\n];\n\n/** Color at `t` (0-1) of a ramp through `stops` */\nexport const rampColor = (stops: readonly Rgba[], t: number): Rgba => {\n if (stops.length === 1) return stops[0];\n const p = clamp01(t) * (stops.length - 1);\n const i = Math.min(stops.length - 2, Math.floor(p));\n return mix(stops[i], stops[i + 1], p - i);\n};\n\n/** Relative luminance (sRGB approximation) */\nexport const luminance = (c: Rgba): number =>\n 0.2126 * c[0] + 0.7152 * c[1] + 0.0722 * c[2];\n"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const e=require("./data.cjs"),t=require("./color.cjs"),n=require("./curve.cjs"),r=require("./layout.cjs"),i=require("./model.cjs"),a=require("./overlay.cjs"),o=require("./decimate.cjs"),s=require("./scene.cjs"),c=require("./theme.cjs"),l=require("./viewport.cjs");var u=e=>({x:[e.x[0],e.x[1]],y:[e.y[0],e.y[1]]}),d=6,f=10,p=320,m=20,h=e=>{let t=e.options,n=e.theme,o=c.createTheme(n,t.palette),h=new Map,g=new Set,_={},v,y={x:[0,1],y:[0,1]},b=!1,x=0,S=0,C=[],w=null,T=!0,E=``,D=!1,O=null,k=new Map,A=null,j={time:0,x:0,y:0},M=(e,t)=>{_[e]?.forEach(e=>e(t))},N=()=>{T=!0,D||e.onInvalidate?.()},P=()=>{let e=t.interaction;if(e===!1)return null;let n=typeof e==`object`?e:{};return{pan:n.pan??!0,dragPoints:n.dragPoints??!1}},F=(t,n=o.fontSize,r=400)=>e.measureText(t,a.font(o,n,r)),I=()=>{v=i.buildModel(t,o,g,h);let{base:e,minSpan:n}=v;b?(y={x:v.zoom.x?l.clampRange(y.x,e.x,n.x):[...e.x],y:v.zoom.y?l.clampRange(y.y,e.y,n.y):[...e.y]},b=!l.sameRange(y.x,e.x)||!l.sameRange(y.y,e.y)):y=u(e),C=s.resolveAnnotations(t.annotations,o),O&&(O.event.items.every(e=>v.series[e.seriesIndex]&&!v.series[e.seriesIndex].hidden&&e.index<v.series[e.seriesIndex].cols.count)||H(null)),N()},L=()=>{let e=t.legend,n=t.series.filter(e=>e.name).length;if(!(e===void 0?n>1:e))return null;let r=typeof e==`object`?e:{},i=r.position===`bottom`?`bottom`:`top`,a=[],o=4,c=0;for(let e of v.series){let t=14+F(e.name,12)+8;o+t>x-4&&o>4&&(o=4,c++),a.push({id:e.id,name:e.name,color:e.colorCss,shape:s.legendShape(e.type),hidden:e.hidden,box:{x:o,y:c*m,width:t,height:m}}),o+=t+10}let l=(c+1)*m+6;if(i===`bottom`)for(let e of a)e.box.y+=S-l+6;return{entries:a,position:i,toggle:r.toggle??!0,height:l}},R=(e,n,r)=>{let i=t.tooltip;if(i===!1)return null;let a=typeof i==`object`?i.render:void 0,o=null;if(a){let t=a(e);if(t===null||t===``)return null;typeof t==`string`&&(o=t.split(`
|
|
2
|
+
`))}let c=s.tooltipContent(v,e,w?.layout.yTicks??null),l=0,u;if(o){for(let e of o)l=Math.max(l,F(e,12));u=o.length}else{l=F(c.title,12,600)+(c.titleColor?14:0);for(let e of c.rows)l=Math.max(l,(e.color?14:0)+F(e.name,12)+16+F(e.value,12,600));u=1+c.rows.length}let d=Math.ceil(Math.max(l,96)+16+4),f=u*18+16,p=n+14;p+d>x-4&&(p=n-14-d),p=Math.max(4,Math.min(p,x-d-4));let m=Math.max(4,Math.min(r-f/2,S-f-4));return{content:c,text:o,box:{x:p,y:m,width:d,height:f},lineHeight:18,padding:8}},z=()=>{if(x<=0||S<=0)return null;let e=L(),n=e?.position===`top`?e.height:0,r=s.layoutChart({model:v,view:y,theme:o,width:x,height:S-(e?.height??0),padding:t.padding,top:n,measure:e=>F(e)}),i=s.collectPointLabels(v,y,r.scales,r.yTicks),c=[],l=o.fontSize+4;for(let e of C){if(e.type===`text`&&e.text){c.push(a.textBox(e,r.scales,F(e.text,o.fontSize,e.weight),l));continue}if(e.type!==`rect`||!e.label)continue;let t=r.scales,n=e.x0===void 0?r.plot.x:t.xToPx(e.x0),i=e.x1===void 0?r.plot.x+r.plot.width:t.xToPx(e.x1),s=e.y0===void 0?r.plot.y+r.plot.height:t.yToPx(e.y0),u=e.y1===void 0?r.plot.y:t.yToPx(e.y1),d=F(e.label,o.fontSize+1,600),f=Math.min(n,i),p=Math.max(n,i),m=Math.min(s,u),h=Math.max(s,u),g=e.labelPosition;c.push({x:g.endsWith(`left`)?f+10:g.endsWith(`right`)?p-10-d:(f+p-d)/2,y:g.startsWith(`top`)?m+10:g.startsWith(`bottom`)?h-10-l:(m+h-l)/2,width:d,height:l})}let d=a.placeLabels(i,r.plot,e=>F(e),l-2,c),f={width:x,height:S,theme:o,model:v,view:u(y),layout:r,annotations:C,pointLabels:d,legend:e,hover:null,dragging:null};if(w=f,O){let e=s.showsCrosshair(v,O.event,t.crosshair),n=r.scales.xToPx(O.event.items[0].x);f.hover={event:O.event,marks:s.hoverMarks(v,r.scales,O.event),crosshairX:e&&n>=r.plot.x&&n<=r.plot.x+r.plot.width?n:null,tooltip:A?.kind===`pan`||A?.kind===`point`?null:R(O.event,O.x,O.y)}}if(A?.kind===`point`){let e=v.series[A.item.seriesIndex];f.dragging={x:A.x,y:A.y,color:A.item.color,size:(e?s.dotSize(e,A.item.index):8)+6}}let p=r.plot,m=`${p.x},${p.y},${p.width},${p.height}`;return m!==E&&(E=m,M(`layout`,{...p})),f},B=()=>((T||!w)&&(T=!1,w=z()),w),V=()=>B()?.layout.scales??null,H=e=>{let t=!s.sameHover(O?.event??null,e?.event??null);O=e,N(),t&&M(`hover`,e?e.event:null)},U=(e,t,n)=>{let r=V();return r?s.hitTest(v,r,w?.layout.xTicks??null,e,t,n?8:0):null},W=(e,t)=>{let n=V()?.plot;return!!n&&e>=n.x&&e<=n.x+n.width&&t>=n.y&&t<=n.y+n.height},G=(e,t)=>{let n=V();if(!n)return null;let{plot:r}=n,i=Math.max(r.x,Math.min(r.x+r.width,e)),a=Math.max(r.y,Math.min(r.y+r.height,t));return{x:n.pxToX(i),y:n.pxToY(a)}},K=(e,t)=>{let{base:n,minSpan:r}=v;y={x:l.clampRange(e.x,n.x,r.x),y:l.clampRange(e.y,n.y,r.y)},b=!l.sameRange(y.x,n.x)||!l.sameRange(y.y,n.y),t&&M(`zoom`,u(y)),N()},q=(e,t,n)=>{let r=V();if(!r||!v.zoom.x&&!v.zoom.y)return;let i=u(y);v.zoom.x&&(i.x=l.zoomRange(y.x,r.pxToX(e),n)),v.zoom.y&&(i.y=l.zoomRange(y.y,r.pxToY(t),n)),K(i,!0)},J=()=>{b&&K(u(v.base),!0)},Y=(e,t)=>B()?.legend?.entries.find(n=>e>=n.box.x&&e<=n.box.x+n.box.width&&t>=n.box.y&&t<=n.box.y+n.box.height)??null,X=e=>{g.has(e)?g.delete(e):g.add(e),I()},Z=()=>{let[e,t]=[...k.values()];A={kind:`pinch`,view:u(y),distance:Math.max(1,Math.hypot(e.x-t.x,e.y-t.y)),midX:(e.x+t.x)/2,midY:(e.y+t.y)/2},H(null)};return v=i.buildModel(t,o,g,h),I(),{setOptions(e){if(D)return;let r=(e.palette??[]).join()!==(t.palette??[]).join();t=e,r&&(o=c.createTheme(n,t.palette)),I()},setTheme(e){D||(n=e,o=c.createTheme(n,t.palette),I())},setSize(e,t){(e!==x||t!==S)&&(x=Math.max(0,e),S=Math.max(0,t),N())},getScene:B,pointerDown:(e,t,n={})=>{if(D)return;let r=n.id??0,i=!!n.touch;k.set(r,{x:e,y:t,startX:e,startY:t,touch:i,moved:!1});let a=P();if(k.size===2){a&&(v.zoom.x||v.zoom.y)&&A?.kind!==`point`&&Z();return}if(k.size>2||!a){if(!a&&i){let n=U(e,t,!0);H(n?{event:n,x:e,y:t}:null)}return}if(a.dragPoints){let n=U(e,t,i)?.items.find(e=>v.series[e.seriesIndex].type===`scatter`);if(n){A={kind:`point`,item:n,x:e,y:t};return}}if(b&&a.pan&&W(e,t)){A={kind:`pan`,view:u(y),x:e,y:t};return}if(A=null,i){let n=U(e,t,!0);H(n?{event:n,x:e,y:t}:null)}},pointerMove:(e,t,n={})=>{if(D)return;let i=n.id??0,a=k.get(i);if(a&&(a.x=e,a.y=t,!a.moved&&Math.hypot(e-a.startX,t-a.startY)>(a.touch?f:d)&&(a.moved=!0)),A?.kind===`pinch`&&k.size>=2){let[e,t]=[...k.values()],n=Math.max(1,Math.hypot(e.x-t.x,e.y-t.y)),i=(e.x+t.x)/2,a=(e.y+t.y)/2,o=V();if(!o)return;let s=r.createScales(o.plot,A.view,v.x.reverse,v.y.reverse),c=A.distance/n,d=u(A.view);if(v.zoom.x){d.x=l.zoomRange(A.view.x,s.pxToX(A.midX),c);let e=(i-A.midX)*s.xPerPx*c;d.x=l.panRange(d.x,v.x.reverse?e:-e)}if(v.zoom.y){d.y=l.zoomRange(A.view.y,s.pxToY(A.midY),c);let e=(a-A.midY)*s.yPerPx*c;d.y=l.panRange(d.y,v.y.reverse?-e:e)}K(d,!0);return}if(A?.kind===`point`&&a){if(!a.moved)return;A.x=e,A.y=t;let n=G(e,t);N(),n&&M(`drag`,{item:A.item,x:n.x,y:n.y});return}if(A?.kind===`pan`&&a){if(!a.moved)return;let n=V();if(!n)return;let r=e-A.x,i=t-A.y,o=u(A.view);v.zoom.x&&(o.x=l.panRange(A.view.x,-r*n.xPerPx*(v.x.reverse?-1:1))),v.zoom.y&&(o.y=l.panRange(A.view.y,i*n.yPerPx*(v.y.reverse?-1:1))),K(o,!0);return}if(!(k.size>1)&&(!a||a.touch||!n.touch)){let r=U(e,t,!!a?.touch||!!n.touch);(r||!a?.touch)&&H(r?{event:r,x:e,y:t}:null)}},pointerUp:(e,t,n={})=>{if(D)return;let r=n.id??0,i=k.get(r);k.delete(r);let a=A;if(a?.kind===`pinch`){k.size<2&&(A=null);return}if(A=null,!i)return;if(a?.kind===`point`){if(i.moved){let n=G(e,t);N(),n&&M(`drop`,{item:a.item,x:n.x,y:n.y});return}}else if(a?.kind===`pan`&&i.moved){N();return}if(i.moved){i.touch&&N();return}let o=Date.now();if(i.touch&&o-j.time<p&&Math.hypot(e-j.x,t-j.y)<24&&b){j={time:0,x:e,y:t},J();return}j={time:o,x:e,y:t};let s=Y(e,t);if(s){B()?.legend?.toggle&&X(s.id);return}let c=U(e,t,i.touch);if(c){i.touch&&H({event:c,x:e,y:t}),M(`click`,c);return}if(i.touch&&H(null),W(e,t)){let n=G(e,t);n&&M(`plotClick`,n)}},pointerCancel:(e={})=>{k.delete(e.id??0),(A?.kind===`point`||k.size<2)&&(A=null),N()},pointerLeave(){!A&&O&&H(null)},zoomAt:q,resetZoom:J,getView:()=>u(y),setView(e){D||K({x:e.x??y.x,y:e.y??y.y},!1)},toggleSeries:X,clearHover(){O&&H(null)},getPlotRect(){let e=B()?.layout.plot;return e?{...e}:null},toPixel(e,t){let n=V();return n?{x:n.xToPx(e),y:n.yToPx(t)}:null},fromPixel(e,t){let n=V();return n?{x:n.pxToX(e),y:n.pxToY(t)}:null},on(e,t){let n=_[e];return n||(n=new Set,_[e]=n),n.add(t),()=>{n.delete(t)}},destroy(){D=!0,k.clear();for(let e of Object.keys(_))delete _[e]}}},g=(t,n,r,i)=>{if(!r)return[0,n];let[a,o]=i[0]<=i[1]?i:[i[1],i[0]];return[Math.max(0,e.lowerBound(t,n,a)-1),Math.min(n,e.lowerBound(t,n,o)+1)]},_={heatmap:0,area:1,bar:2,candlestick:3,line:4,scatter:5},v=(e,r={})=>{let{model:i,view:a,layout:c}=e,l=c.scales,{plot:u}=c,d=r.maxDots??4e3,f=r.maxBars??2e3,p=Math.max(1,r.columnWidth??1),m=[],h=i.series.filter(e=>!e.hidden&&e.cols.count>0).sort((e,t)=>_[e.type]-_[t.type]||e.index-t.index);for(let e of h){let{x:c,y:h,count:_,sorted:v}=e.cols;if(e.type===`line`||e.type===`area`){let[t,r]=g(c,_,v,a.x),s=e.stackTop??h,d=n.curvePoints(c,s,t,r,e.curve),f=e.stackBase?n.curvePoints(c,e.stackBase,t,r,e.curve).points:null,y=d.length,b=d.points,x=f;if(v&&y>u.width*2/p){if(f){let e=o.decimateMinMax(b,0,y,e=>l.xToPx(e)/p),t=new Float64Array(e.length*2),n=new Float64Array(e.length*2),r=0,i=0;for(let a=0;a<e.length;a++){let o=e.points[a*2];for(;i<y-1&&b[i*2]<o;)i++;t[r*2]=o,t[r*2+1]=e.points[a*2+1],n[r*2]=o,n[r*2+1]=f[i*2+1],r++}b=t,x=n,y=r}else{let e=o.decimateMinMax(b,0,y,e=>l.xToPx(e)/p);b=e.points,y=e.length}}let S=[],C=[],w=[],T=[];for(let e=0;e<y;e++){let t=b[e*2],n=b[e*2+1],r=x?x[e*2+1]:0;if(!Number.isFinite(t)||!Number.isFinite(n)||!Number.isFinite(r)){w.length&&(S.push(w),C.push(T)),w=[],T=[];continue}w.push(l.xToPx(t),l.yToPx(n)),x&&T.push(l.yToPx(r))}w.length&&(S.push(w),C.push(T)),e.type===`area`&&m.push({kind:`area`,seriesIndex:e.index,color:e.colorCss,opacity:e.opacity,baseline:l.yToPx(i.baseline),segments:S,...x?{bottoms:C}:{}}),m.push({kind:`line`,seriesIndex:e.index,color:e.colorCss,width:e.type===`area`?Math.min(e.lineWidth,2):e.lineWidth,segments:S});continue}if(e.type===`bar`&&e.barBase&&e.barTop){let[n,r]=g(c,_,v,a.x),i=Math.max(e.barHalfWidth/l.xPerPx,.5),o=[],s=[],d=r-n>f,p=NaN;for(let a=n;a<r;a++){let n=e.barBase[a],r=e.barTop[a];if(!Number.isFinite(n)||!Number.isFinite(r))continue;let f=l.xToPx(c[a]+e.barOffset);if(f+i<u.x||f-i>u.x+u.width)continue;let m=l.yToPx(n),h=l.yToPx(r),g=Math.min(m,h),_=Math.max(1,Math.abs(m-h)),v=Math.floor(f);if(d&&v===p&&o.length){let e=o.length-4,t=Math.max(o[e+1]+o[e+3],g+_);o[e+1]=Math.min(o[e+1],g),o[e+3]=t-o[e+1];continue}p=v,o.push(f-i,g,i*2,_);let y=e.pointColors?.[a];s.push(y?t.toCss(y):e.colorCss)}m.push({kind:`bars`,seriesIndex:e.index,color:e.colorCss,rects:o,...e.pointColors?{colors:s}:{},radius:e.radius});continue}if(e.type===`candlestick`){let[n,r]=g(c,_,v,a.x),{open:i,high:o,low:s}=e.cols,d=Math.max(e.barHalfWidth/l.xPerPx,1),p=t.toCss(e.upColor),y=t.toCss(e.downColor),b=[],x=[],S=[],C=[],w=Math.max(1,Math.ceil((r-n)/f));for(let e=n;e<r;e+=w){let t=h[e],n=i?i[e]:t;if(!Number.isFinite(t)||!Number.isFinite(n))continue;let r=l.xToPx(c[e]);if(r+d<u.x||r-d>u.x+u.width)continue;let a=t<n?y:p,f=l.yToPx(o?o[e]:Math.max(n,t)),m=l.yToPx(s?s[e]:Math.min(n,t));b.push(r-.5,Math.min(f,m),1,Math.abs(m-f)),S.push(a);let g=l.yToPx(n),_=l.yToPx(t);x.push(r-d,Math.min(g,_),d*2,Math.max(1,Math.abs(g-_))),C.push(a)}m.push({kind:`bars`,seriesIndex:e.index,color:p,rects:b,colors:S},{kind:`bars`,seriesIndex:e.index,color:p,rects:x,colors:C,radius:1});continue}if(e.type===`heatmap`){let n=Math.abs(e.cellHalf.x/l.xPerPx),r=Math.abs(e.cellHalf.y/l.yPerPx),i=[],a=[],o=+(n>3&&r>3);for(let s=0;s<_&&i.length/4<f*4;s++){let d=e.cellColors?.[s];if(!d)continue;let f=l.xToPx(c[s]),p=l.yToPx(h[s]);f+n<u.x||f-n>u.x+u.width||p+r<u.y||p-r>u.y+u.height||(i.push(f-n+o,p-r+o,n*2-o*2,r*2-o*2),a.push(t.toCss(t.unpackColor(d))))}m.push({kind:`bars`,seriesIndex:e.index,color:e.colorCss,rects:i,colors:a,radius:e.radius});continue}let y=[],b=[],x=n=>{let r=e.pointColors?.[n];return r?t.toCss(r):e.colorCss},S=[];for(let e=0;e<_;e++){let t=c[e],n=h[e];if(!Number.isFinite(t)||!Number.isFinite(n))continue;let r=l.xToPx(t),i=l.yToPx(n);r<u.x||r>u.x+u.width||i<u.y||i>u.y+u.height||S.push(e)}if(S.length>d){let t=Math.max(2,r.dotCell??e.pointSize*.8),n=Math.ceil(u.width/t)+1,i=new Map;for(let e of S){let r=Math.floor((l.xToPx(c[e])-u.x)/t),a=Math.floor((l.yToPx(h[e])-u.y)/t);i.set(a*n+r,e)}for(let[e,r]of i)y.push(u.x+(e%n+.5)*t,u.y+(Math.floor(e/n)+.5)*t,t),b.push(x(r))}else for(let t of S)y.push(l.xToPx(c[t]),l.yToPx(h[t]),s.dotSize(e,t)),b.push(x(t));m.push({kind:`dots`,seriesIndex:e.index,opacity:e.opacity,dots:y,colors:b})}return m};exports.createChartController=h,exports.scenePrimitives=v;
|
|
3
|
+
//# sourceMappingURL=controller.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.cjs","names":["createTheme","font","buildModel","clampRange","sameRange","resolveAnnotations","legendShape","tooltipContent","layoutChart","collectPointLabels","textBox","placeLabels","showsCrosshair","hoverMarks","dotSize","sameHover","hitTest","zoomRange","createScales","panRange","lowerBound","curvePoints","decimateMinMax","toCss","unpackColor","require_data","require_color","require_curve","require_layout","require_model","require_overlay","require_decimate","require_scene","require_theme","require_viewport","copyView","v","TAP_SLOP","TOUCH_SLOP","DOUBLE_TAP_MS","LEGEND_ROW","createChartController","options","config","themeInput","theme","cache","hidden","listeners","model","view","zoomed","width","height","annotations","scene","sceneDirty","lastPlot","destroyed","hover","pointers","gesture","lastTap","emit","type","listener","event","invalidate","interaction","value","o","measure","text","size","weight","rebuild","base","minSpan","it","setHover","legendLayout","option","named","s","cfg","position","entries","x","row","w","legendHeight","tooltipLayout","tooltip","custom","result","content","lines","line","boxW","boxH","left","anchorX","top","anchorY","computeScene","legend","legendTop","layout","labels","occupied","labelHeight","a","x0","x1","y0","y1","right","bottom","pos","pointLabels","t","next","crosshair","cx","rect","key","getScene","scales","changed","hitAt","sc","y","touch","inPlot","p","dataAt","plot","cy","setViewInternal","notify","zoomAt","factor","resetZoom","legendAt","e","toggleSeries","id","startPinch","b","paletteChanged","h","item","i","distance","midX","midY","start","shift","at","dx","dy","current","now","hit","set","visibleRange","sorted","count","range","ORDER","scenePrimitives","maxDots","limits","maxBars","column","out","series","end","curved","n","points","bottoms","d","nextBottom","k","j","xv","segments","bottomSegments","run","runBottom","yv","bv","half","rects","colors","merge","lastCol","ya","yb","col","pc","up","down","wicks","bodies","wickColors","bodyColors","step","c","open","color","hi","high","lo","low","hw","hh","inset","dots","colorOf","visible","px","py","cell","cols","owner"],"sources":["../../../../charts/src/engine/controller.ts"],"sourcesContent":["// createChartController: the platform-free chart. It owns the options, the\n// theme, the model, the visible range and the interactions (pointer / touch\n// gestures fed by the host) and describes what to draw (`getScene`). Hosts\n// only draw: createCanvasChart on any 2D context, the React Native charts\n// with views.\n\nimport { toCss, unpackColor } from \"./color\";\nimport { curvePoints } from \"./curve\";\nimport { lowerBound } from \"./data\";\nimport { decimateMinMax } from \"./decimate\";\nimport { createScales, type Rect } from \"./layout\";\nimport { buildModel, type ChartModel, type DataCache } from \"./model\";\nimport {\n font,\n placeLabels,\n textBox,\n type PointLabel,\n type ResolvedAnnotation,\n} from \"./overlay\";\nimport {\n collectPointLabels,\n dotSize,\n hitTest,\n hoverMarks,\n layoutChart,\n legendShape,\n resolveAnnotations,\n sameHover,\n showsCrosshair,\n tooltipContent,\n type ChartLayout,\n type HoverMark,\n type TooltipContent,\n} from \"./scene\";\nimport { createTheme, type ChartTheme, type ChartThemeInput } from \"./theme\";\nimport type {\n ChartEventMap,\n ChartHoverEvent,\n ChartHoverItem,\n ChartOptions,\n ChartPlotClickEvent,\n ChartRect,\n ChartView,\n} from \"./types\";\nimport {\n clampRange,\n panRange,\n sameRange,\n zoomRange,\n type Range,\n} from \"./viewport\";\n\n/** Events of a controller (no renderer events: hosts draw themselves) */\nexport type ChartControllerEventMap = Omit<ChartEventMap, \"renderer\">;\n\nexport interface ChartControllerConfig {\n options: ChartOptions;\n /** Colors and fonts (Minerva variables); light defaults when omitted */\n theme?: ChartThemeInput;\n /** Width in pixels of `text` drawn with the CSS `font` */\n measureText: (text: string, font: string) => number;\n /** Called when the scene changed and must be drawn again */\n onInvalidate?: () => void;\n}\n\nexport interface ChartLegendEntry {\n id: string;\n name: string;\n /** CSS color */\n color: string;\n shape: \"dot\" | \"line\" | \"square\";\n hidden: boolean;\n /** Hit / draw box of the entry, pixels of the chart */\n box: Rect;\n}\n\nexport interface ChartLegendLayout {\n entries: ChartLegendEntry[];\n position: \"top\" | \"bottom\";\n /** Whether a tap toggles the series */\n toggle: boolean;\n /** Height taken by the legend */\n height: number;\n}\n\nexport interface ChartTooltipLayout {\n /** Default content (`text` is set instead when `tooltip.render` returns a string) */\n content: TooltipContent;\n /** Lines of a custom string tooltip */\n text: string[] | null;\n /** Box of the tooltip, pixels of the chart */\n box: Rect;\n /** Line height used to lay the box out */\n lineHeight: number;\n padding: number;\n}\n\nexport interface ChartHoverLayout {\n event: ChartHoverEvent;\n marks: HoverMark[];\n /** X pixel of the guide line (`null` when hidden) */\n crosshairX: number | null;\n tooltip: ChartTooltipLayout | null;\n}\n\n/** Everything a host draws, in CSS pixels of the chart */\nexport interface ChartScene {\n width: number;\n height: number;\n theme: ChartTheme;\n model: ChartModel;\n view: ChartView;\n layout: ChartLayout;\n annotations: ResolvedAnnotation[];\n /** Labels of the dots that found a free slot */\n pointLabels: { label: PointLabel; box: Rect }[];\n legend: ChartLegendLayout | null;\n hover: ChartHoverLayout | null;\n /** Point being dragged (`interaction.dragPoints`) */\n dragging: { x: number; y: number; color: string; size: number } | null;\n}\n\nexport interface ChartPointerOptions {\n /** Pointer id (touch identifier); 0 by default */\n id?: number;\n /** Touch input: the tooltip follows the finger and stays after a tap */\n touch?: boolean;\n}\n\nexport interface ChartController {\n setOptions(options: ChartOptions): void;\n setTheme(theme: ChartThemeInput | undefined): void;\n /** Size of the chart in CSS pixels */\n setSize(width: number, height: number): void;\n /** What to draw (`null` until the size is known) */\n getScene(): ChartScene | null;\n pointerDown(x: number, y: number, options?: ChartPointerOptions): void;\n pointerMove(x: number, y: number, options?: ChartPointerOptions): void;\n pointerUp(x: number, y: number, options?: ChartPointerOptions): void;\n pointerCancel(options?: ChartPointerOptions): void;\n /** The mouse left the chart */\n pointerLeave(): void;\n /** Zooms around a pixel (factor < 1 zooms in) */\n zoomAt(x: number, y: number, factor: number): void;\n resetZoom(): void;\n getView(): ChartView;\n setView(view: Partial<ChartView>): void;\n /** Shows / hides a series (like a legend click) */\n toggleSeries(id: string): void;\n /** Hides the tooltip */\n clearHover(): void;\n getPlotRect(): ChartRect | null;\n toPixel(x: number, y: number): { x: number; y: number } | null;\n fromPixel(x: number, y: number): { x: number; y: number } | null;\n on<K extends keyof ChartControllerEventMap>(\n type: K,\n listener: (event: ChartControllerEventMap[K]) => void,\n ): () => void;\n destroy(): void;\n}\n\nconst copyView = (v: ChartView): ChartView => ({\n x: [v.x[0], v.x[1]],\n y: [v.y[0], v.y[1]],\n});\n\nconst TAP_SLOP = 6;\nconst TOUCH_SLOP = 10;\nconst DOUBLE_TAP_MS = 320;\nconst LEGEND_ROW = 20;\n\ninterface PointerState {\n x: number;\n y: number;\n startX: number;\n startY: number;\n touch: boolean;\n moved: boolean;\n}\n\nexport const createChartController = (\n config: ChartControllerConfig,\n): ChartController => {\n let options = config.options;\n let themeInput = config.theme;\n let theme = createTheme(themeInput, options.palette);\n const cache: DataCache = new Map();\n const hidden = new Set<string>();\n const listeners: {\n [K in keyof ChartControllerEventMap]?: Set<\n (event: ChartControllerEventMap[K]) => void\n >;\n } = {};\n let model: ChartModel;\n let view: ChartView = { x: [0, 1], y: [0, 1] };\n let zoomed = false;\n let width = 0;\n let height = 0;\n let annotations: ResolvedAnnotation[] = [];\n let scene: ChartScene | null = null;\n let sceneDirty = true;\n let lastPlot = \"\";\n let destroyed = false;\n\n let hover: { event: ChartHoverEvent; x: number; y: number } | null = null;\n const pointers = new Map<number, PointerState>();\n let gesture:\n | { kind: \"pan\"; view: ChartView; x: number; y: number }\n | {\n kind: \"pinch\";\n view: ChartView;\n distance: number;\n midX: number;\n midY: number;\n }\n | { kind: \"point\"; item: ChartHoverItem; x: number; y: number }\n | null = null;\n let lastTap = { time: 0, x: 0, y: 0 };\n\n const emit = <K extends keyof ChartControllerEventMap>(\n type: K,\n event: ChartControllerEventMap[K],\n ) => {\n listeners[type]?.forEach((listener) => listener(event));\n };\n\n const invalidate = () => {\n sceneDirty = true;\n if (!destroyed) config.onInvalidate?.();\n };\n\n const interaction = () => {\n const value = options.interaction;\n if (value === false) return null;\n const o = typeof value === \"object\" ? value : {};\n return {\n pan: o.pan ?? true,\n dragPoints: o.dragPoints ?? false,\n };\n };\n\n const measure = (text: string, size = theme.fontSize, weight = 400) =>\n config.measureText(text, font(theme, size, weight));\n\n const rebuild = () => {\n model = buildModel(options, theme, hidden, cache);\n const { base, minSpan } = model;\n if (!zoomed) {\n view = copyView(base);\n } else {\n view = {\n x: model.zoom.x ? clampRange(view.x, base.x, minSpan.x) : [...base.x],\n y: model.zoom.y ? clampRange(view.y, base.y, minSpan.y) : [...base.y],\n };\n zoomed = !sameRange(view.x, base.x) || !sameRange(view.y, base.y);\n }\n annotations = resolveAnnotations(options.annotations, theme);\n if (hover) {\n const stillThere = hover.event.items.every(\n (it) =>\n model.series[it.seriesIndex] &&\n !model.series[it.seriesIndex].hidden &&\n it.index < model.series[it.seriesIndex].cols.count,\n );\n if (!stillThere) setHover(null);\n }\n invalidate();\n };\n\n // --------------------------------------------------------------- legend\n\n const legendLayout = (): ChartLegendLayout | null => {\n const option = options.legend;\n const named = options.series.filter((s) => s.name).length;\n const show = option === undefined ? named > 1 : !!option;\n if (!show) return null;\n const cfg = typeof option === \"object\" ? option : {};\n const position = cfg.position === \"bottom\" ? \"bottom\" : \"top\";\n const entries: ChartLegendEntry[] = [];\n let x = 4;\n let row = 0;\n for (const s of model.series) {\n const w = 14 + measure(s.name, 12) + 8;\n if (x + w > width - 4 && x > 4) {\n x = 4;\n row++;\n }\n entries.push({\n id: s.id,\n name: s.name,\n color: s.colorCss,\n shape: legendShape(s.type),\n hidden: s.hidden,\n box: { x, y: row * LEGEND_ROW, width: w, height: LEGEND_ROW },\n });\n x += w + 10;\n }\n const legendHeight = (row + 1) * LEGEND_ROW + 6;\n if (position === \"bottom\") {\n for (const e of entries) e.box.y += height - legendHeight + 6;\n }\n return {\n entries,\n position,\n toggle: cfg.toggle ?? true,\n height: legendHeight,\n };\n };\n\n // ---------------------------------------------------------------- scene\n\n const tooltipLayout = (\n event: ChartHoverEvent,\n anchorX: number,\n anchorY: number,\n ): ChartTooltipLayout | null => {\n const tooltip = options.tooltip;\n if (tooltip === false) return null;\n const custom = typeof tooltip === \"object\" ? tooltip.render : undefined;\n let text: string[] | null = null;\n if (custom) {\n const result = custom(event);\n if (result === null || result === \"\") return null;\n if (typeof result === \"string\") text = result.split(\"\\n\");\n }\n const content = tooltipContent(model, event, scene?.layout.yTicks ?? null);\n const lineHeight = 18;\n const padding = 8;\n let w = 0;\n let lines: number;\n if (text) {\n for (const line of text) w = Math.max(w, measure(line, 12));\n lines = text.length;\n } else {\n w = measure(content.title, 12, 600) + (content.titleColor ? 14 : 0);\n for (const row of content.rows) {\n w = Math.max(\n w,\n (row.color ? 14 : 0) +\n measure(row.name, 12) +\n 16 +\n measure(row.value, 12, 600),\n );\n }\n lines = 1 + content.rows.length;\n }\n const boxW = Math.ceil(Math.max(w, 96) + padding * 2 + 4);\n const boxH = lines * lineHeight + padding * 2;\n let left = anchorX + 14;\n if (left + boxW > width - 4) left = anchorX - 14 - boxW;\n left = Math.max(4, Math.min(left, width - boxW - 4));\n const top = Math.max(4, Math.min(anchorY - boxH / 2, height - boxH - 4));\n return {\n content,\n text,\n box: { x: left, y: top, width: boxW, height: boxH },\n lineHeight,\n padding,\n };\n };\n\n const computeScene = (): ChartScene | null => {\n if (width <= 0 || height <= 0) return null;\n const legend = legendLayout();\n const legendTop = legend?.position === \"top\" ? legend.height : 0;\n const layout = layoutChart({\n model,\n view,\n theme,\n width,\n height: height - (legend?.height ?? 0),\n padding: options.padding,\n top: legendTop,\n measure: (text) => measure(text),\n });\n const labels = collectPointLabels(\n model,\n view,\n layout.scales,\n layout.yTicks,\n );\n const occupied: Rect[] = [];\n const labelHeight = theme.fontSize + 4;\n for (const a of annotations) {\n if (a.type === \"text\" && a.text) {\n occupied.push(\n textBox(\n a,\n layout.scales,\n measure(a.text, theme.fontSize, a.weight),\n labelHeight,\n ),\n );\n continue;\n }\n if (a.type !== \"rect\" || !a.label) continue;\n // keep the dot labels off the area titles (drawForeground does the same)\n const s = layout.scales;\n const x0 = a.x0 === undefined ? layout.plot.x : s.xToPx(a.x0);\n const x1 =\n a.x1 === undefined ? layout.plot.x + layout.plot.width : s.xToPx(a.x1);\n const y0 =\n a.y0 === undefined ? layout.plot.y + layout.plot.height : s.yToPx(a.y0);\n const y1 = a.y1 === undefined ? layout.plot.y : s.yToPx(a.y1);\n const w = measure(a.label, theme.fontSize + 1, 600);\n const left = Math.min(x0, x1);\n const right = Math.max(x0, x1);\n const top = Math.min(y0, y1);\n const bottom = Math.max(y0, y1);\n const pos = a.labelPosition;\n occupied.push({\n x: pos.endsWith(\"left\")\n ? left + 10\n : pos.endsWith(\"right\")\n ? right - 10 - w\n : (left + right - w) / 2,\n y: pos.startsWith(\"top\")\n ? top + 10\n : pos.startsWith(\"bottom\")\n ? bottom - 10 - labelHeight\n : (top + bottom - labelHeight) / 2,\n width: w,\n height: labelHeight,\n });\n }\n const pointLabels = placeLabels(\n labels,\n layout.plot,\n (t) => measure(t),\n labelHeight - 2,\n occupied,\n );\n const next: ChartScene = {\n width,\n height,\n theme,\n model,\n view: copyView(view),\n layout,\n annotations,\n pointLabels,\n legend,\n hover: null,\n dragging: null,\n };\n scene = next;\n if (hover) {\n const crosshair = showsCrosshair(model, hover.event, options.crosshair);\n const cx = layout.scales.xToPx(hover.event.items[0].x);\n next.hover = {\n event: hover.event,\n marks: hoverMarks(model, layout.scales, hover.event),\n crosshairX:\n crosshair &&\n cx >= layout.plot.x &&\n cx <= layout.plot.x + layout.plot.width\n ? cx\n : null,\n tooltip:\n gesture?.kind === \"pan\" || gesture?.kind === \"point\"\n ? null\n : tooltipLayout(hover.event, hover.x, hover.y),\n };\n }\n if (gesture?.kind === \"point\") {\n const s = model.series[gesture.item.seriesIndex];\n next.dragging = {\n x: gesture.x,\n y: gesture.y,\n color: gesture.item.color,\n size: (s ? dotSize(s, gesture.item.index) : 8) + 6,\n };\n }\n const rect = layout.plot;\n const key = `${rect.x},${rect.y},${rect.width},${rect.height}`;\n if (key !== lastPlot) {\n lastPlot = key;\n emit(\"layout\", { ...rect });\n }\n return next;\n };\n\n const getScene = () => {\n if (sceneDirty || !scene) {\n sceneDirty = false;\n scene = computeScene();\n }\n return scene;\n };\n\n // ---------------------------------------------------------- interaction\n\n const scales = () => getScene()?.layout.scales ?? null;\n\n const setHover = (\n next: { event: ChartHoverEvent; x: number; y: number } | null,\n ) => {\n const changed = !sameHover(hover?.event ?? null, next?.event ?? null);\n hover = next;\n invalidate();\n if (changed) emit(\"hover\", next ? next.event : null);\n };\n\n const hitAt = (x: number, y: number, touch: boolean) => {\n const sc = scales();\n return sc\n ? hitTest(model, sc, scene?.layout.xTicks ?? null, x, y, touch ? 8 : 0)\n : null;\n };\n\n const inPlot = (x: number, y: number) => {\n const p = scales()?.plot;\n return (\n !!p && x >= p.x && x <= p.x + p.width && y >= p.y && y <= p.y + p.height\n );\n };\n\n const dataAt = (x: number, y: number) => {\n const sc = scales();\n if (!sc) return null;\n const { plot } = sc;\n const cx = Math.max(plot.x, Math.min(plot.x + plot.width, x));\n const cy = Math.max(plot.y, Math.min(plot.y + plot.height, y));\n return { x: sc.pxToX(cx), y: sc.pxToY(cy) };\n };\n\n const setViewInternal = (next: ChartView, notify: boolean) => {\n const { base, minSpan } = model;\n view = {\n x: clampRange(next.x, base.x, minSpan.x),\n y: clampRange(next.y, base.y, minSpan.y),\n };\n zoomed = !sameRange(view.x, base.x) || !sameRange(view.y, base.y);\n if (notify) emit(\"zoom\", copyView(view));\n invalidate();\n };\n\n const zoomAt = (x: number, y: number, factor: number) => {\n const sc = scales();\n if (!sc || (!model.zoom.x && !model.zoom.y)) return;\n const next = copyView(view);\n if (model.zoom.x) next.x = zoomRange(view.x, sc.pxToX(x), factor);\n if (model.zoom.y) next.y = zoomRange(view.y, sc.pxToY(y), factor);\n setViewInternal(next, true);\n };\n\n const resetZoom = () => {\n if (!zoomed) return;\n setViewInternal(copyView(model.base), true);\n };\n\n const legendAt = (x: number, y: number) =>\n getScene()?.legend?.entries.find(\n (e) =>\n x >= e.box.x &&\n x <= e.box.x + e.box.width &&\n y >= e.box.y &&\n y <= e.box.y + e.box.height,\n ) ?? null;\n\n const toggleSeries = (id: string) => {\n if (hidden.has(id)) hidden.delete(id);\n else hidden.add(id);\n rebuild();\n };\n\n const startPinch = () => {\n const [a, b] = [...pointers.values()];\n gesture = {\n kind: \"pinch\",\n view: copyView(view),\n distance: Math.max(1, Math.hypot(a.x - b.x, a.y - b.y)),\n midX: (a.x + b.x) / 2,\n midY: (a.y + b.y) / 2,\n };\n setHover(null);\n };\n\n const pointerDown = (x: number, y: number, o: ChartPointerOptions = {}) => {\n if (destroyed) return;\n const id = o.id ?? 0;\n const touch = !!o.touch;\n pointers.set(id, { x, y, startX: x, startY: y, touch, moved: false });\n const it = interaction();\n if (pointers.size === 2) {\n if (it && (model.zoom.x || model.zoom.y) && gesture?.kind !== \"point\")\n startPinch();\n return;\n }\n if (pointers.size > 2 || !it) {\n if (!it && touch) {\n const event = hitAt(x, y, true);\n setHover(event ? { event, x, y } : null);\n }\n return;\n }\n if (it.dragPoints) {\n const item = hitAt(x, y, touch)?.items.find(\n (i) => model.series[i.seriesIndex].type === \"scatter\",\n );\n if (item) {\n gesture = { kind: \"point\", item, x, y };\n return;\n }\n }\n if (zoomed && it.pan && inPlot(x, y)) {\n gesture = { kind: \"pan\", view: copyView(view), x, y };\n return;\n }\n gesture = null;\n if (touch) {\n const event = hitAt(x, y, true);\n setHover(event ? { event, x, y } : null);\n }\n };\n\n const pointerMove = (x: number, y: number, o: ChartPointerOptions = {}) => {\n if (destroyed) return;\n const id = o.id ?? 0;\n const p = pointers.get(id);\n if (p) {\n p.x = x;\n p.y = y;\n if (\n !p.moved &&\n Math.hypot(x - p.startX, y - p.startY) >\n (p.touch ? TOUCH_SLOP : TAP_SLOP)\n )\n p.moved = true;\n }\n if (gesture?.kind === \"pinch\" && pointers.size >= 2) {\n const [a, b] = [...pointers.values()];\n const distance = Math.max(1, Math.hypot(a.x - b.x, a.y - b.y));\n const midX = (a.x + b.x) / 2;\n const midY = (a.y + b.y) / 2;\n const sc = scales();\n if (!sc) return;\n const start = createScales(\n sc.plot,\n gesture.view,\n model.x.reverse,\n model.y.reverse,\n );\n const factor = gesture.distance / distance;\n const next = copyView(gesture.view);\n if (model.zoom.x) {\n next.x = zoomRange(gesture.view.x, start.pxToX(gesture.midX), factor);\n const shift = (midX - gesture.midX) * start.xPerPx * factor;\n next.x = panRange(next.x, model.x.reverse ? shift : -shift);\n }\n if (model.zoom.y) {\n next.y = zoomRange(gesture.view.y, start.pxToY(gesture.midY), factor);\n const shift = (midY - gesture.midY) * start.yPerPx * factor;\n next.y = panRange(next.y, model.y.reverse ? -shift : shift);\n }\n setViewInternal(next, true);\n return;\n }\n if (gesture?.kind === \"point\" && p) {\n if (!p.moved) return;\n gesture.x = x;\n gesture.y = y;\n const at = dataAt(x, y);\n invalidate();\n if (at) emit(\"drag\", { item: gesture.item, x: at.x, y: at.y });\n return;\n }\n if (gesture?.kind === \"pan\" && p) {\n if (!p.moved) return;\n const sc = scales();\n if (!sc) return;\n const dx = x - gesture.x;\n const dy = y - gesture.y;\n const next = copyView(gesture.view);\n if (model.zoom.x)\n next.x = panRange(\n gesture.view.x,\n -dx * sc.xPerPx * (model.x.reverse ? -1 : 1),\n );\n if (model.zoom.y)\n next.y = panRange(\n gesture.view.y,\n dy * sc.yPerPx * (model.y.reverse ? -1 : 1),\n );\n setViewInternal(next, true);\n return;\n }\n if (pointers.size > 1) return;\n // mouse hover, or a finger scrubbing along the data\n if (!p || p.touch || !o.touch) {\n const event = hitAt(x, y, !!p?.touch || !!o.touch);\n if (event || !p?.touch) setHover(event ? { event, x, y } : null);\n }\n };\n\n const pointerUp = (x: number, y: number, o: ChartPointerOptions = {}) => {\n if (destroyed) return;\n const id = o.id ?? 0;\n const p = pointers.get(id);\n pointers.delete(id);\n const current = gesture;\n if (current?.kind === \"pinch\") {\n if (pointers.size < 2) gesture = null;\n return;\n }\n gesture = null;\n if (!p) return;\n if (current?.kind === \"point\") {\n if (p.moved) {\n const at = dataAt(x, y);\n invalidate();\n if (at) emit(\"drop\", { item: current.item, x: at.x, y: at.y });\n return;\n }\n } else if (current?.kind === \"pan\" && p.moved) {\n invalidate();\n return;\n }\n if (p.moved) {\n if (p.touch) invalidate();\n return;\n }\n // tap / click\n const now = Date.now();\n if (\n p.touch &&\n now - lastTap.time < DOUBLE_TAP_MS &&\n Math.hypot(x - lastTap.x, y - lastTap.y) < 24 &&\n zoomed\n ) {\n lastTap = { time: 0, x, y };\n resetZoom();\n return;\n }\n lastTap = { time: now, x, y };\n const legend = legendAt(x, y);\n if (legend) {\n if (getScene()?.legend?.toggle) toggleSeries(legend.id);\n return;\n }\n const hit = hitAt(x, y, p.touch);\n if (hit) {\n if (p.touch) setHover({ event: hit, x, y });\n emit(\"click\", hit);\n return;\n }\n if (p.touch) setHover(null);\n if (inPlot(x, y)) {\n const at = dataAt(x, y);\n if (at) emit(\"plotClick\", at as ChartPlotClickEvent);\n }\n };\n\n const pointerCancel = (o: ChartPointerOptions = {}) => {\n pointers.delete(o.id ?? 0);\n if (gesture?.kind === \"point\" || pointers.size < 2) gesture = null;\n invalidate();\n };\n\n model = buildModel(options, theme, hidden, cache);\n rebuild();\n\n return {\n setOptions(next) {\n if (destroyed) return;\n const paletteChanged =\n (next.palette ?? []).join() !== (options.palette ?? []).join();\n options = next;\n if (paletteChanged) theme = createTheme(themeInput, options.palette);\n rebuild();\n },\n setTheme(next) {\n if (destroyed) return;\n themeInput = next;\n theme = createTheme(themeInput, options.palette);\n rebuild();\n },\n setSize(w, h) {\n if (w === width && h === height) return;\n width = Math.max(0, w);\n height = Math.max(0, h);\n invalidate();\n },\n getScene,\n pointerDown,\n pointerMove,\n pointerUp,\n pointerCancel,\n pointerLeave() {\n if (!gesture && hover) setHover(null);\n },\n zoomAt,\n resetZoom,\n getView: () => copyView(view),\n setView(next) {\n if (destroyed) return;\n setViewInternal({ x: next.x ?? view.x, y: next.y ?? view.y }, false);\n },\n toggleSeries,\n clearHover() {\n if (hover) setHover(null);\n },\n getPlotRect() {\n const p = getScene()?.layout.plot;\n return p ? { ...p } : null;\n },\n toPixel(x, y) {\n const sc = scales();\n return sc ? { x: sc.xToPx(x), y: sc.yToPx(y) } : null;\n },\n fromPixel(x, y) {\n const sc = scales();\n return sc ? { x: sc.pxToX(x), y: sc.pxToY(y) } : null;\n },\n on(type, listener) {\n let set = listeners[type] as Set<typeof listener> | undefined;\n if (!set) {\n set = new Set();\n (listeners as Record<string, unknown>)[type] = set;\n }\n set.add(listener);\n return () => {\n set.delete(listener);\n };\n },\n destroy() {\n destroyed = true;\n pointers.clear();\n for (const key of Object.keys(listeners))\n delete (listeners as Record<string, unknown>)[key];\n },\n };\n};\n\n// ------------------------------------------------------------- primitives\n\n/** A polyline (pixels of the chart): interleaved x, y */\nexport interface ChartLinePrimitive {\n kind: \"line\";\n seriesIndex: number;\n color: string;\n width: number;\n /** Runs of points without gaps */\n segments: number[][];\n}\n\nexport interface ChartAreaPrimitive {\n kind: \"area\";\n seriesIndex: number;\n color: string;\n opacity: number;\n /** Y pixel of the baseline */\n baseline: number;\n segments: number[][];\n /** Stacked areas: y pixel of the bottom edge under every point of `segments` */\n bottoms?: number[][];\n}\n\nexport interface ChartBarPrimitive {\n kind: \"bars\";\n seriesIndex: number;\n color: string;\n /** Interleaved x, y, width, height */\n rects: number[];\n /** CSS color of every rect (candlesticks, heatmap cells, colored bars); `color` otherwise */\n colors?: string[];\n /** Corner radius in pixels */\n radius?: number;\n}\n\nexport interface ChartDotPrimitive {\n kind: \"dots\";\n seriesIndex: number;\n opacity: number;\n /** Interleaved x, y, diameter */\n dots: number[];\n /** CSS color of every dot */\n colors: string[];\n}\n\nexport type ChartPrimitive =\n | ChartLinePrimitive\n | ChartAreaPrimitive\n | ChartBarPrimitive\n | ChartDotPrimitive;\n\nexport interface ChartPrimitiveOptions {\n /**\n * Upper bound of the dots drawn per series: above it the dots are merged\n * into one per occupied cell of their size\n * @default 4000\n */\n maxDots?: number;\n /**\n * Upper bound of the bars drawn per series: above it neighboring bars\n * sharing a pixel column are merged\n * @default 2000\n */\n maxBars?: number;\n /**\n * Width in pixels of the columns lines are decimated to (at most four\n * points per column); larger values mean fewer shapes\n * @default 1\n */\n columnWidth?: number;\n /** Size of the cells dots are merged into (the dot size by default) */\n dotCell?: number;\n}\n\nconst visibleRange = (\n x: Float64Array,\n count: number,\n sorted: boolean,\n range: Range,\n): [number, number] => {\n if (!sorted) return [0, count];\n const [a, b] = range[0] <= range[1] ? range : [range[1], range[0]];\n return [\n Math.max(0, lowerBound(x, count, a) - 1),\n Math.min(count, lowerBound(x, count, b) + 1),\n ];\n};\n\nconst ORDER = {\n heatmap: 0,\n area: 1,\n bar: 2,\n candlestick: 3,\n line: 4,\n scatter: 5,\n} as const;\n\n/**\n * Data of a scene as simple shapes in pixels of the chart, for hosts\n * without a canvas (React Native views, SVG): lines are decimated to a few\n * points per pixel column and large point sets are merged per cell, so the\n * number of shapes stays bounded by the size of the chart.\n */\nexport const scenePrimitives = (\n scene: ChartScene,\n limits: ChartPrimitiveOptions = {},\n): ChartPrimitive[] => {\n const { model, view, layout } = scene;\n const sc = layout.scales;\n const { plot } = layout;\n const maxDots = limits.maxDots ?? 4000;\n const maxBars = limits.maxBars ?? 2000;\n const column = Math.max(1, limits.columnWidth ?? 1);\n const out: ChartPrimitive[] = [];\n const series = model.series\n .filter((s) => !s.hidden && s.cols.count > 0)\n .sort((a, b) => ORDER[a.type] - ORDER[b.type] || a.index - b.index);\n for (const s of series) {\n const { x, y, count, sorted } = s.cols;\n if (s.type === \"line\" || s.type === \"area\") {\n const [start, end] = visibleRange(x, count, sorted, view.x);\n const top = s.stackTop ?? y;\n // curve first (in data space), then decimation; the stacked bottom\n // edge follows the same sampling\n const curved = curvePoints(x, top, start, end, s.curve);\n const bottom = s.stackBase\n ? curvePoints(x, s.stackBase, start, end, s.curve).points\n : null;\n let n = curved.length;\n let points = curved.points;\n let bottoms = bottom;\n if (sorted && n > (plot.width * 2) / column) {\n if (bottom) {\n // keep the bottoms aligned with the kept tops (same x)\n const d = decimateMinMax(points, 0, n, (v) => sc.xToPx(v) / column);\n const next = new Float64Array(d.length * 2);\n const nextBottom = new Float64Array(d.length * 2);\n let k = 0;\n let j = 0;\n for (let i = 0; i < d.length; i++) {\n const xv = d.points[i * 2];\n while (j < n - 1 && points[j * 2] < xv) j++;\n next[k * 2] = xv;\n next[k * 2 + 1] = d.points[i * 2 + 1];\n nextBottom[k * 2] = xv;\n nextBottom[k * 2 + 1] = bottom[j * 2 + 1];\n k++;\n }\n points = next;\n bottoms = nextBottom;\n n = k;\n } else {\n const d = decimateMinMax(points, 0, n, (v) => sc.xToPx(v) / column);\n points = d.points;\n n = d.length;\n }\n }\n const segments: number[][] = [];\n const bottomSegments: number[][] = [];\n let run: number[] = [];\n let runBottom: number[] = [];\n for (let i = 0; i < n; i++) {\n const xv = points[i * 2];\n const yv = points[i * 2 + 1];\n const bv = bottoms ? bottoms[i * 2 + 1] : 0;\n if (\n !Number.isFinite(xv) ||\n !Number.isFinite(yv) ||\n !Number.isFinite(bv)\n ) {\n if (run.length) {\n segments.push(run);\n bottomSegments.push(runBottom);\n }\n run = [];\n runBottom = [];\n continue;\n }\n run.push(sc.xToPx(xv), sc.yToPx(yv));\n if (bottoms) runBottom.push(sc.yToPx(bv));\n }\n if (run.length) {\n segments.push(run);\n bottomSegments.push(runBottom);\n }\n if (s.type === \"area\") {\n out.push({\n kind: \"area\",\n seriesIndex: s.index,\n color: s.colorCss,\n opacity: s.opacity,\n baseline: sc.yToPx(model.baseline),\n segments,\n ...(bottoms ? { bottoms: bottomSegments } : {}),\n });\n }\n out.push({\n kind: \"line\",\n seriesIndex: s.index,\n color: s.colorCss,\n width: s.type === \"area\" ? Math.min(s.lineWidth, 2) : s.lineWidth,\n segments,\n });\n continue;\n }\n if (s.type === \"bar\" && s.barBase && s.barTop) {\n const [start, end] = visibleRange(x, count, sorted, view.x);\n const half = Math.max(s.barHalfWidth / sc.xPerPx, 0.5);\n const rects: number[] = [];\n const colors: string[] = [];\n const merge = end - start > maxBars;\n let lastCol = NaN;\n for (let i = start; i < end; i++) {\n const a = s.barBase[i];\n const b = s.barTop[i];\n if (!Number.isFinite(a) || !Number.isFinite(b)) continue;\n const cx = sc.xToPx(x[i] + s.barOffset);\n if (cx + half < plot.x || cx - half > plot.x + plot.width) continue;\n const ya = sc.yToPx(a);\n const yb = sc.yToPx(b);\n const top = Math.min(ya, yb);\n const h = Math.max(1, Math.abs(ya - yb));\n const col = Math.floor(cx);\n if (merge && col === lastCol && rects.length) {\n // widen the previous bar of the same pixel column vertically\n const k = rects.length - 4;\n const bottom = Math.max(rects[k + 1] + rects[k + 3], top + h);\n rects[k + 1] = Math.min(rects[k + 1], top);\n rects[k + 3] = bottom - rects[k + 1];\n continue;\n }\n lastCol = col;\n rects.push(cx - half, top, half * 2, h);\n const pc = s.pointColors?.[i];\n colors.push(pc ? toCss(pc) : s.colorCss);\n }\n out.push({\n kind: \"bars\",\n seriesIndex: s.index,\n color: s.colorCss,\n rects,\n ...(s.pointColors ? { colors } : {}),\n radius: s.radius,\n });\n continue;\n }\n if (s.type === \"candlestick\") {\n const [start, end] = visibleRange(x, count, sorted, view.x);\n const { open, high, low } = s.cols;\n const half = Math.max(s.barHalfWidth / sc.xPerPx, 1);\n const up = toCss(s.upColor);\n const down = toCss(s.downColor);\n const wicks: number[] = [];\n const bodies: number[] = [];\n const wickColors: string[] = [];\n const bodyColors: string[] = [];\n const step = Math.max(1, Math.ceil((end - start) / maxBars));\n for (let i = start; i < end; i += step) {\n const c = y[i];\n const o = open ? open[i] : c;\n if (!Number.isFinite(c) || !Number.isFinite(o)) continue;\n const cx = sc.xToPx(x[i]);\n if (cx + half < plot.x || cx - half > plot.x + plot.width) continue;\n const color = c < o ? down : up;\n const hi = sc.yToPx(high ? high[i] : Math.max(o, c));\n const lo = sc.yToPx(low ? low[i] : Math.min(o, c));\n wicks.push(cx - 0.5, Math.min(hi, lo), 1, Math.abs(lo - hi));\n wickColors.push(color);\n const ya = sc.yToPx(o);\n const yb = sc.yToPx(c);\n bodies.push(\n cx - half,\n Math.min(ya, yb),\n half * 2,\n Math.max(1, Math.abs(ya - yb)),\n );\n bodyColors.push(color);\n }\n out.push(\n {\n kind: \"bars\",\n seriesIndex: s.index,\n color: up,\n rects: wicks,\n colors: wickColors,\n },\n {\n kind: \"bars\",\n seriesIndex: s.index,\n color: up,\n rects: bodies,\n colors: bodyColors,\n radius: 1,\n },\n );\n continue;\n }\n if (s.type === \"heatmap\") {\n const hw = Math.abs(s.cellHalf.x / sc.xPerPx);\n const hh = Math.abs(s.cellHalf.y / sc.yPerPx);\n const rects: number[] = [];\n const colors: string[] = [];\n const inset = hw > 3 && hh > 3 ? 1 : 0;\n for (let i = 0; i < count && rects.length / 4 < maxBars * 4; i++) {\n const c = s.cellColors?.[i];\n if (!c) continue;\n const cx = sc.xToPx(x[i]);\n const cy = sc.yToPx(y[i]);\n if (\n cx + hw < plot.x ||\n cx - hw > plot.x + plot.width ||\n cy + hh < plot.y ||\n cy - hh > plot.y + plot.height\n )\n continue;\n rects.push(\n cx - hw + inset,\n cy - hh + inset,\n hw * 2 - inset * 2,\n hh * 2 - inset * 2,\n );\n colors.push(toCss(unpackColor(c)));\n }\n out.push({\n kind: \"bars\",\n seriesIndex: s.index,\n color: s.colorCss,\n rects,\n colors,\n radius: s.radius,\n });\n continue;\n }\n // scatter\n const dots: number[] = [];\n const colors: string[] = [];\n const colorOf = (i: number) => {\n const c = s.pointColors?.[i];\n return c ? toCss(c) : s.colorCss;\n };\n const visible: number[] = [];\n for (let i = 0; i < count; i++) {\n const xv = x[i];\n const yv = y[i];\n if (!Number.isFinite(xv) || !Number.isFinite(yv)) continue;\n const px = sc.xToPx(xv);\n const py = sc.yToPx(yv);\n if (\n px < plot.x ||\n px > plot.x + plot.width ||\n py < plot.y ||\n py > plot.y + plot.height\n )\n continue;\n visible.push(i);\n }\n if (visible.length > maxDots) {\n const cell = Math.max(2, limits.dotCell ?? s.pointSize * 0.8);\n const cols = Math.ceil(plot.width / cell) + 1;\n const owner = new Map<number, number>();\n for (const i of visible) {\n const cx = Math.floor((sc.xToPx(x[i]) - plot.x) / cell);\n const cy = Math.floor((sc.yToPx(y[i]) - plot.y) / cell);\n owner.set(cy * cols + cx, i);\n }\n for (const [key, i] of owner) {\n dots.push(\n plot.x + ((key % cols) + 0.5) * cell,\n plot.y + (Math.floor(key / cols) + 0.5) * cell,\n cell,\n );\n colors.push(colorOf(i));\n }\n } else {\n for (const i of visible) {\n dots.push(sc.xToPx(x[i]), sc.yToPx(y[i]), dotSize(s, i));\n colors.push(colorOf(i));\n }\n }\n out.push({\n kind: \"dots\",\n seriesIndex: s.index,\n opacity: s.opacity,\n dots,\n colors,\n });\n }\n return out;\n};\n"],"mappings":"wQAiKA,IAAMmC,EAAY,IAA6B,CAC7C,EAAG,CAACC,EAAE,EAAE,GAAIA,EAAE,EAAE,EAAE,EAClB,EAAG,CAACA,EAAE,EAAE,GAAIA,EAAE,EAAE,EAAE,CACpB,GAEMC,EAAW,EACXC,EAAa,GACbC,EAAgB,IAChBC,EAAa,GAWNC,EACX,GACoB,CACpB,IAAIC,EAAUC,EAAO,QACjBC,EAAaD,EAAO,MACpBE,EAAQ7C,EAAAA,YAAY4C,EAAYF,EAAQ,OAAO,EAC7CI,EAAmB,IAAI,IACvBC,EAAS,IAAI,IACbC,EAIF,CAAC,EACDC,EACAC,EAAkB,CAAE,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,CAAE,EACzCC,EAAS,GACTC,EAAQ,EACRC,EAAS,EACTC,EAAoC,CAAC,EACrCC,EAA2B,KAC3BC,EAAa,GACbC,EAAW,GACXC,EAAY,GAEZC,EAAiE,KAC/DC,EAAW,IAAI,IACjBC,EAUO,KACPC,EAAU,CAAE,KAAM,EAAG,EAAG,EAAG,EAAG,CAAE,EAE9BC,GACJ,EACA,IACG,CACHf,EAAUgB,EAAK,EAAE,QAAS,GAAaC,EAASC,CAAK,CAAC,CACxD,EAEMC,MAAmB,CACvB,EAAa,GACRT,GAAWf,EAAO,eAAe,CACxC,EAEMyB,MAAoB,CACxB,IAAMC,EAAQ3B,EAAQ,YACtB,GAAI2B,IAAU,GAAO,OAAO,KAC5B,IAAMC,EAAI,OAAOD,GAAU,SAAWA,EAAQ,CAAC,EAC/C,MAAO,CACL,IAAKC,EAAE,KAAO,GACd,WAAYA,EAAE,YAAc,EAC9B,CACF,EAEMC,GAAW,EAAc,EAAO1B,EAAM,SAAU,EAAS,MAC7DF,EAAO,YAAY6B,EAAMvE,EAAAA,KAAK4C,EAAO4B,EAAMC,CAAM,CAAC,EAE9CC,MAAgB,CACpB,EAAQzE,EAAAA,WAAWwC,EAASG,EAAOE,EAAQD,CAAK,EAChD,GAAM,CAAE,OAAM,WAAYG,EACrBE,GAGH,EAAO,CACL,EAAGF,EAAM,KAAK,EAAI9C,EAAAA,WAAW+C,EAAK,EAAG0B,EAAK,EAAGC,EAAQ,CAAC,EAAI,CAAC,GAAGD,EAAK,CAAC,EACpE,EAAG3B,EAAM,KAAK,EAAI9C,EAAAA,WAAW+C,EAAK,EAAG0B,EAAK,EAAGC,EAAQ,CAAC,EAAI,CAAC,GAAGD,EAAK,CAAC,CACtE,EACA,EAAS,CAACxE,EAAAA,UAAU8C,EAAK,EAAG0B,EAAK,CAAC,GAAK,CAACxE,EAAAA,UAAU8C,EAAK,EAAG0B,EAAK,CAAC,GANhE,EAAOzC,EAASyC,CAAI,EAQtB,EAAcvE,EAAAA,mBAAmBqC,EAAQ,YAAaG,CAAK,EACvDc,IACiBA,EAAM,MAAM,MAAM,MAClC,GACCV,EAAM,OAAO6B,EAAG,cAChB,CAAC7B,EAAM,OAAO6B,EAAG,YAAY,CAAC,QAC9BA,EAAG,MAAQ7B,EAAM,OAAO6B,EAAG,YAAY,CAAC,KAAK,KAE5C,GAAYC,EAAS,IAAI,GAEhCZ,EAAW,CACb,EAIMa,MAA+C,CACnD,IAAMC,EAASvC,EAAQ,OACjBwC,EAAQxC,EAAQ,OAAO,OAAQ,GAAMyC,EAAE,IAAI,CAAC,CAAC,OAEnD,GAAI,EADSF,IAAW,IAAA,GAAYC,EAAQ,EAAMD,GACvC,OAAO,KAClB,IAAMG,EAAM,OAAOH,GAAW,SAAWA,EAAS,CAAC,EAC7CI,EAAWD,EAAI,WAAa,SAAW,SAAW,MAClDE,EAA8B,CAAC,EACjCC,EAAI,EACJC,EAAM,EACV,IAAK,IAAML,KAAKlC,EAAM,OAAQ,CAC5B,IAAMwC,EAAI,GAAKlB,EAAQY,EAAE,KAAM,EAAE,EAAI,EACjCI,EAAIE,EAAIrC,EAAQ,GAAKmC,EAAI,IAC3B,EAAI,EACJ,KAEFD,EAAQ,KAAK,CACX,GAAIH,EAAE,GACN,KAAMA,EAAE,KACR,MAAOA,EAAE,SACT,MAAO7E,EAAAA,YAAY6E,EAAE,IAAI,EACzB,OAAQA,EAAE,OACV,IAAK,CAAE,IAAG,EAAGK,EAAMhD,EAAY,MAAOiD,EAAG,OAAQjD,CAAW,CAC9D,CAAC,EACD,GAAKiD,EAAI,EACX,CACA,IAAMC,GAAgBF,EAAM,GAAKhD,EAAa,EAC9C,GAAI6C,IAAa,SACf,IAAK,IAAM,KAAKC,EAAS,EAAE,IAAI,GAAKjC,EAASqC,EAAe,EAE9D,MAAO,CACL,UACA,WACA,OAAQN,EAAI,QAAU,GACtB,OAAQM,CACV,CACF,EAIMC,GACJ,EACA,EACA,IAC8B,CAC9B,IAAMC,EAAUlD,EAAQ,QACxB,GAAIkD,IAAY,GAAO,OAAO,KAC9B,IAAMC,EAAS,OAAOD,GAAY,SAAWA,EAAQ,OAAS,IAAA,GAC1DpB,EAAwB,KAC5B,GAAIqB,EAAQ,CACV,IAAMC,EAASD,EAAO3B,CAAK,EAC3B,GAAI4B,IAAW,MAAQA,IAAW,GAAI,OAAO,KACzC,OAAOA,GAAW,WAAU,EAAOA,EAAO,MAAM;CAAI,EAC1D,CACA,IAAMC,EAAUxF,EAAAA,eAAe0C,EAAOiB,EAAOX,GAAO,OAAO,QAAU,IAAI,EAGrEkC,EAAI,EACJO,EACJ,GAAIxB,EAAM,CACR,IAAK,IAAMyB,KAAQzB,EAAM,EAAI,KAAK,IAAIiB,EAAGlB,EAAQ0B,EAAM,EAAE,CAAC,EAC1D,EAAQzB,EAAK,MACf,KAAO,CACL,EAAID,EAAQwB,EAAQ,MAAO,GAAI,GAAG,GAAKA,EAAQ,WAAa,GAAK,GACjE,IAAK,IAAMP,KAAOO,EAAQ,KACxB,EAAI,KAAK,IACPN,GACCD,EAAI,MAAQ,GAAK,GAChBjB,EAAQiB,EAAI,KAAM,EAAE,EACpB,GACAjB,EAAQiB,EAAI,MAAO,GAAI,GAAG,CAC9B,EAEF,EAAQ,EAAIO,EAAQ,KAAK,MAC3B,CACA,IAAMG,EAAO,KAAK,KAAK,KAAK,IAAIT,EAAG,EAAE,EAAI,GAAc,CAAC,EAClDU,EAAOH,EAAQ,GAAa,GAC9BI,EAAOC,EAAU,GACjBD,EAAOF,EAAO9C,EAAQ,IAAG,EAAOiD,EAAU,GAAKH,GACnD,EAAO,KAAK,IAAI,EAAG,KAAK,IAAIE,EAAMhD,EAAQ8C,EAAO,CAAC,CAAC,EACnD,IAAMI,EAAM,KAAK,IAAI,EAAG,KAAK,IAAIC,EAAUJ,EAAO,EAAG9C,EAAS8C,EAAO,CAAC,CAAC,EACvE,MAAO,CACL,UACA,OACA,IAAK,CAAE,EAAGC,EAAM,EAAGE,EAAK,MAAOJ,EAAM,OAAQC,CAAK,EAClD,cACA,SACF,CACF,EAEMK,MAAwC,CAC5C,GAAIpD,GAAS,GAAKC,GAAU,EAAG,OAAO,KACtC,IAAMoD,EAASzB,EAAa,EACtB0B,EAAYD,GAAQ,WAAa,MAAQA,EAAO,OAAS,EACzDE,EAASnG,EAAAA,YAAY,CACzB,QACA,OACA,QACA,QACA,OAAQ6C,GAAUoD,GAAQ,QAAU,GACpC,QAAS/D,EAAQ,QACjB,IAAKgE,EACL,QAAU,GAASnC,EAAQC,CAAI,CACjC,CAAC,EACKoC,EAASnG,EAAAA,mBACbwC,EACAC,EACAyD,EAAO,OACPA,EAAO,MACT,EACME,EAAmB,CAAC,EACpBC,EAAcjE,EAAM,SAAW,EACrC,IAAK,IAAMkE,KAAKzD,EAAa,CAC3B,GAAIyD,EAAE,OAAS,QAAUA,EAAE,KAAM,CAC/BF,EAAS,KACPnG,EAAAA,QACEqG,EACAJ,EAAO,OACPpC,EAAQwC,EAAE,KAAMlE,EAAM,SAAUkE,EAAE,MAAM,EACxCD,CACF,CACF,EACA,QACF,CACA,GAAIC,EAAE,OAAS,QAAU,CAACA,EAAE,MAAO,SAEnC,IAAM5B,EAAIwB,EAAO,OACXK,EAAKD,EAAE,KAAO,IAAA,GAAYJ,EAAO,KAAK,EAAIxB,EAAE,MAAM4B,EAAE,EAAE,EACtDE,EACJF,EAAE,KAAO,IAAA,GAAYJ,EAAO,KAAK,EAAIA,EAAO,KAAK,MAAQxB,EAAE,MAAM4B,EAAE,EAAE,EACjEG,EACJH,EAAE,KAAO,IAAA,GAAYJ,EAAO,KAAK,EAAIA,EAAO,KAAK,OAASxB,EAAE,MAAM4B,EAAE,EAAE,EAClEI,EAAKJ,EAAE,KAAO,IAAA,GAAYJ,EAAO,KAAK,EAAIxB,EAAE,MAAM4B,EAAE,EAAE,EACtDtB,EAAIlB,EAAQwC,EAAE,MAAOlE,EAAM,SAAW,EAAG,GAAG,EAC5CuD,EAAO,KAAK,IAAIY,EAAIC,CAAE,EACtBG,EAAQ,KAAK,IAAIJ,EAAIC,CAAE,EACvBX,EAAM,KAAK,IAAIY,EAAIC,CAAE,EACrBE,EAAS,KAAK,IAAIH,EAAIC,CAAE,EACxBG,EAAMP,EAAE,cACdF,EAAS,KAAK,CACZ,EAAGS,EAAI,SAAS,MAAM,EAClBlB,EAAO,GACPkB,EAAI,SAAS,OAAO,EAClBF,EAAQ,GAAK3B,GACZW,EAAOgB,EAAQ3B,GAAK,EAC3B,EAAG6B,EAAI,WAAW,KAAK,EACnBhB,EAAM,GACNgB,EAAI,WAAW,QAAQ,EACrBD,EAAS,GAAKP,GACbR,EAAMe,EAASP,GAAe,EACrC,MAAOrB,EACP,OAAQqB,CACV,CAAC,CACH,CACA,IAAMS,EAAc5G,EAAAA,YAClBiG,EACAD,EAAO,KACN,GAAMpC,EAAQiD,CAAC,EAChBV,EAAc,EACdD,CACF,EACMY,EAAmB,CACvB,QACA,SACA,QACA,QACA,KAAMtF,EAASe,CAAI,EACnB,SACA,cACA,cACA,SACA,MAAO,KACP,SAAU,IACZ,EAEA,GADA,EAAQuE,EACJ9D,EAAO,CACT,IAAM+D,EAAY9G,EAAAA,eAAeqC,EAAOU,EAAM,MAAOjB,EAAQ,SAAS,EAChEiF,EAAKhB,EAAO,OAAO,MAAMhD,EAAM,MAAM,MAAM,EAAE,CAAC,CAAC,EACrD,EAAK,MAAQ,CACX,MAAOA,EAAM,MACb,MAAO9C,EAAAA,WAAWoC,EAAO0D,EAAO,OAAQhD,EAAM,KAAK,EACnD,WACE+D,GACAC,GAAMhB,EAAO,KAAK,GAClBgB,GAAMhB,EAAO,KAAK,EAAIA,EAAO,KAAK,MAC9BgB,EACA,KACN,QACE9D,GAAS,OAAS,OAASA,GAAS,OAAS,QACzC,KACA8B,EAAchC,EAAM,MAAOA,EAAM,EAAGA,EAAM,CAAC,CACnD,CACF,CACA,GAAIE,GAAS,OAAS,QAAS,CAC7B,IAAMsB,EAAIlC,EAAM,OAAOY,EAAQ,KAAK,aACpC,EAAK,SAAW,CACd,EAAGA,EAAQ,EACX,EAAGA,EAAQ,EACX,MAAOA,EAAQ,KAAK,MACpB,MAAOsB,EAAIrE,EAAAA,QAAQqE,EAAGtB,EAAQ,KAAK,KAAK,EAAI,GAAK,CACnD,CACF,CACA,IAAM+D,EAAOjB,EAAO,KACdkB,EAAM,GAAGD,EAAK,EAAE,GAAGA,EAAK,EAAE,GAAGA,EAAK,MAAM,GAAGA,EAAK,SAKtD,OAJIC,IAAQpE,IACV,EAAWoE,EACX9D,EAAK,SAAU,CAAE,GAAG6D,CAAK,CAAC,GAErBH,CACT,EAEMK,QACAtE,GAAc,CAACD,KACjB,EAAa,GACb,EAAQiD,EAAa,GAEhBjD,GAKHwE,MAAeD,EAAS,CAAC,EAAE,OAAO,QAAU,KAE5C/C,EACJ,GACG,CACH,IAAMiD,EAAU,CAACjH,EAAAA,UAAU4C,GAAO,OAAS,KAAM8D,GAAM,OAAS,IAAI,EACpE,EAAQA,EACRtD,EAAW,EACP6D,GAASjE,EAAK,QAAS0D,EAAOA,EAAK,MAAQ,IAAI,CACrD,EAEMQ,GAAS,EAAW,EAAW,IAAmB,CACtD,IAAMC,EAAKH,EAAO,EAClB,OAAOG,EACHlH,EAAAA,QAAQiC,EAAOiF,EAAI3E,GAAO,OAAO,QAAU,KAAMgC,EAAG4C,EAAGC,EAAQ,EAAI,CAAC,EACpE,IACN,EAEMC,GAAU,EAAW,IAAc,CACvC,IAAMC,EAAIP,EAAO,CAAC,EAAE,KACpB,MACE,CAAC,CAACO,GAAK/C,GAAK+C,EAAE,GAAK/C,GAAK+C,EAAE,EAAIA,EAAE,OAASH,GAAKG,EAAE,GAAKH,GAAKG,EAAE,EAAIA,EAAE,MAEtE,EAEMC,GAAU,EAAW,IAAc,CACvC,IAAML,EAAKH,EAAO,EAClB,GAAI,CAACG,EAAI,OAAO,KAChB,GAAM,CAAE,QAASA,EACXP,EAAK,KAAK,IAAIa,EAAK,EAAG,KAAK,IAAIA,EAAK,EAAIA,EAAK,MAAOjD,CAAC,CAAC,EACtDkD,EAAK,KAAK,IAAID,EAAK,EAAG,KAAK,IAAIA,EAAK,EAAIA,EAAK,OAAQL,CAAC,CAAC,EAC7D,MAAO,CAAE,EAAGD,EAAG,MAAMP,CAAE,EAAG,EAAGO,EAAG,MAAMO,CAAE,CAAE,CAC5C,EAEMC,GAAmB,EAAiB,IAAoB,CAC5D,GAAM,CAAE,OAAM,WAAYzF,EAC1B,EAAO,CACL,EAAG9C,EAAAA,WAAWsH,EAAK,EAAG7C,EAAK,EAAGC,EAAQ,CAAC,EACvC,EAAG1E,EAAAA,WAAWsH,EAAK,EAAG7C,EAAK,EAAGC,EAAQ,CAAC,CACzC,EACA,EAAS,CAACzE,EAAAA,UAAU8C,EAAK,EAAG0B,EAAK,CAAC,GAAK,CAACxE,EAAAA,UAAU8C,EAAK,EAAG0B,EAAK,CAAC,EAC5D+D,GAAQ5E,EAAK,OAAQ5B,EAASe,CAAI,CAAC,EACvCiB,EAAW,CACb,EAEMyE,GAAU,EAAW,EAAW,IAAmB,CACvD,IAAMV,EAAKH,EAAO,EAClB,GAAI,CAACG,GAAO,CAACjF,EAAM,KAAK,GAAK,CAACA,EAAM,KAAK,EAAI,OAC7C,IAAMwE,EAAOtF,EAASe,CAAI,EACtBD,EAAM,KAAK,IAAG,EAAK,EAAIhC,EAAAA,UAAUiC,EAAK,EAAGgF,EAAG,MAAM3C,CAAC,EAAGsD,CAAM,GAC5D5F,EAAM,KAAK,IAAG,EAAK,EAAIhC,EAAAA,UAAUiC,EAAK,EAAGgF,EAAG,MAAMC,CAAC,EAAGU,CAAM,GAChEH,EAAgBjB,EAAM,EAAI,CAC5B,EAEMqB,MAAkB,CACjB3F,GACLuF,EAAgBvG,EAASc,EAAM,IAAI,EAAG,EAAI,CAC5C,EAEM8F,GAAY,EAAW,IAC3BjB,EAAS,CAAC,EAAE,QAAQ,QAAQ,KACzB,GACCvC,GAAKyD,EAAE,IAAI,GACXzD,GAAKyD,EAAE,IAAI,EAAIA,EAAE,IAAI,OACrBb,GAAKa,EAAE,IAAI,GACXb,GAAKa,EAAE,IAAI,EAAIA,EAAE,IAAI,MACzB,GAAK,KAEDC,EAAgB,GAAe,CAC/BlG,EAAO,IAAImG,CAAE,EAAGnG,EAAO,OAAOmG,CAAE,EAC/BnG,EAAO,IAAImG,CAAE,EAClBvE,EAAQ,CACV,EAEMwE,MAAmB,CACvB,GAAM,CAACpC,EAAGqC,GAAK,CAAC,GAAGxF,EAAS,OAAO,CAAC,EACpC,EAAU,CACR,KAAM,QACN,KAAMzB,EAASe,CAAI,EACnB,SAAU,KAAK,IAAI,EAAG,KAAK,MAAM6D,EAAE,EAAIqC,EAAE,EAAGrC,EAAE,EAAIqC,EAAE,CAAC,CAAC,EACtD,MAAOrC,EAAE,EAAIqC,EAAE,GAAK,EACpB,MAAOrC,EAAE,EAAIqC,EAAE,GAAK,CACtB,EACArE,EAAS,IAAI,CACf,EA0LA,MAHA,GAAQ7E,EAAAA,WAAWwC,EAASG,EAAOE,EAAQD,CAAK,EAChD6B,EAAQ,EAED,CACL,WAAW,EAAM,CACf,GAAIjB,EAAW,OACf,IAAM2F,GACH5B,EAAK,SAAW,CAAC,EAAA,CAAG,KAAK,KAAO/E,EAAQ,SAAW,CAAC,EAAA,CAAG,KAAK,EAC/D,EAAU+E,EACN4B,IAAgB,EAAQrJ,EAAAA,YAAY4C,EAAYF,EAAQ,OAAO,GACnEiC,EAAQ,CACV,EACA,SAAS,EAAM,CACTjB,IACJ,EAAa+D,EACb,EAAQzH,EAAAA,YAAY4C,EAAYF,EAAQ,OAAO,EAC/CiC,EAAQ,EACV,EACA,QAAQ,EAAG,EAAG,EACRc,IAAMrC,GAASkG,IAAMjG,KACzB,EAAQ,KAAK,IAAI,EAAGoC,CAAC,EACrB,EAAS,KAAK,IAAI,EAAG6D,CAAC,EACtBnF,EAAW,EACb,EACA,WACA,aA9MmB,EAAW,EAAW,EAAyB,CAAC,IAAM,CACzE,GAAIT,EAAW,OACf,IAAMwF,EAAK5E,EAAE,IAAM,EACb8D,EAAQ,CAAC,CAAC9D,EAAE,MAClBV,EAAS,IAAIsF,EAAI,CAAE,IAAG,IAAG,OAAQ3D,EAAG,OAAQ4C,EAAG,QAAO,MAAO,EAAM,CAAC,EACpE,IAAMrD,EAAKV,EAAY,EACvB,GAAIR,EAAS,OAAS,EAAG,CACnBkB,IAAO7B,EAAM,KAAK,GAAKA,EAAM,KAAK,IAAMY,GAAS,OAAS,SAC5DsF,EAAW,EACb,MACF,CACA,GAAIvF,EAAS,KAAO,GAAK,CAACkB,EAAI,CAC5B,GAAI,CAACA,GAAMsD,EAAO,CAChB,IAAMlE,EAAQ+D,EAAM1C,EAAG4C,EAAG,EAAI,EAC9BpD,EAASb,EAAQ,CAAE,QAAO,IAAG,GAAE,EAAI,IAAI,CACzC,CACA,MACF,CACA,GAAIY,EAAG,WAAY,CACjB,IAAMyE,EAAOtB,EAAM1C,EAAG4C,EAAGC,CAAK,CAAC,EAAE,MAAM,KACpC,GAAMnF,EAAM,OAAOuG,EAAE,YAAY,CAAC,OAAS,SAC9C,EACA,GAAID,EAAM,CACR,EAAU,CAAE,KAAM,QAAS,OAAM,IAAG,GAAE,EACtC,MACF,CACF,CACA,GAAIpG,GAAU2B,EAAG,KAAOuD,EAAO9C,EAAG4C,CAAC,EAAG,CACpC,EAAU,CAAE,KAAM,MAAO,KAAMhG,EAASe,CAAI,EAAG,IAAG,GAAE,EACpD,MACF,CAEA,GADA,EAAU,KACNkF,EAAO,CACT,IAAMlE,EAAQ+D,EAAM1C,EAAG4C,EAAG,EAAI,EAC9BpD,EAASb,EAAQ,CAAE,QAAO,IAAG,GAAE,EAAI,IAAI,CACzC,CACF,EA2KE,aAzKmB,EAAW,EAAW,EAAyB,CAAC,IAAM,CACzE,GAAIR,EAAW,OACf,IAAMwF,EAAK5E,EAAE,IAAM,EACbgE,EAAI1E,EAAS,IAAIsF,CAAE,EAWzB,GAVIZ,IACF,EAAE,EAAI/C,EACN,EAAE,EAAI4C,EAEJ,CAACG,EAAE,OACH,KAAK,MAAM/C,EAAI+C,EAAE,OAAQH,EAAIG,EAAE,MAAM,GAClCA,EAAE,MAAQhG,EAAaD,KAE1B,EAAE,MAAQ,KAEVwB,GAAS,OAAS,SAAWD,EAAS,MAAQ,EAAG,CACnD,GAAM,CAACmD,EAAGqC,GAAK,CAAC,GAAGxF,EAAS,OAAO,CAAC,EAC9B6F,EAAW,KAAK,IAAI,EAAG,KAAK,MAAM1C,EAAE,EAAIqC,EAAE,EAAGrC,EAAE,EAAIqC,EAAE,CAAC,CAAC,EACvDM,GAAQ3C,EAAE,EAAIqC,EAAE,GAAK,EACrBO,GAAQ5C,EAAE,EAAIqC,EAAE,GAAK,EACrBlB,EAAKH,EAAO,EAClB,GAAI,CAACG,EAAI,OACT,IAAM0B,EAAQ1I,EAAAA,aACZgH,EAAG,KACHrE,EAAQ,KACRZ,EAAM,EAAE,QACRA,EAAM,EAAE,OACV,EACM4F,EAAShF,EAAQ,SAAW4F,EAC5BhC,EAAOtF,EAAS0B,EAAQ,IAAI,EAClC,GAAIZ,EAAM,KAAK,EAAG,CAChB,EAAK,EAAIhC,EAAAA,UAAU4C,EAAQ,KAAK,EAAG+F,EAAM,MAAM/F,EAAQ,IAAI,EAAGgF,CAAM,EACpE,IAAMgB,GAASH,EAAO7F,EAAQ,MAAQ+F,EAAM,OAASf,EACrD,EAAK,EAAI1H,EAAAA,SAASsG,EAAK,EAAGxE,EAAM,EAAE,QAAU4G,EAAQ,CAACA,CAAK,CAC5D,CACA,GAAI5G,EAAM,KAAK,EAAG,CAChB,EAAK,EAAIhC,EAAAA,UAAU4C,EAAQ,KAAK,EAAG+F,EAAM,MAAM/F,EAAQ,IAAI,EAAGgF,CAAM,EACpE,IAAMgB,GAASF,EAAO9F,EAAQ,MAAQ+F,EAAM,OAASf,EACrD,EAAK,EAAI1H,EAAAA,SAASsG,EAAK,EAAGxE,EAAM,EAAE,QAAU,CAAC4G,EAAQA,CAAK,CAC5D,CACAnB,EAAgBjB,EAAM,EAAI,EAC1B,MACF,CACA,GAAI5D,GAAS,OAAS,SAAWyE,EAAG,CAClC,GAAI,CAACA,EAAE,MAAO,OACd,EAAQ,EAAI/C,EACZ,EAAQ,EAAI4C,EACZ,IAAM2B,EAAKvB,EAAOhD,EAAG4C,CAAC,EACtBhE,EAAW,EACP2F,GAAI/F,EAAK,OAAQ,CAAE,KAAMF,EAAQ,KAAM,EAAGiG,EAAG,EAAG,EAAGA,EAAG,CAAE,CAAC,EAC7D,MACF,CACA,GAAIjG,GAAS,OAAS,OAASyE,EAAG,CAChC,GAAI,CAACA,EAAE,MAAO,OACd,IAAMJ,EAAKH,EAAO,EAClB,GAAI,CAACG,EAAI,OACT,IAAM6B,EAAKxE,EAAI1B,EAAQ,EACjBmG,EAAK7B,EAAItE,EAAQ,EACjB4D,EAAOtF,EAAS0B,EAAQ,IAAI,EAC9BZ,EAAM,KAAK,IACb,EAAK,EAAI9B,EAAAA,SACP0C,EAAQ,KAAK,EACb,CAACkG,EAAK7B,EAAG,QAAUjF,EAAM,EAAE,QAAU,GAAK,EAC5C,GACEA,EAAM,KAAK,IACb,EAAK,EAAI9B,EAAAA,SACP0C,EAAQ,KAAK,EACbmG,EAAK9B,EAAG,QAAUjF,EAAM,EAAE,QAAU,GAAK,EAC3C,GACFyF,EAAgBjB,EAAM,EAAI,EAC1B,MACF,CACA,GAAI,IAAS,KAAO,KAEhB,CAACa,GAAKA,EAAE,OAAS,CAAChE,EAAE,OAAO,CAC7B,IAAMJ,EAAQ+D,EAAM1C,EAAG4C,EAAG,CAAC,CAACG,GAAG,OAAS,CAAC,CAAChE,EAAE,KAAK,GAC7CJ,GAAS,CAACoE,GAAG,QAAOvD,EAASb,EAAQ,CAAE,QAAO,IAAG,GAAE,EAAI,IAAI,CACjE,CACF,EA6FE,WA3FiB,EAAW,EAAW,EAAyB,CAAC,IAAM,CACvE,GAAIR,EAAW,OACf,IAAMwF,EAAK5E,EAAE,IAAM,EACbgE,EAAI1E,EAAS,IAAIsF,CAAE,EACzBtF,EAAS,OAAOsF,CAAE,EAClB,IAAMe,EAAUpG,EAChB,GAAIoG,GAAS,OAAS,QAAS,CACzBrG,EAAS,KAAO,IAAG,EAAU,MACjC,MACF,CAEA,GADA,EAAU,KACN,CAAC0E,EAAG,OACR,GAAI2B,GAAS,OAAS,QAChB,IAAA3B,EAAE,MAAO,CACX,IAAMwB,EAAKvB,EAAOhD,EAAG4C,CAAC,EACtBhE,EAAW,EACP2F,GAAI/F,EAAK,OAAQ,CAAE,KAAMkG,EAAQ,KAAM,EAAGH,EAAG,EAAG,EAAGA,EAAG,CAAE,CAAC,EAC7D,MACF,OACK,GAAIG,GAAS,OAAS,OAAS3B,EAAE,MAAO,CAC7CnE,EAAW,EACX,MACF,CACA,GAAImE,EAAE,MAAO,CACPA,EAAE,OAAOnE,EAAW,EACxB,MACF,CAEA,IAAM+F,EAAM,KAAK,IAAI,EACrB,GACE5B,EAAE,OACF4B,EAAMpG,EAAQ,KAAOvB,GACrB,KAAK,MAAMgD,EAAIzB,EAAQ,EAAGqE,EAAIrE,EAAQ,CAAC,EAAI,IAC3CX,EACA,CACA,EAAU,CAAE,KAAM,EAAG,IAAG,GAAE,EAC1B2F,EAAU,EACV,MACF,CACA,EAAU,CAAE,KAAMoB,EAAK,IAAG,GAAE,EAC5B,IAAMzD,EAASsC,EAASxD,EAAG4C,CAAC,EAC5B,GAAI1B,EAAQ,CACNqB,EAAS,CAAC,EAAE,QAAQ,QAAQmB,EAAaxC,EAAO,EAAE,EACtD,MACF,CACA,IAAM0D,EAAMlC,EAAM1C,EAAG4C,EAAGG,EAAE,KAAK,EAC/B,GAAI6B,EAAK,CACH7B,EAAE,OAAOvD,EAAS,CAAE,MAAOoF,EAAK,IAAG,GAAE,CAAC,EAC1CpG,EAAK,QAASoG,CAAG,EACjB,MACF,CAEA,GADI7B,EAAE,OAAOvD,EAAS,IAAI,EACtBsD,EAAO9C,EAAG4C,CAAC,EAAG,CAChB,IAAM2B,EAAKvB,EAAOhD,EAAG4C,CAAC,EAClB2B,GAAI/F,EAAK,YAAa+F,CAAyB,CACrD,CACF,EAoCE,eAlCqB,EAAyB,CAAC,IAAM,CACrDlG,EAAS,OAAOU,EAAE,IAAM,CAAC,GACrBT,GAAS,OAAS,SAAWD,EAAS,KAAO,KAAG,EAAU,MAC9DO,EAAW,CACb,EA+BE,cAAe,CACT,CAACN,GAAWF,GAAOoB,EAAS,IAAI,CACtC,EACA,SACA,YACA,YAAe5C,EAASe,CAAI,EAC5B,QAAQ,EAAM,CACRQ,GACJgF,EAAgB,CAAE,EAAGjB,EAAK,GAAKvE,EAAK,EAAG,EAAGuE,EAAK,GAAKvE,EAAK,CAAE,EAAG,EAAK,CACrE,EACA,eACA,YAAa,CACPS,GAAOoB,EAAS,IAAI,CAC1B,EACA,aAAc,CACZ,IAAMuD,EAAIR,EAAS,CAAC,EAAE,OAAO,KAC7B,OAAOQ,EAAI,CAAE,GAAGA,CAAE,EAAI,IACxB,EACA,QAAQ,EAAG,EAAG,CACZ,IAAMJ,EAAKH,EAAO,EAClB,OAAOG,EAAK,CAAE,EAAGA,EAAG,MAAM3C,CAAC,EAAG,EAAG2C,EAAG,MAAMC,CAAC,CAAE,EAAI,IACnD,EACA,UAAU,EAAG,EAAG,CACd,IAAMD,EAAKH,EAAO,EAClB,OAAOG,EAAK,CAAE,EAAGA,EAAG,MAAM3C,CAAC,EAAG,EAAG2C,EAAG,MAAMC,CAAC,CAAE,EAAI,IACnD,EACA,GAAG,EAAM,EAAU,CACjB,IAAIiC,EAAMpH,EAAUgB,GAMpB,OALKoG,IACH,EAAM,IAAI,IACV,EAAuCpG,GAAQoG,GAEjDA,EAAI,IAAInG,CAAQ,MACH,CACXmG,EAAI,OAAOnG,CAAQ,CACrB,CACF,EACA,SAAU,CACR,EAAY,GACZL,EAAS,MAAM,EACf,IAAK,IAAMiE,KAAO,OAAO,KAAK7E,CAAS,EACrC,OAAQA,EAAsC6E,EAClD,CACF,CACF,EA6EMwC,GACJ,EACA,EACA,EACA,IACqB,CACrB,GAAI,CAACC,EAAQ,MAAO,CAAC,EAAGC,CAAK,EAC7B,GAAM,CAAC,EAAGnB,GAAKoB,EAAM,IAAMA,EAAM,GAAKA,EAAQ,CAACA,EAAM,GAAIA,EAAM,EAAE,EACjE,MAAO,CACL,KAAK,IAAI,EAAGpJ,EAAAA,WAAWmE,EAAGgF,EAAO,CAAC,EAAI,CAAC,EACvC,KAAK,IAAIA,EAAOnJ,EAAAA,WAAWmE,EAAGgF,EAAOnB,CAAC,EAAI,CAAC,CAC7C,CACF,EAEMqB,EAAQ,CACZ,QAAS,EACT,KAAM,EACN,IAAK,EACL,YAAa,EACb,KAAM,EACN,QAAS,CACX,EAQaC,GACX,EACA,EAAgC,CAAC,IACZ,CACrB,GAAM,CAAE,QAAO,OAAM,UAAWnH,EAC1B2E,EAAKvB,EAAO,OACZ,CAAE,QAASA,EACXgE,EAAUC,EAAO,SAAW,IAC5BC,EAAUD,EAAO,SAAW,IAC5BE,EAAS,KAAK,IAAI,EAAGF,EAAO,aAAe,CAAC,EAC5CG,EAAwB,CAAC,EACzBC,EAAS/H,EAAM,OAClB,OAAQ,GAAM,CAACkC,EAAE,QAAUA,EAAE,KAAK,MAAQ,CAAC,CAAC,CAC5C,MAAM,EAAG,IAAMsF,EAAM1D,EAAE,MAAQ0D,EAAMrB,EAAE,OAASrC,EAAE,MAAQqC,EAAE,KAAK,EACpE,IAAK,IAAMjE,KAAK6F,EAAQ,CACtB,GAAM,CAAE,IAAG,IAAG,QAAO,UAAW7F,EAAE,KAClC,GAAIA,EAAE,OAAS,QAAUA,EAAE,OAAS,OAAQ,CAC1C,GAAM,CAACyE,EAAOqB,GAAOZ,EAAa9E,EAAGgF,EAAOD,EAAQpH,EAAK,CAAC,EACpDoD,EAAMnB,EAAE,UAAYgD,EAGpB+C,EAAS7J,EAAAA,YAAYkE,EAAGe,EAAKsD,EAAOqB,EAAK9F,EAAE,KAAK,EAChDkC,EAASlC,EAAE,UACb9D,EAAAA,YAAYkE,EAAGJ,EAAE,UAAWyE,EAAOqB,EAAK9F,EAAE,KAAK,CAAC,CAAC,OACjD,KACAgG,EAAID,EAAO,OACXE,EAASF,EAAO,OAChBG,EAAUhE,EACd,GAAIiD,GAAUa,EAAK3C,EAAK,MAAQ,EAAKsC,EAAQ,CAC3C,GAAIzD,EAAQ,CAEV,IAAMiE,EAAIhK,EAAAA,eAAe8J,EAAQ,EAAGD,EAAI,GAAMjD,EAAG,MAAM9F,CAAC,EAAI0I,CAAM,EAC5DrD,EAAO,IAAI,aAAa6D,EAAE,OAAS,CAAC,EACpCC,EAAa,IAAI,aAAaD,EAAE,OAAS,CAAC,EAC5CE,EAAI,EACJC,EAAI,EACR,IAAK,IAAIjC,EAAI,EAAGA,EAAI8B,EAAE,OAAQ,IAAK,CACjC,IAAMI,EAAKJ,EAAE,OAAO9B,EAAI,GACxB,KAAOiC,EAAIN,EAAI,GAAKC,EAAOK,EAAI,GAAKC,GAAI,IACxC,EAAKF,EAAI,GAAKE,EACd,EAAKF,EAAI,EAAI,GAAKF,EAAE,OAAO9B,EAAI,EAAI,GACnC,EAAWgC,EAAI,GAAKE,EACpB,EAAWF,EAAI,EAAI,GAAKnE,EAAOoE,EAAI,EAAI,GACvC,GACF,CACA,EAAShE,EACT,EAAU8D,EACV,EAAIC,CACN,KAAO,CACL,IAAMF,EAAIhK,EAAAA,eAAe8J,EAAQ,EAAGD,EAAI,GAAMjD,EAAG,MAAM9F,CAAC,EAAI0I,CAAM,EAClE,EAASQ,EAAE,OACX,EAAIA,EAAE,MACR,CACF,CACA,IAAMK,EAAuB,CAAC,EACxBC,EAA6B,CAAC,EAChCC,EAAgB,CAAC,EACjBC,EAAsB,CAAC,EAC3B,IAAK,IAAItC,EAAI,EAAGA,EAAI2B,EAAG,IAAK,CAC1B,IAAMO,EAAKN,EAAO5B,EAAI,GAChBuC,EAAKX,EAAO5B,EAAI,EAAI,GACpBwC,EAAKX,EAAUA,EAAQ7B,EAAI,EAAI,GAAK,EAC1C,GACE,CAAC,OAAO,SAASkC,CAAE,GACnB,CAAC,OAAO,SAASK,CAAE,GACnB,CAAC,OAAO,SAASC,CAAE,EACnB,CACIH,EAAI,SACNF,EAAS,KAAKE,CAAG,EACjBD,EAAe,KAAKE,CAAS,GAE/B,EAAM,CAAC,EACP,EAAY,CAAC,EACb,QACF,CACAD,EAAI,KAAK3D,EAAG,MAAMwD,CAAE,EAAGxD,EAAG,MAAM6D,CAAE,CAAC,EAC/BV,GAASS,EAAU,KAAK5D,EAAG,MAAM8D,CAAE,CAAC,CAC1C,CACIH,EAAI,SACNF,EAAS,KAAKE,CAAG,EACjBD,EAAe,KAAKE,CAAS,GAE3B3G,EAAE,OAAS,QACb4F,EAAI,KAAK,CACP,KAAM,OACN,YAAa5F,EAAE,MACf,MAAOA,EAAE,SACT,QAASA,EAAE,QACX,SAAU+C,EAAG,MAAMjF,EAAM,QAAQ,EACjC,WACA,GAAIoI,EAAU,CAAE,QAASO,CAAe,EAAI,CAAC,CAC/C,CAAC,EAEHb,EAAI,KAAK,CACP,KAAM,OACN,YAAa5F,EAAE,MACf,MAAOA,EAAE,SACT,MAAOA,EAAE,OAAS,OAAS,KAAK,IAAIA,EAAE,UAAW,CAAC,EAAIA,EAAE,UACxD,UACF,CAAC,EACD,QACF,CACA,GAAIA,EAAE,OAAS,OAASA,EAAE,SAAWA,EAAE,OAAQ,CAC7C,GAAM,CAACyE,EAAOqB,GAAOZ,EAAa9E,EAAGgF,EAAOD,EAAQpH,EAAK,CAAC,EACpD+I,EAAO,KAAK,IAAI9G,EAAE,aAAe+C,EAAG,OAAQ,EAAG,EAC/CgE,EAAkB,CAAC,EACnBC,EAAmB,CAAC,EACpBC,EAAQnB,EAAMrB,EAAQiB,EACxBwB,EAAU,IACd,IAAK,IAAI7C,EAAII,EAAOJ,EAAIyB,EAAK,IAAK,CAChC,IAAMlE,EAAI5B,EAAE,QAAQqE,GACdJ,EAAIjE,EAAE,OAAOqE,GACnB,GAAI,CAAC,OAAO,SAASzC,CAAC,GAAK,CAAC,OAAO,SAASqC,CAAC,EAAG,SAChD,IAAMzB,EAAKO,EAAG,MAAM3C,EAAEiE,GAAKrE,EAAE,SAAS,EACtC,GAAIwC,EAAKsE,EAAOzD,EAAK,GAAKb,EAAKsE,EAAOzD,EAAK,EAAIA,EAAK,MAAO,SAC3D,IAAM8D,EAAKpE,EAAG,MAAMnB,CAAC,EACfwF,EAAKrE,EAAG,MAAMkB,CAAC,EACf9C,EAAM,KAAK,IAAIgG,EAAIC,CAAE,EACrBjD,EAAI,KAAK,IAAI,EAAG,KAAK,IAAIgD,EAAKC,CAAE,CAAC,EACjCC,EAAM,KAAK,MAAM7E,CAAE,EACzB,GAAIyE,GAASI,IAAQH,GAAWH,EAAM,OAAQ,CAE5C,IAAMV,EAAIU,EAAM,OAAS,EACnB7E,EAAS,KAAK,IAAI6E,EAAMV,EAAI,GAAKU,EAAMV,EAAI,GAAIlF,EAAMgD,CAAC,EAC5D,EAAMkC,EAAI,GAAK,KAAK,IAAIU,EAAMV,EAAI,GAAIlF,CAAG,EACzC,EAAMkF,EAAI,GAAKnE,EAAS6E,EAAMV,EAAI,GAClC,QACF,CACA,EAAUgB,EACVN,EAAM,KAAKvE,EAAKsE,EAAM3F,EAAK2F,EAAO,EAAG3C,CAAC,EACtC,IAAMmD,EAAKtH,EAAE,cAAcqE,GAC3B2C,EAAO,KAAKM,EAAKlL,EAAAA,MAAMkL,CAAE,EAAItH,EAAE,QAAQ,CACzC,CACA4F,EAAI,KAAK,CACP,KAAM,OACN,YAAa5F,EAAE,MACf,MAAOA,EAAE,SACT,QACA,GAAIA,EAAE,YAAc,CAAE,QAAO,EAAI,CAAC,EAClC,OAAQA,EAAE,MACZ,CAAC,EACD,QACF,CACA,GAAIA,EAAE,OAAS,cAAe,CAC5B,GAAM,CAACyE,EAAOqB,GAAOZ,EAAa9E,EAAGgF,EAAOD,EAAQpH,EAAK,CAAC,EACpD,CAAE,OAAM,OAAM,OAAQiC,EAAE,KACxB8G,EAAO,KAAK,IAAI9G,EAAE,aAAe+C,EAAG,OAAQ,CAAC,EAC7CwE,EAAKnL,EAAAA,MAAM4D,EAAE,OAAO,EACpBwH,EAAOpL,EAAAA,MAAM4D,EAAE,SAAS,EACxByH,EAAkB,CAAC,EACnBC,EAAmB,CAAC,EACpBC,EAAuB,CAAC,EACxBC,EAAuB,CAAC,EACxBC,EAAO,KAAK,IAAI,EAAG,KAAK,MAAM/B,EAAMrB,GAASiB,CAAO,CAAC,EAC3D,IAAK,IAAIrB,EAAII,EAAOJ,EAAIyB,EAAK,GAAK+B,EAAM,CACtC,IAAMC,EAAI9E,EAAEqB,GACNlF,EAAI4I,EAAOA,EAAK1D,GAAKyD,EAC3B,GAAI,CAAC,OAAO,SAASA,CAAC,GAAK,CAAC,OAAO,SAAS3I,CAAC,EAAG,SAChD,IAAMqD,EAAKO,EAAG,MAAM3C,EAAEiE,EAAE,EACxB,GAAI7B,EAAKsE,EAAOzD,EAAK,GAAKb,EAAKsE,EAAOzD,EAAK,EAAIA,EAAK,MAAO,SAC3D,IAAM2E,EAAQF,EAAI3I,EAAIqI,EAAOD,EACvBU,EAAKlF,EAAG,MAAMmF,EAAOA,EAAK7D,GAAK,KAAK,IAAIlF,EAAG2I,CAAC,CAAC,EAC7CK,EAAKpF,EAAG,MAAMqF,EAAMA,EAAI/D,GAAK,KAAK,IAAIlF,EAAG2I,CAAC,CAAC,EACjDL,EAAM,KAAKjF,EAAK,GAAK,KAAK,IAAIyF,EAAIE,CAAE,EAAG,EAAG,KAAK,IAAIA,EAAKF,CAAE,CAAC,EAC3DN,EAAW,KAAKK,CAAK,EACrB,IAAMb,EAAKpE,EAAG,MAAM5D,CAAC,EACfiI,EAAKrE,EAAG,MAAM+E,CAAC,EACrBJ,EAAO,KACLlF,EAAKsE,EACL,KAAK,IAAIK,EAAIC,CAAE,EACfN,EAAO,EACP,KAAK,IAAI,EAAG,KAAK,IAAIK,EAAKC,CAAE,CAAC,CAC/B,EACAQ,EAAW,KAAKI,CAAK,CACvB,CACApC,EAAI,KACF,CACE,KAAM,OACN,YAAa5F,EAAE,MACf,MAAOuH,EACP,MAAOE,EACP,OAAQE,CACV,EACA,CACE,KAAM,OACN,YAAa3H,EAAE,MACf,MAAOuH,EACP,MAAOG,EACP,OAAQE,EACR,OAAQ,CACV,CACF,EACA,QACF,CACA,GAAI5H,EAAE,OAAS,UAAW,CACxB,IAAMqI,EAAK,KAAK,IAAIrI,EAAE,SAAS,EAAI+C,EAAG,MAAM,EACtCuF,EAAK,KAAK,IAAItI,EAAE,SAAS,EAAI+C,EAAG,MAAM,EACtCgE,EAAkB,CAAC,EACnBC,EAAmB,CAAC,EACpBuB,EAAQ,IAAK,GAAKD,EAAK,GAC7B,IAAK,IAAIjE,EAAI,EAAGA,EAAIe,GAAS2B,EAAM,OAAS,EAAIrB,EAAU,EAAG,IAAK,CAChE,IAAMoC,EAAI9H,EAAE,aAAaqE,GACzB,GAAI,CAACyD,EAAG,SACR,IAAMtF,EAAKO,EAAG,MAAM3C,EAAEiE,EAAE,EAClBf,EAAKP,EAAG,MAAMC,EAAEqB,EAAE,EAEtB7B,EAAK6F,EAAKhF,EAAK,GACfb,EAAK6F,EAAKhF,EAAK,EAAIA,EAAK,OACxBC,EAAKgF,EAAKjF,EAAK,GACfC,EAAKgF,EAAKjF,EAAK,EAAIA,EAAK,SAG1B0D,EAAM,KACJvE,EAAK6F,EAAKE,EACVjF,EAAKgF,EAAKC,EACVF,EAAK,EAAIE,EAAQ,EACjBD,EAAK,EAAIC,EAAQ,CACnB,EACAvB,EAAO,KAAK5K,EAAAA,MAAMC,EAAAA,YAAYyL,CAAC,CAAC,CAAC,EACnC,CACAlC,EAAI,KAAK,CACP,KAAM,OACN,YAAa5F,EAAE,MACf,MAAOA,EAAE,SACT,QACA,SACA,OAAQA,EAAE,MACZ,CAAC,EACD,QACF,CAEA,IAAMwI,EAAiB,CAAC,EAClBxB,EAAmB,CAAC,EACpByB,EAAW,GAAc,CAC7B,IAAMX,EAAI9H,EAAE,cAAcqE,GAC1B,OAAOyD,EAAI1L,EAAAA,MAAM0L,CAAC,EAAI9H,EAAE,QAC1B,EACM0I,EAAoB,CAAC,EAC3B,IAAK,IAAIrE,EAAI,EAAGA,EAAIe,EAAO,IAAK,CAC9B,IAAMmB,EAAKnG,EAAEiE,GACPuC,EAAK5D,EAAEqB,GACb,GAAI,CAAC,OAAO,SAASkC,CAAE,GAAK,CAAC,OAAO,SAASK,CAAE,EAAG,SAClD,IAAM+B,EAAK5F,EAAG,MAAMwD,CAAE,EAChBqC,EAAK7F,EAAG,MAAM6D,CAAE,EAEpB+B,EAAKtF,EAAK,GACVsF,EAAKtF,EAAK,EAAIA,EAAK,OACnBuF,EAAKvF,EAAK,GACVuF,EAAKvF,EAAK,EAAIA,EAAK,QAGrBqF,EAAQ,KAAKrE,CAAC,CAChB,CACA,GAAIqE,EAAQ,OAASlD,EAAS,CAC5B,IAAMqD,EAAO,KAAK,IAAI,EAAGpD,EAAO,SAAWzF,EAAE,UAAY,EAAG,EACtD8I,EAAO,KAAK,KAAKzF,EAAK,MAAQwF,CAAI,EAAI,EACtCE,EAAQ,IAAI,IAClB,IAAK,IAAM1E,KAAKqE,EAAS,CACvB,IAAMlG,EAAK,KAAK,OAAOO,EAAG,MAAM3C,EAAEiE,EAAE,EAAIhB,EAAK,GAAKwF,CAAI,EAChDvF,EAAK,KAAK,OAAOP,EAAG,MAAMC,EAAEqB,EAAE,EAAIhB,EAAK,GAAKwF,CAAI,EACtDE,EAAM,IAAIzF,EAAKwF,EAAOtG,EAAI6B,CAAC,CAC7B,CACA,IAAK,GAAM,CAAC3B,EAAK2B,KAAM0E,EACrBP,EAAK,KACHnF,EAAK,GAAMX,EAAMoG,EAAQ,IAAOD,EAChCxF,EAAK,GAAK,KAAK,MAAMX,EAAMoG,CAAI,EAAI,IAAOD,EAC1CA,CACF,EACA7B,EAAO,KAAKyB,EAAQpE,CAAC,CAAC,CAE1B,MACE,IAAK,IAAMA,KAAKqE,EACdF,EAAK,KAAKzF,EAAG,MAAM3C,EAAEiE,EAAE,EAAGtB,EAAG,MAAMC,EAAEqB,EAAE,EAAG1I,EAAAA,QAAQqE,EAAGqE,CAAC,CAAC,EACvD2C,EAAO,KAAKyB,EAAQpE,CAAC,CAAC,EAG1BuB,EAAI,KAAK,CACP,KAAM,OACN,YAAa5F,EAAE,MACf,QAASA,EAAE,QACX,OACA,QACF,CAAC,CACH,CACA,OAAO4F,CACT"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { Rect } from './layout.cjs';
|
|
2
|
+
import { ChartModel } from './model.cjs';
|
|
3
|
+
import { PointLabel, ResolvedAnnotation } from './overlay.cjs';
|
|
4
|
+
import { ChartLayout, HoverMark, TooltipContent } from './scene.cjs';
|
|
5
|
+
import { ChartTheme, ChartThemeInput } from './theme.cjs';
|
|
6
|
+
import { ChartEventMap, ChartHoverEvent, ChartOptions, ChartRect, ChartView } from './types.cjs';
|
|
7
|
+
/** Events of a controller (no renderer events: hosts draw themselves) */
|
|
8
|
+
export type ChartControllerEventMap = Omit<ChartEventMap, "renderer">;
|
|
9
|
+
export interface ChartControllerConfig {
|
|
10
|
+
options: ChartOptions;
|
|
11
|
+
/** Colors and fonts (Minerva variables); light defaults when omitted */
|
|
12
|
+
theme?: ChartThemeInput;
|
|
13
|
+
/** Width in pixels of `text` drawn with the CSS `font` */
|
|
14
|
+
measureText: (text: string, font: string) => number;
|
|
15
|
+
/** Called when the scene changed and must be drawn again */
|
|
16
|
+
onInvalidate?: () => void;
|
|
17
|
+
}
|
|
18
|
+
export interface ChartLegendEntry {
|
|
19
|
+
id: string;
|
|
20
|
+
name: string;
|
|
21
|
+
/** CSS color */
|
|
22
|
+
color: string;
|
|
23
|
+
shape: "dot" | "line" | "square";
|
|
24
|
+
hidden: boolean;
|
|
25
|
+
/** Hit / draw box of the entry, pixels of the chart */
|
|
26
|
+
box: Rect;
|
|
27
|
+
}
|
|
28
|
+
export interface ChartLegendLayout {
|
|
29
|
+
entries: ChartLegendEntry[];
|
|
30
|
+
position: "top" | "bottom";
|
|
31
|
+
/** Whether a tap toggles the series */
|
|
32
|
+
toggle: boolean;
|
|
33
|
+
/** Height taken by the legend */
|
|
34
|
+
height: number;
|
|
35
|
+
}
|
|
36
|
+
export interface ChartTooltipLayout {
|
|
37
|
+
/** Default content (`text` is set instead when `tooltip.render` returns a string) */
|
|
38
|
+
content: TooltipContent;
|
|
39
|
+
/** Lines of a custom string tooltip */
|
|
40
|
+
text: string[] | null;
|
|
41
|
+
/** Box of the tooltip, pixels of the chart */
|
|
42
|
+
box: Rect;
|
|
43
|
+
/** Line height used to lay the box out */
|
|
44
|
+
lineHeight: number;
|
|
45
|
+
padding: number;
|
|
46
|
+
}
|
|
47
|
+
export interface ChartHoverLayout {
|
|
48
|
+
event: ChartHoverEvent;
|
|
49
|
+
marks: HoverMark[];
|
|
50
|
+
/** X pixel of the guide line (`null` when hidden) */
|
|
51
|
+
crosshairX: number | null;
|
|
52
|
+
tooltip: ChartTooltipLayout | null;
|
|
53
|
+
}
|
|
54
|
+
/** Everything a host draws, in CSS pixels of the chart */
|
|
55
|
+
export interface ChartScene {
|
|
56
|
+
width: number;
|
|
57
|
+
height: number;
|
|
58
|
+
theme: ChartTheme;
|
|
59
|
+
model: ChartModel;
|
|
60
|
+
view: ChartView;
|
|
61
|
+
layout: ChartLayout;
|
|
62
|
+
annotations: ResolvedAnnotation[];
|
|
63
|
+
/** Labels of the dots that found a free slot */
|
|
64
|
+
pointLabels: {
|
|
65
|
+
label: PointLabel;
|
|
66
|
+
box: Rect;
|
|
67
|
+
}[];
|
|
68
|
+
legend: ChartLegendLayout | null;
|
|
69
|
+
hover: ChartHoverLayout | null;
|
|
70
|
+
/** Point being dragged (`interaction.dragPoints`) */
|
|
71
|
+
dragging: {
|
|
72
|
+
x: number;
|
|
73
|
+
y: number;
|
|
74
|
+
color: string;
|
|
75
|
+
size: number;
|
|
76
|
+
} | null;
|
|
77
|
+
}
|
|
78
|
+
export interface ChartPointerOptions {
|
|
79
|
+
/** Pointer id (touch identifier); 0 by default */
|
|
80
|
+
id?: number;
|
|
81
|
+
/** Touch input: the tooltip follows the finger and stays after a tap */
|
|
82
|
+
touch?: boolean;
|
|
83
|
+
}
|
|
84
|
+
export interface ChartController {
|
|
85
|
+
setOptions(options: ChartOptions): void;
|
|
86
|
+
setTheme(theme: ChartThemeInput | undefined): void;
|
|
87
|
+
/** Size of the chart in CSS pixels */
|
|
88
|
+
setSize(width: number, height: number): void;
|
|
89
|
+
/** What to draw (`null` until the size is known) */
|
|
90
|
+
getScene(): ChartScene | null;
|
|
91
|
+
pointerDown(x: number, y: number, options?: ChartPointerOptions): void;
|
|
92
|
+
pointerMove(x: number, y: number, options?: ChartPointerOptions): void;
|
|
93
|
+
pointerUp(x: number, y: number, options?: ChartPointerOptions): void;
|
|
94
|
+
pointerCancel(options?: ChartPointerOptions): void;
|
|
95
|
+
/** The mouse left the chart */
|
|
96
|
+
pointerLeave(): void;
|
|
97
|
+
/** Zooms around a pixel (factor < 1 zooms in) */
|
|
98
|
+
zoomAt(x: number, y: number, factor: number): void;
|
|
99
|
+
resetZoom(): void;
|
|
100
|
+
getView(): ChartView;
|
|
101
|
+
setView(view: Partial<ChartView>): void;
|
|
102
|
+
/** Shows / hides a series (like a legend click) */
|
|
103
|
+
toggleSeries(id: string): void;
|
|
104
|
+
/** Hides the tooltip */
|
|
105
|
+
clearHover(): void;
|
|
106
|
+
getPlotRect(): ChartRect | null;
|
|
107
|
+
toPixel(x: number, y: number): {
|
|
108
|
+
x: number;
|
|
109
|
+
y: number;
|
|
110
|
+
} | null;
|
|
111
|
+
fromPixel(x: number, y: number): {
|
|
112
|
+
x: number;
|
|
113
|
+
y: number;
|
|
114
|
+
} | null;
|
|
115
|
+
on<K extends keyof ChartControllerEventMap>(type: K, listener: (event: ChartControllerEventMap[K]) => void): () => void;
|
|
116
|
+
destroy(): void;
|
|
117
|
+
}
|
|
118
|
+
export declare const createChartController: (config: ChartControllerConfig) => ChartController;
|
|
119
|
+
/** A polyline (pixels of the chart): interleaved x, y */
|
|
120
|
+
export interface ChartLinePrimitive {
|
|
121
|
+
kind: "line";
|
|
122
|
+
seriesIndex: number;
|
|
123
|
+
color: string;
|
|
124
|
+
width: number;
|
|
125
|
+
/** Runs of points without gaps */
|
|
126
|
+
segments: number[][];
|
|
127
|
+
}
|
|
128
|
+
export interface ChartAreaPrimitive {
|
|
129
|
+
kind: "area";
|
|
130
|
+
seriesIndex: number;
|
|
131
|
+
color: string;
|
|
132
|
+
opacity: number;
|
|
133
|
+
/** Y pixel of the baseline */
|
|
134
|
+
baseline: number;
|
|
135
|
+
segments: number[][];
|
|
136
|
+
/** Stacked areas: y pixel of the bottom edge under every point of `segments` */
|
|
137
|
+
bottoms?: number[][];
|
|
138
|
+
}
|
|
139
|
+
export interface ChartBarPrimitive {
|
|
140
|
+
kind: "bars";
|
|
141
|
+
seriesIndex: number;
|
|
142
|
+
color: string;
|
|
143
|
+
/** Interleaved x, y, width, height */
|
|
144
|
+
rects: number[];
|
|
145
|
+
/** CSS color of every rect (candlesticks, heatmap cells, colored bars); `color` otherwise */
|
|
146
|
+
colors?: string[];
|
|
147
|
+
/** Corner radius in pixels */
|
|
148
|
+
radius?: number;
|
|
149
|
+
}
|
|
150
|
+
export interface ChartDotPrimitive {
|
|
151
|
+
kind: "dots";
|
|
152
|
+
seriesIndex: number;
|
|
153
|
+
opacity: number;
|
|
154
|
+
/** Interleaved x, y, diameter */
|
|
155
|
+
dots: number[];
|
|
156
|
+
/** CSS color of every dot */
|
|
157
|
+
colors: string[];
|
|
158
|
+
}
|
|
159
|
+
export type ChartPrimitive = ChartLinePrimitive | ChartAreaPrimitive | ChartBarPrimitive | ChartDotPrimitive;
|
|
160
|
+
export interface ChartPrimitiveOptions {
|
|
161
|
+
/**
|
|
162
|
+
* Upper bound of the dots drawn per series: above it the dots are merged
|
|
163
|
+
* into one per occupied cell of their size
|
|
164
|
+
* @default 4000
|
|
165
|
+
*/
|
|
166
|
+
maxDots?: number;
|
|
167
|
+
/**
|
|
168
|
+
* Upper bound of the bars drawn per series: above it neighboring bars
|
|
169
|
+
* sharing a pixel column are merged
|
|
170
|
+
* @default 2000
|
|
171
|
+
*/
|
|
172
|
+
maxBars?: number;
|
|
173
|
+
/**
|
|
174
|
+
* Width in pixels of the columns lines are decimated to (at most four
|
|
175
|
+
* points per column); larger values mean fewer shapes
|
|
176
|
+
* @default 1
|
|
177
|
+
*/
|
|
178
|
+
columnWidth?: number;
|
|
179
|
+
/** Size of the cells dots are merged into (the dot size by default) */
|
|
180
|
+
dotCell?: number;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Data of a scene as simple shapes in pixels of the chart, for hosts
|
|
184
|
+
* without a canvas (React Native views, SVG): lines are decimated to a few
|
|
185
|
+
* points per pixel column and large point sets are merged per cell, so the
|
|
186
|
+
* number of shapes stays bounded by the size of the chart.
|
|
187
|
+
*/
|
|
188
|
+
export declare const scenePrimitives: (scene: ChartScene, limits?: ChartPrimitiveOptions) => ChartPrimitive[];
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { Rect } from './layout.js';
|
|
2
|
+
import { ChartModel } from './model.js';
|
|
3
|
+
import { PointLabel, ResolvedAnnotation } from './overlay.js';
|
|
4
|
+
import { ChartLayout, HoverMark, TooltipContent } from './scene.js';
|
|
5
|
+
import { ChartTheme, ChartThemeInput } from './theme.js';
|
|
6
|
+
import { ChartEventMap, ChartHoverEvent, ChartOptions, ChartRect, ChartView } from './types.js';
|
|
7
|
+
/** Events of a controller (no renderer events: hosts draw themselves) */
|
|
8
|
+
export type ChartControllerEventMap = Omit<ChartEventMap, "renderer">;
|
|
9
|
+
export interface ChartControllerConfig {
|
|
10
|
+
options: ChartOptions;
|
|
11
|
+
/** Colors and fonts (Minerva variables); light defaults when omitted */
|
|
12
|
+
theme?: ChartThemeInput;
|
|
13
|
+
/** Width in pixels of `text` drawn with the CSS `font` */
|
|
14
|
+
measureText: (text: string, font: string) => number;
|
|
15
|
+
/** Called when the scene changed and must be drawn again */
|
|
16
|
+
onInvalidate?: () => void;
|
|
17
|
+
}
|
|
18
|
+
export interface ChartLegendEntry {
|
|
19
|
+
id: string;
|
|
20
|
+
name: string;
|
|
21
|
+
/** CSS color */
|
|
22
|
+
color: string;
|
|
23
|
+
shape: "dot" | "line" | "square";
|
|
24
|
+
hidden: boolean;
|
|
25
|
+
/** Hit / draw box of the entry, pixels of the chart */
|
|
26
|
+
box: Rect;
|
|
27
|
+
}
|
|
28
|
+
export interface ChartLegendLayout {
|
|
29
|
+
entries: ChartLegendEntry[];
|
|
30
|
+
position: "top" | "bottom";
|
|
31
|
+
/** Whether a tap toggles the series */
|
|
32
|
+
toggle: boolean;
|
|
33
|
+
/** Height taken by the legend */
|
|
34
|
+
height: number;
|
|
35
|
+
}
|
|
36
|
+
export interface ChartTooltipLayout {
|
|
37
|
+
/** Default content (`text` is set instead when `tooltip.render` returns a string) */
|
|
38
|
+
content: TooltipContent;
|
|
39
|
+
/** Lines of a custom string tooltip */
|
|
40
|
+
text: string[] | null;
|
|
41
|
+
/** Box of the tooltip, pixels of the chart */
|
|
42
|
+
box: Rect;
|
|
43
|
+
/** Line height used to lay the box out */
|
|
44
|
+
lineHeight: number;
|
|
45
|
+
padding: number;
|
|
46
|
+
}
|
|
47
|
+
export interface ChartHoverLayout {
|
|
48
|
+
event: ChartHoverEvent;
|
|
49
|
+
marks: HoverMark[];
|
|
50
|
+
/** X pixel of the guide line (`null` when hidden) */
|
|
51
|
+
crosshairX: number | null;
|
|
52
|
+
tooltip: ChartTooltipLayout | null;
|
|
53
|
+
}
|
|
54
|
+
/** Everything a host draws, in CSS pixels of the chart */
|
|
55
|
+
export interface ChartScene {
|
|
56
|
+
width: number;
|
|
57
|
+
height: number;
|
|
58
|
+
theme: ChartTheme;
|
|
59
|
+
model: ChartModel;
|
|
60
|
+
view: ChartView;
|
|
61
|
+
layout: ChartLayout;
|
|
62
|
+
annotations: ResolvedAnnotation[];
|
|
63
|
+
/** Labels of the dots that found a free slot */
|
|
64
|
+
pointLabels: {
|
|
65
|
+
label: PointLabel;
|
|
66
|
+
box: Rect;
|
|
67
|
+
}[];
|
|
68
|
+
legend: ChartLegendLayout | null;
|
|
69
|
+
hover: ChartHoverLayout | null;
|
|
70
|
+
/** Point being dragged (`interaction.dragPoints`) */
|
|
71
|
+
dragging: {
|
|
72
|
+
x: number;
|
|
73
|
+
y: number;
|
|
74
|
+
color: string;
|
|
75
|
+
size: number;
|
|
76
|
+
} | null;
|
|
77
|
+
}
|
|
78
|
+
export interface ChartPointerOptions {
|
|
79
|
+
/** Pointer id (touch identifier); 0 by default */
|
|
80
|
+
id?: number;
|
|
81
|
+
/** Touch input: the tooltip follows the finger and stays after a tap */
|
|
82
|
+
touch?: boolean;
|
|
83
|
+
}
|
|
84
|
+
export interface ChartController {
|
|
85
|
+
setOptions(options: ChartOptions): void;
|
|
86
|
+
setTheme(theme: ChartThemeInput | undefined): void;
|
|
87
|
+
/** Size of the chart in CSS pixels */
|
|
88
|
+
setSize(width: number, height: number): void;
|
|
89
|
+
/** What to draw (`null` until the size is known) */
|
|
90
|
+
getScene(): ChartScene | null;
|
|
91
|
+
pointerDown(x: number, y: number, options?: ChartPointerOptions): void;
|
|
92
|
+
pointerMove(x: number, y: number, options?: ChartPointerOptions): void;
|
|
93
|
+
pointerUp(x: number, y: number, options?: ChartPointerOptions): void;
|
|
94
|
+
pointerCancel(options?: ChartPointerOptions): void;
|
|
95
|
+
/** The mouse left the chart */
|
|
96
|
+
pointerLeave(): void;
|
|
97
|
+
/** Zooms around a pixel (factor < 1 zooms in) */
|
|
98
|
+
zoomAt(x: number, y: number, factor: number): void;
|
|
99
|
+
resetZoom(): void;
|
|
100
|
+
getView(): ChartView;
|
|
101
|
+
setView(view: Partial<ChartView>): void;
|
|
102
|
+
/** Shows / hides a series (like a legend click) */
|
|
103
|
+
toggleSeries(id: string): void;
|
|
104
|
+
/** Hides the tooltip */
|
|
105
|
+
clearHover(): void;
|
|
106
|
+
getPlotRect(): ChartRect | null;
|
|
107
|
+
toPixel(x: number, y: number): {
|
|
108
|
+
x: number;
|
|
109
|
+
y: number;
|
|
110
|
+
} | null;
|
|
111
|
+
fromPixel(x: number, y: number): {
|
|
112
|
+
x: number;
|
|
113
|
+
y: number;
|
|
114
|
+
} | null;
|
|
115
|
+
on<K extends keyof ChartControllerEventMap>(type: K, listener: (event: ChartControllerEventMap[K]) => void): () => void;
|
|
116
|
+
destroy(): void;
|
|
117
|
+
}
|
|
118
|
+
export declare const createChartController: (config: ChartControllerConfig) => ChartController;
|
|
119
|
+
/** A polyline (pixels of the chart): interleaved x, y */
|
|
120
|
+
export interface ChartLinePrimitive {
|
|
121
|
+
kind: "line";
|
|
122
|
+
seriesIndex: number;
|
|
123
|
+
color: string;
|
|
124
|
+
width: number;
|
|
125
|
+
/** Runs of points without gaps */
|
|
126
|
+
segments: number[][];
|
|
127
|
+
}
|
|
128
|
+
export interface ChartAreaPrimitive {
|
|
129
|
+
kind: "area";
|
|
130
|
+
seriesIndex: number;
|
|
131
|
+
color: string;
|
|
132
|
+
opacity: number;
|
|
133
|
+
/** Y pixel of the baseline */
|
|
134
|
+
baseline: number;
|
|
135
|
+
segments: number[][];
|
|
136
|
+
/** Stacked areas: y pixel of the bottom edge under every point of `segments` */
|
|
137
|
+
bottoms?: number[][];
|
|
138
|
+
}
|
|
139
|
+
export interface ChartBarPrimitive {
|
|
140
|
+
kind: "bars";
|
|
141
|
+
seriesIndex: number;
|
|
142
|
+
color: string;
|
|
143
|
+
/** Interleaved x, y, width, height */
|
|
144
|
+
rects: number[];
|
|
145
|
+
/** CSS color of every rect (candlesticks, heatmap cells, colored bars); `color` otherwise */
|
|
146
|
+
colors?: string[];
|
|
147
|
+
/** Corner radius in pixels */
|
|
148
|
+
radius?: number;
|
|
149
|
+
}
|
|
150
|
+
export interface ChartDotPrimitive {
|
|
151
|
+
kind: "dots";
|
|
152
|
+
seriesIndex: number;
|
|
153
|
+
opacity: number;
|
|
154
|
+
/** Interleaved x, y, diameter */
|
|
155
|
+
dots: number[];
|
|
156
|
+
/** CSS color of every dot */
|
|
157
|
+
colors: string[];
|
|
158
|
+
}
|
|
159
|
+
export type ChartPrimitive = ChartLinePrimitive | ChartAreaPrimitive | ChartBarPrimitive | ChartDotPrimitive;
|
|
160
|
+
export interface ChartPrimitiveOptions {
|
|
161
|
+
/**
|
|
162
|
+
* Upper bound of the dots drawn per series: above it the dots are merged
|
|
163
|
+
* into one per occupied cell of their size
|
|
164
|
+
* @default 4000
|
|
165
|
+
*/
|
|
166
|
+
maxDots?: number;
|
|
167
|
+
/**
|
|
168
|
+
* Upper bound of the bars drawn per series: above it neighboring bars
|
|
169
|
+
* sharing a pixel column are merged
|
|
170
|
+
* @default 2000
|
|
171
|
+
*/
|
|
172
|
+
maxBars?: number;
|
|
173
|
+
/**
|
|
174
|
+
* Width in pixels of the columns lines are decimated to (at most four
|
|
175
|
+
* points per column); larger values mean fewer shapes
|
|
176
|
+
* @default 1
|
|
177
|
+
*/
|
|
178
|
+
columnWidth?: number;
|
|
179
|
+
/** Size of the cells dots are merged into (the dot size by default) */
|
|
180
|
+
dotCell?: number;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Data of a scene as simple shapes in pixels of the chart, for hosts
|
|
184
|
+
* without a canvas (React Native views, SVG): lines are decimated to a few
|
|
185
|
+
* points per pixel column and large point sets are merged per cell, so the
|
|
186
|
+
* number of shapes stays bounded by the size of the chart.
|
|
187
|
+
*/
|
|
188
|
+
export declare const scenePrimitives: (scene: ChartScene, limits?: ChartPrimitiveOptions) => ChartPrimitive[];
|