@iyulab/u-widgets 0.9.0 → 0.9.1
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.
- package/dist/u-widgets-charts.js +155 -143
- package/dist/u-widgets-charts.js.map +1 -1
- package/package.json +1 -1
package/dist/u-widgets-charts.js
CHANGED
|
@@ -1,78 +1,78 @@
|
|
|
1
|
-
import { css as P, LitElement as
|
|
1
|
+
import { css as P, LitElement as T, nothing as E, html as R } from "lit";
|
|
2
2
|
import { property as $, customElement as B } from "lit/decorators.js";
|
|
3
3
|
import { a as W, f as q, t as G } from "./tokens-SjA7YdRs.js";
|
|
4
4
|
import * as O from "echarts/core";
|
|
5
5
|
import { BarChart as H, LineChart as U, PieChart as Y, ScatterChart as J, RadarChart as Q, HeatmapChart as X, BoxplotChart as Z, FunnelChart as K, TreemapChart as ee } from "echarts/charts";
|
|
6
6
|
import { GridComponent as te, TooltipComponent as re, LegendComponent as ie, RadarComponent as se, MarkLineComponent as ne, VisualMapComponent as ae } from "echarts/components";
|
|
7
7
|
import { CanvasRenderer as oe } from "echarts/renderers";
|
|
8
|
-
function M(e,
|
|
9
|
-
for (const
|
|
10
|
-
const t = e[
|
|
8
|
+
function M(e, i) {
|
|
9
|
+
for (const r of i) {
|
|
10
|
+
const t = e[r.field];
|
|
11
11
|
if (t == null) continue;
|
|
12
|
-
const
|
|
13
|
-
if (Number.isNaN(
|
|
14
|
-
const
|
|
15
|
-
if (
|
|
12
|
+
const n = Number(t);
|
|
13
|
+
if (Number.isNaN(n)) continue;
|
|
14
|
+
const s = r.above === void 0 || n > r.above, u = r.below === void 0 || n < r.below;
|
|
15
|
+
if (s && u) return r;
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
18
|
function le(e) {
|
|
19
|
-
const
|
|
20
|
-
if (!
|
|
21
|
-
let
|
|
22
|
-
switch (
|
|
19
|
+
const i = e.widget, r = e.data, t = e.mapping ? W(e.mapping) : void 0, n = e.options ?? {};
|
|
20
|
+
if (!r) return {};
|
|
21
|
+
let s;
|
|
22
|
+
switch (i) {
|
|
23
23
|
case "chart.bar":
|
|
24
|
-
|
|
24
|
+
s = N(r, t, "bar", n);
|
|
25
25
|
break;
|
|
26
26
|
case "chart.line":
|
|
27
|
-
|
|
27
|
+
s = N(r, t, "line", n);
|
|
28
28
|
break;
|
|
29
29
|
case "chart.area":
|
|
30
|
-
|
|
30
|
+
s = N(r, t, "line", { ...n, _area: !0 });
|
|
31
31
|
break;
|
|
32
32
|
case "chart.pie":
|
|
33
|
-
|
|
33
|
+
s = ue(r, t, n);
|
|
34
34
|
break;
|
|
35
35
|
case "chart.scatter":
|
|
36
|
-
|
|
36
|
+
s = ce(r, t, n);
|
|
37
37
|
break;
|
|
38
38
|
case "chart.radar":
|
|
39
|
-
|
|
39
|
+
s = fe(r, t);
|
|
40
40
|
break;
|
|
41
41
|
case "chart.heatmap":
|
|
42
|
-
|
|
42
|
+
s = ye(r, t, n);
|
|
43
43
|
break;
|
|
44
44
|
case "chart.box":
|
|
45
|
-
|
|
45
|
+
s = he(r, t);
|
|
46
46
|
break;
|
|
47
47
|
case "chart.funnel":
|
|
48
|
-
|
|
48
|
+
s = me(r, t);
|
|
49
49
|
break;
|
|
50
50
|
case "chart.waterfall":
|
|
51
|
-
|
|
51
|
+
s = de(r, t);
|
|
52
52
|
break;
|
|
53
53
|
case "chart.treemap":
|
|
54
|
-
|
|
54
|
+
s = be(r);
|
|
55
55
|
break;
|
|
56
56
|
case "chart.histogram":
|
|
57
|
-
|
|
57
|
+
s = pe(r, t, n);
|
|
58
58
|
break;
|
|
59
59
|
default:
|
|
60
60
|
return {};
|
|
61
61
|
}
|
|
62
|
-
|
|
63
|
-
const u =
|
|
64
|
-
L(
|
|
65
|
-
const h =
|
|
66
|
-
return h && typeof h == "object" && (
|
|
62
|
+
n.legend === !1 && s.legend && (s.legend = { ...s.legend, show: !1 }), n.grid === !1 && (s.xAxis && typeof s.xAxis == "object" && !Array.isArray(s.xAxis) && (s.xAxis = { ...s.xAxis, splitLine: { show: !1 } }), s.yAxis && typeof s.yAxis == "object" && !Array.isArray(s.yAxis) && (s.yAxis = { ...s.yAxis, splitLine: { show: !1 } })), n.animate === !1 && (s.animation = !1), Array.isArray(n.colors) && n.colors.length > 0 && (s.color = n.colors);
|
|
63
|
+
const u = n.locale;
|
|
64
|
+
L(s, "xAxis", n.xFormat, u), L(s, "yAxis", n.yFormat, u);
|
|
65
|
+
const h = n.echarts;
|
|
66
|
+
return h && typeof h == "object" && (s = V(s, h)), s;
|
|
67
67
|
}
|
|
68
|
-
function N(e,
|
|
68
|
+
function N(e, i, r, t) {
|
|
69
69
|
if (!Array.isArray(e)) return {};
|
|
70
|
-
const
|
|
71
|
-
if (!
|
|
72
|
-
const u = e.map((a) => String(a[
|
|
70
|
+
const n = i?.x ?? C(e), s = i?.y ?? [_(e)].filter(Boolean);
|
|
71
|
+
if (!n || s.length === 0) return {};
|
|
72
|
+
const u = e.map((a) => String(a[n] ?? "")), h = !!t.horizontal, d = Array.isArray(t.series) ? t.series : [], m = t.conditionalStyles, f = s.map((a, l) => {
|
|
73
73
|
const c = {
|
|
74
74
|
name: a,
|
|
75
|
-
type:
|
|
75
|
+
type: r,
|
|
76
76
|
data: e.map((p) => {
|
|
77
77
|
const w = p[a] ?? null;
|
|
78
78
|
if (m?.length) {
|
|
@@ -105,7 +105,7 @@ function N(e, r, i, t) {
|
|
|
105
105
|
series: f,
|
|
106
106
|
tooltip: { trigger: "axis" }
|
|
107
107
|
};
|
|
108
|
-
if (
|
|
108
|
+
if (s.length > 1) {
|
|
109
109
|
const a = f.map((l) => l.name);
|
|
110
110
|
b.legend = { data: a };
|
|
111
111
|
}
|
|
@@ -124,10 +124,10 @@ function N(e, r, i, t) {
|
|
|
124
124
|
})
|
|
125
125
|
}), b;
|
|
126
126
|
}
|
|
127
|
-
function ce(e,
|
|
127
|
+
function ce(e, i, r) {
|
|
128
128
|
if (!Array.isArray(e)) return {};
|
|
129
|
-
const t = I(e),
|
|
130
|
-
if (!
|
|
129
|
+
const t = I(e), n = i?.x ?? t[0], s = (i?.y ?? [t[1]])[0], u = i?.color, h = i?.size, d = i?.opacity;
|
|
130
|
+
if (!n || !s) return {};
|
|
131
131
|
const m = {
|
|
132
132
|
xAxis: { type: "value" },
|
|
133
133
|
yAxis: { type: "value" },
|
|
@@ -139,8 +139,8 @@ function ce(e, r, i) {
|
|
|
139
139
|
const l = Number(a[d] ?? 0);
|
|
140
140
|
l < f && (f = l), l > x && (x = l);
|
|
141
141
|
}
|
|
142
|
-
const g = x - f || 1, A =
|
|
143
|
-
const l = [Number(a[
|
|
142
|
+
const g = x - f || 1, A = r.conditionalStyles, y = (a) => {
|
|
143
|
+
const l = [Number(a[n] ?? 0), Number(a[s] ?? 0)];
|
|
144
144
|
if (h && l.push(Number(a[h] ?? 0)), A?.length) {
|
|
145
145
|
const c = M(a, A);
|
|
146
146
|
if (c) {
|
|
@@ -178,7 +178,7 @@ function ce(e, r, i) {
|
|
|
178
178
|
const l = { type: "scatter", data: e.map((c) => y(c)) };
|
|
179
179
|
b && (l.symbolSize = b), m.series = [l];
|
|
180
180
|
}
|
|
181
|
-
const S =
|
|
181
|
+
const S = r.referenceLines;
|
|
182
182
|
if (Array.isArray(S) && S.length > 0) {
|
|
183
183
|
const a = m.series[0];
|
|
184
184
|
a.markLine = {
|
|
@@ -194,26 +194,26 @@ function ce(e, r, i) {
|
|
|
194
194
|
}
|
|
195
195
|
return m;
|
|
196
196
|
}
|
|
197
|
-
function ue(e,
|
|
197
|
+
function ue(e, i, r) {
|
|
198
198
|
if (!Array.isArray(e)) return {};
|
|
199
|
-
const t =
|
|
200
|
-
if (!t || !
|
|
201
|
-
const
|
|
199
|
+
const t = i?.label ?? C(e), n = i?.value ?? _(e);
|
|
200
|
+
if (!t || !n) return {};
|
|
201
|
+
const s = e.map((f) => ({
|
|
202
202
|
name: String(f[t] ?? ""),
|
|
203
|
-
value: Number(f[
|
|
203
|
+
value: Number(f[n] ?? 0)
|
|
204
204
|
})), h = {
|
|
205
205
|
type: "pie",
|
|
206
|
-
radius:
|
|
207
|
-
data:
|
|
206
|
+
radius: r.donut ? ["40%", "70%"] : "50%",
|
|
207
|
+
data: s,
|
|
208
208
|
label: { overflow: "truncate", width: 80 }
|
|
209
209
|
};
|
|
210
|
-
|
|
210
|
+
r.showLabel === !1 && (h.label = { show: !1 });
|
|
211
211
|
const d = {
|
|
212
212
|
tooltip: { trigger: "item" },
|
|
213
213
|
legend: { orient: "vertical", left: "left" },
|
|
214
214
|
series: [h]
|
|
215
|
-
}, m =
|
|
216
|
-
if (
|
|
215
|
+
}, m = r.center;
|
|
216
|
+
if (r.donut && m && (m.label || m.value)) {
|
|
217
217
|
const f = [];
|
|
218
218
|
m.label && f.push({
|
|
219
219
|
type: "text",
|
|
@@ -227,20 +227,20 @@ function ue(e, r, i) {
|
|
|
227
227
|
}
|
|
228
228
|
return d;
|
|
229
229
|
}
|
|
230
|
-
function fe(e,
|
|
230
|
+
function fe(e, i, r) {
|
|
231
231
|
if (!Array.isArray(e)) return {};
|
|
232
|
-
const t =
|
|
233
|
-
if (!t ||
|
|
234
|
-
const
|
|
232
|
+
const t = i?.axis ?? C(e), n = i?.y ?? I(e);
|
|
233
|
+
if (!t || n.length === 0) return {};
|
|
234
|
+
const s = e.map((h) => ({
|
|
235
235
|
name: String(h[t] ?? "")
|
|
236
|
-
})), u =
|
|
236
|
+
})), u = n.map((h) => ({
|
|
237
237
|
name: h,
|
|
238
238
|
value: e.map((d) => Number(d[h] ?? 0))
|
|
239
239
|
}));
|
|
240
240
|
return {
|
|
241
241
|
tooltip: {},
|
|
242
|
-
legend: { data:
|
|
243
|
-
radar: { indicator:
|
|
242
|
+
legend: { data: n },
|
|
243
|
+
radar: { indicator: s },
|
|
244
244
|
series: [
|
|
245
245
|
{
|
|
246
246
|
type: "radar",
|
|
@@ -249,9 +249,9 @@ function fe(e, r, i) {
|
|
|
249
249
|
]
|
|
250
250
|
};
|
|
251
251
|
}
|
|
252
|
-
function ye(e,
|
|
252
|
+
function ye(e, i, r) {
|
|
253
253
|
if (!Array.isArray(e)) return {};
|
|
254
|
-
const t = e[0] ?? {},
|
|
254
|
+
const t = e[0] ?? {}, n = Object.keys(t), s = n.filter((o) => typeof t[o] == "string"), u = n.filter((o) => typeof t[o] == "number"), h = i?.x ?? s[0], d = i?.y?.[0] ?? s.find((o) => o !== h), m = i?.value ?? u[0];
|
|
255
255
|
if (!h || !d || !m) return {};
|
|
256
256
|
const f = [], x = [], g = /* @__PURE__ */ new Set(), A = /* @__PURE__ */ new Set();
|
|
257
257
|
for (const o of e) {
|
|
@@ -269,13 +269,13 @@ function ye(e, r, i) {
|
|
|
269
269
|
S.push([p, w, v]), v != null && (v < a && (a = v), v > l && (l = v));
|
|
270
270
|
}
|
|
271
271
|
isFinite(a) || (a = 0, l = 1);
|
|
272
|
-
const c =
|
|
272
|
+
const c = r.colorRange ?? ["#313695", "#4575b4", "#74add1", "#abd9e9", "#fee090", "#fdae61", "#f46d43", "#d73027"];
|
|
273
273
|
return {
|
|
274
274
|
xAxis: { type: "category", data: f, splitArea: { show: !0 } },
|
|
275
275
|
yAxis: { type: "category", data: x, splitArea: { show: !0 } },
|
|
276
276
|
visualMap: {
|
|
277
|
-
min:
|
|
278
|
-
max:
|
|
277
|
+
min: r.min != null ? Number(r.min) : a,
|
|
278
|
+
max: r.max != null ? Number(r.max) : l,
|
|
279
279
|
calculable: !0,
|
|
280
280
|
orient: "horizontal",
|
|
281
281
|
left: "center",
|
|
@@ -293,16 +293,16 @@ function ye(e, r, i) {
|
|
|
293
293
|
series: [{
|
|
294
294
|
type: "heatmap",
|
|
295
295
|
data: S,
|
|
296
|
-
label: { show:
|
|
296
|
+
label: { show: r.showLabel !== !1 }
|
|
297
297
|
}]
|
|
298
298
|
};
|
|
299
299
|
}
|
|
300
|
-
function he(e,
|
|
300
|
+
function he(e, i, r) {
|
|
301
301
|
if (!Array.isArray(e) || e.length === 0) return {};
|
|
302
|
-
const t = e[0] ?? {},
|
|
302
|
+
const t = e[0] ?? {}, n = Object.keys(t), s = n.filter((g) => typeof t[g] == "string"), u = n.filter((g) => typeof t[g] == "number"), h = i?.x ?? s[0];
|
|
303
303
|
let d;
|
|
304
|
-
if (
|
|
305
|
-
d =
|
|
304
|
+
if (i?.y && i.y.length >= 5)
|
|
305
|
+
d = i.y.slice(0, 5);
|
|
306
306
|
else {
|
|
307
307
|
const A = ["min", "q1", "median", "q3", "max"].filter((y) => u.includes(y));
|
|
308
308
|
d = A.length === 5 ? A : u.slice(0, 5);
|
|
@@ -321,42 +321,42 @@ function he(e, r, i) {
|
|
|
321
321
|
}
|
|
322
322
|
function C(e) {
|
|
323
323
|
if (e.length === 0) return;
|
|
324
|
-
const
|
|
325
|
-
return Object.keys(
|
|
324
|
+
const i = e[0];
|
|
325
|
+
return Object.keys(i).find((r) => typeof i[r] == "string");
|
|
326
326
|
}
|
|
327
327
|
function _(e) {
|
|
328
328
|
if (e.length === 0) return;
|
|
329
|
-
const
|
|
330
|
-
return Object.keys(
|
|
329
|
+
const i = e[0];
|
|
330
|
+
return Object.keys(i).find((r) => typeof i[r] == "number");
|
|
331
331
|
}
|
|
332
|
-
function me(e,
|
|
332
|
+
function me(e, i, r) {
|
|
333
333
|
if (!Array.isArray(e)) return {};
|
|
334
|
-
const t =
|
|
335
|
-
if (!t || !
|
|
336
|
-
const
|
|
334
|
+
const t = i?.label ?? C(e), n = i?.value ?? _(e);
|
|
335
|
+
if (!t || !n) return {};
|
|
336
|
+
const s = e.map((u) => ({
|
|
337
337
|
name: String(u[t] ?? ""),
|
|
338
|
-
value: Number(u[
|
|
338
|
+
value: Number(u[n] ?? 0)
|
|
339
339
|
}));
|
|
340
340
|
return {
|
|
341
341
|
tooltip: { trigger: "item", formatter: "{b}: {c} ({d}%)" },
|
|
342
342
|
legend: { orient: "vertical", left: "left" },
|
|
343
343
|
series: [{
|
|
344
344
|
type: "funnel",
|
|
345
|
-
data:
|
|
345
|
+
data: s,
|
|
346
346
|
sort: "descending",
|
|
347
347
|
gap: 2,
|
|
348
348
|
label: { show: !0, position: "inside" }
|
|
349
349
|
}]
|
|
350
350
|
};
|
|
351
351
|
}
|
|
352
|
-
function de(e,
|
|
352
|
+
function de(e, i, r) {
|
|
353
353
|
if (!Array.isArray(e)) return {};
|
|
354
|
-
const t = e,
|
|
355
|
-
if (!
|
|
354
|
+
const t = e, n = i?.x ?? C(t), s = (i?.y ?? [_(t)])[0];
|
|
355
|
+
if (!n || !s) return {};
|
|
356
356
|
const u = [], h = [], d = [], m = [];
|
|
357
357
|
let f = 0;
|
|
358
358
|
for (const x of t) {
|
|
359
|
-
const g = String(x[
|
|
359
|
+
const g = String(x[n] ?? ""), A = Number(x[s] ?? 0);
|
|
360
360
|
u.push(g), A >= 0 ? (h.push(f), d.push(A), m.push(null)) : (h.push(f + A), d.push(null), m.push(Math.abs(A))), f += A;
|
|
361
361
|
}
|
|
362
362
|
return {
|
|
@@ -387,14 +387,14 @@ function de(e, r, i) {
|
|
|
387
387
|
]
|
|
388
388
|
};
|
|
389
389
|
}
|
|
390
|
-
function be(e,
|
|
390
|
+
function be(e, i) {
|
|
391
391
|
if (!Array.isArray(e)) return {};
|
|
392
|
-
const
|
|
392
|
+
const r = e.map((t) => j(t));
|
|
393
393
|
return {
|
|
394
394
|
tooltip: { trigger: "item" },
|
|
395
395
|
series: [{
|
|
396
396
|
type: "treemap",
|
|
397
|
-
data:
|
|
397
|
+
data: r,
|
|
398
398
|
leafDepth: 1,
|
|
399
399
|
roam: !1,
|
|
400
400
|
label: { show: !0, formatter: "{b}" }
|
|
@@ -402,31 +402,31 @@ function be(e, r) {
|
|
|
402
402
|
};
|
|
403
403
|
}
|
|
404
404
|
function j(e) {
|
|
405
|
-
const
|
|
405
|
+
const i = {
|
|
406
406
|
name: String(e.name ?? ""),
|
|
407
407
|
value: Number(e.value ?? 0)
|
|
408
408
|
};
|
|
409
|
-
return Array.isArray(e.children) && (
|
|
409
|
+
return Array.isArray(e.children) && (i.children = e.children.map((r) => j(r))), i;
|
|
410
410
|
}
|
|
411
|
-
function pe(e,
|
|
411
|
+
function pe(e, i, r) {
|
|
412
412
|
let t;
|
|
413
413
|
if (!Array.isArray(e) || e.length === 0) return {};
|
|
414
414
|
if (typeof e[0] == "number")
|
|
415
415
|
t = e;
|
|
416
416
|
else {
|
|
417
|
-
const y =
|
|
417
|
+
const y = i?.value ?? _(e);
|
|
418
418
|
if (!y) return {};
|
|
419
419
|
t = e.map((b) => Number(b[y] ?? 0));
|
|
420
420
|
}
|
|
421
421
|
if (t.length === 0) return {};
|
|
422
|
-
const
|
|
423
|
-
for (let y = 0; y <
|
|
424
|
-
const b =
|
|
422
|
+
const n = typeof r.bins == "number" ? r.bins : Math.ceil(Math.log2(t.length) + 1), s = Math.min(...t), d = (Math.max(...t) - s) / n || 1, m = new Array(n).fill(0), f = [];
|
|
423
|
+
for (let y = 0; y < n; y++) {
|
|
424
|
+
const b = s + y * d, S = s + (y + 1) * d, a = (l) => Number.isInteger(l) ? String(l) : l.toFixed(1);
|
|
425
425
|
f.push(`${a(b)}–${a(S)}`);
|
|
426
426
|
}
|
|
427
427
|
for (const y of t) {
|
|
428
|
-
let b = Math.floor((y -
|
|
429
|
-
b >=
|
|
428
|
+
let b = Math.floor((y - s) / d);
|
|
429
|
+
b >= n && (b = n - 1), m[b]++;
|
|
430
430
|
}
|
|
431
431
|
const x = {
|
|
432
432
|
type: "bar",
|
|
@@ -437,7 +437,7 @@ function pe(e, r, i) {
|
|
|
437
437
|
yAxis: { type: "value" },
|
|
438
438
|
series: [x],
|
|
439
439
|
tooltip: { trigger: "axis" }
|
|
440
|
-
}, A =
|
|
440
|
+
}, A = r.referenceLines;
|
|
441
441
|
return Array.isArray(A) && A.length > 0 && (x.markLine = {
|
|
442
442
|
silent: !0,
|
|
443
443
|
symbol: "none",
|
|
@@ -451,52 +451,52 @@ function pe(e, r, i) {
|
|
|
451
451
|
}
|
|
452
452
|
function I(e) {
|
|
453
453
|
if (e.length === 0) return [];
|
|
454
|
-
const
|
|
455
|
-
return Object.keys(
|
|
454
|
+
const i = e[0];
|
|
455
|
+
return Object.keys(i).filter((r) => typeof i[r] == "number");
|
|
456
456
|
}
|
|
457
|
-
function V(e,
|
|
458
|
-
const
|
|
459
|
-
for (const t of Object.keys(
|
|
460
|
-
const
|
|
461
|
-
z(
|
|
457
|
+
function V(e, i) {
|
|
458
|
+
const r = { ...e };
|
|
459
|
+
for (const t of Object.keys(i)) {
|
|
460
|
+
const n = e[t], s = i[t];
|
|
461
|
+
z(n) && z(s) ? r[t] = V(n, s) : r[t] = s;
|
|
462
462
|
}
|
|
463
|
-
return
|
|
463
|
+
return r;
|
|
464
464
|
}
|
|
465
465
|
function z(e) {
|
|
466
466
|
return e != null && typeof e == "object" && !Array.isArray(e);
|
|
467
467
|
}
|
|
468
|
-
function xe(e,
|
|
469
|
-
return (
|
|
468
|
+
function xe(e, i) {
|
|
469
|
+
return (r) => {
|
|
470
470
|
let t;
|
|
471
471
|
if (e.type) {
|
|
472
|
-
const
|
|
473
|
-
t = q(
|
|
472
|
+
const n = e.type === "currency" && e.currency ? `currency:${e.currency}` : e.type;
|
|
473
|
+
t = q(r, n, i), e.type === "percent" && (t = typeof r == "number" ? new Intl.NumberFormat(i, { maximumFractionDigits: e.decimals ?? 2 }).format(r) + "%" : String(r) + "%");
|
|
474
474
|
} else
|
|
475
|
-
t = String(
|
|
475
|
+
t = String(r);
|
|
476
476
|
if (e.decimals !== void 0 && e.type === "number") {
|
|
477
|
-
const
|
|
478
|
-
isNaN(
|
|
477
|
+
const n = Number(r);
|
|
478
|
+
isNaN(n) || (t = new Intl.NumberFormat(i, {
|
|
479
479
|
minimumFractionDigits: e.decimals,
|
|
480
480
|
maximumFractionDigits: e.decimals
|
|
481
|
-
}).format(
|
|
481
|
+
}).format(n));
|
|
482
482
|
}
|
|
483
483
|
return e.prefix && (t = e.prefix + t), e.suffix && (t = t + e.suffix), t;
|
|
484
484
|
};
|
|
485
485
|
}
|
|
486
|
-
function L(e,
|
|
487
|
-
if (!
|
|
488
|
-
const
|
|
489
|
-
if (Array.isArray(
|
|
490
|
-
e[
|
|
491
|
-
else if (z(
|
|
492
|
-
const u =
|
|
493
|
-
e[
|
|
486
|
+
function L(e, i, r, t) {
|
|
487
|
+
if (!r || !e[i]) return;
|
|
488
|
+
const n = xe(r, t), s = e[i];
|
|
489
|
+
if (Array.isArray(s))
|
|
490
|
+
e[i] = s.map((u) => u.type === "value" ? { ...u, axisLabel: { ...u.axisLabel ?? {}, formatter: n } } : u);
|
|
491
|
+
else if (z(s)) {
|
|
492
|
+
const u = s;
|
|
493
|
+
e[i] = { ...u, axisLabel: { ...u.axisLabel ?? {}, formatter: n } };
|
|
494
494
|
}
|
|
495
495
|
}
|
|
496
|
-
var ge = Object.defineProperty, Ae = Object.getOwnPropertyDescriptor, D = (e,
|
|
497
|
-
for (var
|
|
498
|
-
(u = e[
|
|
499
|
-
return t &&
|
|
496
|
+
var ge = Object.defineProperty, Ae = Object.getOwnPropertyDescriptor, D = (e, i, r, t) => {
|
|
497
|
+
for (var n = t > 1 ? void 0 : t ? Ae(i, r) : i, s = e.length - 1, u; s >= 0; s--)
|
|
498
|
+
(u = e[s]) && (n = (t ? u(i, r, n) : u(n)) || n);
|
|
499
|
+
return t && n && ge(i, r, n), n;
|
|
500
500
|
};
|
|
501
501
|
O.use([
|
|
502
502
|
H,
|
|
@@ -516,14 +516,14 @@ O.use([
|
|
|
516
516
|
ae,
|
|
517
517
|
oe
|
|
518
518
|
]);
|
|
519
|
-
let k = class extends
|
|
519
|
+
let k = class extends T {
|
|
520
520
|
constructor() {
|
|
521
521
|
super(...arguments), this.spec = null, this._chart = null, this._container = null, this._resizeObserver = null;
|
|
522
522
|
}
|
|
523
523
|
render() {
|
|
524
|
-
if (!this.spec) return
|
|
524
|
+
if (!this.spec) return E;
|
|
525
525
|
const e = this.spec.title ?? `${this.spec.widget} chart`;
|
|
526
|
-
return
|
|
526
|
+
return R`<div class="chart-container" part="chart" role="img" aria-label=${e}></div>`;
|
|
527
527
|
}
|
|
528
528
|
firstUpdated() {
|
|
529
529
|
this._container = this.shadowRoot?.querySelector(".chart-container"), this._initChart(), this._container && (this._resizeObserver = new ResizeObserver(() => this._chart?.resize()), this._resizeObserver.observe(this._container));
|
|
@@ -543,7 +543,7 @@ let k = class extends E {
|
|
|
543
543
|
}
|
|
544
544
|
_onChartClick(e) {
|
|
545
545
|
if (!this.spec) return;
|
|
546
|
-
const
|
|
546
|
+
const i = {
|
|
547
547
|
type: "select",
|
|
548
548
|
widget: this.spec.widget,
|
|
549
549
|
id: this.spec.id,
|
|
@@ -556,7 +556,7 @@ let k = class extends E {
|
|
|
556
556
|
};
|
|
557
557
|
this.dispatchEvent(
|
|
558
558
|
new CustomEvent("u-widget-internal", {
|
|
559
|
-
detail:
|
|
559
|
+
detail: i,
|
|
560
560
|
bubbles: !0,
|
|
561
561
|
composed: !0
|
|
562
562
|
})
|
|
@@ -564,30 +564,42 @@ let k = class extends E {
|
|
|
564
564
|
}
|
|
565
565
|
_updateChart() {
|
|
566
566
|
if (!this._chart || !this.spec) return;
|
|
567
|
-
const e = le(this.spec)
|
|
568
|
-
|
|
567
|
+
const e = le(this.spec);
|
|
568
|
+
if (!(Array.isArray(
|
|
569
|
+
this.spec.options?.colors
|
|
570
|
+
) && this.spec.options.colors.length > 0)) {
|
|
571
|
+
const r = this._readThemeColors();
|
|
572
|
+
r.length > 0 && (e.color = r);
|
|
573
|
+
}
|
|
574
|
+
this._readCSSVar("--u-widget-bg") && (e.backgroundColor = "transparent"), this._applyThemeStyle(e), this._chart.setOption(e, !0);
|
|
569
575
|
}
|
|
570
576
|
_applyThemeStyle(e) {
|
|
571
|
-
const
|
|
572
|
-
if (!
|
|
573
|
-
e.textStyle = { ...e.textStyle, color:
|
|
574
|
-
const
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
577
|
+
const i = this._readCSSVar("--u-widget-text"), r = this._readCSSVar("--u-widget-text-secondary"), t = this._readCSSVar("--u-widget-border");
|
|
578
|
+
if (!i) return;
|
|
579
|
+
e.textStyle = { ...e.textStyle, color: i };
|
|
580
|
+
const n = (s) => {
|
|
581
|
+
if (!s || typeof s != "object") return s;
|
|
582
|
+
if (Array.isArray(s)) return s.map(n);
|
|
583
|
+
const u = s;
|
|
584
|
+
return {
|
|
585
|
+
...u,
|
|
586
|
+
axisLabel: { ...u.axisLabel ?? {}, color: r || i },
|
|
587
|
+
axisLine: { lineStyle: { color: t || r } },
|
|
588
|
+
splitLine: { lineStyle: { color: t } }
|
|
589
|
+
};
|
|
578
590
|
};
|
|
579
|
-
e.xAxis &&
|
|
591
|
+
e.xAxis && (e.xAxis = n(e.xAxis)), e.yAxis && (e.yAxis = n(e.yAxis)), e.legend && typeof e.legend == "object" && (e.legend = { ...e.legend, textStyle: { color: i } });
|
|
580
592
|
}
|
|
581
593
|
_readThemeColors() {
|
|
582
594
|
const e = [];
|
|
583
|
-
for (let
|
|
584
|
-
const
|
|
585
|
-
if (
|
|
595
|
+
for (let i = 1; i <= 10; i++) {
|
|
596
|
+
const r = this._readCSSVar(`--u-widget-chart-color-${i}`);
|
|
597
|
+
if (r) e.push(r);
|
|
586
598
|
else break;
|
|
587
599
|
}
|
|
588
600
|
if (e.length === 0) {
|
|
589
|
-
const
|
|
590
|
-
|
|
601
|
+
const i = this._readCSSVar("--u-widget-primary");
|
|
602
|
+
i && e.push(i);
|
|
591
603
|
}
|
|
592
604
|
return e;
|
|
593
605
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"u-widgets-charts.js","sources":["../src/renderers/echarts-adapter.ts","../src/elements/uw-chart.ts"],"sourcesContent":["import type { UWidgetSpec, NormalizedMapping, ReferenceLineOption, AxisFormatOption } from '../core/types.js';\nimport { formatValue } from '../core/format.js';\nimport { normalizeMapping } from '../core/normalize.js';\n\ninterface ConditionalStyleRule {\n field: string;\n above?: number;\n below?: number;\n color: string;\n symbol?: string;\n symbolSize?: number;\n}\n\nfunction matchConditionalStyle(\n row: Record<string, unknown>,\n rules: ConditionalStyleRule[],\n): ConditionalStyleRule | undefined {\n for (const rule of rules) {\n const raw = row[rule.field];\n if (raw === undefined || raw === null) continue;\n const val = Number(raw);\n if (Number.isNaN(val)) continue;\n const aboveOk = rule.above === undefined || val > rule.above;\n const belowOk = rule.below === undefined || val < rule.below;\n if (aboveOk && belowOk) return rule;\n }\n return undefined;\n}\n\n/**\n * Translate a u-widget spec into an ECharts option object.\n * This is a pure function with no DOM or ECharts dependency.\n *\n * Supports `options.echarts` passthrough: any key-value pairs in\n * `options.echarts` are deep-merged (one level) into the generated\n * ECharts option, allowing full customization.\n */\nexport function toEChartsOption(spec: UWidgetSpec): Record<string, unknown> {\n const widget = spec.widget;\n const data = spec.data;\n const mapping = spec.mapping ? normalizeMapping(spec.mapping) : undefined;\n const options = spec.options ?? {};\n\n if (!data) return {};\n\n let result: Record<string, unknown>;\n\n switch (widget) {\n case 'chart.bar':\n result = buildCartesian(data, mapping, 'bar', options);\n break;\n case 'chart.line':\n result = buildCartesian(data, mapping, 'line', options);\n break;\n case 'chart.area':\n result = buildCartesian(data, mapping, 'line', { ...options, _area: true });\n break;\n case 'chart.pie':\n result = buildPie(data, mapping, options);\n break;\n case 'chart.scatter':\n result = buildScatter(data, mapping, options);\n break;\n case 'chart.radar':\n result = buildRadar(data, mapping, options);\n break;\n case 'chart.heatmap':\n result = buildHeatmap(data, mapping, options);\n break;\n case 'chart.box':\n result = buildBoxplot(data, mapping, options);\n break;\n case 'chart.funnel':\n result = buildFunnel(data, mapping, options);\n break;\n case 'chart.waterfall':\n result = buildWaterfall(data, mapping, options);\n break;\n case 'chart.treemap':\n result = buildTreemap(data, options);\n break;\n case 'chart.histogram':\n result = buildHistogram(data, mapping, options);\n break;\n default:\n return {};\n }\n\n // Apply chart-level options\n if (options.legend === false && result.legend) {\n result.legend = { ...result.legend as Record<string, unknown>, show: false };\n }\n\n if (options.grid === false) {\n // Hide grid lines on axes\n if (result.xAxis && typeof result.xAxis === 'object' && !Array.isArray(result.xAxis)) {\n result.xAxis = { ...result.xAxis as Record<string, unknown>, splitLine: { show: false } };\n }\n if (result.yAxis && typeof result.yAxis === 'object' && !Array.isArray(result.yAxis)) {\n result.yAxis = { ...result.yAxis as Record<string, unknown>, splitLine: { show: false } };\n }\n }\n\n if (options.animate === false) {\n result.animation = false;\n }\n\n if (Array.isArray(options.colors) && options.colors.length > 0) {\n result.color = options.colors;\n }\n\n // Apply axis format options\n const locale = options.locale as string | undefined;\n applyAxisFormat(result, 'xAxis', options.xFormat as AxisFormatOption | undefined, locale);\n applyAxisFormat(result, 'yAxis', options.yFormat as AxisFormatOption | undefined, locale);\n\n // Apply echarts passthrough: deep-merge\n const passthrough = options.echarts as Record<string, unknown> | undefined;\n if (passthrough && typeof passthrough === 'object') {\n result = deepMerge(result, passthrough);\n }\n\n return result;\n}\n\nfunction buildCartesian(\n data: unknown,\n mapping: NormalizedMapping | undefined,\n type: string,\n options: Record<string, unknown>,\n): Record<string, unknown> {\n if (!Array.isArray(data)) return {};\n\n const xField = mapping?.x ?? guessStringField(data);\n const yFields = mapping?.y ?? [guessNumberField(data)].filter(Boolean) as string[];\n\n if (!xField || yFields.length === 0) return {};\n\n const categories = data.map((row) => String(row[xField] ?? ''));\n const horizontal = !!options.horizontal;\n\n const seriesOverrides = Array.isArray(options.series) ? options.series as Record<string, unknown>[] : [];\n const condStyles = options.conditionalStyles as ConditionalStyleRule[] | undefined;\n\n const seriesItems = yFields.map((field, i) => {\n const s: Record<string, unknown> = {\n name: field,\n type,\n data: data.map((row) => {\n const val = row[field] ?? null;\n if (condStyles?.length) {\n const match = matchConditionalStyle(row, condStyles);\n if (match) {\n const item: Record<string, unknown> = { value: val, itemStyle: { color: match.color } };\n if (match.symbol) item.symbol = match.symbol;\n if (match.symbolSize) item.symbolSize = match.symbolSize;\n return item;\n }\n }\n return val;\n }),\n };\n if (options._area) s.areaStyle = {};\n if (options.smooth) s.smooth = true;\n if (options.step) s.step = options.step === true ? 'end' : options.step;\n\n // Apply per-series overrides from options.series[i]\n const override = seriesOverrides[i];\n if (override) {\n if (override.color) {\n s.itemStyle = { color: override.color };\n s.lineStyle = { ...(s.lineStyle as Record<string, unknown> ?? {}), color: override.color };\n }\n if (override.lineStyle) {\n s.lineStyle = { ...(s.lineStyle as Record<string, unknown> ?? {}), ...(override.lineStyle as Record<string, unknown>) };\n }\n if (override.symbol !== undefined) s.symbol = override.symbol;\n if (override.label) s.name = override.label as string;\n if (override.type) s.type = override.type as string;\n if (override.yAxisIndex !== undefined) s.yAxisIndex = override.yAxisIndex;\n }\n return s;\n });\n\n const catAxis: Record<string, unknown> = { type: 'category', data: categories };\n const valAxis: Record<string, unknown> = { type: 'value' };\n\n // Histogram mode: remove gaps between bars\n if (options.histogram) {\n catAxis.axisTick = { alignWithLabel: true };\n seriesItems.forEach((s) => { s.barCategoryGap = '0%'; });\n }\n\n // Detect if any series requires a secondary Y axis\n const needsDualYAxis = !horizontal && seriesItems.some((s) => (s.yAxisIndex as number) >= 1);\n let yAxisConfig: unknown;\n if (needsDualYAxis) {\n const secondAxis = Array.isArray(options.yAxis) && (options.yAxis as unknown[]).length >= 2\n ? (options.yAxis as Record<string, unknown>[])[1]\n : { type: 'value' };\n yAxisConfig = [valAxis, secondAxis];\n } else {\n yAxisConfig = horizontal ? catAxis : valAxis;\n }\n\n const result: Record<string, unknown> = {\n xAxis: horizontal ? valAxis : catAxis,\n yAxis: yAxisConfig,\n series: seriesItems,\n tooltip: { trigger: 'axis' },\n };\n\n if (yFields.length > 1) {\n const legendNames = seriesItems.map((s) => s.name as string);\n result.legend = { data: legendNames };\n }\n\n if (options.stack) {\n (result.series as Record<string, unknown>[]).forEach((s) => {\n s.stack = 'total';\n });\n }\n\n // Reference lines → ECharts markLine on first series\n const refLines = options.referenceLines as ReferenceLineOption[] | undefined;\n if (Array.isArray(refLines) && refLines.length > 0 && seriesItems.length > 0) {\n seriesItems[0].markLine = {\n silent: true,\n symbol: 'none',\n data: refLines.map((rl) => {\n const item: Record<string, unknown> = {};\n if (rl.axis === 'x') {\n item.xAxis = rl.value;\n } else {\n item.yAxis = rl.value;\n }\n if (rl.label) item.name = rl.label;\n const lineStyle: Record<string, unknown> = {};\n if (rl.color) lineStyle.color = rl.color;\n if (rl.style) lineStyle.type = rl.style;\n if (Object.keys(lineStyle).length > 0) item.lineStyle = lineStyle;\n if (rl.label) item.label = { formatter: rl.label, position: 'end' };\n return item;\n }),\n };\n }\n\n return result;\n}\n\nfunction buildScatter(\n data: unknown,\n mapping: NormalizedMapping | undefined,\n options: Record<string, unknown>,\n): Record<string, unknown> {\n if (!Array.isArray(data)) return {};\n\n // For scatter, prefer two numeric fields for x/y\n const numFields = getNumberFields(data);\n const xField = mapping?.x ?? numFields[0];\n const yField = (mapping?.y ?? [numFields[1]])[0];\n const colorField = mapping?.color;\n const sizeField = mapping?.size;\n const opacityField = mapping?.opacity;\n\n if (!xField || !yField) return {};\n\n const result: Record<string, unknown> = {\n xAxis: { type: 'value' },\n yAxis: { type: 'value' },\n tooltip: { trigger: 'item' },\n };\n\n // Pre-compute opacity normalization range if needed\n let opacityMin = Infinity;\n let opacityMax = -Infinity;\n if (opacityField) {\n for (const row of data) {\n const v = Number(row[opacityField] ?? 0);\n if (v < opacityMin) opacityMin = v;\n if (v > opacityMax) opacityMax = v;\n }\n }\n const opacityRange = opacityMax - opacityMin || 1;\n\n const condStyles = options.conditionalStyles as ConditionalStyleRule[] | undefined;\n\n // Helper: build a data point — plain array or object with itemStyle for opacity/conditionalStyles\n const toPoint = (row: Record<string, unknown>): unknown => {\n const pt = [Number(row[xField] ?? 0), Number(row[yField] ?? 0)];\n if (sizeField) pt.push(Number(row[sizeField] ?? 0));\n\n if (condStyles?.length) {\n const match = matchConditionalStyle(row, condStyles);\n if (match) {\n const style: Record<string, unknown> = { color: match.color };\n if (opacityField) {\n const raw = Number(row[opacityField] ?? 0);\n style.opacity = Math.round((0.1 + 0.9 * ((raw - opacityMin) / opacityRange)) * 100) / 100;\n }\n const item: Record<string, unknown> = { value: pt, itemStyle: style };\n if (match.symbol) item.symbol = match.symbol;\n if (match.symbolSize) item.symbolSize = match.symbolSize;\n return item;\n }\n }\n\n if (opacityField) {\n const raw = Number(row[opacityField] ?? 0);\n const norm = 0.1 + 0.9 * ((raw - opacityMin) / opacityRange);\n return { value: pt, itemStyle: { opacity: Math.round(norm * 100) / 100 } };\n }\n return pt;\n };\n\n // symbolSize function that maps the third value to pixel radius\n const symbolSizeFn = sizeField\n ? (val: number[] | { value: number[] }) => {\n const arr = Array.isArray(val) ? val : val.value;\n const raw = arr[2] ?? 0;\n // Clamp to [4, 60] range — square root scale for area perception\n return Math.max(4, Math.min(60, Math.sqrt(raw) * 4));\n }\n : undefined;\n\n if (colorField) {\n // Group data by color field → separate series per group\n const groups = new Map<string, unknown[]>();\n for (const row of data) {\n const key = String(row[colorField] ?? 'unknown');\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)!.push(toPoint(row));\n }\n const seriesItems: Record<string, unknown>[] = [];\n for (const [name, points] of groups) {\n const series: Record<string, unknown> = { name, type: 'scatter', data: points };\n if (symbolSizeFn) series.symbolSize = symbolSizeFn;\n seriesItems.push(series);\n }\n result.series = seriesItems;\n result.legend = { data: Array.from(groups.keys()) };\n } else {\n // Single series — all points same color\n const points = data.map((row) => toPoint(row));\n const series: Record<string, unknown> = { type: 'scatter', data: points };\n if (symbolSizeFn) series.symbolSize = symbolSizeFn;\n result.series = [series];\n }\n\n // Reference lines\n const refLines = options.referenceLines as ReferenceLineOption[] | undefined;\n if (Array.isArray(refLines) && refLines.length > 0) {\n const firstSeries = (result.series as Record<string, unknown>[])[0];\n firstSeries.markLine = {\n silent: true,\n symbol: 'none',\n data: refLines.map((rl) => {\n const item: Record<string, unknown> = {};\n if (rl.axis === 'x') item.xAxis = rl.value;\n else item.yAxis = rl.value;\n if (rl.label) item.name = rl.label;\n const lineStyle: Record<string, unknown> = {};\n if (rl.color) lineStyle.color = rl.color;\n if (rl.style) lineStyle.type = rl.style;\n if (Object.keys(lineStyle).length > 0) item.lineStyle = lineStyle;\n if (rl.label) item.label = { formatter: rl.label, position: 'end' };\n return item;\n }),\n };\n }\n\n return result;\n}\n\nfunction buildPie(\n data: unknown,\n mapping: NormalizedMapping | undefined,\n options: Record<string, unknown>,\n): Record<string, unknown> {\n if (!Array.isArray(data)) return {};\n\n const labelField = mapping?.label ?? guessStringField(data);\n const valueField = mapping?.value ?? guessNumberField(data);\n\n if (!labelField || !valueField) return {};\n\n const pieData = data.map((row) => ({\n name: String(row[labelField] ?? ''),\n value: Number(row[valueField] ?? 0),\n }));\n\n const radius = options.donut ? ['40%', '70%'] : '50%';\n const seriesItem: Record<string, unknown> = {\n type: 'pie',\n radius,\n data: pieData,\n label: { overflow: 'truncate', width: 80 },\n };\n\n if (options.showLabel === false) {\n seriesItem.label = { show: false };\n }\n\n const result: Record<string, unknown> = {\n tooltip: { trigger: 'item' },\n legend: { orient: 'vertical', left: 'left' },\n series: [seriesItem],\n };\n\n // Donut center label\n const center = options.center as { label?: string; value?: string } | undefined;\n if (options.donut && center && (center.label || center.value)) {\n const children: Record<string, unknown>[] = [];\n if (center.label) {\n children.push({\n type: 'text',\n top: center.value ? -16 : 0,\n style: { text: center.label, fontSize: 13, fill: '#999', textAlign: 'center' },\n });\n }\n if (center.value) {\n children.push({\n type: 'text',\n top: center.label ? 8 : 0,\n style: { text: center.value, fontSize: 20, fontWeight: 'bold', fill: '#333', textAlign: 'center' },\n });\n }\n result.graphic = [{ type: 'group', left: 'center', top: 'middle', children }];\n }\n\n return result;\n}\n\nfunction buildRadar(\n data: unknown,\n mapping: NormalizedMapping | undefined,\n _options: Record<string, unknown>,\n): Record<string, unknown> {\n if (!Array.isArray(data)) return {};\n\n const axisField = mapping?.axis ?? guessStringField(data);\n const yFields = mapping?.y ?? getNumberFields(data);\n\n if (!axisField || yFields.length === 0) return {};\n\n const indicator = data.map((row) => ({\n name: String(row[axisField] ?? ''),\n }));\n\n const series = yFields.map((field) => ({\n name: field,\n value: data.map((row) => Number(row[field] ?? 0)),\n }));\n\n return {\n tooltip: {},\n legend: { data: yFields },\n radar: { indicator },\n series: [\n {\n type: 'radar',\n data: series,\n },\n ],\n };\n}\n\nfunction buildHeatmap(\n data: unknown,\n mapping: NormalizedMapping | undefined,\n options: Record<string, unknown>,\n): Record<string, unknown> {\n if (!Array.isArray(data)) return {};\n\n // Determine x, y (category), value (number) fields\n const first = data[0] ?? {};\n const keys = Object.keys(first);\n const stringFields = keys.filter((k) => typeof first[k] === 'string');\n const numberFields = keys.filter((k) => typeof first[k] === 'number');\n\n const xField = mapping?.x ?? stringFields[0];\n // For heatmap, y is a category field (string), not a numeric series\n const yField = mapping?.y?.[0] ?? stringFields.find((k) => k !== xField);\n const valueField = mapping?.value ?? numberFields[0];\n\n if (!xField || !yField || !valueField) return {};\n\n // Extract unique categories preserving order of appearance\n const xCats: string[] = [];\n const yCats: string[] = [];\n const xSet = new Set<string>();\n const ySet = new Set<string>();\n\n for (const row of data) {\n const x = String(row[xField] ?? '');\n const y = String(row[yField] ?? '');\n if (!xSet.has(x)) { xSet.add(x); xCats.push(x); }\n if (!ySet.has(y)) { ySet.add(y); yCats.push(y); }\n }\n\n // Build index maps for O(1) lookup\n const xIndex = new Map<string, number>();\n xCats.forEach((v, i) => xIndex.set(v, i));\n const yIndex = new Map<string, number>();\n yCats.forEach((v, i) => yIndex.set(v, i));\n\n // Build [xIndex, yIndex, value] data\n const heatData: (number | null)[][] = [];\n let minVal = Infinity;\n let maxVal = -Infinity;\n\n for (const row of data) {\n const xi = xIndex.get(String(row[xField] ?? '')) ?? 0;\n const yi = yIndex.get(String(row[yField] ?? '')) ?? 0;\n const v = row[valueField] != null ? Number(row[valueField]) : null;\n heatData.push([xi, yi, v]);\n if (v != null) {\n if (v < minVal) minVal = v;\n if (v > maxVal) maxVal = v;\n }\n }\n\n // Handle edge case of empty/no-value data\n if (!isFinite(minVal)) { minVal = 0; maxVal = 1; }\n\n // Determine color range from options or use defaults\n const colorRange = (options.colorRange as string[]) ?? ['#313695', '#4575b4', '#74add1', '#abd9e9', '#fee090', '#fdae61', '#f46d43', '#d73027'];\n\n return {\n xAxis: { type: 'category', data: xCats, splitArea: { show: true } },\n yAxis: { type: 'category', data: yCats, splitArea: { show: true } },\n visualMap: {\n min: options.min != null ? Number(options.min) : minVal,\n max: options.max != null ? Number(options.max) : maxVal,\n calculable: true,\n orient: 'horizontal',\n left: 'center',\n bottom: 0,\n inRange: { color: colorRange },\n },\n tooltip: {\n trigger: 'item',\n formatter: (params: Record<string, unknown>) => {\n const d = params.data as number[];\n if (!d) return '';\n return `${xCats[d[0]]} × ${yCats[d[1]]}: ${d[2] != null ? d[2] : '-'}`;\n },\n },\n grid: { bottom: 60 },\n series: [{\n type: 'heatmap',\n data: heatData,\n label: { show: options.showLabel !== false },\n }],\n };\n}\n\nfunction buildBoxplot(\n data: unknown,\n mapping: NormalizedMapping | undefined,\n _options: Record<string, unknown>,\n): Record<string, unknown> {\n if (!Array.isArray(data) || data.length === 0) return {};\n\n const first = data[0] ?? {};\n const keys = Object.keys(first);\n const stringFields = keys.filter((k) => typeof first[k] === 'string');\n const numberFields = keys.filter((k) => typeof first[k] === 'number');\n\n // Category field (x)\n const xField = mapping?.x ?? stringFields[0];\n\n // Stat fields: use mapping.y if provided (5 fields: min, q1, median, q3, max)\n // Otherwise, try well-known names, then fall back to first 5 number fields\n let statFields: string[];\n if (mapping?.y && mapping.y.length >= 5) {\n statFields = mapping.y.slice(0, 5);\n } else {\n const wellKnown = ['min', 'q1', 'median', 'q3', 'max'];\n const matched = wellKnown.filter((name) => numberFields.includes(name));\n statFields = matched.length === 5 ? matched : numberFields.slice(0, 5);\n }\n\n if (statFields.length < 5) return {};\n\n const categories = xField ? data.map((row) => String(row[xField] ?? '')) : undefined;\n\n const boxData = data.map((row) =>\n statFields.map((f) => Number(row[f] ?? 0)),\n );\n\n const result: Record<string, unknown> = {\n tooltip: { trigger: 'item' },\n series: [{\n type: 'boxplot',\n data: boxData,\n }],\n };\n\n if (categories) {\n result.xAxis = { type: 'category', data: categories };\n result.yAxis = { type: 'value' };\n } else {\n result.xAxis = { type: 'category' };\n result.yAxis = { type: 'value' };\n }\n\n return result;\n}\n\n// ── Helpers ──\n\nfunction guessStringField(data: Record<string, unknown>[]): string | undefined {\n if (data.length === 0) return undefined;\n const first = data[0];\n return Object.keys(first).find((k) => typeof first[k] === 'string');\n}\n\nfunction guessNumberField(data: Record<string, unknown>[]): string | undefined {\n if (data.length === 0) return undefined;\n const first = data[0];\n return Object.keys(first).find((k) => typeof first[k] === 'number');\n}\n\nfunction buildFunnel(\n data: unknown,\n mapping: NormalizedMapping | undefined,\n _options: Record<string, unknown>,\n): Record<string, unknown> {\n if (!Array.isArray(data)) return {};\n\n const labelField = mapping?.label ?? guessStringField(data as Record<string, unknown>[]);\n const valueField = (mapping?.value ?? guessNumberField(data as Record<string, unknown>[]));\n\n if (!labelField || !valueField) return {};\n\n const seriesData = (data as Record<string, unknown>[]).map((row) => ({\n name: String(row[labelField] ?? ''),\n value: Number(row[valueField] ?? 0),\n }));\n\n return {\n tooltip: { trigger: 'item', formatter: '{b}: {c} ({d}%)' },\n legend: { orient: 'vertical', left: 'left' },\n series: [{\n type: 'funnel',\n data: seriesData,\n sort: 'descending',\n gap: 2,\n label: { show: true, position: 'inside' },\n }],\n };\n}\n\nfunction buildWaterfall(\n data: unknown,\n mapping: NormalizedMapping | undefined,\n _options: Record<string, unknown>,\n): Record<string, unknown> {\n if (!Array.isArray(data)) return {};\n\n const records = data as Record<string, unknown>[];\n const xField = mapping?.x ?? guessStringField(records);\n const yField = (mapping?.y ?? [guessNumberField(records)])[0];\n\n if (!xField || !yField) return {};\n\n const categories: string[] = [];\n const baseValues: number[] = [];\n const positiveValues: (number | null)[] = [];\n const negativeValues: (number | null)[] = [];\n\n let running = 0;\n for (const row of records) {\n const label = String(row[xField] ?? '');\n const value = Number(row[yField] ?? 0);\n categories.push(label);\n\n if (value >= 0) {\n baseValues.push(running);\n positiveValues.push(value);\n negativeValues.push(null);\n } else {\n baseValues.push(running + value);\n positiveValues.push(null);\n negativeValues.push(Math.abs(value));\n }\n running += value;\n }\n\n return {\n tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' } },\n xAxis: { type: 'category', data: categories },\n yAxis: { type: 'value' },\n series: [\n {\n name: 'Base',\n type: 'bar',\n stack: 'waterfall',\n itemStyle: { borderColor: 'transparent', color: 'transparent' },\n emphasis: { itemStyle: { borderColor: 'transparent', color: 'transparent' } },\n data: baseValues,\n },\n {\n name: 'Positive',\n type: 'bar',\n stack: 'waterfall',\n data: positiveValues,\n },\n {\n name: 'Negative',\n type: 'bar',\n stack: 'waterfall',\n data: negativeValues,\n },\n ],\n };\n}\n\nfunction buildTreemap(\n data: unknown,\n _options: Record<string, unknown>,\n): Record<string, unknown> {\n if (!Array.isArray(data)) return {};\n\n // Treemap data uses name/value/children directly — pass through to ECharts\n const seriesData = (data as Record<string, unknown>[]).map((item) => toTreeNode(item));\n\n return {\n tooltip: { trigger: 'item' },\n series: [{\n type: 'treemap',\n data: seriesData,\n leafDepth: 1,\n roam: false,\n label: { show: true, formatter: '{b}' },\n }],\n };\n}\n\nfunction toTreeNode(item: Record<string, unknown>): Record<string, unknown> {\n const node: Record<string, unknown> = {\n name: String(item.name ?? ''),\n value: Number(item.value ?? 0),\n };\n if (Array.isArray(item.children)) {\n node.children = (item.children as Record<string, unknown>[]).map((child) => toTreeNode(child));\n }\n return node;\n}\n\nfunction buildHistogram(\n data: unknown,\n mapping: NormalizedMapping | undefined,\n options: Record<string, unknown>,\n): Record<string, unknown> {\n // Extract numeric values from flat array or object array\n let values: number[];\n if (!Array.isArray(data) || data.length === 0) return {};\n\n if (typeof data[0] === 'number') {\n values = data as number[];\n } else {\n const field = mapping?.value ?? guessNumberField(data as Record<string, unknown>[]);\n if (!field) return {};\n values = (data as Record<string, unknown>[]).map((row) => Number(row[field] ?? 0));\n }\n\n if (values.length === 0) return {};\n\n // Determine bin count: explicit or Sturges' rule\n const binCount = typeof options.bins === 'number'\n ? options.bins\n : Math.ceil(Math.log2(values.length) + 1);\n\n const min = Math.min(...values);\n const max = Math.max(...values);\n const range = max - min;\n const binWidth = range / binCount || 1;\n\n // Build bins\n const bins: number[] = new Array(binCount).fill(0);\n const labels: string[] = [];\n\n for (let i = 0; i < binCount; i++) {\n const lo = min + i * binWidth;\n const hi = min + (i + 1) * binWidth;\n const fmt = (n: number) => Number.isInteger(n) ? String(n) : n.toFixed(1);\n labels.push(`${fmt(lo)}\\u2013${fmt(hi)}`);\n }\n\n for (const v of values) {\n let idx = Math.floor((v - min) / binWidth);\n if (idx >= binCount) idx = binCount - 1; // clamp max to last bin\n bins[idx]++;\n }\n\n const series: Record<string, unknown> = {\n type: 'bar',\n data: bins,\n barCategoryGap: '0%',\n };\n\n const result: Record<string, unknown> = {\n xAxis: { type: 'category', data: labels, axisTick: { alignWithLabel: true } },\n yAxis: { type: 'value' },\n series: [series],\n tooltip: { trigger: 'axis' },\n };\n\n // Reference lines\n const refLines = options.referenceLines as ReferenceLineOption[] | undefined;\n if (Array.isArray(refLines) && refLines.length > 0) {\n series.markLine = {\n silent: true,\n symbol: 'none',\n data: refLines.map((rl) => {\n const item: Record<string, unknown> = {};\n if (rl.axis === 'x') item.xAxis = rl.value;\n else item.yAxis = rl.value;\n if (rl.label) item.name = rl.label;\n const lineStyle: Record<string, unknown> = {};\n if (rl.color) lineStyle.color = rl.color;\n if (rl.style) lineStyle.type = rl.style;\n if (Object.keys(lineStyle).length > 0) item.lineStyle = lineStyle;\n if (rl.label) item.label = { formatter: rl.label, position: 'end' };\n return item;\n }),\n };\n }\n\n return result;\n}\n\nfunction getNumberFields(data: Record<string, unknown>[]): string[] {\n if (data.length === 0) return [];\n const first = data[0];\n return Object.keys(first).filter((k) => typeof first[k] === 'number');\n}\n\n/**\n * Deep-merge `overrides` into `base` recursively.\n * If both base[key] and overrides[key] are plain objects, merge recursively.\n * Arrays and other values: overrides[key] wins.\n */\nfunction deepMerge(\n base: Record<string, unknown>,\n overrides: Record<string, unknown>,\n): Record<string, unknown> {\n const result = { ...base };\n for (const key of Object.keys(overrides)) {\n const bv = base[key];\n const ov = overrides[key];\n if (isPlainObject(bv) && isPlainObject(ov)) {\n result[key] = deepMerge(bv as Record<string, unknown>, ov as Record<string, unknown>);\n } else {\n result[key] = ov;\n }\n }\n return result;\n}\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return v != null && typeof v === 'object' && !Array.isArray(v);\n}\n\n/**\n * Build a formatter string or function for ECharts axis labels\n * based on an AxisFormatOption.\n */\nfunction buildAxisFormatter(fmt: AxisFormatOption, locale?: string): (value: number | string) => string {\n return (value: number | string) => {\n let result: string;\n if (fmt.type) {\n const formatStr = fmt.type === 'currency' && fmt.currency\n ? `currency:${fmt.currency}`\n : fmt.type;\n result = formatValue(value, formatStr, locale);\n // For percent type, formatValue divides by 100 — but axis values are already in\n // display units (e.g. 73 means 73%), so use raw suffix instead\n if (fmt.type === 'percent') {\n result = typeof value === 'number'\n ? new Intl.NumberFormat(locale, { maximumFractionDigits: fmt.decimals ?? 2 }).format(value) + '%'\n : String(value) + '%';\n }\n } else {\n result = String(value);\n }\n if (fmt.decimals !== undefined && fmt.type === 'number') {\n const num = Number(value);\n if (!isNaN(num)) {\n result = new Intl.NumberFormat(locale, {\n minimumFractionDigits: fmt.decimals,\n maximumFractionDigits: fmt.decimals,\n }).format(num);\n }\n }\n if (fmt.prefix) result = fmt.prefix + result;\n if (fmt.suffix) result = result + fmt.suffix;\n return result;\n };\n}\n\n/**\n * Apply xFormat/yFormat to the corresponding axis in the ECharts option.\n * Handles both single axis and axis arrays (dual Y axis).\n */\nfunction applyAxisFormat(\n result: Record<string, unknown>,\n axisKey: 'xAxis' | 'yAxis',\n fmt: AxisFormatOption | undefined,\n locale?: string,\n): void {\n if (!fmt || !result[axisKey]) return;\n\n const formatter = buildAxisFormatter(fmt, locale);\n const axis = result[axisKey];\n\n if (Array.isArray(axis)) {\n // Dual axis — apply to all value-type axes\n result[axisKey] = (axis as Record<string, unknown>[]).map((a) => {\n if (a.type === 'value') {\n return { ...a, axisLabel: { ...(a.axisLabel as Record<string, unknown> ?? {}), formatter } };\n }\n return a;\n });\n } else if (isPlainObject(axis)) {\n const a = axis as Record<string, unknown>;\n result[axisKey] = { ...a, axisLabel: { ...(a.axisLabel as Record<string, unknown> ?? {}), formatter } };\n }\n}\n","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { UWidgetSpec, UWidgetEvent } from '../core/types.js';\nimport { toEChartsOption } from '../renderers/echarts-adapter.js';\nimport { themeStyles } from '../styles/tokens.js';\n\n// Tree-shakeable ECharts imports\nimport * as echarts from 'echarts/core';\nimport { BarChart, LineChart, PieChart, ScatterChart, RadarChart, HeatmapChart, BoxplotChart, FunnelChart, TreemapChart } from 'echarts/charts';\nimport {\n GridComponent,\n TooltipComponent,\n LegendComponent,\n RadarComponent,\n MarkLineComponent,\n VisualMapComponent,\n} from 'echarts/components';\nimport { CanvasRenderer } from 'echarts/renderers';\n\necharts.use([\n BarChart,\n LineChart,\n PieChart,\n ScatterChart,\n RadarChart,\n HeatmapChart,\n BoxplotChart,\n FunnelChart,\n TreemapChart,\n GridComponent,\n TooltipComponent,\n LegendComponent,\n RadarComponent,\n MarkLineComponent,\n VisualMapComponent,\n CanvasRenderer,\n]);\n\n@customElement('uw-chart')\nexport class UwChart extends LitElement {\n static styles = [\n themeStyles,\n css`\n :host {\n display: block;\n container: uw-chart / inline-size;\n }\n\n .chart-container {\n width: 100%;\n height: var(--u-widget-chart-height, 300px);\n }\n\n @container uw-chart (max-width: 20rem) {\n .chart-container {\n height: var(--u-widget-chart-height-narrow, 200px);\n }\n }\n `,\n ];\n\n @property({ type: Object })\n spec: UWidgetSpec | null = null;\n\n private _chart: echarts.ECharts | null = null;\n private _container: HTMLDivElement | null = null;\n private _resizeObserver: ResizeObserver | null = null;\n\n render() {\n if (!this.spec) return nothing;\n const label = this.spec.title ?? `${this.spec.widget} chart`;\n return html`<div class=\"chart-container\" part=\"chart\" role=\"img\" aria-label=${label}></div>`;\n }\n\n protected firstUpdated() {\n this._container = this.shadowRoot?.querySelector('.chart-container') as HTMLDivElement | null;\n this._initChart();\n if (this._container) {\n this._resizeObserver = new ResizeObserver(() => this._chart?.resize());\n this._resizeObserver.observe(this._container);\n }\n }\n\n protected updated(changed: Map<string, unknown>) {\n if (changed.has('spec') && this._container) {\n this._updateChart();\n }\n }\n\n private _initChart() {\n if (!this._container || !this.spec) return;\n\n try {\n this._chart = echarts.init(this._container);\n this._chart.on('click', (params: Record<string, unknown>) => {\n this._onChartClick(params);\n });\n this._updateChart();\n } catch (e) {\n console.warn('[uw-chart] Failed to initialize ECharts:', (e as Error).message);\n }\n }\n\n private _onChartClick(params: Record<string, unknown>) {\n if (!this.spec) return;\n const detail: UWidgetEvent = {\n type: 'select',\n widget: this.spec.widget,\n id: this.spec.id,\n data: {\n name: params.name as string,\n seriesName: params.seriesName as string,\n value: params.value,\n dataIndex: params.dataIndex as number,\n },\n };\n this.dispatchEvent(\n new CustomEvent('u-widget-internal', {\n detail,\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private _updateChart() {\n if (!this._chart || !this.spec) return;\n\n const option = toEChartsOption(this.spec);\n\n // Inject theme colors from CSS custom properties\n const themeColors = this._readThemeColors();\n if (themeColors.length > 0) {\n option.color = themeColors;\n }\n if (this._readCSSVar('--u-widget-bg')) {\n option.backgroundColor = 'transparent';\n }\n\n // Inject text/axis/grid theme from CSS variables\n this._applyThemeStyle(option);\n\n this._chart.setOption(option, true);\n }\n\n private _applyThemeStyle(option: Record<string, unknown>) {\n const textColor = this._readCSSVar('--u-widget-text');\n const secondaryColor = this._readCSSVar('--u-widget-text-secondary');\n const borderColor = this._readCSSVar('--u-widget-border');\n\n if (!textColor) return; // no theme vars available\n\n // Global text style\n option.textStyle = { ...(option.textStyle as Record<string, unknown>), color: textColor };\n\n // Axis styling\n const axisStyle = {\n axisLabel: { color: secondaryColor || textColor },\n axisLine: { lineStyle: { color: borderColor || secondaryColor } },\n splitLine: { lineStyle: { color: borderColor } },\n };\n if (option.xAxis && typeof option.xAxis === 'object') {\n option.xAxis = { ...option.xAxis as Record<string, unknown>, ...axisStyle };\n }\n if (option.yAxis && typeof option.yAxis === 'object') {\n option.yAxis = { ...option.yAxis as Record<string, unknown>, ...axisStyle };\n }\n\n // Legend\n if (option.legend && typeof option.legend === 'object') {\n option.legend = { ...option.legend as Record<string, unknown>, textStyle: { color: textColor } };\n }\n }\n\n private _readThemeColors(): string[] {\n const colors: string[] = [];\n // Read --u-widget-chart-color-N (1-based) custom properties\n for (let i = 1; i <= 10; i++) {\n const c = this._readCSSVar(`--u-widget-chart-color-${i}`);\n if (c) colors.push(c);\n else break;\n }\n // Fallback: use --u-widget-primary as first color if no palette defined\n if (colors.length === 0) {\n const primary = this._readCSSVar('--u-widget-primary');\n if (primary) colors.push(primary);\n }\n return colors;\n }\n\n private _readCSSVar(name: string): string {\n return getComputedStyle(this).getPropertyValue(name).trim();\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this._resizeObserver?.disconnect();\n this._resizeObserver = null;\n this._chart?.dispose();\n this._chart = null;\n }\n\n /** Resize the chart (call when container size changes). */\n resize() {\n this._chart?.resize();\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'uw-chart': UwChart;\n }\n}\n"],"names":["matchConditionalStyle","row","rules","rule","raw","val","aboveOk","belowOk","toEChartsOption","spec","widget","data","mapping","normalizeMapping","options","result","buildCartesian","buildPie","buildScatter","buildRadar","buildHeatmap","buildBoxplot","buildFunnel","buildWaterfall","buildTreemap","buildHistogram","locale","applyAxisFormat","passthrough","deepMerge","type","xField","guessStringField","yFields","guessNumberField","categories","horizontal","seriesOverrides","condStyles","seriesItems","field","i","s","match","item","override","catAxis","valAxis","needsDualYAxis","yAxisConfig","secondAxis","legendNames","refLines","rl","lineStyle","numFields","getNumberFields","yField","colorField","sizeField","opacityField","opacityMin","opacityMax","v","opacityRange","toPoint","pt","style","norm","symbolSizeFn","groups","key","name","points","series","firstSeries","labelField","valueField","pieData","seriesItem","center","children","_options","axisField","indicator","first","keys","stringFields","k","numberFields","xCats","yCats","xSet","ySet","x","y","xIndex","yIndex","heatData","minVal","maxVal","xi","yi","colorRange","params","d","statFields","matched","boxData","f","seriesData","records","baseValues","positiveValues","negativeValues","running","label","value","toTreeNode","node","child","values","binCount","min","binWidth","bins","labels","lo","hi","fmt","n","idx","base","overrides","bv","ov","isPlainObject","buildAxisFormatter","formatStr","formatValue","num","axisKey","formatter","axis","a","echarts","BarChart","LineChart","PieChart","ScatterChart","RadarChart","HeatmapChart","BoxplotChart","FunnelChart","TreemapChart","GridComponent","TooltipComponent","LegendComponent","RadarComponent","MarkLineComponent","VisualMapComponent","CanvasRenderer","UwChart","LitElement","nothing","html","changed","detail","option","themeColors","textColor","secondaryColor","borderColor","axisStyle","colors","c","primary","themeStyles","css","__decorateClass","property","customElement"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"u-widgets-charts.js","sources":["../src/renderers/echarts-adapter.ts","../src/elements/uw-chart.ts"],"sourcesContent":["import type { UWidgetSpec, NormalizedMapping, ReferenceLineOption, AxisFormatOption } from '../core/types.js';\nimport { formatValue } from '../core/format.js';\nimport { normalizeMapping } from '../core/normalize.js';\n\ninterface ConditionalStyleRule {\n field: string;\n above?: number;\n below?: number;\n color: string;\n symbol?: string;\n symbolSize?: number;\n}\n\nfunction matchConditionalStyle(\n row: Record<string, unknown>,\n rules: ConditionalStyleRule[],\n): ConditionalStyleRule | undefined {\n for (const rule of rules) {\n const raw = row[rule.field];\n if (raw === undefined || raw === null) continue;\n const val = Number(raw);\n if (Number.isNaN(val)) continue;\n const aboveOk = rule.above === undefined || val > rule.above;\n const belowOk = rule.below === undefined || val < rule.below;\n if (aboveOk && belowOk) return rule;\n }\n return undefined;\n}\n\n/**\n * Translate a u-widget spec into an ECharts option object.\n * This is a pure function with no DOM or ECharts dependency.\n *\n * Supports `options.echarts` passthrough: any key-value pairs in\n * `options.echarts` are deep-merged (one level) into the generated\n * ECharts option, allowing full customization.\n */\nexport function toEChartsOption(spec: UWidgetSpec): Record<string, unknown> {\n const widget = spec.widget;\n const data = spec.data;\n const mapping = spec.mapping ? normalizeMapping(spec.mapping) : undefined;\n const options = spec.options ?? {};\n\n if (!data) return {};\n\n let result: Record<string, unknown>;\n\n switch (widget) {\n case 'chart.bar':\n result = buildCartesian(data, mapping, 'bar', options);\n break;\n case 'chart.line':\n result = buildCartesian(data, mapping, 'line', options);\n break;\n case 'chart.area':\n result = buildCartesian(data, mapping, 'line', { ...options, _area: true });\n break;\n case 'chart.pie':\n result = buildPie(data, mapping, options);\n break;\n case 'chart.scatter':\n result = buildScatter(data, mapping, options);\n break;\n case 'chart.radar':\n result = buildRadar(data, mapping, options);\n break;\n case 'chart.heatmap':\n result = buildHeatmap(data, mapping, options);\n break;\n case 'chart.box':\n result = buildBoxplot(data, mapping, options);\n break;\n case 'chart.funnel':\n result = buildFunnel(data, mapping, options);\n break;\n case 'chart.waterfall':\n result = buildWaterfall(data, mapping, options);\n break;\n case 'chart.treemap':\n result = buildTreemap(data, options);\n break;\n case 'chart.histogram':\n result = buildHistogram(data, mapping, options);\n break;\n default:\n return {};\n }\n\n // Apply chart-level options\n if (options.legend === false && result.legend) {\n result.legend = { ...result.legend as Record<string, unknown>, show: false };\n }\n\n if (options.grid === false) {\n // Hide grid lines on axes\n if (result.xAxis && typeof result.xAxis === 'object' && !Array.isArray(result.xAxis)) {\n result.xAxis = { ...result.xAxis as Record<string, unknown>, splitLine: { show: false } };\n }\n if (result.yAxis && typeof result.yAxis === 'object' && !Array.isArray(result.yAxis)) {\n result.yAxis = { ...result.yAxis as Record<string, unknown>, splitLine: { show: false } };\n }\n }\n\n if (options.animate === false) {\n result.animation = false;\n }\n\n if (Array.isArray(options.colors) && options.colors.length > 0) {\n result.color = options.colors;\n }\n\n // Apply axis format options\n const locale = options.locale as string | undefined;\n applyAxisFormat(result, 'xAxis', options.xFormat as AxisFormatOption | undefined, locale);\n applyAxisFormat(result, 'yAxis', options.yFormat as AxisFormatOption | undefined, locale);\n\n // Apply echarts passthrough: deep-merge\n const passthrough = options.echarts as Record<string, unknown> | undefined;\n if (passthrough && typeof passthrough === 'object') {\n result = deepMerge(result, passthrough);\n }\n\n return result;\n}\n\nfunction buildCartesian(\n data: unknown,\n mapping: NormalizedMapping | undefined,\n type: string,\n options: Record<string, unknown>,\n): Record<string, unknown> {\n if (!Array.isArray(data)) return {};\n\n const xField = mapping?.x ?? guessStringField(data);\n const yFields = mapping?.y ?? [guessNumberField(data)].filter(Boolean) as string[];\n\n if (!xField || yFields.length === 0) return {};\n\n const categories = data.map((row) => String(row[xField] ?? ''));\n const horizontal = !!options.horizontal;\n\n const seriesOverrides = Array.isArray(options.series) ? options.series as Record<string, unknown>[] : [];\n const condStyles = options.conditionalStyles as ConditionalStyleRule[] | undefined;\n\n const seriesItems = yFields.map((field, i) => {\n const s: Record<string, unknown> = {\n name: field,\n type,\n data: data.map((row) => {\n const val = row[field] ?? null;\n if (condStyles?.length) {\n const match = matchConditionalStyle(row, condStyles);\n if (match) {\n const item: Record<string, unknown> = { value: val, itemStyle: { color: match.color } };\n if (match.symbol) item.symbol = match.symbol;\n if (match.symbolSize) item.symbolSize = match.symbolSize;\n return item;\n }\n }\n return val;\n }),\n };\n if (options._area) s.areaStyle = {};\n if (options.smooth) s.smooth = true;\n if (options.step) s.step = options.step === true ? 'end' : options.step;\n\n // Apply per-series overrides from options.series[i]\n const override = seriesOverrides[i];\n if (override) {\n if (override.color) {\n s.itemStyle = { color: override.color };\n s.lineStyle = { ...(s.lineStyle as Record<string, unknown> ?? {}), color: override.color };\n }\n if (override.lineStyle) {\n s.lineStyle = { ...(s.lineStyle as Record<string, unknown> ?? {}), ...(override.lineStyle as Record<string, unknown>) };\n }\n if (override.symbol !== undefined) s.symbol = override.symbol;\n if (override.label) s.name = override.label as string;\n if (override.type) s.type = override.type as string;\n if (override.yAxisIndex !== undefined) s.yAxisIndex = override.yAxisIndex;\n }\n return s;\n });\n\n const catAxis: Record<string, unknown> = { type: 'category', data: categories };\n const valAxis: Record<string, unknown> = { type: 'value' };\n\n // Histogram mode: remove gaps between bars\n if (options.histogram) {\n catAxis.axisTick = { alignWithLabel: true };\n seriesItems.forEach((s) => { s.barCategoryGap = '0%'; });\n }\n\n // Detect if any series requires a secondary Y axis\n const needsDualYAxis = !horizontal && seriesItems.some((s) => (s.yAxisIndex as number) >= 1);\n let yAxisConfig: unknown;\n if (needsDualYAxis) {\n const secondAxis = Array.isArray(options.yAxis) && (options.yAxis as unknown[]).length >= 2\n ? (options.yAxis as Record<string, unknown>[])[1]\n : { type: 'value' };\n yAxisConfig = [valAxis, secondAxis];\n } else {\n yAxisConfig = horizontal ? catAxis : valAxis;\n }\n\n const result: Record<string, unknown> = {\n xAxis: horizontal ? valAxis : catAxis,\n yAxis: yAxisConfig,\n series: seriesItems,\n tooltip: { trigger: 'axis' },\n };\n\n if (yFields.length > 1) {\n const legendNames = seriesItems.map((s) => s.name as string);\n result.legend = { data: legendNames };\n }\n\n if (options.stack) {\n (result.series as Record<string, unknown>[]).forEach((s) => {\n s.stack = 'total';\n });\n }\n\n // Reference lines → ECharts markLine on first series\n const refLines = options.referenceLines as ReferenceLineOption[] | undefined;\n if (Array.isArray(refLines) && refLines.length > 0 && seriesItems.length > 0) {\n seriesItems[0].markLine = {\n silent: true,\n symbol: 'none',\n data: refLines.map((rl) => {\n const item: Record<string, unknown> = {};\n if (rl.axis === 'x') {\n item.xAxis = rl.value;\n } else {\n item.yAxis = rl.value;\n }\n if (rl.label) item.name = rl.label;\n const lineStyle: Record<string, unknown> = {};\n if (rl.color) lineStyle.color = rl.color;\n if (rl.style) lineStyle.type = rl.style;\n if (Object.keys(lineStyle).length > 0) item.lineStyle = lineStyle;\n if (rl.label) item.label = { formatter: rl.label, position: 'end' };\n return item;\n }),\n };\n }\n\n return result;\n}\n\nfunction buildScatter(\n data: unknown,\n mapping: NormalizedMapping | undefined,\n options: Record<string, unknown>,\n): Record<string, unknown> {\n if (!Array.isArray(data)) return {};\n\n // For scatter, prefer two numeric fields for x/y\n const numFields = getNumberFields(data);\n const xField = mapping?.x ?? numFields[0];\n const yField = (mapping?.y ?? [numFields[1]])[0];\n const colorField = mapping?.color;\n const sizeField = mapping?.size;\n const opacityField = mapping?.opacity;\n\n if (!xField || !yField) return {};\n\n const result: Record<string, unknown> = {\n xAxis: { type: 'value' },\n yAxis: { type: 'value' },\n tooltip: { trigger: 'item' },\n };\n\n // Pre-compute opacity normalization range if needed\n let opacityMin = Infinity;\n let opacityMax = -Infinity;\n if (opacityField) {\n for (const row of data) {\n const v = Number(row[opacityField] ?? 0);\n if (v < opacityMin) opacityMin = v;\n if (v > opacityMax) opacityMax = v;\n }\n }\n const opacityRange = opacityMax - opacityMin || 1;\n\n const condStyles = options.conditionalStyles as ConditionalStyleRule[] | undefined;\n\n // Helper: build a data point — plain array or object with itemStyle for opacity/conditionalStyles\n const toPoint = (row: Record<string, unknown>): unknown => {\n const pt = [Number(row[xField] ?? 0), Number(row[yField] ?? 0)];\n if (sizeField) pt.push(Number(row[sizeField] ?? 0));\n\n if (condStyles?.length) {\n const match = matchConditionalStyle(row, condStyles);\n if (match) {\n const style: Record<string, unknown> = { color: match.color };\n if (opacityField) {\n const raw = Number(row[opacityField] ?? 0);\n style.opacity = Math.round((0.1 + 0.9 * ((raw - opacityMin) / opacityRange)) * 100) / 100;\n }\n const item: Record<string, unknown> = { value: pt, itemStyle: style };\n if (match.symbol) item.symbol = match.symbol;\n if (match.symbolSize) item.symbolSize = match.symbolSize;\n return item;\n }\n }\n\n if (opacityField) {\n const raw = Number(row[opacityField] ?? 0);\n const norm = 0.1 + 0.9 * ((raw - opacityMin) / opacityRange);\n return { value: pt, itemStyle: { opacity: Math.round(norm * 100) / 100 } };\n }\n return pt;\n };\n\n // symbolSize function that maps the third value to pixel radius\n const symbolSizeFn = sizeField\n ? (val: number[] | { value: number[] }) => {\n const arr = Array.isArray(val) ? val : val.value;\n const raw = arr[2] ?? 0;\n // Clamp to [4, 60] range — square root scale for area perception\n return Math.max(4, Math.min(60, Math.sqrt(raw) * 4));\n }\n : undefined;\n\n if (colorField) {\n // Group data by color field → separate series per group\n const groups = new Map<string, unknown[]>();\n for (const row of data) {\n const key = String(row[colorField] ?? 'unknown');\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)!.push(toPoint(row));\n }\n const seriesItems: Record<string, unknown>[] = [];\n for (const [name, points] of groups) {\n const series: Record<string, unknown> = { name, type: 'scatter', data: points };\n if (symbolSizeFn) series.symbolSize = symbolSizeFn;\n seriesItems.push(series);\n }\n result.series = seriesItems;\n result.legend = { data: Array.from(groups.keys()) };\n } else {\n // Single series — all points same color\n const points = data.map((row) => toPoint(row));\n const series: Record<string, unknown> = { type: 'scatter', data: points };\n if (symbolSizeFn) series.symbolSize = symbolSizeFn;\n result.series = [series];\n }\n\n // Reference lines\n const refLines = options.referenceLines as ReferenceLineOption[] | undefined;\n if (Array.isArray(refLines) && refLines.length > 0) {\n const firstSeries = (result.series as Record<string, unknown>[])[0];\n firstSeries.markLine = {\n silent: true,\n symbol: 'none',\n data: refLines.map((rl) => {\n const item: Record<string, unknown> = {};\n if (rl.axis === 'x') item.xAxis = rl.value;\n else item.yAxis = rl.value;\n if (rl.label) item.name = rl.label;\n const lineStyle: Record<string, unknown> = {};\n if (rl.color) lineStyle.color = rl.color;\n if (rl.style) lineStyle.type = rl.style;\n if (Object.keys(lineStyle).length > 0) item.lineStyle = lineStyle;\n if (rl.label) item.label = { formatter: rl.label, position: 'end' };\n return item;\n }),\n };\n }\n\n return result;\n}\n\nfunction buildPie(\n data: unknown,\n mapping: NormalizedMapping | undefined,\n options: Record<string, unknown>,\n): Record<string, unknown> {\n if (!Array.isArray(data)) return {};\n\n const labelField = mapping?.label ?? guessStringField(data);\n const valueField = mapping?.value ?? guessNumberField(data);\n\n if (!labelField || !valueField) return {};\n\n const pieData = data.map((row) => ({\n name: String(row[labelField] ?? ''),\n value: Number(row[valueField] ?? 0),\n }));\n\n const radius = options.donut ? ['40%', '70%'] : '50%';\n const seriesItem: Record<string, unknown> = {\n type: 'pie',\n radius,\n data: pieData,\n label: { overflow: 'truncate', width: 80 },\n };\n\n if (options.showLabel === false) {\n seriesItem.label = { show: false };\n }\n\n const result: Record<string, unknown> = {\n tooltip: { trigger: 'item' },\n legend: { orient: 'vertical', left: 'left' },\n series: [seriesItem],\n };\n\n // Donut center label\n const center = options.center as { label?: string; value?: string } | undefined;\n if (options.donut && center && (center.label || center.value)) {\n const children: Record<string, unknown>[] = [];\n if (center.label) {\n children.push({\n type: 'text',\n top: center.value ? -16 : 0,\n style: { text: center.label, fontSize: 13, fill: '#999', textAlign: 'center' },\n });\n }\n if (center.value) {\n children.push({\n type: 'text',\n top: center.label ? 8 : 0,\n style: { text: center.value, fontSize: 20, fontWeight: 'bold', fill: '#333', textAlign: 'center' },\n });\n }\n result.graphic = [{ type: 'group', left: 'center', top: 'middle', children }];\n }\n\n return result;\n}\n\nfunction buildRadar(\n data: unknown,\n mapping: NormalizedMapping | undefined,\n _options: Record<string, unknown>,\n): Record<string, unknown> {\n if (!Array.isArray(data)) return {};\n\n const axisField = mapping?.axis ?? guessStringField(data);\n const yFields = mapping?.y ?? getNumberFields(data);\n\n if (!axisField || yFields.length === 0) return {};\n\n const indicator = data.map((row) => ({\n name: String(row[axisField] ?? ''),\n }));\n\n const series = yFields.map((field) => ({\n name: field,\n value: data.map((row) => Number(row[field] ?? 0)),\n }));\n\n return {\n tooltip: {},\n legend: { data: yFields },\n radar: { indicator },\n series: [\n {\n type: 'radar',\n data: series,\n },\n ],\n };\n}\n\nfunction buildHeatmap(\n data: unknown,\n mapping: NormalizedMapping | undefined,\n options: Record<string, unknown>,\n): Record<string, unknown> {\n if (!Array.isArray(data)) return {};\n\n // Determine x, y (category), value (number) fields\n const first = data[0] ?? {};\n const keys = Object.keys(first);\n const stringFields = keys.filter((k) => typeof first[k] === 'string');\n const numberFields = keys.filter((k) => typeof first[k] === 'number');\n\n const xField = mapping?.x ?? stringFields[0];\n // For heatmap, y is a category field (string), not a numeric series\n const yField = mapping?.y?.[0] ?? stringFields.find((k) => k !== xField);\n const valueField = mapping?.value ?? numberFields[0];\n\n if (!xField || !yField || !valueField) return {};\n\n // Extract unique categories preserving order of appearance\n const xCats: string[] = [];\n const yCats: string[] = [];\n const xSet = new Set<string>();\n const ySet = new Set<string>();\n\n for (const row of data) {\n const x = String(row[xField] ?? '');\n const y = String(row[yField] ?? '');\n if (!xSet.has(x)) { xSet.add(x); xCats.push(x); }\n if (!ySet.has(y)) { ySet.add(y); yCats.push(y); }\n }\n\n // Build index maps for O(1) lookup\n const xIndex = new Map<string, number>();\n xCats.forEach((v, i) => xIndex.set(v, i));\n const yIndex = new Map<string, number>();\n yCats.forEach((v, i) => yIndex.set(v, i));\n\n // Build [xIndex, yIndex, value] data\n const heatData: (number | null)[][] = [];\n let minVal = Infinity;\n let maxVal = -Infinity;\n\n for (const row of data) {\n const xi = xIndex.get(String(row[xField] ?? '')) ?? 0;\n const yi = yIndex.get(String(row[yField] ?? '')) ?? 0;\n const v = row[valueField] != null ? Number(row[valueField]) : null;\n heatData.push([xi, yi, v]);\n if (v != null) {\n if (v < minVal) minVal = v;\n if (v > maxVal) maxVal = v;\n }\n }\n\n // Handle edge case of empty/no-value data\n if (!isFinite(minVal)) { minVal = 0; maxVal = 1; }\n\n // Determine color range from options or use defaults\n const colorRange = (options.colorRange as string[]) ?? ['#313695', '#4575b4', '#74add1', '#abd9e9', '#fee090', '#fdae61', '#f46d43', '#d73027'];\n\n return {\n xAxis: { type: 'category', data: xCats, splitArea: { show: true } },\n yAxis: { type: 'category', data: yCats, splitArea: { show: true } },\n visualMap: {\n min: options.min != null ? Number(options.min) : minVal,\n max: options.max != null ? Number(options.max) : maxVal,\n calculable: true,\n orient: 'horizontal',\n left: 'center',\n bottom: 0,\n inRange: { color: colorRange },\n },\n tooltip: {\n trigger: 'item',\n formatter: (params: Record<string, unknown>) => {\n const d = params.data as number[];\n if (!d) return '';\n return `${xCats[d[0]]} × ${yCats[d[1]]}: ${d[2] != null ? d[2] : '-'}`;\n },\n },\n grid: { bottom: 60 },\n series: [{\n type: 'heatmap',\n data: heatData,\n label: { show: options.showLabel !== false },\n }],\n };\n}\n\nfunction buildBoxplot(\n data: unknown,\n mapping: NormalizedMapping | undefined,\n _options: Record<string, unknown>,\n): Record<string, unknown> {\n if (!Array.isArray(data) || data.length === 0) return {};\n\n const first = data[0] ?? {};\n const keys = Object.keys(first);\n const stringFields = keys.filter((k) => typeof first[k] === 'string');\n const numberFields = keys.filter((k) => typeof first[k] === 'number');\n\n // Category field (x)\n const xField = mapping?.x ?? stringFields[0];\n\n // Stat fields: use mapping.y if provided (5 fields: min, q1, median, q3, max)\n // Otherwise, try well-known names, then fall back to first 5 number fields\n let statFields: string[];\n if (mapping?.y && mapping.y.length >= 5) {\n statFields = mapping.y.slice(0, 5);\n } else {\n const wellKnown = ['min', 'q1', 'median', 'q3', 'max'];\n const matched = wellKnown.filter((name) => numberFields.includes(name));\n statFields = matched.length === 5 ? matched : numberFields.slice(0, 5);\n }\n\n if (statFields.length < 5) return {};\n\n const categories = xField ? data.map((row) => String(row[xField] ?? '')) : undefined;\n\n const boxData = data.map((row) =>\n statFields.map((f) => Number(row[f] ?? 0)),\n );\n\n const result: Record<string, unknown> = {\n tooltip: { trigger: 'item' },\n series: [{\n type: 'boxplot',\n data: boxData,\n }],\n };\n\n if (categories) {\n result.xAxis = { type: 'category', data: categories };\n result.yAxis = { type: 'value' };\n } else {\n result.xAxis = { type: 'category' };\n result.yAxis = { type: 'value' };\n }\n\n return result;\n}\n\n// ── Helpers ──\n\nfunction guessStringField(data: Record<string, unknown>[]): string | undefined {\n if (data.length === 0) return undefined;\n const first = data[0];\n return Object.keys(first).find((k) => typeof first[k] === 'string');\n}\n\nfunction guessNumberField(data: Record<string, unknown>[]): string | undefined {\n if (data.length === 0) return undefined;\n const first = data[0];\n return Object.keys(first).find((k) => typeof first[k] === 'number');\n}\n\nfunction buildFunnel(\n data: unknown,\n mapping: NormalizedMapping | undefined,\n _options: Record<string, unknown>,\n): Record<string, unknown> {\n if (!Array.isArray(data)) return {};\n\n const labelField = mapping?.label ?? guessStringField(data as Record<string, unknown>[]);\n const valueField = (mapping?.value ?? guessNumberField(data as Record<string, unknown>[]));\n\n if (!labelField || !valueField) return {};\n\n const seriesData = (data as Record<string, unknown>[]).map((row) => ({\n name: String(row[labelField] ?? ''),\n value: Number(row[valueField] ?? 0),\n }));\n\n return {\n tooltip: { trigger: 'item', formatter: '{b}: {c} ({d}%)' },\n legend: { orient: 'vertical', left: 'left' },\n series: [{\n type: 'funnel',\n data: seriesData,\n sort: 'descending',\n gap: 2,\n label: { show: true, position: 'inside' },\n }],\n };\n}\n\nfunction buildWaterfall(\n data: unknown,\n mapping: NormalizedMapping | undefined,\n _options: Record<string, unknown>,\n): Record<string, unknown> {\n if (!Array.isArray(data)) return {};\n\n const records = data as Record<string, unknown>[];\n const xField = mapping?.x ?? guessStringField(records);\n const yField = (mapping?.y ?? [guessNumberField(records)])[0];\n\n if (!xField || !yField) return {};\n\n const categories: string[] = [];\n const baseValues: number[] = [];\n const positiveValues: (number | null)[] = [];\n const negativeValues: (number | null)[] = [];\n\n let running = 0;\n for (const row of records) {\n const label = String(row[xField] ?? '');\n const value = Number(row[yField] ?? 0);\n categories.push(label);\n\n if (value >= 0) {\n baseValues.push(running);\n positiveValues.push(value);\n negativeValues.push(null);\n } else {\n baseValues.push(running + value);\n positiveValues.push(null);\n negativeValues.push(Math.abs(value));\n }\n running += value;\n }\n\n return {\n tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' } },\n xAxis: { type: 'category', data: categories },\n yAxis: { type: 'value' },\n series: [\n {\n name: 'Base',\n type: 'bar',\n stack: 'waterfall',\n itemStyle: { borderColor: 'transparent', color: 'transparent' },\n emphasis: { itemStyle: { borderColor: 'transparent', color: 'transparent' } },\n data: baseValues,\n },\n {\n name: 'Positive',\n type: 'bar',\n stack: 'waterfall',\n data: positiveValues,\n },\n {\n name: 'Negative',\n type: 'bar',\n stack: 'waterfall',\n data: negativeValues,\n },\n ],\n };\n}\n\nfunction buildTreemap(\n data: unknown,\n _options: Record<string, unknown>,\n): Record<string, unknown> {\n if (!Array.isArray(data)) return {};\n\n // Treemap data uses name/value/children directly — pass through to ECharts\n const seriesData = (data as Record<string, unknown>[]).map((item) => toTreeNode(item));\n\n return {\n tooltip: { trigger: 'item' },\n series: [{\n type: 'treemap',\n data: seriesData,\n leafDepth: 1,\n roam: false,\n label: { show: true, formatter: '{b}' },\n }],\n };\n}\n\nfunction toTreeNode(item: Record<string, unknown>): Record<string, unknown> {\n const node: Record<string, unknown> = {\n name: String(item.name ?? ''),\n value: Number(item.value ?? 0),\n };\n if (Array.isArray(item.children)) {\n node.children = (item.children as Record<string, unknown>[]).map((child) => toTreeNode(child));\n }\n return node;\n}\n\nfunction buildHistogram(\n data: unknown,\n mapping: NormalizedMapping | undefined,\n options: Record<string, unknown>,\n): Record<string, unknown> {\n // Extract numeric values from flat array or object array\n let values: number[];\n if (!Array.isArray(data) || data.length === 0) return {};\n\n if (typeof data[0] === 'number') {\n values = data as number[];\n } else {\n const field = mapping?.value ?? guessNumberField(data as Record<string, unknown>[]);\n if (!field) return {};\n values = (data as Record<string, unknown>[]).map((row) => Number(row[field] ?? 0));\n }\n\n if (values.length === 0) return {};\n\n // Determine bin count: explicit or Sturges' rule\n const binCount = typeof options.bins === 'number'\n ? options.bins\n : Math.ceil(Math.log2(values.length) + 1);\n\n const min = Math.min(...values);\n const max = Math.max(...values);\n const range = max - min;\n const binWidth = range / binCount || 1;\n\n // Build bins\n const bins: number[] = new Array(binCount).fill(0);\n const labels: string[] = [];\n\n for (let i = 0; i < binCount; i++) {\n const lo = min + i * binWidth;\n const hi = min + (i + 1) * binWidth;\n const fmt = (n: number) => Number.isInteger(n) ? String(n) : n.toFixed(1);\n labels.push(`${fmt(lo)}\\u2013${fmt(hi)}`);\n }\n\n for (const v of values) {\n let idx = Math.floor((v - min) / binWidth);\n if (idx >= binCount) idx = binCount - 1; // clamp max to last bin\n bins[idx]++;\n }\n\n const series: Record<string, unknown> = {\n type: 'bar',\n data: bins,\n barCategoryGap: '0%',\n };\n\n const result: Record<string, unknown> = {\n xAxis: { type: 'category', data: labels, axisTick: { alignWithLabel: true } },\n yAxis: { type: 'value' },\n series: [series],\n tooltip: { trigger: 'axis' },\n };\n\n // Reference lines\n const refLines = options.referenceLines as ReferenceLineOption[] | undefined;\n if (Array.isArray(refLines) && refLines.length > 0) {\n series.markLine = {\n silent: true,\n symbol: 'none',\n data: refLines.map((rl) => {\n const item: Record<string, unknown> = {};\n if (rl.axis === 'x') item.xAxis = rl.value;\n else item.yAxis = rl.value;\n if (rl.label) item.name = rl.label;\n const lineStyle: Record<string, unknown> = {};\n if (rl.color) lineStyle.color = rl.color;\n if (rl.style) lineStyle.type = rl.style;\n if (Object.keys(lineStyle).length > 0) item.lineStyle = lineStyle;\n if (rl.label) item.label = { formatter: rl.label, position: 'end' };\n return item;\n }),\n };\n }\n\n return result;\n}\n\nfunction getNumberFields(data: Record<string, unknown>[]): string[] {\n if (data.length === 0) return [];\n const first = data[0];\n return Object.keys(first).filter((k) => typeof first[k] === 'number');\n}\n\n/**\n * Deep-merge `overrides` into `base` recursively.\n * If both base[key] and overrides[key] are plain objects, merge recursively.\n * Arrays and other values: overrides[key] wins.\n */\nfunction deepMerge(\n base: Record<string, unknown>,\n overrides: Record<string, unknown>,\n): Record<string, unknown> {\n const result = { ...base };\n for (const key of Object.keys(overrides)) {\n const bv = base[key];\n const ov = overrides[key];\n if (isPlainObject(bv) && isPlainObject(ov)) {\n result[key] = deepMerge(bv as Record<string, unknown>, ov as Record<string, unknown>);\n } else {\n result[key] = ov;\n }\n }\n return result;\n}\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return v != null && typeof v === 'object' && !Array.isArray(v);\n}\n\n/**\n * Build a formatter string or function for ECharts axis labels\n * based on an AxisFormatOption.\n */\nfunction buildAxisFormatter(fmt: AxisFormatOption, locale?: string): (value: number | string) => string {\n return (value: number | string) => {\n let result: string;\n if (fmt.type) {\n const formatStr = fmt.type === 'currency' && fmt.currency\n ? `currency:${fmt.currency}`\n : fmt.type;\n result = formatValue(value, formatStr, locale);\n // For percent type, formatValue divides by 100 — but axis values are already in\n // display units (e.g. 73 means 73%), so use raw suffix instead\n if (fmt.type === 'percent') {\n result = typeof value === 'number'\n ? new Intl.NumberFormat(locale, { maximumFractionDigits: fmt.decimals ?? 2 }).format(value) + '%'\n : String(value) + '%';\n }\n } else {\n result = String(value);\n }\n if (fmt.decimals !== undefined && fmt.type === 'number') {\n const num = Number(value);\n if (!isNaN(num)) {\n result = new Intl.NumberFormat(locale, {\n minimumFractionDigits: fmt.decimals,\n maximumFractionDigits: fmt.decimals,\n }).format(num);\n }\n }\n if (fmt.prefix) result = fmt.prefix + result;\n if (fmt.suffix) result = result + fmt.suffix;\n return result;\n };\n}\n\n/**\n * Apply xFormat/yFormat to the corresponding axis in the ECharts option.\n * Handles both single axis and axis arrays (dual Y axis).\n */\nfunction applyAxisFormat(\n result: Record<string, unknown>,\n axisKey: 'xAxis' | 'yAxis',\n fmt: AxisFormatOption | undefined,\n locale?: string,\n): void {\n if (!fmt || !result[axisKey]) return;\n\n const formatter = buildAxisFormatter(fmt, locale);\n const axis = result[axisKey];\n\n if (Array.isArray(axis)) {\n // Dual axis — apply to all value-type axes\n result[axisKey] = (axis as Record<string, unknown>[]).map((a) => {\n if (a.type === 'value') {\n return { ...a, axisLabel: { ...(a.axisLabel as Record<string, unknown> ?? {}), formatter } };\n }\n return a;\n });\n } else if (isPlainObject(axis)) {\n const a = axis as Record<string, unknown>;\n result[axisKey] = { ...a, axisLabel: { ...(a.axisLabel as Record<string, unknown> ?? {}), formatter } };\n }\n}\n","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { UWidgetSpec, UWidgetEvent } from '../core/types.js';\nimport { toEChartsOption } from '../renderers/echarts-adapter.js';\nimport { themeStyles } from '../styles/tokens.js';\n\n// Tree-shakeable ECharts imports\nimport * as echarts from 'echarts/core';\nimport { BarChart, LineChart, PieChart, ScatterChart, RadarChart, HeatmapChart, BoxplotChart, FunnelChart, TreemapChart } from 'echarts/charts';\nimport {\n GridComponent,\n TooltipComponent,\n LegendComponent,\n RadarComponent,\n MarkLineComponent,\n VisualMapComponent,\n} from 'echarts/components';\nimport { CanvasRenderer } from 'echarts/renderers';\n\necharts.use([\n BarChart,\n LineChart,\n PieChart,\n ScatterChart,\n RadarChart,\n HeatmapChart,\n BoxplotChart,\n FunnelChart,\n TreemapChart,\n GridComponent,\n TooltipComponent,\n LegendComponent,\n RadarComponent,\n MarkLineComponent,\n VisualMapComponent,\n CanvasRenderer,\n]);\n\n@customElement('uw-chart')\nexport class UwChart extends LitElement {\n static styles = [\n themeStyles,\n css`\n :host {\n display: block;\n container: uw-chart / inline-size;\n }\n\n .chart-container {\n width: 100%;\n height: var(--u-widget-chart-height, 300px);\n }\n\n @container uw-chart (max-width: 20rem) {\n .chart-container {\n height: var(--u-widget-chart-height-narrow, 200px);\n }\n }\n `,\n ];\n\n @property({ type: Object })\n spec: UWidgetSpec | null = null;\n\n private _chart: echarts.ECharts | null = null;\n private _container: HTMLDivElement | null = null;\n private _resizeObserver: ResizeObserver | null = null;\n\n render() {\n if (!this.spec) return nothing;\n const label = this.spec.title ?? `${this.spec.widget} chart`;\n return html`<div class=\"chart-container\" part=\"chart\" role=\"img\" aria-label=${label}></div>`;\n }\n\n protected firstUpdated() {\n this._container = this.shadowRoot?.querySelector('.chart-container') as HTMLDivElement | null;\n this._initChart();\n if (this._container) {\n this._resizeObserver = new ResizeObserver(() => this._chart?.resize());\n this._resizeObserver.observe(this._container);\n }\n }\n\n protected updated(changed: Map<string, unknown>) {\n if (changed.has('spec') && this._container) {\n this._updateChart();\n }\n }\n\n private _initChart() {\n if (!this._container || !this.spec) return;\n\n try {\n this._chart = echarts.init(this._container);\n this._chart.on('click', (params: Record<string, unknown>) => {\n this._onChartClick(params);\n });\n this._updateChart();\n } catch (e) {\n console.warn('[uw-chart] Failed to initialize ECharts:', (e as Error).message);\n }\n }\n\n private _onChartClick(params: Record<string, unknown>) {\n if (!this.spec) return;\n const detail: UWidgetEvent = {\n type: 'select',\n widget: this.spec.widget,\n id: this.spec.id,\n data: {\n name: params.name as string,\n seriesName: params.seriesName as string,\n value: params.value,\n dataIndex: params.dataIndex as number,\n },\n };\n this.dispatchEvent(\n new CustomEvent('u-widget-internal', {\n detail,\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private _updateChart() {\n if (!this._chart || !this.spec) return;\n\n const option = toEChartsOption(this.spec);\n\n // Inject theme colors from CSS custom properties,\n // but only if the spec didn't provide explicit colors\n const hasSpecColors = Array.isArray(\n (this.spec.options as Record<string, unknown> | undefined)?.colors,\n ) && ((this.spec.options as Record<string, unknown>).colors as unknown[]).length > 0;\n if (!hasSpecColors) {\n const themeColors = this._readThemeColors();\n if (themeColors.length > 0) {\n option.color = themeColors;\n }\n }\n if (this._readCSSVar('--u-widget-bg')) {\n option.backgroundColor = 'transparent';\n }\n\n // Inject text/axis/grid theme from CSS variables\n this._applyThemeStyle(option);\n\n this._chart.setOption(option, true);\n }\n\n private _applyThemeStyle(option: Record<string, unknown>) {\n const textColor = this._readCSSVar('--u-widget-text');\n const secondaryColor = this._readCSSVar('--u-widget-text-secondary');\n const borderColor = this._readCSSVar('--u-widget-border');\n\n if (!textColor) return; // no theme vars available\n\n // Global text style\n option.textStyle = { ...(option.textStyle as Record<string, unknown>), color: textColor };\n\n // Axis styling — merge into existing axis config preserving formatter etc.\n const mergeAxisTheme = (axis: unknown): unknown => {\n if (!axis || typeof axis !== 'object') return axis;\n if (Array.isArray(axis)) return axis.map(mergeAxisTheme);\n const a = axis as Record<string, unknown>;\n return {\n ...a,\n axisLabel: { ...(a.axisLabel as Record<string, unknown> ?? {}), color: secondaryColor || textColor },\n axisLine: { lineStyle: { color: borderColor || secondaryColor } },\n splitLine: { lineStyle: { color: borderColor } },\n };\n };\n if (option.xAxis) option.xAxis = mergeAxisTheme(option.xAxis);\n if (option.yAxis) option.yAxis = mergeAxisTheme(option.yAxis);\n\n // Legend\n if (option.legend && typeof option.legend === 'object') {\n option.legend = { ...option.legend as Record<string, unknown>, textStyle: { color: textColor } };\n }\n }\n\n private _readThemeColors(): string[] {\n const colors: string[] = [];\n // Read --u-widget-chart-color-N (1-based) custom properties\n for (let i = 1; i <= 10; i++) {\n const c = this._readCSSVar(`--u-widget-chart-color-${i}`);\n if (c) colors.push(c);\n else break;\n }\n // Fallback: use --u-widget-primary as first color if no palette defined\n if (colors.length === 0) {\n const primary = this._readCSSVar('--u-widget-primary');\n if (primary) colors.push(primary);\n }\n return colors;\n }\n\n private _readCSSVar(name: string): string {\n return getComputedStyle(this).getPropertyValue(name).trim();\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this._resizeObserver?.disconnect();\n this._resizeObserver = null;\n this._chart?.dispose();\n this._chart = null;\n }\n\n /** Resize the chart (call when container size changes). */\n resize() {\n this._chart?.resize();\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'uw-chart': UwChart;\n }\n}\n"],"names":["matchConditionalStyle","row","rules","rule","raw","val","aboveOk","belowOk","toEChartsOption","spec","widget","data","mapping","normalizeMapping","options","result","buildCartesian","buildPie","buildScatter","buildRadar","buildHeatmap","buildBoxplot","buildFunnel","buildWaterfall","buildTreemap","buildHistogram","locale","applyAxisFormat","passthrough","deepMerge","type","xField","guessStringField","yFields","guessNumberField","categories","horizontal","seriesOverrides","condStyles","seriesItems","field","i","s","match","item","override","catAxis","valAxis","needsDualYAxis","yAxisConfig","secondAxis","legendNames","refLines","rl","lineStyle","numFields","getNumberFields","yField","colorField","sizeField","opacityField","opacityMin","opacityMax","v","opacityRange","toPoint","pt","style","norm","symbolSizeFn","groups","key","name","points","series","firstSeries","labelField","valueField","pieData","seriesItem","center","children","_options","axisField","indicator","first","keys","stringFields","k","numberFields","xCats","yCats","xSet","ySet","x","y","xIndex","yIndex","heatData","minVal","maxVal","xi","yi","colorRange","params","d","statFields","matched","boxData","f","seriesData","records","baseValues","positiveValues","negativeValues","running","label","value","toTreeNode","node","child","values","binCount","min","binWidth","bins","labels","lo","hi","fmt","n","idx","base","overrides","bv","ov","isPlainObject","buildAxisFormatter","formatStr","formatValue","num","axisKey","formatter","axis","a","echarts","BarChart","LineChart","PieChart","ScatterChart","RadarChart","HeatmapChart","BoxplotChart","FunnelChart","TreemapChart","GridComponent","TooltipComponent","LegendComponent","RadarComponent","MarkLineComponent","VisualMapComponent","CanvasRenderer","UwChart","LitElement","nothing","html","changed","detail","option","themeColors","textColor","secondaryColor","borderColor","mergeAxisTheme","colors","c","primary","themeStyles","css","__decorateClass","property","customElement"],"mappings":"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"}
|