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
@@ -10,6 +10,24 @@ var e = (e) => typeof e == "object" && !!e && !("length" in e) && "y" in e, t =
10
10
  }
11
11
  return r;
12
12
  }, n = (e) => typeof e == "number" ? e : e == null ? NaN : Number(e), r = (t) => {
13
+ let n = /* @__PURE__ */ new Set();
14
+ for (let r of t) {
15
+ if (e(r)) {
16
+ let e = r.y;
17
+ if (!ArrayBuffer.isView(e)) for (let t = 0; t < e.length; t++) {
18
+ let r = e[t];
19
+ typeof r == "string" && n.add(r);
20
+ }
21
+ continue;
22
+ }
23
+ let t = r;
24
+ for (let e = 0; e < t.length; e++) {
25
+ let r = t[e], i = Array.isArray(r) ? r[1] : r && typeof r == "object" ? r.y : void 0;
26
+ typeof i == "string" && n.add(i);
27
+ }
28
+ }
29
+ return [...n];
30
+ }, i = (t) => {
13
31
  let n = /* @__PURE__ */ new Set(), r = (e) => {
14
32
  typeof e == "string" && n.add(e);
15
33
  };
@@ -26,8 +44,8 @@ var e = (e) => typeof e == "object" && !!e && !("length" in e) && "y" in e, t =
26
44
  }
27
45
  }
28
46
  return [...n];
