@iyulab/u-widgets 0.6.0 → 0.6.2
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 +119 -113
- package/dist/u-widgets-charts.js.map +1 -1
- package/dist/u-widgets-tools.js +11 -10
- package/dist/u-widgets-tools.js.map +1 -1
- package/dist/u-widgets.js +118 -103
- package/dist/u-widgets.js.map +1 -1
- package/package.json +1 -1
package/dist/u-widgets-charts.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { css as V, LitElement as I, nothing as P, html as E } from "lit";
|
|
2
2
|
import { property as R, customElement as T } from "lit/decorators.js";
|
|
3
3
|
import { a as D, t as $ } from "./tokens-x1kDxgG8.js";
|
|
4
|
-
import * as
|
|
4
|
+
import * as N from "echarts/core";
|
|
5
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
6
|
import { GridComponent as X, TooltipComponent as Y, LegendComponent as Z, RadarComponent as ee, MarkLineComponent as te, VisualMapComponent as re } from "echarts/components";
|
|
7
7
|
import { CanvasRenderer as se } from "echarts/renderers";
|
|
@@ -54,103 +54,109 @@ function F(e, t, i, r) {
|
|
|
54
54
|
if (!Array.isArray(e)) return {};
|
|
55
55
|
const n = t?.x ?? C(e), s = t?.y ?? [k(e)].filter(Boolean);
|
|
56
56
|
if (!n || s.length === 0) return {};
|
|
57
|
-
const c = e.map((
|
|
58
|
-
const
|
|
59
|
-
name:
|
|
57
|
+
const c = e.map((l) => String(l[n] ?? "")), u = !!r.horizontal, f = Array.isArray(r.series) ? r.series : [], y = s.map((l, x) => {
|
|
58
|
+
const o = {
|
|
59
|
+
name: l,
|
|
60
60
|
type: i,
|
|
61
|
-
data: e.map((
|
|
61
|
+
data: e.map((h) => h[l] ?? null)
|
|
62
62
|
};
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
63
|
+
r._area && (o.areaStyle = {}), r.smooth && (o.smooth = !0), r.step && (o.step = r.step === !0 ? "end" : r.step);
|
|
64
|
+
const a = f[x];
|
|
65
|
+
return a && (a.color && (o.itemStyle = { color: a.color }, o.lineStyle = { ...o.lineStyle ?? {}, color: a.color }), a.lineStyle && (o.lineStyle = { ...o.lineStyle ?? {}, ...a.lineStyle }), a.symbol !== void 0 && (o.symbol = a.symbol), a.label && (o.name = a.label)), o;
|
|
66
|
+
}), b = { type: "category", data: c }, p = { type: "value" };
|
|
67
|
+
r.histogram && (b.axisTick = { alignWithLabel: !0 }, y.forEach((l) => {
|
|
68
|
+
l.barCategoryGap = "0%";
|
|
67
69
|
}));
|
|
68
|
-
const
|
|
69
|
-
xAxis: u ?
|
|
70
|
-
yAxis: u ?
|
|
71
|
-
series:
|
|
70
|
+
const g = {
|
|
71
|
+
xAxis: u ? p : b,
|
|
72
|
+
yAxis: u ? b : p,
|
|
73
|
+
series: y,
|
|
72
74
|
tooltip: { trigger: "axis" }
|
|
73
75
|
};
|
|
74
|
-
s.length > 1
|
|
75
|
-
|
|
76
|
+
if (s.length > 1) {
|
|
77
|
+
const l = y.map((x) => x.name);
|
|
78
|
+
g.legend = { data: l };
|
|
79
|
+
}
|
|
80
|
+
r.stack && g.series.forEach((l) => {
|
|
81
|
+
l.stack = "total";
|
|
76
82
|
});
|
|
77
|
-
const
|
|
78
|
-
return Array.isArray(
|
|
83
|
+
const m = r.referenceLines;
|
|
84
|
+
return Array.isArray(m) && m.length > 0 && y.length > 0 && (y[0].markLine = {
|
|
79
85
|
silent: !0,
|
|
80
86
|
symbol: "none",
|
|
81
|
-
data:
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
const
|
|
85
|
-
return
|
|
87
|
+
data: m.map((l) => {
|
|
88
|
+
const x = {};
|
|
89
|
+
l.axis === "x" ? x.xAxis = l.value : x.yAxis = l.value, l.label && (x.name = l.label);
|
|
90
|
+
const o = {};
|
|
91
|
+
return l.color && (o.color = l.color), l.style && (o.type = l.style), Object.keys(o).length > 0 && (x.lineStyle = o), l.label && (x.label = { formatter: l.label, position: "end" }), x;
|
|
86
92
|
})
|
|
87
|
-
}),
|
|
93
|
+
}), g;
|
|
88
94
|
}
|
|
89
95
|
function ne(e, t, i) {
|
|
90
96
|
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,
|
|
97
|
+
const r = j(e), n = t?.x ?? r[0], s = (t?.y ?? [r[1]])[0], c = t?.color, u = t?.size, f = t?.opacity;
|
|
92
98
|
if (!n || !s) return {};
|
|
93
|
-
const
|
|
99
|
+
const y = {
|
|
94
100
|
xAxis: { type: "value" },
|
|
95
101
|
yAxis: { type: "value" },
|
|
96
102
|
tooltip: { trigger: "item" }
|
|
97
103
|
};
|
|
98
|
-
let
|
|
99
|
-
if (
|
|
100
|
-
for (const
|
|
101
|
-
const
|
|
102
|
-
|
|
104
|
+
let b = 1 / 0, p = -1 / 0;
|
|
105
|
+
if (f)
|
|
106
|
+
for (const o of e) {
|
|
107
|
+
const a = Number(o[f] ?? 0);
|
|
108
|
+
a < b && (b = a), a > p && (p = a);
|
|
103
109
|
}
|
|
104
|
-
const
|
|
105
|
-
const
|
|
106
|
-
if (u &&
|
|
107
|
-
const
|
|
108
|
-
return { value:
|
|
110
|
+
const g = p - b || 1, m = (o) => {
|
|
111
|
+
const a = [Number(o[n] ?? 0), Number(o[s] ?? 0)];
|
|
112
|
+
if (u && a.push(Number(o[u] ?? 0)), f) {
|
|
113
|
+
const S = 0.1 + 0.9 * ((Number(o[f] ?? 0) - b) / g);
|
|
114
|
+
return { value: a, itemStyle: { opacity: Math.round(S * 100) / 100 } };
|
|
109
115
|
}
|
|
110
|
-
return
|
|
111
|
-
},
|
|
112
|
-
const
|
|
113
|
-
return Math.max(4, Math.min(60, Math.sqrt(
|
|
116
|
+
return a;
|
|
117
|
+
}, l = u ? (o) => {
|
|
118
|
+
const h = (Array.isArray(o) ? o : o.value)[2] ?? 0;
|
|
119
|
+
return Math.max(4, Math.min(60, Math.sqrt(h) * 4));
|
|
114
120
|
} : void 0;
|
|
115
121
|
if (c) {
|
|
116
|
-
const
|
|
117
|
-
for (const
|
|
118
|
-
const
|
|
119
|
-
|
|
122
|
+
const o = /* @__PURE__ */ new Map();
|
|
123
|
+
for (const h of e) {
|
|
124
|
+
const S = String(h[c] ?? "unknown");
|
|
125
|
+
o.has(S) || o.set(S, []), o.get(S).push(m(h));
|
|
120
126
|
}
|
|
121
|
-
const
|
|
122
|
-
for (const [
|
|
123
|
-
const
|
|
124
|
-
|
|
127
|
+
const a = [];
|
|
128
|
+
for (const [h, S] of o) {
|
|
129
|
+
const d = { name: h, type: "scatter", data: S };
|
|
130
|
+
l && (d.symbolSize = l), a.push(d);
|
|
125
131
|
}
|
|
126
|
-
|
|
132
|
+
y.series = a, y.legend = { data: Array.from(o.keys()) };
|
|
127
133
|
} else {
|
|
128
|
-
const
|
|
129
|
-
|
|
134
|
+
const a = { type: "scatter", data: e.map((h) => m(h)) };
|
|
135
|
+
l && (a.symbolSize = l), y.series = [a];
|
|
130
136
|
}
|
|
131
|
-
const
|
|
132
|
-
if (Array.isArray(
|
|
133
|
-
const
|
|
134
|
-
|
|
137
|
+
const x = i.referenceLines;
|
|
138
|
+
if (Array.isArray(x) && x.length > 0) {
|
|
139
|
+
const o = y.series[0];
|
|
140
|
+
o.markLine = {
|
|
135
141
|
silent: !0,
|
|
136
142
|
symbol: "none",
|
|
137
|
-
data:
|
|
138
|
-
const
|
|
139
|
-
|
|
140
|
-
const
|
|
141
|
-
return
|
|
143
|
+
data: x.map((a) => {
|
|
144
|
+
const h = {};
|
|
145
|
+
a.axis === "x" ? h.xAxis = a.value : h.yAxis = a.value, a.label && (h.name = a.label);
|
|
146
|
+
const S = {};
|
|
147
|
+
return a.color && (S.color = a.color), a.style && (S.type = a.style), Object.keys(S).length > 0 && (h.lineStyle = S), a.label && (h.label = { formatter: a.label, position: "end" }), h;
|
|
142
148
|
})
|
|
143
149
|
};
|
|
144
150
|
}
|
|
145
|
-
return
|
|
151
|
+
return y;
|
|
146
152
|
}
|
|
147
153
|
function ae(e, t, i) {
|
|
148
154
|
if (!Array.isArray(e)) return {};
|
|
149
155
|
const r = t?.label ?? C(e), n = t?.value ?? k(e);
|
|
150
156
|
if (!r || !n) return {};
|
|
151
|
-
const s = e.map((
|
|
152
|
-
name: String(
|
|
153
|
-
value: Number(
|
|
157
|
+
const s = e.map((f) => ({
|
|
158
|
+
name: String(f[r] ?? ""),
|
|
159
|
+
value: Number(f[n] ?? 0)
|
|
154
160
|
})), u = {
|
|
155
161
|
type: "pie",
|
|
156
162
|
radius: i.donut ? ["40%", "70%"] : "50%",
|
|
@@ -171,7 +177,7 @@ function oe(e, t, i) {
|
|
|
171
177
|
name: String(u[r] ?? "")
|
|
172
178
|
})), c = n.map((u) => ({
|
|
173
179
|
name: u,
|
|
174
|
-
value: e.map((
|
|
180
|
+
value: e.map((f) => Number(f[u] ?? 0))
|
|
175
181
|
}));
|
|
176
182
|
return {
|
|
177
183
|
tooltip: {},
|
|
@@ -187,73 +193,73 @@ function oe(e, t, i) {
|
|
|
187
193
|
}
|
|
188
194
|
function le(e, t, i) {
|
|
189
195
|
if (!Array.isArray(e)) return {};
|
|
190
|
-
const r = e[0] ?? {}, n = Object.keys(r), s = n.filter((
|
|
191
|
-
if (!u || !
|
|
192
|
-
const
|
|
193
|
-
for (const
|
|
194
|
-
const
|
|
195
|
-
|
|
196
|
+
const r = e[0] ?? {}, n = Object.keys(r), s = n.filter((d) => typeof r[d] == "string"), c = n.filter((d) => typeof r[d] == "number"), u = t?.x ?? s[0], f = t?.y?.[0] ?? s.find((d) => d !== u), y = t?.value ?? c[0];
|
|
197
|
+
if (!u || !f || !y) return {};
|
|
198
|
+
const b = [], p = [], g = /* @__PURE__ */ new Set(), m = /* @__PURE__ */ new Set();
|
|
199
|
+
for (const d of e) {
|
|
200
|
+
const A = String(d[u] ?? ""), w = String(d[f] ?? "");
|
|
201
|
+
g.has(A) || (g.add(A), b.push(A)), m.has(w) || (m.add(w), p.push(w));
|
|
196
202
|
}
|
|
197
|
-
const
|
|
198
|
-
|
|
199
|
-
const
|
|
200
|
-
|
|
201
|
-
const
|
|
202
|
-
let
|
|
203
|
-
for (const
|
|
204
|
-
const
|
|
205
|
-
|
|
203
|
+
const l = /* @__PURE__ */ new Map();
|
|
204
|
+
b.forEach((d, A) => l.set(d, A));
|
|
205
|
+
const x = /* @__PURE__ */ new Map();
|
|
206
|
+
p.forEach((d, A) => x.set(d, A));
|
|
207
|
+
const o = [];
|
|
208
|
+
let a = 1 / 0, h = -1 / 0;
|
|
209
|
+
for (const d of e) {
|
|
210
|
+
const A = l.get(String(d[u] ?? "")) ?? 0, w = x.get(String(d[f] ?? "")) ?? 0, v = d[y] != null ? Number(d[y]) : null;
|
|
211
|
+
o.push([A, w, v]), v != null && (v < a && (a = v), v > h && (h = v));
|
|
206
212
|
}
|
|
207
|
-
isFinite(
|
|
208
|
-
const
|
|
213
|
+
isFinite(a) || (a = 0, h = 1);
|
|
214
|
+
const S = i.colorRange ?? ["#313695", "#4575b4", "#74add1", "#abd9e9", "#fee090", "#fdae61", "#f46d43", "#d73027"];
|
|
209
215
|
return {
|
|
210
|
-
xAxis: { type: "category", data:
|
|
211
|
-
yAxis: { type: "category", data:
|
|
216
|
+
xAxis: { type: "category", data: b, splitArea: { show: !0 } },
|
|
217
|
+
yAxis: { type: "category", data: p, splitArea: { show: !0 } },
|
|
212
218
|
visualMap: {
|
|
213
|
-
min: i.min != null ? Number(i.min) :
|
|
214
|
-
max: i.max != null ? Number(i.max) :
|
|
219
|
+
min: i.min != null ? Number(i.min) : a,
|
|
220
|
+
max: i.max != null ? Number(i.max) : h,
|
|
215
221
|
calculable: !0,
|
|
216
222
|
orient: "horizontal",
|
|
217
223
|
left: "center",
|
|
218
224
|
bottom: 0,
|
|
219
|
-
inRange: { color:
|
|
225
|
+
inRange: { color: S }
|
|
220
226
|
},
|
|
221
227
|
tooltip: {
|
|
222
228
|
trigger: "item",
|
|
223
|
-
formatter: (
|
|
224
|
-
const
|
|
225
|
-
return
|
|
229
|
+
formatter: (d) => {
|
|
230
|
+
const A = d.data;
|
|
231
|
+
return A ? `${b[A[0]]} × ${p[A[1]]}: ${A[2] != null ? A[2] : "-"}` : "";
|
|
226
232
|
}
|
|
227
233
|
},
|
|
228
234
|
grid: { bottom: 60 },
|
|
229
235
|
series: [{
|
|
230
236
|
type: "heatmap",
|
|
231
|
-
data:
|
|
237
|
+
data: o,
|
|
232
238
|
label: { show: i.showLabel !== !1 }
|
|
233
239
|
}]
|
|
234
240
|
};
|
|
235
241
|
}
|
|
236
242
|
function ce(e, t, i) {
|
|
237
243
|
if (!Array.isArray(e) || e.length === 0) return {};
|
|
238
|
-
const r = e[0] ?? {}, n = Object.keys(r), s = n.filter((
|
|
239
|
-
let
|
|
244
|
+
const r = e[0] ?? {}, n = Object.keys(r), s = n.filter((g) => typeof r[g] == "string"), c = n.filter((g) => typeof r[g] == "number"), u = t?.x ?? s[0];
|
|
245
|
+
let f;
|
|
240
246
|
if (t?.y && t.y.length >= 5)
|
|
241
|
-
|
|
247
|
+
f = t.y.slice(0, 5);
|
|
242
248
|
else {
|
|
243
|
-
const
|
|
244
|
-
|
|
249
|
+
const m = ["min", "q1", "median", "q3", "max"].filter((l) => c.includes(l));
|
|
250
|
+
f = m.length === 5 ? m : c.slice(0, 5);
|
|
245
251
|
}
|
|
246
|
-
if (
|
|
247
|
-
const
|
|
248
|
-
(
|
|
249
|
-
),
|
|
252
|
+
if (f.length < 5) return {};
|
|
253
|
+
const y = u ? e.map((g) => String(g[u] ?? "")) : void 0, b = e.map(
|
|
254
|
+
(g) => f.map((m) => Number(g[m] ?? 0))
|
|
255
|
+
), p = {
|
|
250
256
|
tooltip: { trigger: "item" },
|
|
251
257
|
series: [{
|
|
252
258
|
type: "boxplot",
|
|
253
|
-
data:
|
|
259
|
+
data: b
|
|
254
260
|
}]
|
|
255
261
|
};
|
|
256
|
-
return
|
|
262
|
+
return y ? (p.xAxis = { type: "category", data: y }, p.yAxis = { type: "value" }) : (p.xAxis = { type: "category" }, p.yAxis = { type: "value" }), p;
|
|
257
263
|
}
|
|
258
264
|
function C(e) {
|
|
259
265
|
if (e.length === 0) return;
|
|
@@ -289,11 +295,11 @@ function fe(e, t, i) {
|
|
|
289
295
|
if (!Array.isArray(e)) return {};
|
|
290
296
|
const r = e, n = t?.x ?? C(r), s = (t?.y ?? [k(r)])[0];
|
|
291
297
|
if (!n || !s) return {};
|
|
292
|
-
const c = [], u = [],
|
|
293
|
-
let
|
|
294
|
-
for (const
|
|
295
|
-
const
|
|
296
|
-
c.push(
|
|
298
|
+
const c = [], u = [], f = [], y = [];
|
|
299
|
+
let b = 0;
|
|
300
|
+
for (const p of r) {
|
|
301
|
+
const g = String(p[n] ?? ""), m = Number(p[s] ?? 0);
|
|
302
|
+
c.push(g), m >= 0 ? (u.push(b), f.push(m), y.push(null)) : (u.push(b + m), f.push(null), y.push(Math.abs(m))), b += m;
|
|
297
303
|
}
|
|
298
304
|
return {
|
|
299
305
|
tooltip: { trigger: "axis", axisPointer: { type: "shadow" } },
|
|
@@ -312,20 +318,20 @@ function fe(e, t, i) {
|
|
|
312
318
|
name: "Positive",
|
|
313
319
|
type: "bar",
|
|
314
320
|
stack: "waterfall",
|
|
315
|
-
data:
|
|
321
|
+
data: f
|
|
316
322
|
},
|
|
317
323
|
{
|
|
318
324
|
name: "Negative",
|
|
319
325
|
type: "bar",
|
|
320
326
|
stack: "waterfall",
|
|
321
|
-
data:
|
|
327
|
+
data: y
|
|
322
328
|
}
|
|
323
329
|
]
|
|
324
330
|
};
|
|
325
331
|
}
|
|
326
332
|
function he(e, t) {
|
|
327
333
|
if (!Array.isArray(e)) return {};
|
|
328
|
-
const i = e.map((r) =>
|
|
334
|
+
const i = e.map((r) => z(r));
|
|
329
335
|
return {
|
|
330
336
|
tooltip: { trigger: "item" },
|
|
331
337
|
series: [{
|
|
@@ -337,12 +343,12 @@ function he(e, t) {
|
|
|
337
343
|
}]
|
|
338
344
|
};
|
|
339
345
|
}
|
|
340
|
-
function
|
|
346
|
+
function z(e) {
|
|
341
347
|
const t = {
|
|
342
348
|
name: String(e.name ?? ""),
|
|
343
349
|
value: Number(e.value ?? 0)
|
|
344
350
|
};
|
|
345
|
-
return Array.isArray(e.children) && (t.children = e.children.map((i) =>
|
|
351
|
+
return Array.isArray(e.children) && (t.children = e.children.map((i) => z(i))), t;
|
|
346
352
|
}
|
|
347
353
|
function j(e) {
|
|
348
354
|
if (e.length === 0) return [];
|
|
@@ -365,7 +371,7 @@ var ye = Object.defineProperty, de = Object.getOwnPropertyDescriptor, M = (e, t,
|
|
|
365
371
|
(c = e[s]) && (n = (r ? c(t, i, n) : c(n)) || n);
|
|
366
372
|
return r && n && ye(t, i, n), n;
|
|
367
373
|
};
|
|
368
|
-
|
|
374
|
+
N.use([
|
|
369
375
|
B,
|
|
370
376
|
q,
|
|
371
377
|
G,
|
|
@@ -401,7 +407,7 @@ let _ = class extends I {
|
|
|
401
407
|
_initChart() {
|
|
402
408
|
if (!(!this._container || !this.spec))
|
|
403
409
|
try {
|
|
404
|
-
this._chart =
|
|
410
|
+
this._chart = N.init(this._container), this._chart.on("click", (e) => {
|
|
405
411
|
this._onChartClick(e);
|
|
406
412
|
}), this._updateChart();
|
|
407
413
|
} catch (e) {
|
|
@@ -1 +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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"}
|
|
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 seriesOverrides = Array.isArray(options.series) ? options.series as Record<string, unknown>[] : [];\n\n const seriesItems = yFields.map((field, i) => {\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\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 }\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 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 // 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","seriesOverrides","seriesItems","field","i","s","override","catAxis","valAxis","legendNames","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","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","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":";;;;;;;AAmBO,SAASA,GAAgBC,GAA4C;AAC1E,QAAMC,IAASD,EAAK,QACdE,IAAOF,EAAK,MACZG,IAAUH,EAAK,UAAUI,EAAiBJ,EAAK,OAAO,IAAI,QAC1DK,IAAUL,EAAK,WAAW,CAAA;AAEhC,MAAI,CAACE,EAAM,QAAO,CAAA;AAElB,MAAII;AAEJ,UAAQL,GAAA;AAAA,IACN,KAAK;AACH,MAAAK,IAASC,EAAeL,GAAMC,GAAS,OAAOE,CAAO;AACrD;AAAA,IACF,KAAK;AACH,MAAAC,IAASC,EAAeL,GAAMC,GAAS,QAAQE,CAAO;AACtD;AAAA,IACF,KAAK;AACH,MAAAC,IAASC,EAAeL,GAAMC,GAAS,QAAQ,EAAE,GAAGE,GAAS,OAAO,IAAM;AAC1E;AAAA,IACF,KAAK;AACH,MAAAC,IAASE,GAASN,GAAMC,GAASE,CAAO;AACxC;AAAA,IACF,KAAK;AACH,MAAAC,IAASG,GAAaP,GAAMC,GAASE,CAAO;AAC5C;AAAA,IACF,KAAK;AACH,MAAAC,IAASI,GAAWR,GAAMC,CAAgB;AAC1C;AAAA,IACF,KAAK;AACH,MAAAG,IAASK,GAAaT,GAAMC,GAASE,CAAO;AAC5C;AAAA,IACF,KAAK;AACH,MAAAC,IAASM,GAAaV,GAAMC,CAAgB;AAC5C;AAAA,IACF,KAAK;AACH,MAAAG,IAASO,GAAYX,GAAMC,CAAgB;AAC3C;AAAA,IACF,KAAK;AACH,MAAAG,IAASQ,GAAeZ,GAAMC,CAAgB;AAC9C;AAAA,IACF,KAAK;AACH,MAAAG,IAASS,GAAab,CAAa;AACnC;AAAA,IACF;AACE,aAAO,CAAA;AAAA,EAAC;AAIZ,EAAIG,EAAQ,WAAW,MAASC,EAAO,WACrCA,EAAO,SAAS,EAAE,GAAGA,EAAO,QAAmC,MAAM,GAAA,IAGnED,EAAQ,SAAS,OAEfC,EAAO,SAAS,OAAOA,EAAO,SAAU,aAC1CA,EAAO,QAAQ,EAAE,GAAGA,EAAO,OAAkC,WAAW,EAAE,MAAM,KAAM,IAEpFA,EAAO,SAAS,OAAOA,EAAO,SAAU,aAC1CA,EAAO,QAAQ,EAAE,GAAGA,EAAO,OAAkC,WAAW,EAAE,MAAM,KAAM,KAItFD,EAAQ,YAAY,OACtBC,EAAO,YAAY,KAGjB,MAAM,QAAQD,EAAQ,MAAM,KAAKA,EAAQ,OAAO,SAAS,MAC3DC,EAAO,QAAQD,EAAQ;AAIzB,QAAMW,IAAcX,EAAQ;AAC5B,SAAIW,KAAe,OAAOA,KAAgB,aACxCV,IAASW,EAAUX,GAAQU,CAAW,IAGjCV;AACT;AAEA,SAASC,EACPL,GACAC,GACAe,GACAb,GACyB;AACzB,MAAI,CAAC,MAAM,QAAQH,CAAI,UAAU,CAAA;AAEjC,QAAMiB,IAAShB,GAAS,KAAKiB,EAAiBlB,CAAI,GAC5CmB,IAAUlB,GAAS,KAAK,CAACmB,EAAiBpB,CAAI,CAAC,EAAE,OAAO,OAAO;AAErE,MAAI,CAACiB,KAAUE,EAAQ,WAAW,UAAU,CAAA;AAE5C,QAAME,IAAarB,EAAK,IAAI,CAACsB,MAAQ,OAAOA,EAAIL,CAAM,KAAK,EAAE,CAAC,GACxDM,IAAa,CAAC,CAACpB,EAAQ,YAEvBqB,IAAkB,MAAM,QAAQrB,EAAQ,MAAM,IAAIA,EAAQ,SAAsC,CAAA,GAEhGsB,IAAcN,EAAQ,IAAI,CAACO,GAAOC,MAAM;AAC5C,UAAMC,IAA6B;AAAA,MACjC,MAAMF;AAAA,MACN,MAAAV;AAAA,MACA,MAAMhB,EAAK,IAAI,CAACsB,MAAQA,EAAII,CAAK,KAAK,IAAI;AAAA,IAAA;AAE5C,IAAIvB,EAAQ,UAAOyB,EAAE,YAAY,CAAA,IAC7BzB,EAAQ,WAAQyB,EAAE,SAAS,KAC3BzB,EAAQ,SAAMyB,EAAE,OAAOzB,EAAQ,SAAS,KAAO,QAAQA,EAAQ;AAGnE,UAAM0B,IAAWL,EAAgBG,CAAC;AAClC,WAAIE,MACEA,EAAS,UACXD,EAAE,YAAY,EAAE,OAAOC,EAAS,MAAA,GAChCD,EAAE,YAAY,EAAE,GAAIA,EAAE,aAAwC,IAAK,OAAOC,EAAS,MAAA,IAEjFA,EAAS,cACXD,EAAE,YAAY,EAAE,GAAIA,EAAE,aAAwC,IAAK,GAAIC,EAAS,UAAA,IAE9EA,EAAS,WAAW,WAAWD,EAAE,SAASC,EAAS,SACnDA,EAAS,UAAOD,EAAE,OAAOC,EAAS,SAEjCD;AAAA,EACT,CAAC,GAEKE,IAAmC,EAAE,MAAM,YAAY,MAAMT,EAAA,GAC7DU,IAAmC,EAAE,MAAM,QAAA;AAGjD,EAAI5B,EAAQ,cACV2B,EAAQ,WAAW,EAAE,gBAAgB,GAAA,GACrCL,EAAY,QAAQ,CAACG,MAAM;AAAE,IAAAA,EAAE,iBAAiB;AAAA,EAAM,CAAC;AAGzD,QAAMxB,IAAkC;AAAA,IACtC,OAAOmB,IAAaQ,IAAUD;AAAA,IAC9B,OAAOP,IAAaO,IAAUC;AAAA,IAC9B,QAAQN;AAAA,IACR,SAAS,EAAE,SAAS,OAAA;AAAA,EAAO;AAG7B,MAAIN,EAAQ,SAAS,GAAG;AACtB,UAAMa,IAAcP,EAAY,IAAI,CAACG,MAAMA,EAAE,IAAc;AAC3D,IAAAxB,EAAO,SAAS,EAAE,MAAM4B,EAAA;AAAA,EAC1B;AAEA,EAAI7B,EAAQ,SACTC,EAAO,OAAqC,QAAQ,CAACwB,MAAM;AAC1D,IAAAA,EAAE,QAAQ;AAAA,EACZ,CAAC;AAIH,QAAMK,IAAW9B,EAAQ;AACzB,SAAI,MAAM,QAAQ8B,CAAQ,KAAKA,EAAS,SAAS,KAAKR,EAAY,SAAS,MACzEA,EAAY,CAAC,EAAE,WAAW;AAAA,IACxB,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAMQ,EAAS,IAAI,CAACC,MAAO;AACzB,YAAMC,IAAgC,CAAA;AACtC,MAAID,EAAG,SAAS,MACdC,EAAK,QAAQD,EAAG,QAEhBC,EAAK,QAAQD,EAAG,OAEdA,EAAG,UAAOC,EAAK,OAAOD,EAAG;AAC7B,YAAME,IAAqC,CAAA;AAC3C,aAAIF,EAAG,UAAOE,EAAU,QAAQF,EAAG,QAC/BA,EAAG,UAAOE,EAAU,OAAOF,EAAG,QAC9B,OAAO,KAAKE,CAAS,EAAE,SAAS,QAAQ,YAAYA,IACpDF,EAAG,UAAOC,EAAK,QAAQ,EAAE,WAAWD,EAAG,OAAO,UAAU,MAAA,IACrDC;AAAA,IACT,CAAC;AAAA,EAAA,IAIE/B;AACT;AAEA,SAASG,GACPP,GACAC,GACAE,GACyB;AACzB,MAAI,CAAC,MAAM,QAAQH,CAAI,UAAU,CAAA;AAGjC,QAAMqC,IAAYC,EAAgBtC,CAAI,GAChCiB,IAAShB,GAAS,KAAKoC,EAAU,CAAC,GAClCE,KAAUtC,GAAS,KAAK,CAACoC,EAAU,CAAC,CAAC,GAAG,CAAC,GACzCG,IAAavC,GAAS,OACtBwC,IAAYxC,GAAS,MACrByC,IAAezC,GAAS;AAE9B,MAAI,CAACgB,KAAU,CAACsB,UAAe,CAAA;AAE/B,QAAMnC,IAAkC;AAAA,IACtC,OAAO,EAAE,MAAM,QAAA;AAAA,IACf,OAAO,EAAE,MAAM,QAAA;AAAA,IACf,SAAS,EAAE,SAAS,OAAA;AAAA,EAAO;AAI7B,MAAIuC,IAAa,OACbC,IAAa;AACjB,MAAIF;AACF,eAAWpB,KAAOtB,GAAM;AACtB,YAAM6C,IAAI,OAAOvB,EAAIoB,CAAY,KAAK,CAAC;AACvC,MAAIG,IAAIF,MAAYA,IAAaE,IAC7BA,IAAID,MAAYA,IAAaC;AAAA,IACnC;AAEF,QAAMC,IAAeF,IAAaD,KAAc,GAG1CI,IAAU,CAACzB,MAA0C;AACzD,UAAM0B,IAAK,CAAC,OAAO1B,EAAIL,CAAM,KAAK,CAAC,GAAG,OAAOK,EAAIiB,CAAM,KAAK,CAAC,CAAC;AAG9D,QAFIE,OAAc,KAAK,OAAOnB,EAAImB,CAAS,KAAK,CAAC,CAAC,GAE9CC,GAAc;AAEhB,YAAMO,IAAO,MAAM,QADP,OAAO3B,EAAIoB,CAAY,KAAK,CAAC,IACRC,KAAcG;AAC/C,aAAO,EAAE,OAAOE,GAAI,WAAW,EAAE,SAAS,KAAK,MAAMC,IAAO,GAAG,IAAI,IAAA,EAAI;AAAA,IACzE;AACA,WAAOD;AAAA,EACT,GAGME,IAAeT,IACjB,CAACU,MAAwC;AAEvC,UAAMC,KADM,MAAM,QAAQD,CAAG,IAAIA,IAAMA,EAAI,OAC3B,CAAC,KAAK;AAEtB,WAAO,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,KAAKC,CAAG,IAAI,CAAC,CAAC;AAAA,EACrD,IACA;AAEJ,MAAIZ,GAAY;AAEd,UAAMa,wBAAa,IAAA;AACnB,eAAW/B,KAAOtB,GAAM;AACtB,YAAMsD,IAAM,OAAOhC,EAAIkB,CAAU,KAAK,SAAS;AAC/C,MAAKa,EAAO,IAAIC,CAAG,KAAGD,EAAO,IAAIC,GAAK,EAAE,GACxCD,EAAO,IAAIC,CAAG,EAAG,KAAKP,EAAQzB,CAAG,CAAC;AAAA,IACpC;AACA,UAAMG,IAAyC,CAAA;AAC/C,eAAW,CAAC8B,GAAMC,CAAM,KAAKH,GAAQ;AACnC,YAAMI,IAAkC,EAAE,MAAAF,GAAM,MAAM,WAAW,MAAMC,EAAA;AACvE,MAAIN,QAAqB,aAAaA,IACtCzB,EAAY,KAAKgC,CAAM;AAAA,IACzB;AACA,IAAArD,EAAO,SAASqB,GAChBrB,EAAO,SAAS,EAAE,MAAM,MAAM,KAAKiD,EAAO,KAAA,CAAM,EAAA;AAAA,EAClD,OAAO;AAGL,UAAMI,IAAkC,EAAE,MAAM,WAAW,MAD5CzD,EAAK,IAAI,CAACsB,MAAQyB,EAAQzB,CAAG,CAAC,EACoB;AACjE,IAAI4B,QAAqB,aAAaA,IACtC9C,EAAO,SAAS,CAACqD,CAAM;AAAA,EACzB;AAGA,QAAMxB,IAAW9B,EAAQ;AACzB,MAAI,MAAM,QAAQ8B,CAAQ,KAAKA,EAAS,SAAS,GAAG;AAClD,UAAMyB,IAAetD,EAAO,OAAqC,CAAC;AAClE,IAAAsD,EAAY,WAAW;AAAA,MACrB,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,MAAMzB,EAAS,IAAI,CAACC,MAAO;AACzB,cAAMC,IAAgC,CAAA;AACtC,QAAID,EAAG,SAAS,MAAKC,EAAK,QAAQD,EAAG,QAChCC,EAAK,QAAQD,EAAG,OACjBA,EAAG,UAAOC,EAAK,OAAOD,EAAG;AAC7B,cAAME,IAAqC,CAAA;AAC3C,eAAIF,EAAG,UAAOE,EAAU,QAAQF,EAAG,QAC/BA,EAAG,UAAOE,EAAU,OAAOF,EAAG,QAC9B,OAAO,KAAKE,CAAS,EAAE,SAAS,QAAQ,YAAYA,IACpDF,EAAG,UAAOC,EAAK,QAAQ,EAAE,WAAWD,EAAG,OAAO,UAAU,MAAA,IACrDC;AAAA,MACT,CAAC;AAAA,IAAA;AAAA,EAEL;AAEA,SAAO/B;AACT;AAEA,SAASE,GACPN,GACAC,GACAE,GACyB;AACzB,MAAI,CAAC,MAAM,QAAQH,CAAI,UAAU,CAAA;AAEjC,QAAM2D,IAAa1D,GAAS,SAASiB,EAAiBlB,CAAI,GACpD4D,IAAa3D,GAAS,SAASmB,EAAiBpB,CAAI;AAE1D,MAAI,CAAC2D,KAAc,CAACC,UAAmB,CAAA;AAEvC,QAAMC,IAAU7D,EAAK,IAAI,CAACsB,OAAS;AAAA,IACjC,MAAM,OAAOA,EAAIqC,CAAU,KAAK,EAAE;AAAA,IAClC,OAAO,OAAOrC,EAAIsC,CAAU,KAAK,CAAC;AAAA,EAAA,EAClC,GAGIE,IAAsC;AAAA,IAC1C,MAAM;AAAA,IACN,QAHa3D,EAAQ,QAAQ,CAAC,OAAO,KAAK,IAAI;AAAA,IAI9C,MAAM0D;AAAA,IACN,OAAO,EAAE,UAAU,YAAY,OAAO,GAAA;AAAA,EAAG;AAG3C,SAAI1D,EAAQ,cAAc,OACxB2D,EAAW,QAAQ,EAAE,MAAM,GAAA,IAGtB;AAAA,IACL,SAAS,EAAE,SAAS,OAAA;AAAA,IACpB,QAAQ,EAAE,QAAQ,YAAY,MAAM,OAAA;AAAA,IACpC,QAAQ,CAACA,CAAU;AAAA,EAAA;AAEvB;AAEA,SAAStD,GACPR,GACAC,GACA8D,GACyB;AACzB,MAAI,CAAC,MAAM,QAAQ/D,CAAI,UAAU,CAAA;AAEjC,QAAMgE,IAAY/D,GAAS,QAAQiB,EAAiBlB,CAAI,GAClDmB,IAAUlB,GAAS,KAAKqC,EAAgBtC,CAAI;AAElD,MAAI,CAACgE,KAAa7C,EAAQ,WAAW,UAAU,CAAA;AAE/C,QAAM8C,IAAYjE,EAAK,IAAI,CAACsB,OAAS;AAAA,IACnC,MAAM,OAAOA,EAAI0C,CAAS,KAAK,EAAE;AAAA,EAAA,EACjC,GAEIP,IAAStC,EAAQ,IAAI,CAACO,OAAW;AAAA,IACrC,MAAMA;AAAA,IACN,OAAO1B,EAAK,IAAI,CAACsB,MAAQ,OAAOA,EAAII,CAAK,KAAK,CAAC,CAAC;AAAA,EAAA,EAChD;AAEF,SAAO;AAAA,IACL,SAAS,CAAA;AAAA,IACT,QAAQ,EAAE,MAAMP,EAAA;AAAA,IAChB,OAAO,EAAE,WAAA8C,EAAA;AAAA,IACT,QAAQ;AAAA,MACN;AAAA,QACE,MAAM;AAAA,QACN,MAAMR;AAAA,MAAA;AAAA,IACR;AAAA,EACF;AAEJ;AAEA,SAAShD,GACPT,GACAC,GACAE,GACyB;AACzB,MAAI,CAAC,MAAM,QAAQH,CAAI,UAAU,CAAA;AAGjC,QAAMkE,IAAQlE,EAAK,CAAC,KAAK,CAAA,GACnBmE,IAAO,OAAO,KAAKD,CAAK,GACxBE,IAAeD,EAAK,OAAO,CAACE,MAAM,OAAOH,EAAMG,CAAC,KAAM,QAAQ,GAC9DC,IAAeH,EAAK,OAAO,CAACE,MAAM,OAAOH,EAAMG,CAAC,KAAM,QAAQ,GAE9DpD,IAAShB,GAAS,KAAKmE,EAAa,CAAC,GAErC7B,IAAStC,GAAS,IAAI,CAAC,KAAKmE,EAAa,KAAK,CAACC,MAAMA,MAAMpD,CAAM,GACjE2C,IAAa3D,GAAS,SAASqE,EAAa,CAAC;AAEnD,MAAI,CAACrD,KAAU,CAACsB,KAAU,CAACqB,UAAmB,CAAA;AAG9C,QAAMW,IAAkB,CAAA,GAClBC,IAAkB,CAAA,GAClBC,wBAAW,IAAA,GACXC,wBAAW,IAAA;AAEjB,aAAWpD,KAAOtB,GAAM;AACtB,UAAM2E,IAAI,OAAOrD,EAAIL,CAAM,KAAK,EAAE,GAC5B2D,IAAI,OAAOtD,EAAIiB,CAAM,KAAK,EAAE;AAClC,IAAKkC,EAAK,IAAIE,CAAC,MAAKF,EAAK,IAAIE,CAAC,GAAGJ,EAAM,KAAKI,CAAC,IACxCD,EAAK,IAAIE,CAAC,MAAKF,EAAK,IAAIE,CAAC,GAAGJ,EAAM,KAAKI,CAAC;AAAA,EAC/C;AAGA,QAAMC,wBAAa,IAAA;AACnB,EAAAN,EAAM,QAAQ,CAAC1B,GAAGlB,MAAMkD,EAAO,IAAIhC,GAAGlB,CAAC,CAAC;AACxC,QAAMmD,wBAAa,IAAA;AACnB,EAAAN,EAAM,QAAQ,CAAC3B,GAAGlB,MAAMmD,EAAO,IAAIjC,GAAGlB,CAAC,CAAC;AAGxC,QAAMoD,IAAgC,CAAA;AACtC,MAAIC,IAAS,OACTC,IAAS;AAEb,aAAW3D,KAAOtB,GAAM;AACtB,UAAMkF,IAAKL,EAAO,IAAI,OAAOvD,EAAIL,CAAM,KAAK,EAAE,CAAC,KAAK,GAC9CkE,IAAKL,EAAO,IAAI,OAAOxD,EAAIiB,CAAM,KAAK,EAAE,CAAC,KAAK,GAC9C,IAAIjB,EAAIsC,CAAU,KAAK,OAAO,OAAOtC,EAAIsC,CAAU,CAAC,IAAI;AAC9D,IAAAmB,EAAS,KAAK,CAACG,GAAIC,GAAI,CAAC,CAAC,GACrB,KAAK,SACH,IAAIH,MAAQA,IAAS,IACrB,IAAIC,MAAQA,IAAS;AAAA,EAE7B;AAGA,EAAK,SAASD,CAAM,MAAKA,IAAS,GAAGC,IAAS;AAG9C,QAAMG,IAAcjF,EAAQ,cAA2B,CAAC,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,SAAS;AAE9I,SAAO;AAAA,IACL,OAAO,EAAE,MAAM,YAAY,MAAMoE,GAAO,WAAW,EAAE,MAAM,KAAK;AAAA,IAChE,OAAO,EAAE,MAAM,YAAY,MAAMC,GAAO,WAAW,EAAE,MAAM,KAAK;AAAA,IAChE,WAAW;AAAA,MACT,KAAKrE,EAAQ,OAAO,OAAO,OAAOA,EAAQ,GAAG,IAAI6E;AAAA,MACjD,KAAK7E,EAAQ,OAAO,OAAO,OAAOA,EAAQ,GAAG,IAAI8E;AAAA,MACjD,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,EAAE,OAAOG,EAAA;AAAA,IAAW;AAAA,IAE/B,SAAS;AAAA,MACP,SAAS;AAAA,MACT,WAAW,CAACC,MAAoC;AAC9C,cAAMC,IAAID,EAAO;AACjB,eAAKC,IACE,GAAGf,EAAMe,EAAE,CAAC,CAAC,CAAC,MAAMd,EAAMc,EAAE,CAAC,CAAC,CAAC,KAAKA,EAAE,CAAC,KAAK,OAAOA,EAAE,CAAC,IAAI,GAAG,KADrD;AAAA,MAEjB;AAAA,IAAA;AAAA,IAEF,MAAM,EAAE,QAAQ,GAAA;AAAA,IAChB,QAAQ,CAAC;AAAA,MACP,MAAM;AAAA,MACN,MAAMP;AAAA,MACN,OAAO,EAAE,MAAM5E,EAAQ,cAAc,GAAA;AAAA,IAAM,CAC5C;AAAA,EAAA;AAEL;AAEA,SAASO,GACPV,GACAC,GACA8D,GACyB;AACzB,MAAI,CAAC,MAAM,QAAQ/D,CAAI,KAAKA,EAAK,WAAW,EAAG,QAAO,CAAA;AAEtD,QAAMkE,IAAQlE,EAAK,CAAC,KAAK,CAAA,GACnBmE,IAAO,OAAO,KAAKD,CAAK,GACxBE,IAAeD,EAAK,OAAO,CAACE,MAAM,OAAOH,EAAMG,CAAC,KAAM,QAAQ,GAC9DC,IAAeH,EAAK,OAAO,CAACE,MAAM,OAAOH,EAAMG,CAAC,KAAM,QAAQ,GAG9DpD,IAAShB,GAAS,KAAKmE,EAAa,CAAC;AAI3C,MAAImB;AACJ,MAAItF,GAAS,KAAKA,EAAQ,EAAE,UAAU;AACpC,IAAAsF,IAAatF,EAAQ,EAAE,MAAM,GAAG,CAAC;AAAA,OAC5B;AAEL,UAAMuF,IADY,CAAC,OAAO,MAAM,UAAU,MAAM,KAAK,EAC3B,OAAO,CAACjC,MAASe,EAAa,SAASf,CAAI,CAAC;AACtE,IAAAgC,IAAaC,EAAQ,WAAW,IAAIA,IAAUlB,EAAa,MAAM,GAAG,CAAC;AAAA,EACvE;AAEA,MAAIiB,EAAW,SAAS,EAAG,QAAO,CAAA;AAElC,QAAMlE,IAAaJ,IAASjB,EAAK,IAAI,CAACsB,MAAQ,OAAOA,EAAIL,CAAM,KAAK,EAAE,CAAC,IAAI,QAErEwE,IAAUzF,EAAK;AAAA,IAAI,CAACsB,MACxBiE,EAAW,IAAI,CAACG,MAAM,OAAOpE,EAAIoE,CAAC,KAAK,CAAC,CAAC;AAAA,EAAA,GAGrCtF,IAAkC;AAAA,IACtC,SAAS,EAAE,SAAS,OAAA;AAAA,IACpB,QAAQ,CAAC;AAAA,MACP,MAAM;AAAA,MACN,MAAMqF;AAAA,IAAA,CACP;AAAA,EAAA;AAGH,SAAIpE,KACFjB,EAAO,QAAQ,EAAE,MAAM,YAAY,MAAMiB,EAAA,GACzCjB,EAAO,QAAQ,EAAE,MAAM,QAAA,MAEvBA,EAAO,QAAQ,EAAE,MAAM,WAAA,GACvBA,EAAO,QAAQ,EAAE,MAAM,QAAA,IAGlBA;AACT;AAIA,SAASc,EAAiBlB,GAAqD;AAC7E,MAAIA,EAAK,WAAW,EAAG;AACvB,QAAMkE,IAAQlE,EAAK,CAAC;AACpB,SAAO,OAAO,KAAKkE,CAAK,EAAE,KAAK,CAACG,MAAM,OAAOH,EAAMG,CAAC,KAAM,QAAQ;AACpE;AAEA,SAASjD,EAAiBpB,GAAqD;AAC7E,MAAIA,EAAK,WAAW,EAAG;AACvB,QAAMkE,IAAQlE,EAAK,CAAC;AACpB,SAAO,OAAO,KAAKkE,CAAK,EAAE,KAAK,CAACG,MAAM,OAAOH,EAAMG,CAAC,KAAM,QAAQ;AACpE;AAEA,SAAS1D,GACPX,GACAC,GACA8D,GACyB;AACzB,MAAI,CAAC,MAAM,QAAQ/D,CAAI,UAAU,CAAA;AAEjC,QAAM2D,IAAa1D,GAAS,SAASiB,EAAiBlB,CAAiC,GACjF4D,IAAc3D,GAAS,SAASmB,EAAiBpB,CAAiC;AAExF,MAAI,CAAC2D,KAAc,CAACC,UAAmB,CAAA;AAEvC,QAAM+B,IAAc3F,EAAmC,IAAI,CAACsB,OAAS;AAAA,IACnE,MAAM,OAAOA,EAAIqC,CAAU,KAAK,EAAE;AAAA,IAClC,OAAO,OAAOrC,EAAIsC,CAAU,KAAK,CAAC;AAAA,EAAA,EAClC;AAEF,SAAO;AAAA,IACL,SAAS,EAAE,SAAS,QAAQ,WAAW,kBAAA;AAAA,IACvC,QAAQ,EAAE,QAAQ,YAAY,MAAM,OAAA;AAAA,IACpC,QAAQ,CAAC;AAAA,MACP,MAAM;AAAA,MACN,MAAM+B;AAAA,MACN,MAAM;AAAA,MACN,KAAK;AAAA,MACL,OAAO,EAAE,MAAM,IAAM,UAAU,SAAA;AAAA,IAAS,CACzC;AAAA,EAAA;AAEL;AAEA,SAAS/E,GACPZ,GACAC,GACA8D,GACyB;AACzB,MAAI,CAAC,MAAM,QAAQ/D,CAAI,UAAU,CAAA;AAEjC,QAAM4F,IAAU5F,GACViB,IAAShB,GAAS,KAAKiB,EAAiB0E,CAAO,GAC/CrD,KAAUtC,GAAS,KAAK,CAACmB,EAAiBwE,CAAO,CAAC,GAAG,CAAC;AAE5D,MAAI,CAAC3E,KAAU,CAACsB,UAAe,CAAA;AAE/B,QAAMlB,IAAuB,CAAA,GACvBwE,IAAuB,CAAA,GACvBC,IAAoC,CAAA,GACpCC,IAAoC,CAAA;AAE1C,MAAIC,IAAU;AACd,aAAW1E,KAAOsE,GAAS;AACzB,UAAMK,IAAQ,OAAO3E,EAAIL,CAAM,KAAK,EAAE,GAChCiF,IAAQ,OAAO5E,EAAIiB,CAAM,KAAK,CAAC;AACrC,IAAAlB,EAAW,KAAK4E,CAAK,GAEjBC,KAAS,KACXL,EAAW,KAAKG,CAAO,GACvBF,EAAe,KAAKI,CAAK,GACzBH,EAAe,KAAK,IAAI,MAExBF,EAAW,KAAKG,IAAUE,CAAK,GAC/BJ,EAAe,KAAK,IAAI,GACxBC,EAAe,KAAK,KAAK,IAAIG,CAAK,CAAC,IAErCF,KAAWE;AAAA,EACb;AAEA,SAAO;AAAA,IACL,SAAS,EAAE,SAAS,QAAQ,aAAa,EAAE,MAAM,WAAS;AAAA,IAC1D,OAAO,EAAE,MAAM,YAAY,MAAM7E,EAAA;AAAA,IACjC,OAAO,EAAE,MAAM,QAAA;AAAA,IACf,QAAQ;AAAA,MACN;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,WAAW,EAAE,aAAa,eAAe,OAAO,cAAA;AAAA,QAChD,UAAU,EAAE,WAAW,EAAE,aAAa,eAAe,OAAO,gBAAc;AAAA,QAC1E,MAAMwE;AAAA,MAAA;AAAA,MAER;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,MAAMC;AAAA,MAAA;AAAA,MAER;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,MAAMC;AAAA,MAAA;AAAA,IACR;AAAA,EACF;AAEJ;AAEA,SAASlF,GACPb,GACA+D,GACyB;AACzB,MAAI,CAAC,MAAM,QAAQ/D,CAAI,UAAU,CAAA;AAGjC,QAAM2F,IAAc3F,EAAmC,IAAI,CAACmC,MAASgE,EAAWhE,CAAI,CAAC;AAErF,SAAO;AAAA,IACL,SAAS,EAAE,SAAS,OAAA;AAAA,IACpB,QAAQ,CAAC;AAAA,MACP,MAAM;AAAA,MACN,MAAMwD;AAAA,MACN,WAAW;AAAA,MACX,MAAM;AAAA,MACN,OAAO,EAAE,MAAM,IAAM,WAAW,MAAA;AAAA,IAAM,CACvC;AAAA,EAAA;AAEL;AAEA,SAASQ,EAAWhE,GAAwD;AAC1E,QAAMiE,IAAgC;AAAA,IACpC,MAAM,OAAOjE,EAAK,QAAQ,EAAE;AAAA,IAC5B,OAAO,OAAOA,EAAK,SAAS,CAAC;AAAA,EAAA;AAE/B,SAAI,MAAM,QAAQA,EAAK,QAAQ,MAC7BiE,EAAK,WAAYjE,EAAK,SAAuC,IAAI,CAACkE,MAAUF,EAAWE,CAAK,CAAC,IAExFD;AACT;AAEA,SAAS9D,EAAgBtC,GAA2C;AAClE,MAAIA,EAAK,WAAW,EAAG,QAAO,CAAA;AAC9B,QAAMkE,IAAQlE,EAAK,CAAC;AACpB,SAAO,OAAO,KAAKkE,CAAK,EAAE,OAAO,CAACG,MAAM,OAAOH,EAAMG,CAAC,KAAM,QAAQ;AACtE;AAOA,SAAStD,EACPuF,GACAC,GACyB;AACzB,QAAMnG,IAAS,EAAE,GAAGkG,EAAA;AACpB,aAAWhD,KAAO,OAAO,KAAKiD,CAAS,GAAG;AACxC,UAAMC,IAAKF,EAAKhD,CAAG,GACbmD,IAAKF,EAAUjD,CAAG;AACxB,IAAIoD,EAAcF,CAAE,KAAKE,EAAcD,CAAE,IACvCrG,EAAOkD,CAAG,IAAIvC,EAAUyF,GAA+BC,CAA6B,IAEpFrG,EAAOkD,CAAG,IAAImD;AAAA,EAElB;AACA,SAAOrG;AACT;AAEA,SAASsG,EAAc7D,GAA0C;AAC/D,SAAOA,KAAK,QAAQ,OAAOA,KAAM,YAAY,CAAC,MAAM,QAAQA,CAAC;AAC/D;;;;;;AC7pBA8D,EAAQ,IAAI;AAAA,EACVC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AACF,CAAC;AAGM,IAAMC,IAAN,cAAqBC,EAAW;AAAA,EAAhC,cAAA;AAAA,UAAA,GAAA,SAAA,GAuBL,KAAA,OAA2B,MAE3B,KAAQ,SAAiC,MACzC,KAAQ,aAAoC,MAC5C,KAAQ,kBAAyC;AAAA,EAAA;AAAA,EAEjD,SAAS;AACP,QAAI,CAAC,KAAK,KAAM,QAAOC;AACvB,UAAM7B,IAAQ,KAAK,KAAK,SAAS,GAAG,KAAK,KAAK,MAAM;AACpD,WAAO8B,oEAAuE9B,CAAK;AAAA,EACrF;AAAA,EAEU,eAAe;AACvB,SAAK,aAAa,KAAK,YAAY,cAAc,kBAAkB,GACnE,KAAK,WAAA,GACD,KAAK,eACP,KAAK,kBAAkB,IAAI,eAAe,MAAM,KAAK,QAAQ,QAAQ,GACrE,KAAK,gBAAgB,QAAQ,KAAK,UAAU;AAAA,EAEhD;AAAA,EAEU,QAAQ+B,GAA+B;AAC/C,IAAIA,EAAQ,IAAI,MAAM,KAAK,KAAK,cAC9B,KAAK,aAAA;AAAA,EAET;AAAA,EAEQ,aAAa;AACnB,QAAI,GAAC,KAAK,cAAc,CAAC,KAAK;AAE9B,UAAI;AACF,aAAK,SAASrB,EAAQ,KAAK,KAAK,UAAU,GAC1C,KAAK,OAAO,GAAG,SAAS,CAACtB,MAAoC;AAC3D,eAAK,cAAcA,CAAM;AAAA,QAC3B,CAAC,GACD,KAAK,aAAA;AAAA,MACP,SAAS,GAAG;AACV,gBAAQ,KAAK,2CAA4C,EAAY,OAAO;AAAA,MAC9E;AAAA,EACF;AAAA,EAEQ,cAAcA,GAAiC;AACrD,QAAI,CAAC,KAAK,KAAM;AAChB,UAAM4C,IAAuB;AAAA,MAC3B,MAAM;AAAA,MACN,QAAQ,KAAK,KAAK;AAAA,MAClB,IAAI,KAAK,KAAK;AAAA,MACd,MAAM;AAAA,QACJ,MAAM5C,EAAO;AAAA,QACb,YAAYA,EAAO;AAAA,QACnB,OAAOA,EAAO;AAAA,QACd,WAAWA,EAAO;AAAA,MAAA;AAAA,IACpB;AAEF,SAAK;AAAA,MACH,IAAI,YAAY,qBAAqB;AAAA,QACnC,QAAA4C;AAAA,QACA,SAAS;AAAA,QACT,UAAU;AAAA,MAAA,CACX;AAAA,IAAA;AAAA,EAEL;AAAA,EAEQ,eAAe;AACrB,QAAI,CAAC,KAAK,UAAU,CAAC,KAAK,KAAM;AAEhC,UAAMC,IAASrI,GAAgB,KAAK,IAAI,GAGlCsI,IAAc,KAAK,iBAAA;AACzB,IAAIA,EAAY,SAAS,MACvBD,EAAO,QAAQC,IAEb,KAAK,YAAY,eAAe,MAClCD,EAAO,kBAAkB,gBAI3B,KAAK,iBAAiBA,CAAM,GAE5B,KAAK,OAAO,UAAUA,GAAQ,EAAI;AAAA,EACpC;AAAA,EAEQ,iBAAiBA,GAAiC;AACxD,UAAME,IAAY,KAAK,YAAY,iBAAiB,GAC9CC,IAAiB,KAAK,YAAY,2BAA2B,GAC7DC,IAAc,KAAK,YAAY,mBAAmB;AAExD,QAAI,CAACF,EAAW;AAGhB,IAAAF,EAAO,YAAY,EAAE,GAAIA,EAAO,WAAuC,OAAOE,EAAA;AAG9E,UAAMG,IAAY;AAAA,MAChB,WAAW,EAAE,OAAOF,KAAkBD,EAAA;AAAA,MACtC,UAAU,EAAE,WAAW,EAAE,OAAOE,KAAeD,IAAe;AAAA,MAC9D,WAAW,EAAE,WAAW,EAAE,OAAOC,IAAY;AAAA,IAAE;AAEjD,IAAIJ,EAAO,SAAS,OAAOA,EAAO,SAAU,aAC1CA,EAAO,QAAQ,EAAE,GAAGA,EAAO,OAAkC,GAAGK,EAAA,IAE9DL,EAAO,SAAS,OAAOA,EAAO,SAAU,aAC1CA,EAAO,QAAQ,EAAE,GAAGA,EAAO,OAAkC,GAAGK,EAAA,IAI9DL,EAAO,UAAU,OAAOA,EAAO,UAAW,aAC5CA,EAAO,SAAS,EAAE,GAAGA,EAAO,QAAmC,WAAW,EAAE,OAAOE,IAAU;AAAA,EAEjG;AAAA,EAEQ,mBAA6B;AACnC,UAAMI,IAAmB,CAAA;AAEzB,aAAS7G,IAAI,GAAGA,KAAK,IAAIA,KAAK;AAC5B,YAAM8G,IAAI,KAAK,YAAY,0BAA0B9G,CAAC,EAAE;AACxD,UAAI8G,EAAG,CAAAD,EAAO,KAAKC,CAAC;AAAA,UACf;AAAA,IACP;AAEA,QAAID,EAAO,WAAW,GAAG;AACvB,YAAME,IAAU,KAAK,YAAY,oBAAoB;AACrD,MAAIA,KAASF,EAAO,KAAKE,CAAO;AAAA,IAClC;AACA,WAAOF;AAAA,EACT;AAAA,EAEQ,YAAYjF,GAAsB;AACxC,WAAO,iBAAiB,IAAI,EAAE,iBAAiBA,CAAI,EAAE,KAAA;AAAA,EACvD;AAAA,EAEA,uBAAuB;AACrB,UAAM,qBAAA,GACN,KAAK,iBAAiB,WAAA,GACtB,KAAK,kBAAkB,MACvB,KAAK,QAAQ,QAAA,GACb,KAAK,SAAS;AAAA,EAChB;AAAA;AAAA,EAGA,SAAS;AACP,SAAK,QAAQ,OAAA;AAAA,EACf;AACF;AAvKaqE,EACJ,SAAS;AAAA,EACde;AAAA,EACAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBF;AAGAC,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAtBflB,EAuBX,WAAA,QAAA,CAAA;AAvBWA,IAANiB,EAAA;AAAA,EADNE,EAAc,SAAS;AAAA,GACXnB,CAAA;"}
|