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