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
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { mix as e, toCss as t } from "../color.js";
|
|
2
|
+
import { font as n } from "../overlay.js";
|
|
3
|
+
import { clamp as r, ellipsize as i, emptyLayout as a, finite as o, positive as s, readableFill as c, relativeLuminance as l, resolveWith as u, sum as d, textOn as f, uniqueKeys as p } from "./scene.js";
|
|
4
|
+
//#region src/engine/shapes/treemap.ts
|
|
5
|
+
var m = 20, h = (e, t) => {
|
|
6
|
+
let n = e.map(() => ({
|
|
7
|
+
x: t.x,
|
|
8
|
+
y: t.y,
|
|
9
|
+
width: 0,
|
|
10
|
+
height: 0
|
|
11
|
+
})), r = d(e.map((e) => Math.max(0, e)));
|
|
12
|
+
if (r <= 0 || t.width <= 0 || t.height <= 0) return n;
|
|
13
|
+
let i = t.width * t.height / r, a = e.map((e) => Math.max(0, e) * i), { x: o, y: s, width: c, height: l } = t, u = (e, t, n, r) => {
|
|
14
|
+
let i = e * e, a = r * r;
|
|
15
|
+
return Math.max(a * n / i, i / (a * t));
|
|
16
|
+
}, f = (e, t) => {
|
|
17
|
+
if (c >= l) {
|
|
18
|
+
let r = l > 0 ? Math.min(c, t / l) : 0, i = s;
|
|
19
|
+
for (let t of e) {
|
|
20
|
+
let e = r > 0 ? a[t] / r : 0;
|
|
21
|
+
n[t] = {
|
|
22
|
+
x: o,
|
|
23
|
+
y: i,
|
|
24
|
+
width: r,
|
|
25
|
+
height: e
|
|
26
|
+
}, i += e;
|
|
27
|
+
}
|
|
28
|
+
o += r, c = Math.max(0, c - r);
|
|
29
|
+
} else {
|
|
30
|
+
let r = c > 0 ? Math.min(l, t / c) : 0, i = o;
|
|
31
|
+
for (let t of e) {
|
|
32
|
+
let e = r > 0 ? a[t] / r : 0;
|
|
33
|
+
n[t] = {
|
|
34
|
+
x: i,
|
|
35
|
+
y: s,
|
|
36
|
+
width: e,
|
|
37
|
+
height: r
|
|
38
|
+
}, i += e;
|
|
39
|
+
}
|
|
40
|
+
s += r, l = Math.max(0, l - r);
|
|
41
|
+
}
|
|
42
|
+
}, p = [], m = 0, h = Infinity, g = 0;
|
|
43
|
+
return a.forEach((e, t) => {
|
|
44
|
+
if (!(e <= 0)) {
|
|
45
|
+
if (p.length) {
|
|
46
|
+
let t = Math.min(c, l);
|
|
47
|
+
u(m + e, Math.min(h, e), Math.max(g, e), t) > u(m, h, g, t) && (f(p, m), p = [], m = 0, h = Infinity, g = 0);
|
|
48
|
+
}
|
|
49
|
+
p.push(t), m += e, h = Math.min(h, e), g = Math.max(g, e);
|
|
50
|
+
}
|
|
51
|
+
}), p.length && f(p, m), n;
|
|
52
|
+
}, g = (e, t) => {
|
|
53
|
+
let n = 0, r = (e, i, a, o) => {
|
|
54
|
+
let c = p(e.map((e) => e.name));
|
|
55
|
+
return e.map((e, l) => {
|
|
56
|
+
let u = a.length ? o : l, f = `${i}/${c[l]}`, p = [...a, e.name];
|
|
57
|
+
if (e.children?.length) {
|
|
58
|
+
let t = r(e.children, f, p, u);
|
|
59
|
+
return {
|
|
60
|
+
node: e,
|
|
61
|
+
key: f,
|
|
62
|
+
path: p,
|
|
63
|
+
top: u,
|
|
64
|
+
leaf: -1,
|
|
65
|
+
target: d(t.map((e) => e.target)),
|
|
66
|
+
children: t
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
node: e,
|
|
71
|
+
key: f,
|
|
72
|
+
path: p,
|
|
73
|
+
top: u,
|
|
74
|
+
leaf: n++,
|
|
75
|
+
target: t.has(u) ? 0 : s(e.value),
|
|
76
|
+
children: []
|
|
77
|
+
};
|
|
78
|
+
});
|
|
79
|
+
};
|
|
80
|
+
return r(e.data, "", [], 0);
|
|
81
|
+
}, _ = (e, t, n) => {
|
|
82
|
+
let r = (e) => e.forEach((e) => {
|
|
83
|
+
e.children.length ? r(e.children) : n.set(e.key, e.target);
|
|
84
|
+
});
|
|
85
|
+
r(g(e, t));
|
|
86
|
+
}, v = (e, t) => ({
|
|
87
|
+
x: e.x + t,
|
|
88
|
+
y: e.y + t,
|
|
89
|
+
width: Math.max(0, e.width - 2 * t),
|
|
90
|
+
height: Math.max(0, e.height - 2 * t)
|
|
91
|
+
}), y = (s, p) => {
|
|
92
|
+
let { theme: _, area: y, measure: b, hidden: x } = p, S = g(s, x), C = d(S.map((e) => e.target)), w = /* @__PURE__ */ new Map(), T = (e) => {
|
|
93
|
+
let t = e.children.length ? d(e.children.map(T)) : Math.max(0, p.value(e.key, e.target));
|
|
94
|
+
return w.set(e, t), t;
|
|
95
|
+
}, E = d(S.map(T));
|
|
96
|
+
if (C <= 0 && E <= 1e-9) return a(p);
|
|
97
|
+
let D = Math.max(0, o(s.gap, 2)), O = s.headers !== !1, k = n(_, 12, 500), A = n(_, 11), j = n(_, 11, 600), M = [], N = [], P = l(_.background) < .2, F = (n, r, a) => {
|
|
98
|
+
let o = n.filter((e) => (w.get(e) ?? 0) > 1e-9).sort((e, t) => (w.get(t) ?? 0) - (w.get(e) ?? 0)), s = h(o.map((e) => w.get(e) ?? 0), r), l = Math.min(.14, .5 / Math.max(1, o.length - 1));
|
|
99
|
+
o.forEach((n, r) => {
|
|
100
|
+
let o = v(s[r], D / 2);
|
|
101
|
+
if (o.width < 1 || o.height < 1) return;
|
|
102
|
+
let d = a ? n.node.color ? u(_, n.node.color, a) : e(a, _.background, r * l) : p.color(n.node.color, n.top);
|
|
103
|
+
if (n.children.length) {
|
|
104
|
+
let e = o;
|
|
105
|
+
if (O && o.height > 34 && o.width > 36) {
|
|
106
|
+
M.push({
|
|
107
|
+
kind: "rect",
|
|
108
|
+
x: o.x,
|
|
109
|
+
y: o.y,
|
|
110
|
+
width: o.width,
|
|
111
|
+
height: o.height,
|
|
112
|
+
radius: 4,
|
|
113
|
+
fill: t(d, .14)
|
|
114
|
+
});
|
|
115
|
+
let r = i(n.node.name, o.width - 12, j, b);
|
|
116
|
+
r && M.push({
|
|
117
|
+
kind: "text",
|
|
118
|
+
x: o.x + 6,
|
|
119
|
+
y: o.y + m / 2 + 1,
|
|
120
|
+
text: r,
|
|
121
|
+
font: j,
|
|
122
|
+
color: t(_.text, .85),
|
|
123
|
+
align: "left",
|
|
124
|
+
baseline: "middle"
|
|
125
|
+
}), e = {
|
|
126
|
+
x: o.x + 2,
|
|
127
|
+
y: o.y + m,
|
|
128
|
+
width: o.width - 4,
|
|
129
|
+
height: o.height - m - 2
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
F(n.children, e, d);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
let h = c(P ? e(d, _.background, .18) : d), g = t(h);
|
|
136
|
+
if (M.push({
|
|
137
|
+
kind: "rect",
|
|
138
|
+
x: o.x,
|
|
139
|
+
y: o.y,
|
|
140
|
+
width: o.width,
|
|
141
|
+
height: o.height,
|
|
142
|
+
radius: Math.min(4, o.width / 2, o.height / 2),
|
|
143
|
+
fill: g,
|
|
144
|
+
hit: n.leaf,
|
|
145
|
+
brighten: !0
|
|
146
|
+
}), o.width >= 36 && o.height >= 22) {
|
|
147
|
+
let e = f(h), t = i(n.node.name, o.width - 12, k, b);
|
|
148
|
+
t && M.push({
|
|
149
|
+
kind: "text",
|
|
150
|
+
x: o.x + 6,
|
|
151
|
+
y: o.y + 6,
|
|
152
|
+
text: t,
|
|
153
|
+
font: k,
|
|
154
|
+
color: e,
|
|
155
|
+
align: "left",
|
|
156
|
+
baseline: "top",
|
|
157
|
+
hit: n.leaf
|
|
158
|
+
});
|
|
159
|
+
let r = p.format(n.target);
|
|
160
|
+
t && o.height >= 38 && b(r, A) <= o.width - 12 && M.push({
|
|
161
|
+
kind: "text",
|
|
162
|
+
x: o.x + 6,
|
|
163
|
+
y: o.y + 22,
|
|
164
|
+
text: r,
|
|
165
|
+
font: A,
|
|
166
|
+
color: e,
|
|
167
|
+
align: "left",
|
|
168
|
+
baseline: "top",
|
|
169
|
+
hit: n.leaf
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
if (n.target > 0) {
|
|
173
|
+
let e = C > 0 ? n.target / C : 0;
|
|
174
|
+
N.push({
|
|
175
|
+
index: n.leaf,
|
|
176
|
+
name: n.node.name,
|
|
177
|
+
value: n.target,
|
|
178
|
+
percent: e,
|
|
179
|
+
share: p.percent(e),
|
|
180
|
+
color: g,
|
|
181
|
+
path: n.path,
|
|
182
|
+
x: o.x + o.width / 2,
|
|
183
|
+
y: o.y + o.height / 2,
|
|
184
|
+
rows: [{
|
|
185
|
+
name: "Value",
|
|
186
|
+
value: p.format(n.target)
|
|
187
|
+
}, {
|
|
188
|
+
name: "Share",
|
|
189
|
+
value: p.percent(e)
|
|
190
|
+
}]
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
};
|
|
195
|
+
F(S, y, null), N.sort((e, t) => e.index - t.index);
|
|
196
|
+
let I = r(p.enter, 0, 1);
|
|
197
|
+
return {
|
|
198
|
+
nodes: M,
|
|
199
|
+
items: N,
|
|
200
|
+
dim: .55,
|
|
201
|
+
empty: !1,
|
|
202
|
+
...I < 1 ? { enter: {
|
|
203
|
+
alpha: I,
|
|
204
|
+
scale: .94 + .06 * I,
|
|
205
|
+
cx: y.x + y.width / 2,
|
|
206
|
+
cy: y.y + y.height / 2
|
|
207
|
+
} } : {}
|
|
208
|
+
};
|
|
209
|
+
};
|
|
210
|
+
//#endregion
|
|
211
|
+
export { y as layoutTreemap, h as squarify, _ as treemapValues };
|
|
212
|
+
|
|
213
|
+
//# sourceMappingURL=treemap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"treemap.js","names":["HEADER","squarify","out","values","rect","total","sum","v","scale","areas","w","h","worst","s2","s","side2","side","max","min","place","cw","yy","y","i","row","hh","rh","xx","x","ww","rowSum","rowMin","rowMax","a","build","leafCount","walk","keys","uniqueKeys","nodes","nd","t","parentPath","top","j","key","parentKey","path","node","children","ch","hidden","positive","o","treemapValues","visit","b","shrink","r","d","layoutTreemap","c","tree","rootTotal","shown","measureShown","shownTotal","emptyLayout","gap","finite","headers","nameFont","font","theme","valueFont","headerFont","items","dark","relativeLuminance","level","sorted","list","rects","step","cell","color","parentColor","resolveWith","mix","content","toCss","title","ellipsize","measure","fill","readableFill","css","ink","textOn","name","value","percent","area","enter","clamp"],"sources":["../../../../../charts/src/engine/shapes/treemap.ts"],"sourcesContent":["// Treemap layout: squarified rectangles, parent headers, a palette color per\n// top-level node and lighter shades for its children.\n\nimport { mix, toCss, type Rgba } from \"../color\";\nimport { font } from \"../overlay\";\nimport {\n clamp,\n ellipsize,\n emptyLayout,\n finite,\n positive,\n readableFill,\n relativeLuminance,\n resolveWith,\n sum,\n textOn,\n uniqueKeys,\n type LayoutContext,\n type LayoutResult,\n type ShapeItem,\n type ShapeNode,\n type ShapeRect,\n} from \"./scene\";\nimport type { TreemapChartOptions, TreemapNode } from \"./types\";\n\nconst HEADER = 20;\n\n/**\n * Squarified treemap (Bruls et al.): rectangles of areas proportional to\n * `values` (best sorted descending) filling `rect`, with aspect ratios close to 1.\n */\nexport const squarify = (\n values: readonly number[],\n rect: ShapeRect,\n): ShapeRect[] => {\n const out: ShapeRect[] = values.map(() => ({\n x: rect.x,\n y: rect.y,\n width: 0,\n height: 0,\n }));\n const total = sum(values.map((v) => Math.max(0, v)));\n if (total <= 0 || rect.width <= 0 || rect.height <= 0) return out;\n const scale = (rect.width * rect.height) / total;\n const areas = values.map((v) => Math.max(0, v) * scale);\n let { x, y, width: w, height: h } = rect;\n\n const worst = (s: number, min: number, max: number, side: number) => {\n const s2 = s * s;\n const side2 = side * side;\n return Math.max((side2 * max) / s2, s2 / (side2 * min));\n };\n const place = (row: number[], s: number) => {\n if (w >= h) {\n const cw = h > 0 ? Math.min(w, s / h) : 0;\n let yy = y;\n for (const i of row) {\n const hh = cw > 0 ? areas[i] / cw : 0;\n out[i] = { x, y: yy, width: cw, height: hh };\n yy += hh;\n }\n x += cw;\n w = Math.max(0, w - cw);\n } else {\n const rh = w > 0 ? Math.min(h, s / w) : 0;\n let xx = x;\n for (const i of row) {\n const ww = rh > 0 ? areas[i] / rh : 0;\n out[i] = { x: xx, y, width: ww, height: rh };\n xx += ww;\n }\n y += rh;\n h = Math.max(0, h - rh);\n }\n };\n\n let row: number[] = [];\n let rowSum = 0;\n let rowMin = Infinity;\n let rowMax = 0;\n areas.forEach((a, i) => {\n if (a <= 0) return;\n if (row.length) {\n const side = Math.min(w, h);\n const next = worst(\n rowSum + a,\n Math.min(rowMin, a),\n Math.max(rowMax, a),\n side,\n );\n if (next > worst(rowSum, rowMin, rowMax, side)) {\n place(row, rowSum);\n row = [];\n rowSum = 0;\n rowMin = Infinity;\n rowMax = 0;\n }\n }\n row.push(i);\n rowSum += a;\n rowMin = Math.min(rowMin, a);\n rowMax = Math.max(rowMax, a);\n });\n if (row.length) place(row, rowSum);\n return out;\n};\n\ninterface Built {\n node: TreemapNode;\n key: string;\n path: string[];\n top: number;\n /** Index in the flattened leaves (leaves only) */\n leaf: number;\n target: number;\n children: Built[];\n}\n\n/** Tree with the target values; hidden top-level nodes count 0 */\nconst build = (\n o: TreemapChartOptions,\n hidden: ReadonlySet<number>,\n): Built[] => {\n let leafCount = 0;\n const walk = (\n nodes: readonly TreemapNode[],\n parentKey: string,\n parentPath: string[],\n top: number,\n ): Built[] => {\n const keys = uniqueKeys(nodes.map((nd) => nd.name));\n return nodes.map((node, j) => {\n const t = parentPath.length ? top : j;\n const key = `${parentKey}/${keys[j]}`;\n const path = [...parentPath, node.name];\n if (node.children?.length) {\n const children = walk(node.children, key, path, t);\n return {\n node,\n key,\n path,\n top: t,\n leaf: -1,\n target: sum(children.map((ch) => ch.target)),\n children,\n };\n }\n return {\n node,\n key,\n path,\n top: t,\n leaf: leafCount++,\n target: hidden.has(t) ? 0 : positive(node.value),\n children: [],\n };\n });\n };\n return walk(o.data, \"\", [], 0);\n};\n\nexport const treemapValues = (\n o: TreemapChartOptions,\n hidden: ReadonlySet<number>,\n out: Map<string, number>,\n) => {\n const visit = (nodes: Built[]) =>\n nodes.forEach((b) => {\n if (b.children.length) visit(b.children);\n else out.set(b.key, b.target);\n });\n visit(build(o, hidden));\n};\n\n/** Leaves in the flattened order (the hover / click `index`) */\nexport const treemapLeaves = (data: readonly TreemapNode[]) => {\n const leaves: { node: TreemapNode; path: string[] }[] = [];\n const visit = (nodes: readonly TreemapNode[], path: string[]) =>\n nodes.forEach((node) => {\n const p = [...path, node.name];\n if (node.children?.length) visit(node.children, p);\n else leaves.push({ node, path: p });\n });\n visit(data, []);\n return leaves;\n};\n\nconst shrink = (r: ShapeRect, d: number): ShapeRect => ({\n x: r.x + d,\n y: r.y + d,\n width: Math.max(0, r.width - 2 * d),\n height: Math.max(0, r.height - 2 * d),\n});\n\nexport const layoutTreemap = (\n o: TreemapChartOptions,\n c: LayoutContext,\n): LayoutResult => {\n const { theme, area, measure, hidden } = c;\n const tree = build(o, hidden);\n const rootTotal = sum(tree.map((b) => b.target));\n // displayed (animated) values\n const shown = new Map<Built, number>();\n const measureShown = (b: Built): number => {\n const v = b.children.length\n ? sum(b.children.map(measureShown))\n : Math.max(0, c.value(b.key, b.target));\n shown.set(b, v);\n return v;\n };\n const shownTotal = sum(tree.map(measureShown));\n if (rootTotal <= 0 && shownTotal <= 1e-9) return emptyLayout(c);\n\n const gap = Math.max(0, finite(o.gap, 2));\n const headers = o.headers !== false;\n const nameFont = font(theme, 12, 500);\n const valueFont = font(theme, 11);\n const headerFont = font(theme, 11, 600);\n const nodes: ShapeNode[] = [];\n const items: ShapeItem[] = [];\n // dark themes: fills slightly toward the background so that labels read well\n const dark = relativeLuminance(theme.background) < 0.2;\n\n const level = (list: Built[], rect: ShapeRect, parentColor: Rgba | null) => {\n const sorted = list\n .filter((b) => (shown.get(b) ?? 0) > 1e-9)\n .sort((a, b) => (shown.get(b) ?? 0) - (shown.get(a) ?? 0));\n const rects = squarify(\n sorted.map((b) => shown.get(b) ?? 0),\n rect,\n );\n const step = Math.min(0.14, 0.5 / Math.max(1, sorted.length - 1));\n sorted.forEach((b, j) => {\n const cell = shrink(rects[j], gap / 2);\n if (cell.width < 1 || cell.height < 1) return;\n const color = parentColor\n ? b.node.color\n ? resolveWith(theme, b.node.color, parentColor)\n : mix(parentColor, theme.background, j * step)\n : c.color(b.node.color, b.top);\n if (b.children.length) {\n let content = cell;\n if (headers && cell.height > HEADER + 14 && cell.width > 36) {\n nodes.push({\n kind: \"rect\",\n x: cell.x,\n y: cell.y,\n width: cell.width,\n height: cell.height,\n radius: 4,\n fill: toCss(color, 0.14),\n });\n const title = ellipsize(\n b.node.name,\n cell.width - 12,\n headerFont,\n measure,\n );\n if (title)\n nodes.push({\n kind: \"text\",\n x: cell.x + 6,\n y: cell.y + HEADER / 2 + 1,\n text: title,\n font: headerFont,\n color: toCss(theme.text, 0.85),\n align: \"left\",\n baseline: \"middle\",\n });\n content = {\n x: cell.x + 2,\n y: cell.y + HEADER,\n width: cell.width - 4,\n height: cell.height - HEADER - 2,\n };\n }\n level(b.children, content, color);\n return;\n }\n const fill = readableFill(\n dark ? mix(color, theme.background, 0.18) : color,\n );\n const css = toCss(fill);\n nodes.push({\n kind: \"rect\",\n x: cell.x,\n y: cell.y,\n width: cell.width,\n height: cell.height,\n radius: Math.min(4, cell.width / 2, cell.height / 2),\n fill: css,\n hit: b.leaf,\n brighten: true,\n });\n if (cell.width >= 36 && cell.height >= 22) {\n const ink = textOn(fill);\n const name = ellipsize(b.node.name, cell.width - 12, nameFont, measure);\n if (name)\n nodes.push({\n kind: \"text\",\n x: cell.x + 6,\n y: cell.y + 6,\n text: name,\n font: nameFont,\n color: ink,\n align: \"left\",\n baseline: \"top\",\n hit: b.leaf,\n });\n const value = c.format(b.target);\n if (\n name &&\n cell.height >= 38 &&\n measure(value, valueFont) <= cell.width - 12\n )\n nodes.push({\n kind: \"text\",\n x: cell.x + 6,\n y: cell.y + 22,\n text: value,\n font: valueFont,\n color: ink,\n align: \"left\",\n baseline: \"top\",\n hit: b.leaf,\n });\n }\n if (b.target > 0) {\n const percent = rootTotal > 0 ? b.target / rootTotal : 0;\n items.push({\n index: b.leaf,\n name: b.node.name,\n value: b.target,\n percent,\n share: c.percent(percent),\n color: css,\n path: b.path,\n x: cell.x + cell.width / 2,\n y: cell.y + cell.height / 2,\n rows: [\n { name: \"Value\", value: c.format(b.target) },\n { name: \"Share\", value: c.percent(percent) },\n ],\n });\n }\n });\n };\n level(tree, area, null);\n items.sort((a, b) => a.index - b.index);\n\n const enter = clamp(c.enter, 0, 1);\n return {\n nodes,\n items,\n dim: 0.55,\n empty: false,\n ...(enter < 1\n ? {\n enter: {\n alpha: enter,\n scale: 0.94 + 0.06 * enter,\n cx: area.x + area.width / 2,\n cy: area.y + area.height / 2,\n },\n }\n : {}),\n };\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import { ChartPadding } from '../types.cjs';
|
|
2
|
+
/** Kind of shape chart */
|
|
3
|
+
export type ShapeChartType = "pie" | "radar" | "gauge" | "funnel" | "treemap";
|
|
4
|
+
/** A named value (pie slice, funnel stage) */
|
|
5
|
+
export interface ShapeDatum {
|
|
6
|
+
/** Name shown in the legend, the labels and the tooltip */
|
|
7
|
+
name: string;
|
|
8
|
+
/** Value (negative values count as 0) */
|
|
9
|
+
value: number;
|
|
10
|
+
/** Color (any CSS color, `var(--x)` included); the palette when omitted */
|
|
11
|
+
color?: string;
|
|
12
|
+
}
|
|
13
|
+
/** Legend of a shape chart */
|
|
14
|
+
export interface ShapeLegendOptions {
|
|
15
|
+
/**
|
|
16
|
+
* Legend position
|
|
17
|
+
* @default "bottom"
|
|
18
|
+
*/
|
|
19
|
+
position?: "top" | "bottom";
|
|
20
|
+
/**
|
|
21
|
+
* Clicking an item hides / shows its slice, stage or series
|
|
22
|
+
* @default true
|
|
23
|
+
*/
|
|
24
|
+
toggle?: boolean;
|
|
25
|
+
}
|
|
26
|
+
/** What the pointer is over */
|
|
27
|
+
export interface ShapeHoverEvent {
|
|
28
|
+
/** Index of the slice / stage / series / leaf (treemap: in the flattened leaves) */
|
|
29
|
+
index: number;
|
|
30
|
+
/** Radar: index of the indicator closest to the pointer */
|
|
31
|
+
indicator?: number;
|
|
32
|
+
name: string;
|
|
33
|
+
value: number;
|
|
34
|
+
/** Share of the total, 0-1 (pie: of the visible total, funnel: of the first stage, treemap: of the root, gauge: of the range) */
|
|
35
|
+
percent: number;
|
|
36
|
+
/** Resolved CSS color of the mark */
|
|
37
|
+
color: string;
|
|
38
|
+
/** Treemap: names from the root to the leaf */
|
|
39
|
+
path?: string[];
|
|
40
|
+
}
|
|
41
|
+
/** Tooltip of a shape chart */
|
|
42
|
+
export interface ShapeTooltipOptions {
|
|
43
|
+
/** Renders the tooltip content (a string is set as text) */
|
|
44
|
+
render?: (event: ShapeHoverEvent) => string | Node | null;
|
|
45
|
+
}
|
|
46
|
+
/** Options shared by every shape chart */
|
|
47
|
+
export interface ShapeChartCommonOptions {
|
|
48
|
+
/** Colors of the marks without `color` (defaults to the `--chart-series-1..8` CSS variables, then the theme colors) */
|
|
49
|
+
palette?: readonly string[];
|
|
50
|
+
/** Legend; shown by default for pie, funnel and multi-series radar charts */
|
|
51
|
+
legend?: boolean | ShapeLegendOptions;
|
|
52
|
+
/** Tooltip; `false` disables it */
|
|
53
|
+
tooltip?: boolean | ShapeTooltipOptions;
|
|
54
|
+
/** Formats the values (labels, tooltip); compact numbers (1.2k, 3.4M) by default */
|
|
55
|
+
format?: (value: number) => string;
|
|
56
|
+
/**
|
|
57
|
+
* Formats the shares (labels, conversion rates, tooltip); `share` is 0-1
|
|
58
|
+
* @default one decimal, e.g. "40.0%"
|
|
59
|
+
*/
|
|
60
|
+
percentFormat?: (share: number) => string;
|
|
61
|
+
/**
|
|
62
|
+
* Indexes of the hidden slices / stages / radar series / top-level treemap
|
|
63
|
+
* nodes. When set, the chart is controlled: this list wins over the legend
|
|
64
|
+
* state, and legend clicks (or `toggle()`) only emit the `toggle` event,
|
|
65
|
+
* whose `hiddenIndexes` should be passed back here.
|
|
66
|
+
*/
|
|
67
|
+
hidden?: readonly number[];
|
|
68
|
+
/**
|
|
69
|
+
* Entry / update animation (skipped when the user prefers reduced motion)
|
|
70
|
+
* @default true
|
|
71
|
+
*/
|
|
72
|
+
animation?: boolean;
|
|
73
|
+
/** Space around the drawing, in CSS pixels */
|
|
74
|
+
padding?: ChartPadding;
|
|
75
|
+
/** Accessible name of the chart */
|
|
76
|
+
ariaLabel?: string;
|
|
77
|
+
}
|
|
78
|
+
/** Pie / donut chart */
|
|
79
|
+
export interface PieChartOptions extends ShapeChartCommonOptions {
|
|
80
|
+
type: "pie";
|
|
81
|
+
data: readonly ShapeDatum[];
|
|
82
|
+
/**
|
|
83
|
+
* Inner radius as a fraction of the outer radius: 0 = pie, 0.6 = donut
|
|
84
|
+
* @default 0
|
|
85
|
+
*/
|
|
86
|
+
innerRadius?: number;
|
|
87
|
+
/**
|
|
88
|
+
* Angle of the first slice, degrees clockwise from 12 o'clock
|
|
89
|
+
* @default 0
|
|
90
|
+
*/
|
|
91
|
+
startAngle?: number;
|
|
92
|
+
/**
|
|
93
|
+
* Gap between the slices, in pixels
|
|
94
|
+
* @default 1 (pie), 2 (donut)
|
|
95
|
+
*/
|
|
96
|
+
padAngle?: number;
|
|
97
|
+
/**
|
|
98
|
+
* Corner radius of the slices, in pixels
|
|
99
|
+
* @default 0 (pie), 4 (donut)
|
|
100
|
+
*/
|
|
101
|
+
cornerRadius?: number;
|
|
102
|
+
/**
|
|
103
|
+
* Nightingale rose: the radius (instead of the angle) shows the value
|
|
104
|
+
* @default false
|
|
105
|
+
*/
|
|
106
|
+
rose?: boolean;
|
|
107
|
+
/**
|
|
108
|
+
* Slice labels: `outside` with leader lines, `inside` the slices, or none
|
|
109
|
+
* @default "outside" (up to 12 slices), "none" otherwise
|
|
110
|
+
*/
|
|
111
|
+
labels?: "outside" | "inside" | "none";
|
|
112
|
+
/** What a label shows: name, value, percent (combinable) */
|
|
113
|
+
labelContent?: readonly ("name" | "value" | "percent")[];
|
|
114
|
+
/** Big text in the hole of a donut (e.g. the total) */
|
|
115
|
+
centerValue?: string;
|
|
116
|
+
/** Small text under `centerValue` */
|
|
117
|
+
centerLabel?: string;
|
|
118
|
+
}
|
|
119
|
+
/** An axis of a radar chart */
|
|
120
|
+
export interface RadarIndicator {
|
|
121
|
+
name: string;
|
|
122
|
+
/** Value at the rim; the largest value of the series when omitted */
|
|
123
|
+
max?: number;
|
|
124
|
+
/**
|
|
125
|
+
* Value at the center
|
|
126
|
+
* @default 0
|
|
127
|
+
*/
|
|
128
|
+
min?: number;
|
|
129
|
+
}
|
|
130
|
+
/** A polygon of a radar chart */
|
|
131
|
+
export interface RadarSeries {
|
|
132
|
+
name?: string;
|
|
133
|
+
/** One value per indicator */
|
|
134
|
+
values: readonly number[];
|
|
135
|
+
color?: string;
|
|
136
|
+
/**
|
|
137
|
+
* Fill opacity, 0-1
|
|
138
|
+
* @default 0.18
|
|
139
|
+
*/
|
|
140
|
+
opacity?: number;
|
|
141
|
+
}
|
|
142
|
+
/** Radar (spider) chart */
|
|
143
|
+
export interface RadarChartOptions extends ShapeChartCommonOptions {
|
|
144
|
+
type: "radar";
|
|
145
|
+
indicators: readonly RadarIndicator[];
|
|
146
|
+
series: readonly RadarSeries[];
|
|
147
|
+
/**
|
|
148
|
+
* Grid shape
|
|
149
|
+
* @default "polygon"
|
|
150
|
+
*/
|
|
151
|
+
shape?: "polygon" | "circle";
|
|
152
|
+
/**
|
|
153
|
+
* Number of grid rings
|
|
154
|
+
* @default 4
|
|
155
|
+
*/
|
|
156
|
+
levels?: number;
|
|
157
|
+
/**
|
|
158
|
+
* Dots on the vertices
|
|
159
|
+
* @default true
|
|
160
|
+
*/
|
|
161
|
+
dots?: boolean;
|
|
162
|
+
}
|
|
163
|
+
/** A colored range of a gauge */
|
|
164
|
+
export interface GaugeBand {
|
|
165
|
+
/** Upper bound of the band (the previous band's bound, or `min`, is the lower one) */
|
|
166
|
+
to: number;
|
|
167
|
+
color: string;
|
|
168
|
+
}
|
|
169
|
+
/** Gauge (speedometer) chart */
|
|
170
|
+
export interface GaugeChartOptions extends ShapeChartCommonOptions {
|
|
171
|
+
type: "gauge";
|
|
172
|
+
value: number;
|
|
173
|
+
/** @default 0 */
|
|
174
|
+
min?: number;
|
|
175
|
+
/** @default 100 */
|
|
176
|
+
max?: number;
|
|
177
|
+
/** Caption under the value */
|
|
178
|
+
label?: string;
|
|
179
|
+
/**
|
|
180
|
+
* Total angle of the arc, degrees
|
|
181
|
+
* @default 240
|
|
182
|
+
*/
|
|
183
|
+
sweep?: number;
|
|
184
|
+
/**
|
|
185
|
+
* Thickness of the arc as a fraction of the radius
|
|
186
|
+
* @default 0.16
|
|
187
|
+
*/
|
|
188
|
+
thickness?: number;
|
|
189
|
+
/** Colored ranges of the track; the value arc takes the color of its band */
|
|
190
|
+
bands?: readonly GaugeBand[];
|
|
191
|
+
/** Color of the value arc (when there are no bands); the first palette color by default */
|
|
192
|
+
color?: string;
|
|
193
|
+
/**
|
|
194
|
+
* Draws a needle in addition to the value arc
|
|
195
|
+
* @default false
|
|
196
|
+
*/
|
|
197
|
+
needle?: boolean;
|
|
198
|
+
/**
|
|
199
|
+
* Tick labels at the ends (and at the band bounds)
|
|
200
|
+
* @default true
|
|
201
|
+
*/
|
|
202
|
+
ticks?: boolean;
|
|
203
|
+
}
|
|
204
|
+
/** Funnel chart */
|
|
205
|
+
export interface FunnelChartOptions extends ShapeChartCommonOptions {
|
|
206
|
+
type: "funnel";
|
|
207
|
+
data: readonly ShapeDatum[];
|
|
208
|
+
/**
|
|
209
|
+
* Order of the stages
|
|
210
|
+
* @default "none" (data order)
|
|
211
|
+
*/
|
|
212
|
+
sort?: "descending" | "ascending" | "none";
|
|
213
|
+
/**
|
|
214
|
+
* Vertical gap between the stages, in pixels
|
|
215
|
+
* @default 4
|
|
216
|
+
*/
|
|
217
|
+
gap?: number;
|
|
218
|
+
/**
|
|
219
|
+
* Shows the conversion rate from the previous stage
|
|
220
|
+
* @default true
|
|
221
|
+
*/
|
|
222
|
+
conversion?: boolean;
|
|
223
|
+
/**
|
|
224
|
+
* Shape of the stages: trapezoids that narrow to the next stage, or centered bars
|
|
225
|
+
* @default "trapezoid"
|
|
226
|
+
*/
|
|
227
|
+
shape?: "trapezoid" | "bar";
|
|
228
|
+
}
|
|
229
|
+
/** A node of a treemap: leaves carry a value, parents sum their children */
|
|
230
|
+
export interface TreemapNode {
|
|
231
|
+
name: string;
|
|
232
|
+
value?: number;
|
|
233
|
+
color?: string;
|
|
234
|
+
children?: readonly TreemapNode[];
|
|
235
|
+
}
|
|
236
|
+
/** Treemap chart */
|
|
237
|
+
export interface TreemapChartOptions extends ShapeChartCommonOptions {
|
|
238
|
+
type: "treemap";
|
|
239
|
+
data: readonly TreemapNode[];
|
|
240
|
+
/**
|
|
241
|
+
* Gap between the cells, in pixels
|
|
242
|
+
* @default 2
|
|
243
|
+
*/
|
|
244
|
+
gap?: number;
|
|
245
|
+
/**
|
|
246
|
+
* Draws the names of the parents above their children
|
|
247
|
+
* @default true
|
|
248
|
+
*/
|
|
249
|
+
headers?: boolean;
|
|
250
|
+
}
|
|
251
|
+
/** Options of a shape chart, by `type` */
|
|
252
|
+
export type ShapeChartOptions = PieChartOptions | RadarChartOptions | GaugeChartOptions | FunnelChartOptions | TreemapChartOptions;
|
|
253
|
+
/** A legend item was clicked (or `toggle()` was called) */
|
|
254
|
+
export interface ShapeToggleEvent {
|
|
255
|
+
/** Index of the slice / stage / radar series / top-level treemap node */
|
|
256
|
+
index: number;
|
|
257
|
+
/** Whether that entry is (or, in a controlled chart, would be) hidden */
|
|
258
|
+
hidden: boolean;
|
|
259
|
+
/** Every hidden index after the toggle, ascending */
|
|
260
|
+
hiddenIndexes: number[];
|
|
261
|
+
}
|
|
262
|
+
/** Events of a shape chart */
|
|
263
|
+
export interface ShapeChartEventMap {
|
|
264
|
+
hover: ShapeHoverEvent | null;
|
|
265
|
+
click: ShapeHoverEvent;
|
|
266
|
+
/**
|
|
267
|
+
* Legend click or `toggle()` call. Uncontrolled charts emit it after
|
|
268
|
+
* hiding / showing the entry; with the `hidden` option nothing changes
|
|
269
|
+
* until the new `hiddenIndexes` are passed back.
|
|
270
|
+
*/
|
|
271
|
+
toggle: ShapeToggleEvent;
|
|
272
|
+
}
|
|
273
|
+
/** Shape chart created by `createShapeChart` */
|
|
274
|
+
export interface ShapeChartInstance {
|
|
275
|
+
/** Replaces the options (animates from the previous values) */
|
|
276
|
+
setOptions(options: ShapeChartOptions): void;
|
|
277
|
+
/** Measures the container again (a ResizeObserver does it automatically) */
|
|
278
|
+
resize(): void;
|
|
279
|
+
/** Reads the CSS variables again (theme changes on `<html>` / `<body>` are detected automatically) */
|
|
280
|
+
refreshTheme(): void;
|
|
281
|
+
/**
|
|
282
|
+
* Hides / shows a slice, stage, radar series or top-level treemap node by
|
|
283
|
+
* index and emits `toggle` (with the `hidden` option: only emits `toggle`)
|
|
284
|
+
*/
|
|
285
|
+
toggle(index: number): void;
|
|
286
|
+
/** Indexes of the hidden entries, ascending */
|
|
287
|
+
getHidden(): number[];
|
|
288
|
+
/** Subscribes to an event; returns the unsubscribe function */
|
|
289
|
+
on<K extends keyof ShapeChartEventMap>(type: K, listener: (event: ShapeChartEventMap[K]) => void): () => void;
|
|
290
|
+
/** Removes the DOM */
|
|
291
|
+
destroy(): void;
|
|
292
|
+
}
|