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,14 +1,101 @@
1
1
  //#region src/engine/presets.ts
2
- var e = (e, t, n) => e.map((e) => ({
2
+ var e = (e, t, n, r) => e.map((e) => {
3
+ let i = e.type ?? t;
4
+ return {
5
+ ...e,
6
+ type: i,
7
+ ...n !== void 0 && i === t ? { stack: e.stack ?? n } : {},
8
+ ...r !== void 0 && (i === "line" || i === "area") ? { curve: e.curve ?? r } : {}
9
+ };
10
+ }), t = (t, n = !1, r = {}) => e(t, n ? "area" : "line", r.stacked ? "stack" : void 0, r.curve), n = (e, n = {}) => t(e, !0, n), r = (t, n = !1, r = !1) => e(t, "bar", n ? "stack" : void 0).map((e) => r && e.type === "bar" ? {
3
11
  ...e,
4
- type: e.type ?? t,
5
- ...n !== void 0 && (e.type ?? t) === "bar" ? { stack: e.stack ?? n } : {}
6
- })), t = (t, n = !1) => e(t, n ? "area" : "line"), n = (t, n = !1) => e(t, "bar", n ? "stack" : void 0), r = (t) => e(t, "scatter"), i = {
12
+ showLabels: e.showLabels ?? !0
13
+ } : e), i = (t) => e(t, "scatter"), a = (t) => e(t, "candlestick"), o = (e, t = {}) => {
14
+ let n = e.data.some((e) => typeof e.x == "number"), r = e.data.some((e) => typeof e.y == "number");
15
+ return {
16
+ ...t,
17
+ series: [{
18
+ id: "heatmap",
19
+ name: e.name ?? "Value",
20
+ type: "heatmap",
21
+ data: e.data.map((e) => ({
22
+ x: e.x,
23
+ y: e.y,
24
+ value: e.value
25
+ })),
26
+ colorScale: e.colorScale,
27
+ valueRange: e.valueRange,
28
+ radius: e.radius,
29
+ format: e.format
30
+ }],
31
+ xAxis: {
32
+ ...n ? {} : {
33
+ type: "category",
34
+ categories: e.xCategories
35
+ },
36
+ grid: !1,
37
+ ...t.xAxis
38
+ },
39
+ yAxis: {
40
+ ...r ? {} : {
41
+ type: "category",
42
+ categories: e.yCategories
43
+ },
44
+ grid: !1,
45
+ ...t.yAxis
46
+ },
47
+ legend: t.legend ?? !1,
48
+ interaction: t.interaction ?? { zoom: !1 },
49
+ tooltip: t.tooltip ?? { mode: "nearest" }
50
+ };
51
+ }, s = (e, t = {}) => {
52
+ let n = e.type ?? "line";
53
+ return {
54
+ ...t,
55
+ series: [{
56
+ id: "sparkline",
57
+ name: e.name ?? "Value",
58
+ type: n,
59
+ data: e.data,
60
+ color: e.color,
61
+ curve: n === "bar" ? void 0 : e.curve ?? "smooth",
62
+ lineWidth: 1.5,
63
+ opacity: n === "area" ? .22 : void 0,
64
+ radius: n === "bar" ? 1.5 : void 0,
65
+ format: e.format
66
+ }],
67
+ xAxis: {
68
+ visible: !1,
69
+ grid: !1,
70
+ ...t.xAxis
71
+ },
72
+ yAxis: {
73
+ visible: !1,
74
+ grid: !1,
75
+ nice: !1,
76
+ ...t.yAxis
77
+ },
78
+ legend: !1,
79
+ padding: t.padding ?? {
80
+ top: 4,
81
+ right: 4,
82
+ bottom: 4,
83
+ left: 4
84
+ },
85
+ interaction: t.interaction ?? { zoom: !1 },
86
+ annotations: e.reference === void 0 ? t.annotations : [...t.annotations ?? [], {
87
+ type: "line",
88
+ axis: "y",
89
+ value: e.reference,
90
+ dash: [2, 3]
91
+ }]
92
+ };
93
+ }, c = {
7
94
  topLeft: "var(--danger-color, #ef4444)",
8
95
  topRight: "var(--primary-color, #4f46e5)",
9
96
  bottomLeft: "var(--warning-color, #f59e0b)",
10
97
  bottomRight: "var(--text-secondary-color, #64748b)"
11
- }, a = "var(--border-strong-color, var(--border-color, #cbd5e1))", o = (e) => {
98
+ }, l = "var(--border-strong-color, var(--border-color, #cbd5e1))", u = (e) => {
12
99
  let [t, n] = e.xDomain ?? [0, 10], [r, i] = e.yDomain ?? [0, 10];
13
100
  return {
14
101
  x0: t,
@@ -18,17 +105,17 @@ var e = (e, t, n) => e.map((e) => ({
18
105
  xs: e.xSplit ?? (t + n) / 2,
19
106
  ys: e.ySplit ?? (r + i) / 2
20
107
  };
21
- }, s = (e, t, n) => {
22
- let { xs: r, ys: i } = o(e), a = e.reverseX ? t < r : t >= r;
108
+ }, d = (e, t, n) => {
109
+ let { xs: r, ys: i } = u(e), a = e.reverseX ? t < r : t >= r;
23
110
  return n >= i ? a ? "topRight" : "topLeft" : a ? "bottomRight" : "bottomLeft";
24
- }, c = (e, t) => {
25
- let { x0: n, x1: r, y0: i, y1: a, xs: s, ys: c } = o(e), l = t.endsWith("Right");
111
+ }, f = (e, t) => {
112
+ let { x0: n, x1: r, y0: i, y1: a, xs: o, ys: s } = u(e), c = t.endsWith("Right");
26
113
  return {
27
- x: (e.reverseX ? !l : l) ? (s + r) / 2 : (n + s) / 2,
28
- y: t.startsWith("top") ? (c + a) / 2 : (i + c) / 2
114
+ x: (e.reverseX ? !c : c) ? (o + r) / 2 : (n + o) / 2,
115
+ y: t.startsWith("top") ? (s + a) / 2 : (i + s) / 2
29
116
  };
30
- }, l = (e, t = {}) => {
31
- let { x0: n, x1: r, y0: c, y1: l, xs: u, ys: d } = o(e), f = !!e.reverseX, p = (t) => e.quadrants?.[t]?.color ?? i[t], m = [{
117
+ }, p = (e, t = {}) => {
118
+ let { x0: n, x1: r, y0: i, y1: a, xs: o, ys: s } = u(e), f = !!e.reverseX, p = (t) => e.quadrants?.[t]?.color ?? c[t], m = [{
32
119
  type: "scatter",
33
120
  name: e.name ?? "",
34
121
  pointSize: e.pointSize ?? 12,
@@ -39,9 +126,9 @@ var e = (e, t, n) => e.map((e) => ({
39
126
  y: t.y,
40
127
  label: t.label,
41
128
  size: t.size,
42
- color: t.color ?? p(s(e, t.x, t.y))
129
+ color: t.color ?? p(d(e, t.x, t.y))
43
130
  }))
44
- }], h = f ? [u, r] : [n, u], g = f ? [n, u] : [u, r], _ = (t, [n, r], [i, a], o) => ({
131
+ }], h = f ? [o, r] : [n, o], g = f ? [n, o] : [o, r], _ = (t, [n, r], [i, a], o) => ({
45
132
  type: "rect",
46
133
  x0: n,
47
134
  x1: r,
@@ -54,50 +141,50 @@ var e = (e, t, n) => e.map((e) => ({
54
141
  }), v = e.axisLabels ?? {}, y = f ? r : n, b = f ? n : r, x = [
55
142
  ...v.top ? [{
56
143
  type: "text",
57
- x: u,
58
- y: l,
144
+ x: o,
145
+ y: a,
59
146
  text: v.top,
60
147
  anchor: "top"
61
148
  }] : [],
62
149
  ...v.bottom ? [{
63
150
  type: "text",
64
- x: u,
65
- y: c,
151
+ x: o,
152
+ y: i,
66
153
  text: v.bottom,
67
154
  anchor: "bottom"
68
155
  }] : [],
69
156
  ...v.left ? [{
70
157
  type: "text",
71
158
  x: y,
72
- y: d,
159
+ y: s,
73
160
  text: v.left,
74
161
  anchor: "left"
75
162
  }] : [],
76
163
  ...v.right ? [{
77
164
  type: "text",
78
165
  x: b,
79
- y: d,
166
+ y: s,
80
167
  text: v.right,
81
168
  anchor: "right"
82
169
  }] : []
83
170
  ], S = [
84
- _("topLeft", h, [d, l], "top-left"),
85
- _("topRight", g, [d, l], "top-right"),
86
- _("bottomLeft", h, [c, d], "bottom-left"),
87
- _("bottomRight", g, [c, d], "bottom-right"),
171
+ _("topLeft", h, [s, a], "top-left"),
172
+ _("topRight", g, [s, a], "top-right"),
173
+ _("bottomLeft", h, [i, s], "bottom-left"),
174
+ _("bottomRight", g, [i, s], "bottom-right"),
88
175
  {
89
176
  type: "line",
90
177
  axis: "x",
91
- value: u,
178
+ value: o,
92
179
  dash: [],
93
- color: a
180
+ color: l
94
181
  },
95
182
  {
96
183
  type: "line",
97
184
  axis: "y",
98
- value: d,
185
+ value: s,
99
186
  dash: [],
100
- color: a
187
+ color: l
101
188
  },
102
189
  ...x,
103
190
  ...t.annotations ?? []
@@ -113,7 +200,7 @@ var e = (e, t, n) => e.map((e) => ({
113
200
  tooltip: t.tooltip ?? (C ? void 0 : { render: (t) => {
114
201
  let n = t.items[0];
115
202
  if (!n) return null;
116
- let r = e.quadrants?.[s(e, n.x, n.y)]?.label;
203
+ let r = e.quadrants?.[d(e, n.x, n.y)]?.label;
117
204
  return [n.label ?? e.name ?? "", r ?? ""].filter(Boolean).join("\n");
118
205
  } }),
119
206
  xAxis: {
@@ -128,8 +215,8 @@ var e = (e, t, n) => e.map((e) => ({
128
215
  ...C ? {} : { format: () => "" }
129
216
  },
130
217
  yAxis: {
131
- min: c,
132
- max: l,
218
+ min: i,
219
+ max: a,
133
220
  title: e.yLabel,
134
221
  nice: !1,
135
222
  grid: !1,
@@ -148,6 +235,6 @@ var e = (e, t, n) => e.map((e) => ({
148
235
  };
149
236
  };
150
237
  //#endregion
151
- export { i as DEFAULT_QUADRANT_COLORS, n as barSeries, t as lineSeries, c as quadrantCenter, l as quadrantChartOptions, s as quadrantOf, r as scatterSeries, e as withSeriesType };
238
+ export { c as DEFAULT_QUADRANT_COLORS, n as areaSeries, r as barSeries, a as candlestickSeries, o as heatmapChartOptions, t as lineSeries, f as quadrantCenter, p as quadrantChartOptions, d as quadrantOf, i as scatterSeries, s as sparklineOptions, e as withSeriesType };
152
239
 
153
240
  //# sourceMappingURL=presets.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"presets.js","names":["withSeriesType","series","s","type","stack","lineSeries","area","barSeries","stacked","scatterSeries","DEFAULT_QUADRANT_COLORS","DIVIDER","splits","x0","x1","config","y0","y1","quadrantOf","right","x","xs","y","ys","quadrantCenter","visualRight","corner","quadrantChartOptions","reverseX","color","p","left","rect","xa","xb","ya","yb","position","ends","visualLeft","texts","annotations","base","showTicks","interaction","item","event","region"],"sources":["../../../../charts/src/engine/presets.ts"],"sourcesContent":["// Option presets of the chart components, shared by every platform (React,\n// mini-programs, React Native): they turn component props into engine\n// options.\n\nimport type {\n ChartAnnotation,\n ChartInteractionOptions,\n ChartOptions,\n ChartSeries,\n ChartSeriesType,\n} from \"./types\";\n\n/** Gives the series without a `type` the type of the component */\nexport const withSeriesType = (\n series: readonly ChartSeries[],\n type: ChartSeriesType,\n stack?: string,\n): ChartSeries[] =>\n series.map((s) => ({\n ...s,\n type: s.type ?? type,\n ...(stack !== undefined && (s.type ?? type) === \"bar\"\n ? { stack: s.stack ?? stack }\n : {}),\n }));\n\n/** Series of a LineChart (`area` fills them) */\nexport const lineSeries = (series: readonly ChartSeries[], area = false) =>\n withSeriesType(series, area ? \"area\" : \"line\");\n\n/** Series of a BarChart (`stacked` stacks them) */\nexport const barSeries = (series: readonly ChartSeries[], stacked = false) =>\n withSeriesType(series, \"bar\", stacked ? \"stack\" : undefined);\n\n/** Series of a ScatterChart */\nexport const scatterSeries = (series: readonly ChartSeries[]) =>\n withSeriesType(series, \"scatter\");\n\n/** A point of a QuadrantChart */\nexport interface QuadrantPoint {\n /** Position on the horizontal axis */\n x: number;\n /** Position on the vertical axis */\n y: number;\n /** Text drawn next to the dot and shown in the tooltip */\n label?: string;\n /** Dot color (any CSS color); the color of its quadrant by default */\n color?: string;\n /** Dot diameter in pixels */\n size?: number;\n}\n\n/** Title and color of a quadrant */\nexport interface QuadrantRegion {\n /** Title drawn in the outer corner of the quadrant */\n label?: string;\n /** Background tint and default dot color (any CSS color) */\n color?: string;\n}\n\n/** The four quadrants of a QuadrantChart */\nexport interface QuadrantRegions {\n topLeft?: QuadrantRegion;\n topRight?: QuadrantRegion;\n bottomLeft?: QuadrantRegion;\n bottomRight?: QuadrantRegion;\n}\n\n/** A quadrant, as seen on screen */\nexport type QuadrantCorner = keyof QuadrantRegions;\n\n/** Texts at the four ends of the dividers, inside the plot */\nexport interface QuadrantAxisLabels {\n top?: string;\n bottom?: string;\n left?: string;\n right?: string;\n}\n\n/** Settings of a quadrant matrix (the props of QuadrantChart) */\nexport interface QuadrantConfig {\n /** Points to place */\n points: readonly QuadrantPoint[];\n /**\n * Range of the horizontal axis\n * @default [0, 10]\n */\n xDomain?: [number, number];\n /**\n * Range of the vertical axis\n * @default [0, 10]\n */\n yDomain?: [number, number];\n /** X value of the vertical divider (the middle of `xDomain` by default) */\n xSplit?: number;\n /** Y value of the horizontal divider (the middle of `yDomain` by default) */\n ySplit?: number;\n /** Titles and colors of the quadrants */\n quadrants?: QuadrantRegions;\n /** Title of the horizontal axis */\n xLabel?: string;\n /** Title of the vertical axis */\n yLabel?: string;\n /** Texts at the ends of the dividers, drawn inside the plot (e.g. \"Important\" at the top) */\n axisLabels?: QuadrantAxisLabels;\n /**\n * Shows the numeric ticks of the axes; `false` keeps only the matrix\n * @default true\n */\n showTicks?: boolean;\n /** Reverses the horizontal axis (e.g. \"urgent\" on the left) */\n reverseX?: boolean;\n /**\n * Draws the labels next to the dots (overlapping labels are skipped)\n * @default true\n */\n showLabels?: boolean;\n /**\n * Dot diameter in pixels\n * @default 12\n */\n pointSize?: number;\n /** Name of the points in the tooltip */\n name?: string;\n /** Lets the user drag the dots (`drag` / `drop` events) */\n draggable?: boolean;\n}\n\nexport const DEFAULT_QUADRANT_COLORS: Required<Record<QuadrantCorner, string>> =\n {\n topLeft: \"var(--danger-color, #ef4444)\",\n topRight: \"var(--primary-color, #4f46e5)\",\n bottomLeft: \"var(--warning-color, #f59e0b)\",\n bottomRight: \"var(--text-secondary-color, #64748b)\",\n };\n\nconst DIVIDER = \"var(--border-strong-color, var(--border-color, #cbd5e1))\";\n\nconst splits = (config: QuadrantConfig) => {\n const [x0, x1] = config.xDomain ?? [0, 10];\n const [y0, y1] = config.yDomain ?? [0, 10];\n return {\n x0,\n x1,\n y0,\n y1,\n xs: config.xSplit ?? (x0 + x1) / 2,\n ys: config.ySplit ?? (y0 + y1) / 2,\n };\n};\n\n/** Quadrant of a data position, as seen on screen */\nexport const quadrantOf = (\n config: Pick<\n QuadrantConfig,\n \"xDomain\" | \"yDomain\" | \"xSplit\" | \"ySplit\" | \"reverseX\"\n >,\n x: number,\n y: number,\n): QuadrantCorner => {\n const { xs, ys } = splits(config as QuadrantConfig);\n const right = config.reverseX ? x < xs : x >= xs;\n const top = y >= ys;\n return top\n ? right\n ? \"topRight\"\n : \"topLeft\"\n : right\n ? \"bottomRight\"\n : \"bottomLeft\";\n};\n\n/** Center of a quadrant in data coordinates */\nexport const quadrantCenter = (\n config: Pick<\n QuadrantConfig,\n \"xDomain\" | \"yDomain\" | \"xSplit\" | \"ySplit\" | \"reverseX\"\n >,\n corner: QuadrantCorner,\n): { x: number; y: number } => {\n const { x0, x1, y0, y1, xs, ys } = splits(config as QuadrantConfig);\n const visualRight = corner.endsWith(\"Right\");\n const dataHigh = config.reverseX ? !visualRight : visualRight;\n return {\n x: dataHigh ? (xs + x1) / 2 : (x0 + xs) / 2,\n y: corner.startsWith(\"top\") ? (ys + y1) / 2 : (y0 + ys) / 2,\n };\n};\n\n/** Engine options of a quadrant matrix */\nexport const quadrantChartOptions = (\n config: QuadrantConfig,\n base: Omit<ChartOptions, \"series\"> = {},\n): ChartOptions => {\n const { x0, x1, y0, y1, xs, ys } = splits(config);\n const reverseX = !!config.reverseX;\n const color = (corner: QuadrantCorner) =>\n config.quadrants?.[corner]?.color ?? DEFAULT_QUADRANT_COLORS[corner];\n\n const series: ChartSeries[] = [\n {\n type: \"scatter\",\n name: config.name ?? \"\",\n pointSize: config.pointSize ?? 12,\n showLabels: config.showLabels ?? true,\n opacity: 0.9,\n data: config.points.map((p) => ({\n x: p.x,\n y: p.y,\n label: p.label,\n size: p.size,\n color: p.color ?? color(quadrantOf(config, p.x, p.y)),\n })),\n },\n ];\n\n // visual left / right -> data ranges\n const left: [number, number] = reverseX ? [xs, x1] : [x0, xs];\n const right: [number, number] = reverseX ? [x0, xs] : [xs, x1];\n const rect = (\n corner: QuadrantCorner,\n [xa, xb]: [number, number],\n [ya, yb]: [number, number],\n position: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\",\n ): ChartAnnotation => ({\n type: \"rect\",\n x0: xa,\n x1: xb,\n y0: ya,\n y1: yb,\n color: color(corner),\n opacity: 0.07,\n label: config.quadrants?.[corner]?.label,\n labelPosition: position,\n });\n const ends = config.axisLabels ?? {};\n const visualLeft = reverseX ? x1 : x0;\n const visualRight = reverseX ? x0 : x1;\n const texts: ChartAnnotation[] = [\n ...(ends.top\n ? [{ type: \"text\", x: xs, y: y1, text: ends.top, anchor: \"top\" } as const]\n : []),\n ...(ends.bottom\n ? [\n {\n type: \"text\",\n x: xs,\n y: y0,\n text: ends.bottom,\n anchor: \"bottom\",\n } as const,\n ]\n : []),\n ...(ends.left\n ? [\n {\n type: \"text\",\n x: visualLeft,\n y: ys,\n text: ends.left,\n anchor: \"left\",\n } as const,\n ]\n : []),\n ...(ends.right\n ? [\n {\n type: \"text\",\n x: visualRight,\n y: ys,\n text: ends.right,\n anchor: \"right\",\n } as const,\n ]\n : []),\n ];\n\n const annotations: ChartAnnotation[] = [\n rect(\"topLeft\", left, [ys, y1], \"top-left\"),\n rect(\"topRight\", right, [ys, y1], \"top-right\"),\n rect(\"bottomLeft\", left, [y0, ys], \"bottom-left\"),\n rect(\"bottomRight\", right, [y0, ys], \"bottom-right\"),\n { type: \"line\", axis: \"x\", value: xs, dash: [], color: DIVIDER },\n { type: \"line\", axis: \"y\", value: ys, dash: [], color: DIVIDER },\n ...texts,\n ...(base.annotations ?? []),\n ];\n\n const showTicks = config.showTicks ?? true;\n const interaction: boolean | ChartInteractionOptions =\n base.interaction === false\n ? false\n : {\n zoom: false,\n ...(typeof base.interaction === \"object\" ? base.interaction : {}),\n ...(config.draggable ? { dragPoints: true } : {}),\n };\n\n return {\n ...base,\n series,\n annotations,\n tooltip:\n base.tooltip ??\n (showTicks\n ? undefined\n : {\n render: (event) => {\n const item = event.items[0];\n if (!item) return null;\n const region =\n config.quadrants?.[quadrantOf(config, item.x, item.y)]?.label;\n return [item.label ?? config.name ?? \"\", region ?? \"\"]\n .filter(Boolean)\n .join(\"\\n\");\n },\n }),\n xAxis: {\n min: x0,\n max: x1,\n title: config.xLabel,\n reverse: reverseX,\n nice: false,\n grid: false,\n tickCount: 4,\n visible: showTicks || !!config.xLabel,\n ...(showTicks ? {} : { format: () => \"\" }),\n },\n yAxis: {\n min: y0,\n max: y1,\n title: config.yLabel,\n nice: false,\n grid: false,\n tickCount: 4,\n visible: showTicks || !!config.yLabel,\n ...(showTicks ? {} : { format: () => \"\" }),\n },\n legend: base.legend ?? false,\n padding:\n base.padding ??\n (showTicks ? undefined : { top: 4, right: 4, bottom: 4, left: 4 }),\n interaction,\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"presets.js","names":["withSeriesType","series","t","s","type","stack","curve","lineSeries","area","extra","areaSeries","barSeries","stacked","labels","scatterSeries","candlestickSeries","heatmapChartOptions","numericX","config","c","numericY","base","sparklineOptions","DEFAULT_QUADRANT_COLORS","DIVIDER","splits","x0","x1","y0","y1","quadrantOf","right","x","xs","y","ys","quadrantCenter","visualRight","corner","quadrantChartOptions","reverseX","color","p","left","rect","xa","xb","ya","yb","position","ends","visualLeft","texts","annotations","showTicks","interaction","item","event","region"],"sources":["../../../../charts/src/engine/presets.ts"],"sourcesContent":["// Option presets of the chart components, shared by every platform (React,\n// mini-programs, React Native): they turn component props into engine\n// options.\n\nimport type {\n ChartAnnotation,\n ChartCurve,\n ChartInteractionOptions,\n ChartOptions,\n ChartSeries,\n ChartSeriesType,\n} from \"./types\";\n\n/** Gives the series without a `type` the type of the component */\nexport const withSeriesType = (\n series: readonly ChartSeries[],\n type: ChartSeriesType,\n stack?: string,\n curve?: ChartCurve,\n): ChartSeries[] =>\n series.map((s) => {\n const t = s.type ?? type;\n return {\n ...s,\n type: t,\n ...(stack !== undefined && t === type ? { stack: s.stack ?? stack } : {}),\n ...(curve !== undefined && (t === \"line\" || t === \"area\")\n ? { curve: s.curve ?? curve }\n : {}),\n };\n });\n\n/** Options of the line-like components */\nexport interface LineSeriesOptions {\n /** Stacks the series on top of each other */\n stacked?: boolean;\n /** Shape of the lines */\n curve?: ChartCurve;\n}\n\n/** Series of a LineChart (`area` fills them) */\nexport const lineSeries = (\n series: readonly ChartSeries[],\n area = false,\n extra: LineSeriesOptions = {},\n) =>\n withSeriesType(\n series,\n area ? \"area\" : \"line\",\n extra.stacked ? \"stack\" : undefined,\n extra.curve,\n );\n\n/** Series of an AreaChart */\nexport const areaSeries = (\n series: readonly ChartSeries[],\n extra: LineSeriesOptions = {},\n) => lineSeries(series, true, extra);\n\n/** Series of a BarChart (`stacked` stacks them, `labels` shows the values) */\nexport const barSeries = (\n series: readonly ChartSeries[],\n stacked = false,\n labels = false,\n) =>\n withSeriesType(series, \"bar\", stacked ? \"stack\" : undefined).map((s) =>\n labels && s.type === \"bar\" ? { ...s, showLabels: s.showLabels ?? true } : s,\n );\n\n/** Series of a ScatterChart */\nexport const scatterSeries = (series: readonly ChartSeries[]) =>\n withSeriesType(series, \"scatter\");\n\n/** Series of a CandlestickChart */\nexport const candlestickSeries = (series: readonly ChartSeries[]) =>\n withSeriesType(series, \"candlestick\");\n\n/** A cell of a HeatmapChart */\nexport interface HeatmapCell {\n /** Column: a category name (or a number on a numeric axis) */\n x: string | number;\n /** Row: a category name (or a number on a numeric axis) */\n y: string | number;\n /** Value mapped to the color scale; `null` leaves the cell empty */\n value: number | null;\n}\n\n/** Settings of a heatmap (the props of HeatmapChart) */\nexport interface HeatmapConfig {\n /** Cells */\n data: readonly HeatmapCell[];\n /** Column names in order (collected from the data when omitted) */\n xCategories?: readonly string[];\n /** Row names from bottom to top (collected from the data when omitted) */\n yCategories?: readonly string[];\n /** Colors from the lowest to the highest value; a ramp of the first palette color by default */\n colorScale?: readonly string[];\n /** Values at the ends of the color scale; the data range by default */\n valueRange?: readonly [number, number];\n /** Name of the value in the tooltip */\n name?: string;\n /** Corner radius of the cells, in pixels */\n radius?: number;\n /** Formats the values in the tooltip */\n format?: (value: number) => string;\n}\n\n/** Engine options of a heatmap */\nexport const heatmapChartOptions = (\n config: HeatmapConfig,\n base: Partial<ChartOptions> = {},\n): ChartOptions => {\n const numericX = config.data.some((c) => typeof c.x === \"number\");\n const numericY = config.data.some((c) => typeof c.y === \"number\");\n return {\n ...base,\n series: [\n {\n id: \"heatmap\",\n name: config.name ?? \"Value\",\n type: \"heatmap\",\n data: config.data.map((c) => ({ x: c.x, y: c.y, value: c.value })),\n colorScale: config.colorScale,\n valueRange: config.valueRange,\n radius: config.radius,\n format: config.format,\n },\n ],\n xAxis: {\n ...(numericX\n ? {}\n : { type: \"category\" as const, categories: config.xCategories }),\n grid: false,\n ...base.xAxis,\n },\n yAxis: {\n ...(numericY\n ? {}\n : { type: \"category\" as const, categories: config.yCategories }),\n grid: false,\n ...base.yAxis,\n },\n legend: base.legend ?? false,\n interaction: base.interaction ?? { zoom: false },\n tooltip: base.tooltip ?? { mode: \"nearest\" },\n };\n};\n\n/** Settings of a sparkline (the props of Sparkline) */\nexport interface SparklineConfig {\n /** Values (or `[x, y]` pairs, typed arrays, ...) */\n data: ChartSeries[\"data\"];\n /**\n * How the values are drawn\n * @default \"line\"\n */\n type?: \"line\" | \"area\" | \"bar\";\n /** Color (any CSS color); the first palette color by default */\n color?: string;\n /**\n * Shape of the line\n * @default \"smooth\"\n */\n curve?: ChartCurve;\n /** Name shown in the tooltip */\n name?: string;\n /** Draws a reference line at this value (e.g. a target or the average) */\n reference?: number;\n /** Formats the value in the tooltip */\n format?: (value: number) => string;\n}\n\n/** Engine options of a sparkline: no axes, no legend, a tooltip only */\nexport const sparklineOptions = (\n config: SparklineConfig,\n base: Partial<ChartOptions> = {},\n): ChartOptions => {\n const type = config.type ?? \"line\";\n return {\n ...base,\n series: [\n {\n id: \"sparkline\",\n name: config.name ?? \"Value\",\n type,\n data: config.data,\n color: config.color,\n curve: type === \"bar\" ? undefined : (config.curve ?? \"smooth\"),\n lineWidth: 1.5,\n opacity: type === \"area\" ? 0.22 : undefined,\n radius: type === \"bar\" ? 1.5 : undefined,\n format: config.format,\n },\n ],\n xAxis: { visible: false, grid: false, ...base.xAxis },\n yAxis: { visible: false, grid: false, nice: false, ...base.yAxis },\n legend: false,\n padding: base.padding ?? { top: 4, right: 4, bottom: 4, left: 4 },\n interaction: base.interaction ?? { zoom: false },\n annotations:\n config.reference !== undefined\n ? [\n ...(base.annotations ?? []),\n {\n type: \"line\",\n axis: \"y\",\n value: config.reference,\n dash: [2, 3],\n },\n ]\n : base.annotations,\n };\n};\n\n/** A point of a QuadrantChart */\nexport interface QuadrantPoint {\n /** Position on the horizontal axis */\n x: number;\n /** Position on the vertical axis */\n y: number;\n /** Text drawn next to the dot and shown in the tooltip */\n label?: string;\n /** Dot color (any CSS color); the color of its quadrant by default */\n color?: string;\n /** Dot diameter in pixels */\n size?: number;\n}\n\n/** Title and color of a quadrant */\nexport interface QuadrantRegion {\n /** Title drawn in the outer corner of the quadrant */\n label?: string;\n /** Background tint and default dot color (any CSS color) */\n color?: string;\n}\n\n/** The four quadrants of a QuadrantChart */\nexport interface QuadrantRegions {\n topLeft?: QuadrantRegion;\n topRight?: QuadrantRegion;\n bottomLeft?: QuadrantRegion;\n bottomRight?: QuadrantRegion;\n}\n\n/** A quadrant, as seen on screen */\nexport type QuadrantCorner = keyof QuadrantRegions;\n\n/** Texts at the four ends of the dividers, inside the plot */\nexport interface QuadrantAxisLabels {\n top?: string;\n bottom?: string;\n left?: string;\n right?: string;\n}\n\n/** Settings of a quadrant matrix (the props of QuadrantChart) */\nexport interface QuadrantConfig {\n /** Points to place */\n points: readonly QuadrantPoint[];\n /**\n * Range of the horizontal axis\n * @default [0, 10]\n */\n xDomain?: [number, number];\n /**\n * Range of the vertical axis\n * @default [0, 10]\n */\n yDomain?: [number, number];\n /** X value of the vertical divider (the middle of `xDomain` by default) */\n xSplit?: number;\n /** Y value of the horizontal divider (the middle of `yDomain` by default) */\n ySplit?: number;\n /** Titles and colors of the quadrants */\n quadrants?: QuadrantRegions;\n /** Title of the horizontal axis */\n xLabel?: string;\n /** Title of the vertical axis */\n yLabel?: string;\n /** Texts at the ends of the dividers, drawn inside the plot (e.g. \"Important\" at the top) */\n axisLabels?: QuadrantAxisLabels;\n /**\n * Shows the numeric ticks of the axes; `false` keeps only the matrix\n * @default true\n */\n showTicks?: boolean;\n /** Reverses the horizontal axis (e.g. \"urgent\" on the left) */\n reverseX?: boolean;\n /**\n * Draws the labels next to the dots (overlapping labels are skipped)\n * @default true\n */\n showLabels?: boolean;\n /**\n * Dot diameter in pixels\n * @default 12\n */\n pointSize?: number;\n /** Name of the points in the tooltip */\n name?: string;\n /** Lets the user drag the dots (`drag` / `drop` events) */\n draggable?: boolean;\n}\n\nexport const DEFAULT_QUADRANT_COLORS: Required<Record<QuadrantCorner, string>> =\n {\n topLeft: \"var(--danger-color, #ef4444)\",\n topRight: \"var(--primary-color, #4f46e5)\",\n bottomLeft: \"var(--warning-color, #f59e0b)\",\n bottomRight: \"var(--text-secondary-color, #64748b)\",\n };\n\nconst DIVIDER = \"var(--border-strong-color, var(--border-color, #cbd5e1))\";\n\nconst splits = (config: QuadrantConfig) => {\n const [x0, x1] = config.xDomain ?? [0, 10];\n const [y0, y1] = config.yDomain ?? [0, 10];\n return {\n x0,\n x1,\n y0,\n y1,\n xs: config.xSplit ?? (x0 + x1) / 2,\n ys: config.ySplit ?? (y0 + y1) / 2,\n };\n};\n\n/** Quadrant of a data position, as seen on screen */\nexport const quadrantOf = (\n config: Pick<\n QuadrantConfig,\n \"xDomain\" | \"yDomain\" | \"xSplit\" | \"ySplit\" | \"reverseX\"\n >,\n x: number,\n y: number,\n): QuadrantCorner => {\n const { xs, ys } = splits(config as QuadrantConfig);\n const right = config.reverseX ? x < xs : x >= xs;\n const top = y >= ys;\n return top\n ? right\n ? \"topRight\"\n : \"topLeft\"\n : right\n ? \"bottomRight\"\n : \"bottomLeft\";\n};\n\n/** Center of a quadrant in data coordinates */\nexport const quadrantCenter = (\n config: Pick<\n QuadrantConfig,\n \"xDomain\" | \"yDomain\" | \"xSplit\" | \"ySplit\" | \"reverseX\"\n >,\n corner: QuadrantCorner,\n): { x: number; y: number } => {\n const { x0, x1, y0, y1, xs, ys } = splits(config as QuadrantConfig);\n const visualRight = corner.endsWith(\"Right\");\n const dataHigh = config.reverseX ? !visualRight : visualRight;\n return {\n x: dataHigh ? (xs + x1) / 2 : (x0 + xs) / 2,\n y: corner.startsWith(\"top\") ? (ys + y1) / 2 : (y0 + ys) / 2,\n };\n};\n\n/** Engine options of a quadrant matrix */\nexport const quadrantChartOptions = (\n config: QuadrantConfig,\n base: Omit<ChartOptions, \"series\"> = {},\n): ChartOptions => {\n const { x0, x1, y0, y1, xs, ys } = splits(config);\n const reverseX = !!config.reverseX;\n const color = (corner: QuadrantCorner) =>\n config.quadrants?.[corner]?.color ?? DEFAULT_QUADRANT_COLORS[corner];\n\n const series: ChartSeries[] = [\n {\n type: \"scatter\",\n name: config.name ?? \"\",\n pointSize: config.pointSize ?? 12,\n showLabels: config.showLabels ?? true,\n opacity: 0.9,\n data: config.points.map((p) => ({\n x: p.x,\n y: p.y,\n label: p.label,\n size: p.size,\n color: p.color ?? color(quadrantOf(config, p.x, p.y)),\n })),\n },\n ];\n\n // visual left / right -> data ranges\n const left: [number, number] = reverseX ? [xs, x1] : [x0, xs];\n const right: [number, number] = reverseX ? [x0, xs] : [xs, x1];\n const rect = (\n corner: QuadrantCorner,\n [xa, xb]: [number, number],\n [ya, yb]: [number, number],\n position: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\",\n ): ChartAnnotation => ({\n type: \"rect\",\n x0: xa,\n x1: xb,\n y0: ya,\n y1: yb,\n color: color(corner),\n opacity: 0.07,\n label: config.quadrants?.[corner]?.label,\n labelPosition: position,\n });\n const ends = config.axisLabels ?? {};\n const visualLeft = reverseX ? x1 : x0;\n const visualRight = reverseX ? x0 : x1;\n const texts: ChartAnnotation[] = [\n ...(ends.top\n ? [{ type: \"text\", x: xs, y: y1, text: ends.top, anchor: \"top\" } as const]\n : []),\n ...(ends.bottom\n ? [\n {\n type: \"text\",\n x: xs,\n y: y0,\n text: ends.bottom,\n anchor: \"bottom\",\n } as const,\n ]\n : []),\n ...(ends.left\n ? [\n {\n type: \"text\",\n x: visualLeft,\n y: ys,\n text: ends.left,\n anchor: \"left\",\n } as const,\n ]\n : []),\n ...(ends.right\n ? [\n {\n type: \"text\",\n x: visualRight,\n y: ys,\n text: ends.right,\n anchor: \"right\",\n } as const,\n ]\n : []),\n ];\n\n const annotations: ChartAnnotation[] = [\n rect(\"topLeft\", left, [ys, y1], \"top-left\"),\n rect(\"topRight\", right, [ys, y1], \"top-right\"),\n rect(\"bottomLeft\", left, [y0, ys], \"bottom-left\"),\n rect(\"bottomRight\", right, [y0, ys], \"bottom-right\"),\n { type: \"line\", axis: \"x\", value: xs, dash: [], color: DIVIDER },\n { type: \"line\", axis: \"y\", value: ys, dash: [], color: DIVIDER },\n ...texts,\n ...(base.annotations ?? []),\n ];\n\n const showTicks = config.showTicks ?? true;\n const interaction: boolean | ChartInteractionOptions =\n base.interaction === false\n ? false\n : {\n zoom: false,\n ...(typeof base.interaction === \"object\" ? base.interaction : {}),\n ...(config.draggable ? { dragPoints: true } : {}),\n };\n\n return {\n ...base,\n series,\n annotations,\n tooltip:\n base.tooltip ??\n (showTicks\n ? undefined\n : {\n render: (event) => {\n const item = event.items[0];\n if (!item) return null;\n const region =\n config.quadrants?.[quadrantOf(config, item.x, item.y)]?.label;\n return [item.label ?? config.name ?? \"\", region ?? \"\"]\n .filter(Boolean)\n .join(\"\\n\");\n },\n }),\n xAxis: {\n min: x0,\n max: x1,\n title: config.xLabel,\n reverse: reverseX,\n nice: false,\n grid: false,\n tickCount: 4,\n visible: showTicks || !!config.xLabel,\n ...(showTicks ? {} : { format: () => \"\" }),\n },\n yAxis: {\n min: y0,\n max: y1,\n title: config.yLabel,\n nice: false,\n grid: false,\n tickCount: 4,\n visible: showTicks || !!config.yLabel,\n ...(showTicks ? {} : { format: () => \"\" }),\n },\n legend: base.legend ?? false,\n padding:\n base.padding ??\n (showTicks ? undefined : { top: 4, right: 4, bottom: 4, left: 4 }),\n interaction,\n };\n};\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- const e=require("./types.cjs"),t=require("../decimate.cjs");var n=2e4,r=(e,t)=>`rgba(${Math.round(e[0]*255)},${Math.round(e[1]*255)},${Math.round(e[2]*255)},${e[3]*t})`,i=e=>[(e&255)/255,(e>>>8&255)/255,(e>>>16&255)/255,(e>>>24&255)/255],a=e=>!Number.isFinite(e)||Math.abs(e)>=15e37,o=(e,t,n)=>{let r=0,i=t;for(;r<i;){let t=r+i>>>1;e[t*2]<n?r=t+1:i=t}return r},s=(n,s)=>{let c=null,l=e=>{let{xScale:t,xOffset:n,yScale:r,yOffset:i}=e.transform,a=e.width,o=e.height;return{px:e=>((e*t+n)*.5+.5)*a,py:e=>(1-((e*r+i)*.5+.5))*o,xRange:()=>{let e=(-1-n)/t,r=(1-n)/t;return e<r?[e,r]:[r,e]}}},u=(n,r)=>{if(!n.sorted||n.count<=r.width*2)return{points:n.points,length:n.count};let i=l(r),[a,s]=i.xRange(),c=Math.max(0,o(n.points,n.count,a)-1),u=Math.min(n.count,o(n.points,n.count,s)+1),d=t.decimateMinMax(n.points,c,u,i.px,e.GAP*.5);return{points:d.points,length:d.length}},d=(e,t)=>{let i=l(t),{points:o,length:s}=u(e,t);n.beginPath();let c=!1;for(let e=0;e<s;e++){let t=o[e*2],r=o[e*2+1];if(a(t)||a(r)){c=!1;continue}c?n.lineTo(i.px(t),i.py(r)):n.moveTo(i.px(t),i.py(r)),c=!0}n.lineWidth=e.width*t.dpr,n.lineJoin=`round`,n.lineCap=`round`,n.strokeStyle=r(e.color,1),n.stroke()},f=(e,t)=>{let i=l(t),{points:o,length:s}=u(e,t),c=i.py(e.baseline),d=n.createLinearGradient(0,0,0,c);d.addColorStop(0,r(e.color,e.opacity)),d.addColorStop(1,r(e.color,e.opacity*.3)),n.fillStyle=d,n.beginPath();let f=-1,p=0,m=()=>{f<0||(n.lineTo(p,c),n.closePath(),f=-1)};for(let e=0;e<s;e++){let t=o[e*2],r=o[e*2+1];if(a(t)||a(r)){m();continue}let s=i.px(t);f<0&&(f=e,n.moveTo(s,c)),n.lineTo(s,i.py(r)),p=s}m(),n.fill()},p=(e,t)=>{let i=l(t),o=Math.max(Math.abs(e.halfWidth*t.transform.xScale)*.5*t.width,.5),s=e.radius*t.dpr;n.fillStyle=r(e.color,1),n.beginPath();let c=e.instances;for(let t=0;t<e.count;t++){let e=c[t*3],r=c[t*3+1],l=c[t*3+2];if(a(e)||a(r)||a(l))continue;let u=i.px(e),d=i.py(r),f=i.py(l),p=Math.min(d,f),m=Math.abs(d-f),h=Math.min(s,o,m/2);h>.5&&typeof n.roundRect==`function`?n.roundRect(u-o,p,o*2,m,h):n.rect(u-o,p,o*2,m)}n.fill()},m=(e,t)=>{let o=l(t),s=t.width,c=t.height,u=new Float32Array(e.instances,0,e.count*4),d=new Uint32Array(e.instances,0,e.count*4),f=0;for(let t=0;t<Math.min(e.count,64);t++)f=Math.max(f,u[t*4+2]);f=Math.max(1,Math.round((f||2)*t.dpr*.8));let p=Math.ceil(s/f),m=Math.ceil(c/f),h=new Int32Array(p*m).fill(-1);for(let t=0;t<e.count;t++){let e=u[t*4],n=u[t*4+1];if(a(e)||a(n)||!(u[t*4+2]>0))continue;let r=Math.floor(o.px(e)/f),i=Math.floor(o.py(n)/f);r<0||i<0||r>=p||i>=m||(h[i*p+r]=t)}let g=new Map;for(let e=0;e<h.length;e++){let t=h[e];if(t<0)continue;let n=d[t*4+3],r=g.get(n);r||g.set(n,r=[]),r.push(e)}for(let[t,a]of g){n.fillStyle=r(i(t),Math.max(e.opacity,.6));for(let e of a)n.fillRect(e%p*f,Math.floor(e/p)*f,f,f)}},h=(e,t)=>{let r=l(t),i=t.width,o=t.height;if(c??(c=s?.()??null),!c){m(e,t);return}c.width=i,c.height=o;let u=c.getContext(`2d`);if(!u)return;let d=u.createImageData(i,o),f=d.data,p=new Float32Array(e.instances,0,e.count*4),h=new Uint32Array(e.instances,0,e.count*4);for(let n=0;n<e.count;n++){let s=p[n*4],c=p[n*4+1],l=p[n*4+2];if(a(s)||a(c)||!(l>0))continue;let u=r.px(s),d=r.py(c),m=Math.max(1,Math.round(l*t.dpr*.8)),g=Math.round(u-m/2),_=Math.round(d-m/2),v=h[n*4+3],y=(v>>>24&255)/255*Math.max(e.opacity,.6),b=v&255,x=v>>>8&255,S=v>>>16&255;for(let e=Math.max(0,_);e<Math.min(o,_+m);e++)for(let t=Math.max(0,g);t<Math.min(i,g+m);t++){let n=(e*i+t)*4,r=f[n+3]/255,a=y+r*(1-y);f[n]=(b*y+f[n]*r*(1-y))/a,f[n+1]=(x*y+f[n+1]*r*(1-y))/a,f[n+2]=(S*y+f[n+2]*r*(1-y))/a,f[n+3]=a*255}}u.putImageData(d,0,0),n.drawImage(c,0,0)},g=(e,t)=>{if(e.count>2e4){h(e,t);return}let o=l(t),s=new Float32Array(e.instances,0,e.count*4),c=new Uint32Array(e.instances,0,e.count*4),u=new Map;for(let t=0;t<e.count;t++){let e=c[t*4+3],n=u.get(e);n||u.set(e,n=[]),n.push(t)}let d=e.stroke*t.dpr;for(let[c,l]of u){let u=i(c);n.beginPath();for(let e of l){let r=s[e*4],i=s[e*4+1],c=s[e*4+2];if(a(r)||a(i)||!(c>0))continue;let l=o.px(r),u=o.py(i),d=c*t.dpr/2;n.moveTo(l+d,u),n.arc(l,u,d,0,Math.PI*2)}if(n.fillStyle=r(u,e.opacity),n.fill(),d>0){n.beginPath();for(let e of l){let r=s[e*4],i=s[e*4+1],c=s[e*4+2];if(a(r)||a(i)||!(c>0))continue;let l=Math.max(0,c*t.dpr/2-d/2),u=o.px(r),f=o.py(i);n.moveTo(u+l,f),n.arc(u,f,l,0,Math.PI*2)}n.lineWidth=d,n.strokeStyle=r(u,1),n.stroke()}}};return{paint(e,t,r=0,i=0){n.save(),n.setTransform(1,0,0,1,r,i),n.beginPath(),n.rect(0,0,t.width,t.height),n.clip();for(let n of e)switch(n.kind){case`line`:n.count>1&&d(n,t);break;case`area`:n.count>1&&f(n,t);break;case`bar`:p(n,t);break;default:g(n,t)}n.restore()},destroy(){c=null}}},c=e=>{let t=e.getContext(`2d`);if(!t)return null;let n=s(t,()=>typeof document>`u`?null:document.createElement(`canvas`));return{kind:`canvas2d`,canvas:e,resize(t,n){e.width=Math.max(1,t),e.height=Math.max(1,n)},render(r,i){t.setTransform(1,0,0,1,0,0),t.clearRect(0,0,e.width,e.height),n.paint(r,i)},destroy(){n.destroy(),e.width=0,e.height=0}}};exports.SCATTER_PIXEL_THRESHOLD=n,exports.createCanvas2dPainter=s,exports.createCanvas2dRenderer=c;
1
+ const e=require("../color.cjs"),t=require("./types.cjs"),n=require("../decimate.cjs");var r=2e4,i=(e,t)=>`rgba(${Math.round(e[0]*255)},${Math.round(e[1]*255)},${Math.round(e[2]*255)},${e[3]*t})`,a=e=>!Number.isFinite(e)||Math.abs(e)>=15e37,o=(e,t,n,r=2)=>{let i=0,a=t;for(;i<a;){let t=i+a>>>1;e[t*r]<n?i=t+1:a=t}return i},s=(e,t,n,r)=>{let i=new Float64Array(Math.max(0,n-t)*3),o=0,s=t=>{i[o*3]=e[t*3],i[o*3+1]=e[t*3+1],i[o*3+2]=e[t*3+2],o++},c=NaN,l=-1,u=-1,d=-1,f=-1,p=()=>{if(l<0)return;let e=[l,u,d,f].sort((e,t)=>e-t),t=-1;for(let n of e)n!==t&&s(n),t=n;l=-1};for(let i=t;i<n;i++){let t=e[i*3+1];if(a(e[i*3])||a(t)||a(e[i*3+2])){p(),c=NaN,s(i);continue}let n=Math.floor(r(e[i*3]));n!==c||l<0?(p(),c=n,l=u=d=f=i):(t<e[u*3+1]&&(u=i),t>e[d*3+1]&&(d=i),f=i)}return p(),{points:i,length:o}},c=(r,c)=>{let l=null,u=e=>{let{xScale:t,xOffset:n,yScale:r,yOffset:i}=e.transform,a=e.width,o=e.height;return{px:e=>((e*t+n)*.5+.5)*a,py:e=>(1-((e*r+i)*.5+.5))*o,xRange:()=>{let e=(-1-n)/t,r=(1-n)/t;return e<r?[e,r]:[r,e]}}},d=(e,r)=>{if(!e.sorted||e.count<=r.width*2)return{points:e.points,length:e.count};let i=u(r),[a,s]=i.xRange(),c=Math.max(0,o(e.points,e.count,a)-1),l=Math.min(e.count,o(e.points,e.count,s)+1),d=n.decimateMinMax(e.points,c,l,i.px,t.GAP*.5);return{points:d.points,length:d.length}},f=(e,t)=>{let n=u(t),{points:o,length:s}=d(e,t);r.beginPath();let c=!1;for(let e=0;e<s;e++){let t=o[e*2],i=o[e*2+1];if(a(t)||a(i)){c=!1;continue}c?r.lineTo(n.px(t),n.py(i)):r.moveTo(n.px(t),n.py(i)),c=!0}r.lineWidth=e.width*t.dpr,r.lineJoin=`round`,r.lineCap=`round`,r.strokeStyle=i(e.color,1),r.stroke()},p=(e,t)=>{let n=u(t),c=e.points,l=e.count;if(e.sorted&&e.count>t.width*2){let[t,r]=n.xRange(),i=Math.max(0,o(e.points,e.count,t,3)-1),a=Math.min(e.count,o(e.points,e.count,r,3)+1);({points:c,length:l}=s(e.points,i,a,n.px))}let d=r.createLinearGradient(0,0,0,t.height);d.addColorStop(0,i(e.color,e.opacity)),d.addColorStop(1,i(e.color,e.opacity*.25)),r.fillStyle=d,r.beginPath();let f=-1,p=e=>{if(!(f<0)){for(let t=e-1;t>=f;t--)r.lineTo(n.px(c[t*3]),n.py(c[t*3+2]));r.closePath(),f=-1}};for(let e=0;e<l;e++){let t=c[e*3],i=c[e*3+1];if(a(t)||a(i)||a(c[e*3+2])){p(e);continue}f<0?(f=e,r.moveTo(n.px(t),n.py(i))):r.lineTo(n.px(t),n.py(i))}p(l),r.fill()},m=(t,n)=>{let o=u(n),s=n.dpr,c=t.minHalf*s,l=Math.abs(t.halfWidth*n.transform.xScale)*.5*n.width,d=t.radius*s,f=new Float32Array(t.instances,0,t.count*4),p=new Uint32Array(t.instances,0,t.count*4),[m,h]=o.xRange(),g=Math.abs(t.halfWidth),_=new Map;for(let e=0;e<t.count;e++){let t=f[e*4];if(a(t)||a(f[e*4+1])||a(f[e*4+2])||t<m-g||t>h+g)continue;let n=p[e*4+3],r=_.get(n);r||_.set(n,r=[]),r.push(e)}let v=typeof r.roundRect==`function`;for(let[n,a]of _){r.fillStyle=i(e.unpackColor(n),1),r.beginPath();for(let e of a){let n=o.px(f[e*4]),i=o.py(f[e*4+1]),a=o.py(f[e*4+2]),u=Math.abs(i-a)/2,p=Math.min(1,Math.max(0,(Math.min(l,u)-3*s)/(2*s))),m=t.inset*s*p-(t.inset>0?.5*(1-p):0),h=Math.max(l-m,.5,c),g=Math.max(u-m,c);if(g<=0)continue;let _=(i+a)/2,y=Math.min(d,h,g);y>.5&&v?r.roundRect(n-h,_-g,h*2,g*2,y):r.rect(n-h,_-g,h*2,g*2)}r.fill()}},h=(t,n)=>{let o=u(n),s=n.width,c=n.height,l=new Float32Array(t.instances,0,t.count*4),d=new Uint32Array(t.instances,0,t.count*4),f=0;for(let e=0;e<Math.min(t.count,64);e++)f=Math.max(f,l[e*4+2]);f=Math.max(1,Math.round((f||2)*n.dpr*.8));let p=Math.ceil(s/f),m=Math.ceil(c/f),h=new Int32Array(p*m).fill(-1);for(let e=0;e<t.count;e++){let t=l[e*4],n=l[e*4+1];if(a(t)||a(n)||!(l[e*4+2]>0))continue;let r=Math.floor(o.px(t)/f),i=Math.floor(o.py(n)/f);r<0||i<0||r>=p||i>=m||(h[i*p+r]=e)}let g=new Map;for(let e=0;e<h.length;e++){let t=h[e];if(t<0)continue;let n=d[t*4+3],r=g.get(n);r||g.set(n,r=[]),r.push(e)}for(let[n,a]of g){r.fillStyle=i(e.unpackColor(n),Math.max(t.opacity,.6));for(let e of a)r.fillRect(e%p*f,Math.floor(e/p)*f,f,f)}},g=(e,t)=>{let n=u(t),i=t.width,o=t.height;if(l??(l=c?.()??null),!l){h(e,t);return}l.width=i,l.height=o;let s=l.getContext(`2d`);if(!s)return;let d=s.createImageData(i,o),f=d.data,p=new Float32Array(e.instances,0,e.count*4),m=new Uint32Array(e.instances,0,e.count*4);for(let r=0;r<e.count;r++){let s=p[r*4],c=p[r*4+1],l=p[r*4+2];if(a(s)||a(c)||!(l>0))continue;let u=n.px(s),d=n.py(c),h=Math.max(1,Math.round(l*t.dpr*.8)),g=Math.round(u-h/2),_=Math.round(d-h/2),v=m[r*4+3],y=(v>>>24&255)/255*Math.max(e.opacity,.6),b=v&255,x=v>>>8&255,S=v>>>16&255;for(let e=Math.max(0,_);e<Math.min(o,_+h);e++)for(let t=Math.max(0,g);t<Math.min(i,g+h);t++){let n=(e*i+t)*4,r=f[n+3]/255,a=y+r*(1-y);f[n]=(b*y+f[n]*r*(1-y))/a,f[n+1]=(x*y+f[n+1]*r*(1-y))/a,f[n+2]=(S*y+f[n+2]*r*(1-y))/a,f[n+3]=a*255}}s.putImageData(d,0,0),r.drawImage(l,0,0)},_=(t,n)=>{if(t.count>2e4){g(t,n);return}let o=u(n),s=new Float32Array(t.instances,0,t.count*4),c=new Uint32Array(t.instances,0,t.count*4),l=new Map;for(let e=0;e<t.count;e++){let t=c[e*4+3],n=l.get(t);n||l.set(t,n=[]),n.push(e)}let d=t.stroke*n.dpr;for(let[c,u]of l){let l=e.unpackColor(c);r.beginPath();for(let e of u){let t=s[e*4],i=s[e*4+1],c=s[e*4+2];if(a(t)||a(i)||!(c>0))continue;let l=o.px(t),u=o.py(i),d=c*n.dpr/2;r.moveTo(l+d,u),r.arc(l,u,d,0,Math.PI*2)}if(r.fillStyle=i(l,t.opacity),r.fill(),d>0){r.beginPath();for(let e of u){let t=s[e*4],i=s[e*4+1],c=s[e*4+2];if(a(t)||a(i)||!(c>0))continue;let l=Math.max(0,c*n.dpr/2-d/2),u=o.px(t),f=o.py(i);r.moveTo(u+l,f),r.arc(u,f,l,0,Math.PI*2)}r.lineWidth=d,r.strokeStyle=i(l,1),r.stroke()}}};return{paint(e,t,n=0,i=0){r.save(),r.setTransform(1,0,0,1,n,i),r.beginPath(),r.rect(0,0,t.width,t.height),r.clip();for(let n of e)switch(n.kind){case`line`:n.count>1&&f(n,t);break;case`area`:n.count>1&&p(n,t);break;case`bar`:m(n,t);break;default:_(n,t)}r.restore()},destroy(){l=null}}},l=e=>{let t=e.getContext(`2d`);if(!t)return null;let n=c(t,()=>typeof document>`u`?null:document.createElement(`canvas`));return{kind:`canvas2d`,canvas:e,resize(t,n){e.width=Math.max(1,t),e.height=Math.max(1,n)},render(r,i){t.setTransform(1,0,0,1,0,0),t.clearRect(0,0,e.width,e.height),n.paint(r,i)},destroy(){n.destroy(),e.width=0,e.height=0}}};exports.SCATTER_PIXEL_THRESHOLD=r,exports.createCanvas2dPainter=c,exports.createCanvas2dRenderer=l;
2
2
  //# sourceMappingURL=canvas2d.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"canvas2d.cjs","names":["decimateMinMax","GAP","require_types","require_decimate","SCATTER_PIXEL_THRESHOLD","rgba","c","alpha","unpack","packed","isGap","v","lowerBoundX","lo","hi","count","mid","points","value","createCanvas2dPainter","scratch","mapper","frame","w","h","x","xScale","xOffset","y","yScale","yOffset","a","b","visiblePoints","item","m","x0","x1","start","end","result","drawLine","ctx","pen","i","length","drawArea","base","gradient","runStart","lastX","close","px","drawBars","half","r","y0","y1","cx","top","height","radius","drawScatterCells","f","u","cell","cols","rows","owner","cy","groups","list","cells","drawScatterPixels","scratchCanvas","sctx","image","data","size","s","g","py","o","da","outA","drawScatter","stroke","color","left","items","createCanvas2dRenderer","canvas","painter","width"],"sources":["../../../../../charts/src/engine/renderers/canvas2d.ts"],"sourcesContent":["// Canvas2D backend: the fallback without GPU. Lines are decimated to a few\n// points per pixel column and very large scatter sets are written pixel by\n// pixel, so it stays usable with large data sets.\n\nimport { decimateMinMax } from \"../decimate\";\nimport type { Rgba } from \"../color\";\nimport {\n GAP,\n type ChartRenderer,\n type RenderFrame,\n type RenderItem,\n type ScatterItem,\n} from \"./types\";\n\n/** Scatter sets above this size are rasterized through ImageData */\nexport const SCATTER_PIXEL_THRESHOLD = 20000;\n\nconst rgba = (c: Rgba, alpha: number) =>\n `rgba(${Math.round(c[0] * 255)},${Math.round(c[1] * 255)},${Math.round(c[2] * 255)},${c[3] * alpha})`;\n\nconst unpack = (packed: number): Rgba => [\n (packed & 0xff) / 255,\n ((packed >>> 8) & 0xff) / 255,\n ((packed >>> 16) & 0xff) / 255,\n ((packed >>> 24) & 0xff) / 255,\n];\n\nconst isGap = (v: number) => !Number.isFinite(v) || Math.abs(v) >= GAP * 0.5;\n\n/** First point index whose relative x is >= value (sorted, interleaved) */\nconst lowerBoundX = (points: Float32Array, count: number, value: number) => {\n let lo = 0;\n let hi = count;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (points[mid * 2] < value) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n};\n\nexport interface Canvas2dPainter {\n /**\n * Draws the items in a `frame.width` x `frame.height` device-pixel area\n * whose top-left corner is at (`left`, `top`) device pixels; nothing is\n * cleared\n */\n paint(\n items: readonly RenderItem[],\n frame: RenderFrame,\n left?: number,\n top?: number,\n ): void;\n destroy(): void;\n}\n\n/**\n * Data layer drawn with any 2D context (browser canvases, mini-program\n * canvases, OffscreenCanvas). `scratchCanvas` creates the canvas used to\n * rasterize very large scatter sets; without it they are drawn as one\n * square per occupied pixel cell.\n */\nexport const createCanvas2dPainter = (\n ctx: CanvasRenderingContext2D,\n scratchCanvas?: () => HTMLCanvasElement | null,\n): Canvas2dPainter => {\n let scratch: HTMLCanvasElement | null = null;\n\n const mapper = (frame: RenderFrame) => {\n const { xScale, xOffset, yScale, yOffset } = frame.transform;\n const w = frame.width;\n const h = frame.height;\n return {\n px: (x: number) => ((x * xScale + xOffset) * 0.5 + 0.5) * w,\n py: (y: number) => (1 - ((y * yScale + yOffset) * 0.5 + 0.5)) * h,\n /** Visible relative x range */\n xRange: (): [number, number] => {\n const a = (-1 - xOffset) / xScale;\n const b = (1 - xOffset) / xScale;\n return a < b ? [a, b] : [b, a];\n },\n };\n };\n\n /** Points actually drawn: decimated when there are many per pixel */\n const visiblePoints = (\n item: Extract<RenderItem, { kind: \"line\" | \"area\" }>,\n frame: RenderFrame,\n ): { points: ArrayLike<number>; length: number } => {\n if (!item.sorted || item.count <= frame.width * 2) {\n return { points: item.points, length: item.count };\n }\n const m = mapper(frame);\n const [x0, x1] = m.xRange();\n const start = Math.max(0, lowerBoundX(item.points, item.count, x0) - 1);\n const end = Math.min(\n item.count,\n lowerBoundX(item.points, item.count, x1) + 1,\n );\n const result = decimateMinMax(item.points, start, end, m.px, GAP * 0.5);\n return { points: result.points, length: result.length };\n };\n\n const drawLine = (\n item: Extract<RenderItem, { kind: \"line\" }>,\n frame: RenderFrame,\n ) => {\n const m = mapper(frame);\n const { points, length } = visiblePoints(item, frame);\n ctx.beginPath();\n let pen = false;\n for (let i = 0; i < length; i++) {\n const x = points[i * 2];\n const y = points[i * 2 + 1];\n if (isGap(x) || isGap(y)) {\n pen = false;\n continue;\n }\n if (pen) ctx.lineTo(m.px(x), m.py(y));\n else ctx.moveTo(m.px(x), m.py(y));\n pen = true;\n }\n ctx.lineWidth = item.width * frame.dpr;\n ctx.lineJoin = \"round\";\n ctx.lineCap = \"round\";\n ctx.strokeStyle = rgba(item.color, 1);\n ctx.stroke();\n };\n\n const drawArea = (\n item: Extract<RenderItem, { kind: \"area\" }>,\n frame: RenderFrame,\n ) => {\n const m = mapper(frame);\n const { points, length } = visiblePoints(item, frame);\n const base = m.py(item.baseline);\n const gradient = ctx.createLinearGradient(0, 0, 0, base);\n gradient.addColorStop(0, rgba(item.color, item.opacity));\n gradient.addColorStop(1, rgba(item.color, item.opacity * 0.3));\n ctx.fillStyle = gradient;\n ctx.beginPath();\n let runStart = -1;\n let lastX = 0;\n const close = () => {\n if (runStart < 0) return;\n ctx.lineTo(lastX, base);\n ctx.closePath();\n runStart = -1;\n };\n for (let i = 0; i < length; i++) {\n const x = points[i * 2];\n const y = points[i * 2 + 1];\n if (isGap(x) || isGap(y)) {\n close();\n continue;\n }\n const px = m.px(x);\n if (runStart < 0) {\n runStart = i;\n ctx.moveTo(px, base);\n }\n ctx.lineTo(px, m.py(y));\n lastX = px;\n }\n close();\n ctx.fill();\n };\n\n const drawBars = (\n item: Extract<RenderItem, { kind: \"bar\" }>,\n frame: RenderFrame,\n ) => {\n const m = mapper(frame);\n const half = Math.max(\n Math.abs(item.halfWidth * frame.transform.xScale) * 0.5 * frame.width,\n 0.5,\n );\n const r = item.radius * frame.dpr;\n ctx.fillStyle = rgba(item.color, 1);\n ctx.beginPath();\n const v = item.instances;\n for (let i = 0; i < item.count; i++) {\n const x = v[i * 3];\n const y0 = v[i * 3 + 1];\n const y1 = v[i * 3 + 2];\n if (isGap(x) || isGap(y0) || isGap(y1)) continue;\n const cx = m.px(x);\n const a = m.py(y0);\n const b = m.py(y1);\n const top = Math.min(a, b);\n const height = Math.abs(a - b);\n const radius = Math.min(r, half, height / 2);\n if (radius > 0.5 && typeof ctx.roundRect === \"function\") {\n ctx.roundRect(cx - half, top, half * 2, height, radius);\n } else {\n ctx.rect(cx - half, top, half * 2, height);\n }\n }\n ctx.fill();\n };\n\n /** One square per occupied cell (the last point of a cell wins, like the GPU) */\n const drawScatterCells = (item: ScatterItem, frame: RenderFrame) => {\n const m = mapper(frame);\n const w = frame.width;\n const h = frame.height;\n const f = new Float32Array(item.instances, 0, item.count * 4);\n const u = new Uint32Array(item.instances, 0, item.count * 4);\n let cell = 0;\n for (let i = 0; i < Math.min(item.count, 64); i++)\n cell = Math.max(cell, f[i * 4 + 2]);\n cell = Math.max(1, Math.round((cell || 2) * frame.dpr * 0.8));\n const cols = Math.ceil(w / cell);\n const rows = Math.ceil(h / cell);\n const owner = new Int32Array(cols * rows).fill(-1);\n for (let i = 0; i < item.count; i++) {\n const x = f[i * 4];\n const y = f[i * 4 + 1];\n if (isGap(x) || isGap(y) || !(f[i * 4 + 2] > 0)) continue;\n const cx = Math.floor(m.px(x) / cell);\n const cy = Math.floor(m.py(y) / cell);\n if (cx < 0 || cy < 0 || cx >= cols || cy >= rows) continue;\n owner[cy * cols + cx] = i;\n }\n const groups = new Map<number, number[]>();\n for (let c = 0; c < owner.length; c++) {\n const i = owner[c];\n if (i < 0) continue;\n const packed = u[i * 4 + 3];\n let list = groups.get(packed);\n if (!list) groups.set(packed, (list = []));\n list.push(c);\n }\n for (const [packed, cells] of groups) {\n ctx.fillStyle = rgba(unpack(packed), Math.max(item.opacity, 0.6));\n for (const c of cells) {\n ctx.fillRect(\n (c % cols) * cell,\n Math.floor(c / cols) * cell,\n cell,\n cell,\n );\n }\n }\n };\n\n const drawScatterPixels = (item: ScatterItem, frame: RenderFrame) => {\n const m = mapper(frame);\n const w = frame.width;\n const h = frame.height;\n scratch ??= scratchCanvas?.() ?? null;\n if (!scratch) {\n drawScatterCells(item, frame);\n return;\n }\n scratch.width = w;\n scratch.height = h;\n const sctx = scratch.getContext(\"2d\");\n if (!sctx) return;\n const image = sctx.createImageData(w, h);\n const data = image.data;\n const f = new Float32Array(item.instances, 0, item.count * 4);\n const u = new Uint32Array(item.instances, 0, item.count * 4);\n for (let i = 0; i < item.count; i++) {\n const x = f[i * 4];\n const y = f[i * 4 + 1];\n const size = f[i * 4 + 2];\n if (isGap(x) || isGap(y) || !(size > 0)) continue;\n const cx = m.px(x);\n const cy = m.py(y);\n const s = Math.max(1, Math.round(size * frame.dpr * 0.8));\n const x0 = Math.round(cx - s / 2);\n const y0 = Math.round(cy - s / 2);\n const packed = u[i * 4 + 3];\n const alpha =\n (((packed >>> 24) & 0xff) / 255) * Math.max(item.opacity, 0.6);\n const r = packed & 0xff;\n const g = (packed >>> 8) & 0xff;\n const b = (packed >>> 16) & 0xff;\n for (let py = Math.max(0, y0); py < Math.min(h, y0 + s); py++) {\n for (let px = Math.max(0, x0); px < Math.min(w, x0 + s); px++) {\n const o = (py * w + px) * 4;\n const da = data[o + 3] / 255;\n const outA = alpha + da * (1 - alpha);\n // straight-alpha \"over\"\n data[o] = (r * alpha + data[o] * da * (1 - alpha)) / outA;\n data[o + 1] = (g * alpha + data[o + 1] * da * (1 - alpha)) / outA;\n data[o + 2] = (b * alpha + data[o + 2] * da * (1 - alpha)) / outA;\n data[o + 3] = outA * 255;\n }\n }\n }\n sctx.putImageData(image, 0, 0);\n ctx.drawImage(scratch, 0, 0);\n };\n\n const drawScatter = (item: ScatterItem, frame: RenderFrame) => {\n if (item.count > SCATTER_PIXEL_THRESHOLD) {\n drawScatterPixels(item, frame);\n return;\n }\n const m = mapper(frame);\n const f = new Float32Array(item.instances, 0, item.count * 4);\n const u = new Uint32Array(item.instances, 0, item.count * 4);\n const groups = new Map<number, number[]>();\n for (let i = 0; i < item.count; i++) {\n const packed = u[i * 4 + 3];\n let list = groups.get(packed);\n if (!list) groups.set(packed, (list = []));\n list.push(i);\n }\n const stroke = item.stroke * frame.dpr;\n for (const [packed, list] of groups) {\n const color = unpack(packed);\n ctx.beginPath();\n for (const i of list) {\n const x = f[i * 4];\n const y = f[i * 4 + 1];\n const size = f[i * 4 + 2];\n if (isGap(x) || isGap(y) || !(size > 0)) continue;\n const cx = m.px(x);\n const cy = m.py(y);\n const r = (size * frame.dpr) / 2;\n ctx.moveTo(cx + r, cy);\n ctx.arc(cx, cy, r, 0, Math.PI * 2);\n }\n ctx.fillStyle = rgba(color, item.opacity);\n ctx.fill();\n if (stroke > 0) {\n ctx.beginPath();\n for (const i of list) {\n const x = f[i * 4];\n const y = f[i * 4 + 1];\n const size = f[i * 4 + 2];\n if (isGap(x) || isGap(y) || !(size > 0)) continue;\n const r = Math.max(0, (size * frame.dpr) / 2 - stroke / 2);\n const cx = m.px(x);\n const cy = m.py(y);\n ctx.moveTo(cx + r, cy);\n ctx.arc(cx, cy, r, 0, Math.PI * 2);\n }\n ctx.lineWidth = stroke;\n ctx.strokeStyle = rgba(color, 1);\n ctx.stroke();\n }\n }\n };\n\n return {\n paint(items, frame, left = 0, top = 0) {\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, left, top);\n ctx.beginPath();\n ctx.rect(0, 0, frame.width, frame.height);\n ctx.clip();\n for (const item of items) {\n switch (item.kind) {\n case \"line\":\n if (item.count > 1) drawLine(item, frame);\n break;\n case \"area\":\n if (item.count > 1) drawArea(item, frame);\n break;\n case \"bar\":\n drawBars(item, frame);\n break;\n default:\n drawScatter(item, frame);\n break;\n }\n }\n ctx.restore();\n },\n destroy() {\n scratch = null;\n },\n };\n};\n\nexport const createCanvas2dRenderer = (\n canvas: HTMLCanvasElement,\n): ChartRenderer | null => {\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return null;\n const painter = createCanvas2dPainter(ctx, () =>\n typeof document === \"undefined\" ? null : document.createElement(\"canvas\"),\n );\n return {\n kind: \"canvas2d\",\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n painter.paint(items, frame);\n },\n destroy() {\n painter.destroy();\n canvas.width = 0;\n canvas.height = 0;\n },\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"canvas2d.cjs","names":["decimateMinMax","GAP","unpack","require_color","require_types","require_decimate","SCATTER_PIXEL_THRESHOLD","rgba","c","alpha","isGap","v","lowerBoundX","lo","hi","count","mid","points","stride","value","decimateArea","out","end","start","length","push","i","col","first","min","max","last","flush","picks","a","b","prev","y","column","createCanvas2dPainter","scratch","mapper","frame","w","h","x","xScale","xOffset","yScale","yOffset","visiblePoints","item","m","x0","x1","result","drawLine","ctx","pen","drawArea","gradient","runStart","close","k","drawBars","dpr","minHalf","rawHalf","r","u","pad","groups","packed","list","rounded","cx","rawHh","fade","inset","half","hh","cy","radius","drawScatterCells","f","cell","cols","rows","owner","cells","drawScatterPixels","scratchCanvas","sctx","image","data","size","s","y0","g","py","px","o","da","outA","drawScatter","stroke","color","left","top","items","createCanvas2dRenderer","canvas","painter","width","height"],"sources":["../../../../../charts/src/engine/renderers/canvas2d.ts"],"sourcesContent":["// Canvas2D backend: the fallback without GPU. Lines are decimated to a few\n// points per pixel column and very large scatter sets are written pixel by\n// pixel, so it stays usable with large data sets.\n\nimport { decimateMinMax } from \"../decimate\";\nimport { unpackColor as unpack, type Rgba } from \"../color\";\nimport {\n AREA_STRIDE,\n GAP,\n type AreaItem,\n type BarItem,\n type ChartRenderer,\n type RenderFrame,\n type RenderItem,\n type ScatterItem,\n} from \"./types\";\n\n/** Scatter sets above this size are rasterized through ImageData */\nexport const SCATTER_PIXEL_THRESHOLD = 20000;\n\nconst rgba = (c: Rgba, alpha: number) =>\n `rgba(${Math.round(c[0] * 255)},${Math.round(c[1] * 255)},${Math.round(c[2] * 255)},${c[3] * alpha})`;\n\nconst isGap = (v: number) => !Number.isFinite(v) || Math.abs(v) >= GAP * 0.5;\n\n/** First point index whose relative x is >= value (sorted, interleaved) */\nconst lowerBoundX = (\n points: Float32Array,\n count: number,\n value: number,\n stride = 2,\n) => {\n let lo = 0;\n let hi = count;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (points[mid * stride] < value) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n};\n\n/**\n * Min-max decimation of area points (x, top, bottom): per pixel column the\n * first, lowest, highest and last tops are kept with their bottoms\n */\nconst decimateArea = (\n points: Float32Array,\n start: number,\n end: number,\n column: (x: number) => number,\n): { points: Float64Array; length: number } => {\n const out = new Float64Array(Math.max(0, end - start) * AREA_STRIDE);\n let length = 0;\n const push = (i: number) => {\n out[length * 3] = points[i * 3];\n out[length * 3 + 1] = points[i * 3 + 1];\n out[length * 3 + 2] = points[i * 3 + 2];\n length++;\n };\n let col = NaN;\n let first = -1;\n let min = -1;\n let max = -1;\n let last = -1;\n const flush = () => {\n if (first < 0) return;\n const picks = [first, min, max, last].sort((a, b) => a - b);\n let prev = -1;\n for (const i of picks) {\n if (i !== prev) push(i);\n prev = i;\n }\n first = -1;\n };\n for (let i = start; i < end; i++) {\n const y = points[i * 3 + 1];\n if (isGap(points[i * 3]) || isGap(y) || isGap(points[i * 3 + 2])) {\n flush();\n col = NaN;\n push(i);\n continue;\n }\n const c = Math.floor(column(points[i * 3]));\n if (c !== col || first < 0) {\n flush();\n col = c;\n first = min = max = last = i;\n } else {\n if (y < points[min * 3 + 1]) min = i;\n if (y > points[max * 3 + 1]) max = i;\n last = i;\n }\n }\n flush();\n return { points: out, length };\n};\n\nexport interface Canvas2dPainter {\n /**\n * Draws the items in a `frame.width` x `frame.height` device-pixel area\n * whose top-left corner is at (`left`, `top`) device pixels; nothing is\n * cleared\n */\n paint(\n items: readonly RenderItem[],\n frame: RenderFrame,\n left?: number,\n top?: number,\n ): void;\n destroy(): void;\n}\n\n/**\n * Data layer drawn with any 2D context (browser canvases, mini-program\n * canvases, OffscreenCanvas). `scratchCanvas` creates the canvas used to\n * rasterize very large scatter sets; without it they are drawn as one\n * square per occupied pixel cell.\n */\nexport const createCanvas2dPainter = (\n ctx: CanvasRenderingContext2D,\n scratchCanvas?: () => HTMLCanvasElement | null,\n): Canvas2dPainter => {\n let scratch: HTMLCanvasElement | null = null;\n\n const mapper = (frame: RenderFrame) => {\n const { xScale, xOffset, yScale, yOffset } = frame.transform;\n const w = frame.width;\n const h = frame.height;\n return {\n px: (x: number) => ((x * xScale + xOffset) * 0.5 + 0.5) * w,\n py: (y: number) => (1 - ((y * yScale + yOffset) * 0.5 + 0.5)) * h,\n /** Visible relative x range */\n xRange: (): [number, number] => {\n const a = (-1 - xOffset) / xScale;\n const b = (1 - xOffset) / xScale;\n return a < b ? [a, b] : [b, a];\n },\n };\n };\n\n /** Points actually drawn: decimated when there are many per pixel */\n const visiblePoints = (\n item: Extract<RenderItem, { kind: \"line\" }>,\n frame: RenderFrame,\n ): { points: ArrayLike<number>; length: number } => {\n if (!item.sorted || item.count <= frame.width * 2) {\n return { points: item.points, length: item.count };\n }\n const m = mapper(frame);\n const [x0, x1] = m.xRange();\n const start = Math.max(0, lowerBoundX(item.points, item.count, x0) - 1);\n const end = Math.min(\n item.count,\n lowerBoundX(item.points, item.count, x1) + 1,\n );\n const result = decimateMinMax(item.points, start, end, m.px, GAP * 0.5);\n return { points: result.points, length: result.length };\n };\n\n const drawLine = (\n item: Extract<RenderItem, { kind: \"line\" }>,\n frame: RenderFrame,\n ) => {\n const m = mapper(frame);\n const { points, length } = visiblePoints(item, frame);\n ctx.beginPath();\n let pen = false;\n for (let i = 0; i < length; i++) {\n const x = points[i * 2];\n const y = points[i * 2 + 1];\n if (isGap(x) || isGap(y)) {\n pen = false;\n continue;\n }\n if (pen) ctx.lineTo(m.px(x), m.py(y));\n else ctx.moveTo(m.px(x), m.py(y));\n pen = true;\n }\n ctx.lineWidth = item.width * frame.dpr;\n ctx.lineJoin = \"round\";\n ctx.lineCap = \"round\";\n ctx.strokeStyle = rgba(item.color, 1);\n ctx.stroke();\n };\n\n const drawArea = (item: AreaItem, frame: RenderFrame) => {\n const m = mapper(frame);\n let points: ArrayLike<number> = item.points;\n let length = item.count;\n if (item.sorted && item.count > frame.width * 2) {\n const [x0, x1] = m.xRange();\n const start = Math.max(\n 0,\n lowerBoundX(item.points, item.count, x0, AREA_STRIDE) - 1,\n );\n const end = Math.min(\n item.count,\n lowerBoundX(item.points, item.count, x1, AREA_STRIDE) + 1,\n );\n ({ points, length } = decimateArea(item.points, start, end, m.px));\n }\n const gradient = ctx.createLinearGradient(0, 0, 0, frame.height);\n gradient.addColorStop(0, rgba(item.color, item.opacity));\n gradient.addColorStop(1, rgba(item.color, item.opacity * 0.25));\n ctx.fillStyle = gradient;\n ctx.beginPath();\n // each run without gaps: along the tops, back along the bottoms\n let runStart = -1;\n const close = (end: number) => {\n if (runStart < 0) return;\n for (let k = end - 1; k >= runStart; k--) {\n ctx.lineTo(m.px(points[k * 3]), m.py(points[k * 3 + 2]));\n }\n ctx.closePath();\n runStart = -1;\n };\n for (let i = 0; i < length; i++) {\n const x = points[i * 3];\n const y = points[i * 3 + 1];\n if (isGap(x) || isGap(y) || isGap(points[i * 3 + 2])) {\n close(i);\n continue;\n }\n if (runStart < 0) {\n runStart = i;\n ctx.moveTo(m.px(x), m.py(y));\n } else {\n ctx.lineTo(m.px(x), m.py(y));\n }\n }\n close(length);\n ctx.fill();\n };\n\n const drawBars = (item: BarItem, frame: RenderFrame) => {\n const m = mapper(frame);\n const dpr = frame.dpr;\n const minHalf = item.minHalf * dpr;\n const rawHalf =\n Math.abs(item.halfWidth * frame.transform.xScale) * 0.5 * frame.width;\n const r = item.radius * dpr;\n const f = new Float32Array(item.instances, 0, item.count * 4);\n const u = new Uint32Array(item.instances, 0, item.count * 4);\n const [x0, x1] = m.xRange();\n const pad = Math.abs(item.halfWidth);\n // one path per color\n const groups = new Map<number, number[]>();\n for (let i = 0; i < item.count; i++) {\n const x = f[i * 4];\n if (isGap(x) || isGap(f[i * 4 + 1]) || isGap(f[i * 4 + 2])) continue;\n if (x < x0 - pad || x > x1 + pad) continue;\n const packed = u[i * 4 + 3];\n let list = groups.get(packed);\n if (!list) groups.set(packed, (list = []));\n list.push(i);\n }\n const rounded = typeof ctx.roundRect === \"function\";\n for (const [packed, list] of groups) {\n ctx.fillStyle = rgba(unpack(packed), 1);\n ctx.beginPath();\n for (const i of list) {\n const cx = m.px(f[i * 4]);\n const a = m.py(f[i * 4 + 1]);\n const b = m.py(f[i * 4 + 2]);\n const rawHh = Math.abs(a - b) / 2;\n // the gap between cells fades out on small cells (like the shaders)\n const fade = Math.min(\n 1,\n Math.max(0, (Math.min(rawHalf, rawHh) - 3 * dpr) / (2 * dpr)),\n );\n const inset =\n item.inset * dpr * fade - (item.inset > 0 ? 0.5 * (1 - fade) : 0);\n const half = Math.max(rawHalf - inset, 0.5, minHalf);\n const hh = Math.max(rawHh - inset, minHalf);\n if (hh <= 0) continue;\n const cy = (a + b) / 2;\n const radius = Math.min(r, half, hh);\n if (radius > 0.5 && rounded) {\n ctx.roundRect(cx - half, cy - hh, half * 2, hh * 2, radius);\n } else {\n ctx.rect(cx - half, cy - hh, half * 2, hh * 2);\n }\n }\n ctx.fill();\n }\n };\n\n /** One square per occupied cell (the last point of a cell wins, like the GPU) */\n const drawScatterCells = (item: ScatterItem, frame: RenderFrame) => {\n const m = mapper(frame);\n const w = frame.width;\n const h = frame.height;\n const f = new Float32Array(item.instances, 0, item.count * 4);\n const u = new Uint32Array(item.instances, 0, item.count * 4);\n let cell = 0;\n for (let i = 0; i < Math.min(item.count, 64); i++)\n cell = Math.max(cell, f[i * 4 + 2]);\n cell = Math.max(1, Math.round((cell || 2) * frame.dpr * 0.8));\n const cols = Math.ceil(w / cell);\n const rows = Math.ceil(h / cell);\n const owner = new Int32Array(cols * rows).fill(-1);\n for (let i = 0; i < item.count; i++) {\n const x = f[i * 4];\n const y = f[i * 4 + 1];\n if (isGap(x) || isGap(y) || !(f[i * 4 + 2] > 0)) continue;\n const cx = Math.floor(m.px(x) / cell);\n const cy = Math.floor(m.py(y) / cell);\n if (cx < 0 || cy < 0 || cx >= cols || cy >= rows) continue;\n owner[cy * cols + cx] = i;\n }\n const groups = new Map<number, number[]>();\n for (let c = 0; c < owner.length; c++) {\n const i = owner[c];\n if (i < 0) continue;\n const packed = u[i * 4 + 3];\n let list = groups.get(packed);\n if (!list) groups.set(packed, (list = []));\n list.push(c);\n }\n for (const [packed, cells] of groups) {\n ctx.fillStyle = rgba(unpack(packed), Math.max(item.opacity, 0.6));\n for (const c of cells) {\n ctx.fillRect(\n (c % cols) * cell,\n Math.floor(c / cols) * cell,\n cell,\n cell,\n );\n }\n }\n };\n\n const drawScatterPixels = (item: ScatterItem, frame: RenderFrame) => {\n const m = mapper(frame);\n const w = frame.width;\n const h = frame.height;\n scratch ??= scratchCanvas?.() ?? null;\n if (!scratch) {\n drawScatterCells(item, frame);\n return;\n }\n scratch.width = w;\n scratch.height = h;\n const sctx = scratch.getContext(\"2d\");\n if (!sctx) return;\n const image = sctx.createImageData(w, h);\n const data = image.data;\n const f = new Float32Array(item.instances, 0, item.count * 4);\n const u = new Uint32Array(item.instances, 0, item.count * 4);\n for (let i = 0; i < item.count; i++) {\n const x = f[i * 4];\n const y = f[i * 4 + 1];\n const size = f[i * 4 + 2];\n if (isGap(x) || isGap(y) || !(size > 0)) continue;\n const cx = m.px(x);\n const cy = m.py(y);\n const s = Math.max(1, Math.round(size * frame.dpr * 0.8));\n const x0 = Math.round(cx - s / 2);\n const y0 = Math.round(cy - s / 2);\n const packed = u[i * 4 + 3];\n const alpha =\n (((packed >>> 24) & 0xff) / 255) * Math.max(item.opacity, 0.6);\n const r = packed & 0xff;\n const g = (packed >>> 8) & 0xff;\n const b = (packed >>> 16) & 0xff;\n for (let py = Math.max(0, y0); py < Math.min(h, y0 + s); py++) {\n for (let px = Math.max(0, x0); px < Math.min(w, x0 + s); px++) {\n const o = (py * w + px) * 4;\n const da = data[o + 3] / 255;\n const outA = alpha + da * (1 - alpha);\n // straight-alpha \"over\"\n data[o] = (r * alpha + data[o] * da * (1 - alpha)) / outA;\n data[o + 1] = (g * alpha + data[o + 1] * da * (1 - alpha)) / outA;\n data[o + 2] = (b * alpha + data[o + 2] * da * (1 - alpha)) / outA;\n data[o + 3] = outA * 255;\n }\n }\n }\n sctx.putImageData(image, 0, 0);\n ctx.drawImage(scratch, 0, 0);\n };\n\n const drawScatter = (item: ScatterItem, frame: RenderFrame) => {\n if (item.count > SCATTER_PIXEL_THRESHOLD) {\n drawScatterPixels(item, frame);\n return;\n }\n const m = mapper(frame);\n const f = new Float32Array(item.instances, 0, item.count * 4);\n const u = new Uint32Array(item.instances, 0, item.count * 4);\n const groups = new Map<number, number[]>();\n for (let i = 0; i < item.count; i++) {\n const packed = u[i * 4 + 3];\n let list = groups.get(packed);\n if (!list) groups.set(packed, (list = []));\n list.push(i);\n }\n const stroke = item.stroke * frame.dpr;\n for (const [packed, list] of groups) {\n const color = unpack(packed);\n ctx.beginPath();\n for (const i of list) {\n const x = f[i * 4];\n const y = f[i * 4 + 1];\n const size = f[i * 4 + 2];\n if (isGap(x) || isGap(y) || !(size > 0)) continue;\n const cx = m.px(x);\n const cy = m.py(y);\n const r = (size * frame.dpr) / 2;\n ctx.moveTo(cx + r, cy);\n ctx.arc(cx, cy, r, 0, Math.PI * 2);\n }\n ctx.fillStyle = rgba(color, item.opacity);\n ctx.fill();\n if (stroke > 0) {\n ctx.beginPath();\n for (const i of list) {\n const x = f[i * 4];\n const y = f[i * 4 + 1];\n const size = f[i * 4 + 2];\n if (isGap(x) || isGap(y) || !(size > 0)) continue;\n const r = Math.max(0, (size * frame.dpr) / 2 - stroke / 2);\n const cx = m.px(x);\n const cy = m.py(y);\n ctx.moveTo(cx + r, cy);\n ctx.arc(cx, cy, r, 0, Math.PI * 2);\n }\n ctx.lineWidth = stroke;\n ctx.strokeStyle = rgba(color, 1);\n ctx.stroke();\n }\n }\n };\n\n return {\n paint(items, frame, left = 0, top = 0) {\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, left, top);\n ctx.beginPath();\n ctx.rect(0, 0, frame.width, frame.height);\n ctx.clip();\n for (const item of items) {\n switch (item.kind) {\n case \"line\":\n if (item.count > 1) drawLine(item, frame);\n break;\n case \"area\":\n if (item.count > 1) drawArea(item, frame);\n break;\n case \"bar\":\n drawBars(item, frame);\n break;\n default:\n drawScatter(item, frame);\n break;\n }\n }\n ctx.restore();\n },\n destroy() {\n scratch = null;\n },\n };\n};\n\nexport const createCanvas2dRenderer = (\n canvas: HTMLCanvasElement,\n): ChartRenderer | null => {\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return null;\n const painter = createCanvas2dPainter(ctx, () =>\n typeof document === \"undefined\" ? null : document.createElement(\"canvas\"),\n );\n return {\n kind: \"canvas2d\",\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n painter.paint(items, frame);\n },\n destroy() {\n painter.destroy();\n canvas.width = 0;\n canvas.height = 0;\n },\n };\n};\n"],"mappings":"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"}