@iyulab/u-widgets 0.4.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/LICENSE +21 -0
- package/README.md +93 -0
- package/dist/formdown-BWJ6QGJs.js +94 -0
- package/dist/formdown-BWJ6QGJs.js.map +1 -0
- package/dist/infer-CNOiD2dS.js +91 -0
- package/dist/infer-CNOiD2dS.js.map +1 -0
- package/dist/tokens-x1kDxgG8.js +78 -0
- package/dist/tokens-x1kDxgG8.js.map +1 -0
- package/dist/u-widgets-charts.d.ts +227 -0
- package/dist/u-widgets-charts.js +502 -0
- package/dist/u-widgets-charts.js.map +1 -0
- package/dist/u-widgets-forms.d.ts +81 -0
- package/dist/u-widgets-forms.js +59 -0
- package/dist/u-widgets-forms.js.map +1 -0
- package/dist/u-widgets-tools.d.ts +400 -0
- package/dist/u-widgets-tools.js +1372 -0
- package/dist/u-widgets-tools.js.map +1 -0
- package/dist/u-widgets.d.ts +478 -0
- package/dist/u-widgets.js +4073 -0
- package/dist/u-widgets.js.map +1 -0
- package/package.json +97 -0
- package/schema/u-widget.schema.json +375 -0
|
@@ -0,0 +1,502 @@
|
|
|
1
|
+
import { css as V, LitElement as I, nothing as P, html as E } from "lit";
|
|
2
|
+
import { property as R, customElement as T } from "lit/decorators.js";
|
|
3
|
+
import { a as D, t as $ } from "./tokens-x1kDxgG8.js";
|
|
4
|
+
import * as z from "echarts/core";
|
|
5
|
+
import { BarChart as B, LineChart as q, PieChart as G, ScatterChart as H, RadarChart as K, HeatmapChart as U, BoxplotChart as W, FunnelChart as J, TreemapChart as Q } from "echarts/charts";
|
|
6
|
+
import { GridComponent as X, TooltipComponent as Y, LegendComponent as Z, RadarComponent as ee, MarkLineComponent as te, VisualMapComponent as re } from "echarts/components";
|
|
7
|
+
import { CanvasRenderer as se } from "echarts/renderers";
|
|
8
|
+
function ie(e) {
|
|
9
|
+
const t = e.widget, i = e.data, r = e.mapping ? D(e.mapping) : void 0, n = e.options ?? {};
|
|
10
|
+
if (!i) return {};
|
|
11
|
+
let s;
|
|
12
|
+
switch (t) {
|
|
13
|
+
case "chart.bar":
|
|
14
|
+
s = F(i, r, "bar", n);
|
|
15
|
+
break;
|
|
16
|
+
case "chart.line":
|
|
17
|
+
s = F(i, r, "line", n);
|
|
18
|
+
break;
|
|
19
|
+
case "chart.area":
|
|
20
|
+
s = F(i, r, "line", { ...n, _area: !0 });
|
|
21
|
+
break;
|
|
22
|
+
case "chart.pie":
|
|
23
|
+
s = ae(i, r, n);
|
|
24
|
+
break;
|
|
25
|
+
case "chart.scatter":
|
|
26
|
+
s = ne(i, r, n);
|
|
27
|
+
break;
|
|
28
|
+
case "chart.radar":
|
|
29
|
+
s = oe(i, r);
|
|
30
|
+
break;
|
|
31
|
+
case "chart.heatmap":
|
|
32
|
+
s = le(i, r, n);
|
|
33
|
+
break;
|
|
34
|
+
case "chart.box":
|
|
35
|
+
s = ce(i, r);
|
|
36
|
+
break;
|
|
37
|
+
case "chart.funnel":
|
|
38
|
+
s = ue(i, r);
|
|
39
|
+
break;
|
|
40
|
+
case "chart.waterfall":
|
|
41
|
+
s = fe(i, r);
|
|
42
|
+
break;
|
|
43
|
+
case "chart.treemap":
|
|
44
|
+
s = he(i);
|
|
45
|
+
break;
|
|
46
|
+
default:
|
|
47
|
+
return {};
|
|
48
|
+
}
|
|
49
|
+
n.legend === !1 && s.legend && (s.legend = { ...s.legend, show: !1 }), n.grid === !1 && (s.xAxis && typeof s.xAxis == "object" && (s.xAxis = { ...s.xAxis, splitLine: { show: !1 } }), s.yAxis && typeof s.yAxis == "object" && (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);
|
|
50
|
+
const c = n.echarts;
|
|
51
|
+
return c && typeof c == "object" && (s = L(s, c)), s;
|
|
52
|
+
}
|
|
53
|
+
function F(e, t, i, r) {
|
|
54
|
+
if (!Array.isArray(e)) return {};
|
|
55
|
+
const n = t?.x ?? C(e), s = t?.y ?? [k(e)].filter(Boolean);
|
|
56
|
+
if (!n || s.length === 0) return {};
|
|
57
|
+
const c = e.map((a) => String(a[n] ?? "")), u = !!r.horizontal, l = s.map((a) => {
|
|
58
|
+
const d = {
|
|
59
|
+
name: a,
|
|
60
|
+
type: i,
|
|
61
|
+
data: e.map((v) => v[a] ?? null)
|
|
62
|
+
};
|
|
63
|
+
return r._area && (d.areaStyle = {}), r.smooth && (d.smooth = !0), r.step && (d.step = r.step === !0 ? "end" : r.step), d;
|
|
64
|
+
}), m = { type: "category", data: c }, g = { type: "value" };
|
|
65
|
+
r.histogram && (m.axisTick = { alignWithLabel: !0 }, l.forEach((a) => {
|
|
66
|
+
a.barCategoryGap = "0%";
|
|
67
|
+
}));
|
|
68
|
+
const y = {
|
|
69
|
+
xAxis: u ? g : m,
|
|
70
|
+
yAxis: u ? m : g,
|
|
71
|
+
series: l,
|
|
72
|
+
tooltip: { trigger: "axis" }
|
|
73
|
+
};
|
|
74
|
+
s.length > 1 && (y.legend = { data: s }), r.stack && y.series.forEach((a) => {
|
|
75
|
+
a.stack = "total";
|
|
76
|
+
});
|
|
77
|
+
const b = r.referenceLines;
|
|
78
|
+
return Array.isArray(b) && b.length > 0 && l.length > 0 && (l[0].markLine = {
|
|
79
|
+
silent: !0,
|
|
80
|
+
symbol: "none",
|
|
81
|
+
data: b.map((a) => {
|
|
82
|
+
const d = {};
|
|
83
|
+
a.axis === "x" ? d.xAxis = a.value : d.yAxis = a.value, a.label && (d.name = a.label);
|
|
84
|
+
const v = {};
|
|
85
|
+
return a.color && (v.color = a.color), a.style && (v.type = a.style), Object.keys(v).length > 0 && (d.lineStyle = v), a.label && (d.label = { formatter: a.label, position: "end" }), d;
|
|
86
|
+
})
|
|
87
|
+
}), y;
|
|
88
|
+
}
|
|
89
|
+
function ne(e, t, i) {
|
|
90
|
+
if (!Array.isArray(e)) return {};
|
|
91
|
+
const r = j(e), n = t?.x ?? r[0], s = (t?.y ?? [r[1]])[0], c = t?.color, u = t?.size, l = t?.opacity;
|
|
92
|
+
if (!n || !s) return {};
|
|
93
|
+
const m = {
|
|
94
|
+
xAxis: { type: "value" },
|
|
95
|
+
yAxis: { type: "value" },
|
|
96
|
+
tooltip: { trigger: "item" }
|
|
97
|
+
};
|
|
98
|
+
let g = 1 / 0, y = -1 / 0;
|
|
99
|
+
if (l)
|
|
100
|
+
for (const f of e) {
|
|
101
|
+
const o = Number(f[l] ?? 0);
|
|
102
|
+
o < g && (g = o), o > y && (y = o);
|
|
103
|
+
}
|
|
104
|
+
const b = y - g || 1, a = (f) => {
|
|
105
|
+
const o = [Number(f[n] ?? 0), Number(f[s] ?? 0)];
|
|
106
|
+
if (u && o.push(Number(f[u] ?? 0)), l) {
|
|
107
|
+
const A = 0.1 + 0.9 * ((Number(f[l] ?? 0) - g) / b);
|
|
108
|
+
return { value: o, itemStyle: { opacity: Math.round(A * 100) / 100 } };
|
|
109
|
+
}
|
|
110
|
+
return o;
|
|
111
|
+
}, d = u ? (f) => {
|
|
112
|
+
const p = (Array.isArray(f) ? f : f.value)[2] ?? 0;
|
|
113
|
+
return Math.max(4, Math.min(60, Math.sqrt(p) * 4));
|
|
114
|
+
} : void 0;
|
|
115
|
+
if (c) {
|
|
116
|
+
const f = /* @__PURE__ */ new Map();
|
|
117
|
+
for (const p of e) {
|
|
118
|
+
const A = String(p[c] ?? "unknown");
|
|
119
|
+
f.has(A) || f.set(A, []), f.get(A).push(a(p));
|
|
120
|
+
}
|
|
121
|
+
const o = [];
|
|
122
|
+
for (const [p, A] of f) {
|
|
123
|
+
const h = { name: p, type: "scatter", data: A };
|
|
124
|
+
d && (h.symbolSize = d), o.push(h);
|
|
125
|
+
}
|
|
126
|
+
m.series = o, m.legend = { data: Array.from(f.keys()) };
|
|
127
|
+
} else {
|
|
128
|
+
const o = { type: "scatter", data: e.map((p) => a(p)) };
|
|
129
|
+
d && (o.symbolSize = d), m.series = [o];
|
|
130
|
+
}
|
|
131
|
+
const v = i.referenceLines;
|
|
132
|
+
if (Array.isArray(v) && v.length > 0) {
|
|
133
|
+
const f = m.series[0];
|
|
134
|
+
f.markLine = {
|
|
135
|
+
silent: !0,
|
|
136
|
+
symbol: "none",
|
|
137
|
+
data: v.map((o) => {
|
|
138
|
+
const p = {};
|
|
139
|
+
o.axis === "x" ? p.xAxis = o.value : p.yAxis = o.value, o.label && (p.name = o.label);
|
|
140
|
+
const A = {};
|
|
141
|
+
return o.color && (A.color = o.color), o.style && (A.type = o.style), Object.keys(A).length > 0 && (p.lineStyle = A), o.label && (p.label = { formatter: o.label, position: "end" }), p;
|
|
142
|
+
})
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
return m;
|
|
146
|
+
}
|
|
147
|
+
function ae(e, t, i) {
|
|
148
|
+
if (!Array.isArray(e)) return {};
|
|
149
|
+
const r = t?.label ?? C(e), n = t?.value ?? k(e);
|
|
150
|
+
if (!r || !n) return {};
|
|
151
|
+
const s = e.map((l) => ({
|
|
152
|
+
name: String(l[r] ?? ""),
|
|
153
|
+
value: Number(l[n] ?? 0)
|
|
154
|
+
})), u = {
|
|
155
|
+
type: "pie",
|
|
156
|
+
radius: i.donut ? ["40%", "70%"] : "50%",
|
|
157
|
+
data: s,
|
|
158
|
+
label: { overflow: "truncate", width: 80 }
|
|
159
|
+
};
|
|
160
|
+
return i.showLabel === !1 && (u.label = { show: !1 }), {
|
|
161
|
+
tooltip: { trigger: "item" },
|
|
162
|
+
legend: { orient: "vertical", left: "left" },
|
|
163
|
+
series: [u]
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
function oe(e, t, i) {
|
|
167
|
+
if (!Array.isArray(e)) return {};
|
|
168
|
+
const r = t?.axis ?? C(e), n = t?.y ?? j(e);
|
|
169
|
+
if (!r || n.length === 0) return {};
|
|
170
|
+
const s = e.map((u) => ({
|
|
171
|
+
name: String(u[r] ?? "")
|
|
172
|
+
})), c = n.map((u) => ({
|
|
173
|
+
name: u,
|
|
174
|
+
value: e.map((l) => Number(l[u] ?? 0))
|
|
175
|
+
}));
|
|
176
|
+
return {
|
|
177
|
+
tooltip: {},
|
|
178
|
+
legend: { data: n },
|
|
179
|
+
radar: { indicator: s },
|
|
180
|
+
series: [
|
|
181
|
+
{
|
|
182
|
+
type: "radar",
|
|
183
|
+
data: c
|
|
184
|
+
}
|
|
185
|
+
]
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
function le(e, t, i) {
|
|
189
|
+
if (!Array.isArray(e)) return {};
|
|
190
|
+
const r = e[0] ?? {}, n = Object.keys(r), s = n.filter((h) => typeof r[h] == "string"), c = n.filter((h) => typeof r[h] == "number"), u = t?.x ?? s[0], l = t?.y?.[0] ?? s.find((h) => h !== u), m = t?.value ?? c[0];
|
|
191
|
+
if (!u || !l || !m) return {};
|
|
192
|
+
const g = [], y = [], b = /* @__PURE__ */ new Set(), a = /* @__PURE__ */ new Set();
|
|
193
|
+
for (const h of e) {
|
|
194
|
+
const x = String(h[u] ?? ""), w = String(h[l] ?? "");
|
|
195
|
+
b.has(x) || (b.add(x), g.push(x)), a.has(w) || (a.add(w), y.push(w));
|
|
196
|
+
}
|
|
197
|
+
const d = /* @__PURE__ */ new Map();
|
|
198
|
+
g.forEach((h, x) => d.set(h, x));
|
|
199
|
+
const v = /* @__PURE__ */ new Map();
|
|
200
|
+
y.forEach((h, x) => v.set(h, x));
|
|
201
|
+
const f = [];
|
|
202
|
+
let o = 1 / 0, p = -1 / 0;
|
|
203
|
+
for (const h of e) {
|
|
204
|
+
const x = d.get(String(h[u] ?? "")) ?? 0, w = v.get(String(h[l] ?? "")) ?? 0, S = h[m] != null ? Number(h[m]) : null;
|
|
205
|
+
f.push([x, w, S]), S != null && (S < o && (o = S), S > p && (p = S));
|
|
206
|
+
}
|
|
207
|
+
isFinite(o) || (o = 0, p = 1);
|
|
208
|
+
const A = i.colorRange ?? ["#313695", "#4575b4", "#74add1", "#abd9e9", "#fee090", "#fdae61", "#f46d43", "#d73027"];
|
|
209
|
+
return {
|
|
210
|
+
xAxis: { type: "category", data: g, splitArea: { show: !0 } },
|
|
211
|
+
yAxis: { type: "category", data: y, splitArea: { show: !0 } },
|
|
212
|
+
visualMap: {
|
|
213
|
+
min: i.min != null ? Number(i.min) : o,
|
|
214
|
+
max: i.max != null ? Number(i.max) : p,
|
|
215
|
+
calculable: !0,
|
|
216
|
+
orient: "horizontal",
|
|
217
|
+
left: "center",
|
|
218
|
+
bottom: 0,
|
|
219
|
+
inRange: { color: A }
|
|
220
|
+
},
|
|
221
|
+
tooltip: {
|
|
222
|
+
trigger: "item",
|
|
223
|
+
formatter: (h) => {
|
|
224
|
+
const x = h.data;
|
|
225
|
+
return x ? `${g[x[0]]} × ${y[x[1]]}: ${x[2] != null ? x[2] : "-"}` : "";
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
grid: { bottom: 60 },
|
|
229
|
+
series: [{
|
|
230
|
+
type: "heatmap",
|
|
231
|
+
data: f,
|
|
232
|
+
label: { show: i.showLabel !== !1 }
|
|
233
|
+
}]
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
function ce(e, t, i) {
|
|
237
|
+
if (!Array.isArray(e) || e.length === 0) return {};
|
|
238
|
+
const r = e[0] ?? {}, n = Object.keys(r), s = n.filter((b) => typeof r[b] == "string"), c = n.filter((b) => typeof r[b] == "number"), u = t?.x ?? s[0];
|
|
239
|
+
let l;
|
|
240
|
+
if (t?.y && t.y.length >= 5)
|
|
241
|
+
l = t.y.slice(0, 5);
|
|
242
|
+
else {
|
|
243
|
+
const a = ["min", "q1", "median", "q3", "max"].filter((d) => c.includes(d));
|
|
244
|
+
l = a.length === 5 ? a : c.slice(0, 5);
|
|
245
|
+
}
|
|
246
|
+
if (l.length < 5) return {};
|
|
247
|
+
const m = u ? e.map((b) => String(b[u] ?? "")) : void 0, g = e.map(
|
|
248
|
+
(b) => l.map((a) => Number(b[a] ?? 0))
|
|
249
|
+
), y = {
|
|
250
|
+
tooltip: { trigger: "item" },
|
|
251
|
+
series: [{
|
|
252
|
+
type: "boxplot",
|
|
253
|
+
data: g
|
|
254
|
+
}]
|
|
255
|
+
};
|
|
256
|
+
return m ? (y.xAxis = { type: "category", data: m }, y.yAxis = { type: "value" }) : (y.xAxis = { type: "category" }, y.yAxis = { type: "value" }), y;
|
|
257
|
+
}
|
|
258
|
+
function C(e) {
|
|
259
|
+
if (e.length === 0) return;
|
|
260
|
+
const t = e[0];
|
|
261
|
+
return Object.keys(t).find((i) => typeof t[i] == "string");
|
|
262
|
+
}
|
|
263
|
+
function k(e) {
|
|
264
|
+
if (e.length === 0) return;
|
|
265
|
+
const t = e[0];
|
|
266
|
+
return Object.keys(t).find((i) => typeof t[i] == "number");
|
|
267
|
+
}
|
|
268
|
+
function ue(e, t, i) {
|
|
269
|
+
if (!Array.isArray(e)) return {};
|
|
270
|
+
const r = t?.label ?? C(e), n = t?.value ?? k(e);
|
|
271
|
+
if (!r || !n) return {};
|
|
272
|
+
const s = e.map((c) => ({
|
|
273
|
+
name: String(c[r] ?? ""),
|
|
274
|
+
value: Number(c[n] ?? 0)
|
|
275
|
+
}));
|
|
276
|
+
return {
|
|
277
|
+
tooltip: { trigger: "item", formatter: "{b}: {c} ({d}%)" },
|
|
278
|
+
legend: { orient: "vertical", left: "left" },
|
|
279
|
+
series: [{
|
|
280
|
+
type: "funnel",
|
|
281
|
+
data: s,
|
|
282
|
+
sort: "descending",
|
|
283
|
+
gap: 2,
|
|
284
|
+
label: { show: !0, position: "inside" }
|
|
285
|
+
}]
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
function fe(e, t, i) {
|
|
289
|
+
if (!Array.isArray(e)) return {};
|
|
290
|
+
const r = e, n = t?.x ?? C(r), s = (t?.y ?? [k(r)])[0];
|
|
291
|
+
if (!n || !s) return {};
|
|
292
|
+
const c = [], u = [], l = [], m = [];
|
|
293
|
+
let g = 0;
|
|
294
|
+
for (const y of r) {
|
|
295
|
+
const b = String(y[n] ?? ""), a = Number(y[s] ?? 0);
|
|
296
|
+
c.push(b), a >= 0 ? (u.push(g), l.push(a), m.push(null)) : (u.push(g + a), l.push(null), m.push(Math.abs(a))), g += a;
|
|
297
|
+
}
|
|
298
|
+
return {
|
|
299
|
+
tooltip: { trigger: "axis", axisPointer: { type: "shadow" } },
|
|
300
|
+
xAxis: { type: "category", data: c },
|
|
301
|
+
yAxis: { type: "value" },
|
|
302
|
+
series: [
|
|
303
|
+
{
|
|
304
|
+
name: "Base",
|
|
305
|
+
type: "bar",
|
|
306
|
+
stack: "waterfall",
|
|
307
|
+
itemStyle: { borderColor: "transparent", color: "transparent" },
|
|
308
|
+
emphasis: { itemStyle: { borderColor: "transparent", color: "transparent" } },
|
|
309
|
+
data: u
|
|
310
|
+
},
|
|
311
|
+
{
|
|
312
|
+
name: "Positive",
|
|
313
|
+
type: "bar",
|
|
314
|
+
stack: "waterfall",
|
|
315
|
+
data: l
|
|
316
|
+
},
|
|
317
|
+
{
|
|
318
|
+
name: "Negative",
|
|
319
|
+
type: "bar",
|
|
320
|
+
stack: "waterfall",
|
|
321
|
+
data: m
|
|
322
|
+
}
|
|
323
|
+
]
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
function he(e, t) {
|
|
327
|
+
if (!Array.isArray(e)) return {};
|
|
328
|
+
const i = e.map((r) => N(r));
|
|
329
|
+
return {
|
|
330
|
+
tooltip: { trigger: "item" },
|
|
331
|
+
series: [{
|
|
332
|
+
type: "treemap",
|
|
333
|
+
data: i,
|
|
334
|
+
leafDepth: 1,
|
|
335
|
+
roam: !1,
|
|
336
|
+
label: { show: !0, formatter: "{b}" }
|
|
337
|
+
}]
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
function N(e) {
|
|
341
|
+
const t = {
|
|
342
|
+
name: String(e.name ?? ""),
|
|
343
|
+
value: Number(e.value ?? 0)
|
|
344
|
+
};
|
|
345
|
+
return Array.isArray(e.children) && (t.children = e.children.map((i) => N(i))), t;
|
|
346
|
+
}
|
|
347
|
+
function j(e) {
|
|
348
|
+
if (e.length === 0) return [];
|
|
349
|
+
const t = e[0];
|
|
350
|
+
return Object.keys(t).filter((i) => typeof t[i] == "number");
|
|
351
|
+
}
|
|
352
|
+
function L(e, t) {
|
|
353
|
+
const i = { ...e };
|
|
354
|
+
for (const r of Object.keys(t)) {
|
|
355
|
+
const n = e[r], s = t[r];
|
|
356
|
+
O(n) && O(s) ? i[r] = L(n, s) : i[r] = s;
|
|
357
|
+
}
|
|
358
|
+
return i;
|
|
359
|
+
}
|
|
360
|
+
function O(e) {
|
|
361
|
+
return e != null && typeof e == "object" && !Array.isArray(e);
|
|
362
|
+
}
|
|
363
|
+
var ye = Object.defineProperty, de = Object.getOwnPropertyDescriptor, M = (e, t, i, r) => {
|
|
364
|
+
for (var n = r > 1 ? void 0 : r ? de(t, i) : t, s = e.length - 1, c; s >= 0; s--)
|
|
365
|
+
(c = e[s]) && (n = (r ? c(t, i, n) : c(n)) || n);
|
|
366
|
+
return r && n && ye(t, i, n), n;
|
|
367
|
+
};
|
|
368
|
+
z.use([
|
|
369
|
+
B,
|
|
370
|
+
q,
|
|
371
|
+
G,
|
|
372
|
+
H,
|
|
373
|
+
K,
|
|
374
|
+
U,
|
|
375
|
+
W,
|
|
376
|
+
J,
|
|
377
|
+
Q,
|
|
378
|
+
X,
|
|
379
|
+
Y,
|
|
380
|
+
Z,
|
|
381
|
+
ee,
|
|
382
|
+
te,
|
|
383
|
+
re,
|
|
384
|
+
se
|
|
385
|
+
]);
|
|
386
|
+
let _ = class extends I {
|
|
387
|
+
constructor() {
|
|
388
|
+
super(...arguments), this.spec = null, this._chart = null, this._container = null, this._resizeObserver = null;
|
|
389
|
+
}
|
|
390
|
+
render() {
|
|
391
|
+
if (!this.spec) return P;
|
|
392
|
+
const e = this.spec.title ?? `${this.spec.widget} chart`;
|
|
393
|
+
return E`<div class="chart-container" part="chart" role="img" aria-label=${e}></div>`;
|
|
394
|
+
}
|
|
395
|
+
firstUpdated() {
|
|
396
|
+
this._container = this.shadowRoot?.querySelector(".chart-container"), this._initChart(), this._container && (this._resizeObserver = new ResizeObserver(() => this._chart?.resize()), this._resizeObserver.observe(this._container));
|
|
397
|
+
}
|
|
398
|
+
updated(e) {
|
|
399
|
+
e.has("spec") && this._container && this._updateChart();
|
|
400
|
+
}
|
|
401
|
+
_initChart() {
|
|
402
|
+
if (!(!this._container || !this.spec))
|
|
403
|
+
try {
|
|
404
|
+
this._chart = z.init(this._container), this._chart.on("click", (e) => {
|
|
405
|
+
this._onChartClick(e);
|
|
406
|
+
}), this._updateChart();
|
|
407
|
+
} catch (e) {
|
|
408
|
+
console.warn("[u-chart] Failed to initialize ECharts:", e.message);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
_onChartClick(e) {
|
|
412
|
+
if (!this.spec) return;
|
|
413
|
+
const t = {
|
|
414
|
+
type: "select",
|
|
415
|
+
widget: this.spec.widget,
|
|
416
|
+
id: this.spec.id,
|
|
417
|
+
data: {
|
|
418
|
+
name: e.name,
|
|
419
|
+
seriesName: e.seriesName,
|
|
420
|
+
value: e.value,
|
|
421
|
+
dataIndex: e.dataIndex
|
|
422
|
+
}
|
|
423
|
+
};
|
|
424
|
+
this.dispatchEvent(
|
|
425
|
+
new CustomEvent("u-widget-internal", {
|
|
426
|
+
detail: t,
|
|
427
|
+
bubbles: !0,
|
|
428
|
+
composed: !0
|
|
429
|
+
})
|
|
430
|
+
);
|
|
431
|
+
}
|
|
432
|
+
_updateChart() {
|
|
433
|
+
if (!this._chart || !this.spec) return;
|
|
434
|
+
const e = ie(this.spec), t = this._readThemeColors();
|
|
435
|
+
t.length > 0 && (e.color = t), this._readCSSVar("--u-widget-bg") && (e.backgroundColor = "transparent"), this._applyThemeStyle(e), this._chart.setOption(e, !0);
|
|
436
|
+
}
|
|
437
|
+
_applyThemeStyle(e) {
|
|
438
|
+
const t = this._readCSSVar("--u-widget-text"), i = this._readCSSVar("--u-widget-text-secondary"), r = this._readCSSVar("--u-widget-border");
|
|
439
|
+
if (!t) return;
|
|
440
|
+
e.textStyle = { ...e.textStyle, color: t };
|
|
441
|
+
const n = {
|
|
442
|
+
axisLabel: { color: i || t },
|
|
443
|
+
axisLine: { lineStyle: { color: r || i } },
|
|
444
|
+
splitLine: { lineStyle: { color: r } }
|
|
445
|
+
};
|
|
446
|
+
e.xAxis && typeof e.xAxis == "object" && (e.xAxis = { ...e.xAxis, ...n }), e.yAxis && typeof e.yAxis == "object" && (e.yAxis = { ...e.yAxis, ...n }), e.legend && typeof e.legend == "object" && (e.legend = { ...e.legend, textStyle: { color: t } });
|
|
447
|
+
}
|
|
448
|
+
_readThemeColors() {
|
|
449
|
+
const e = [];
|
|
450
|
+
for (let t = 1; t <= 10; t++) {
|
|
451
|
+
const i = this._readCSSVar(`--u-widget-chart-color-${t}`);
|
|
452
|
+
if (i) e.push(i);
|
|
453
|
+
else break;
|
|
454
|
+
}
|
|
455
|
+
if (e.length === 0) {
|
|
456
|
+
const t = this._readCSSVar("--u-widget-primary");
|
|
457
|
+
t && e.push(t);
|
|
458
|
+
}
|
|
459
|
+
return e;
|
|
460
|
+
}
|
|
461
|
+
_readCSSVar(e) {
|
|
462
|
+
return getComputedStyle(this).getPropertyValue(e).trim();
|
|
463
|
+
}
|
|
464
|
+
disconnectedCallback() {
|
|
465
|
+
super.disconnectedCallback(), this._resizeObserver?.disconnect(), this._resizeObserver = null, this._chart?.dispose(), this._chart = null;
|
|
466
|
+
}
|
|
467
|
+
/** Resize the chart (call when container size changes). */
|
|
468
|
+
resize() {
|
|
469
|
+
this._chart?.resize();
|
|
470
|
+
}
|
|
471
|
+
};
|
|
472
|
+
_.styles = [
|
|
473
|
+
$,
|
|
474
|
+
V`
|
|
475
|
+
:host {
|
|
476
|
+
display: block;
|
|
477
|
+
container: u-chart / inline-size;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
.chart-container {
|
|
481
|
+
width: 100%;
|
|
482
|
+
height: var(--u-widget-chart-height, 300px);
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
@container u-chart (max-width: 20rem) {
|
|
486
|
+
.chart-container {
|
|
487
|
+
height: var(--u-widget-chart-height-narrow, 200px);
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
`
|
|
491
|
+
];
|
|
492
|
+
M([
|
|
493
|
+
R({ type: Object })
|
|
494
|
+
], _.prototype, "spec", 2);
|
|
495
|
+
_ = M([
|
|
496
|
+
T("u-chart")
|
|
497
|
+
], _);
|
|
498
|
+
export {
|
|
499
|
+
_ as UChart,
|
|
500
|
+
ie as toEChartsOption
|
|
501
|
+
};
|
|
502
|
+
//# sourceMappingURL=u-widgets-charts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"u-widgets-charts.js","sources":["../src/renderers/echarts-adapter.ts","../src/elements/u-chart.ts"],"sourcesContent":["import type { UWidgetSpec, NormalizedMapping } from '../core/types.js';\nimport { normalizeMapping } from '../core/normalize.js';\n\ninterface ReferenceLineOption {\n axis: 'x' | 'y';\n value: number | string;\n label?: string;\n color?: string;\n style?: 'solid' | 'dashed' | 'dotted';\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 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') {\n result.xAxis = { ...result.xAxis as Record<string, unknown>, splitLine: { show: false } };\n }\n if (result.yAxis && typeof result.yAxis === 'object') {\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 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 seriesItems = yFields.map((field) => {\n const s: Record<string, unknown> = {\n name: field,\n type,\n data: data.map((row) => row[field] ?? null),\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 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 const result: Record<string, unknown> = {\n xAxis: horizontal ? valAxis : catAxis,\n yAxis: horizontal ? catAxis : valAxis,\n series: seriesItems,\n tooltip: { trigger: 'axis' },\n };\n\n if (yFields.length > 1) {\n result.legend = { data: yFields };\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 // Helper: build a data point — plain array or object with itemStyle for opacity\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 (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 return {\n tooltip: { trigger: 'item' },\n legend: { orient: 'vertical', left: 'left' },\n series: [seriesItem],\n };\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 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","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('u-chart')\nexport class UChart extends LitElement {\n static styles = [\n themeStyles,\n css`\n :host {\n display: block;\n container: u-chart / inline-size;\n }\n\n .chart-container {\n width: 100%;\n height: var(--u-widget-chart-height, 300px);\n }\n\n @container u-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('[u-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 'u-chart': UChart;\n }\n}\n"],"names":["toEChartsOption","spec","widget","data","mapping","normalizeMapping","options","result","buildCartesian","buildPie","buildScatter","buildRadar","buildHeatmap","buildBoxplot","buildFunnel","buildWaterfall","buildTreemap","passthrough","deepMerge","type","xField","guessStringField","yFields","guessNumberField","categories","row","horizontal","seriesItems","field","s","catAxis","valAxis","refLines","rl","item","lineStyle","numFields","getNumberFields","yField","colorField","sizeField","opacityField","opacityMin","opacityMax","v","opacityRange","toPoint","pt","norm","symbolSizeFn","val","raw","groups","key","name","points","series","firstSeries","labelField","valueField","pieData","seriesItem","_options","axisField","indicator","first","keys","stringFields","k","numberFields","xCats","yCats","xSet","ySet","y","xIndex","i","yIndex","heatData","minVal","maxVal","xi","yi","colorRange","params","d","statFields","matched","boxData","f","seriesData","records","baseValues","positiveValues","negativeValues","running","label","value","toTreeNode","node","child","base","overrides","bv","ov","isPlainObject","echarts","BarChart","LineChart","PieChart","ScatterChart","RadarChart","HeatmapChart","BoxplotChart","FunnelChart","TreemapChart","GridComponent","TooltipComponent","LegendComponent","RadarComponent","MarkLineComponent","VisualMapComponent","CanvasRenderer","UChart","LitElement","nothing","html","changed","detail","option","themeColors","textColor","secondaryColor","borderColor","axisStyle","colors","c","primary","themeStyles","css","__decorateClass","property","customElement"],"mappings":"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"}
|