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.
Files changed (256) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/charts/canvas.d.cts +4 -1
  3. package/dist/charts/canvas.d.ts +4 -1
  4. package/dist/charts/core.cjs +1 -1
  5. package/dist/charts/core.d.cts +5 -2
  6. package/dist/charts/core.d.ts +5 -2
  7. package/dist/charts/core.js +6 -4
  8. package/dist/charts/engine/canvas.cjs +1 -1
  9. package/dist/charts/engine/canvas.cjs.map +1 -1
  10. package/dist/charts/engine/canvas.js +65 -53
  11. package/dist/charts/engine/canvas.js.map +1 -1
  12. package/dist/charts/engine/chart.cjs +1 -2
  13. package/dist/charts/engine/chart.cjs.map +1 -1
  14. package/dist/charts/engine/chart.js +342 -323
  15. package/dist/charts/engine/chart.js.map +1 -1
  16. package/dist/charts/engine/color.cjs +1 -1
  17. package/dist/charts/engine/color.cjs.map +1 -1
  18. package/dist/charts/engine/color.d.cts +17 -0
  19. package/dist/charts/engine/color.d.ts +17 -0
  20. package/dist/charts/engine/color.js +27 -3
  21. package/dist/charts/engine/color.js.map +1 -1
  22. package/dist/charts/engine/controller.cjs +2 -2
  23. package/dist/charts/engine/controller.cjs.map +1 -1
  24. package/dist/charts/engine/controller.d.cts +6 -0
  25. package/dist/charts/engine/controller.d.ts +6 -0
  26. package/dist/charts/engine/controller.js +317 -253
  27. package/dist/charts/engine/controller.js.map +1 -1
  28. package/dist/charts/engine/curve.cjs +2 -0
  29. package/dist/charts/engine/curve.cjs.map +1 -0
  30. package/dist/charts/engine/curve.d.cts +15 -0
  31. package/dist/charts/engine/curve.d.ts +15 -0
  32. package/dist/charts/engine/curve.js +56 -0
  33. package/dist/charts/engine/curve.js.map +1 -0
  34. package/dist/charts/engine/data.cjs +1 -1
  35. package/dist/charts/engine/data.cjs.map +1 -1
  36. package/dist/charts/engine/data.d.cts +15 -2
  37. package/dist/charts/engine/data.d.ts +15 -2
  38. package/dist/charts/engine/data.js +98 -38
  39. package/dist/charts/engine/data.js.map +1 -1
  40. package/dist/charts/engine/dom.cjs +1 -1
  41. package/dist/charts/engine/dom.cjs.map +1 -1
  42. package/dist/charts/engine/dom.d.cts +5 -3
  43. package/dist/charts/engine/dom.d.ts +5 -3
  44. package/dist/charts/engine/dom.js +27 -22
  45. package/dist/charts/engine/dom.js.map +1 -1
  46. package/dist/charts/engine/items.cjs +1 -1
  47. package/dist/charts/engine/items.cjs.map +1 -1
  48. package/dist/charts/engine/items.js +132 -61
  49. package/dist/charts/engine/items.js.map +1 -1
  50. package/dist/charts/engine/model.cjs +1 -1
  51. package/dist/charts/engine/model.cjs.map +1 -1
  52. package/dist/charts/engine/model.d.cts +30 -3
  53. package/dist/charts/engine/model.d.ts +30 -3
  54. package/dist/charts/engine/model.js +225 -108
  55. package/dist/charts/engine/model.js.map +1 -1
  56. package/dist/charts/engine/overlay.cjs +1 -1
  57. package/dist/charts/engine/overlay.cjs.map +1 -1
  58. package/dist/charts/engine/overlay.d.cts +2 -0
  59. package/dist/charts/engine/overlay.d.ts +2 -0
  60. package/dist/charts/engine/overlay.js +16 -16
  61. package/dist/charts/engine/overlay.js.map +1 -1
  62. package/dist/charts/engine/presets.cjs +2 -2
  63. package/dist/charts/engine/presets.cjs.map +1 -1
  64. package/dist/charts/engine/presets.d.cts +71 -5
  65. package/dist/charts/engine/presets.d.ts +71 -5
  66. package/dist/charts/engine/presets.js +120 -33
  67. package/dist/charts/engine/presets.js.map +1 -1
  68. package/dist/charts/engine/renderers/canvas2d.cjs +1 -1
  69. package/dist/charts/engine/renderers/canvas2d.cjs.map +1 -1
  70. package/dist/charts/engine/renderers/canvas2d.js +149 -111
  71. package/dist/charts/engine/renderers/canvas2d.js.map +1 -1
  72. package/dist/charts/engine/renderers/range.cjs +1 -1
  73. package/dist/charts/engine/renderers/range.cjs.map +1 -1
  74. package/dist/charts/engine/renderers/range.js +4 -4
  75. package/dist/charts/engine/renderers/range.js.map +1 -1
  76. package/dist/charts/engine/renderers/shaders.cjs +37 -19
  77. package/dist/charts/engine/renderers/shaders.cjs.map +1 -1
  78. package/dist/charts/engine/renderers/shaders.d.cts +2 -2
  79. package/dist/charts/engine/renderers/shaders.d.ts +2 -2
  80. package/dist/charts/engine/renderers/shaders.js +37 -19
  81. package/dist/charts/engine/renderers/shaders.js.map +1 -1
  82. package/dist/charts/engine/renderers/types.cjs.map +1 -1
  83. package/dist/charts/engine/renderers/types.d.cts +11 -4
  84. package/dist/charts/engine/renderers/types.d.ts +11 -4
  85. package/dist/charts/engine/renderers/types.js.map +1 -1
  86. package/dist/charts/engine/renderers/webgl2.cjs +1 -1
  87. package/dist/charts/engine/renderers/webgl2.cjs.map +1 -1
  88. package/dist/charts/engine/renderers/webgl2.js +33 -12
  89. package/dist/charts/engine/renderers/webgl2.js.map +1 -1
  90. package/dist/charts/engine/renderers/webgpu.cjs +1 -1
  91. package/dist/charts/engine/renderers/webgpu.cjs.map +1 -1
  92. package/dist/charts/engine/renderers/webgpu.js +18 -15
  93. package/dist/charts/engine/renderers/webgpu.js.map +1 -1
  94. package/dist/charts/engine/scene.cjs +1 -1
  95. package/dist/charts/engine/scene.cjs.map +1 -1
  96. package/dist/charts/engine/scene.d.cts +19 -6
  97. package/dist/charts/engine/scene.d.ts +19 -6
  98. package/dist/charts/engine/scene.js +201 -89
  99. package/dist/charts/engine/scene.js.map +1 -1
  100. package/dist/charts/engine/shapes/canvas.cjs +2 -0
  101. package/dist/charts/engine/shapes/canvas.cjs.map +1 -0
  102. package/dist/charts/engine/shapes/canvas.d.cts +58 -0
  103. package/dist/charts/engine/shapes/canvas.d.ts +58 -0
  104. package/dist/charts/engine/shapes/canvas.js +159 -0
  105. package/dist/charts/engine/shapes/canvas.js.map +1 -0
  106. package/dist/charts/engine/shapes/chart.cjs +2 -0
  107. package/dist/charts/engine/shapes/chart.cjs.map +1 -0
  108. package/dist/charts/engine/shapes/chart.d.cts +6 -0
  109. package/dist/charts/engine/shapes/chart.d.ts +6 -0
  110. package/dist/charts/engine/shapes/chart.js +273 -0
  111. package/dist/charts/engine/shapes/chart.js.map +1 -0
  112. package/dist/charts/engine/shapes/draw.cjs +2 -0
  113. package/dist/charts/engine/shapes/draw.cjs.map +1 -0
  114. package/dist/charts/engine/shapes/draw.d.cts +20 -0
  115. package/dist/charts/engine/shapes/draw.d.ts +20 -0
  116. package/dist/charts/engine/shapes/draw.js +152 -0
  117. package/dist/charts/engine/shapes/draw.js.map +1 -0
  118. package/dist/charts/engine/shapes/funnel.cjs +2 -0
  119. package/dist/charts/engine/shapes/funnel.cjs.map +1 -0
  120. package/dist/charts/engine/shapes/funnel.d.cts +6 -0
  121. package/dist/charts/engine/shapes/funnel.d.ts +6 -0
  122. package/dist/charts/engine/shapes/funnel.js +149 -0
  123. package/dist/charts/engine/shapes/funnel.js.map +1 -0
  124. package/dist/charts/engine/shapes/gauge.cjs +2 -0
  125. package/dist/charts/engine/shapes/gauge.cjs.map +1 -0
  126. package/dist/charts/engine/shapes/gauge.d.cts +7 -0
  127. package/dist/charts/engine/shapes/gauge.d.ts +7 -0
  128. package/dist/charts/engine/shapes/gauge.js +173 -0
  129. package/dist/charts/engine/shapes/gauge.js.map +1 -0
  130. package/dist/charts/engine/shapes/hit.cjs +2 -0
  131. package/dist/charts/engine/shapes/hit.cjs.map +1 -0
  132. package/dist/charts/engine/shapes/hit.d.cts +28 -0
  133. package/dist/charts/engine/shapes/hit.d.ts +28 -0
  134. package/dist/charts/engine/shapes/hit.js +124 -0
  135. package/dist/charts/engine/shapes/hit.js.map +1 -0
  136. package/dist/charts/engine/shapes/index.d.cts +9 -0
  137. package/dist/charts/engine/shapes/index.d.ts +9 -0
  138. package/dist/charts/engine/shapes/layout.cjs +3 -0
  139. package/dist/charts/engine/shapes/layout.cjs.map +1 -0
  140. package/dist/charts/engine/shapes/layout.d.cts +88 -0
  141. package/dist/charts/engine/shapes/layout.d.ts +88 -0
  142. package/dist/charts/engine/shapes/layout.js +266 -0
  143. package/dist/charts/engine/shapes/layout.js.map +1 -0
  144. package/dist/charts/engine/shapes/pie.cjs +2 -0
  145. package/dist/charts/engine/shapes/pie.cjs.map +1 -0
  146. package/dist/charts/engine/shapes/pie.d.cts +20 -0
  147. package/dist/charts/engine/shapes/pie.d.ts +20 -0
  148. package/dist/charts/engine/shapes/pie.js +302 -0
  149. package/dist/charts/engine/shapes/pie.js.map +1 -0
  150. package/dist/charts/engine/shapes/radar.cjs +2 -0
  151. package/dist/charts/engine/shapes/radar.cjs.map +1 -0
  152. package/dist/charts/engine/shapes/radar.d.cts +8 -0
  153. package/dist/charts/engine/shapes/radar.d.ts +8 -0
  154. package/dist/charts/engine/shapes/radar.js +197 -0
  155. package/dist/charts/engine/shapes/radar.js.map +1 -0
  156. package/dist/charts/engine/shapes/runtime.cjs +2 -0
  157. package/dist/charts/engine/shapes/runtime.cjs.map +1 -0
  158. package/dist/charts/engine/shapes/runtime.d.cts +29 -0
  159. package/dist/charts/engine/shapes/runtime.d.ts +29 -0
  160. package/dist/charts/engine/shapes/runtime.js +97 -0
  161. package/dist/charts/engine/shapes/runtime.js.map +1 -0
  162. package/dist/charts/engine/shapes/scene.cjs +2 -0
  163. package/dist/charts/engine/shapes/scene.cjs.map +1 -0
  164. package/dist/charts/engine/shapes/scene.d.cts +257 -0
  165. package/dist/charts/engine/shapes/scene.d.ts +257 -0
  166. package/dist/charts/engine/shapes/scene.js +123 -0
  167. package/dist/charts/engine/shapes/scene.js.map +1 -0
  168. package/dist/charts/engine/shapes/treemap.cjs +2 -0
  169. package/dist/charts/engine/shapes/treemap.cjs.map +1 -0
  170. package/dist/charts/engine/shapes/treemap.d.cts +14 -0
  171. package/dist/charts/engine/shapes/treemap.d.ts +14 -0
  172. package/dist/charts/engine/shapes/treemap.js +213 -0
  173. package/dist/charts/engine/shapes/treemap.js.map +1 -0
  174. package/dist/charts/engine/shapes/types.d.cts +292 -0
  175. package/dist/charts/engine/shapes/types.d.ts +292 -0
  176. package/dist/charts/engine/signature.cjs +2 -0
  177. package/dist/charts/engine/signature.cjs.map +1 -0
  178. package/dist/charts/engine/signature.d.cts +9 -0
  179. package/dist/charts/engine/signature.d.ts +9 -0
  180. package/dist/charts/engine/signature.js +13 -0
  181. package/dist/charts/engine/signature.js.map +1 -0
  182. package/dist/charts/engine/theme.cjs +1 -1
  183. package/dist/charts/engine/theme.cjs.map +1 -1
  184. package/dist/charts/engine/theme.d.cts +10 -1
  185. package/dist/charts/engine/theme.d.ts +10 -1
  186. package/dist/charts/engine/theme.js +40 -16
  187. package/dist/charts/engine/theme.js.map +1 -1
  188. package/dist/charts/engine/types.d.cts +70 -9
  189. package/dist/charts/engine/types.d.ts +70 -9
  190. package/dist/charts/index.cjs +1 -1
  191. package/dist/charts/index.d.cts +4 -2
  192. package/dist/charts/index.d.ts +4 -2
  193. package/dist/charts/index.js +8 -5
  194. package/dist/charts/react/Chart.cjs +1 -1
  195. package/dist/charts/react/Chart.cjs.map +1 -1
  196. package/dist/charts/react/Chart.d.cts +8 -1
  197. package/dist/charts/react/Chart.d.ts +8 -1
  198. package/dist/charts/react/Chart.js +66 -47
  199. package/dist/charts/react/Chart.js.map +1 -1
  200. package/dist/charts/react/charts.cjs +1 -1
  201. package/dist/charts/react/charts.cjs.map +1 -1
  202. package/dist/charts/react/charts.d.cts +10 -2
  203. package/dist/charts/react/charts.d.ts +10 -2
  204. package/dist/charts/react/charts.js +174 -51
  205. package/dist/charts/react/charts.js.map +1 -1
  206. package/dist/charts/react/shapes.cjs +2 -0
  207. package/dist/charts/react/shapes.cjs.map +1 -0
  208. package/dist/charts/react/shapes.d.cts +255 -0
  209. package/dist/charts/react/shapes.d.ts +255 -0
  210. package/dist/charts/react/shapes.js +242 -0
  211. package/dist/charts/react/shapes.js.map +1 -0
  212. package/dist/charts/react/types.d.cts +73 -4
  213. package/dist/charts/react/types.d.ts +73 -4
  214. package/dist/native/charts/src/engine/color.cjs +1 -1
  215. package/dist/native/charts/src/engine/color.cjs.map +1 -1
  216. package/dist/native/charts/src/engine/color.js +12 -3
  217. package/dist/native/charts/src/engine/color.js.map +1 -1
  218. package/dist/native/charts/src/engine/controller.cjs +2 -2
  219. package/dist/native/charts/src/engine/controller.cjs.map +1 -1
  220. package/dist/native/charts/src/engine/controller.js +334 -270
  221. package/dist/native/charts/src/engine/controller.js.map +1 -1
  222. package/dist/native/charts/src/engine/curve.cjs +2 -0
  223. package/dist/native/charts/src/engine/curve.cjs.map +1 -0
  224. package/dist/native/charts/src/engine/curve.js +56 -0
  225. package/dist/native/charts/src/engine/curve.js.map +1 -0
  226. package/dist/native/charts/src/engine/data.cjs +1 -1
  227. package/dist/native/charts/src/engine/data.cjs.map +1 -1
  228. package/dist/native/charts/src/engine/data.js +98 -38
  229. package/dist/native/charts/src/engine/data.js.map +1 -1
  230. package/dist/native/charts/src/engine/model.cjs +1 -1
  231. package/dist/native/charts/src/engine/model.cjs.map +1 -1
  232. package/dist/native/charts/src/engine/model.js +229 -112
  233. package/dist/native/charts/src/engine/model.js.map +1 -1
  234. package/dist/native/charts/src/engine/overlay.cjs +1 -1
  235. package/dist/native/charts/src/engine/overlay.cjs.map +1 -1
  236. package/dist/native/charts/src/engine/overlay.js +16 -16
  237. package/dist/native/charts/src/engine/overlay.js.map +1 -1
  238. package/dist/native/charts/src/engine/presets.cjs +1 -1
  239. package/dist/native/charts/src/engine/presets.cjs.map +1 -1
  240. package/dist/native/charts/src/engine/presets.js +11 -4
  241. package/dist/native/charts/src/engine/presets.js.map +1 -1
  242. package/dist/native/charts/src/engine/scene.cjs +1 -1
  243. package/dist/native/charts/src/engine/scene.cjs.map +1 -1
  244. package/dist/native/charts/src/engine/scene.js +209 -97
  245. package/dist/native/charts/src/engine/scene.js.map +1 -1
  246. package/dist/native/charts/src/engine/theme.cjs.map +1 -1
  247. package/dist/native/charts/src/engine/theme.js.map +1 -1
  248. package/dist/native/components/Chart/scene.cjs +1 -1
  249. package/dist/native/components/Chart/scene.cjs.map +1 -1
  250. package/dist/native/components/Chart/scene.js +31 -19
  251. package/dist/native/components/Chart/scene.js.map +1 -1
  252. package/dist/native/source/components/Chart/scene.tsx +54 -20
  253. package/dist/taro/index.js +1059 -579
  254. package/dist/uni/charts-canvas.js +3 -1
  255. package/dist/weapp/controls.js +966 -225
  256. 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":";;;;AAyBA,IAAMA,IAAS,IAMFC,KACX,GACA,MACgB;CAChB,IAAMC,IAAmBC,EAAO,WAAW;EACzC,GAAGC,EAAK;EACR,GAAGA,EAAK;EACR,OAAO;EACP,QAAQ;CACV,EAAE,GACIC,IAAQC,EAAIH,EAAO,KAAK,MAAM,KAAK,IAAI,GAAGI,CAAC,CAAC,CAAC;CACnD,IAAIF,KAAS,KAAKD,EAAK,SAAS,KAAKA,EAAK,UAAU,GAAG,OAAOF;CAC9D,IAAMM,IAASJ,EAAK,QAAQA,EAAK,SAAUC,GACrCI,IAAQN,EAAO,KAAK,MAAM,KAAK,IAAI,GAAGI,CAAC,IAAIC,CAAK,GAClD,EAAE,MAAG,MAAG,OAAOE,GAAG,QAAQC,MAAMP,GAE9BQ,KAAS,GAAW,GAAa,GAAa,MAAiB;EACnE,IAAMC,IAAKC,IAAIA,GACTC,IAAQC,IAAOA;EACrB,OAAO,KAAK,IAAKD,IAAQE,IAAOJ,GAAIA,KAAME,IAAQG,EAAI;CACxD,GACMC,KAAS,GAAe,MAAc;EAC1C,IAAIT,KAAKC,GAAG;GACV,IAAMS,IAAKT,IAAI,IAAI,KAAK,IAAID,GAAGI,IAAIH,CAAC,IAAI,GACpCU,IAAKC;GACT,KAAK,IAAMC,KAAKC,GAAK;IACnB,IAAMC,IAAKL,IAAK,IAAIX,EAAMc,KAAKH,IAAK;IAEpC,AADA,EAAIG,KAAK;KAAE;KAAG,GAAGF;KAAI,OAAOD;KAAI,QAAQK;IAAG,GAC3C,KAAMA;GACR;GAEA,AADA,KAAKL,GACL,IAAI,KAAK,IAAI,GAAGV,IAAIU,CAAE;EACxB,OAAO;GACL,IAAMM,IAAKhB,IAAI,IAAI,KAAK,IAAIC,GAAGG,IAAIJ,CAAC,IAAI,GACpCiB,IAAKC;GACT,KAAK,IAAML,KAAKC,GAAK;IACnB,IAAMK,IAAKH,IAAK,IAAIjB,EAAMc,KAAKG,IAAK;IAEpC,AADA,EAAIH,KAAK;KAAE,GAAGI;KAAI;KAAG,OAAOE;KAAI,QAAQH;IAAG,GAC3C,KAAMG;GACR;GAEA,AADA,KAAKH,GACL,IAAI,KAAK,IAAI,GAAGf,IAAIe,CAAE;EACxB;CACF,GAEIF,IAAgB,CAAC,GACjBM,IAAS,GACTC,IAAS,UACTC,IAAS;CAyBb,OAxBAvB,EAAM,SAAS,GAAG,MAAM;EACtB,IAAI,OAAK,IACT;OAAIe,EAAI,QAAQ;IACd,IAAMR,IAAO,KAAK,IAAIN,GAAGC,CAAC;IAO1B,AANaC,EACXkB,IAASG,GACT,KAAK,IAAIF,GAAQE,CAAC,GAClB,KAAK,IAAID,GAAQC,CAAC,GAClBjB,CAEE,IAAOJ,EAAMkB,GAAQC,GAAQC,GAAQhB,CAAI,MAC3CG,EAAMK,GAAKM,CAAM,GACjB,IAAM,CAAC,GACP,IAAS,GACT,IAAS,UACT,IAAS;GAEb;GAIA,AAHAN,EAAI,KAAKD,CAAC,GACV,KAAUU,GACV,IAAS,KAAK,IAAIF,GAAQE,CAAC,GAC3B,IAAS,KAAK,IAAID,GAAQC,CAAC;EAJ3B;CAKF,CAAC,GACGT,EAAI,UAAQL,EAAMK,GAAKM,CAAM,GAC1B5B;AACT,GAcMgC,KACJ,GACA,MACY;CACZ,IAAIC,IAAY,GACVC,KACJ,GACA,GACA,GACA,MACY;EACZ,IAAMC,IAAOC,EAAWC,EAAM,KAAK,MAAOC,EAAG,IAAI,CAAC;EAClD,OAAOD,EAAM,KAAK,GAAM,MAAM;GAC5B,IAAME,IAAIC,EAAW,SAASC,IAAMC,GAC9BC,IAAM,GAAGC,EAAU,GAAGT,EAAKO,MAC3BG,IAAO,CAAC,GAAGL,GAAYM,EAAK,IAAI;GACtC,IAAIA,EAAK,UAAU,QAAQ;IACzB,IAAMC,IAAWb,EAAKY,EAAK,UAAUH,GAAKE,GAAMN,CAAC;IACjD,OAAO;KACL;KACA;KACA;KACA,KAAKA;KACL,MAAM;KACN,QAAQnC,EAAI2C,EAAS,KAAK,MAAOC,EAAG,MAAM,CAAC;KAC3C;IACF;GACF;GACA,OAAO;IACL;IACA;IACA;IACA,KAAKT;IACL,MAAM;IACN,QAAQU,EAAO,IAAIV,CAAC,IAAI,IAAIW,EAASJ,EAAK,KAAK;IAC/C,UAAU,CAAC;GACb;EACF,CAAC;CACH;CACA,OAAOZ,EAAKiB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC;AAC/B,GAEaC,KACX,GACA,GACA,MACG;CACH,IAAMC,KAAS,MACbhB,EAAM,SAAS,MAAM;EACnB,AAAIiB,EAAE,SAAS,SAAQD,EAAMC,EAAE,QAAQ,IAClCtD,EAAI,IAAIsD,EAAE,KAAKA,EAAE,MAAM;CAC9B,CAAC;CACH,EAAMtB,EAAMmB,GAAGF,CAAM,CAAC;AACxB,GAeMM,KAAU,GAAc,OAA0B;CACtD,GAAGC,EAAE,IAAIC;CACT,GAAGD,EAAE,IAAIC;CACT,OAAO,KAAK,IAAI,GAAGD,EAAE,QAAQ,IAAIC,CAAC;CAClC,QAAQ,KAAK,IAAI,GAAGD,EAAE,SAAS,IAAIC,CAAC;AACtC,IAEaC,KACX,GACA,MACiB;CACjB,IAAM,EAAE,UAAO,SAAM,YAAS,cAAWC,GACnCC,IAAO5B,EAAMmB,GAAGF,CAAM,GACtBY,IAAYzD,EAAIwD,EAAK,KAAK,MAAMN,EAAE,MAAM,CAAC,GAEzCQ,oBAAQ,IAAI,IAAmB,GAC/BC,KAAgB,MAAqB;EACzC,IAAM1D,IAAIiD,EAAE,SAAS,SACjBlD,EAAIkD,EAAE,SAAS,IAAIS,CAAY,CAAC,IAChC,KAAK,IAAI,GAAGJ,EAAE,MAAML,EAAE,KAAKA,EAAE,MAAM,CAAC;EAExC,OADAQ,EAAM,IAAIR,GAAGjD,CAAC,GACPA;CACT,GACM2D,IAAa5D,EAAIwD,EAAK,IAAIG,CAAY,CAAC;CAC7C,IAAIF,KAAa,KAAKG,KAAc,MAAM,OAAOC,EAAYN,CAAC;CAE9D,IAAMO,IAAM,KAAK,IAAI,GAAGC,EAAOhB,EAAE,KAAK,CAAC,CAAC,GAClCiB,IAAUjB,EAAE,YAAY,IACxBkB,IAAWC,EAAKC,GAAO,IAAI,GAAG,GAC9BC,IAAYF,EAAKC,GAAO,EAAE,GAC1BE,IAAaH,EAAKC,GAAO,IAAI,GAAG,GAChClC,IAAqB,CAAC,GACtBqC,IAAqB,CAAC,GAEtBC,IAAOC,EAAkBL,EAAM,UAAU,IAAI,IAE7CM,KAAS,GAAe,GAAiB,MAA6B;EAC1E,IAAMC,IAASC,EACZ,QAAQ,OAAOjB,EAAM,IAAIR,CAAC,KAAK,KAAK,IAAI,CAAC,CACzC,MAAM,GAAG,OAAOQ,EAAM,IAAIR,CAAC,KAAK,MAAMQ,EAAM,IAAI/B,CAAC,KAAK,EAAE,GACrDiD,IAAQjF,EACZ+E,EAAO,KAAK,MAAMhB,EAAM,IAAIR,CAAC,KAAK,CAAC,GACnCpD,CACF,GACM+E,IAAO,KAAK,IAAI,KAAM,KAAM,KAAK,IAAI,GAAGH,EAAO,SAAS,CAAC,CAAC;EAChE,EAAO,SAAS,GAAG,MAAM;GACvB,IAAMI,IAAO3B,EAAOyB,EAAMtC,IAAIwB,IAAM,CAAC;GACrC,IAAIgB,EAAK,QAAQ,KAAKA,EAAK,SAAS,GAAG;GACvC,IAAMC,IAAQC,IACV9B,EAAE,KAAK,QACL+B,EAAYd,GAAOjB,EAAE,KAAK,OAAO8B,CAAW,IAC5CE,EAAIF,GAAab,EAAM,YAAY7B,IAAIuC,CAAI,IAC7CtB,EAAE,MAAML,EAAE,KAAK,OAAOA,EAAE,GAAG;GAC/B,IAAIA,EAAE,SAAS,QAAQ;IACrB,IAAIiC,IAAUL;IACd,IAAId,KAAWc,EAAK,SAAS,MAAeA,EAAK,QAAQ,IAAI;KAC3D,EAAM,KAAK;MACT,MAAM;MACN,GAAGA,EAAK;MACR,GAAGA,EAAK;MACR,OAAOA,EAAK;MACZ,QAAQA,EAAK;MACb,QAAQ;MACR,MAAMM,EAAML,GAAO,GAAI;KACzB,CAAC;KACD,IAAMM,IAAQC,EACZpC,EAAE,KAAK,MACP4B,EAAK,QAAQ,IACbT,GACAkB,CACF;KAYA,AAXIF,KACFpD,EAAM,KAAK;MACT,MAAM;MACN,GAAG6C,EAAK,IAAI;MACZ,GAAGA,EAAK,IAAIpF,IAAS,IAAI;MACzB,MAAM2F;MACN,MAAMhB;MACN,OAAOe,EAAMjB,EAAM,MAAM,GAAI;MAC7B,OAAO;MACP,UAAU;KACZ,CAAC,GACH,IAAU;MACR,GAAGW,EAAK,IAAI;MACZ,GAAGA,EAAK,IAAIpF;MACZ,OAAOoF,EAAK,QAAQ;MACpB,QAAQA,EAAK,SAASpF,IAAS;KACjC;IACF;IACA,EAAMwD,EAAE,UAAUiC,GAASJ,CAAK;IAChC;GACF;GACA,IAAMS,IAAOC,EACXlB,IAAOW,EAAIH,GAAOZ,EAAM,YAAY,GAAI,IAAIY,CAC9C,GACMW,IAAMN,EAAMI,CAAI;GAYtB,IAXAvD,EAAM,KAAK;IACT,MAAM;IACN,GAAG6C,EAAK;IACR,GAAGA,EAAK;IACR,OAAOA,EAAK;IACZ,QAAQA,EAAK;IACb,QAAQ,KAAK,IAAI,GAAGA,EAAK,QAAQ,GAAGA,EAAK,SAAS,CAAC;IACnD,MAAMY;IACN,KAAKxC,EAAE;IACP,UAAU;GACZ,CAAC,GACG4B,EAAK,SAAS,MAAMA,EAAK,UAAU,IAAI;IACzC,IAAMa,IAAMC,EAAOJ,CAAI,GACjBK,IAAOP,EAAUpC,EAAE,KAAK,MAAM4B,EAAK,QAAQ,IAAIb,GAAUsB,CAAO;IACtE,AAAIM,KACF5D,EAAM,KAAK;KACT,MAAM;KACN,GAAG6C,EAAK,IAAI;KACZ,GAAGA,EAAK,IAAI;KACZ,MAAMe;KACN,MAAM5B;KACN,OAAO0B;KACP,OAAO;KACP,UAAU;KACV,KAAKzC,EAAE;IACT,CAAC;IACH,IAAM4C,IAAQvC,EAAE,OAAOL,EAAE,MAAM;IAC/B,AACE2C,KACAf,EAAK,UAAU,MACfS,EAAQO,GAAO1B,CAAS,KAAKU,EAAK,QAAQ,MAE1C7C,EAAM,KAAK;KACT,MAAM;KACN,GAAG6C,EAAK,IAAI;KACZ,GAAGA,EAAK,IAAI;KACZ,MAAMgB;KACN,MAAM1B;KACN,OAAOuB;KACP,OAAO;KACP,UAAU;KACV,KAAKzC,EAAE;IACT,CAAC;GACL;GACA,IAAIA,EAAE,SAAS,GAAG;IAChB,IAAM6C,IAAUtC,IAAY,IAAIP,EAAE,SAASO,IAAY;IACvD,EAAM,KAAK;KACT,OAAOP,EAAE;KACT,MAAMA,EAAE,KAAK;KACb,OAAOA,EAAE;KACT;KACA,OAAOK,EAAE,QAAQwC,CAAO;KACxB,OAAOL;KACP,MAAMxC,EAAE;KACR,GAAG4B,EAAK,IAAIA,EAAK,QAAQ;KACzB,GAAGA,EAAK,IAAIA,EAAK,SAAS;KAC1B,MAAM,CACJ;MAAE,MAAM;MAAS,OAAOvB,EAAE,OAAOL,EAAE,MAAM;KAAE,GAC3C;MAAE,MAAM;MAAS,OAAOK,EAAE,QAAQwC,CAAO;KAAE,CAC7C;IACF,CAAC;GACH;EACF,CAAC;CACH;CAEA,AADAtB,EAAMjB,GAAMwC,GAAM,IAAI,GACtB1B,EAAM,MAAM,GAAG,MAAM3C,EAAE,QAAQuB,EAAE,KAAK;CAEtC,IAAM+C,IAAQC,EAAM3C,EAAE,OAAO,GAAG,CAAC;CACjC,OAAO;EACL;EACA;EACA,KAAK;EACL,OAAO;EACP,GAAI0C,IAAQ,IACR,EACE,OAAO;GACL,OAAOA;GACP,OAAO,MAAO,MAAOA;GACrB,IAAID,EAAK,IAAIA,EAAK,QAAQ;GAC1B,IAAIA,EAAK,IAAIA,EAAK,SAAS;EAC7B,EACF,IACA,CAAC;CACP;AACF"}
@@ -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
+ }