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
@@ -1,9 +1,9 @@
1
- import { collectCategories as e, normalizeData as t, xResolver as n } from "./data.js";
2
- import { resolveStaticColor as r, toCss as i } from "./color.js";
3
- import { ensureSpan as a, niceDomain as o } from "./scale.js";
4
- import { GridIndex as s } from "./spatial.js";
1
+ import { collectCategories as e, collectYCategories as t, normalizeData as n, xResolver as r } from "./data.js";
2
+ import { mix as i, packColor as a, rampColor as o, resolveStaticColor as s, toCss as c } from "./color.js";
3
+ import { ensureSpan as l, niceDomain as u } from "./scale.js";
4
+ import { GridIndex as d } from "./spatial.js";
5
5
  //#region src/engine/model.ts
6
- var c = (e) => {
6
+ var f = (e) => {
7
7
  if (typeof e == "object" && e && !("length" in e)) {
8
8
  let t = e.x;
9
9
  return t && t.length ? t[0] : void 0;
@@ -14,14 +14,14 @@ var c = (e) => {
14
14
  if (Array.isArray(n)) return n[0];
15
15
  if (n && typeof n == "object") return n.x;
16
16
  }
17
- }, l = (e) => {
17
+ }, p = (e) => {
18
18
  for (let t of e) {
19
- let e = c(t);
19
+ let e = f(t);
20
20
  if (e instanceof Date) return "time";
21
21
  if (typeof e == "string") return "category";
22
22
  }
23
23
  return "linear";
24
- }, u = (e, t, n, r) => ({
24
+ }, m = (e, t, n, r) => ({
25
25
  type: t,
26
26
  reverse: !!e?.reverse,
27
27
  categories: n,
@@ -30,146 +30,263 @@ var c = (e) => {
30
30
  grid: e?.grid ?? r,
31
31
  visible: e?.visible ?? !0,
32
32
  tickCount: e?.tickCount
33
- }), d = (e) => {
33
+ }), h = (e) => {
34
34
  let t = Infinity, n = -Infinity;
35
35
  for (let r = 0; r < e.length; r++) {
36
36
  let i = e[r];
37
37
  Number.isFinite(i) && (i < t && (t = i), i > n && (n = i));
38
38
  }
39
39
  return [t, n];
40
- }, f = (e) => {
41
- let t = Infinity;
42
- for (let n of e) {
43
- let e = n.sorted ? n.x : Float64Array.from(n.x).sort();
44
- for (let r = 1; r < n.count; r++) {
45
- let n = e[r] - e[r - 1];
46
- n > 0 && n < t && (t = n);
40
+ }, g = (e, t) => {
41
+ let n = Infinity;
42
+ return e.forEach((e, r) => {
43
+ let i = t[r] ? e : Float64Array.from(e).sort();
44
+ for (let e = 1; e < i.length; e++) {
45
+ let t = i[e] - i[e - 1];
46
+ t > 0 && t < n && (n = t);
47
+ }
48
+ }), n;
49
+ }, _ = (e, t, n) => {
50
+ if (n) return 1;
51
+ let r = g(e.map((e) => t === "x" ? e.cols.x : e.cols.y), e.map((e) => t === "x" && e.cols.sorted));
52
+ return Number.isFinite(r) ? r : 1;
53
+ }, v = (e, t) => {
54
+ let n = /* @__PURE__ */ new Map();
55
+ if (t) for (let { s: t, stack: r } of e) {
56
+ let e = n.get(r);
57
+ e || n.set(r, e = /* @__PURE__ */ new Map());
58
+ let { x: i, y: a, count: o } = t.cols;
59
+ for (let t = 0; t < o; t++) {
60
+ let n = a[t];
61
+ if (!Number.isFinite(n)) continue;
62
+ let r = e.get(i[t]) ?? [0, 0];
63
+ n >= 0 ? r[0] += n : r[1] -= n, e.set(i[t], r);
47
64
  }
48
65
  }
49
- return t;
50
- }, p = (s, c, p, m, h = null) => {
51
- let g = h ?? c.resolve ?? ((e, t) => r(e, {}, t)), _ = s.series, v = _.map((e) => e.data), y = s.xAxis?.type ?? l(v), b = y === "category" ? [...s.xAxis?.categories ?? e(v)] : [], x = new Map(b.map((e, t) => [e, t])), S = n(y, (e) => x.get(e) ?? NaN), C = `${y}|${b.join("")}`, w = /* @__PURE__ */ new Set(), T = _.map((e, n) => {
52
- let r = e.id ?? `#${n}`;
53
- for (; w.has(r);) r += "'";
54
- w.add(r);
55
- let a = m.get(r);
56
- (!a || a.data !== e.data || a.resolverKey !== C) && (a = {
66
+ let r = /* @__PURE__ */ new Map(), i = /* @__PURE__ */ new Map();
67
+ for (let { stack: t } of e) i.set(t, (i.get(t) ?? 0) + 1);
68
+ return e.map(({ s: e, stack: a }) => {
69
+ let { x: o, y: s, count: c } = e.cols;
70
+ if (!t && i.get(a) === 1) {
71
+ let e = new Float64Array(c), t = new Float64Array(c);
72
+ for (let n = 0; n < c; n++) {
73
+ let r = s[n], i = Number.isFinite(r);
74
+ e[n] = i ? 0 : NaN, t[n] = i ? r : NaN;
75
+ }
76
+ return {
77
+ base: e,
78
+ top: t
79
+ };
80
+ }
81
+ let l = r.get(a);
82
+ l || r.set(a, l = /* @__PURE__ */ new Map());
83
+ let u = n.get(a), d = new Float64Array(c), f = new Float64Array(c);
84
+ for (let e = 0; e < c; e++) {
85
+ let t = s[e];
86
+ if (!Number.isFinite(t)) {
87
+ d[e] = NaN, f[e] = NaN;
88
+ continue;
89
+ }
90
+ if (u) {
91
+ let n = u.get(o[e]), r = n ? t >= 0 ? n[0] : n[1] : 0;
92
+ t = r > 0 ? t / r * 100 : 0;
93
+ }
94
+ let n = l.get(o[e]) ?? [0, 0], r = t >= 0 ? n[0] : n[1];
95
+ d[e] = r, f[e] = r + t, t >= 0 ? n[0] += t : n[1] += t, l.set(o[e], n);
96
+ }
97
+ return {
98
+ base: d,
99
+ top: f
100
+ };
101
+ });
102
+ }, y = "var(--success-color, #16a34a)", b = "var(--danger-color, #dc2626)", x = (d, f, g, x, S = null) => {
103
+ let C = S ?? f.resolve ?? ((e, t) => s(e, {}, t)), w = d.series, T = w.map((e) => e.data), E = d.xAxis?.type ?? p(T), D = E === "category" ? [...d.xAxis?.categories ?? e(T)] : [], O = new Map(D.map((e, t) => [e, t])), k = r(E, (e) => O.get(e) ?? NaN), A = d.yAxis, j = w.filter((e) => e.type === "heatmap").map((e) => e.data), M = A?.type === "category" || !A?.type && j.length ? [...A?.categories ?? t(j)] : [], N = A?.type === "category" || M.length ? "category" : A?.type === "time" ? "time" : "linear", P = new Map(M.map((e, t) => [e, t])), F = (e) => typeof e == "number" ? e : typeof e == "string" ? N === "category" ? P.get(e) ?? NaN : Number(e) : NaN, I = `${E}|${D.join("")}|${N}|${M.join("")}`, L = d.stackMode === "percent", R = /* @__PURE__ */ new Set(), z = w.map((e, t) => {
104
+ let r = e.id ?? `#${t}`;
105
+ for (; R.has(r);) r += "'";
106
+ R.add(r);
107
+ let s = x.get(r);
108
+ (!s || s.data !== e.data || s.resolverKey !== I) && (s = {
57
109
  data: e.data,
58
- resolverKey: C,
59
- cols: t(e.data, S)
60
- }, m.set(r, a));
61
- let o = e.type ?? "line", s = e.color ? g(e.color, c.palette[n % c.palette.length]) : c.palette[n % c.palette.length], l = a.cols, u = null;
62
- if (o === "scatter" && l.colors) {
110
+ resolverKey: I,
111
+ cols: n(e.data, k, F)
112
+ }, x.set(r, s));
113
+ let l = e.type ?? "line", u = f.palette[t % f.palette.length], d = e.color ? C(e.color, u) : u, p = s.cols, m = null;
114
+ if ((l === "scatter" || l === "bar") && p.colors) {
63
115
  let e = /* @__PURE__ */ new Map();
64
- u = l.colors.map((t) => {
116
+ m = p.colors.map((t) => {
65
117
  if (t === void 0) return;
66
118
  let n = e.get(t);
67
- return n || e.set(t, n = g(t, s)), n;
119
+ return n || e.set(t, n = C(t, d)), n;
68
120
  });
69
121
  }
70
- let d = e.id ?? String(n);
122
+ let h = [], _ = [0, 1], v = null;
123
+ if (l === "heatmap") {
124
+ h = e.colorScale && e.colorScale.length ? e.colorScale.map((e) => C(e, d)) : [i(f.background, d, .08), d], _ = e.valueRange ? [e.valueRange[0], e.valueRange[1]] : [p.valueMin, p.valueMax], Number.isFinite(_[0]) || (_ = [0, 1]);
125
+ let t = p.value ?? p.y, [n, r] = _, s = r - n || 1;
126
+ v = new Uint32Array(p.count);
127
+ for (let e = 0; e < p.count; e++) {
128
+ let r = t[e];
129
+ Number.isFinite(r) && Number.isFinite(p.y[e]) && (v[e] = a(o(h, (r - n) / s)));
130
+ }
131
+ }
132
+ let S = e.id ?? String(t);
71
133
  return {
72
- index: n,
134
+ index: t,
73
135
  key: r,
74
- id: d,
75
- name: e.name ?? `Series ${n + 1}`,
76
- type: o,
77
- color: s,
78
- colorCss: i(s),
79
- lineWidth: e.lineWidth ?? 2,
136
+ id: S,
137
+ name: e.name ?? `Series ${t + 1}`,
138
+ type: l,
139
+ color: d,
140
+ colorCss: c(d),
141
+ lineWidth: e.lineWidth ?? (l === "candlestick" ? 1 : 2),
80
142
  pointSize: e.pointSize ?? 8,
81
- opacity: e.opacity ?? (o === "area" ? .28 : o === "scatter" ? .78 : 1),
82
- hidden: !!e.hidden || p.has(d),
143
+ opacity: e.opacity ?? (l === "area" ? .28 : l === "scatter" ? .78 : 1),
144
+ hidden: !!e.hidden || g.has(S),
83
145
  showLabels: !!e.showLabels,
84
- cols: l,
146
+ curve: e.curve ?? "linear",
147
+ cols: p,
85
148
  barOffset: 0,
86
149
  barHalfWidth: 0,
87
150
  barBase: null,
88
151
  barTop: null,
89
- pointColors: u
152
+ stackBase: null,
153
+ stackTop: null,
154
+ pointColors: m,
155
+ upColor: l === "candlestick" ? C(e.upColor ?? y, [
156
+ .09,
157
+ .64,
158
+ .29,
159
+ 1
160
+ ]) : d,
161
+ downColor: l === "candlestick" ? C(e.downColor ?? b, [
162
+ .86,
163
+ .15,
164
+ .15,
165
+ 1
166
+ ]) : d,
167
+ cellColors: v,
168
+ cellHalf: {
169
+ x: .5,
170
+ y: .5
171
+ },
172
+ colorScale: h,
173
+ valueRange: _,
174
+ radius: e.radius ?? (l === "heatmap" ? 2 : 3),
175
+ format: e.format
176
+ };
177
+ }), B = z.filter((e) => !e.hidden), V = z.length > 0 && z.every((e) => e.type === "scatter" || e.type === "heatmap"), H = B.filter((e) => e.type === "bar"), U = _(H, "x", E === "category");
178
+ if (H.length) {
179
+ let e = /* @__PURE__ */ new Map(), t = (e) => w[e.index].stack ?? `\u0000${e.key}`;
180
+ for (let n of H) e.has(t(n)) || e.set(t(n), e.size);
181
+ let n = U * (e.size > 1 ? .78 : .62), r = n / e.size, i = v(H.map((e) => ({
182
+ s: e,
183
+ stack: t(e)
184
+ })), !1), a = L ? v(H.filter((e) => w[e.index].stack !== void 0).map((e) => ({
185
+ s: e,
186
+ stack: t(e)
187
+ })), !0) : [], o = 0;
188
+ H.forEach((s, c) => {
189
+ let l = e.get(t(s)) ?? 0;
190
+ s.barOffset = -n / 2 + r * (l + .5), s.barHalfWidth = r / 2 * (e.size > 1 ? .86 : 1);
191
+ let u = L && w[s.index].stack !== void 0 ? a[o++] : i[c];
192
+ s.barBase = u.base, s.barTop = u.top;
193
+ });
194
+ }
195
+ let W = B.filter((e) => (e.type === "line" || e.type === "area") && w[e.index].stack !== void 0);
196
+ if (W.length) {
197
+ let e = v(W.map((e) => ({
198
+ s: e,
199
+ stack: w[e.index].stack ?? ""
200
+ })), L);
201
+ W.forEach((t, n) => {
202
+ t.stackBase = e[n].base, t.stackTop = e[n].top;
203
+ });
204
+ }
205
+ let G = B.filter((e) => e.type === "candlestick"), K = _(G, "x", E === "category");
206
+ for (let e of G) e.barHalfWidth = K * .3;
207
+ let q = B.filter((e) => e.type === "heatmap");
208
+ if (q.length) {
209
+ let e = _(q, "x", E === "category") / 2, t = _(q, "y", N === "category") / 2;
210
+ for (let n of q) n.cellHalf = {
211
+ x: e,
212
+ y: t
90
213
  };
91
- }), E = T.filter((e) => !e.hidden), D = T.length > 0 && T.every((e) => e.type === "scatter"), O = E.filter((e) => e.type === "bar"), k = y === "category" ? 1 : (() => {
92
- let e = f(O.map((e) => e.cols));
93
- return Number.isFinite(e) ? e : 1;
94
- })();
95
- if (O.length) {
96
- let e = /* @__PURE__ */ new Map();
97
- for (let t of O) {
98
- let n = _[t.index].stack ?? `\u0000${t.key}`;
99
- e.has(n) || e.set(n, e.size);
214
+ }
215
+ let J = d.xAxis, Y;
216
+ if (E === "category") Y = [-.5, Math.max(1, D.length) - .5];
217
+ else {
218
+ let e = [];
219
+ for (let t of B) {
220
+ e.push(t.cols.xMin, t.cols.xMax);
221
+ let n = t.type === "bar" ? U / 2 : t.type === "candlestick" ? K / 2 : t.type === "heatmap" ? t.cellHalf.x : 0;
222
+ n && e.push(t.cols.xMin - n, t.cols.xMax + n);
100
223
  }
101
- let t = k * (e.size > 1 ? .78 : .62), n = t / e.size, r = /* @__PURE__ */ new Map();
102
- for (let i of O) {
103
- let a = _[i.index].stack ?? `\u0000${i.key}`, o = e.get(a) ?? 0;
104
- i.barOffset = -t / 2 + n * (o + .5), i.barHalfWidth = n / 2 * (e.size > 1 ? .86 : 1);
105
- let s = r.get(a);
106
- s || r.set(a, s = /* @__PURE__ */ new Map());
107
- let { x: c, y: l, count: u } = i.cols;
108
- i.barBase = new Float64Array(u), i.barTop = new Float64Array(u);
109
- for (let e = 0; e < u; e++) {
110
- let t = l[e];
111
- if (!Number.isFinite(t)) {
112
- i.barBase[e] = NaN, i.barTop[e] = NaN;
113
- continue;
114
- }
115
- let n = s.get(c[e]) ?? [0, 0], r = t >= 0 ? n[0] : n[1];
116
- i.barBase[e] = r, i.barTop[e] = r + t, t >= 0 ? n[0] += t : n[1] += t, s.set(c[e], n);
117
- }
224
+ Y = l(...h(e), E === "time" ? [Date.now() - 864e5, Date.now()] : [0, 1]);
225
+ let t = z.every((e) => e.type === "scatter");
226
+ if (t) {
227
+ let e = (Y[1] - Y[0]) * .04;
228
+ Y = [Y[0] - e, Y[1] + e];
118
229
  }
230
+ (J?.nice ?? (t && E === "linear")) && E === "linear" && (Y = u(Y[0], Y[1], J?.tickCount ?? 6));
119
231
  }
120
- let A = s.xAxis, j;
121
- if (y === "category") j = [-.5, Math.max(1, b.length) - .5];
232
+ J?.min !== void 0 && (Y[0] = J.min), J?.max !== void 0 && (Y[1] = J.max), Y = l(Y[0], Y[1]);
233
+ let X;
234
+ if (N === "category") X = [-.5, Math.max(1, M.length) - .5];
122
235
  else {
123
236
  let e = [];
124
- for (let t of E) e.push(t.cols.xMin, t.cols.xMax), t.type === "bar" && e.push(t.cols.xMin - k / 2, t.cols.xMax + k / 2);
125
- if (j = a(...d(e), y === "time" ? [Date.now() - 864e5, Date.now()] : [0, 1]), D) {
126
- let e = (j[1] - j[0]) * .04;
127
- j = [j[0] - e, j[1] + e];
237
+ for (let t of B) t.type === "bar" && t.barBase && t.barTop ? e.push(...h(t.barBase), ...h(t.barTop)) : t.stackBase && t.stackTop ? e.push(...h(t.stackBase), ...h(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);
238
+ let t = H.length > 0 || B.some((e) => e.type === "area");
239
+ if ((H.length || A?.zero) && e.push(0), H.some((e) => e.showLabels)) {
240
+ let [t, n] = h(e);
241
+ n > 0 && e.push(n + (n - Math.min(0, t)) * .1), t < 0 && e.push(t - (Math.max(0, n) - t) * .1);
128
242
  }
129
- (A?.nice ?? (D && y === "linear")) && y === "linear" && (j = o(j[0], j[1], A?.tickCount ?? 6));
130
- }
131
- A?.min !== void 0 && (j[0] = A.min), A?.max !== void 0 && (j[1] = A.max), j = a(j[0], j[1]);
132
- let M = s.yAxis, N = [];
133
- for (let e of E) e.type === "bar" && e.barBase && e.barTop ? N.push(...d(e.barBase), ...d(e.barTop)) : N.push(e.cols.yMin, e.cols.yMax);
134
- (O.length || M?.zero) && N.push(0);
135
- let P = a(...d(N));
136
- if (D) {
137
- let e = (P[1] - P[0]) * .06;
138
- P = [P[0] - e, P[1] + e];
243
+ if (X = l(...h(e)), z.every((e) => e.type === "scatter")) {
244
+ let e = (X[1] - X[0]) * .06;
245
+ X = [X[0] - e, X[1] + e];
246
+ } else if (G.length && !H.length) {
247
+ let e = (X[1] - X[0]) * .04;
248
+ X = [X[0] - e, X[1] + e];
249
+ }
250
+ (A?.nice ?? !q.length) && N === "linear" && (X = u(X[0], X[1], A?.tickCount ?? 5)), L && (H.length || W.length) && (X = [h(e)[0] < 0 ? -100 : 0, 100]), t && !A?.zero && X[0] < 0 && h(e)[0] >= 0 && (X[0] = 0);
139
251
  }
140
- (M?.nice ?? !0) && (M?.type ?? "linear") === "linear" && (P = o(P[0], P[1], M?.tickCount ?? 5)), O.length && !M?.zero && P[0] < 0 && d(N)[0] >= 0 && (P[0] = 0), M?.min !== void 0 && (P[0] = M.min), M?.max !== void 0 && (P[1] = M.max), P = a(P[0], P[1]);
141
- let F = s.interaction === !1 ? !1 : s.interaction === !0 || s.interaction === void 0 ? !0 : s.interaction.zoom ?? !0, I = F === !1 ? {
252
+ A?.min !== void 0 && (X[0] = A.min), A?.max !== void 0 && (X[1] = A.max), X = l(X[0], X[1]);
253
+ let Z = d.interaction === !1 ? !1 : d.interaction === !0 || d.interaction === void 0 ? !0 : d.interaction.zoom ?? !0, Q = Z === !1 ? {
142
254
  x: !1,
143
255
  y: !1
144
- } : F === !0 ? {
256
+ } : Z === !0 ? {
145
257
  x: !0,
146
- y: D
258
+ y: V
147
259
  } : {
148
- x: F.includes("x"),
149
- y: F.includes("y")
150
- }, L = typeof s.tooltip == "object" ? s.tooltip : void 0;
260
+ x: Z.includes("x"),
261
+ y: Z.includes("y")
262
+ }, $ = typeof d.tooltip == "object" ? d.tooltip : void 0, ee = A?.format ?? (L && (H.length || W.length) ? (e) => `${+e.toFixed(1)}%` : void 0);
151
263
  return {
152
- series: T,
153
- x: u(A, y, b, !1),
154
- y: u(M, M?.type === "time" ? "time" : "linear", [], !0),
264
+ series: z,
265
+ x: m(J, E, D, !1),
266
+ y: {
267
+ ...m(A, N, M, N !== "category"),
268
+ format: ee
269
+ },
155
270
  base: {
156
- x: j,
157
- y: P
271
+ x: Y,
272
+ y: X
158
273
  },
159
- allScatter: D,
160
- zoom: I,
161
- tooltipMode: L?.mode ?? (D ? "nearest" : "axis"),
162
- baseline: Math.min(Math.max(0, P[0]), P[1]),
274
+ allScatter: V,
275
+ zoom: Q,
276
+ tooltipMode: $?.mode ?? (V ? "nearest" : "axis"),
277
+ baseline: Math.min(Math.max(0, X[0]), X[1]),
163
278
  minSpan: {
164
- x: y === "category" ? 1 : (j[1] - j[0]) * 1e-7,
165
- y: (P[1] - P[0]) * 1e-7
166
- }
279
+ x: E === "category" ? 1 : (Y[1] - Y[0]) * 1e-7,
280
+ y: N === "category" ? 1 : (X[1] - X[0]) * 1e-7
281
+ },
282
+ percent: L,
283
+ stacks: w.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)
167
284
  };
168
- }, m = /* @__PURE__ */ new WeakMap(), h = (e) => {
169
- let t = m.get(e.cols);
170
- return t || (t = new s(e.cols.x, e.cols.y, e.cols.count), m.set(e.cols, t)), t;
285
+ }, S = (e, t) => e.barTop ? e.barTop[t] : e.stackTop ? e.stackTop[t] : e.cols.y[t], C = /* @__PURE__ */ new WeakMap(), w = (e) => {
286
+ let t = C.get(e.cols);
287
+ return t || (t = new d(e.cols.x, e.cols.y, e.cols.count), C.set(e.cols, t)), t;
171
288
  };
172
289
  //#endregion
173
- export { p as buildModel, l as detectXType, h as gridOf };
290
+ export { x as buildModel, p as detectXType, w as gridOf, S as plottedY };
174
291
 
175
292
  //# sourceMappingURL=model.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"model.js","names":["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","resolveStaticColor","value","fallback","input","s","xType","categories","collectCategories","categoryMap","resolveX","xResolver","name","resolverKey","usedKeys","series","key","index","entry","cache","normalizeData","type","color","pointColors","resolved","rgba","id","toCss","hidden","visible","allScatter","bars","band","slots","stack","group","slotWidth","sums","slot","totals","count","y","t","base","xOpts","xRange","ensureSpan","pad","niceDomain","yOpts","yValues","yRange","zoomOption","zoomAxes","tooltip","grids","gridOf","grid","GridIndex"],"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.js","names":["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","resolveStaticColor","value","fallback","input","xType","categories","collectCategories","categoryMap","c","resolveX","xResolver","name","yOpts","heatmapData","yCategories","collectYCategories","yType","yCategoryMap","resolveY","resolverKey","usedKeys","series","key","index","entry","cache","normalizeData","type","paletteColor","color","cols","pointColors","resolved","rgba","colorScale","valueRange","cellColors","mix","lo","hi","span","packColor","rampColor","id","toCss","hidden","visible","allScatter","bars","band","slots","stackId","group","slotWidth","stacked","percentStacked","p","slot","stackedLines","candles","candleBand","heatmaps","cx","cy","xOpts","xRange","pad","ensureSpan","pointsOnly","niceDomain","yRange","yValues","filled","zoomOption","zoomAxes","tooltip","yFormat","plottedY","grids","gridOf","grid","GridIndex"],"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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"}
@@ -1,2 +1,2 @@
1
- const e=require("./color.cjs");var t=(e,t=e.fontSize,n=400)=>`${n} ${t}px ${e.fontFamily}`,n=e=>Math.round(e)+.5,r=(e,t,n,r)=>{let{plot:i}=t,a=e.x===void 0?i.x+i.width/2:t.xToPx(e.x),o=e.y===void 0?i.y+i.height/2:t.yToPx(e.y),s=a-n/2,c=o-r/2;return e.anchor===`top`?c=o+6:e.anchor===`bottom`?c=o-6-r:e.anchor===`left`?s=a+6:e.anchor===`right`&&(s=a-6-n),s=Math.max(i.x+6,Math.min(s,i.x+i.width-6-n)),c=Math.max(i.y+2,Math.min(c,i.y+i.height-2-r)),{x:s,y:c,width:n,height:r}},i=(e,t)=>{let{plot:n}=t,r=e.x0===void 0?-1/0:t.xToPx(e.x0),i=e.x1===void 0?1/0:t.xToPx(e.x1),a=e.y0===void 0?1/0:t.yToPx(e.y0),o=e.y1===void 0?-1/0:t.yToPx(e.y1),s=Math.max(n.x,Math.min(r,i)),c=Math.min(n.x+n.width,Math.max(r,i)),l=Math.max(n.y,Math.min(a,o)),u=Math.min(n.y+n.height,Math.max(a,o));return{x:s,y:l,width:c-s,height:u-l}},a=(r,a)=>{let{scales:o,theme:s,x:c,y:l,xTicks:u,yTicks:d}=a,{plot:f}=o;r.clearRect(0,0,a.width,a.height),r.save(),r.beginPath(),r.rect(f.x,f.y,f.width,f.height),r.clip();for(let t of a.annotations){if(t.type!==`rect`)continue;let n=i(t,o);n.width<=0||n.height<=0||(r.fillStyle=e.toCss(t.color,t.opacity),r.fillRect(n.x,n.y,n.width,n.height))}if(r.restore(),r.lineWidth=1,r.strokeStyle=e.toCss(s.grid),r.beginPath(),l.grid)for(let e of d.values){let t=n(o.yToPx(e));t<f.y-1||t>f.y+f.height+1||(r.moveTo(f.x,t),r.lineTo(f.x+f.width,t))}if(c.grid)for(let e of u.values){let t=n(o.xToPx(e));t<f.x-1||t>f.x+f.width+1||(r.moveTo(t,f.y),r.lineTo(t,f.y+f.height))}r.stroke();let p=Math.ceil(s.fontSize*1.4);if(r.font=t(s),r.fillStyle=e.toCss(s.textMuted),c.visible){r.strokeStyle=e.toCss(s.axis),r.beginPath();let i=n(f.y+f.height);r.moveTo(f.x,i),r.lineTo(f.x+f.width,i),r.stroke(),r.textBaseline=`top`,r.textAlign=`center`;let l=-1/0,d=u.values.map((e,t)=>({px:o.xToPx(e),text:u.labels[t]})).sort((e,t)=>e.px-t.px);for(let{px:e,text:t}of d){if(e<f.x-.5||e>f.x+f.width+.5)continue;let n=r.measureText(t).width,i=Math.max(0,Math.min(a.width-n,e-n/2));i<l+6||(l=i+n,r.fillText(t,i+n/2,f.y+f.height+7))}c.title&&(r.font=t(s,s.fontSize+1,500),r.fillStyle=e.toCss(s.text,.8),r.fillText(c.title,f.x+f.width/2,f.y+f.height+p+10))}l.visible&&(r.font=t(s),r.fillStyle=e.toCss(s.textMuted),r.textAlign=`right`,r.textBaseline=`middle`,d.values.forEach((e,t)=>{let n=o.yToPx(e);n<f.y-.5||n>f.y+f.height+.5||r.fillText(d.labels[t],f.x-8,n)}),l.title&&(r.save(),r.font=t(s,s.fontSize+1,500),r.fillStyle=e.toCss(s.text,.8),r.translate(p/2+4,f.y+f.height/2),r.rotate(-Math.PI/2),r.textAlign=`center`,r.fillText(l.title,0,0),r.restore()))},o=(e,t)=>e.x<t.x+t.width&&t.x<e.x+e.width&&e.y<t.y+t.height&&t.y<e.y+e.height,s=(e,t)=>e.x>=t.x&&e.y>=t.y&&e.x+e.width<=t.x+t.width&&e.y+e.height<=t.y+t.height,c=(e,t,n,r,i,a)=>{e.lineWidth=3,e.lineJoin=`round`,e.strokeStyle=a,e.strokeText(t,n,r),e.fillStyle=i,e.fillText(t,n,r)},l=(e,t,n,r,i=[])=>{let a=[];for(let c of e){let e=n(c.text),l=c.r+4,u=[{x:c.x+l,y:c.y-r/2,width:e,height:r},{x:c.x-l-e,y:c.y-r/2,width:e,height:r},{x:c.x-e/2,y:c.y-l-r,width:e,height:r},{x:c.x-e/2,y:c.y+l,width:e,height:r}].find(e=>s(e,t)&&!i.some(t=>o(t,e)));u&&(i.push(u),a.push({label:c,box:u}))}return a},u=(a,o)=>{let{scales:s,theme:u}=o,{plot:d}=s;o.clear!==!1&&a.clearRect(0,0,o.width,o.height),a.save(),a.beginPath(),a.rect(d.x,d.y,d.width,d.height),a.clip();let f=e.toCss(u.background,.9),p=[],m=u.fontSize+4;for(let r of o.annotations){if(r.type!==`line`)continue;let i=e.toCss(r.color);if(a.strokeStyle=i,a.lineWidth=r.width,a.setLineDash(r.dash),a.beginPath(),r.axis===`y`){let e=n(s.yToPx(r.value));a.moveTo(d.x,e),a.lineTo(d.x+d.width,e),a.stroke(),r.label&&(a.setLineDash([]),a.font=t(u,u.fontSize,500),a.textAlign=`right`,a.textBaseline=`bottom`,c(a,r.label,d.x+d.width-6,e-3,i,f))}else{let e=n(s.xToPx(r.value));a.moveTo(e,d.y),a.lineTo(e,d.y+d.height),a.stroke(),r.label&&(a.setLineDash([]),a.font=t(u,u.fontSize,500),a.textAlign=`left`,a.textBaseline=`top`,c(a,r.label,e+5,d.y+5,i,f))}}a.setLineDash([]),a.font=t(u,u.fontSize+1,600);for(let t of o.annotations){if(t.type!==`rect`||!t.label)continue;let n=i(t,s);if(n.width<=0||n.height<=0)continue;let r=a.measureText(t.label).width,o=t.labelPosition,c=o.endsWith(`left`)?n.x+10:o.endsWith(`right`)?n.x+n.width-10-r:n.x+(n.width-r)/2,l=o.startsWith(`top`)?n.y+10:o.startsWith(`bottom`)?n.y+n.height-10-m:n.y+(n.height-m)/2;a.textAlign=`left`,a.textBaseline=`top`,a.fillStyle=e.toCss(t.labelColor),a.fillText(t.label,c,l),p.push({x:c,y:l,width:r,height:m})}for(let n of o.annotations){if(n.type!==`text`||!n.text)continue;a.font=t(u,u.fontSize,n.weight);let i=r(n,s,a.measureText(n.text).width,m);a.textAlign=`left`,a.textBaseline=`middle`,c(a,n.text,i.x,i.y+i.height/2,e.toCss(n.color),f),p.push(i)}if(o.pointLabels.length){a.font=t(u),a.textAlign=`left`,a.textBaseline=`middle`;let n=e.toCss(u.text,.85),r=l(o.pointLabels,d,e=>a.measureText(e).width,m-2,p);for(let{label:e,box:t}of r)c(a,e.text,t.x,t.y+t.height/2,n,f)}a.restore()};exports.drawBackground=a,exports.drawForeground=u,exports.font=t,exports.placeLabels=l,exports.textBox=r;
1
+ const e=require("./color.cjs");var t=(e,t=e.fontSize,n=400)=>`${n} ${t}px ${e.fontFamily}`,n=e=>Math.round(e)+.5,r=(e,t,n,r)=>{let{plot:i}=t,a=e.x===void 0?i.x+i.width/2:t.xToPx(e.x),o=e.y===void 0?i.y+i.height/2:t.yToPx(e.y),s=a-n/2,c=o-r/2;return e.anchor===`top`?c=o+6:e.anchor===`bottom`?c=o-6-r:e.anchor===`left`?s=a+6:e.anchor===`right`&&(s=a-6-n),s=Math.max(i.x+6,Math.min(s,i.x+i.width-6-n)),c=Math.max(i.y+2,Math.min(c,i.y+i.height-2-r)),{x:s,y:c,width:n,height:r}},i=(e,t)=>{let{plot:n}=t,r=e.x0===void 0?-1/0:t.xToPx(e.x0),i=e.x1===void 0?1/0:t.xToPx(e.x1),a=e.y0===void 0?1/0:t.yToPx(e.y0),o=e.y1===void 0?-1/0:t.yToPx(e.y1),s=Math.max(n.x,Math.min(r,i)),c=Math.min(n.x+n.width,Math.max(r,i)),l=Math.max(n.y,Math.min(a,o)),u=Math.min(n.y+n.height,Math.max(a,o));return{x:s,y:l,width:c-s,height:u-l}},a=(r,a)=>{let{scales:o,theme:s,x:c,y:l,xTicks:u,yTicks:d}=a,{plot:f}=o;r.clearRect(0,0,a.width,a.height),r.save(),r.beginPath(),r.rect(f.x,f.y,f.width,f.height),r.clip();for(let t of a.annotations){if(t.type!==`rect`)continue;let n=i(t,o);n.width<=0||n.height<=0||(r.fillStyle=e.toCss(t.color,t.opacity),r.fillRect(n.x,n.y,n.width,n.height))}if(r.restore(),r.lineWidth=1,r.strokeStyle=e.toCss(s.grid),r.beginPath(),l.grid)for(let e of d.values){let t=n(o.yToPx(e));t<f.y-1||t>f.y+f.height+1||(r.moveTo(f.x,t),r.lineTo(f.x+f.width,t))}if(c.grid)for(let e of u.values){let t=n(o.xToPx(e));t<f.x-1||t>f.x+f.width+1||(r.moveTo(t,f.y),r.lineTo(t,f.y+f.height))}r.stroke();let p=Math.ceil(s.fontSize*1.4);if(r.font=t(s),r.fillStyle=e.toCss(s.textMuted),c.visible){r.strokeStyle=e.toCss(s.axis),r.beginPath();let i=n(f.y+f.height);r.moveTo(f.x,i),r.lineTo(f.x+f.width,i),r.stroke(),r.textBaseline=`top`,r.textAlign=`center`;let l=-1/0,d=u.values.map((e,t)=>({px:o.xToPx(e),text:u.labels[t]})).sort((e,t)=>e.px-t.px);for(let{px:e,text:t}of d){if(e<f.x-.5||e>f.x+f.width+.5)continue;let n=r.measureText(t).width,i=Math.max(0,Math.min(a.width-n,e-n/2));i<l+6||(l=i+n,r.fillText(t,i+n/2,f.y+f.height+7))}c.title&&(r.font=t(s,s.fontSize+1,500),r.fillStyle=e.toCss(s.text,.8),r.fillText(c.title,f.x+f.width/2,f.y+f.height+p+10))}l.visible&&(r.font=t(s),r.fillStyle=e.toCss(s.textMuted),r.textAlign=`right`,r.textBaseline=`middle`,d.values.forEach((e,t)=>{let n=o.yToPx(e);n<f.y-.5||n>f.y+f.height+.5||r.fillText(d.labels[t],f.x-8,n)}),l.title&&(r.save(),r.font=t(s,s.fontSize+1,500),r.fillStyle=e.toCss(s.text,.8),r.translate(p/2+4,f.y+f.height/2),r.rotate(-Math.PI/2),r.textAlign=`center`,r.fillText(l.title,0,0),r.restore()))},o=(e,t)=>e.x<t.x+t.width&&t.x<e.x+e.width&&e.y<t.y+t.height&&t.y<e.y+e.height,s=(e,t)=>e.x>=t.x&&e.y>=t.y&&e.x+e.width<=t.x+t.width&&e.y+e.height<=t.y+t.height,c=(e,t,n,r,i,a)=>{e.lineWidth=3,e.lineJoin=`round`,e.strokeStyle=a,e.strokeText(t,n,r),e.fillStyle=i,e.fillText(t,n,r)},l=(e,t,n,r,i=[])=>{let a=[];for(let c of e){let e=n(c.text),l=c.r+4,u={x:c.x-e/2,y:c.y-l-r,width:e,height:r},d={x:c.x-e/2,y:c.y+l,width:e,height:r},f=(c.placement===`above`?[u]:c.placement===`below`?[d]:[{x:c.x+l,y:c.y-r/2,width:e,height:r},{x:c.x-l-e,y:c.y-r/2,width:e,height:r},u,d]).find(e=>s(e,t)&&!i.some(t=>o(t,e)));f&&(i.push(f),a.push({label:c,box:f}))}return a},u=(a,o)=>{let{scales:s,theme:u}=o,{plot:d}=s;o.clear!==!1&&a.clearRect(0,0,o.width,o.height),a.save(),a.beginPath(),a.rect(d.x,d.y,d.width,d.height),a.clip();let f=e.toCss(u.background,.9),p=[],m=u.fontSize+4;for(let r of o.annotations){if(r.type!==`line`)continue;let i=e.toCss(r.color);if(a.strokeStyle=i,a.lineWidth=r.width,a.setLineDash(r.dash),a.beginPath(),r.axis===`y`){let e=n(s.yToPx(r.value));a.moveTo(d.x,e),a.lineTo(d.x+d.width,e),a.stroke(),r.label&&(a.setLineDash([]),a.font=t(u,u.fontSize,500),a.textAlign=`right`,a.textBaseline=`bottom`,c(a,r.label,d.x+d.width-6,e-3,i,f))}else{let e=n(s.xToPx(r.value));a.moveTo(e,d.y),a.lineTo(e,d.y+d.height),a.stroke(),r.label&&(a.setLineDash([]),a.font=t(u,u.fontSize,500),a.textAlign=`left`,a.textBaseline=`top`,c(a,r.label,e+5,d.y+5,i,f))}}a.setLineDash([]),a.font=t(u,u.fontSize+1,600);for(let t of o.annotations){if(t.type!==`rect`||!t.label)continue;let n=i(t,s);if(n.width<=0||n.height<=0)continue;let r=a.measureText(t.label).width,o=t.labelPosition,c=o.endsWith(`left`)?n.x+10:o.endsWith(`right`)?n.x+n.width-10-r:n.x+(n.width-r)/2,l=o.startsWith(`top`)?n.y+10:o.startsWith(`bottom`)?n.y+n.height-10-m:n.y+(n.height-m)/2;a.textAlign=`left`,a.textBaseline=`top`,a.fillStyle=e.toCss(t.labelColor),a.fillText(t.label,c,l),p.push({x:c,y:l,width:r,height:m})}for(let n of o.annotations){if(n.type!==`text`||!n.text)continue;a.font=t(u,u.fontSize,n.weight);let i=r(n,s,a.measureText(n.text).width,m);a.textAlign=`left`,a.textBaseline=`middle`,c(a,n.text,i.x,i.y+i.height/2,e.toCss(n.color),f),p.push(i)}if(o.pointLabels.length){a.font=t(u),a.textAlign=`left`,a.textBaseline=`middle`;let n=e.toCss(u.text,.85),r=l(o.pointLabels,d,e=>a.measureText(e).width,m-2,p);for(let{label:e,box:t}of r)c(a,e.text,t.x,t.y+t.height/2,n,f)}a.restore()};exports.drawBackground=a,exports.drawForeground=u,exports.font=t,exports.placeLabels=l,exports.textBox=r;
2
2
  //# sourceMappingURL=overlay.cjs.map