29
- }, i = (e, t, n, r) => {
30
- let i = Infinity, a = -Infinity, o = Infinity, s = -Infinity, c = !0, l = -Infinity;
47
+ }, a = (e, t, n, r) => {
48
+ let i = Infinity, a = -Infinity, o = Infinity, s = -Infinity, c = !0, l = -Infinity, { high: u, low: d, value: f } = r;
31
49
  for (let r = 0; r < n; r++) {
32
50
  let n = e[r];
33
51
  if (!Number.isFinite(n)) {
@@ -35,70 +53,112 @@ var e = (e) => typeof e == "object" && !!e && !("length" in e) && "y" in e, t =
35
53
  continue;
36
54
  }
37
55
  n < l && (c = !1), l = n;
38
- let u = t[r];
39
- Number.isFinite(u) && (n < i && (i = n), n > a && (a = n), u < o && (o = u), u > s && (s = u));
56
+ let f = t[r];
57
+ if (Number.isFinite(f)) {
58
+ if (n < i && (i = n), n > a && (a = n), f < o && (o = f), f > s && (s = f), u) {
59
+ let e = u[r];
60
+ e > s && (s = e), e < o && (o = e);
61
+ }
62
+ if (d) {
63
+ let e = d[r];
64
+ e < o && (o = e), e > s && (s = e);
65
+ }
66
+ }
67
+ }
68
+ let p = Infinity, m = -Infinity;
69
+ if (f) for (let e = 0; e < n; e++) {
70
+ let t = f[e];
71
+ Number.isFinite(t) && (t < p && (p = t), t > m && (m = t));
40
72
  }
41
- let u = i > a;
73
+ let h = i > a;
42
74
  return {
43
75
  x: e,
44
76
  y: t,
45
77
  count: n,
46
78
  sorted: c,
47
- xMin: u ? NaN : i,
48
- xMax: u ? NaN : a,
49
- yMin: u ? NaN : o,
50
- yMax: u ? NaN : s,
79
+ xMin: h ? NaN : i,
80
+ xMax: h ? NaN : a,
81
+ yMin: h ? NaN : o,
82
+ yMax: h ? NaN : s,
83
+ valueMin: p > m ? NaN : p,
84
+ valueMax: p > m ? NaN : m,
51
85
  ...r
52
86
  };
53
- }, a = (t, r) => {
54
- let a = {
87
+ }, o = (e, t) => {
88
+ if (!e) return null;
89
+ if (e instanceof Float64Array && e.length >= t) return e.length === t ? e : e.subarray(0, t);
90
+ let r = new Float64Array(t);
91
+ for (let i = 0; i < t; i++) r[i] = n(e[i]);
92
+ return r;
93
+ }, s = (t, r, i = n) => {
94
+ let s = {
55
95
  size: null,
56
96
  colors: null,
57
- labels: null
97
+ labels: null,
98
+ open: null,
99
+ high: null,
100
+ low: null,
101
+ value: null
58
102
  };
59
103
  if (e(t)) {
60
- let e = t.y.length, o = new Float64Array(e), s = new Float64Array(e), c = t.x;
61
- for (let i = 0; i < e; i++) s[i] = n(t.y[i]), o[i] = c ? r(c[i], i) : i;
62
- let l = null;
104
+ let e = t.y.length, c = new Float64Array(e), l = t.x;
105
+ if (!l) for (let t = 0; t < e; t++) c[t] = t;
106
+ else if (ArrayBuffer.isView(l) && l.length >= e) c.set(l.length === e ? l : l.subarray(0, e));
107
+ else for (let t = 0; t < e; t++) c[t] = r(l[t], t);
108
+ let u = t.y, d;
109
+ if (ArrayBuffer.isView(u)) d = new Float64Array(e), d.set(u);
110
+ else {
111
+ d = new Float64Array(e);
112
+ for (let t = 0; t < e; t++) d[t] = i(u[t]);
113
+ }
114
+ let f = null;
63
115
  if (t.size) {
64
- l = new Float32Array(e);
65
- for (let r = 0; r < e; r++) l[r] = n(t.size[r]);
116
+ f = new Float32Array(e);
117
+ for (let r = 0; r < e; r++) f[r] = n(t.size[r]);
66
118
  }
67
- return i(o, s, e, {
68
- ...a,
69
- size: l
119
+ return a(c, d, e, {
120
+ ...s,
121
+ size: f,
122
+ open: o(t.open, e),
123
+ high: o(t.high, e),
124
+ low: o(t.low, e),
125
+ value: o(t.value, e)
70
126
  });
71
127
  }
72
- let o = t, s = o.length, c = new Float64Array(s), l = new Float64Array(s), u = null, d = null, f = null;
73
- for (let e = 0; e < s; e++) {
74
- let t = o[e];
75
- if (t == null || typeof t == "number") c[e] = e, l[e] = n(t);
76
- else if (Array.isArray(t)) c[e] = r(t[0], e), l[e] = n(t[1]);
128
+ let c = t, l = c.length, u = new Float64Array(l), d = new Float64Array(l), f = null, p = null, m = null, h = null, g = null, _ = null, v = null, y = () => new Float64Array(l).fill(NaN);
129
+ for (let e = 0; e < l; e++) {
130
+ let t = c[e];
131
+ if (t == null || typeof t == "number") u[e] = e, d[e] = n(t);
132
+ else if (Array.isArray(t)) u[e] = r(t[0], e), d[e] = i(t[1]);
77
133
  else if (typeof t == "object") {
78
- let i = t;
79
- c[e] = i.x === void 0 ? e : r(i.x, e), l[e] = n(i.y), i.size !== void 0 && (u ?? (u = new Float32Array(s).fill(NaN)), u[e] = i.size), i.color !== void 0 && (d ?? (d = Array(s)), d[e] = i.color), i.label !== void 0 && (f ?? (f = Array(s)), f[e] = i.label);
80
- } else c[e] = e, l[e] = NaN;
134
+ let a = t;
135
+ u[e] = a.x === void 0 ? e : r(a.x, e), d[e] = i(a.y), a.size !== void 0 && (f ?? (f = new Float32Array(l).fill(NaN)), f[e] = a.size), a.color !== void 0 && (p ?? (p = Array(l)), p[e] = a.color), a.label !== void 0 && (m ?? (m = Array(l)), m[e] = a.label), a.open !== void 0 && ((h ?? (h = y()))[e] = n(a.open)), a.high !== void 0 && ((g ?? (g = y()))[e] = n(a.high)), a.low !== void 0 && ((_ ?? (_ = y()))[e] = n(a.low)), a.value !== void 0 && ((v ?? (v = y()))[e] = n(a.value));
136
+ } else u[e] = e, d[e] = NaN;
81
137
  }
82
- return i(c, l, s, {
83
- size: u,
84
- colors: d,
85
- labels: f
138
+ return a(u, d, l, {
139
+ size: f,
140
+ colors: p,
141
+ labels: m,
142
+ open: h,
143
+ high: g,
144
+ low: _,
145
+ value: v
86
146
  });
87
- }, o = (e, t, n) => {
147
+ }, c = (e, t, n) => {
88
148
  let r = 0, i = t;
89
149
  for (; r < i;) {
90
150
  let t = r + i >>> 1;
91
151
  e[t] < n ? r = t + 1 : i = t;
92
152
  }
93
153
  return r;
94
- }, s = (e, t, n, r) => {
154
+ }, l = (e, t, n, r) => {
95
155
  if (n === 0) return -1;
96
- let i = o(e, n, r), a = i - 1, s = i;
156
+ let i = c(e, n, r), a = i - 1, o = i;
97
157
  for (; a >= 0 && !Number.isFinite(t[a]);) a--;
98
- for (; s < n && !Number.isFinite(t[s]);) s++;
99
- return a < 0 ? s < n ? s : -1 : s >= n || r - e[a] <= e[s] - r ? a : s;
158
+ for (; o < n && !Number.isFinite(t[o]);) o++;
159
+ return a < 0 ? o < n ? o : -1 : o >= n || r - e[a] <= e[o] - r ? a : o;
100
160
  };
101
161
  //#endregion
102
- export { r as collectCategories, o as lowerBound, s as nearestIndex, a as normalizeData, t as xResolver };
162
+ export { i as collectCategories, r as collectYCategories, c as lowerBound, l as nearestIndex, s as normalizeData, t as xResolver };
103
163
 
104
164
  //# sourceMappingURL=data.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"data.js","names":["isColumns","data","xResolver","value","type","categoryIndex","n","index","toNumber","v","collectCategories","seen","add","datas","xs","i","list","item","finalize","xMin","xMax","yMin","yMax","sorted","prev","count","xi","x","yi","y","empty","extra","normalizeData","none","resolveX","size","colors","labels","d","lowerBound","lo","hi","mid","nearestIndex","left","right"],"sources":["../../../../../../charts/src/engine/data.ts"],"sourcesContent":["// Normalization of series data into columns (Float64Array).\n\nimport type { ChartAxisType, ChartSeriesData, ChartXValue } from \"./types\";\n\nexport interface SeriesColumns {\n x: Float64Array;\n /** NaN where the value is missing */\n y: Float64Array;\n size: Float32Array | null;\n colors: (string | undefined)[] | null;\n labels: (string | undefined)[] | null;\n count: number;\n /** x is non-decreasing (binary search, decimation) */\n sorted: boolean;\n /** Extent of the finite points (NaN when there is none) */\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n}\n\ntype XResolver = (value: ChartXValue, index: number) => number;\n\nconst isColumns = (\n data: ChartSeriesData,\n): data is {\n x?: ArrayLike<number> | readonly ChartXValue[];\n y: ArrayLike<number> | readonly (number | null)[];\n size?: ArrayLike<number>;\n} =>\n typeof data === \"object\" &&\n data !== null &&\n !(\"length\" in data) &&\n \"y\" in data;\n\n/** Converts an x value to a number for the axis type */\nexport const xResolver = (\n type: ChartAxisType,\n categoryIndex: (name: string) => number,\n): XResolver => {\n return (value, index) => {\n if (typeof value === \"number\") return value;\n if (value instanceof Date) return value.getTime();\n if (typeof value === \"string\") {\n if (type === \"category\") return categoryIndex(value);\n if (type === \"time\") return Date.parse(value);\n const n = Number(value);\n return Number.isNaN(n) ? index : n;\n }\n return index;\n };\n};\n\nconst toNumber = (v: unknown): number =>\n typeof v === \"number\" ? v : v === null || v === undefined ? NaN : Number(v);\n\n/** Category names used by string x values, in order of appearance */\nexport const collectCategories = (\n datas: readonly ChartSeriesData[],\n): string[] => {\n const seen = new Set<string>();\n const add = (v: unknown) => {\n if (typeof v === \"string\") seen.add(v);\n };\n for (const data of datas) {\n if (isColumns(data)) {\n const xs = data.x;\n if (xs && !ArrayBuffer.isView(xs)) {\n for (let i = 0; i < xs.length; i++) add(xs[i]);\n }\n continue;\n }\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < list.length; i++) {\n const item = list[i];\n if (Array.isArray(item)) add(item[0]);\n else if (item && typeof item === \"object\")\n add((item as { x?: unknown }).x);\n }\n }\n return [...seen];\n};\n\nconst finalize = (\n x: Float64Array,\n y: Float64Array,\n count: number,\n extra: Pick<SeriesColumns, \"size\" | \"colors\" | \"labels\">,\n): SeriesColumns => {\n let xMin = Infinity;\n let xMax = -Infinity;\n let yMin = Infinity;\n let yMax = -Infinity;\n let sorted = true;\n let prev = -Infinity;\n for (let i = 0; i < count; i++) {\n const xi = x[i];\n if (!Number.isFinite(xi)) {\n y[i] = NaN;\n continue;\n }\n if (xi < prev) sorted = false;\n prev = xi;\n const yi = y[i];\n if (!Number.isFinite(yi)) continue;\n if (xi < xMin) xMin = xi;\n if (xi > xMax) xMax = xi;\n if (yi < yMin) yMin = yi;\n if (yi > yMax) yMax = yi;\n }\n const empty = xMin > xMax;\n return {\n x,\n y,\n count,\n sorted,\n xMin: empty ? NaN : xMin,\n xMax: empty ? NaN : xMax,\n yMin: empty ? NaN : yMin,\n yMax: empty ? NaN : yMax,\n ...extra,\n };\n};\n\n/** Turns any supported data form into columns */\nexport const normalizeData = (\n data: ChartSeriesData,\n resolveX: XResolver,\n): SeriesColumns => {\n const none = { size: null, colors: null, labels: null };\n if (isColumns(data)) {\n const count = data.y.length;\n const x = new Float64Array(count);\n const y = new Float64Array(count);\n const xs = data.x;\n for (let i = 0; i < count; i++) {\n y[i] = toNumber(data.y[i]);\n x[i] = xs ? resolveX(xs[i] as ChartXValue, i) : i;\n }\n let size: Float32Array | null = null;\n if (data.size) {\n size = new Float32Array(count);\n for (let i = 0; i < count; i++) size[i] = toNumber(data.size[i]);\n }\n return finalize(x, y, count, { ...none, size });\n }\n\n const list = data as ArrayLike<unknown>;\n const count = list.length;\n const x = new Float64Array(count);\n const y = new Float64Array(count);\n let size: Float32Array | null = null;\n let colors: (string | undefined)[] | null = null;\n let labels: (string | undefined)[] | null = null;\n\n for (let i = 0; i < count; i++) {\n const item = list[i];\n if (item === null || item === undefined || typeof item === \"number\") {\n x[i] = i;\n y[i] = toNumber(item);\n } else if (Array.isArray(item)) {\n x[i] = resolveX(item[0] as ChartXValue, i);\n y[i] = toNumber(item[1]);\n } else if (typeof item === \"object\") {\n const d = item as {\n x?: ChartXValue;\n y?: number | null;\n size?: number;\n color?: string;\n label?: string;\n };\n x[i] = d.x === undefined ? i : resolveX(d.x, i);\n y[i] = toNumber(d.y);\n if (d.size !== undefined) {\n size ??= new Float32Array(count).fill(NaN);\n size[i] = d.size;\n }\n if (d.color !== undefined) {\n colors ??= new Array<string | undefined>(count);\n colors[i] = d.color;\n }\n if (d.label !== undefined) {\n labels ??= new Array<string | undefined>(count);\n labels[i] = d.label;\n }\n } else {\n x[i] = i;\n y[i] = NaN;\n }\n }\n return finalize(x, y, count, { size, colors, labels });\n};\n\n/** First index whose x is >= value (sorted x) */\nexport const lowerBound = (\n x: ArrayLike<number>,\n count: number,\n value: number,\n): number => {\n let lo = 0;\n let hi = count;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (x[mid] < value) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n};\n\n/** Index of the point with the closest x and a finite y (sorted x), -1 if none */\nexport const nearestIndex = (\n x: ArrayLike<number>,\n y: ArrayLike<number>,\n count: number,\n value: number,\n): number => {\n if (count === 0) return -1;\n const i = lowerBound(x, count, value);\n let left = i - 1;\n let right = i;\n while (left >= 0 && !Number.isFinite(y[left])) left--;\n while (right < count && !Number.isFinite(y[right])) right++;\n if (left < 0) return right < count ? right : -1;\n if (right >= count) return left;\n return value - x[left] <= x[right] - value ? left : right;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"data.js","names":["isColumns","data","xResolver","value","type","categoryIndex","n","index","toNumber","v","collectYCategories","seen","datas","ys","i","list","item","collectCategories","add","xs","finalize","xMin","xMax","yMin","yMax","sorted","prev","extra","count","xi","x","yi","y","high","h","low","l","valueMin","valueMax","empty","column","values","out","normalizeData","none","resolveX","resolveY","size","colors","labels","open","nanColumn","d","lowerBound","lo","hi","mid","nearestIndex","left","right"],"sources":["../../../../../../charts/src/engine/data.ts"],"sourcesContent":["// Normalization of series data into columns (Float64Array).\n\nimport type { ChartAxisType, ChartSeriesData, ChartXValue } from \"./types\";\n\nexport interface SeriesColumns {\n x: Float64Array;\n /** NaN where the value is missing */\n y: Float64Array;\n size: Float32Array | null;\n colors: (string | undefined)[] | null;\n labels: (string | undefined)[] | null;\n /** Candlesticks: open / high / low (y is the close) */\n open: Float64Array | null;\n high: Float64Array | null;\n low: Float64Array | null;\n /** Heatmaps: values of the cells */\n value: Float64Array | null;\n count: number;\n /** x is non-decreasing (binary search, decimation) */\n sorted: boolean;\n /** Extent of the finite points (NaN when there is none); high / low included */\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n /** Extent of the finite `value`s (NaN when there is none) */\n valueMin: number;\n valueMax: number;\n}\n\ntype XResolver = (value: ChartXValue, index: number) => number;\n/** Converts a y value (a category name on category y axes) to a number */\nexport type YResolver = (value: unknown) => number;\n\ntype Extra = Pick<\n SeriesColumns,\n \"size\" | \"colors\" | \"labels\" | \"open\" | \"high\" | \"low\" | \"value\"\n>;\n\nconst isColumns = (\n data: ChartSeriesData,\n): data is {\n x?: ArrayLike<number> | readonly ChartXValue[];\n y: ArrayLike<number> | readonly (number | string | null)[];\n size?: ArrayLike<number>;\n open?: ArrayLike<number>;\n high?: ArrayLike<number>;\n low?: ArrayLike<number>;\n value?: ArrayLike<number> | readonly (number | null)[];\n} =>\n typeof data === \"object\" &&\n data !== null &&\n !(\"length\" in data) &&\n \"y\" in data;\n\n/** Converts an x value to a number for the axis type */\nexport const xResolver = (\n type: ChartAxisType,\n categoryIndex: (name: string) => number,\n): XResolver => {\n return (value, index) => {\n if (typeof value === \"number\") return value;\n if (value instanceof Date) return value.getTime();\n if (typeof value === \"string\") {\n if (type === \"category\") return categoryIndex(value);\n if (type === \"time\") return Date.parse(value);\n const n = Number(value);\n return Number.isNaN(n) ? index : n;\n }\n return index;\n };\n};\n\nconst toNumber = (v: unknown): number =>\n typeof v === \"number\" ? v : v === null || v === undefined ? NaN : Number(v);\n\n/** Category names used by string y values (heatmap rows), in order of appearance */\nexport const collectYCategories = (\n datas: readonly ChartSeriesData[],\n): string[] => {\n const seen = new Set<string>();\n for (const data of datas) {\n if (isColumns(data)) {\n const ys = data.y;\n if (!ArrayBuffer.isView(ys)) {\n for (let i = 0; i < ys.length; i++) {\n const v = ys[i];\n if (typeof v === \"string\") seen.add(v);\n }\n }\n continue;\n }\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < list.length; i++) {\n const item = list[i];\n const v = Array.isArray(item)\n ? item[1]\n : item && typeof item === \"object\"\n ? (item as { y?: unknown }).y\n : undefined;\n if (typeof v === \"string\") seen.add(v);\n }\n }\n return [...seen];\n};\n\n/** Category names used by string x values, in order of appearance */\nexport const collectCategories = (\n datas: readonly ChartSeriesData[],\n): string[] => {\n const seen = new Set<string>();\n const add = (v: unknown) => {\n if (typeof v === \"string\") seen.add(v);\n };\n for (const data of datas) {\n if (isColumns(data)) {\n const xs = data.x;\n if (xs && !ArrayBuffer.isView(xs)) {\n for (let i = 0; i < xs.length; i++) add(xs[i]);\n }\n continue;\n }\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < list.length; i++) {\n const item = list[i];\n if (Array.isArray(item)) add(item[0]);\n else if (item && typeof item === \"object\")\n add((item as { x?: unknown }).x);\n }\n }\n return [...seen];\n};\n\nconst finalize = (\n x: Float64Array,\n y: Float64Array,\n count: number,\n extra: Extra,\n): SeriesColumns => {\n let xMin = Infinity;\n let xMax = -Infinity;\n let yMin = Infinity;\n let yMax = -Infinity;\n let sorted = true;\n let prev = -Infinity;\n const { high, low, value } = extra;\n for (let i = 0; i < count; i++) {\n const xi = x[i];\n if (!Number.isFinite(xi)) {\n y[i] = NaN;\n continue;\n }\n if (xi < prev) sorted = false;\n prev = xi;\n const yi = y[i];\n if (!Number.isFinite(yi)) continue;\n if (xi < xMin) xMin = xi;\n if (xi > xMax) xMax = xi;\n if (yi < yMin) yMin = yi;\n if (yi > yMax) yMax = yi;\n if (high) {\n const h = high[i];\n if (h > yMax) yMax = h;\n if (h < yMin) yMin = h;\n }\n if (low) {\n const l = low[i];\n if (l < yMin) yMin = l;\n if (l > yMax) yMax = l;\n }\n }\n let valueMin = Infinity;\n let valueMax = -Infinity;\n if (value) {\n for (let i = 0; i < count; i++) {\n const v = value[i];\n if (!Number.isFinite(v)) continue;\n if (v < valueMin) valueMin = v;\n if (v > valueMax) valueMax = v;\n }\n }\n const empty = xMin > xMax;\n return {\n x,\n y,\n count,\n sorted,\n xMin: empty ? NaN : xMin,\n xMax: empty ? NaN : xMax,\n yMin: empty ? NaN : yMin,\n yMax: empty ? NaN : yMax,\n valueMin: valueMin > valueMax ? NaN : valueMin,\n valueMax: valueMin > valueMax ? NaN : valueMax,\n ...extra,\n };\n};\n\nconst column = (\n values: ArrayLike<unknown> | undefined,\n count: number,\n): Float64Array | null => {\n if (!values) return null;\n if (values instanceof Float64Array && values.length >= count) {\n return values.length === count ? values : values.subarray(0, count);\n }\n const out = new Float64Array(count);\n for (let i = 0; i < count; i++) out[i] = toNumber(values[i]);\n return out;\n};\n\n/** Turns any supported data form into columns */\nexport const normalizeData = (\n data: ChartSeriesData,\n resolveX: XResolver,\n resolveY: YResolver = toNumber,\n): SeriesColumns => {\n const none: Extra = {\n size: null,\n colors: null,\n labels: null,\n open: null,\n high: null,\n low: null,\n value: null,\n };\n if (isColumns(data)) {\n const count = data.y.length;\n const x = new Float64Array(count);\n const xs = data.x;\n if (!xs) {\n for (let i = 0; i < count; i++) x[i] = i;\n } else if (ArrayBuffer.isView(xs) && xs.length >= count) {\n // typed arrays: a plain copy (the hot path of large data sets)\n x.set(\n (xs.length === count\n ? xs\n : (xs as unknown as Float64Array).subarray(\n 0,\n count,\n )) as ArrayLike<number>,\n );\n } else {\n for (let i = 0; i < count; i++) x[i] = resolveX(xs[i] as ChartXValue, i);\n }\n const ys = data.y;\n let y: Float64Array;\n if (ArrayBuffer.isView(ys)) {\n // finalize writes NaN at invalid x: copy so the input is never changed\n y = new Float64Array(count);\n y.set(ys as ArrayLike<number>);\n } else {\n y = new Float64Array(count);\n for (let i = 0; i < count; i++) y[i] = resolveY(ys[i]);\n }\n let size: Float32Array | null = null;\n if (data.size) {\n size = new Float32Array(count);\n for (let i = 0; i < count; i++) size[i] = toNumber(data.size[i]);\n }\n return finalize(x, y, count, {\n ...none,\n size,\n open: column(data.open, count),\n high: column(data.high, count),\n low: column(data.low, count),\n value: column(data.value, count),\n });\n }\n\n const list = data as ArrayLike<unknown>;\n const count = list.length;\n const x = new Float64Array(count);\n const y = new Float64Array(count);\n let size: Float32Array | null = null;\n let colors: (string | undefined)[] | null = null;\n let labels: (string | undefined)[] | null = null;\n let open: Float64Array | null = null;\n let high: Float64Array | null = null;\n let low: Float64Array | null = null;\n let value: Float64Array | null = null;\n const nanColumn = () => new Float64Array(count).fill(NaN);\n\n for (let i = 0; i < count; i++) {\n const item = list[i];\n if (item === null || item === undefined || typeof item === \"number\") {\n x[i] = i;\n y[i] = toNumber(item);\n } else if (Array.isArray(item)) {\n x[i] = resolveX(item[0] as ChartXValue, i);\n y[i] = resolveY(item[1]);\n } else if (typeof item === \"object\") {\n const d = item as {\n x?: ChartXValue;\n y?: number | string | null;\n size?: number;\n color?: string;\n label?: string;\n open?: number;\n high?: number;\n low?: number;\n value?: number | null;\n };\n x[i] = d.x === undefined ? i : resolveX(d.x, i);\n y[i] = resolveY(d.y);\n if (d.size !== undefined) {\n size ??= new Float32Array(count).fill(NaN);\n size[i] = d.size;\n }\n if (d.color !== undefined) {\n colors ??= new Array<string | undefined>(count);\n colors[i] = d.color;\n }\n if (d.label !== undefined) {\n labels ??= new Array<string | undefined>(count);\n labels[i] = d.label;\n }\n if (d.open !== undefined) (open ??= nanColumn())[i] = toNumber(d.open);\n if (d.high !== undefined) (high ??= nanColumn())[i] = toNumber(d.high);\n if (d.low !== undefined) (low ??= nanColumn())[i] = toNumber(d.low);\n if (d.value !== undefined) (value ??= nanColumn())[i] = toNumber(d.value);\n } else {\n x[i] = i;\n y[i] = NaN;\n }\n }\n return finalize(x, y, count, {\n size,\n colors,\n labels,\n open,\n high,\n low,\n value,\n });\n};\n\n/** First index whose x is >= value (sorted x) */\nexport const lowerBound = (\n x: ArrayLike<number>,\n count: number,\n value: number,\n): number => {\n let lo = 0;\n let hi = count;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (x[mid] < value) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n};\n\n/** Index of the point with the closest x and a finite y (sorted x), -1 if none */\nexport const nearestIndex = (\n x: ArrayLike<number>,\n y: ArrayLike<number>,\n count: number,\n value: number,\n): number => {\n if (count === 0) return -1;\n const i = lowerBound(x, count, value);\n let left = i - 1;\n let right = i;\n while (left >= 0 && !Number.isFinite(y[left])) left--;\n while (right < count && !Number.isFinite(y[right])) right++;\n if (left < 0) return right < count ? right : -1;\n if (right >= count) return left;\n return value - x[left] <= x[right] - value ? left : right;\n};\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- const e=require("./color.cjs"),t=require("./data.cjs"),n=require("./scale.cjs"),r=require("./spatial.cjs");var i=e=>{if(typeof e==`object`&&e&&!(`length`in e)){let t=e.x;return t&&t.length?t[0]:void 0}let t=e;for(let e=0;e<Math.min(t.length,8);e++){let n=t[e];if(Array.isArray(n))return n[0];if(n&&typeof n==`object`)return n.x}},a=e=>{for(let t of e){let e=i(t);if(e instanceof Date)return`time`;if(typeof e==`string`)return`category`}return`linear`},o=(e,t,n,r)=>({type:t,reverse:!!e?.reverse,categories:n,title:e?.title,format:e?.format,grid:e?.grid??r,visible:e?.visible??!0,tickCount:e?.tickCount}),s=e=>{let t=1/0,n=-1/0;for(let r=0;r<e.length;r++){let i=e[r];Number.isFinite(i)&&(i<t&&(t=i),i>n&&(n=i))}return[t,n]},c=e=>{let t=1/0;for(let n of e){let e=n.sorted?n.x:Float64Array.from(n.x).sort();for(let r=1;r<n.count;r++){let n=e[r]-e[r-1];n>0&&n<t&&(t=n)}}return t},l=(r,i,l,u,d=null)=>{let f=d??i.resolve??((t,n)=>e.resolveStaticColor(t,{},n)),p=r.series,m=p.map(e=>e.data),h=r.xAxis?.type??a(m),g=h===`category`?[...r.xAxis?.categories??t.collectCategories(m)]:[],_=new Map(g.map((e,t)=>[e,t])),v=t.xResolver(h,e=>_.get(e)??NaN),y=`${h}|${g.join(``)}`,b=new Set,x=p.map((n,r)=>{let a=n.id??`#${r}`;for(;b.has(a);)a+=`'`;b.add(a);let o=u.get(a);(!o||o.data!==n.data||o.resolverKey!==y)&&(o={data:n.data,resolverKey:y,cols:t.normalizeData(n.data,v)},u.set(a,o));let s=n.type??`line`,c=n.color?f(n.color,i.palette[r%i.palette.length]):i.palette[r%i.palette.length],d=o.cols,p=null;if(s===`scatter`&&d.colors){let e=new Map;p=d.colors.map(t=>{if(t===void 0)return;let n=e.get(t);return n||e.set(t,n=f(t,c)),n})}let m=n.id??String(r);return{index:r,key:a,id:m,name:n.name??`Series ${r+1}`,type:s,color:c,colorCss:e.toCss(c),lineWidth:n.lineWidth??2,pointSize:n.pointSize??8,opacity:n.opacity??(s===`area`?.28:s===`scatter`?.78:1),hidden:!!n.hidden||l.has(m),showLabels:!!n.showLabels,cols:d,barOffset:0,barHalfWidth:0,barBase:null,barTop:null,pointColors:p}}),S=x.filter(e=>!e.hidden),C=x.length>0&&x.every(e=>e.type===`scatter`),w=S.filter(e=>e.type===`bar`),T=h===`category`?1:(()=>{let e=c(w.map(e=>e.cols));return Number.isFinite(e)?e:1})();if(w.length){let e=new Map;for(let t of w){let n=p[t.index].stack??`\u0000${t.key}`;e.has(n)||e.set(n,e.size)}let t=T*(e.size>1?.78:.62),n=t/e.size,r=new Map;for(let i of w){let a=p[i.index].stack??`\u0000${i.key}`,o=e.get(a)??0;i.barOffset=-t/2+n*(o+.5),i.barHalfWidth=n/2*(e.size>1?.86:1);let s=r.get(a);s||r.set(a,s=new Map);let{x:c,y:l,count:u}=i.cols;i.barBase=new Float64Array(u),i.barTop=new Float64Array(u);for(let e=0;e<u;e++){let t=l[e];if(!Number.isFinite(t)){i.barBase[e]=NaN,i.barTop[e]=NaN;continue}let n=s.get(c[e])??[0,0],r=t>=0?n[0]:n[1];i.barBase[e]=r,i.barTop[e]=r+t,t>=0?n[0]+=t:n[1]+=t,s.set(c[e],n)}}}let E=r.xAxis,D;if(h===`category`)D=[-.5,Math.max(1,g.length)-.5];else{let e=[];for(let t of S)e.push(t.cols.xMin,t.cols.xMax),t.type===`bar`&&e.push(t.cols.xMin-T/2,t.cols.xMax+T/2);if(D=n.ensureSpan(...s(e),h===`time`?[Date.now()-864e5,Date.now()]:[0,1]),C){let e=(D[1]-D[0])*.04;D=[D[0]-e,D[1]+e]}(E?.nice??(C&&h===`linear`))&&h===`linear`&&(D=n.niceDomain(D[0],D[1],E?.tickCount??6))}E?.min!==void 0&&(D[0]=E.min),E?.max!==void 0&&(D[1]=E.max),D=n.ensureSpan(D[0],D[1]);let O=r.yAxis,k=[];for(let e of S)e.type===`bar`&&e.barBase&&e.barTop?k.push(...s(e.barBase),...s(e.barTop)):k.push(e.cols.yMin,e.cols.yMax);(w.length||O?.zero)&&k.push(0);let A=n.ensureSpan(...s(k));if(C){let e=(A[1]-A[0])*.06;A=[A[0]-e,A[1]+e]}(O?.nice??!0)&&(O?.type??`linear`)===`linear`&&(A=n.niceDomain(A[0],A[1],O?.tickCount??5)),w.length&&!O?.zero&&A[0]<0&&s(k)[0]>=0&&(A[0]=0),O?.min!==void 0&&(A[0]=O.min),O?.max!==void 0&&(A[1]=O.max),A=n.ensureSpan(A[0],A[1]);let j=r.interaction===!1?!1:r.interaction===!0||r.interaction===void 0?!0:r.interaction.zoom??!0,M=j===!1?{x:!1,y:!1}:j===!0?{x:!0,y:C}:{x:j.includes(`x`),y:j.includes(`y`)},N=typeof r.tooltip==`object`?r.tooltip:void 0;return{series:x,x:o(E,h,g,!1),y:o(O,O?.type===`time`?`time`:`linear`,[],!0),base:{x:D,y:A},allScatter:C,zoom:M,tooltipMode:N?.mode??(C?`nearest`:`axis`),baseline:Math.min(Math.max(0,A[0]),A[1]),minSpan:{x:h===`category`?1:(D[1]-D[0])*1e-7,y:(A[1]-A[0])*1e-7}}},u=new WeakMap,d=e=>{let t=u.get(e.cols);return t||(t=new r.GridIndex(e.cols.x,e.cols.y,e.cols.count),u.set(e.cols,t)),t};exports.buildModel=l,exports.detectXType=a,exports.gridOf=d;
1
+ const e=require("./color.cjs"),t=require("./data.cjs"),n=require("./scale.cjs"),r=require("./spatial.cjs");var i=e=>{if(typeof e==`object`&&e&&!(`length`in e)){let t=e.x;return t&&t.length?t[0]:void 0}let t=e;for(let e=0;e<Math.min(t.length,8);e++){let n=t[e];if(Array.isArray(n))return n[0];if(n&&typeof n==`object`)return n.x}},a=e=>{for(let t of e){let e=i(t);if(e instanceof Date)return`time`;if(typeof e==`string`)return`category`}return`linear`},o=(e,t,n,r)=>({type:t,reverse:!!e?.reverse,categories:n,title:e?.title,format:e?.format,grid:e?.grid??r,visible:e?.visible??!0,tickCount:e?.tickCount}),s=e=>{let t=1/0,n=-1/0;for(let r=0;r<e.length;r++){let i=e[r];Number.isFinite(i)&&(i<t&&(t=i),i>n&&(n=i))}return[t,n]},c=(e,t)=>{let n=1/0;return e.forEach((e,r)=>{let i=t[r]?e:Float64Array.from(e).sort();for(let e=1;e<i.length;e++){let t=i[e]-i[e-1];t>0&&t<n&&(n=t)}}),n},l=(e,t,n)=>{if(n)return 1;let r=c(e.map(e=>t===`x`?e.cols.x:e.cols.y),e.map(e=>t===`x`&&e.cols.sorted));return Number.isFinite(r)?r:1},u=(e,t)=>{let n=new Map;if(t)for(let{s:t,stack:r}of e){let e=n.get(r);e||n.set(r,e=new Map);let{x:i,y:a,count:o}=t.cols;for(let t=0;t<o;t++){let n=a[t];if(!Number.isFinite(n))continue;let r=e.get(i[t])??[0,0];n>=0?r[0]+=n:r[1]-=n,e.set(i[t],r)}}let r=new Map,i=new Map;for(let{stack:t}of e)i.set(t,(i.get(t)??0)+1);return e.map(({s:e,stack:a})=>{let{x:o,y:s,count:c}=e.cols;if(!t&&i.get(a)===1){let e=new Float64Array(c),t=new Float64Array(c);for(let n=0;n<c;n++){let r=s[n],i=Number.isFinite(r);e[n]=i?0:NaN,t[n]=i?r:NaN}return{base:e,top:t}}let l=r.get(a);l||r.set(a,l=new Map);let u=n.get(a),d=new Float64Array(c),f=new Float64Array(c);for(let e=0;e<c;e++){let t=s[e];if(!Number.isFinite(t)){d[e]=NaN,f[e]=NaN;continue}if(u){let n=u.get(o[e]),r=n?t>=0?n[0]:n[1]:0;t=r>0?t/r*100:0}let n=l.get(o[e])??[0,0],r=t>=0?n[0]:n[1];d[e]=r,f[e]=r+t,t>=0?n[0]+=t:n[1]+=t,l.set(o[e],n)}return{base:d,top:f}})},d=`var(--success-color, #16a34a)`,f=`var(--danger-color, #dc2626)`,p=(r,i,c,p,m=null)=>{let h=m??i.resolve??((t,n)=>e.resolveStaticColor(t,{},n)),g=r.series,_=g.map(e=>e.data),v=r.xAxis?.type??a(_),y=v===`category`?[...r.xAxis?.categories??t.collectCategories(_)]:[],b=new Map(y.map((e,t)=>[e,t])),x=t.xResolver(v,e=>b.get(e)??NaN),S=r.yAxis,C=g.filter(e=>e.type===`heatmap`).map(e=>e.data),w=S?.type===`category`||!S?.type&&C.length?[...S?.categories??t.collectYCategories(C)]:[],T=S?.type===`category`||w.length?`category`:S?.type===`time`?`time`:`linear`,E=new Map(w.map((e,t)=>[e,t])),D=e=>typeof e==`number`?e:typeof e==`string`?T===`category`?E.get(e)??NaN:Number(e):NaN,O=`${v}|${y.join(``)}|${T}|${w.join(``)}`,k=r.stackMode===`percent`,A=new Set,j=g.map((n,r)=>{let a=n.id??`#${r}`;for(;A.has(a);)a+=`'`;A.add(a);let o=p.get(a);(!o||o.data!==n.data||o.resolverKey!==O)&&(o={data:n.data,resolverKey:O,cols:t.normalizeData(n.data,x,D)},p.set(a,o));let s=n.type??`line`,l=i.palette[r%i.palette.length],u=n.color?h(n.color,l):l,m=o.cols,g=null;if((s===`scatter`||s===`bar`)&&m.colors){let e=new Map;g=m.colors.map(t=>{if(t===void 0)return;let n=e.get(t);return n||e.set(t,n=h(t,u)),n})}let _=[],v=[0,1],y=null;if(s===`heatmap`){_=n.colorScale&&n.colorScale.length?n.colorScale.map(e=>h(e,u)):[e.mix(i.background,u,.08),u],v=n.valueRange?[n.valueRange[0],n.valueRange[1]]:[m.valueMin,m.valueMax],Number.isFinite(v[0])||(v=[0,1]);let t=m.value??m.y,[r,a]=v,o=a-r||1;y=new Uint32Array(m.count);for(let n=0;n<m.count;n++){let i=t[n];Number.isFinite(i)&&Number.isFinite(m.y[n])&&(y[n]=e.packColor(e.rampColor(_,(i-r)/o)))}}let b=n.id??String(r);return{index:r,key:a,id:b,name:n.name??`Series ${r+1}`,type:s,color:u,colorCss:e.toCss(u),lineWidth:n.lineWidth??(s===`candlestick`?1:2),pointSize:n.pointSize??8,opacity:n.opacity??(s===`area`?.28:s===`scatter`?.78:1),hidden:!!n.hidden||c.has(b),showLabels:!!n.showLabels,curve:n.curve??`linear`,cols:m,barOffset:0,barHalfWidth:0,barBase:null,barTop:null,stackBase:null,stackTop:null,pointColors:g,upColor:s===`candlestick`?h(n.upColor??d,[.09,.64,.29,1]):u,downColor:s===`candlestick`?h(n.downColor??f,[.86,.15,.15,1]):u,cellColors:y,cellHalf:{x:.5,y:.5},colorScale:_,valueRange:v,radius:n.radius??(s===`heatmap`?2:3),format:n.format}}),M=j.filter(e=>!e.hidden),N=j.length>0&&j.every(e=>e.type===`scatter`||e.type===`heatmap`),P=M.filter(e=>e.type===`bar`),F=l(P,`x`,v===`category`);if(P.length){let e=new Map,t=e=>g[e.index].stack??`\u0000${e.key}`;for(let n of P)e.has(t(n))||e.set(t(n),e.size);let n=F*(e.size>1?.78:.62),r=n/e.size,i=u(P.map(e=>({s:e,stack:t(e)})),!1),a=k?u(P.filter(e=>g[e.index].stack!==void 0).map(e=>({s:e,stack:t(e)})),!0):[],o=0;P.forEach((s,c)=>{let l=e.get(t(s))??0;s.barOffset=-n/2+r*(l+.5),s.barHalfWidth=r/2*(e.size>1?.86:1);let u=k&&g[s.index].stack!==void 0?a[o++]:i[c];s.barBase=u.base,s.barTop=u.top})}let I=M.filter(e=>(e.type===`line`||e.type===`area`)&&g[e.index].stack!==void 0);if(I.length){let e=u(I.map(e=>({s:e,stack:g[e.index].stack??``})),k);I.forEach((t,n)=>{t.stackBase=e[n].base,t.stackTop=e[n].top})}let L=M.filter(e=>e.type===`candlestick`),R=l(L,`x`,v===`category`);for(let e of L)e.barHalfWidth=R*.3;let z=M.filter(e=>e.type===`heatmap`);if(z.length){let e=l(z,`x`,v===`category`)/2,t=l(z,`y`,T===`category`)/2;for(let n of z)n.cellHalf={x:e,y:t}}let B=r.xAxis,V;if(v===`category`)V=[-.5,Math.max(1,y.length)-.5];else{let e=[];for(let t of M){e.push(t.cols.xMin,t.cols.xMax);let n=t.type===`bar`?F/2:t.type===`candlestick`?R/2:t.type===`heatmap`?t.cellHalf.x:0;n&&e.push(t.cols.xMin-n,t.cols.xMax+n)}V=n.ensureSpan(...s(e),v===`time`?[Date.now()-864e5,Date.now()]:[0,1]);let t=j.every(e=>e.type===`scatter`);if(t){let e=(V[1]-V[0])*.04;V=[V[0]-e,V[1]+e]}(B?.nice??(t&&v===`linear`))&&v===`linear`&&(V=n.niceDomain(V[0],V[1],B?.tickCount??6))}B?.min!==void 0&&(V[0]=B.min),B?.max!==void 0&&(V[1]=B.max),V=n.ensureSpan(V[0],V[1]);let H;if(T===`category`)H=[-.5,Math.max(1,w.length)-.5];else{let e=[];for(let t of M)t.type===`bar`&&t.barBase&&t.barTop?e.push(...s(t.barBase),...s(t.barTop)):t.stackBase&&t.stackTop?e.push(...s(t.stackBase),...s(t.stackTop)):t.type===`heatmap`?e.push(t.cols.yMin-t.cellHalf.y,t.cols.yMax+t.cellHalf.y):e.push(t.cols.yMin,t.cols.yMax);let t=P.length>0||M.some(e=>e.type===`area`);if((P.length||S?.zero)&&e.push(0),P.some(e=>e.showLabels)){let[t,n]=s(e);n>0&&e.push(n+(n-Math.min(0,t))*.1),t<0&&e.push(t-(Math.max(0,n)-t)*.1)}if(H=n.ensureSpan(...s(e)),j.every(e=>e.type===`scatter`)){let e=(H[1]-H[0])*.06;H=[H[0]-e,H[1]+e]}else if(L.length&&!P.length){let e=(H[1]-H[0])*.04;H=[H[0]-e,H[1]+e]}(S?.nice??!z.length)&&T===`linear`&&(H=n.niceDomain(H[0],H[1],S?.tickCount??5)),k&&(P.length||I.length)&&(H=[s(e)[0]<0?-100:0,100]),t&&!S?.zero&&H[0]<0&&s(e)[0]>=0&&(H[0]=0)}S?.min!==void 0&&(H[0]=S.min),S?.max!==void 0&&(H[1]=S.max),H=n.ensureSpan(H[0],H[1]);let U=r.interaction===!1?!1:r.interaction===!0||r.interaction===void 0?!0:r.interaction.zoom??!0,W=U===!1?{x:!1,y:!1}:U===!0?{x:!0,y:N}:{x:U.includes(`x`),y:U.includes(`y`)},G=typeof r.tooltip==`object`?r.tooltip:void 0,K=S?.format??(k&&(P.length||I.length)?e=>`${+e.toFixed(1)}%`:void 0);return{series:j,x:o(B,v,y,!1),y:{...o(S,T,w,T!==`category`),format:K},base:{x:V,y:H},allScatter:N,zoom:W,tooltipMode:G?.mode??(N?`nearest`:`axis`),baseline:Math.min(Math.max(0,H[0]),H[1]),minSpan:{x:v===`category`?1:(V[1]-V[0])*1e-7,y:T===`category`?1:(H[1]-H[0])*1e-7},percent:k,stacks:g.map(e=>e.stack!==void 0&&(e.type===`bar`||e.type===`line`||e.type===`area`||!e.type)?`${e.type===`bar`?`bar`:`line`}:${e.stack}`:null)}},m=(e,t)=>e.barTop?e.barTop[t]:e.stackTop?e.stackTop[t]:e.cols.y[t],h=new WeakMap,g=e=>{let t=h.get(e.cols);return t||(t=new r.GridIndex(e.cols.x,e.cols.y,e.cols.count),h.set(e.cols,t)),t};exports.buildModel=p,exports.detectXType=a,exports.gridOf=g,exports.plottedY=m;
2
2
  //# sourceMappingURL=model.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"model.cjs","names":["resolveStaticColor","collectCategories","xResolver","normalizeData","toCss","ensureSpan","niceDomain","GridIndex","require_color","require_data","require_scale","require_spatial","firstX","data","xs","list","i","item","detectXType","datas","x","axisModel","options","gridDefault","extent","min","max","values","v","smallestStep","step","c","cols","d","buildModel","resolve","resolver","theme","value","fallback","input","s","xType","categories","categoryMap","resolveX","name","resolverKey","usedKeys","series","key","index","entry","cache","type","color","pointColors","resolved","rgba","id","hidden","visible","allScatter","bars","band","slots","stack","group","slotWidth","sums","slot","totals","count","y","t","base","xOpts","xRange","pad","yOpts","yValues","yRange","zoomOption","zoomAxes","tooltip","grids","gridOf","grid"],"sources":["../../../../../../charts/src/engine/model.ts"],"sourcesContent":["// Options -> chart model: normalized data, colors, bar layout and the full\n// ranges of the axes. Pure (colors go through the theme's resolver).\n\nimport {\n resolveStaticColor,\n toCss,\n type ColorResolver,\n type Rgba,\n} from \"./color\";\nimport {\n collectCategories,\n normalizeData,\n xResolver,\n type SeriesColumns,\n} from \"./data\";\nimport { ensureSpan, niceDomain } from \"./scale\";\nimport { GridIndex } from \"./spatial\";\nimport type { ChartTheme } from \"./theme\";\nimport type {\n ChartAxisOptions,\n ChartAxisType,\n ChartOptions,\n ChartSeriesData,\n ChartSeriesType,\n} from \"./types\";\nimport type { Range } from \"./viewport\";\n\nexport interface AxisModel {\n type: ChartAxisType;\n reverse: boolean;\n categories: string[];\n title?: string;\n format?: (value: number) => string;\n grid: boolean;\n visible: boolean;\n tickCount?: number;\n}\n\nexport interface SeriesModel {\n index: number;\n /** Key of the GPU resources and of the data cache */\n key: string;\n id: string;\n name: string;\n type: ChartSeriesType;\n color: Rgba;\n colorCss: string;\n lineWidth: number;\n pointSize: number;\n opacity: number;\n hidden: boolean;\n showLabels: boolean;\n cols: SeriesColumns;\n /** Bars: x offset of the series inside a group and half of the bar width */\n barOffset: number;\n barHalfWidth: number;\n /** Bars: bottom / top of every bar (stacks included) */\n barBase: Float64Array | null;\n barTop: Float64Array | null;\n /** Scatter: resolved per-point colors */\n pointColors: (Rgba | undefined)[] | null;\n}\n\nexport interface ChartModel {\n series: SeriesModel[];\n x: AxisModel;\n y: AxisModel;\n /** Full ranges (zoomed out) */\n base: { x: Range; y: Range };\n allScatter: boolean;\n zoom: { x: boolean; y: boolean };\n tooltipMode: \"nearest\" | \"axis\";\n /** Y value the areas are filled to */\n baseline: number;\n /** Smallest zoomed spans */\n minSpan: { x: number; y: number };\n}\n\nexport interface DataCacheEntry {\n data: ChartSeriesData;\n resolverKey: string;\n cols: SeriesColumns;\n}\n\nexport type DataCache = Map<string, DataCacheEntry>;\n\nconst firstX = (data: ChartSeriesData): unknown => {\n if (typeof data === \"object\" && data !== null && !(\"length\" in data)) {\n const xs = (data as { x?: ArrayLike<unknown> }).x;\n return xs && xs.length ? xs[0] : undefined;\n }\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < Math.min(list.length, 8); i++) {\n const item = list[i];\n if (Array.isArray(item)) return item[0];\n if (item && typeof item === \"object\") return (item as { x?: unknown }).x;\n }\n return undefined;\n};\n\n/** Axis type when not given: dates -> time, strings -> category */\nexport const detectXType = (\n datas: readonly ChartSeriesData[],\n): ChartAxisType => {\n for (const data of datas) {\n const x = firstX(data);\n if (x instanceof Date) return \"time\";\n if (typeof x === \"string\") return \"category\";\n }\n return \"linear\";\n};\n\nconst axisModel = (\n options: ChartAxisOptions | undefined,\n type: ChartAxisType,\n categories: string[],\n gridDefault: boolean,\n): AxisModel => ({\n type,\n reverse: !!options?.reverse,\n categories,\n title: options?.title,\n format: options?.format,\n grid: options?.grid ?? gridDefault,\n visible: options?.visible ?? true,\n tickCount: options?.tickCount,\n});\n\nconst extent = (values: ArrayLike<number>): Range => {\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < values.length; i++) {\n const v = values[i];\n if (!Number.isFinite(v)) continue;\n if (v < min) min = v;\n if (v > max) max = v;\n }\n return [min, max];\n};\n\n/** Smallest positive gap between consecutive x values (bar width on numeric axes) */\nconst smallestStep = (cols: SeriesColumns[]): number => {\n let step = Infinity;\n for (const c of cols) {\n const xs = c.sorted ? c.x : Float64Array.from(c.x).sort();\n for (let i = 1; i < c.count; i++) {\n const d = xs[i] - xs[i - 1];\n if (d > 0 && d < step) step = d;\n }\n }\n return step;\n};\n\nexport const buildModel = (\n options: ChartOptions,\n theme: ChartTheme,\n hidden: ReadonlySet<string>,\n cache: DataCache,\n resolver: ColorResolver | null = null,\n): ChartModel => {\n const resolve: ColorResolver =\n resolver ??\n theme.resolve ??\n ((value, fallback) => resolveStaticColor(value, {}, fallback));\n const input = options.series;\n const datas = input.map((s) => s.data);\n const xType = options.xAxis?.type ?? detectXType(datas);\n const categories =\n xType === \"category\"\n ? [...(options.xAxis?.categories ?? collectCategories(datas))]\n : [];\n const categoryMap = new Map(categories.map((c, i) => [c, i]));\n const resolveX = xResolver(xType, (name) => categoryMap.get(name) ?? NaN);\n const resolverKey = `${xType}|${categories.join(\"\\u0001\")}`;\n\n const usedKeys = new Set<string>();\n const series: SeriesModel[] = input.map((s, index) => {\n let key = s.id ?? `#${index}`;\n while (usedKeys.has(key)) key += \"'\";\n usedKeys.add(key);\n let entry = cache.get(key);\n if (!entry || entry.data !== s.data || entry.resolverKey !== resolverKey) {\n entry = {\n data: s.data,\n resolverKey,\n cols: normalizeData(s.data, resolveX),\n };\n cache.set(key, entry);\n }\n const type = s.type ?? \"line\";\n const color = s.color\n ? resolve(s.color, theme.palette[index % theme.palette.length])\n : theme.palette[index % theme.palette.length];\n const cols = entry.cols;\n let pointColors: (Rgba | undefined)[] | null = null;\n if (type === \"scatter\" && cols.colors) {\n const resolved = new Map<string, Rgba>();\n pointColors = cols.colors.map((c) => {\n if (c === undefined) return undefined;\n let rgba = resolved.get(c);\n if (!rgba) resolved.set(c, (rgba = resolve(c, color)));\n return rgba;\n });\n }\n const id = s.id ?? String(index);\n return {\n index,\n key,\n id,\n name: s.name ?? `Series ${index + 1}`,\n type,\n color,\n colorCss: toCss(color),\n lineWidth: s.lineWidth ?? 2,\n pointSize: s.pointSize ?? 8,\n opacity:\n s.opacity ?? (type === \"area\" ? 0.28 : type === \"scatter\" ? 0.78 : 1),\n hidden: !!s.hidden || hidden.has(id),\n showLabels: !!s.showLabels,\n cols,\n barOffset: 0,\n barHalfWidth: 0,\n barBase: null,\n barTop: null,\n pointColors,\n };\n });\n\n const visible = series.filter((s) => !s.hidden);\n const allScatter =\n series.length > 0 && series.every((s) => s.type === \"scatter\");\n\n // Bars: groups (one slot per stack) and stacking\n const bars = visible.filter((s) => s.type === \"bar\");\n const band =\n xType === \"category\"\n ? 1\n : (() => {\n const step = smallestStep(bars.map((s) => s.cols));\n return Number.isFinite(step) ? step : 1;\n })();\n if (bars.length) {\n const slots = new Map<string, number>();\n for (const s of bars) {\n const stack = input[s.index].stack ?? `\\u0000${s.key}`;\n if (!slots.has(stack)) slots.set(stack, slots.size);\n }\n const group = band * (slots.size > 1 ? 0.78 : 0.62);\n const slotWidth = group / slots.size;\n const sums = new Map<string, Map<number, [number, number]>>();\n for (const s of bars) {\n const stack = input[s.index].stack ?? `\\u0000${s.key}`;\n const slot = slots.get(stack) ?? 0;\n s.barOffset = -group / 2 + slotWidth * (slot + 0.5);\n s.barHalfWidth = (slotWidth / 2) * (slots.size > 1 ? 0.86 : 1);\n let totals = sums.get(stack);\n if (!totals) sums.set(stack, (totals = new Map()));\n const { x, y, count } = s.cols;\n s.barBase = new Float64Array(count);\n s.barTop = new Float64Array(count);\n for (let i = 0; i < count; i++) {\n const v = y[i];\n if (!Number.isFinite(v)) {\n s.barBase[i] = NaN;\n s.barTop[i] = NaN;\n continue;\n }\n const t = totals.get(x[i]) ?? [0, 0];\n const base = v >= 0 ? t[0] : t[1];\n s.barBase[i] = base;\n s.barTop[i] = base + v;\n if (v >= 0) t[0] += v;\n else t[1] += v;\n totals.set(x[i], t);\n }\n }\n }\n\n // X range\n const xOpts = options.xAxis;\n let xRange: Range;\n if (xType === \"category\") {\n xRange = [-0.5, Math.max(1, categories.length) - 0.5];\n } else {\n const values: number[] = [];\n for (const s of visible) {\n values.push(s.cols.xMin, s.cols.xMax);\n if (s.type === \"bar\") {\n values.push(s.cols.xMin - band / 2, s.cols.xMax + band / 2);\n }\n }\n xRange = ensureSpan(\n ...extent(values),\n xType === \"time\" ? [Date.now() - 86400000, Date.now()] : [0, 1],\n );\n if (allScatter) {\n const pad = (xRange[1] - xRange[0]) * 0.04;\n xRange = [xRange[0] - pad, xRange[1] + pad];\n }\n const nice = xOpts?.nice ?? (allScatter && xType === \"linear\");\n if (nice && xType === \"linear\") {\n xRange = niceDomain(xRange[0], xRange[1], xOpts?.tickCount ?? 6);\n }\n }\n if (xOpts?.min !== undefined) xRange[0] = xOpts.min;\n if (xOpts?.max !== undefined) xRange[1] = xOpts.max;\n xRange = ensureSpan(xRange[0], xRange[1]);\n\n // Y range\n const yOpts = options.yAxis;\n const yValues: number[] = [];\n for (const s of visible) {\n if (s.type === \"bar\" && s.barBase && s.barTop) {\n yValues.push(...extent(s.barBase), ...extent(s.barTop));\n } else {\n yValues.push(s.cols.yMin, s.cols.yMax);\n }\n }\n if (bars.length || yOpts?.zero) yValues.push(0);\n let yRange = ensureSpan(...extent(yValues));\n if (allScatter) {\n const pad = (yRange[1] - yRange[0]) * 0.06;\n yRange = [yRange[0] - pad, yRange[1] + pad];\n }\n if ((yOpts?.nice ?? true) && (yOpts?.type ?? \"linear\") === \"linear\") {\n yRange = niceDomain(yRange[0], yRange[1], yOpts?.tickCount ?? 5);\n }\n if (bars.length && !yOpts?.zero) {\n // bars start at zero: no padding below / above it\n if (yRange[0] < 0 && extent(yValues)[0] >= 0) yRange[0] = 0;\n }\n if (yOpts?.min !== undefined) yRange[0] = yOpts.min;\n if (yOpts?.max !== undefined) yRange[1] = yOpts.max;\n yRange = ensureSpan(yRange[0], yRange[1]);\n\n const zoomOption =\n options.interaction === false\n ? false\n : options.interaction === true || options.interaction === undefined\n ? true\n : (options.interaction.zoom ?? true);\n const zoomAxes =\n zoomOption === false\n ? { x: false, y: false }\n : zoomOption === true\n ? { x: true, y: allScatter }\n : { x: zoomOption.includes(\"x\"), y: zoomOption.includes(\"y\") };\n\n const tooltip =\n typeof options.tooltip === \"object\" ? options.tooltip : undefined;\n\n return {\n series,\n x: axisModel(xOpts, xType, categories, false),\n y: axisModel(yOpts, yOpts?.type === \"time\" ? \"time\" : \"linear\", [], true),\n base: { x: xRange, y: yRange },\n allScatter,\n zoom: zoomAxes,\n tooltipMode: tooltip?.mode ?? (allScatter ? \"nearest\" : \"axis\"),\n baseline: Math.min(Math.max(0, yRange[0]), yRange[1]),\n minSpan: {\n x: xType === \"category\" ? 1 : (xRange[1] - xRange[0]) * 1e-7,\n y: (yRange[1] - yRange[0]) * 1e-7,\n },\n };\n};\n\nconst grids = new WeakMap<SeriesColumns, GridIndex>();\n\n/** Spatial index of a scatter series, built on first use and kept with its data */\nexport const gridOf = (s: SeriesModel): GridIndex => {\n let grid = grids.get(s.cols);\n if (!grid) {\n grid = new GridIndex(s.cols.x, s.cols.y, s.cols.count);\n grids.set(s.cols, grid);\n }\n return grid;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"model.cjs","names":["resolveStaticColor","collectCategories","xResolver","collectYCategories","normalizeData","mix","packColor","rampColor","toCss","ensureSpan","niceDomain","GridIndex","require_color","require_data","require_scale","require_spatial","firstX","data","xs","list","i","item","detectXType","datas","x","axisModel","options","gridDefault","extent","min","max","values","v","smallestStep","step","columns","sorted","k","d","bandOf","category","axis","s","stackValues","totals","percent","byX","stack","count","y","t","running","members","base","top","valid","sums","total","b","DEFAULT_UP","DEFAULT_DOWN","buildModel","resolve","resolver","theme","value","fallback","input","xType","categories","categoryMap","c","resolveX","name","yOpts","heatmapData","yCategories","yType","yCategoryMap","resolveY","resolverKey","usedKeys","series","key","index","entry","cache","type","paletteColor","color","cols","pointColors","resolved","rgba","colorScale","valueRange","cellColors","lo","hi","span","id","hidden","visible","allScatter","bars","band","slots","stackId","group","slotWidth","stacked","percentStacked","p","slot","stackedLines","candles","candleBand","heatmaps","cx","cy","xOpts","xRange","pad","pointsOnly","yRange","yValues","filled","zoomOption","zoomAxes","tooltip","yFormat","plottedY","grids","gridOf","grid"],"sources":["../../../../../../charts/src/engine/model.ts"],"sourcesContent":["// Options -> chart model: normalized data, colors, bar layout, stacks and\n// the full ranges of the axes. Pure (colors go through the theme's resolver).\n\nimport {\n mix,\n packColor,\n rampColor,\n resolveStaticColor,\n toCss,\n type ColorResolver,\n type Rgba,\n} from \"./color\";\nimport {\n collectCategories,\n collectYCategories,\n normalizeData,\n xResolver,\n type SeriesColumns,\n type YResolver,\n} from \"./data\";\nimport { ensureSpan, niceDomain } from \"./scale\";\nimport { GridIndex } from \"./spatial\";\nimport type { ChartTheme } from \"./theme\";\nimport type {\n ChartAxisOptions,\n ChartAxisType,\n ChartCurve,\n ChartOptions,\n ChartSeries,\n ChartSeriesData,\n ChartSeriesType,\n} from \"./types\";\nimport type { Range } from \"./viewport\";\n\nexport interface AxisModel {\n type: ChartAxisType;\n reverse: boolean;\n categories: string[];\n title?: string;\n format?: (value: number) => string;\n grid: boolean;\n visible: boolean;\n tickCount?: number;\n}\n\nexport interface SeriesModel {\n index: number;\n /** Key of the GPU resources and of the data cache */\n key: string;\n id: string;\n name: string;\n type: ChartSeriesType;\n color: Rgba;\n colorCss: string;\n lineWidth: number;\n pointSize: number;\n opacity: number;\n hidden: boolean;\n showLabels: boolean;\n curve: ChartCurve;\n cols: SeriesColumns;\n /** Bars / candlesticks: x offset of the series inside a group and half of the bar width */\n barOffset: number;\n barHalfWidth: number;\n /** Bars: bottom / top of every bar (stacks included) */\n barBase: Float64Array | null;\n barTop: Float64Array | null;\n /** Stacked lines / areas: bottom / top of every point */\n stackBase: Float64Array | null;\n stackTop: Float64Array | null;\n /** Scatter / bar: resolved per-point colors */\n pointColors: (Rgba | undefined)[] | null;\n /** Candlesticks: colors of the rising / falling candles */\n upColor: Rgba;\n downColor: Rgba;\n /** Heatmaps: packed color of every cell (0 = no cell) and half of a cell, in data units */\n cellColors: Uint32Array | null;\n cellHalf: { x: number; y: number };\n /** Heatmaps: ramp of the colors and the values at its ends */\n colorScale: Rgba[];\n valueRange: Range;\n /** Corner radius in CSS pixels (bars, heatmap cells) */\n radius: number;\n /** Tooltip format of the values */\n format?: (value: number) => string;\n}\n\nexport interface ChartModel {\n series: SeriesModel[];\n x: AxisModel;\n y: AxisModel;\n /** Full ranges (zoomed out) */\n base: { x: Range; y: Range };\n /** Every series is a scatter (or a heatmap): nearest tooltips, xy zoom */\n allScatter: boolean;\n zoom: { x: boolean; y: boolean };\n tooltipMode: \"nearest\" | \"axis\";\n /** Y value the areas are filled to */\n baseline: number;\n /** Smallest zoomed spans */\n minSpan: { x: number; y: number };\n /** Stacks are scaled to 100% */\n percent: boolean;\n /** Stack id of every series (`null` when not stacked) */\n stacks: (string | null)[];\n}\n\nexport interface DataCacheEntry {\n data: ChartSeriesData;\n resolverKey: string;\n cols: SeriesColumns;\n}\n\nexport type DataCache = Map<string, DataCacheEntry>;\n\nconst firstX = (data: ChartSeriesData): unknown => {\n if (typeof data === \"object\" && data !== null && !(\"length\" in data)) {\n const xs = (data as { x?: ArrayLike<unknown> }).x;\n return xs && xs.length ? xs[0] : undefined;\n }\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < Math.min(list.length, 8); i++) {\n const item = list[i];\n if (Array.isArray(item)) return item[0];\n if (item && typeof item === \"object\") return (item as { x?: unknown }).x;\n }\n return undefined;\n};\n\n/** Axis type when not given: dates -> time, strings -> category */\nexport const detectXType = (\n datas: readonly ChartSeriesData[],\n): ChartAxisType => {\n for (const data of datas) {\n const x = firstX(data);\n if (x instanceof Date) return \"time\";\n if (typeof x === \"string\") return \"category\";\n }\n return \"linear\";\n};\n\nconst axisModel = (\n options: ChartAxisOptions | undefined,\n type: ChartAxisType,\n categories: string[],\n gridDefault: boolean,\n): AxisModel => ({\n type,\n reverse: !!options?.reverse,\n categories,\n title: options?.title,\n format: options?.format,\n grid: options?.grid ?? gridDefault,\n visible: options?.visible ?? true,\n tickCount: options?.tickCount,\n});\n\nconst extent = (values: ArrayLike<number>): Range => {\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < values.length; i++) {\n const v = values[i];\n if (!Number.isFinite(v)) continue;\n if (v < min) min = v;\n if (v > max) max = v;\n }\n return [min, max];\n};\n\n/** Smallest positive gap between consecutive values (bar width on numeric axes) */\nconst smallestStep = (columns: ArrayLike<number>[], sorted: boolean[]) => {\n let step = Infinity;\n columns.forEach((values, k) => {\n const xs = sorted[k] ? values : Float64Array.from(values).sort();\n for (let i = 1; i < xs.length; i++) {\n const d = xs[i] - xs[i - 1];\n if (d > 0 && d < step) step = d;\n }\n });\n return step;\n};\n\nconst bandOf = (list: SeriesModel[], axis: \"x\" | \"y\", category: boolean) => {\n if (category) return 1;\n const step = smallestStep(\n list.map((s) => (axis === \"x\" ? s.cols.x : s.cols.y)),\n list.map((s) => axis === \"x\" && s.cols.sorted),\n );\n return Number.isFinite(step) ? step : 1;\n};\n\n/**\n * Stacks the y values of series sharing a stack id (positive and negative\n * values separately); `percent` scales every stack to 100 at each x\n */\nconst stackValues = (\n list: { s: SeriesModel; stack: string }[],\n percent: boolean,\n): { base: Float64Array; top: Float64Array }[] => {\n const totals = new Map<string, Map<number, [number, number]>>();\n if (percent) {\n for (const { s, stack } of list) {\n let byX = totals.get(stack);\n if (!byX) totals.set(stack, (byX = new Map()));\n const { x, y, count } = s.cols;\n for (let i = 0; i < count; i++) {\n const v = y[i];\n if (!Number.isFinite(v)) continue;\n const t = byX.get(x[i]) ?? [0, 0];\n if (v >= 0) t[0] += v;\n else t[1] -= v;\n byX.set(x[i], t);\n }\n }\n }\n const running = new Map<string, Map<number, [number, number]>>();\n const members = new Map<string, number>();\n for (const { stack } of list)\n members.set(stack, (members.get(stack) ?? 0) + 1);\n return list.map(({ s, stack }) => {\n const { x, y, count } = s.cols;\n if (!percent && members.get(stack) === 1) {\n // alone in its stack (e.g. grouped bars): from zero, no bookkeeping\n const base = new Float64Array(count);\n const top = new Float64Array(count);\n for (let i = 0; i < count; i++) {\n const v = y[i];\n const valid = Number.isFinite(v);\n base[i] = valid ? 0 : NaN;\n top[i] = valid ? v : NaN;\n }\n return { base, top };\n }\n let byX = running.get(stack);\n if (!byX) running.set(stack, (byX = new Map()));\n const sums = totals.get(stack);\n const base = new Float64Array(count);\n const top = new Float64Array(count);\n for (let i = 0; i < count; i++) {\n let v = y[i];\n if (!Number.isFinite(v)) {\n base[i] = NaN;\n top[i] = NaN;\n continue;\n }\n if (sums) {\n const t = sums.get(x[i]);\n const total = t ? (v >= 0 ? t[0] : t[1]) : 0;\n v = total > 0 ? (v / total) * 100 : 0;\n }\n const t = byX.get(x[i]) ?? [0, 0];\n const b = v >= 0 ? t[0] : t[1];\n base[i] = b;\n top[i] = b + v;\n if (v >= 0) t[0] += v;\n else t[1] += v;\n byX.set(x[i], t);\n }\n return { base, top };\n });\n};\n\nconst DEFAULT_UP = \"var(--success-color, #16a34a)\";\nconst DEFAULT_DOWN = \"var(--danger-color, #dc2626)\";\n\nexport const buildModel = (\n options: ChartOptions,\n theme: ChartTheme,\n hidden: ReadonlySet<string>,\n cache: DataCache,\n resolver: ColorResolver | null = null,\n): ChartModel => {\n const resolve: ColorResolver =\n resolver ??\n theme.resolve ??\n ((value, fallback) => resolveStaticColor(value, {}, fallback));\n const input = options.series;\n const datas = input.map((s) => s.data);\n const xType = options.xAxis?.type ?? detectXType(datas);\n const categories =\n xType === \"category\"\n ? [...(options.xAxis?.categories ?? collectCategories(datas))]\n : [];\n const categoryMap = new Map(categories.map((c, i) => [c, i]));\n const resolveX = xResolver(xType, (name) => categoryMap.get(name) ?? NaN);\n\n // category y axis (heatmap rows): explicit, or detected from string y values\n const yOpts = options.yAxis;\n const heatmapData = input\n .filter((s) => s.type === \"heatmap\")\n .map((s) => s.data);\n const yCategories =\n yOpts?.type === \"category\" || (!yOpts?.type && heatmapData.length)\n ? [...(yOpts?.categories ?? collectYCategories(heatmapData))]\n : [];\n const yType: ChartAxisType =\n yOpts?.type === \"category\" || yCategories.length\n ? \"category\"\n : yOpts?.type === \"time\"\n ? \"time\"\n : \"linear\";\n const yCategoryMap = new Map(yCategories.map((c, i) => [c, i]));\n const resolveY: YResolver = (v) =>\n typeof v === \"number\"\n ? v\n : typeof v === \"string\"\n ? yType === \"category\"\n ? (yCategoryMap.get(v) ?? NaN)\n : Number(v)\n : NaN;\n const resolverKey = `${xType}|${categories.join(\"\\u0001\")}|${yType}|${yCategories.join(\"\\u0001\")}`;\n const percent = options.stackMode === \"percent\";\n\n const usedKeys = new Set<string>();\n const series: SeriesModel[] = input.map((s: ChartSeries, index) => {\n let key = s.id ?? `#${index}`;\n while (usedKeys.has(key)) key += \"'\";\n usedKeys.add(key);\n let entry = cache.get(key);\n if (!entry || entry.data !== s.data || entry.resolverKey !== resolverKey) {\n entry = {\n data: s.data,\n resolverKey,\n cols: normalizeData(s.data, resolveX, resolveY),\n };\n cache.set(key, entry);\n }\n const type = s.type ?? \"line\";\n const paletteColor = theme.palette[index % theme.palette.length];\n const color = s.color ? resolve(s.color, paletteColor) : paletteColor;\n const cols = entry.cols;\n let pointColors: (Rgba | undefined)[] | null = null;\n if ((type === \"scatter\" || type === \"bar\") && cols.colors) {\n const resolved = new Map<string, Rgba>();\n pointColors = cols.colors.map((c) => {\n if (c === undefined) return undefined;\n let rgba = resolved.get(c);\n if (!rgba) resolved.set(c, (rgba = resolve(c, color)));\n return rgba;\n });\n }\n let colorScale: Rgba[] = [];\n let valueRange: Range = [0, 1];\n let cellColors: Uint32Array | null = null;\n if (type === \"heatmap\") {\n colorScale =\n s.colorScale && s.colorScale.length\n ? s.colorScale.map((c) => resolve(c, color))\n : [mix(theme.background, color, 0.08), color];\n valueRange = s.valueRange\n ? [s.valueRange[0], s.valueRange[1]]\n : [cols.valueMin, cols.valueMax];\n if (!Number.isFinite(valueRange[0])) valueRange = [0, 1];\n const values = cols.value ?? cols.y;\n const [lo, hi] = valueRange;\n const span = hi - lo || 1;\n cellColors = new Uint32Array(cols.count);\n for (let i = 0; i < cols.count; i++) {\n const v = values[i];\n if (!Number.isFinite(v) || !Number.isFinite(cols.y[i])) continue;\n // 0 means \"no cell\": a fully transparent color packs to 0 as well\n cellColors[i] = packColor(rampColor(colorScale, (v - lo) / span));\n }\n }\n const id = s.id ?? String(index);\n return {\n index,\n key,\n id,\n name: s.name ?? `Series ${index + 1}`,\n type,\n color,\n colorCss: toCss(color),\n lineWidth: s.lineWidth ?? (type === \"candlestick\" ? 1 : 2),\n pointSize: s.pointSize ?? 8,\n opacity:\n s.opacity ?? (type === \"area\" ? 0.28 : type === \"scatter\" ? 0.78 : 1),\n hidden: !!s.hidden || hidden.has(id),\n showLabels: !!s.showLabels,\n curve: s.curve ?? \"linear\",\n cols,\n barOffset: 0,\n barHalfWidth: 0,\n barBase: null,\n barTop: null,\n stackBase: null,\n stackTop: null,\n pointColors,\n upColor:\n type === \"candlestick\"\n ? resolve(s.upColor ?? DEFAULT_UP, [0.09, 0.64, 0.29, 1])\n : color,\n downColor:\n type === \"candlestick\"\n ? resolve(s.downColor ?? DEFAULT_DOWN, [0.86, 0.15, 0.15, 1])\n : color,\n cellColors,\n cellHalf: { x: 0.5, y: 0.5 },\n colorScale,\n valueRange,\n radius: s.radius ?? (type === \"heatmap\" ? 2 : 3),\n format: s.format,\n };\n });\n\n const visible = series.filter((s) => !s.hidden);\n const allScatter =\n series.length > 0 &&\n series.every((s) => s.type === \"scatter\" || s.type === \"heatmap\");\n\n // Bars: groups (one slot per stack) and stacking\n const bars = visible.filter((s) => s.type === \"bar\");\n const band = bandOf(bars, \"x\", xType === \"category\");\n if (bars.length) {\n const slots = new Map<string, number>();\n const stackId = (s: SeriesModel) =>\n input[s.index].stack ?? `\\u0000${s.key}`;\n for (const s of bars) {\n if (!slots.has(stackId(s))) slots.set(stackId(s), slots.size);\n }\n const group = band * (slots.size > 1 ? 0.78 : 0.62);\n const slotWidth = group / slots.size;\n const stacked = stackValues(\n bars.map((s) => ({ s, stack: stackId(s) })),\n false,\n );\n const percentStacked = percent\n ? stackValues(\n bars\n .filter((s) => input[s.index].stack !== undefined)\n .map((s) => ({ s, stack: stackId(s) })),\n true,\n )\n : [];\n let p = 0;\n bars.forEach((s, k) => {\n const slot = slots.get(stackId(s)) ?? 0;\n s.barOffset = -group / 2 + slotWidth * (slot + 0.5);\n s.barHalfWidth = (slotWidth / 2) * (slots.size > 1 ? 0.86 : 1);\n const values =\n percent && input[s.index].stack !== undefined\n ? percentStacked[p++]\n : stacked[k];\n s.barBase = values.base;\n s.barTop = values.top;\n });\n }\n\n // Stacked lines / areas\n const stackedLines = visible.filter(\n (s) =>\n (s.type === \"line\" || s.type === \"area\") &&\n input[s.index].stack !== undefined,\n );\n if (stackedLines.length) {\n const values = stackValues(\n stackedLines.map((s) => ({ s, stack: input[s.index].stack ?? \"\" })),\n percent,\n );\n stackedLines.forEach((s, k) => {\n s.stackBase = values[k].base;\n s.stackTop = values[k].top;\n });\n }\n\n // Candlesticks: one band per x, bodies of 60%\n const candles = visible.filter((s) => s.type === \"candlestick\");\n const candleBand = bandOf(candles, \"x\", xType === \"category\");\n for (const s of candles) s.barHalfWidth = candleBand * 0.3;\n\n // Heatmaps: cells of the size of the smallest step\n const heatmaps = visible.filter((s) => s.type === \"heatmap\");\n if (heatmaps.length) {\n const cx = bandOf(heatmaps, \"x\", xType === \"category\") / 2;\n const cy = bandOf(heatmaps, \"y\", yType === \"category\") / 2;\n for (const s of heatmaps) s.cellHalf = { x: cx, y: cy };\n }\n\n // X range\n const xOpts = options.xAxis;\n let xRange: Range;\n if (xType === \"category\") {\n xRange = [-0.5, Math.max(1, categories.length) - 0.5];\n } else {\n const values: number[] = [];\n for (const s of visible) {\n values.push(s.cols.xMin, s.cols.xMax);\n const pad =\n s.type === \"bar\"\n ? band / 2\n : s.type === \"candlestick\"\n ? candleBand / 2\n : s.type === \"heatmap\"\n ? s.cellHalf.x\n : 0;\n if (pad) values.push(s.cols.xMin - pad, s.cols.xMax + pad);\n }\n xRange = ensureSpan(\n ...extent(values),\n xType === \"time\" ? [Date.now() - 86400000, Date.now()] : [0, 1],\n );\n const pointsOnly = series.every((s) => s.type === \"scatter\");\n if (pointsOnly) {\n const pad = (xRange[1] - xRange[0]) * 0.04;\n xRange = [xRange[0] - pad, xRange[1] + pad];\n }\n const nice = xOpts?.nice ?? (pointsOnly && xType === \"linear\");\n if (nice && xType === \"linear\") {\n xRange = niceDomain(xRange[0], xRange[1], xOpts?.tickCount ?? 6);\n }\n }\n if (xOpts?.min !== undefined) xRange[0] = xOpts.min;\n if (xOpts?.max !== undefined) xRange[1] = xOpts.max;\n xRange = ensureSpan(xRange[0], xRange[1]);\n\n // Y range\n let yRange: Range;\n if (yType === \"category\") {\n yRange = [-0.5, Math.max(1, yCategories.length) - 0.5];\n } else {\n const yValues: number[] = [];\n for (const s of visible) {\n if (s.type === \"bar\" && s.barBase && s.barTop) {\n yValues.push(...extent(s.barBase), ...extent(s.barTop));\n } else if (s.stackBase && s.stackTop) {\n yValues.push(...extent(s.stackBase), ...extent(s.stackTop));\n } else if (s.type === \"heatmap\") {\n yValues.push(s.cols.yMin - s.cellHalf.y, s.cols.yMax + s.cellHalf.y);\n } else {\n yValues.push(s.cols.yMin, s.cols.yMax);\n }\n }\n const filled = bars.length > 0 || visible.some((s) => s.type === \"area\");\n if (bars.length || yOpts?.zero) yValues.push(0);\n if (bars.some((s) => s.showLabels)) {\n // room for the value labels above the tallest bar\n const [lo, hi] = extent(yValues);\n if (hi > 0) yValues.push(hi + (hi - Math.min(0, lo)) * 0.1);\n if (lo < 0) yValues.push(lo - (Math.max(0, hi) - lo) * 0.1);\n }\n yRange = ensureSpan(...extent(yValues));\n if (series.every((s) => s.type === \"scatter\")) {\n const pad = (yRange[1] - yRange[0]) * 0.06;\n yRange = [yRange[0] - pad, yRange[1] + pad];\n } else if (candles.length && !bars.length) {\n // room above / below the wicks\n const pad = (yRange[1] - yRange[0]) * 0.04;\n yRange = [yRange[0] - pad, yRange[1] + pad];\n }\n if ((yOpts?.nice ?? !heatmaps.length) && yType === \"linear\") {\n yRange = niceDomain(yRange[0], yRange[1], yOpts?.tickCount ?? 5);\n }\n if (percent && (bars.length || stackedLines.length)) {\n // 100% stacks: exactly 0-100 (or -100-100)\n yRange = [extent(yValues)[0] < 0 ? -100 : 0, 100];\n }\n if (filled && !yOpts?.zero) {\n // bars start at zero: no padding below / above it\n if (yRange[0] < 0 && extent(yValues)[0] >= 0) yRange[0] = 0;\n }\n }\n if (yOpts?.min !== undefined) yRange[0] = yOpts.min;\n if (yOpts?.max !== undefined) yRange[1] = yOpts.max;\n yRange = ensureSpan(yRange[0], yRange[1]);\n\n const zoomOption =\n options.interaction === false\n ? false\n : options.interaction === true || options.interaction === undefined\n ? true\n : (options.interaction.zoom ?? true);\n const zoomAxes =\n zoomOption === false\n ? { x: false, y: false }\n : zoomOption === true\n ? { x: true, y: allScatter }\n : { x: zoomOption.includes(\"x\"), y: zoomOption.includes(\"y\") };\n\n const tooltip =\n typeof options.tooltip === \"object\" ? options.tooltip : undefined;\n\n const yFormat =\n yOpts?.format ??\n (percent && (bars.length || stackedLines.length)\n ? (v: number) => `${+v.toFixed(1)}%`\n : undefined);\n\n return {\n series,\n x: axisModel(xOpts, xType, categories, false),\n y: {\n ...axisModel(yOpts, yType, yCategories, yType !== \"category\"),\n format: yFormat,\n },\n base: { x: xRange, y: yRange },\n allScatter,\n zoom: zoomAxes,\n tooltipMode: tooltip?.mode ?? (allScatter ? \"nearest\" : \"axis\"),\n baseline: Math.min(Math.max(0, yRange[0]), yRange[1]),\n minSpan: {\n x: xType === \"category\" ? 1 : (xRange[1] - xRange[0]) * 1e-7,\n y: yType === \"category\" ? 1 : (yRange[1] - yRange[0]) * 1e-7,\n },\n percent,\n stacks: input.map((s) =>\n s.stack !== undefined &&\n (s.type === \"bar\" || s.type === \"line\" || s.type === \"area\" || !s.type)\n ? `${s.type === \"bar\" ? \"bar\" : \"line\"}:${s.stack}`\n : null,\n ),\n };\n};\n\n/** Y value drawn for a point: its stacked top for stacks, the close for candles */\nexport const plottedY = (s: SeriesModel, i: number): number =>\n s.barTop ? s.barTop[i] : s.stackTop ? s.stackTop[i] : s.cols.y[i];\n\nconst grids = new WeakMap<SeriesColumns, GridIndex>();\n\n/** Spatial index of a scatter series, built on first use and kept with its data */\nexport const gridOf = (s: SeriesModel): GridIndex => {\n let grid = grids.get(s.cols);\n if (!grid) {\n grid = new GridIndex(s.cols.x, s.cols.y, s.cols.count);\n grids.set(s.cols, grid);\n }\n return grid;\n};\n"],"mappings":"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"}