minerva-design 1.2.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 +7 -0
- package/dist/charts/canvas.d.cts +4 -1
- package/dist/charts/canvas.d.ts +4 -1
- package/dist/charts/core.cjs +1 -1
- package/dist/charts/core.d.cts +5 -2
- package/dist/charts/core.d.ts +5 -2
- package/dist/charts/core.js +6 -4
- package/dist/charts/engine/canvas.cjs +1 -1
- package/dist/charts/engine/canvas.cjs.map +1 -1
- package/dist/charts/engine/canvas.js +65 -53
- package/dist/charts/engine/canvas.js.map +1 -1
- package/dist/charts/engine/chart.cjs +1 -2
- package/dist/charts/engine/chart.cjs.map +1 -1
- package/dist/charts/engine/chart.js +342 -323
- 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 +17 -0
- package/dist/charts/engine/color.d.ts +17 -0
- package/dist/charts/engine/color.js +27 -3
- package/dist/charts/engine/color.js.map +1 -1
- package/dist/charts/engine/controller.cjs +2 -2
- package/dist/charts/engine/controller.cjs.map +1 -1
- package/dist/charts/engine/controller.d.cts +6 -0
- package/dist/charts/engine/controller.d.ts +6 -0
- package/dist/charts/engine/controller.js +317 -253
- package/dist/charts/engine/controller.js.map +1 -1
- 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 +30 -3
- package/dist/charts/engine/model.d.ts +30 -3
- package/dist/charts/engine/model.js +225 -108
- 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 +2 -0
- package/dist/charts/engine/overlay.d.ts +2 -0
- package/dist/charts/engine/overlay.js +16 -16
- package/dist/charts/engine/overlay.js.map +1 -1
- package/dist/charts/engine/presets.cjs +2 -2
- package/dist/charts/engine/presets.cjs.map +1 -1
- package/dist/charts/engine/presets.d.cts +71 -5
- package/dist/charts/engine/presets.d.ts +71 -5
- package/dist/charts/engine/presets.js +120 -33
- package/dist/charts/engine/presets.js.map +1 -1
- package/dist/charts/engine/renderers/canvas2d.cjs +1 -1
- package/dist/charts/engine/renderers/canvas2d.cjs.map +1 -1
- package/dist/charts/engine/renderers/canvas2d.js +149 -111
- 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 +1 -1
- package/dist/charts/engine/scene.cjs.map +1 -1
- package/dist/charts/engine/scene.d.cts +19 -6
- package/dist/charts/engine/scene.d.ts +19 -6
- package/dist/charts/engine/scene.js +201 -89
- package/dist/charts/engine/scene.js.map +1 -1
- 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 +10 -1
- package/dist/charts/engine/theme.d.ts +10 -1
- package/dist/charts/engine/theme.js +40 -16
- package/dist/charts/engine/theme.js.map +1 -1
- package/dist/charts/engine/types.d.cts +70 -9
- package/dist/charts/engine/types.d.ts +70 -9
- 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 -5
- package/dist/charts/react/Chart.cjs +1 -1
- package/dist/charts/react/Chart.cjs.map +1 -1
- package/dist/charts/react/Chart.d.cts +8 -1
- package/dist/charts/react/Chart.d.ts +8 -1
- package/dist/charts/react/Chart.js +66 -47
- 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 +10 -2
- package/dist/charts/react/charts.d.ts +10 -2
- package/dist/charts/react/charts.js +174 -51
- 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 +73 -4
- package/dist/charts/react/types.d.ts +73 -4
- package/dist/native/charts/src/engine/color.cjs +1 -1
- package/dist/native/charts/src/engine/color.cjs.map +1 -1
- package/dist/native/charts/src/engine/color.js +12 -3
- package/dist/native/charts/src/engine/color.js.map +1 -1
- package/dist/native/charts/src/engine/controller.cjs +2 -2
- package/dist/native/charts/src/engine/controller.cjs.map +1 -1
- package/dist/native/charts/src/engine/controller.js +334 -270
- package/dist/native/charts/src/engine/controller.js.map +1 -1
- 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 +1 -1
- package/dist/native/charts/src/engine/data.cjs.map +1 -1
- package/dist/native/charts/src/engine/data.js +98 -38
- package/dist/native/charts/src/engine/data.js.map +1 -1
- package/dist/native/charts/src/engine/model.cjs +1 -1
- package/dist/native/charts/src/engine/model.cjs.map +1 -1
- package/dist/native/charts/src/engine/model.js +229 -112
- package/dist/native/charts/src/engine/model.js.map +1 -1
- package/dist/native/charts/src/engine/overlay.cjs +1 -1
- package/dist/native/charts/src/engine/overlay.cjs.map +1 -1
- package/dist/native/charts/src/engine/overlay.js +16 -16
- package/dist/native/charts/src/engine/overlay.js.map +1 -1
- package/dist/native/charts/src/engine/presets.cjs +1 -1
- package/dist/native/charts/src/engine/presets.cjs.map +1 -1
- package/dist/native/charts/src/engine/presets.js +11 -4
- package/dist/native/charts/src/engine/presets.js.map +1 -1
- package/dist/native/charts/src/engine/scene.cjs +1 -1
- package/dist/native/charts/src/engine/scene.cjs.map +1 -1
- package/dist/native/charts/src/engine/scene.js +209 -97
- package/dist/native/charts/src/engine/scene.js.map +1 -1
- package/dist/native/charts/src/engine/theme.cjs.map +1 -1
- package/dist/native/charts/src/engine/theme.js.map +1 -1
- package/dist/native/components/Chart/scene.cjs +1 -1
- package/dist/native/components/Chart/scene.cjs.map +1 -1
- package/dist/native/components/Chart/scene.js +31 -19
- package/dist/native/components/Chart/scene.js.map +1 -1
- package/dist/native/source/components/Chart/scene.tsx +54 -20
- package/dist/taro/index.js +1059 -579
- package/dist/uni/charts-canvas.js +3 -1
- package/dist/weapp/controls.js +966 -225
- package/package.json +1 -1
|
@@ -1,91 +1,162 @@
|
|
|
1
1
|
import { packColor as e } from "./color.js";
|
|
2
|
-
import {
|
|
2
|
+
import { curvePoints as t } from "./curve.js";
|
|
3
|
+
import { GAP as n } from "./renderers/types.js";
|
|
3
4
|
//#region src/engine/items.ts
|
|
4
|
-
var
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
5
|
+
var r = (e, t) => Number.isFinite(e) ? e - t : n, i = {
|
|
6
|
+
heatmap: 0,
|
|
7
|
+
area: 1,
|
|
8
|
+
bar: 2,
|
|
9
|
+
candlestick: 3,
|
|
10
|
+
line: 4,
|
|
11
|
+
scatter: 5
|
|
12
|
+
}, a = (e) => {
|
|
13
|
+
let { x: n, count: r } = e.cols, i = e.stackTop ?? e.cols.y, a = e.stackBase;
|
|
14
|
+
if (e.curve === "linear") return {
|
|
15
|
+
n: r,
|
|
16
|
+
xAt: (e) => n[e],
|
|
17
|
+
yAt: (e) => i[e],
|
|
18
|
+
baseAt: a ? (e) => a[e] : null
|
|
19
|
+
};
|
|
20
|
+
let o = t(n, i, 0, r, e.curve), s = a ? t(n, a, 0, r, e.curve).points : null, c = o.points;
|
|
21
|
+
return {
|
|
22
|
+
n: o.length,
|
|
23
|
+
xAt: (e) => c[e * 2],
|
|
24
|
+
yAt: (e) => c[e * 2 + 1],
|
|
25
|
+
baseAt: s ? (e) => s[e * 2 + 1] : null
|
|
26
|
+
};
|
|
27
|
+
}, o = (e, t, n, r, i, a) => {
|
|
28
|
+
let o = /* @__PURE__ */ new ArrayBuffer(r * 16), s = new Float32Array(o), c = new Uint32Array(o);
|
|
29
|
+
for (let e = 0; e < r; e++) i(e, s, c);
|
|
30
|
+
return {
|
|
31
|
+
kind: "bar",
|
|
32
|
+
key: e,
|
|
33
|
+
version: t,
|
|
34
|
+
color: n.color,
|
|
35
|
+
instances: o,
|
|
36
|
+
count: r,
|
|
37
|
+
...a
|
|
38
|
+
};
|
|
39
|
+
}, s = (t, s, c) => {
|
|
40
|
+
let l = [], u = [], d = t.series.filter((e) => !e.hidden).sort((e, t) => i[e.type] - i[t.type] || e.index - t.index);
|
|
41
|
+
for (let i of d) {
|
|
42
|
+
let { x: d, y: f, count: p, sorted: m } = i.cols;
|
|
43
|
+
switch ((i.type === "line" || i.type === "scatter") && u.length && l.push(...u.splice(0)), i.type) {
|
|
18
44
|
case "line":
|
|
19
45
|
case "area": {
|
|
20
|
-
let e
|
|
21
|
-
i.
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
46
|
+
let { n: e, xAt: o, yAt: p, baseAt: h } = a(i), g = new Float32Array(e * 2);
|
|
47
|
+
if (i.curve === "linear") {
|
|
48
|
+
let t = i.stackTop ?? f, r = s.x, a = s.y;
|
|
49
|
+
for (let i = 0; i < e; i++) {
|
|
50
|
+
let e = d[i], o = t[i];
|
|
51
|
+
g[i * 2] = Number.isFinite(e) ? e - r : n, g[i * 2 + 1] = Number.isFinite(o) ? o - a : n;
|
|
52
|
+
}
|
|
53
|
+
} else for (let t = 0; t < e; t++) g[t * 2] = r(o(t), s.x), g[t * 2 + 1] = r(p(t), s.y);
|
|
54
|
+
if (i.type === "area") {
|
|
55
|
+
let n = new Float32Array(e * 3), a = t.baseline - s.y;
|
|
56
|
+
for (let t = 0; t < e; t++) n[t * 3] = g[t * 2], n[t * 3 + 1] = g[t * 2 + 1], n[t * 3 + 2] = h ? r(h(t), s.y) : a;
|
|
57
|
+
l.push({
|
|
58
|
+
kind: "area",
|
|
59
|
+
key: `${i.key}:area`,
|
|
60
|
+
version: c,
|
|
61
|
+
color: i.color,
|
|
62
|
+
points: n,
|
|
63
|
+
count: e,
|
|
64
|
+
opacity: i.opacity,
|
|
65
|
+
sorted: m
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
(i.type === "area" ? u : l).push({
|
|
32
69
|
kind: "line",
|
|
33
70
|
key: `${i.key}:line`,
|
|
34
|
-
version:
|
|
71
|
+
version: c,
|
|
35
72
|
color: i.color,
|
|
36
|
-
points:
|
|
37
|
-
count:
|
|
73
|
+
points: g,
|
|
74
|
+
count: e,
|
|
38
75
|
width: i.lineWidth,
|
|
39
|
-
sorted:
|
|
76
|
+
sorted: m
|
|
40
77
|
});
|
|
41
78
|
break;
|
|
42
79
|
}
|
|
43
80
|
case "bar": {
|
|
44
|
-
let
|
|
45
|
-
|
|
46
|
-
let
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
key: `${i.key}:bar`,
|
|
52
|
-
version: s,
|
|
53
|
-
color: i.color,
|
|
54
|
-
instances: l,
|
|
55
|
-
count: f,
|
|
81
|
+
let a = i.barBase ?? new Float64Array(p), u = i.barTop ?? f, h = e(i.color), g = t.series.some((e) => e !== i && !e.hidden && e.type === "bar" && e.barOffset === i.barOffset);
|
|
82
|
+
l.push(o(`${i.key}:bar`, c, i, p, (t, o, c) => {
|
|
83
|
+
let l = Number.isFinite(u[t]) && Number.isFinite(a[t]);
|
|
84
|
+
o[t * 4] = r(d[t] + i.barOffset, s.x), o[t * 4 + 1] = l ? a[t] - s.y : n, o[t * 4 + 2] = l ? u[t] - s.y : n;
|
|
85
|
+
let f = i.pointColors?.[t];
|
|
86
|
+
c[t * 4 + 3] = f ? e(f) : h;
|
|
87
|
+
}, {
|
|
56
88
|
halfWidth: i.barHalfWidth,
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
89
|
+
radius: g ? 0 : i.radius,
|
|
90
|
+
inset: 0,
|
|
91
|
+
minHalf: 0,
|
|
92
|
+
sorted: m
|
|
93
|
+
}));
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
case "candlestick": {
|
|
97
|
+
let { open: t, high: a, low: u } = i.cols, h = e(i.upColor), g = e(i.downColor), _ = (e) => t && Number.isFinite(t[e]) && f[e] < t[e] ? g : h;
|
|
98
|
+
l.push(o(`${i.key}:wick`, c, i, p, (e, t, i) => {
|
|
99
|
+
let o = a ? a[e] : f[e], c = u ? u[e] : f[e], l = Number.isFinite(o) && Number.isFinite(c) && Number.isFinite(f[e]);
|
|
100
|
+
t[e * 4] = r(d[e], s.x), t[e * 4 + 1] = l ? c - s.y : n, t[e * 4 + 2] = l ? o - s.y : n, i[e * 4 + 3] = _(e);
|
|
101
|
+
}, {
|
|
102
|
+
halfWidth: 0,
|
|
103
|
+
radius: 0,
|
|
104
|
+
inset: 0,
|
|
105
|
+
minHalf: i.lineWidth / 2,
|
|
106
|
+
sorted: m
|
|
107
|
+
}), o(`${i.key}:body`, c, i, p, (e, i, a) => {
|
|
108
|
+
let o = t ? t[e] : f[e], c = Number.isFinite(o) && Number.isFinite(f[e]);
|
|
109
|
+
i[e * 4] = r(d[e], s.x), i[e * 4 + 1] = c ? o - s.y : n, i[e * 4 + 2] = c ? f[e] - s.y : n, a[e * 4 + 3] = _(e);
|
|
110
|
+
}, {
|
|
111
|
+
halfWidth: i.barHalfWidth,
|
|
112
|
+
radius: Math.min(i.radius, 1.5),
|
|
113
|
+
inset: 0,
|
|
114
|
+
minHalf: .5,
|
|
115
|
+
sorted: m
|
|
116
|
+
}));
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
case "heatmap": {
|
|
120
|
+
let e = i.cellColors, t = i.cellHalf.y;
|
|
121
|
+
l.push(o(`${i.key}:cells`, c, i, p, (i, a, o) => {
|
|
122
|
+
let c = e ? e[i] : 0, l = c !== 0 && Number.isFinite(d[i]);
|
|
123
|
+
a[i * 4] = r(d[i], s.x), a[i * 4 + 1] = l ? f[i] - t - s.y : n, a[i * 4 + 2] = l ? f[i] + t - s.y : n, o[i * 4 + 3] = c;
|
|
124
|
+
}, {
|
|
125
|
+
halfWidth: i.cellHalf.x,
|
|
126
|
+
radius: i.radius,
|
|
127
|
+
inset: 1,
|
|
128
|
+
minHalf: 0,
|
|
129
|
+
sorted: m
|
|
130
|
+
}));
|
|
60
131
|
break;
|
|
61
132
|
}
|
|
62
133
|
default: {
|
|
63
|
-
let
|
|
64
|
-
for (let
|
|
65
|
-
let
|
|
66
|
-
r[
|
|
67
|
-
let
|
|
68
|
-
r[
|
|
69
|
-
let
|
|
70
|
-
a[
|
|
134
|
+
let t = /* @__PURE__ */ new ArrayBuffer(p * 16), r = new Float32Array(t), a = new Uint32Array(t), o = e(i.color), u = i.cols.size;
|
|
135
|
+
for (let t = 0; t < p; t++) {
|
|
136
|
+
let c = Number.isFinite(f[t]) && Number.isFinite(d[t]);
|
|
137
|
+
r[t * 4] = c ? d[t] - s.x : n, r[t * 4 + 1] = c ? f[t] - s.y : n;
|
|
138
|
+
let l = u ? u[t] : NaN;
|
|
139
|
+
r[t * 4 + 2] = Number.isFinite(l) && l > 0 ? l : i.pointSize;
|
|
140
|
+
let p = i.pointColors?.[t];
|
|
141
|
+
a[t * 4 + 3] = p ? e(p) : o;
|
|
71
142
|
}
|
|
72
|
-
|
|
143
|
+
l.push({
|
|
73
144
|
kind: "scatter",
|
|
74
145
|
key: `${i.key}:scatter`,
|
|
75
|
-
version:
|
|
146
|
+
version: c,
|
|
76
147
|
color: i.color,
|
|
77
|
-
instances:
|
|
78
|
-
count:
|
|
148
|
+
instances: t,
|
|
149
|
+
count: p,
|
|
79
150
|
opacity: i.opacity,
|
|
80
|
-
stroke:
|
|
151
|
+
stroke: p <= 5e3 ? 1.25 : 0
|
|
81
152
|
});
|
|
82
153
|
break;
|
|
83
154
|
}
|
|
84
155
|
}
|
|
85
156
|
}
|
|
86
|
-
return
|
|
157
|
+
return l.push(...u), l;
|
|
87
158
|
};
|
|
88
159
|
//#endregion
|
|
89
|
-
export {
|
|
160
|
+
export { s as buildItems };
|
|
90
161
|
|
|
91
162
|
//# sourceMappingURL=items.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"items.js","names":["rel","value","origin","GAP","points","out","count","i","x","o","y","DRAW_ORDER","buildItems","items","outlines","ordered","model","s","a","b","pts","base","top","instances","valid","buffer","f","u","seriesColor","packColor","sizes","size","pc"],"sources":["../../../../charts/src/engine/items.ts"],"sourcesContent":["// Chart model -> GPU-ready buffers (positions relative to an origin).\n\nimport { packColor } from \"./color\";\nimport type { ChartModel } from \"./model\";\nimport { GAP, SCATTER_STRIDE, type RenderItem } from \"./renderers/types\";\n\nexport interface Origin {\n x: number;\n y: number;\n}\n\nconst rel = (value: number, origin: number) =>\n Number.isFinite(value) ? value - origin : GAP;\n\nconst points = (x: Float64Array, y: Float64Array, count: number, o: Origin) => {\n const out = new Float32Array(count * 2);\n for (let i = 0; i < count; i++) {\n // x stays real at gaps so sorted data can be binary searched\n out[i * 2] = rel(x[i], o.x);\n out[i * 2 + 1] = Number.isFinite(y[i]) ? y[i] - o.y : GAP;\n }\n return out;\n};\n\nconst DRAW_ORDER = { area: 0, bar: 1, line: 2, scatter: 3 } as const;\n\n/** Render items of the visible series, back to front */\nexport const buildItems = (\n model: ChartModel,\n origin: Origin,\n version: number,\n): RenderItem[] => {\n const items: RenderItem[] = [];\n /** Outlines of the areas are drawn with the lines, above the bars */\n const outlines: RenderItem[] = [];\n const ordered = model.series\n .filter((s) => !s.hidden)\n .sort(\n (a, b) => DRAW_ORDER[a.type] - DRAW_ORDER[b.type] || a.index - b.index,\n );\n for (const s of ordered) {\n const { x, y, count, sorted } = s.cols;\n if ((s.type === \"line\" || s.type === \"scatter\") && outlines.length) {\n items.push(...outlines.splice(0));\n }\n switch (s.type) {\n case \"line\":\n case \"area\": {\n const pts = points(x, y, count, origin);\n if (s.type === \"area\") {\n items.push({\n kind: \"area\",\n key: `${s.key}:area`,\n version,\n color: s.color,\n points: pts,\n count,\n baseline: model.baseline - origin.y,\n opacity: s.opacity,\n sorted,\n });\n }\n (s.type === \"area\" ? outlines : items).push({\n kind: \"line\",\n key: `${s.key}:line`,\n version,\n color: s.color,\n points: pts,\n count,\n width: s.lineWidth,\n sorted,\n });\n break;\n }\n case \"bar\": {\n const base = s.barBase ?? new Float64Array(count);\n const top = s.barTop ?? y;\n const instances = new Float32Array(count * 3);\n for (let i = 0; i < count; i++) {\n const valid = Number.isFinite(top[i]) && Number.isFinite(base[i]);\n instances[i * 3] = rel(x[i] + s.barOffset, origin.x);\n instances[i * 3 + 1] = valid ? base[i] - origin.y : GAP;\n instances[i * 3 + 2] = valid ? top[i] - origin.y : GAP;\n }\n items.push({\n kind: \"bar\",\n key: `${s.key}:bar`,\n version,\n color: s.color,\n instances,\n count,\n halfWidth: s.barHalfWidth,\n sorted,\n radius: model.series.some(\n (o) =>\n o !== s &&\n !o.hidden &&\n o.type === \"bar\" &&\n o.barOffset === s.barOffset,\n )\n ? 0\n : 3,\n });\n break;\n }\n default: {\n const buffer = new ArrayBuffer(count * SCATTER_STRIDE);\n const f = new Float32Array(buffer);\n const u = new Uint32Array(buffer);\n const seriesColor = packColor(s.color);\n const sizes = s.cols.size;\n for (let i = 0; i < count; i++) {\n const valid = Number.isFinite(y[i]) && Number.isFinite(x[i]);\n f[i * 4] = valid ? x[i] - origin.x : GAP;\n f[i * 4 + 1] = valid ? y[i] - origin.y : GAP;\n const size = sizes ? sizes[i] : NaN;\n f[i * 4 + 2] = Number.isFinite(size) && size > 0 ? size : s.pointSize;\n const pc = s.pointColors?.[i];\n u[i * 4 + 3] = pc ? packColor(pc) : seriesColor;\n }\n items.push({\n kind: \"scatter\",\n key: `${s.key}:scatter`,\n version,\n color: s.color,\n instances: buffer,\n count,\n opacity: s.opacity,\n stroke: count <= 5000 ? 1.25 : 0,\n });\n break;\n }\n }\n }\n items.push(...outlines);\n return items;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"items.js","names":["rel","value","origin","GAP","DRAW_ORDER","linePoints","s","top","stackBase","count","x","i","curved","curvePoints","base","points","barItem","instances","f","u","extra","buildItems","items","outlines","ordered","model","a","b","pts","n","y","ox","oy","xv","yv","xAt","yAt","area","baseline","baseAt","seriesColor","packColor","shared","o","version","valid","pc","up","down","colorAt","open","hi","high","lo","low","colors","hy","buffer","sizes","size"],"sources":["../../../../charts/src/engine/items.ts"],"sourcesContent":["// Chart model -> GPU-ready buffers (positions relative to an origin).\n\nimport { packColor } from \"./color\";\nimport { curvePoints } from \"./curve\";\nimport type { ChartModel, SeriesModel } from \"./model\";\nimport {\n AREA_STRIDE,\n BAR_STRIDE,\n GAP,\n SCATTER_STRIDE,\n type BarItem,\n type RenderItem,\n} from \"./renderers/types\";\n\nexport interface Origin {\n x: number;\n y: number;\n}\n\nconst rel = (value: number, origin: number) =>\n Number.isFinite(value) ? value - origin : GAP;\n\nconst DRAW_ORDER = {\n heatmap: 0,\n area: 1,\n bar: 2,\n candlestick: 3,\n line: 4,\n scatter: 5,\n} as const;\n\n/** Line (and area) points of a series: stacked, curved; interleaved x, y */\nconst linePoints = (s: SeriesModel) => {\n const { x, count } = s.cols;\n const top = s.stackTop ?? s.cols.y;\n const stackBase = s.stackBase;\n if (s.curve === \"linear\") {\n // no copy: the hot path of large series\n return {\n n: count,\n xAt: (i: number) => x[i],\n yAt: (i: number) => top[i],\n baseAt: stackBase ? (i: number) => stackBase[i] : null,\n };\n }\n const curved = curvePoints(x, top, 0, count, s.curve);\n const base = stackBase\n ? curvePoints(x, stackBase, 0, count, s.curve).points\n : null;\n const points = curved.points;\n return {\n // the buffers are allocated for the worst case: only `length` are written\n n: curved.length,\n xAt: (i: number) => points[i * 2],\n yAt: (i: number) => points[i * 2 + 1],\n baseAt: base ? (i: number) => base[i * 2 + 1] : null,\n };\n};\n\nconst barItem = (\n key: string,\n version: number,\n s: SeriesModel,\n count: number,\n write: (i: number, f: Float32Array, u: Uint32Array) => void,\n extra: Pick<BarItem, \"halfWidth\" | \"radius\" | \"inset\" | \"minHalf\" | \"sorted\">,\n): BarItem => {\n const instances = new ArrayBuffer(count * BAR_STRIDE);\n const f = new Float32Array(instances);\n const u = new Uint32Array(instances);\n for (let i = 0; i < count; i++) write(i, f, u);\n return {\n kind: \"bar\",\n key,\n version,\n color: s.color,\n instances,\n count,\n ...extra,\n };\n};\n\n/** Render items of the visible series, back to front */\nexport const buildItems = (\n model: ChartModel,\n origin: Origin,\n version: number,\n): RenderItem[] => {\n const items: RenderItem[] = [];\n /** Outlines of the areas are drawn with the lines, above the bars */\n const outlines: RenderItem[] = [];\n const ordered = model.series\n .filter((s) => !s.hidden)\n .sort(\n (a, b) => DRAW_ORDER[a.type] - DRAW_ORDER[b.type] || a.index - b.index,\n );\n for (const s of ordered) {\n const { x, y, count, sorted } = s.cols;\n if ((s.type === \"line\" || s.type === \"scatter\") && outlines.length) {\n items.push(...outlines.splice(0));\n }\n switch (s.type) {\n case \"line\":\n case \"area\": {\n const { n, xAt, yAt, baseAt } = linePoints(s);\n const pts = new Float32Array(n * 2);\n if (s.curve === \"linear\") {\n // direct loop: the hot path of very large series\n const top = s.stackTop ?? y;\n const ox = origin.x;\n const oy = origin.y;\n for (let i = 0; i < n; i++) {\n const xv = x[i];\n const yv = top[i];\n pts[i * 2] = Number.isFinite(xv) ? xv - ox : GAP;\n pts[i * 2 + 1] = Number.isFinite(yv) ? yv - oy : GAP;\n }\n } else {\n for (let i = 0; i < n; i++) {\n // x stays real at gaps so sorted data can be binary searched\n pts[i * 2] = rel(xAt(i), origin.x);\n pts[i * 2 + 1] = rel(yAt(i), origin.y);\n }\n }\n if (s.type === \"area\") {\n const area = new Float32Array(n * AREA_STRIDE);\n const baseline = model.baseline - origin.y;\n for (let i = 0; i < n; i++) {\n area[i * 3] = pts[i * 2];\n area[i * 3 + 1] = pts[i * 2 + 1];\n area[i * 3 + 2] = baseAt ? rel(baseAt(i), origin.y) : baseline;\n }\n items.push({\n kind: \"area\",\n key: `${s.key}:area`,\n version,\n color: s.color,\n points: area,\n count: n,\n opacity: s.opacity,\n sorted,\n });\n }\n (s.type === \"area\" ? outlines : items).push({\n kind: \"line\",\n key: `${s.key}:line`,\n version,\n color: s.color,\n points: pts,\n count: n,\n width: s.lineWidth,\n sorted,\n });\n break;\n }\n case \"bar\": {\n const base = s.barBase ?? new Float64Array(count);\n const top = s.barTop ?? y;\n const seriesColor = packColor(s.color);\n const shared = model.series.some(\n (o) =>\n o !== s &&\n !o.hidden &&\n o.type === \"bar\" &&\n o.barOffset === s.barOffset,\n );\n items.push(\n barItem(\n `${s.key}:bar`,\n version,\n s,\n count,\n (i, f, u) => {\n const valid = Number.isFinite(top[i]) && Number.isFinite(base[i]);\n f[i * 4] = rel(x[i] + s.barOffset, origin.x);\n f[i * 4 + 1] = valid ? base[i] - origin.y : GAP;\n f[i * 4 + 2] = valid ? top[i] - origin.y : GAP;\n const pc = s.pointColors?.[i];\n u[i * 4 + 3] = pc ? packColor(pc) : seriesColor;\n },\n {\n halfWidth: s.barHalfWidth,\n // stacked segments stay square so the stack reads as one bar\n radius: shared ? 0 : s.radius,\n inset: 0,\n minHalf: 0,\n sorted,\n },\n ),\n );\n break;\n }\n case \"candlestick\": {\n const { open, high, low } = s.cols;\n const up = packColor(s.upColor);\n const down = packColor(s.downColor);\n const colorAt = (i: number) =>\n open && Number.isFinite(open[i]) && y[i] < open[i] ? down : up;\n // wicks first, the bodies cover them\n items.push(\n barItem(\n `${s.key}:wick`,\n version,\n s,\n count,\n (i, f, u) => {\n const hi = high ? high[i] : y[i];\n const lo = low ? low[i] : y[i];\n const valid =\n Number.isFinite(hi) &&\n Number.isFinite(lo) &&\n Number.isFinite(y[i]);\n f[i * 4] = rel(x[i], origin.x);\n f[i * 4 + 1] = valid ? lo - origin.y : GAP;\n f[i * 4 + 2] = valid ? hi - origin.y : GAP;\n u[i * 4 + 3] = colorAt(i);\n },\n {\n halfWidth: 0,\n radius: 0,\n inset: 0,\n minHalf: s.lineWidth / 2,\n sorted,\n },\n ),\n barItem(\n `${s.key}:body`,\n version,\n s,\n count,\n (i, f, u) => {\n const o = open ? open[i] : y[i];\n const valid = Number.isFinite(o) && Number.isFinite(y[i]);\n f[i * 4] = rel(x[i], origin.x);\n f[i * 4 + 1] = valid ? o - origin.y : GAP;\n f[i * 4 + 2] = valid ? y[i] - origin.y : GAP;\n u[i * 4 + 3] = colorAt(i);\n },\n {\n halfWidth: s.barHalfWidth,\n radius: Math.min(s.radius, 1.5),\n inset: 0,\n minHalf: 0.5,\n sorted,\n },\n ),\n );\n break;\n }\n case \"heatmap\": {\n const colors = s.cellColors;\n const hy = s.cellHalf.y;\n items.push(\n barItem(\n `${s.key}:cells`,\n version,\n s,\n count,\n (i, f, u) => {\n const c = colors ? colors[i] : 0;\n const valid = c !== 0 && Number.isFinite(x[i]);\n f[i * 4] = rel(x[i], origin.x);\n f[i * 4 + 1] = valid ? y[i] - hy - origin.y : GAP;\n f[i * 4 + 2] = valid ? y[i] + hy - origin.y : GAP;\n u[i * 4 + 3] = c;\n },\n {\n halfWidth: s.cellHalf.x,\n radius: s.radius,\n inset: 1,\n minHalf: 0,\n sorted,\n },\n ),\n );\n break;\n }\n default: {\n const buffer = new ArrayBuffer(count * SCATTER_STRIDE);\n const f = new Float32Array(buffer);\n const u = new Uint32Array(buffer);\n const seriesColor = packColor(s.color);\n const sizes = s.cols.size;\n for (let i = 0; i < count; i++) {\n const valid = Number.isFinite(y[i]) && Number.isFinite(x[i]);\n f[i * 4] = valid ? x[i] - origin.x : GAP;\n f[i * 4 + 1] = valid ? y[i] - origin.y : GAP;\n const size = sizes ? sizes[i] : NaN;\n f[i * 4 + 2] = Number.isFinite(size) && size > 0 ? size : s.pointSize;\n const pc = s.pointColors?.[i];\n u[i * 4 + 3] = pc ? packColor(pc) : seriesColor;\n }\n items.push({\n kind: \"scatter\",\n key: `${s.key}:scatter`,\n version,\n color: s.color,\n instances: buffer,\n count,\n opacity: s.opacity,\n stroke: count <= 5000 ? 1.25 : 0,\n });\n break;\n }\n }\n }\n items.push(...outlines);\n return items;\n};\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("./data.cjs"),t=require("./color.cjs"),n=require("./scale.cjs"),r=require("./spatial.cjs");var i=e=>{if(typeof e==`object`&&e&&!(`length`in e)){let t=e.x;return t&&t.length?t[0]:void 0}let t=e;for(let e=0;e<Math.min(t.length,8);e++){let n=t[e];if(Array.isArray(n))return n[0];if(n&&typeof n==`object`)return n.x}},a=e=>{for(let t of e){let e=i(t);if(e instanceof Date)return`time`;if(typeof e==`string`)return`category`}return`linear`},o=(e,t,n,r)=>({type:t,reverse:!!e?.reverse,categories:n,title:e?.title,format:e?.format,grid:e?.grid??r,visible:e?.visible??!0,tickCount:e?.tickCount}),s=e=>{let t=1/0,n=-1/0;for(let r=0;r<e.length;r++){let i=e[r];Number.isFinite(i)&&(i<t&&(t=i),i>n&&(n=i))}return[t,n]},c=e=>{let
|
|
1
|
+
const e=require("./data.cjs"),t=require("./color.cjs"),n=require("./scale.cjs"),r=require("./spatial.cjs");var i=e=>{if(typeof e==`object`&&e&&!(`length`in e)){let t=e.x;return t&&t.length?t[0]:void 0}let t=e;for(let e=0;e<Math.min(t.length,8);e++){let n=t[e];if(Array.isArray(n))return n[0];if(n&&typeof n==`object`)return n.x}},a=e=>{for(let t of e){let e=i(t);if(e instanceof Date)return`time`;if(typeof e==`string`)return`category`}return`linear`},o=(e,t,n,r)=>({type:t,reverse:!!e?.reverse,categories:n,title:e?.title,format:e?.format,grid:e?.grid??r,visible:e?.visible??!0,tickCount:e?.tickCount}),s=e=>{let t=1/0,n=-1/0;for(let r=0;r<e.length;r++){let i=e[r];Number.isFinite(i)&&(i<t&&(t=i),i>n&&(n=i))}return[t,n]},c=(e,t)=>{let n=1/0;return e.forEach((e,r)=>{let i=t[r]?e:Float64Array.from(e).sort();for(let e=1;e<i.length;e++){let t=i[e]-i[e-1];t>0&&t<n&&(n=t)}}),n},l=(e,t,n)=>{if(n)return 1;let r=c(e.map(e=>t===`x`?e.cols.x:e.cols.y),e.map(e=>t===`x`&&e.cols.sorted));return Number.isFinite(r)?r:1},u=(e,t)=>{let n=new Map;if(t)for(let{s:t,stack:r}of e){let e=n.get(r);e||n.set(r,e=new Map);let{x:i,y:a,count:o}=t.cols;for(let t=0;t<o;t++){let n=a[t];if(!Number.isFinite(n))continue;let r=e.get(i[t])??[0,0];n>=0?r[0]+=n:r[1]-=n,e.set(i[t],r)}}let r=new Map,i=new Map;for(let{stack:t}of e)i.set(t,(i.get(t)??0)+1);return e.map(({s:e,stack:a})=>{let{x:o,y:s,count:c}=e.cols;if(!t&&i.get(a)===1){let e=new Float64Array(c),t=new Float64Array(c);for(let n=0;n<c;n++){let r=s[n],i=Number.isFinite(r);e[n]=i?0:NaN,t[n]=i?r:NaN}return{base:e,top:t}}let l=r.get(a);l||r.set(a,l=new Map);let u=n.get(a),d=new Float64Array(c),f=new Float64Array(c);for(let e=0;e<c;e++){let t=s[e];if(!Number.isFinite(t)){d[e]=NaN,f[e]=NaN;continue}if(u){let n=u.get(o[e]),r=n?t>=0?n[0]:n[1]:0;t=r>0?t/r*100:0}let n=l.get(o[e])??[0,0],r=t>=0?n[0]:n[1];d[e]=r,f[e]=r+t,t>=0?n[0]+=t:n[1]+=t,l.set(o[e],n)}return{base:d,top:f}})},d=`var(--success-color, #16a34a)`,f=`var(--danger-color, #dc2626)`,p=(r,i,c,p,m=null)=>{let h=m??i.resolve??((e,n)=>t.resolveStaticColor(e,{},n)),g=r.series,_=g.map(e=>e.data),v=r.xAxis?.type??a(_),y=v===`category`?[...r.xAxis?.categories??e.collectCategories(_)]:[],b=new Map(y.map((e,t)=>[e,t])),x=e.xResolver(v,e=>b.get(e)??NaN),S=r.yAxis,C=g.filter(e=>e.type===`heatmap`).map(e=>e.data),w=S?.type===`category`||!S?.type&&C.length?[...S?.categories??e.collectYCategories(C)]:[],T=S?.type===`category`||w.length?`category`:S?.type===`time`?`time`:`linear`,E=new Map(w.map((e,t)=>[e,t])),D=e=>typeof e==`number`?e:typeof e==`string`?T===`category`?E.get(e)??NaN:Number(e):NaN,O=`${v}|${y.join(``)}|${T}|${w.join(``)}`,k=r.stackMode===`percent`,A=new Set,j=g.map((n,r)=>{let a=n.id??`#${r}`;for(;A.has(a);)a+=`'`;A.add(a);let o=p.get(a);(!o||o.data!==n.data||o.resolverKey!==O)&&(o={data:n.data,resolverKey:O,cols:e.normalizeData(n.data,x,D)},p.set(a,o));let s=n.type??`line`,l=i.palette[r%i.palette.length],u=n.color?h(n.color,l):l,m=o.cols,g=null;if((s===`scatter`||s===`bar`)&&m.colors){let e=new Map;g=m.colors.map(t=>{if(t===void 0)return;let n=e.get(t);return n||e.set(t,n=h(t,u)),n})}let _=[],v=[0,1],y=null;if(s===`heatmap`){_=n.colorScale&&n.colorScale.length?n.colorScale.map(e=>h(e,u)):[t.mix(i.background,u,.08),u],v=n.valueRange?[n.valueRange[0],n.valueRange[1]]:[m.valueMin,m.valueMax],Number.isFinite(v[0])||(v=[0,1]);let e=m.value??m.y,[r,a]=v,o=a-r||1;y=new Uint32Array(m.count);for(let n=0;n<m.count;n++){let i=e[n];Number.isFinite(i)&&Number.isFinite(m.y[n])&&(y[n]=t.packColor(t.rampColor(_,(i-r)/o)))}}let b=n.id??String(r);return{index:r,key:a,id:b,name:n.name??`Series ${r+1}`,type:s,color:u,colorCss:t.toCss(u),lineWidth:n.lineWidth??(s===`candlestick`?1:2),pointSize:n.pointSize??8,opacity:n.opacity??(s===`area`?.28:s===`scatter`?.78:1),hidden:!!n.hidden||c.has(b),showLabels:!!n.showLabels,curve:n.curve??`linear`,cols:m,barOffset:0,barHalfWidth:0,barBase:null,barTop:null,stackBase:null,stackTop:null,pointColors:g,upColor:s===`candlestick`?h(n.upColor??d,[.09,.64,.29,1]):u,downColor:s===`candlestick`?h(n.downColor??f,[.86,.15,.15,1]):u,cellColors:y,cellHalf:{x:.5,y:.5},colorScale:_,valueRange:v,radius:n.radius??(s===`heatmap`?2:3),format:n.format}}),M=j.filter(e=>!e.hidden),N=j.length>0&&j.every(e=>e.type===`scatter`||e.type===`heatmap`),P=M.filter(e=>e.type===`bar`),F=l(P,`x`,v===`category`);if(P.length){let e=new Map,t=e=>g[e.index].stack??`\u0000${e.key}`;for(let n of P)e.has(t(n))||e.set(t(n),e.size);let n=F*(e.size>1?.78:.62),r=n/e.size,i=u(P.map(e=>({s:e,stack:t(e)})),!1),a=k?u(P.filter(e=>g[e.index].stack!==void 0).map(e=>({s:e,stack:t(e)})),!0):[],o=0;P.forEach((s,c)=>{let l=e.get(t(s))??0;s.barOffset=-n/2+r*(l+.5),s.barHalfWidth=r/2*(e.size>1?.86:1);let u=k&&g[s.index].stack!==void 0?a[o++]:i[c];s.barBase=u.base,s.barTop=u.top})}let I=M.filter(e=>(e.type===`line`||e.type===`area`)&&g[e.index].stack!==void 0);if(I.length){let e=u(I.map(e=>({s:e,stack:g[e.index].stack??``})),k);I.forEach((t,n)=>{t.stackBase=e[n].base,t.stackTop=e[n].top})}let L=M.filter(e=>e.type===`candlestick`),R=l(L,`x`,v===`category`);for(let e of L)e.barHalfWidth=R*.3;let z=M.filter(e=>e.type===`heatmap`);if(z.length){let e=l(z,`x`,v===`category`)/2,t=l(z,`y`,T===`category`)/2;for(let n of z)n.cellHalf={x:e,y:t}}let B=r.xAxis,V;if(v===`category`)V=[-.5,Math.max(1,y.length)-.5];else{let e=[];for(let t of M){e.push(t.cols.xMin,t.cols.xMax);let n=t.type===`bar`?F/2:t.type===`candlestick`?R/2:t.type===`heatmap`?t.cellHalf.x:0;n&&e.push(t.cols.xMin-n,t.cols.xMax+n)}V=n.ensureSpan(...s(e),v===`time`?[Date.now()-864e5,Date.now()]:[0,1]);let t=j.every(e=>e.type===`scatter`);if(t){let e=(V[1]-V[0])*.04;V=[V[0]-e,V[1]+e]}(B?.nice??(t&&v===`linear`))&&v===`linear`&&(V=n.niceDomain(V[0],V[1],B?.tickCount??6))}B?.min!==void 0&&(V[0]=B.min),B?.max!==void 0&&(V[1]=B.max),V=n.ensureSpan(V[0],V[1]);let H;if(T===`category`)H=[-.5,Math.max(1,w.length)-.5];else{let e=[];for(let t of M)t.type===`bar`&&t.barBase&&t.barTop?e.push(...s(t.barBase),...s(t.barTop)):t.stackBase&&t.stackTop?e.push(...s(t.stackBase),...s(t.stackTop)):t.type===`heatmap`?e.push(t.cols.yMin-t.cellHalf.y,t.cols.yMax+t.cellHalf.y):e.push(t.cols.yMin,t.cols.yMax);let t=P.length>0||M.some(e=>e.type===`area`);if((P.length||S?.zero)&&e.push(0),P.some(e=>e.showLabels)){let[t,n]=s(e);n>0&&e.push(n+(n-Math.min(0,t))*.1),t<0&&e.push(t-(Math.max(0,n)-t)*.1)}if(H=n.ensureSpan(...s(e)),j.every(e=>e.type===`scatter`)){let e=(H[1]-H[0])*.06;H=[H[0]-e,H[1]+e]}else if(L.length&&!P.length){let e=(H[1]-H[0])*.04;H=[H[0]-e,H[1]+e]}(S?.nice??!z.length)&&T===`linear`&&(H=n.niceDomain(H[0],H[1],S?.tickCount??5)),k&&(P.length||I.length)&&(H=[s(e)[0]<0?-100:0,100]),t&&!S?.zero&&H[0]<0&&s(e)[0]>=0&&(H[0]=0)}S?.min!==void 0&&(H[0]=S.min),S?.max!==void 0&&(H[1]=S.max),H=n.ensureSpan(H[0],H[1]);let U=r.interaction===!1?!1:r.interaction===!0||r.interaction===void 0?!0:r.interaction.zoom??!0,W=U===!1?{x:!1,y:!1}:U===!0?{x:!0,y:N}:{x:U.includes(`x`),y:U.includes(`y`)},G=typeof r.tooltip==`object`?r.tooltip:void 0,K=S?.format??(k&&(P.length||I.length)?e=>`${+e.toFixed(1)}%`:void 0);return{series:j,x:o(B,v,y,!1),y:{...o(S,T,w,T!==`category`),format:K},base:{x:V,y:H},allScatter:N,zoom:W,tooltipMode:G?.mode??(N?`nearest`:`axis`),baseline:Math.min(Math.max(0,H[0]),H[1]),minSpan:{x:v===`category`?1:(V[1]-V[0])*1e-7,y:T===`category`?1:(H[1]-H[0])*1e-7},percent:k,stacks:g.map(e=>e.stack!==void 0&&(e.type===`bar`||e.type===`line`||e.type===`area`||!e.type)?`${e.type===`bar`?`bar`:`line`}:${e.stack}`:null)}},m=(e,t)=>e.barTop?e.barTop[t]:e.stackTop?e.stackTop[t]:e.cols.y[t],h=new WeakMap,g=e=>{let t=h.get(e.cols);return t||(t=new r.GridIndex(e.cols.x,e.cols.y,e.cols.count),h.set(e.cols,t)),t};exports.buildModel=p,exports.detectXType=a,exports.gridOf=g,exports.plottedY=m;
|
|
2
2
|
//# sourceMappingURL=model.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.cjs","names":["resolveStaticColor","collectCategories","xResolver","normalizeData","toCss","ensureSpan","niceDomain","GridIndex","require_data","require_color","require_scale","require_spatial","firstX","data","xs","list","i","item","detectXType","datas","x","axisModel","options","gridDefault","extent","min","max","values","v","smallestStep","step","c","cols","d","buildModel","resolve","resolver","theme","value","fallback","input","s","xType","categories","categoryMap","resolveX","name","resolverKey","usedKeys","series","key","index","entry","cache","type","color","pointColors","resolved","rgba","id","hidden","visible","allScatter","bars","band","slots","stack","group","slotWidth","sums","slot","totals","count","y","t","base","xOpts","xRange","pad","yOpts","yValues","yRange","zoomOption","zoomAxes","tooltip","grids","gridOf","grid"],"sources":["../../../../charts/src/engine/model.ts"],"sourcesContent":["// Options -> chart model: normalized data, colors, bar layout and the full\n// ranges of the axes. Pure (colors go through the theme's resolver).\n\nimport {\n resolveStaticColor,\n toCss,\n type ColorResolver,\n type Rgba,\n} from \"./color\";\nimport {\n collectCategories,\n normalizeData,\n xResolver,\n type SeriesColumns,\n} from \"./data\";\nimport { ensureSpan, niceDomain } from \"./scale\";\nimport { GridIndex } from \"./spatial\";\nimport type { ChartTheme } from \"./theme\";\nimport type {\n ChartAxisOptions,\n ChartAxisType,\n ChartOptions,\n ChartSeriesData,\n ChartSeriesType,\n} from \"./types\";\nimport type { Range } from \"./viewport\";\n\nexport interface AxisModel {\n type: ChartAxisType;\n reverse: boolean;\n categories: string[];\n title?: string;\n format?: (value: number) => string;\n grid: boolean;\n visible: boolean;\n tickCount?: number;\n}\n\nexport interface SeriesModel {\n index: number;\n /** Key of the GPU resources and of the data cache */\n key: string;\n id: string;\n name: string;\n type: ChartSeriesType;\n color: Rgba;\n colorCss: string;\n lineWidth: number;\n pointSize: number;\n opacity: number;\n hidden: boolean;\n showLabels: boolean;\n cols: SeriesColumns;\n /** Bars: x offset of the series inside a group and half of the bar width */\n barOffset: number;\n barHalfWidth: number;\n /** Bars: bottom / top of every bar (stacks included) */\n barBase: Float64Array | null;\n barTop: Float64Array | null;\n /** Scatter: resolved per-point colors */\n pointColors: (Rgba | undefined)[] | null;\n}\n\nexport interface ChartModel {\n series: SeriesModel[];\n x: AxisModel;\n y: AxisModel;\n /** Full ranges (zoomed out) */\n base: { x: Range; y: Range };\n allScatter: boolean;\n zoom: { x: boolean; y: boolean };\n tooltipMode: \"nearest\" | \"axis\";\n /** Y value the areas are filled to */\n baseline: number;\n /** Smallest zoomed spans */\n minSpan: { x: number; y: number };\n}\n\nexport interface DataCacheEntry {\n data: ChartSeriesData;\n resolverKey: string;\n cols: SeriesColumns;\n}\n\nexport type DataCache = Map<string, DataCacheEntry>;\n\nconst firstX = (data: ChartSeriesData): unknown => {\n if (typeof data === \"object\" && data !== null && !(\"length\" in data)) {\n const xs = (data as { x?: ArrayLike<unknown> }).x;\n return xs && xs.length ? xs[0] : undefined;\n }\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < Math.min(list.length, 8); i++) {\n const item = list[i];\n if (Array.isArray(item)) return item[0];\n if (item && typeof item === \"object\") return (item as { x?: unknown }).x;\n }\n return undefined;\n};\n\n/** Axis type when not given: dates -> time, strings -> category */\nexport const detectXType = (\n datas: readonly ChartSeriesData[],\n): ChartAxisType => {\n for (const data of datas) {\n const x = firstX(data);\n if (x instanceof Date) return \"time\";\n if (typeof x === \"string\") return \"category\";\n }\n return \"linear\";\n};\n\nconst axisModel = (\n options: ChartAxisOptions | undefined,\n type: ChartAxisType,\n categories: string[],\n gridDefault: boolean,\n): AxisModel => ({\n type,\n reverse: !!options?.reverse,\n categories,\n title: options?.title,\n format: options?.format,\n grid: options?.grid ?? gridDefault,\n visible: options?.visible ?? true,\n tickCount: options?.tickCount,\n});\n\nconst extent = (values: ArrayLike<number>): Range => {\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < values.length; i++) {\n const v = values[i];\n if (!Number.isFinite(v)) continue;\n if (v < min) min = v;\n if (v > max) max = v;\n }\n return [min, max];\n};\n\n/** Smallest positive gap between consecutive x values (bar width on numeric axes) */\nconst smallestStep = (cols: SeriesColumns[]): number => {\n let step = Infinity;\n for (const c of cols) {\n const xs = c.sorted ? c.x : Float64Array.from(c.x).sort();\n for (let i = 1; i < c.count; i++) {\n const d = xs[i] - xs[i - 1];\n if (d > 0 && d < step) step = d;\n }\n }\n return step;\n};\n\nexport const buildModel = (\n options: ChartOptions,\n theme: ChartTheme,\n hidden: ReadonlySet<string>,\n cache: DataCache,\n resolver: ColorResolver | null = null,\n): ChartModel => {\n const resolve: ColorResolver =\n resolver ??\n theme.resolve ??\n ((value, fallback) => resolveStaticColor(value, {}, fallback));\n const input = options.series;\n const datas = input.map((s) => s.data);\n const xType = options.xAxis?.type ?? detectXType(datas);\n const categories =\n xType === \"category\"\n ? [...(options.xAxis?.categories ?? collectCategories(datas))]\n : [];\n const categoryMap = new Map(categories.map((c, i) => [c, i]));\n const resolveX = xResolver(xType, (name) => categoryMap.get(name) ?? NaN);\n const resolverKey = `${xType}|${categories.join(\"\\u0001\")}`;\n\n const usedKeys = new Set<string>();\n const series: SeriesModel[] = input.map((s, index) => {\n let key = s.id ?? `#${index}`;\n while (usedKeys.has(key)) key += \"'\";\n usedKeys.add(key);\n let entry = cache.get(key);\n if (!entry || entry.data !== s.data || entry.resolverKey !== resolverKey) {\n entry = {\n data: s.data,\n resolverKey,\n cols: normalizeData(s.data, resolveX),\n };\n cache.set(key, entry);\n }\n const type = s.type ?? \"line\";\n const color = s.color\n ? resolve(s.color, theme.palette[index % theme.palette.length])\n : theme.palette[index % theme.palette.length];\n const cols = entry.cols;\n let pointColors: (Rgba | undefined)[] | null = null;\n if (type === \"scatter\" && cols.colors) {\n const resolved = new Map<string, Rgba>();\n pointColors = cols.colors.map((c) => {\n if (c === undefined) return undefined;\n let rgba = resolved.get(c);\n if (!rgba) resolved.set(c, (rgba = resolve(c, color)));\n return rgba;\n });\n }\n const id = s.id ?? String(index);\n return {\n index,\n key,\n id,\n name: s.name ?? `Series ${index + 1}`,\n type,\n color,\n colorCss: toCss(color),\n lineWidth: s.lineWidth ?? 2,\n pointSize: s.pointSize ?? 8,\n opacity:\n s.opacity ?? (type === \"area\" ? 0.28 : type === \"scatter\" ? 0.78 : 1),\n hidden: !!s.hidden || hidden.has(id),\n showLabels: !!s.showLabels,\n cols,\n barOffset: 0,\n barHalfWidth: 0,\n barBase: null,\n barTop: null,\n pointColors,\n };\n });\n\n const visible = series.filter((s) => !s.hidden);\n const allScatter =\n series.length > 0 && series.every((s) => s.type === \"scatter\");\n\n // Bars: groups (one slot per stack) and stacking\n const bars = visible.filter((s) => s.type === \"bar\");\n const band =\n xType === \"category\"\n ? 1\n : (() => {\n const step = smallestStep(bars.map((s) => s.cols));\n return Number.isFinite(step) ? step : 1;\n })();\n if (bars.length) {\n const slots = new Map<string, number>();\n for (const s of bars) {\n const stack = input[s.index].stack ?? `\\u0000${s.key}`;\n if (!slots.has(stack)) slots.set(stack, slots.size);\n }\n const group = band * (slots.size > 1 ? 0.78 : 0.62);\n const slotWidth = group / slots.size;\n const sums = new Map<string, Map<number, [number, number]>>();\n for (const s of bars) {\n const stack = input[s.index].stack ?? `\\u0000${s.key}`;\n const slot = slots.get(stack) ?? 0;\n s.barOffset = -group / 2 + slotWidth * (slot + 0.5);\n s.barHalfWidth = (slotWidth / 2) * (slots.size > 1 ? 0.86 : 1);\n let totals = sums.get(stack);\n if (!totals) sums.set(stack, (totals = new Map()));\n const { x, y, count } = s.cols;\n s.barBase = new Float64Array(count);\n s.barTop = new Float64Array(count);\n for (let i = 0; i < count; i++) {\n const v = y[i];\n if (!Number.isFinite(v)) {\n s.barBase[i] = NaN;\n s.barTop[i] = NaN;\n continue;\n }\n const t = totals.get(x[i]) ?? [0, 0];\n const base = v >= 0 ? t[0] : t[1];\n s.barBase[i] = base;\n s.barTop[i] = base + v;\n if (v >= 0) t[0] += v;\n else t[1] += v;\n totals.set(x[i], t);\n }\n }\n }\n\n // X range\n const xOpts = options.xAxis;\n let xRange: Range;\n if (xType === \"category\") {\n xRange = [-0.5, Math.max(1, categories.length) - 0.5];\n } else {\n const values: number[] = [];\n for (const s of visible) {\n values.push(s.cols.xMin, s.cols.xMax);\n if (s.type === \"bar\") {\n values.push(s.cols.xMin - band / 2, s.cols.xMax + band / 2);\n }\n }\n xRange = ensureSpan(\n ...extent(values),\n xType === \"time\" ? [Date.now() - 86400000, Date.now()] : [0, 1],\n );\n if (allScatter) {\n const pad = (xRange[1] - xRange[0]) * 0.04;\n xRange = [xRange[0] - pad, xRange[1] + pad];\n }\n const nice = xOpts?.nice ?? (allScatter && xType === \"linear\");\n if (nice && xType === \"linear\") {\n xRange = niceDomain(xRange[0], xRange[1], xOpts?.tickCount ?? 6);\n }\n }\n if (xOpts?.min !== undefined) xRange[0] = xOpts.min;\n if (xOpts?.max !== undefined) xRange[1] = xOpts.max;\n xRange = ensureSpan(xRange[0], xRange[1]);\n\n // Y range\n const yOpts = options.yAxis;\n const yValues: number[] = [];\n for (const s of visible) {\n if (s.type === \"bar\" && s.barBase && s.barTop) {\n yValues.push(...extent(s.barBase), ...extent(s.barTop));\n } else {\n yValues.push(s.cols.yMin, s.cols.yMax);\n }\n }\n if (bars.length || yOpts?.zero) yValues.push(0);\n let yRange = ensureSpan(...extent(yValues));\n if (allScatter) {\n const pad = (yRange[1] - yRange[0]) * 0.06;\n yRange = [yRange[0] - pad, yRange[1] + pad];\n }\n if ((yOpts?.nice ?? true) && (yOpts?.type ?? \"linear\") === \"linear\") {\n yRange = niceDomain(yRange[0], yRange[1], yOpts?.tickCount ?? 5);\n }\n if (bars.length && !yOpts?.zero) {\n // bars start at zero: no padding below / above it\n if (yRange[0] < 0 && extent(yValues)[0] >= 0) yRange[0] = 0;\n }\n if (yOpts?.min !== undefined) yRange[0] = yOpts.min;\n if (yOpts?.max !== undefined) yRange[1] = yOpts.max;\n yRange = ensureSpan(yRange[0], yRange[1]);\n\n const zoomOption =\n options.interaction === false\n ? false\n : options.interaction === true || options.interaction === undefined\n ? true\n : (options.interaction.zoom ?? true);\n const zoomAxes =\n zoomOption === false\n ? { x: false, y: false }\n : zoomOption === true\n ? { x: true, y: allScatter }\n : { x: zoomOption.includes(\"x\"), y: zoomOption.includes(\"y\") };\n\n const tooltip =\n typeof options.tooltip === \"object\" ? options.tooltip : undefined;\n\n return {\n series,\n x: axisModel(xOpts, xType, categories, false),\n y: axisModel(yOpts, yOpts?.type === \"time\" ? \"time\" : \"linear\", [], true),\n base: { x: xRange, y: yRange },\n allScatter,\n zoom: zoomAxes,\n tooltipMode: tooltip?.mode ?? (allScatter ? \"nearest\" : \"axis\"),\n baseline: Math.min(Math.max(0, yRange[0]), yRange[1]),\n minSpan: {\n x: xType === \"category\" ? 1 : (xRange[1] - xRange[0]) * 1e-7,\n y: (yRange[1] - yRange[0]) * 1e-7,\n },\n };\n};\n\nconst grids = new WeakMap<SeriesColumns, GridIndex>();\n\n/** Spatial index of a scatter series, built on first use and kept with its data */\nexport const gridOf = (s: SeriesModel): GridIndex => {\n let grid = grids.get(s.cols);\n if (!grid) {\n grid = new GridIndex(s.cols.x, s.cols.y, s.cols.count);\n grids.set(s.cols, grid);\n }\n return grid;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"model.cjs","names":["resolveStaticColor","collectCategories","xResolver","collectYCategories","normalizeData","mix","packColor","rampColor","toCss","ensureSpan","niceDomain","GridIndex","require_data","require_color","require_scale","require_spatial","firstX","data","xs","list","i","item","detectXType","datas","x","axisModel","options","gridDefault","extent","min","max","values","v","smallestStep","step","columns","sorted","k","d","bandOf","category","axis","s","stackValues","totals","percent","byX","stack","count","y","t","running","members","base","top","valid","sums","total","b","DEFAULT_UP","DEFAULT_DOWN","buildModel","resolve","resolver","theme","value","fallback","input","xType","categories","categoryMap","c","resolveX","name","yOpts","heatmapData","yCategories","yType","yCategoryMap","resolveY","resolverKey","usedKeys","series","key","index","entry","cache","type","paletteColor","color","cols","pointColors","resolved","rgba","colorScale","valueRange","cellColors","lo","hi","span","id","hidden","visible","allScatter","bars","band","slots","stackId","group","slotWidth","stacked","percentStacked","p","slot","stackedLines","candles","candleBand","heatmaps","cx","cy","xOpts","xRange","pad","pointsOnly","yRange","yValues","filled","zoomOption","zoomAxes","tooltip","yFormat","plottedY","grids","gridOf","grid"],"sources":["../../../../charts/src/engine/model.ts"],"sourcesContent":["// Options -> chart model: normalized data, colors, bar layout, stacks and\n// the full ranges of the axes. Pure (colors go through the theme's resolver).\n\nimport {\n mix,\n packColor,\n rampColor,\n resolveStaticColor,\n toCss,\n type ColorResolver,\n type Rgba,\n} from \"./color\";\nimport {\n collectCategories,\n collectYCategories,\n normalizeData,\n xResolver,\n type SeriesColumns,\n type YResolver,\n} from \"./data\";\nimport { ensureSpan, niceDomain } from \"./scale\";\nimport { GridIndex } from \"./spatial\";\nimport type { ChartTheme } from \"./theme\";\nimport type {\n ChartAxisOptions,\n ChartAxisType,\n ChartCurve,\n ChartOptions,\n ChartSeries,\n ChartSeriesData,\n ChartSeriesType,\n} from \"./types\";\nimport type { Range } from \"./viewport\";\n\nexport interface AxisModel {\n type: ChartAxisType;\n reverse: boolean;\n categories: string[];\n title?: string;\n format?: (value: number) => string;\n grid: boolean;\n visible: boolean;\n tickCount?: number;\n}\n\nexport interface SeriesModel {\n index: number;\n /** Key of the GPU resources and of the data cache */\n key: string;\n id: string;\n name: string;\n type: ChartSeriesType;\n color: Rgba;\n colorCss: string;\n lineWidth: number;\n pointSize: number;\n opacity: number;\n hidden: boolean;\n showLabels: boolean;\n curve: ChartCurve;\n cols: SeriesColumns;\n /** Bars / candlesticks: x offset of the series inside a group and half of the bar width */\n barOffset: number;\n barHalfWidth: number;\n /** Bars: bottom / top of every bar (stacks included) */\n barBase: Float64Array | null;\n barTop: Float64Array | null;\n /** Stacked lines / areas: bottom / top of every point */\n stackBase: Float64Array | null;\n stackTop: Float64Array | null;\n /** Scatter / bar: resolved per-point colors */\n pointColors: (Rgba | undefined)[] | null;\n /** Candlesticks: colors of the rising / falling candles */\n upColor: Rgba;\n downColor: Rgba;\n /** Heatmaps: packed color of every cell (0 = no cell) and half of a cell, in data units */\n cellColors: Uint32Array | null;\n cellHalf: { x: number; y: number };\n /** Heatmaps: ramp of the colors and the values at its ends */\n colorScale: Rgba[];\n valueRange: Range;\n /** Corner radius in CSS pixels (bars, heatmap cells) */\n radius: number;\n /** Tooltip format of the values */\n format?: (value: number) => string;\n}\n\nexport interface ChartModel {\n series: SeriesModel[];\n x: AxisModel;\n y: AxisModel;\n /** Full ranges (zoomed out) */\n base: { x: Range; y: Range };\n /** Every series is a scatter (or a heatmap): nearest tooltips, xy zoom */\n allScatter: boolean;\n zoom: { x: boolean; y: boolean };\n tooltipMode: \"nearest\" | \"axis\";\n /** Y value the areas are filled to */\n baseline: number;\n /** Smallest zoomed spans */\n minSpan: { x: number; y: number };\n /** Stacks are scaled to 100% */\n percent: boolean;\n /** Stack id of every series (`null` when not stacked) */\n stacks: (string | null)[];\n}\n\nexport interface DataCacheEntry {\n data: ChartSeriesData;\n resolverKey: string;\n cols: SeriesColumns;\n}\n\nexport type DataCache = Map<string, DataCacheEntry>;\n\nconst firstX = (data: ChartSeriesData): unknown => {\n if (typeof data === \"object\" && data !== null && !(\"length\" in data)) {\n const xs = (data as { x?: ArrayLike<unknown> }).x;\n return xs && xs.length ? xs[0] : undefined;\n }\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < Math.min(list.length, 8); i++) {\n const item = list[i];\n if (Array.isArray(item)) return item[0];\n if (item && typeof item === \"object\") return (item as { x?: unknown }).x;\n }\n return undefined;\n};\n\n/** Axis type when not given: dates -> time, strings -> category */\nexport const detectXType = (\n datas: readonly ChartSeriesData[],\n): ChartAxisType => {\n for (const data of datas) {\n const x = firstX(data);\n if (x instanceof Date) return \"time\";\n if (typeof x === \"string\") return \"category\";\n }\n return \"linear\";\n};\n\nconst axisModel = (\n options: ChartAxisOptions | undefined,\n type: ChartAxisType,\n categories: string[],\n gridDefault: boolean,\n): AxisModel => ({\n type,\n reverse: !!options?.reverse,\n categories,\n title: options?.title,\n format: options?.format,\n grid: options?.grid ?? gridDefault,\n visible: options?.visible ?? true,\n tickCount: options?.tickCount,\n});\n\nconst extent = (values: ArrayLike<number>): Range => {\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < values.length; i++) {\n const v = values[i];\n if (!Number.isFinite(v)) continue;\n if (v < min) min = v;\n if (v > max) max = v;\n }\n return [min, max];\n};\n\n/** Smallest positive gap between consecutive values (bar width on numeric axes) */\nconst smallestStep = (columns: ArrayLike<number>[], sorted: boolean[]) => {\n let step = Infinity;\n columns.forEach((values, k) => {\n const xs = sorted[k] ? values : Float64Array.from(values).sort();\n for (let i = 1; i < xs.length; i++) {\n const d = xs[i] - xs[i - 1];\n if (d > 0 && d < step) step = d;\n }\n });\n return step;\n};\n\nconst bandOf = (list: SeriesModel[], axis: \"x\" | \"y\", category: boolean) => {\n if (category) return 1;\n const step = smallestStep(\n list.map((s) => (axis === \"x\" ? s.cols.x : s.cols.y)),\n list.map((s) => axis === \"x\" && s.cols.sorted),\n );\n return Number.isFinite(step) ? step : 1;\n};\n\n/**\n * Stacks the y values of series sharing a stack id (positive and negative\n * values separately); `percent` scales every stack to 100 at each x\n */\nconst stackValues = (\n list: { s: SeriesModel; stack: string }[],\n percent: boolean,\n): { base: Float64Array; top: Float64Array }[] => {\n const totals = new Map<string, Map<number, [number, number]>>();\n if (percent) {\n for (const { s, stack } of list) {\n let byX = totals.get(stack);\n if (!byX) totals.set(stack, (byX = new Map()));\n const { x, y, count } = s.cols;\n for (let i = 0; i < count; i++) {\n const v = y[i];\n if (!Number.isFinite(v)) continue;\n const t = byX.get(x[i]) ?? [0, 0];\n if (v >= 0) t[0] += v;\n else t[1] -= v;\n byX.set(x[i], t);\n }\n }\n }\n const running = new Map<string, Map<number, [number, number]>>();\n const members = new Map<string, number>();\n for (const { stack } of list)\n members.set(stack, (members.get(stack) ?? 0) + 1);\n return list.map(({ s, stack }) => {\n const { x, y, count } = s.cols;\n if (!percent && members.get(stack) === 1) {\n // alone in its stack (e.g. grouped bars): from zero, no bookkeeping\n const base = new Float64Array(count);\n const top = new Float64Array(count);\n for (let i = 0; i < count; i++) {\n const v = y[i];\n const valid = Number.isFinite(v);\n base[i] = valid ? 0 : NaN;\n top[i] = valid ? v : NaN;\n }\n return { base, top };\n }\n let byX = running.get(stack);\n if (!byX) running.set(stack, (byX = new Map()));\n const sums = totals.get(stack);\n const base = new Float64Array(count);\n const top = new Float64Array(count);\n for (let i = 0; i < count; i++) {\n let v = y[i];\n if (!Number.isFinite(v)) {\n base[i] = NaN;\n top[i] = NaN;\n continue;\n }\n if (sums) {\n const t = sums.get(x[i]);\n const total = t ? (v >= 0 ? t[0] : t[1]) : 0;\n v = total > 0 ? (v / total) * 100 : 0;\n }\n const t = byX.get(x[i]) ?? [0, 0];\n const b = v >= 0 ? t[0] : t[1];\n base[i] = b;\n top[i] = b + v;\n if (v >= 0) t[0] += v;\n else t[1] += v;\n byX.set(x[i], t);\n }\n return { base, top };\n });\n};\n\nconst DEFAULT_UP = \"var(--success-color, #16a34a)\";\nconst DEFAULT_DOWN = \"var(--danger-color, #dc2626)\";\n\nexport const buildModel = (\n options: ChartOptions,\n theme: ChartTheme,\n hidden: ReadonlySet<string>,\n cache: DataCache,\n resolver: ColorResolver | null = null,\n): ChartModel => {\n const resolve: ColorResolver =\n resolver ??\n theme.resolve ??\n ((value, fallback) => resolveStaticColor(value, {}, fallback));\n const input = options.series;\n const datas = input.map((s) => s.data);\n const xType = options.xAxis?.type ?? detectXType(datas);\n const categories =\n xType === \"category\"\n ? [...(options.xAxis?.categories ?? collectCategories(datas))]\n : [];\n const categoryMap = new Map(categories.map((c, i) => [c, i]));\n const resolveX = xResolver(xType, (name) => categoryMap.get(name) ?? NaN);\n\n // category y axis (heatmap rows): explicit, or detected from string y values\n const yOpts = options.yAxis;\n const heatmapData = input\n .filter((s) => s.type === \"heatmap\")\n .map((s) => s.data);\n const yCategories =\n yOpts?.type === \"category\" || (!yOpts?.type && heatmapData.length)\n ? [...(yOpts?.categories ?? collectYCategories(heatmapData))]\n : [];\n const yType: ChartAxisType =\n yOpts?.type === \"category\" || yCategories.length\n ? \"category\"\n : yOpts?.type === \"time\"\n ? \"time\"\n : \"linear\";\n const yCategoryMap = new Map(yCategories.map((c, i) => [c, i]));\n const resolveY: YResolver = (v) =>\n typeof v === \"number\"\n ? v\n : typeof v === \"string\"\n ? yType === \"category\"\n ? (yCategoryMap.get(v) ?? NaN)\n : Number(v)\n : NaN;\n const resolverKey = `${xType}|${categories.join(\"\\u0001\")}|${yType}|${yCategories.join(\"\\u0001\")}`;\n const percent = options.stackMode === \"percent\";\n\n const usedKeys = new Set<string>();\n const series: SeriesModel[] = input.map((s: ChartSeries, index) => {\n let key = s.id ?? `#${index}`;\n while (usedKeys.has(key)) key += \"'\";\n usedKeys.add(key);\n let entry = cache.get(key);\n if (!entry || entry.data !== s.data || entry.resolverKey !== resolverKey) {\n entry = {\n data: s.data,\n resolverKey,\n cols: normalizeData(s.data, resolveX, resolveY),\n };\n cache.set(key, entry);\n }\n const type = s.type ?? \"line\";\n const paletteColor = theme.palette[index % theme.palette.length];\n const color = s.color ? resolve(s.color, paletteColor) : paletteColor;\n const cols = entry.cols;\n let pointColors: (Rgba | undefined)[] | null = null;\n if ((type === \"scatter\" || type === \"bar\") && cols.colors) {\n const resolved = new Map<string, Rgba>();\n pointColors = cols.colors.map((c) => {\n if (c === undefined) return undefined;\n let rgba = resolved.get(c);\n if (!rgba) resolved.set(c, (rgba = resolve(c, color)));\n return rgba;\n });\n }\n let colorScale: Rgba[] = [];\n let valueRange: Range = [0, 1];\n let cellColors: Uint32Array | null = null;\n if (type === \"heatmap\") {\n colorScale =\n s.colorScale && s.colorScale.length\n ? s.colorScale.map((c) => resolve(c, color))\n : [mix(theme.background, color, 0.08), color];\n valueRange = s.valueRange\n ? [s.valueRange[0], s.valueRange[1]]\n : [cols.valueMin, cols.valueMax];\n if (!Number.isFinite(valueRange[0])) valueRange = [0, 1];\n const values = cols.value ?? cols.y;\n const [lo, hi] = valueRange;\n const span = hi - lo || 1;\n cellColors = new Uint32Array(cols.count);\n for (let i = 0; i < cols.count; i++) {\n const v = values[i];\n if (!Number.isFinite(v) || !Number.isFinite(cols.y[i])) continue;\n // 0 means \"no cell\": a fully transparent color packs to 0 as well\n cellColors[i] = packColor(rampColor(colorScale, (v - lo) / span));\n }\n }\n const id = s.id ?? String(index);\n return {\n index,\n key,\n id,\n name: s.name ?? `Series ${index + 1}`,\n type,\n color,\n colorCss: toCss(color),\n lineWidth: s.lineWidth ?? (type === \"candlestick\" ? 1 : 2),\n pointSize: s.pointSize ?? 8,\n opacity:\n s.opacity ?? (type === \"area\" ? 0.28 : type === \"scatter\" ? 0.78 : 1),\n hidden: !!s.hidden || hidden.has(id),\n showLabels: !!s.showLabels,\n curve: s.curve ?? \"linear\",\n cols,\n barOffset: 0,\n barHalfWidth: 0,\n barBase: null,\n barTop: null,\n stackBase: null,\n stackTop: null,\n pointColors,\n upColor:\n type === \"candlestick\"\n ? resolve(s.upColor ?? DEFAULT_UP, [0.09, 0.64, 0.29, 1])\n : color,\n downColor:\n type === \"candlestick\"\n ? resolve(s.downColor ?? DEFAULT_DOWN, [0.86, 0.15, 0.15, 1])\n : color,\n cellColors,\n cellHalf: { x: 0.5, y: 0.5 },\n colorScale,\n valueRange,\n radius: s.radius ?? (type === \"heatmap\" ? 2 : 3),\n format: s.format,\n };\n });\n\n const visible = series.filter((s) => !s.hidden);\n const allScatter =\n series.length > 0 &&\n series.every((s) => s.type === \"scatter\" || s.type === \"heatmap\");\n\n // Bars: groups (one slot per stack) and stacking\n const bars = visible.filter((s) => s.type === \"bar\");\n const band = bandOf(bars, \"x\", xType === \"category\");\n if (bars.length) {\n const slots = new Map<string, number>();\n const stackId = (s: SeriesModel) =>\n input[s.index].stack ?? `\\u0000${s.key}`;\n for (const s of bars) {\n if (!slots.has(stackId(s))) slots.set(stackId(s), slots.size);\n }\n const group = band * (slots.size > 1 ? 0.78 : 0.62);\n const slotWidth = group / slots.size;\n const stacked = stackValues(\n bars.map((s) => ({ s, stack: stackId(s) })),\n false,\n );\n const percentStacked = percent\n ? stackValues(\n bars\n .filter((s) => input[s.index].stack !== undefined)\n .map((s) => ({ s, stack: stackId(s) })),\n true,\n )\n : [];\n let p = 0;\n bars.forEach((s, k) => {\n const slot = slots.get(stackId(s)) ?? 0;\n s.barOffset = -group / 2 + slotWidth * (slot + 0.5);\n s.barHalfWidth = (slotWidth / 2) * (slots.size > 1 ? 0.86 : 1);\n const values =\n percent && input[s.index].stack !== undefined\n ? percentStacked[p++]\n : stacked[k];\n s.barBase = values.base;\n s.barTop = values.top;\n });\n }\n\n // Stacked lines / areas\n const stackedLines = visible.filter(\n (s) =>\n (s.type === \"line\" || s.type === \"area\") &&\n input[s.index].stack !== undefined,\n );\n if (stackedLines.length) {\n const values = stackValues(\n stackedLines.map((s) => ({ s, stack: input[s.index].stack ?? \"\" })),\n percent,\n );\n stackedLines.forEach((s, k) => {\n s.stackBase = values[k].base;\n s.stackTop = values[k].top;\n });\n }\n\n // Candlesticks: one band per x, bodies of 60%\n const candles = visible.filter((s) => s.type === \"candlestick\");\n const candleBand = bandOf(candles, \"x\", xType === \"category\");\n for (const s of candles) s.barHalfWidth = candleBand * 0.3;\n\n // Heatmaps: cells of the size of the smallest step\n const heatmaps = visible.filter((s) => s.type === \"heatmap\");\n if (heatmaps.length) {\n const cx = bandOf(heatmaps, \"x\", xType === \"category\") / 2;\n const cy = bandOf(heatmaps, \"y\", yType === \"category\") / 2;\n for (const s of heatmaps) s.cellHalf = { x: cx, y: cy };\n }\n\n // X range\n const xOpts = options.xAxis;\n let xRange: Range;\n if (xType === \"category\") {\n xRange = [-0.5, Math.max(1, categories.length) - 0.5];\n } else {\n const values: number[] = [];\n for (const s of visible) {\n values.push(s.cols.xMin, s.cols.xMax);\n const pad =\n s.type === \"bar\"\n ? band / 2\n : s.type === \"candlestick\"\n ? candleBand / 2\n : s.type === \"heatmap\"\n ? s.cellHalf.x\n : 0;\n if (pad) values.push(s.cols.xMin - pad, s.cols.xMax + pad);\n }\n xRange = ensureSpan(\n ...extent(values),\n xType === \"time\" ? [Date.now() - 86400000, Date.now()] : [0, 1],\n );\n const pointsOnly = series.every((s) => s.type === \"scatter\");\n if (pointsOnly) {\n const pad = (xRange[1] - xRange[0]) * 0.04;\n xRange = [xRange[0] - pad, xRange[1] + pad];\n }\n const nice = xOpts?.nice ?? (pointsOnly && xType === \"linear\");\n if (nice && xType === \"linear\") {\n xRange = niceDomain(xRange[0], xRange[1], xOpts?.tickCount ?? 6);\n }\n }\n if (xOpts?.min !== undefined) xRange[0] = xOpts.min;\n if (xOpts?.max !== undefined) xRange[1] = xOpts.max;\n xRange = ensureSpan(xRange[0], xRange[1]);\n\n // Y range\n let yRange: Range;\n if (yType === \"category\") {\n yRange = [-0.5, Math.max(1, yCategories.length) - 0.5];\n } else {\n const yValues: number[] = [];\n for (const s of visible) {\n if (s.type === \"bar\" && s.barBase && s.barTop) {\n yValues.push(...extent(s.barBase), ...extent(s.barTop));\n } else if (s.stackBase && s.stackTop) {\n yValues.push(...extent(s.stackBase), ...extent(s.stackTop));\n } else if (s.type === \"heatmap\") {\n yValues.push(s.cols.yMin - s.cellHalf.y, s.cols.yMax + s.cellHalf.y);\n } else {\n yValues.push(s.cols.yMin, s.cols.yMax);\n }\n }\n const filled = bars.length > 0 || visible.some((s) => s.type === \"area\");\n if (bars.length || yOpts?.zero) yValues.push(0);\n if (bars.some((s) => s.showLabels)) {\n // room for the value labels above the tallest bar\n const [lo, hi] = extent(yValues);\n if (hi > 0) yValues.push(hi + (hi - Math.min(0, lo)) * 0.1);\n if (lo < 0) yValues.push(lo - (Math.max(0, hi) - lo) * 0.1);\n }\n yRange = ensureSpan(...extent(yValues));\n if (series.every((s) => s.type === \"scatter\")) {\n const pad = (yRange[1] - yRange[0]) * 0.06;\n yRange = [yRange[0] - pad, yRange[1] + pad];\n } else if (candles.length && !bars.length) {\n // room above / below the wicks\n const pad = (yRange[1] - yRange[0]) * 0.04;\n yRange = [yRange[0] - pad, yRange[1] + pad];\n }\n if ((yOpts?.nice ?? !heatmaps.length) && yType === \"linear\") {\n yRange = niceDomain(yRange[0], yRange[1], yOpts?.tickCount ?? 5);\n }\n if (percent && (bars.length || stackedLines.length)) {\n // 100% stacks: exactly 0-100 (or -100-100)\n yRange = [extent(yValues)[0] < 0 ? -100 : 0, 100];\n }\n if (filled && !yOpts?.zero) {\n // bars start at zero: no padding below / above it\n if (yRange[0] < 0 && extent(yValues)[0] >= 0) yRange[0] = 0;\n }\n }\n if (yOpts?.min !== undefined) yRange[0] = yOpts.min;\n if (yOpts?.max !== undefined) yRange[1] = yOpts.max;\n yRange = ensureSpan(yRange[0], yRange[1]);\n\n const zoomOption =\n options.interaction === false\n ? false\n : options.interaction === true || options.interaction === undefined\n ? true\n : (options.interaction.zoom ?? true);\n const zoomAxes =\n zoomOption === false\n ? { x: false, y: false }\n : zoomOption === true\n ? { x: true, y: allScatter }\n : { x: zoomOption.includes(\"x\"), y: zoomOption.includes(\"y\") };\n\n const tooltip =\n typeof options.tooltip === \"object\" ? options.tooltip : undefined;\n\n const yFormat =\n yOpts?.format ??\n (percent && (bars.length || stackedLines.length)\n ? (v: number) => `${+v.toFixed(1)}%`\n : undefined);\n\n return {\n series,\n x: axisModel(xOpts, xType, categories, false),\n y: {\n ...axisModel(yOpts, yType, yCategories, yType !== \"category\"),\n format: yFormat,\n },\n base: { x: xRange, y: yRange },\n allScatter,\n zoom: zoomAxes,\n tooltipMode: tooltip?.mode ?? (allScatter ? \"nearest\" : \"axis\"),\n baseline: Math.min(Math.max(0, yRange[0]), yRange[1]),\n minSpan: {\n x: xType === \"category\" ? 1 : (xRange[1] - xRange[0]) * 1e-7,\n y: yType === \"category\" ? 1 : (yRange[1] - yRange[0]) * 1e-7,\n },\n percent,\n stacks: input.map((s) =>\n s.stack !== undefined &&\n (s.type === \"bar\" || s.type === \"line\" || s.type === \"area\" || !s.type)\n ? `${s.type === \"bar\" ? \"bar\" : \"line\"}:${s.stack}`\n : null,\n ),\n };\n};\n\n/** Y value drawn for a point: its stacked top for stacks, the close for candles */\nexport const plottedY = (s: SeriesModel, i: number): number =>\n s.barTop ? s.barTop[i] : s.stackTop ? s.stackTop[i] : s.cols.y[i];\n\nconst grids = new WeakMap<SeriesColumns, GridIndex>();\n\n/** Spatial index of a scatter series, built on first use and kept with its data */\nexport const gridOf = (s: SeriesModel): GridIndex => {\n let grid = grids.get(s.cols);\n if (!grid) {\n grid = new GridIndex(s.cols.x, s.cols.y, s.cols.count);\n grids.set(s.cols, grid);\n }\n return grid;\n};\n"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { ColorResolver, Rgba } from './color.cjs';
|
|
|
2
2
|
import { SeriesColumns } from './data.cjs';
|
|
3
3
|
import { GridIndex } from './spatial.cjs';
|
|
4
4
|
import { ChartTheme } from './theme.cjs';
|
|
5
|
-
import { ChartAxisType, ChartOptions, ChartSeriesData, ChartSeriesType } from './types.cjs';
|
|
5
|
+
import { ChartAxisType, ChartCurve, ChartOptions, ChartSeriesData, ChartSeriesType } from './types.cjs';
|
|
6
6
|
import { Range } from './viewport.cjs';
|
|
7
7
|
export interface AxisModel {
|
|
8
8
|
type: ChartAxisType;
|
|
@@ -28,15 +28,35 @@ export interface SeriesModel {
|
|
|
28
28
|
opacity: number;
|
|
29
29
|
hidden: boolean;
|
|
30
30
|
showLabels: boolean;
|
|
31
|
+
curve: ChartCurve;
|
|
31
32
|
cols: SeriesColumns;
|
|
32
|
-
/** Bars: x offset of the series inside a group and half of the bar width */
|
|
33
|
+
/** Bars / candlesticks: x offset of the series inside a group and half of the bar width */
|
|
33
34
|
barOffset: number;
|
|
34
35
|
barHalfWidth: number;
|
|
35
36
|
/** Bars: bottom / top of every bar (stacks included) */
|
|
36
37
|
barBase: Float64Array | null;
|
|
37
38
|
barTop: Float64Array | null;
|
|
38
|
-
/**
|
|
39
|
+
/** Stacked lines / areas: bottom / top of every point */
|
|
40
|
+
stackBase: Float64Array | null;
|
|
41
|
+
stackTop: Float64Array | null;
|
|
42
|
+
/** Scatter / bar: resolved per-point colors */
|
|
39
43
|
pointColors: (Rgba | undefined)[] | null;
|
|
44
|
+
/** Candlesticks: colors of the rising / falling candles */
|
|
45
|
+
upColor: Rgba;
|
|
46
|
+
downColor: Rgba;
|
|
47
|
+
/** Heatmaps: packed color of every cell (0 = no cell) and half of a cell, in data units */
|
|
48
|
+
cellColors: Uint32Array | null;
|
|
49
|
+
cellHalf: {
|
|
50
|
+
x: number;
|
|
51
|
+
y: number;
|
|
52
|
+
};
|
|
53
|
+
/** Heatmaps: ramp of the colors and the values at its ends */
|
|
54
|
+
colorScale: Rgba[];
|
|
55
|
+
valueRange: Range;
|
|
56
|
+
/** Corner radius in CSS pixels (bars, heatmap cells) */
|
|
57
|
+
radius: number;
|
|
58
|
+
/** Tooltip format of the values */
|
|
59
|
+
format?: (value: number) => string;
|
|
40
60
|
}
|
|
41
61
|
export interface ChartModel {
|
|
42
62
|
series: SeriesModel[];
|
|
@@ -47,6 +67,7 @@ export interface ChartModel {
|
|
|
47
67
|
x: Range;
|
|
48
68
|
y: Range;
|
|
49
69
|
};
|
|
70
|
+
/** Every series is a scatter (or a heatmap): nearest tooltips, xy zoom */
|
|
50
71
|
allScatter: boolean;
|
|
51
72
|
zoom: {
|
|
52
73
|
x: boolean;
|
|
@@ -60,6 +81,10 @@ export interface ChartModel {
|
|
|
60
81
|
x: number;
|
|
61
82
|
y: number;
|
|
62
83
|
};
|
|
84
|
+
/** Stacks are scaled to 100% */
|
|
85
|
+
percent: boolean;
|
|
86
|
+
/** Stack id of every series (`null` when not stacked) */
|
|
87
|
+
stacks: (string | null)[];
|
|
63
88
|
}
|
|
64
89
|
export interface DataCacheEntry {
|
|
65
90
|
data: ChartSeriesData;
|
|
@@ -70,5 +95,7 @@ export type DataCache = Map<string, DataCacheEntry>;
|
|
|
70
95
|
/** Axis type when not given: dates -> time, strings -> category */
|
|
71
96
|
export declare const detectXType: (datas: readonly ChartSeriesData[]) => ChartAxisType;
|
|
72
97
|
export declare const buildModel: (options: ChartOptions, theme: ChartTheme, hidden: ReadonlySet<string>, cache: DataCache, resolver?: ColorResolver | null) => ChartModel;
|
|
98
|
+
/** Y value drawn for a point: its stacked top for stacks, the close for candles */
|
|
99
|
+
export declare const plottedY: (s: SeriesModel, i: number) => number;
|
|
73
100
|
/** Spatial index of a scatter series, built on first use and kept with its data */
|
|
74
101
|
export declare const gridOf: (s: SeriesModel) => GridIndex;
|
|
@@ -2,7 +2,7 @@ import { ColorResolver, Rgba } from './color.js';
|
|
|
2
2
|
import { SeriesColumns } from './data.js';
|
|
3
3
|
import { GridIndex } from './spatial.js';
|
|
4
4
|
import { ChartTheme } from './theme.js';
|
|
5
|
-
import { ChartAxisType, ChartOptions, ChartSeriesData, ChartSeriesType } from './types.js';
|
|
5
|
+
import { ChartAxisType, ChartCurve, ChartOptions, ChartSeriesData, ChartSeriesType } from './types.js';
|
|
6
6
|
import { Range } from './viewport.js';
|
|
7
7
|
export interface AxisModel {
|
|
8
8
|
type: ChartAxisType;
|
|
@@ -28,15 +28,35 @@ export interface SeriesModel {
|
|
|
28
28
|
opacity: number;
|
|
29
29
|
hidden: boolean;
|
|
30
30
|
showLabels: boolean;
|
|
31
|
+
curve: ChartCurve;
|
|
31
32
|
cols: SeriesColumns;
|
|
32
|
-
/** Bars: x offset of the series inside a group and half of the bar width */
|
|
33
|
+
/** Bars / candlesticks: x offset of the series inside a group and half of the bar width */
|
|
33
34
|
barOffset: number;
|
|
34
35
|
barHalfWidth: number;
|
|
35
36
|
/** Bars: bottom / top of every bar (stacks included) */
|
|
36
37
|
barBase: Float64Array | null;
|
|
37
38
|
barTop: Float64Array | null;
|
|
38
|
-
/**
|
|
39
|
+
/** Stacked lines / areas: bottom / top of every point */
|
|
40
|
+
stackBase: Float64Array | null;
|
|
41
|
+
stackTop: Float64Array | null;
|
|
42
|
+
/** Scatter / bar: resolved per-point colors */
|
|
39
43
|
pointColors: (Rgba | undefined)[] | null;
|
|
44
|
+
/** Candlesticks: colors of the rising / falling candles */
|
|
45
|
+
upColor: Rgba;
|
|
46
|
+
downColor: Rgba;
|
|
47
|
+
/** Heatmaps: packed color of every cell (0 = no cell) and half of a cell, in data units */
|
|
48
|
+
cellColors: Uint32Array | null;
|
|
49
|
+
cellHalf: {
|
|
50
|
+
x: number;
|
|
51
|
+
y: number;
|
|
52
|
+
};
|
|
53
|
+
/** Heatmaps: ramp of the colors and the values at its ends */
|
|
54
|
+
colorScale: Rgba[];
|
|
55
|
+
valueRange: Range;
|
|
56
|
+
/** Corner radius in CSS pixels (bars, heatmap cells) */
|
|
57
|
+
radius: number;
|
|
58
|
+
/** Tooltip format of the values */
|
|
59
|
+
format?: (value: number) => string;
|
|
40
60
|
}
|
|
41
61
|
export interface ChartModel {
|
|
42
62
|
series: SeriesModel[];
|
|
@@ -47,6 +67,7 @@ export interface ChartModel {
|
|
|
47
67
|
x: Range;
|
|
48
68
|
y: Range;
|
|
49
69
|
};
|
|
70
|
+
/** Every series is a scatter (or a heatmap): nearest tooltips, xy zoom */
|
|
50
71
|
allScatter: boolean;
|
|
51
72
|
zoom: {
|
|
52
73
|
x: boolean;
|
|
@@ -60,6 +81,10 @@ export interface ChartModel {
|
|
|
60
81
|
x: number;
|
|
61
82
|
y: number;
|
|
62
83
|
};
|
|
84
|
+
/** Stacks are scaled to 100% */
|
|
85
|
+
percent: boolean;
|
|
86
|
+
/** Stack id of every series (`null` when not stacked) */
|
|
87
|
+
stacks: (string | null)[];
|
|
63
88
|
}
|
|
64
89
|
export interface DataCacheEntry {
|
|
65
90
|
data: ChartSeriesData;
|
|
@@ -70,5 +95,7 @@ export type DataCache = Map<string, DataCacheEntry>;
|
|
|
70
95
|
/** Axis type when not given: dates -> time, strings -> category */
|
|
71
96
|
export declare const detectXType: (datas: readonly ChartSeriesData[]) => ChartAxisType;
|
|
72
97
|
export declare const buildModel: (options: ChartOptions, theme: ChartTheme, hidden: ReadonlySet<string>, cache: DataCache, resolver?: ColorResolver | null) => ChartModel;
|
|
98
|
+
/** Y value drawn for a point: its stacked top for stacks, the close for candles */
|
|
99
|
+
export declare const plottedY: (s: SeriesModel, i: number) => number;
|
|
73
100
|
/** Spatial index of a scatter series, built on first use and kept with its data */
|
|
74
101
|
export declare const gridOf: (s: SeriesModel) => GridIndex;
|