minerva-design 1.13.2 → 1.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/custom-elements.json +194 -12
- package/dist/angular/fesm2022/minerva-angular.mjs +20 -0
- package/dist/angular/fesm2022/minerva-angular.mjs.map +1 -1
- package/dist/angular/types/minerva-angular.d.ts +10 -1
- package/dist/charts/canvas.d.cts +1 -0
- package/dist/charts/canvas.d.ts +1 -0
- package/dist/charts/engine/canvas.cjs +1 -1
- package/dist/charts/engine/canvas.cjs.map +1 -1
- package/dist/charts/engine/canvas.js +152 -128
- package/dist/charts/engine/canvas.js.map +1 -1
- package/dist/charts/engine/chart.cjs +1 -1
- package/dist/charts/engine/chart.cjs.map +1 -1
- package/dist/charts/engine/chart.js +475 -405
- package/dist/charts/engine/chart.js.map +1 -1
- package/dist/charts/engine/controller.cjs +2 -2
- package/dist/charts/engine/controller.cjs.map +1 -1
- package/dist/charts/engine/controller.js +263 -248
- package/dist/charts/engine/controller.js.map +1 -1
- package/dist/charts/engine/dom.cjs +1 -1
- package/dist/charts/engine/dom.cjs.map +1 -1
- package/dist/charts/engine/dom.d.cts +34 -0
- package/dist/charts/engine/dom.d.ts +34 -0
- package/dist/charts/engine/dom.js +62 -51
- package/dist/charts/engine/dom.js.map +1 -1
- package/dist/charts/engine/graph/chart.cjs +1 -1
- package/dist/charts/engine/graph/chart.cjs.map +1 -1
- package/dist/charts/engine/graph/chart.js +835 -821
- package/dist/charts/engine/graph/chart.js.map +1 -1
- package/dist/charts/engine/graph/dom.cjs +1 -1
- package/dist/charts/engine/graph/dom.cjs.map +1 -1
- package/dist/charts/engine/graph/dom.js +44 -51
- package/dist/charts/engine/graph/dom.js.map +1 -1
- package/dist/charts/engine/hover-rect.cjs +2 -0
- package/dist/charts/engine/hover-rect.cjs.map +1 -0
- package/dist/charts/engine/hover-rect.d.cts +10 -0
- package/dist/charts/engine/hover-rect.d.ts +10 -0
- package/dist/charts/engine/hover-rect.js +47 -0
- package/dist/charts/engine/hover-rect.js.map +1 -0
- package/dist/charts/engine/items.cjs +1 -1
- package/dist/charts/engine/items.cjs.map +1 -1
- package/dist/charts/engine/items.js +8 -8
- package/dist/charts/engine/model.cjs +1 -1
- package/dist/charts/engine/model.cjs.map +1 -1
- package/dist/charts/engine/model.js +191 -191
- package/dist/charts/engine/model.js.map +1 -1
- package/dist/charts/engine/orderbook/depth.cjs +1 -1
- package/dist/charts/engine/orderbook/depth.cjs.map +1 -1
- package/dist/charts/engine/orderbook/depth.js +63 -63
- package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
- package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
- package/dist/charts/engine/orderbook/heatmap.js +155 -155
- package/dist/charts/engine/orderbook/host.cjs +1 -1
- package/dist/charts/engine/orderbook/host.cjs.map +1 -1
- package/dist/charts/engine/orderbook/host.js +87 -75
- package/dist/charts/engine/orderbook/host.js.map +1 -1
- package/dist/charts/engine/orderbook/ladder.cjs +1 -1
- package/dist/charts/engine/orderbook/ladder.cjs.map +1 -1
- package/dist/charts/engine/orderbook/ladder.js +41 -41
- package/dist/charts/engine/orderbook/tape.cjs +1 -1
- package/dist/charts/engine/orderbook/tape.cjs.map +1 -1
- package/dist/charts/engine/orderbook/tape.js +31 -31
- package/dist/charts/engine/presets.cjs +2 -2
- package/dist/charts/engine/presets.cjs.map +1 -1
- package/dist/charts/engine/presets.js +15 -15
- package/dist/charts/engine/renderers/vector-gpu.cjs +24 -0
- package/dist/charts/engine/renderers/vector-gpu.cjs.map +1 -0
- package/dist/charts/engine/renderers/vector-gpu.d.cts +22 -0
- package/dist/charts/engine/renderers/vector-gpu.d.ts +22 -0
- package/dist/charts/engine/renderers/vector-gpu.js +301 -0
- package/dist/charts/engine/renderers/vector-gpu.js.map +1 -0
- package/dist/charts/engine/renderers/vector.cjs +2 -0
- package/dist/charts/engine/renderers/vector.cjs.map +1 -0
- package/dist/charts/engine/renderers/vector.d.cts +140 -0
- package/dist/charts/engine/renderers/vector.d.ts +140 -0
- package/dist/charts/engine/renderers/vector.js +568 -0
- package/dist/charts/engine/renderers/vector.js.map +1 -0
- package/dist/charts/engine/scene.cjs +1 -1
- package/dist/charts/engine/scene.cjs.map +1 -1
- package/dist/charts/engine/scene.d.cts +43 -3
- package/dist/charts/engine/scene.d.ts +43 -3
- package/dist/charts/engine/scene.js +411 -338
- package/dist/charts/engine/scene.js.map +1 -1
- package/dist/charts/engine/shapes/bullet.cjs +1 -1
- package/dist/charts/engine/shapes/bullet.cjs.map +1 -1
- package/dist/charts/engine/shapes/bullet.js +36 -36
- package/dist/charts/engine/shapes/calendar.cjs +1 -1
- package/dist/charts/engine/shapes/calendar.cjs.map +1 -1
- package/dist/charts/engine/shapes/calendar.js +53 -53
- package/dist/charts/engine/shapes/chart.cjs +1 -1
- package/dist/charts/engine/shapes/chart.cjs.map +1 -1
- package/dist/charts/engine/shapes/chart.d.cts +3 -2
- package/dist/charts/engine/shapes/chart.d.ts +3 -2
- package/dist/charts/engine/shapes/chart.js +192 -162
- package/dist/charts/engine/shapes/chart.js.map +1 -1
- package/dist/charts/engine/shapes/draw.cjs +1 -1
- package/dist/charts/engine/shapes/draw.cjs.map +1 -1
- package/dist/charts/engine/shapes/draw.js +87 -86
- package/dist/charts/engine/shapes/draw.js.map +1 -1
- package/dist/charts/engine/shapes/layout.cjs +2 -2
- package/dist/charts/engine/shapes/layout.cjs.map +1 -1
- package/dist/charts/engine/shapes/layout.d.cts +8 -7
- package/dist/charts/engine/shapes/layout.d.ts +8 -7
- package/dist/charts/engine/shapes/layout.js +262 -166
- package/dist/charts/engine/shapes/layout.js.map +1 -1
- package/dist/charts/engine/shapes/types.d.cts +13 -1
- package/dist/charts/engine/shapes/types.d.ts +13 -1
- package/dist/charts/engine/three-d/chart.cjs +1 -1
- package/dist/charts/engine/three-d/chart.cjs.map +1 -1
- package/dist/charts/engine/three-d/chart.js +266 -257
- package/dist/charts/engine/three-d/chart.js.map +1 -1
- package/dist/charts/engine/three-d/dom.cjs +1 -1
- package/dist/charts/engine/three-d/dom.cjs.map +1 -1
- package/dist/charts/engine/three-d/dom.js +28 -35
- package/dist/charts/engine/three-d/dom.js.map +1 -1
- package/dist/charts/engine/three-d/geometry.cjs +1 -1
- package/dist/charts/engine/three-d/geometry.cjs.map +1 -1
- package/dist/charts/engine/three-d/geometry.js +70 -70
- package/dist/charts/engine/three-d/overlay.cjs +1 -1
- package/dist/charts/engine/three-d/overlay.cjs.map +1 -1
- package/dist/charts/engine/three-d/overlay.js +15 -15
- package/dist/charts/engine/tooltip.cjs +2 -0
- package/dist/charts/engine/tooltip.cjs.map +1 -0
- package/dist/charts/engine/tooltip.d.cts +94 -0
- package/dist/charts/engine/tooltip.d.ts +94 -0
- package/dist/charts/engine/tooltip.js +242 -0
- package/dist/charts/engine/tooltip.js.map +1 -0
- package/dist/charts/engine/trading/chart.cjs +1 -1
- package/dist/charts/engine/trading/chart.cjs.map +1 -1
- package/dist/charts/engine/trading/chart.js +135 -135
- package/dist/charts/react/shapes.cjs +1 -1
- package/dist/charts/react/shapes.cjs.map +1 -1
- package/dist/charts/react/shapes.d.cts +10 -1
- package/dist/charts/react/shapes.d.ts +10 -1
- package/dist/charts/react/shapes.js +24 -19
- package/dist/charts/react/shapes.js.map +1 -1
- package/dist/core/contracts.cjs +1 -1
- package/dist/core/contracts.cjs.map +1 -1
- package/dist/core/contracts.js +1 -1
- package/dist/core/contracts.js.map +1 -1
- package/dist/native/charts/src/canvas.cjs +1 -1
- package/dist/native/charts/src/canvas.js +8 -7
- package/dist/native/charts/src/engine/canvas.cjs +1 -1
- package/dist/native/charts/src/engine/canvas.js +2 -0
- package/dist/native/charts/src/engine/controller.cjs +2 -2
- package/dist/native/charts/src/engine/controller.cjs.map +1 -1
- package/dist/native/charts/src/engine/controller.js +102 -87
- package/dist/native/charts/src/engine/controller.js.map +1 -1
- package/dist/native/charts/src/engine/hover-rect.cjs +2 -0
- package/dist/native/charts/src/engine/hover-rect.cjs.map +1 -0
- package/dist/native/charts/src/engine/hover-rect.js +47 -0
- package/dist/native/charts/src/engine/hover-rect.js.map +1 -0
- package/dist/native/charts/src/engine/scene.cjs +1 -1
- package/dist/native/charts/src/engine/scene.cjs.map +1 -1
- package/dist/native/charts/src/engine/scene.js +318 -245
- package/dist/native/charts/src/engine/scene.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/draw.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/draw.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/draw.js +81 -80
- package/dist/native/charts/src/engine/shapes/draw.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/layout.cjs +2 -2
- package/dist/native/charts/src/engine/shapes/layout.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/layout.js +239 -143
- package/dist/native/charts/src/engine/shapes/layout.js.map +1 -1
- package/dist/native/charts/src/engine/tooltip.cjs +2 -0
- package/dist/native/charts/src/engine/tooltip.cjs.map +1 -0
- package/dist/native/charts/src/engine/tooltip.js +164 -0
- package/dist/native/charts/src/engine/tooltip.js.map +1 -0
- package/dist/native/components/Chart/scene.cjs +1 -1
- package/dist/native/components/Chart/scene.cjs.map +1 -1
- package/dist/native/components/Chart/scene.js +210 -187
- package/dist/native/components/Chart/scene.js.map +1 -1
- package/dist/native/source/components/Chart/scene.tsx +55 -2
- package/dist/taro/index.js +2026 -1626
- package/dist/uni/charts-canvas.js +1 -0
- package/dist/vue/components/Chart/BulletChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/CalendarHeatmap.vue.d.ts +2 -0
- package/dist/vue/components/Chart/ChordChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/DonutChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/FunnelChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/GaugeChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/PieChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/RadarChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/RadialBarChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/SankeyChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/SunburstChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/TreemapChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/props.d.ts +2 -0
- package/dist/vue/components/Chart/props.js +1 -0
- package/dist/vue/components/Chart/props.js.map +1 -1
- package/dist/vue/components/Chart/shape.d.ts +2 -1
- package/dist/vue/components/Chart/shape.js +2 -0
- package/dist/vue/components/Chart/shape.js.map +1 -1
- package/dist/vue/components/Chart/types.d.ts +2 -0
- package/dist/weapp/charts/canvas.js +2576 -1969
- package/dist/weapp/charts/core.js +1 -0
- package/dist/web-components/components/chart/shape-chart.d.ts +9 -7
- package/dist/web-components/components/chart/shape-chart.js +3 -0
- package/dist/web-components/components/chart/shape-chart.js.map +1 -1
- package/dist/web-components/components/chart/shapes-extended.d.ts +6 -6
- package/dist/web-components/components/chart/shapes-extended.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,13 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { drawBackground as
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
1
|
+
import { CANVAS_TOOLTIP_ALPHA as e } from "./tooltip.js";
|
|
2
|
+
import { toCss as t } from "./color.js";
|
|
3
|
+
import { drawBackground as n, drawForeground as r, font as i } from "./overlay.js";
|
|
4
|
+
import { liftedBarRect as a } from "./scene.js";
|
|
5
|
+
import { buildItems as o, cellStyleKey as s } from "./items.js";
|
|
6
|
+
import { createCanvas2dPainter as c } from "./renderers/canvas2d.js";
|
|
7
|
+
import { itemsSignature as l } from "./signature.js";
|
|
8
|
+
import { createChartController as u, scenePrimitives as d } from "./controller.js";
|
|
7
9
|
//#region src/engine/canvas.ts
|
|
8
|
-
var
|
|
10
|
+
var f = (e) => (e[0] + e[1]) / 2, p = (e, t, n, r, i, a) => {
|
|
9
11
|
e.beginPath(), e.moveTo(t + a, n), e.lineTo(t + r - a, n), e.arcTo(t + r, n, t + r, n + a, a), e.lineTo(t + r, n + i - a), e.arcTo(t + r, n + i, t + r - a, n + i, a), e.lineTo(t + a, n + i), e.arcTo(t, n + i, t, n + i - a, a), e.lineTo(t, n + a), e.arcTo(t, n, t + a, n, a), e.closePath();
|
|
10
|
-
},
|
|
12
|
+
}, m = (e, t, n) => {
|
|
11
13
|
e.save(), e.beginPath(), e.rect(n.x, n.y, n.width, n.height), e.clip(), e.lineJoin = "round", e.lineCap = "round";
|
|
12
14
|
for (let n of t) if (n.kind === "area") e.globalAlpha = n.opacity, e.fillStyle = n.color, n.segments.forEach((t, r) => {
|
|
13
15
|
let i = n.bottoms?.[r], a = t.length / 2;
|
|
@@ -37,7 +39,7 @@ var u = (e) => (e[0] + e[1]) / 2, d = (e, t, n, r, i, a) => {
|
|
|
37
39
|
];
|
|
38
40
|
e.fillStyle = n.colors?.[r / 4] ?? n.color;
|
|
39
41
|
let c = Math.min(t, o / 2, s / 2);
|
|
40
|
-
c > .5 ? (
|
|
42
|
+
c > .5 ? (p(e, i, a, o, s, c), e.fill()) : e.fillRect(i, a, o, s);
|
|
41
43
|
}
|
|
42
44
|
e.globalAlpha = 1;
|
|
43
45
|
} else {
|
|
@@ -49,177 +51,199 @@ var u = (e) => (e[0] + e[1]) / 2, d = (e, t, n, r, i, a) => {
|
|
|
49
51
|
e.globalAlpha = 1;
|
|
50
52
|
}
|
|
51
53
|
e.restore();
|
|
52
|
-
},
|
|
53
|
-
let { theme:
|
|
54
|
-
if (typeof
|
|
55
|
-
let
|
|
56
|
-
s.forEach((
|
|
54
|
+
}, h = (e, n, r) => {
|
|
55
|
+
let { theme: a } = r, { bar: o, stops: s } = n, c = s.length;
|
|
56
|
+
if (typeof e.createLinearGradient == "function") {
|
|
57
|
+
let t = e.createLinearGradient(o.x, 0, o.x + o.width, 0);
|
|
58
|
+
s.forEach((e, n) => t.addColorStop(n / Math.max(1, c - 1), e)), e.fillStyle = t, p(e, o.x, o.y, o.width, o.height, o.height / 2), e.fill();
|
|
57
59
|
} else {
|
|
58
|
-
let
|
|
60
|
+
let t = o.width / c;
|
|
59
61
|
s.forEach((n, r) => {
|
|
60
|
-
|
|
62
|
+
e.fillStyle = n, e.fillRect(o.x + r * t, o.y, t + .5, o.height);
|
|
61
63
|
});
|
|
62
64
|
}
|
|
63
|
-
|
|
64
|
-
for (let
|
|
65
|
-
|
|
66
|
-
for (let
|
|
67
|
-
n.caret !== null && (
|
|
68
|
-
},
|
|
69
|
-
let
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
65
|
+
e.fillStyle = t(a.text, .35);
|
|
66
|
+
for (let t of n.ticks) e.fillRect(Math.round(t), o.y - 2, 1, o.height + 4);
|
|
67
|
+
e.font = i(a, 11), e.textBaseline = "middle", e.fillStyle = t(a.textMuted);
|
|
68
|
+
for (let t of n.labels) e.textAlign = t.align, e.fillText(t.text, t.x, t.y);
|
|
69
|
+
n.caret !== null && (p(e, n.caret - 2, o.y - 3, 4, o.height + 6, 2), e.fillStyle = t(a.text), e.fill(), e.lineWidth = 1.5, e.strokeStyle = t(a.background), e.stroke());
|
|
70
|
+
}, g = 1.16, _ = (e, t, n, r) => {
|
|
71
|
+
let i = Math.max(0, t.width + r * 2), a = Math.max(0, t.height + r * 2);
|
|
72
|
+
p(e, t.x - r, t.y - r, i, a, Math.max(0, Math.min(n + r, i / 2, a / 2)));
|
|
73
|
+
}, v = (e, n, r, i, a, o, s, c, l) => {
|
|
74
|
+
let u = t(l.background);
|
|
75
|
+
o ? (e.save(), e.shadowColor = "rgba(15, 23, 42, 0.4)", e.shadowBlur = 14, e.shadowOffsetY = 5, _(e, n, r, s + (c?.width ?? 0)), e.fillStyle = c ? c.color : u, e.fill(), e.restore(), c && (_(e, n, r, s), e.fillStyle = u, e.fill())) : a && (_(e, n, r, 0), e.fillStyle = u, e.fill()), _(e, n, r, 0), e.fillStyle = i, e.fill(), o && o.width > 0 && (_(e, n, r, -o.width / 2), e.lineWidth = o.width, e.strokeStyle = o.color, e.stroke());
|
|
76
|
+
}, y = (e, n, r, i) => {
|
|
77
|
+
for (let o of n) if (o.kind === "bar") {
|
|
78
|
+
let t = a(o);
|
|
79
|
+
e.save(), e.beginPath(), e.rect(r.x, r.y, r.width, r.height), e.clip();
|
|
80
|
+
let n = o.ring === null ? null : {
|
|
81
|
+
color: o.ring,
|
|
82
|
+
width: Math.min(o.backdrop ? 2 : 1.5, Math.max(0, (Math.min(t.width, t.height) - 2) / 4))
|
|
83
|
+
};
|
|
84
|
+
v(e, t, o.radius, o.color, o.backdrop, n, 1.5, null, i), e.restore();
|
|
85
|
+
} else if (o.kind === "cell") {
|
|
86
|
+
let n = o.width * g, r = o.height * g;
|
|
87
|
+
v(e, {
|
|
88
|
+
x: o.x + (o.width - n) / 2,
|
|
89
|
+
y: o.y + (o.height - r) / 2,
|
|
90
|
+
width: n,
|
|
91
|
+
height: r
|
|
92
|
+
}, Math.max(2, o.radius) * g, o.color, !1, {
|
|
93
|
+
color: o.ring,
|
|
94
|
+
width: Math.min(2, Math.min(n, r) / 5)
|
|
95
|
+
}, 2, {
|
|
96
|
+
color: t(i.primary, .6),
|
|
97
|
+
width: 1.5
|
|
98
|
+
}, i);
|
|
99
|
+
}
|
|
100
|
+
}, b = (a, o, s, l, u, f = c(a)) => {
|
|
101
|
+
let { width: g, height: _, theme: v, model: b, view: x, layout: S } = o, { plot: C, scales: w } = S, T = u;
|
|
102
|
+
a.setTransform(1, 0, 0, 1, 0, 0), a.clearRect(0, 0, Math.ceil(g * T), Math.ceil(_ * T)), a.setTransform(T, 0, 0, T, 0, 0), n(a, {
|
|
103
|
+
width: g,
|
|
104
|
+
height: _,
|
|
105
|
+
scales: w,
|
|
106
|
+
x: b.x,
|
|
107
|
+
y: b.y,
|
|
108
|
+
xTicks: S.xTicks,
|
|
109
|
+
yTicks: S.yTicks,
|
|
110
|
+
y2: b.y2,
|
|
111
|
+
y2Ticks: S.y2Ticks,
|
|
112
|
+
theme: v,
|
|
113
|
+
annotations: o.annotations
|
|
82
114
|
});
|
|
83
|
-
let
|
|
84
|
-
if (
|
|
85
|
-
|
|
86
|
-
for (let
|
|
87
|
-
let n =
|
|
88
|
-
if (
|
|
89
|
-
let
|
|
90
|
-
|
|
115
|
+
let E = o.legend?.colors;
|
|
116
|
+
if (E && h(a, E, o), o.legend) {
|
|
117
|
+
a.font = i(v, 12), a.textBaseline = "middle", a.textAlign = "left";
|
|
118
|
+
for (let e of o.legend.entries) {
|
|
119
|
+
let n = e.box.y + e.box.height / 2;
|
|
120
|
+
if (a.globalAlpha = e.hidden ? .45 : 1, a.fillStyle = e.color, e.shape === "dot" ? (a.beginPath(), a.arc(e.box.x + 5, n, 4, 0, Math.PI * 2), a.fill()) : e.shape === "line" ? a.fillRect(e.box.x, n - 1, 10, 2) : a.fillRect(e.box.x + 1, n - 4, 8, 8), a.fillStyle = t(v.textMuted), a.fillText(e.name, e.box.x + 14, n), e.hidden) {
|
|
121
|
+
let t = e.box.width - 22;
|
|
122
|
+
a.fillRect(e.box.x + 14, n, t, 1);
|
|
91
123
|
}
|
|
92
124
|
}
|
|
93
|
-
|
|
125
|
+
a.globalAlpha = 1;
|
|
94
126
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
127
|
+
let D = o.hover?.marks.some((e) => e.kind === "bar") ?? !1;
|
|
128
|
+
for (let e of o.hover?.marks ?? []) e.kind === "band" && (p(a, e.x, e.y, e.width, e.height, 6), a.fillStyle = t(v.text, D ? .04 : .06), a.fill());
|
|
129
|
+
w.horizontal ? m(a, d(o), C) : O();
|
|
130
|
+
function O() {
|
|
98
131
|
let e = (e, t, n) => {
|
|
99
132
|
let r = 2 / (e[1] - e[0]), i = (t - e[0]) * r - 1;
|
|
100
133
|
return n ? [-r, -i] : [r, i];
|
|
101
|
-
}, [t, n] = e(
|
|
102
|
-
|
|
134
|
+
}, [t, n] = e(x.x, l.x, b.x.reverse), [r, i] = e(x.y, l.y, b.y.reverse);
|
|
135
|
+
f.paint(s, {
|
|
103
136
|
transform: {
|
|
104
137
|
xScale: t,
|
|
105
138
|
xOffset: n,
|
|
106
139
|
yScale: r,
|
|
107
140
|
yOffset: i
|
|
108
141
|
},
|
|
109
|
-
width: Math.max(1, Math.round(
|
|
110
|
-
height: Math.max(1, Math.round(
|
|
111
|
-
dpr:
|
|
112
|
-
}, Math.round(
|
|
142
|
+
width: Math.max(1, Math.round(C.width * T)),
|
|
143
|
+
height: Math.max(1, Math.round(C.height * T)),
|
|
144
|
+
dpr: T
|
|
145
|
+
}, Math.round(C.x * T), Math.round(C.y * T));
|
|
113
146
|
}
|
|
114
|
-
|
|
115
|
-
for (let
|
|
116
|
-
if (
|
|
117
|
-
width:
|
|
118
|
-
height:
|
|
119
|
-
scales:
|
|
120
|
-
theme:
|
|
121
|
-
annotations:
|
|
147
|
+
a.setTransform(T, 0, 0, T, 0, 0);
|
|
148
|
+
for (let e of o.hover?.marks ?? []) e.kind === "guide" && (a.fillStyle = t(v.text, .06), a.fillRect(e.x, e.y, e.width, e.height));
|
|
149
|
+
if (D && (a.fillStyle = t(v.background, .42), a.fillRect(C.x, C.y, C.width, C.height)), o.hover && y(a, o.hover.marks, C, v), r(a, {
|
|
150
|
+
width: g,
|
|
151
|
+
height: _,
|
|
152
|
+
scales: w,
|
|
153
|
+
theme: v,
|
|
154
|
+
annotations: o.annotations,
|
|
122
155
|
pointLabels: [],
|
|
123
156
|
clear: !1,
|
|
124
|
-
connectors:
|
|
125
|
-
arrows:
|
|
126
|
-
}),
|
|
127
|
-
|
|
128
|
-
for (let { label: e, box:
|
|
129
|
-
let n =
|
|
157
|
+
connectors: o.connectors,
|
|
158
|
+
arrows: o.arrows
|
|
159
|
+
}), o.pointLabels.length) {
|
|
160
|
+
a.save(), a.font = i(v), a.textAlign = "left", a.textBaseline = "middle", a.lineWidth = 3, a.lineJoin = "round", a.strokeStyle = t(v.background, .9), a.fillStyle = t(v.text, .85);
|
|
161
|
+
for (let { label: e, box: t } of o.pointLabels) {
|
|
162
|
+
let n = t.y + t.height / 2;
|
|
130
163
|
if (e.color) {
|
|
131
|
-
|
|
164
|
+
a.save(), a.fillStyle = e.color, a.fillText(e.text, t.x, n), a.restore();
|
|
132
165
|
continue;
|
|
133
166
|
}
|
|
134
|
-
|
|
167
|
+
a.strokeText(e.text, t.x, n), a.fillText(e.text, t.x, n);
|
|
135
168
|
}
|
|
136
|
-
|
|
169
|
+
a.restore();
|
|
137
170
|
}
|
|
138
|
-
let
|
|
139
|
-
if (
|
|
140
|
-
if (
|
|
141
|
-
|
|
142
|
-
let
|
|
143
|
-
|
|
144
|
-
}
|
|
145
|
-
if (E.crosshairY !== null) {
|
|
146
|
-
t.save(), t.strokeStyle = e(_.textMuted, .55), t.lineWidth = 1, t.setLineDash([3, 3]), t.beginPath();
|
|
147
|
-
let n = Math.round(E.crosshairY) + .5;
|
|
148
|
-
t.moveTo(x.x, n), t.lineTo(x.x + x.width, n), t.stroke(), t.restore();
|
|
171
|
+
let k = o.hover;
|
|
172
|
+
if (k) {
|
|
173
|
+
if (k.crosshairX !== null) {
|
|
174
|
+
a.save(), a.strokeStyle = t(v.textMuted, .55), a.lineWidth = 1, a.setLineDash([3, 3]), a.beginPath();
|
|
175
|
+
let e = Math.round(k.crosshairX) + .5;
|
|
176
|
+
a.moveTo(e, C.y), a.lineTo(e, C.y + C.height), a.stroke(), a.restore();
|
|
149
177
|
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
let i = Math.min(2.75, n.width / 5, n.height / 5);
|
|
155
|
-
n.width > 8 && n.height > 8 && (d(t, n.x + i, n.y + i, n.width - i * 2, n.height - i * 2, Math.max(1, r - i / 2)), t.lineWidth = 1.5, t.strokeStyle = n.ring, t.stroke());
|
|
156
|
-
continue;
|
|
157
|
-
}
|
|
158
|
-
t.beginPath(), t.arc(n.x, n.y, n.size / 2 + 4, 0, Math.PI * 2), t.fillStyle = n.halo, t.fill(), t.beginPath(), t.arc(n.x, n.y, n.size / 2 - 1, 0, Math.PI * 2), t.fillStyle = n.color, t.fill(), t.lineWidth = 2, t.strokeStyle = e(_.background), t.stroke();
|
|
178
|
+
if (k.crosshairY !== null) {
|
|
179
|
+
a.save(), a.strokeStyle = t(v.textMuted, .55), a.lineWidth = 1, a.setLineDash([3, 3]), a.beginPath();
|
|
180
|
+
let e = Math.round(k.crosshairY) + .5;
|
|
181
|
+
a.moveTo(C.x, e), a.lineTo(C.x + C.width, e), a.stroke(), a.restore();
|
|
159
182
|
}
|
|
183
|
+
for (let e of k.marks) e.kind !== "band" && e.kind !== "guide" && e.kind !== "bar" && e.kind !== "cell" && (a.beginPath(), a.arc(e.x, e.y, e.size / 2 + 4, 0, Math.PI * 2), a.fillStyle = e.halo, a.fill(), a.beginPath(), a.arc(e.x, e.y, e.size / 2 - 1, 0, Math.PI * 2), a.fillStyle = e.color, a.fill(), a.lineWidth = 2, a.strokeStyle = t(v.background), a.stroke());
|
|
160
184
|
}
|
|
161
|
-
if (
|
|
162
|
-
let
|
|
163
|
-
|
|
185
|
+
if (o.dragging) {
|
|
186
|
+
let e = o.dragging;
|
|
187
|
+
a.beginPath(), a.arc(e.x, e.y, e.size / 2, 0, Math.PI * 2), a.fillStyle = e.color, a.globalAlpha = .85, a.fill(), a.globalAlpha = 1, a.lineWidth = 2, a.strokeStyle = t(v.background), a.stroke();
|
|
164
188
|
}
|
|
165
|
-
let
|
|
166
|
-
if (
|
|
167
|
-
let { box: n, lineHeight: r, padding:
|
|
168
|
-
|
|
169
|
-
let
|
|
170
|
-
if (
|
|
171
|
-
|
|
172
|
-
for (let e of
|
|
189
|
+
let A = k?.tooltip;
|
|
190
|
+
if (A) {
|
|
191
|
+
let { box: n, lineHeight: r, padding: o } = A;
|
|
192
|
+
a.save(), a.shadowColor = "rgba(15, 23, 42, 0.18)", a.shadowBlur = 16, a.shadowOffsetY = 6, p(a, n.x, n.y, n.width, n.height, 8), a.fillStyle = t(v.background, e), a.fill(), a.restore(), p(a, n.x + .5, n.y + .5, n.width - 1, n.height - 1, 8), a.strokeStyle = t(v.axis, .6), a.lineWidth = 1, a.stroke(), a.textBaseline = "middle";
|
|
193
|
+
let s = n.y + o + r / 2, c = n.x + o + 2, l = n.x + n.width - o - 2;
|
|
194
|
+
if (A.text) {
|
|
195
|
+
a.font = i(v, 12), a.fillStyle = t(v.text), a.textAlign = "left";
|
|
196
|
+
for (let e of A.text) a.fillText(e, c, s), s += r;
|
|
173
197
|
} else {
|
|
174
|
-
let { content:
|
|
175
|
-
|
|
176
|
-
for (let
|
|
198
|
+
let { content: e } = A, n = c;
|
|
199
|
+
e.titleColor && (a.fillStyle = e.titleColor, a.beginPath(), a.arc(n + 4, s, 4, 0, Math.PI * 2), a.fill(), n += 14), a.font = i(v, 12, 600), a.fillStyle = t(v.text), a.textAlign = "left", a.fillText(e.title, n, s), s += r, e.subtitle && (a.font = i(v, 11), a.fillStyle = t(v.textMuted), a.fillText(e.subtitle, n, s - 2), s += r);
|
|
200
|
+
for (let o of e.rows) n = c, o.color && (a.fillStyle = o.color, a.beginPath(), a.arc(n + 4, s, 4, 0, Math.PI * 2), a.fill()), n += A.swatchWidth, a.font = i(v, 12), a.textAlign = "left", a.fillStyle = t(v.textMuted), a.fillText(o.name, n, s), a.font = i(v, 12, 600), a.textAlign = "right", a.fillStyle = t(v.text), a.fillText(o.value, l, s), s += r;
|
|
177
201
|
}
|
|
178
202
|
}
|
|
179
|
-
},
|
|
180
|
-
let { canvas:
|
|
181
|
-
let t =
|
|
182
|
-
return t === void 0 &&
|
|
203
|
+
}, x = (e) => {
|
|
204
|
+
let { canvas: t } = e, n = t.getContext("2d"), r = e.width, i = e.height, a = e.pixelRatio ?? 1, d = !1, p = null, m = [], h = null, g = "", _ = "", v = e.options, y = /* @__PURE__ */ new WeakMap(), x = 0, S = (e) => {
|
|
205
|
+
let t = y.get(e);
|
|
206
|
+
return t === void 0 && y.set(e, t = ++x), t;
|
|
183
207
|
}, C = {
|
|
184
208
|
x: 0,
|
|
185
209
|
y: 0
|
|
186
|
-
}, w = 0, T = "", E = (e, t) =>
|
|
187
|
-
if (p = null,
|
|
210
|
+
}, w = 0, T = "", E = (e, t) => n ? (t !== T && (n.font = t, T = t), n.measureText(e).width) : e.length * 6.5, D = n ? c(n) : null, O = globalThis, k = () => {
|
|
211
|
+
if (p = null, d || !n || !D) return;
|
|
188
212
|
let e = j.getScene();
|
|
189
213
|
if (!e) return;
|
|
190
|
-
let
|
|
191
|
-
|
|
192
|
-
let
|
|
193
|
-
x: 1 / Math.abs(
|
|
194
|
-
y: 1 / Math.abs(
|
|
195
|
-
}, E = `${
|
|
196
|
-
E !==
|
|
197
|
-
x:
|
|
198
|
-
y:
|
|
199
|
-
},
|
|
214
|
+
let c = Math.max(1, Math.round(r * a)), u = Math.max(1, Math.round(i * a));
|
|
215
|
+
t.width !== c && (t.width = c), t.height !== u && (t.height = u), T = "", h !== e.model && (h = e.model, g = l(e.model, S(e.theme), (e) => v.series[e]?.stack));
|
|
216
|
+
let y = e.layout.scales, x = {
|
|
217
|
+
x: 1 / Math.abs(y.xPerPx),
|
|
218
|
+
y: 1 / Math.abs(y.yPerPx)
|
|
219
|
+
}, E = `${g}|${s(e.model, x)}`;
|
|
220
|
+
E !== _ && (_ = E, C = {
|
|
221
|
+
x: f(e.model.base.x),
|
|
222
|
+
y: f(e.model.base.y)
|
|
223
|
+
}, m = o(e.model, C, ++w, x)), b(n, e, m, C, a, D), T = "";
|
|
200
224
|
}, A = () => {
|
|
201
|
-
|
|
202
|
-
}, j =
|
|
225
|
+
d || p !== null || (p = t.requestAnimationFrame ? t.requestAnimationFrame(k) : O.requestAnimationFrame ? O.requestAnimationFrame(k) : setTimeout(k, 16));
|
|
226
|
+
}, j = u({
|
|
203
227
|
options: e.options,
|
|
204
228
|
theme: e.theme,
|
|
205
229
|
measureText: E,
|
|
206
230
|
onInvalidate: A
|
|
207
231
|
});
|
|
208
|
-
j.setSize(
|
|
232
|
+
j.setSize(r, i);
|
|
209
233
|
let M = (e, t) => ({
|
|
210
234
|
id: e.identifier ?? t,
|
|
211
235
|
touch: !0
|
|
212
236
|
});
|
|
213
237
|
return {
|
|
214
238
|
setOptions: (e) => {
|
|
215
|
-
|
|
239
|
+
v = e, j.setOptions(e);
|
|
216
240
|
},
|
|
217
241
|
setTheme: (e) => j.setTheme(e),
|
|
218
242
|
resize(e, t, n) {
|
|
219
|
-
|
|
243
|
+
r = e, i = t, n && (a = n), j.setSize(e, t), A();
|
|
220
244
|
},
|
|
221
245
|
render() {
|
|
222
|
-
p !== null && (
|
|
246
|
+
p !== null && (t.cancelAnimationFrame ? t.cancelAnimationFrame(p) : O.cancelAnimationFrame ? O.cancelAnimationFrame(p) : clearTimeout(p)), k();
|
|
223
247
|
},
|
|
224
248
|
touchStart(e) {
|
|
225
249
|
e.forEach((e, t) => j.pointerDown(e.x, e.y, M(e, t)));
|
|
@@ -252,11 +276,11 @@ var u = (e) => (e[0] + e[1]) / 2, d = (e, t, n, r, i, a) => {
|
|
|
252
276
|
getController: () => j,
|
|
253
277
|
on: (e, t) => j.on(e, t),
|
|
254
278
|
destroy() {
|
|
255
|
-
|
|
279
|
+
d || (d = !0, p !== null && (t.cancelAnimationFrame ? t.cancelAnimationFrame(p) : O.cancelAnimationFrame ? O.cancelAnimationFrame(p) : clearTimeout(p)), D?.destroy(), j.destroy());
|
|
256
280
|
}
|
|
257
281
|
};
|
|
258
282
|
};
|
|
259
283
|
//#endregion
|
|
260
|
-
export {
|
|
284
|
+
export { x as createCanvasChart, m as drawPrimitives, b as drawScene };
|
|
261
285
|
|
|
262
286
|
//# sourceMappingURL=canvas.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvas.js","names":["mid","r","roundedRect","ctx","x","y","w","h","drawPrimitives","plot","p","primitives","bottoms","k","n","run","i","b","radius","stroke","color","drawColorLegend","scene","ramp","stops","gradient","bar","c","toCss","theme","t","font","l","drawScene","createCanvas2dPainter","layout","dpr","pixelRatio","width","height","drawBackground","model","e","cy","mark","scales","scenePrimitives","paintData","scale","s","range","offset","o","reverse","xScale","xOffset","view","origin","yScale","yOffset","items","drawForeground","box","label","hover","cx","grow","inset","d","tip","padding","lineHeight","left","right","line","content","row","createCanvasChart","config","canvas","destroyed","frameId","itemsModel","itemsKey0","itemsKey","options","themeIds","themeCount","themeId","id","version","fontSet","measureText","f","text","painter","g","render","controller","pw","ph","itemsSignature","index","sc","density","key","cellStyleKey","buildItems","schedule","createChartController","touchOptions","ratio","v","type","listener"],"sources":["../../../../charts/src/engine/canvas.ts"],"sourcesContent":["// createCanvasChart: a whole chart drawn on one 2D canvas without any DOM:\n// WeChat / Alipay / ByteDance mini-programs (`<canvas type=\"2d\">`), Taro,\n// uni-app, OffscreenCanvas, or a plain browser canvas. The host forwards\n// touches / pointer events; everything else is handled here.\n\nimport { toCss } from \"./color\";\nimport {\n createChartController,\n scenePrimitives,\n type ChartController,\n type ChartControllerEventMap,\n type ChartPointerOptions,\n type ChartPrimitive,\n type ChartScene,\n} from \"./controller\";\nimport { buildItems, cellStyleKey, type Origin } from \"./items\";\nimport { drawBackground, drawForeground, font } from \"./overlay\";\nimport { createCanvas2dPainter } from \"./renderers/canvas2d\";\nimport type { RenderItem } from \"./renderers/types\";\nimport { itemsSignature } from \"./signature\";\nimport type { ChartThemeInput } from \"./theme\";\nimport type { ChartOptions, ChartRect, ChartView } from \"./types\";\n\n/**\n * The canvas a chart draws on: a browser `HTMLCanvasElement`, an\n * `OffscreenCanvas` or the node of a mini-program `<canvas type=\"2d\">`\n * (`SelectorQuery.fields({ node: true })`)\n */\nexport interface ChartCanvas {\n width: number;\n height: number;\n getContext(type: \"2d\"): unknown;\n /** Mini-program canvases schedule their frames themselves */\n requestAnimationFrame?: (callback: () => void) => number;\n cancelAnimationFrame?: (id: number) => void;\n}\n\n/** A touch point relative to the canvas (`x` / `y`) with its identifier */\nexport interface ChartTouch {\n x: number;\n y: number;\n identifier?: number;\n}\n\nexport interface CanvasChartConfig {\n canvas: ChartCanvas;\n /** Size of the canvas in CSS pixels (rpx converted by the host) */\n width: number;\n height: number;\n /**\n * Device pixel ratio (`wx.getWindowInfo().pixelRatio` in mini-programs)\n * @default 1\n */\n pixelRatio?: number;\n options: ChartOptions;\n /** Colors and fonts: values of the Minerva CSS variables */\n theme?: ChartThemeInput;\n}\n\nexport interface CanvasChartInstance {\n setOptions(options: ChartOptions): void;\n setTheme(theme: ChartThemeInput | undefined): void;\n /** New CSS size (and pixel ratio) of the canvas */\n resize(width: number, height: number, pixelRatio?: number): void;\n /** Draws now (frames are otherwise scheduled automatically) */\n render(): void;\n /** Touch handlers: pass the `touches` / `changedTouches` of the event */\n touchStart(touches: readonly ChartTouch[]): void;\n touchMove(touches: readonly ChartTouch[]): void;\n touchEnd(changedTouches: readonly ChartTouch[]): void;\n touchCancel(changedTouches?: readonly ChartTouch[]): void;\n /** Mouse / pen handlers (H5, desktop mini-programs) */\n pointerDown(x: number, y: number, options?: ChartPointerOptions): void;\n pointerMove(x: number, y: number, options?: ChartPointerOptions): void;\n pointerUp(x: number, y: number, options?: ChartPointerOptions): void;\n pointerLeave(): void;\n /** Zooms around a pixel (factor < 1 zooms in) */\n zoomAt(x: number, y: number, factor: number): void;\n resetZoom(): void;\n getView(): ChartView;\n setView(view: Partial<ChartView>): void;\n toggleSeries(id: string): void;\n clearHover(): void;\n getPlotRect(): ChartRect | null;\n toPixel(x: number, y: number): { x: number; y: number } | null;\n fromPixel(x: number, y: number): { x: number; y: number } | null;\n /** The platform-free controller (scene, gestures) */\n getController(): ChartController;\n on<K extends keyof ChartControllerEventMap>(\n type: K,\n listener: (event: ChartControllerEventMap[K]) => void,\n ): () => void;\n destroy(): void;\n}\n\nconst mid = (r: [number, number]) => (r[0] + r[1]) / 2;\n\nconst roundedRect = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n) => {\n ctx.beginPath();\n ctx.moveTo(x + r, y);\n ctx.lineTo(x + w - r, y);\n ctx.arcTo(x + w, y, x + w, y + r, r);\n ctx.lineTo(x + w, y + h - r);\n ctx.arcTo(x + w, y + h, x + w - r, y + h, r);\n ctx.lineTo(x + r, y + h);\n ctx.arcTo(x, y + h, x, y + h - r, r);\n ctx.lineTo(x, y + r);\n ctx.arcTo(x, y, x + r, y, r);\n ctx.closePath();\n};\n\n/**\n * Draws the shapes of `scenePrimitives` (CSS pixels of the chart) clipped to\n * the plot: the data of horizontal charts\n */\nexport const drawPrimitives = (\n ctx: CanvasRenderingContext2D,\n primitives: readonly ChartPrimitive[],\n plot: { x: number; y: number; width: number; height: number },\n) => {\n ctx.save();\n ctx.beginPath();\n ctx.rect(plot.x, plot.y, plot.width, plot.height);\n ctx.clip();\n ctx.lineJoin = \"round\";\n ctx.lineCap = \"round\";\n for (const p of primitives) {\n if (p.kind === \"area\") {\n ctx.globalAlpha = p.opacity;\n ctx.fillStyle = p.color;\n p.segments.forEach((run, k) => {\n const bottoms = p.bottoms?.[k];\n const n = run.length / 2;\n if (n < 2) return;\n ctx.beginPath();\n for (let i = 0; i < n; i++) {\n if (i === 0) ctx.moveTo(run[0], run[1]);\n else ctx.lineTo(run[i * 2], run[i * 2 + 1]);\n }\n // back along the bottom edge (or the baseline)\n for (let i = n - 1; i >= 0; i--) {\n const b = bottoms ? bottoms[i] : p.baseline;\n if (p.horizontal) ctx.lineTo(b, run[i * 2 + 1]);\n else ctx.lineTo(run[i * 2], b);\n }\n ctx.closePath();\n ctx.fill();\n });\n ctx.globalAlpha = 1;\n } else if (p.kind === \"line\") {\n ctx.strokeStyle = p.color;\n ctx.lineWidth = p.width;\n ctx.beginPath();\n for (const run of p.segments) {\n for (let i = 0; i < run.length; i += 2) {\n if (i === 0) ctx.moveTo(run[0], run[1]);\n else ctx.lineTo(run[i], run[i + 1]);\n }\n }\n ctx.stroke();\n } else if (p.kind === \"bars\") {\n ctx.globalAlpha = p.opacity ?? 1;\n const r = p.radius ?? 0;\n for (let k = 0; k < p.rects.length; k += 4) {\n const [x, y, w, h] = [\n p.rects[k],\n p.rects[k + 1],\n p.rects[k + 2],\n p.rects[k + 3],\n ];\n ctx.fillStyle = p.colors?.[k / 4] ?? p.color;\n const radius = Math.min(r, w / 2, h / 2);\n if (radius > 0.5) {\n roundedRect(ctx, x, y, w, h, radius);\n ctx.fill();\n } else {\n ctx.fillRect(x, y, w, h);\n }\n }\n ctx.globalAlpha = 1;\n } else {\n const stroke = p.stroke ?? 0;\n for (let k = 0; k < p.dots.length; k += 3) {\n const color = p.colors[k / 3] ?? \"#888\";\n const r = p.dots[k + 2] / 2;\n ctx.beginPath();\n ctx.arc(\n p.dots[k],\n p.dots[k + 1],\n Math.max(0, r - stroke / 2),\n 0,\n Math.PI * 2,\n );\n if (p.opacity > 0) {\n ctx.globalAlpha = p.opacity;\n ctx.fillStyle = color;\n ctx.fill();\n }\n if (stroke > 0) {\n // rings stay opaque (hollow box plot outliers)\n ctx.globalAlpha = 1;\n ctx.lineWidth = stroke;\n ctx.strokeStyle = color;\n ctx.stroke();\n }\n }\n ctx.globalAlpha = 1;\n }\n }\n ctx.restore();\n};\n\n/** The visual map of a heatmap: gradient bar, value labels, hover caret */\nconst drawColorLegend = (\n ctx: CanvasRenderingContext2D,\n ramp: NonNullable<NonNullable<ChartScene[\"legend\"]>[\"colors\"]>,\n scene: ChartScene,\n) => {\n const { theme } = scene;\n const { bar, stops } = ramp;\n const n = stops.length;\n if (typeof ctx.createLinearGradient === \"function\") {\n const gradient = ctx.createLinearGradient(bar.x, 0, bar.x + bar.width, 0);\n stops.forEach((c, k) => gradient.addColorStop(k / Math.max(1, n - 1), c));\n ctx.fillStyle = gradient;\n roundedRect(ctx, bar.x, bar.y, bar.width, bar.height, bar.height / 2);\n ctx.fill();\n } else {\n // contexts without gradients: even steps\n const w = bar.width / n;\n stops.forEach((c, k) => {\n ctx.fillStyle = c;\n ctx.fillRect(bar.x + k * w, bar.y, w + 0.5, bar.height);\n });\n }\n ctx.fillStyle = toCss(theme.text, 0.35);\n for (const t of ramp.ticks)\n ctx.fillRect(Math.round(t), bar.y - 2, 1, bar.height + 4);\n ctx.font = font(theme, 11);\n ctx.textBaseline = \"middle\";\n ctx.fillStyle = toCss(theme.textMuted);\n for (const l of ramp.labels) {\n ctx.textAlign = l.align;\n ctx.fillText(l.text, l.x, l.y);\n }\n if (ramp.caret !== null) {\n roundedRect(ctx, ramp.caret - 2, bar.y - 3, 4, bar.height + 6, 2);\n ctx.fillStyle = toCss(theme.text);\n ctx.fill();\n ctx.lineWidth = 1.5;\n ctx.strokeStyle = toCss(theme.background);\n ctx.stroke();\n }\n};\n\n/** Draws a scene (legend, axes, data, labels, hover) on a 2D context */\nexport const drawScene = (\n ctx: CanvasRenderingContext2D,\n scene: ChartScene,\n items: readonly RenderItem[],\n origin: Origin,\n pixelRatio: number,\n painter = createCanvas2dPainter(ctx),\n) => {\n const { width, height, theme, model, view, layout } = scene;\n const { plot, scales } = layout;\n const dpr = pixelRatio;\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, Math.ceil(width * dpr), Math.ceil(height * dpr));\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n drawBackground(ctx, {\n width,\n height,\n scales,\n x: model.x,\n y: model.y,\n xTicks: layout.xTicks,\n yTicks: layout.yTicks,\n y2: model.y2,\n y2Ticks: layout.y2Ticks,\n theme,\n annotations: scene.annotations,\n });\n\n // color legend of heatmaps\n const ramp = scene.legend?.colors;\n if (ramp) drawColorLegend(ctx, ramp, scene);\n // legend\n if (scene.legend) {\n ctx.font = font(theme, 12);\n ctx.textBaseline = \"middle\";\n ctx.textAlign = \"left\";\n for (const e of scene.legend.entries) {\n const cy = e.box.y + e.box.height / 2;\n ctx.globalAlpha = e.hidden ? 0.45 : 1;\n ctx.fillStyle = e.color;\n if (e.shape === \"dot\") {\n ctx.beginPath();\n ctx.arc(e.box.x + 5, cy, 4, 0, Math.PI * 2);\n ctx.fill();\n } else if (e.shape === \"line\") {\n ctx.fillRect(e.box.x, cy - 1, 10, 2);\n } else {\n ctx.fillRect(e.box.x + 1, cy - 4, 8, 8);\n }\n ctx.fillStyle = toCss(theme.textMuted);\n ctx.fillText(e.name, e.box.x + 14, cy);\n if (e.hidden) {\n const w = e.box.width - 22;\n ctx.fillRect(e.box.x + 14, cy, w, 1);\n }\n }\n ctx.globalAlpha = 1;\n }\n\n // hover band of bars, below the data\n for (const mark of scene.hover?.marks ?? []) {\n if (mark.kind !== \"band\") continue;\n roundedRect(ctx, mark.x, mark.y, mark.width, mark.height, 6);\n ctx.fillStyle = toCss(theme.text, 0.06);\n ctx.fill();\n }\n\n // data (horizontal charts: as shapes, the painter draws vertical charts)\n if (scales.horizontal) {\n drawPrimitives(ctx, scenePrimitives(scene), plot);\n } else {\n paintData();\n }\n function paintData() {\n const scale = (range: [number, number], o: number, reverse: boolean) => {\n const s = 2 / (range[1] - range[0]);\n const offset = (o - range[0]) * s - 1;\n return reverse ? [-s, -offset] : [s, offset];\n };\n const [xScale, xOffset] = scale(view.x, origin.x, model.x.reverse);\n const [yScale, yOffset] = scale(view.y, origin.y, model.y.reverse);\n painter.paint(\n items,\n {\n transform: { xScale, xOffset, yScale, yOffset },\n width: Math.max(1, Math.round(plot.width * dpr)),\n height: Math.max(1, Math.round(plot.height * dpr)),\n dpr,\n },\n Math.round(plot.x * dpr),\n Math.round(plot.y * dpr),\n );\n }\n\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n // soft row / column of a hovered heatmap cell, over the data\n for (const mark of scene.hover?.marks ?? []) {\n if (mark.kind !== \"guide\") continue;\n ctx.fillStyle = toCss(theme.text, 0.06);\n ctx.fillRect(mark.x, mark.y, mark.width, mark.height);\n }\n drawForeground(ctx, {\n width,\n height,\n scales,\n theme,\n annotations: scene.annotations,\n pointLabels: [],\n clear: false,\n connectors: scene.connectors,\n arrows: scene.arrows,\n });\n // dot labels placed by the scene\n if (scene.pointLabels.length) {\n ctx.save();\n ctx.font = font(theme);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n ctx.lineWidth = 3;\n ctx.lineJoin = \"round\";\n ctx.strokeStyle = toCss(theme.background, 0.9);\n ctx.fillStyle = toCss(theme.text, 0.85);\n for (const { label, box } of scene.pointLabels) {\n const y = box.y + box.height / 2;\n if (label.color) {\n // inside a solid bar: its contrasting color, no halo\n ctx.save();\n ctx.fillStyle = label.color;\n ctx.fillText(label.text, box.x, y);\n ctx.restore();\n continue;\n }\n ctx.strokeText(label.text, box.x, y);\n ctx.fillText(label.text, box.x, y);\n }\n ctx.restore();\n }\n\n // hover\n const hover = scene.hover;\n if (hover) {\n if (hover.crosshairX !== null) {\n ctx.save();\n ctx.strokeStyle = toCss(theme.textMuted, 0.55);\n ctx.lineWidth = 1;\n ctx.setLineDash([3, 3]);\n ctx.beginPath();\n const cx = Math.round(hover.crosshairX) + 0.5;\n ctx.moveTo(cx, plot.y);\n ctx.lineTo(cx, plot.y + plot.height);\n ctx.stroke();\n ctx.restore();\n }\n if (hover.crosshairY !== null) {\n ctx.save();\n ctx.strokeStyle = toCss(theme.textMuted, 0.55);\n ctx.lineWidth = 1;\n ctx.setLineDash([3, 3]);\n ctx.beginPath();\n const cy = Math.round(hover.crosshairY) + 0.5;\n ctx.moveTo(plot.x, cy);\n ctx.lineTo(plot.x + plot.width, cy);\n ctx.stroke();\n ctx.restore();\n }\n for (const mark of hover.marks) {\n if (mark.kind === \"band\" || mark.kind === \"guide\") continue;\n if (mark.kind === \"cell\") {\n // lifted: a little larger, with a soft shadow and an inner ring\n const grow = Math.min(3, mark.width * 0.06, mark.height * 0.06);\n const r = Math.max(2, mark.radius);\n ctx.save();\n ctx.shadowColor = \"rgba(15, 23, 42, 0.4)\";\n ctx.shadowBlur = 12;\n ctx.shadowOffsetY = 4;\n roundedRect(\n ctx,\n mark.x - grow,\n mark.y - grow,\n mark.width + grow * 2,\n mark.height + grow * 2,\n r,\n );\n ctx.fillStyle = mark.color;\n ctx.fill();\n ctx.restore();\n const inset = Math.min(2.75, mark.width / 5, mark.height / 5);\n if (mark.width > 8 && mark.height > 8) {\n roundedRect(\n ctx,\n mark.x + inset,\n mark.y + inset,\n mark.width - inset * 2,\n mark.height - inset * 2,\n Math.max(1, r - inset / 2),\n );\n ctx.lineWidth = 1.5;\n ctx.strokeStyle = mark.ring;\n ctx.stroke();\n }\n continue;\n }\n ctx.beginPath();\n ctx.arc(mark.x, mark.y, mark.size / 2 + 4, 0, Math.PI * 2);\n ctx.fillStyle = mark.halo;\n ctx.fill();\n ctx.beginPath();\n ctx.arc(mark.x, mark.y, mark.size / 2 - 1, 0, Math.PI * 2);\n ctx.fillStyle = mark.color;\n ctx.fill();\n ctx.lineWidth = 2;\n ctx.strokeStyle = toCss(theme.background);\n ctx.stroke();\n }\n }\n if (scene.dragging) {\n const d = scene.dragging;\n ctx.beginPath();\n ctx.arc(d.x, d.y, d.size / 2, 0, Math.PI * 2);\n ctx.fillStyle = d.color;\n ctx.globalAlpha = 0.85;\n ctx.fill();\n ctx.globalAlpha = 1;\n ctx.lineWidth = 2;\n ctx.strokeStyle = toCss(theme.background);\n ctx.stroke();\n }\n const tip = hover?.tooltip;\n if (tip) {\n const { box, lineHeight, padding } = tip;\n ctx.save();\n ctx.shadowColor = \"rgba(15, 23, 42, 0.18)\";\n ctx.shadowBlur = 16;\n ctx.shadowOffsetY = 6;\n roundedRect(ctx, box.x, box.y, box.width, box.height, 8);\n ctx.fillStyle = toCss(theme.background);\n ctx.fill();\n ctx.restore();\n roundedRect(\n ctx,\n box.x + 0.5,\n box.y + 0.5,\n box.width - 1,\n box.height - 1,\n 8,\n );\n ctx.strokeStyle = toCss(theme.axis, 0.6);\n ctx.lineWidth = 1;\n ctx.stroke();\n ctx.textBaseline = \"middle\";\n let y = box.y + padding + lineHeight / 2;\n const left = box.x + padding + 2;\n const right = box.x + box.width - padding - 2;\n if (tip.text) {\n ctx.font = font(theme, 12);\n ctx.fillStyle = toCss(theme.text);\n ctx.textAlign = \"left\";\n for (const line of tip.text) {\n ctx.fillText(line, left, y);\n y += lineHeight;\n }\n } else {\n const { content } = tip;\n let x = left;\n if (content.titleColor) {\n ctx.fillStyle = content.titleColor;\n ctx.beginPath();\n ctx.arc(x + 4, y, 4, 0, Math.PI * 2);\n ctx.fill();\n x += 14;\n }\n ctx.font = font(theme, 12, 600);\n ctx.fillStyle = toCss(theme.text);\n ctx.textAlign = \"left\";\n ctx.fillText(content.title, x, y);\n y += lineHeight;\n if (content.subtitle) {\n ctx.font = font(theme, 11);\n ctx.fillStyle = toCss(theme.textMuted);\n ctx.fillText(content.subtitle, x, y - 2);\n y += lineHeight;\n }\n for (const row of content.rows) {\n x = left;\n if (row.color) {\n ctx.fillStyle = row.color;\n ctx.beginPath();\n ctx.arc(x + 4, y, 4, 0, Math.PI * 2);\n ctx.fill();\n }\n // names in one column, values right-aligned in another\n x += tip.swatchWidth;\n ctx.font = font(theme, 12);\n ctx.textAlign = \"left\";\n ctx.fillStyle = toCss(theme.textMuted);\n ctx.fillText(row.name, x, y);\n ctx.font = font(theme, 12, 600);\n ctx.textAlign = \"right\";\n ctx.fillStyle = toCss(theme.text);\n ctx.fillText(row.value, right, y);\n y += lineHeight;\n }\n }\n }\n};\n\n/**\n * Creates a chart drawn on a 2D canvas: line, area, bar and scatter series,\n * annotations, legend and tooltip, tap / drag / pinch gestures. Works\n * without a DOM (mini-programs); see `createChart` for the GPU version of\n * the web.\n */\nexport const createCanvasChart = (\n config: CanvasChartConfig,\n): CanvasChartInstance => {\n const { canvas } = config;\n const ctx = canvas.getContext(\"2d\") as CanvasRenderingContext2D | null;\n let width = config.width;\n let height = config.height;\n let dpr = config.pixelRatio ?? 1;\n let destroyed = false;\n let frameId: number | null = null;\n let items: RenderItem[] = [];\n let itemsModel: unknown = null;\n let itemsKey0 = \"\";\n let itemsKey = \"\";\n let options = config.options;\n /** Ids of the themes seen (the controller replaces its theme on changes) */\n const themeIds = new WeakMap<object, number>();\n let themeCount = 0;\n const themeId = (theme: object) => {\n let id = themeIds.get(theme);\n if (id === undefined) themeIds.set(theme, (id = ++themeCount));\n return id;\n };\n let origin: Origin = { x: 0, y: 0 };\n let version = 0;\n let fontSet = \"\";\n\n const measureText = (text: string, f: string) => {\n if (!ctx) return text.length * 6.5;\n if (f !== fontSet) {\n ctx.font = f;\n fontSet = f;\n }\n return ctx.measureText(text).width;\n };\n\n const painter = ctx ? createCanvas2dPainter(ctx) : null;\n\n const g = globalThis as {\n requestAnimationFrame?: (cb: () => void) => number;\n cancelAnimationFrame?: (id: number) => void;\n };\n\n const render = () => {\n frameId = null;\n if (destroyed || !ctx || !painter) return;\n const scene = controller.getScene();\n if (!scene) return;\n const pw = Math.max(1, Math.round(width * dpr));\n const ph = Math.max(1, Math.round(height * dpr));\n if (canvas.width !== pw) canvas.width = pw;\n if (canvas.height !== ph) canvas.height = ph;\n fontSet = \"\";\n if (itemsModel !== scene.model) {\n itemsModel = scene.model;\n // a new model (any setOptions) keeps the items when nothing they\n // depend on changed\n itemsKey0 = itemsSignature(\n scene.model,\n themeId(scene.theme),\n (index) => options.series[index]?.stack,\n );\n }\n // heatmap cells: their gaps and corners follow their size on screen\n const sc = scene.layout.scales;\n const density = { x: 1 / Math.abs(sc.xPerPx), y: 1 / Math.abs(sc.yPerPx) };\n const key = `${itemsKey0}|${cellStyleKey(scene.model, density)}`;\n if (key !== itemsKey) {\n itemsKey = key;\n origin = { x: mid(scene.model.base.x), y: mid(scene.model.base.y) };\n items = buildItems(scene.model, origin, ++version, density);\n }\n drawScene(ctx, scene, items, origin, dpr, painter);\n fontSet = \"\";\n };\n\n const schedule = () => {\n if (destroyed || frameId !== null) return;\n if (canvas.requestAnimationFrame)\n frameId = canvas.requestAnimationFrame(render);\n else if (g.requestAnimationFrame) frameId = g.requestAnimationFrame(render);\n else frameId = setTimeout(render, 16) as unknown as number;\n };\n\n const controller = createChartController({\n options: config.options,\n theme: config.theme,\n measureText,\n onInvalidate: schedule,\n });\n controller.setSize(width, height);\n\n const touchOptions = (t: ChartTouch, i: number): ChartPointerOptions => ({\n id: t.identifier ?? i,\n touch: true,\n });\n\n return {\n setOptions: (o) => {\n options = o;\n controller.setOptions(o);\n },\n setTheme: (t) => controller.setTheme(t),\n resize(w, h, ratio) {\n width = w;\n height = h;\n if (ratio) dpr = ratio;\n controller.setSize(w, h);\n schedule();\n },\n render() {\n if (frameId !== null) {\n if (canvas.cancelAnimationFrame) canvas.cancelAnimationFrame(frameId);\n else if (g.cancelAnimationFrame) g.cancelAnimationFrame(frameId);\n else clearTimeout(frameId);\n }\n render();\n },\n touchStart(touches) {\n touches.forEach((t, i) =>\n controller.pointerDown(t.x, t.y, touchOptions(t, i)),\n );\n },\n touchMove(touches) {\n touches.forEach((t, i) =>\n controller.pointerMove(t.x, t.y, touchOptions(t, i)),\n );\n },\n touchEnd(touches) {\n touches.forEach((t, i) =>\n controller.pointerUp(t.x, t.y, touchOptions(t, i)),\n );\n },\n touchCancel(touches = [{ x: 0, y: 0 }]) {\n touches.forEach((t, i) => controller.pointerCancel(touchOptions(t, i)));\n },\n pointerDown: (x, y, o) => controller.pointerDown(x, y, o),\n pointerMove: (x, y, o) => controller.pointerMove(x, y, o),\n pointerUp: (x, y, o) => controller.pointerUp(x, y, o),\n pointerLeave: () => controller.pointerLeave(),\n zoomAt: (x, y, f) => controller.zoomAt(x, y, f),\n resetZoom: () => controller.resetZoom(),\n getView: () => controller.getView(),\n setView: (v) => controller.setView(v),\n toggleSeries: (id) => controller.toggleSeries(id),\n clearHover: () => controller.clearHover(),\n getPlotRect: () => controller.getPlotRect(),\n toPixel: (x, y) => controller.toPixel(x, y),\n fromPixel: (x, y) => controller.fromPixel(x, y),\n getController: () => controller,\n on: (type, listener) => controller.on(type, listener),\n destroy() {\n if (destroyed) return;\n destroyed = true;\n if (frameId !== null) {\n if (canvas.cancelAnimationFrame) canvas.cancelAnimationFrame(frameId);\n else if (g.cancelAnimationFrame) g.cancelAnimationFrame(frameId);\n else clearTimeout(frameId);\n }\n painter?.destroy();\n controller.destroy();\n },\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"canvas.js","names":["mid","r","roundedRect","ctx","x","y","w","h","drawPrimitives","plot","p","primitives","bottoms","k","n","run","i","b","radius","stroke","color","drawColorLegend","scene","ramp","stops","gradient","bar","c","toCss","theme","font","l","CELL_LIFT","grownRect","d","drawLifted","background","ring","halo","accent","backdrop","fill","drawLiftedMarks","mark","marks","liftedBarRect","drawScene","createCanvas2dPainter","layout","dpr","pixelRatio","width","height","drawBackground","model","cy","lifted","m","scales","scenePrimitives","paintData","scale","s","range","offset","o","reverse","xScale","xOffset","view","origin","yScale","yOffset","items","drawForeground","box","label","hover","cx","tip","CANVAS_TOOLTIP_ALPHA","padding","lineHeight","left","right","line","content","row","createCanvasChart","config","canvas","destroyed","frameId","itemsModel","itemsKey0","itemsKey","options","themeIds","themeCount","themeId","id","version","fontSet","measureText","f","text","painter","g","render","controller","pw","ph","itemsSignature","index","sc","density","key","cellStyleKey","buildItems","schedule","createChartController","touchOptions","t","ratio","v","type","listener"],"sources":["../../../../charts/src/engine/canvas.ts"],"sourcesContent":["// createCanvasChart: a whole chart drawn on one 2D canvas without any DOM:\n// WeChat / Alipay / ByteDance mini-programs (`<canvas type=\"2d\">`), Taro,\n// uni-app, OffscreenCanvas, or a plain browser canvas. The host forwards\n// touches / pointer events; everything else is handled here.\n\nimport { toCss } from \"./color\";\nimport {\n createChartController,\n scenePrimitives,\n type ChartController,\n type ChartControllerEventMap,\n type ChartPointerOptions,\n type ChartPrimitive,\n type ChartScene,\n} from \"./controller\";\nimport { buildItems, cellStyleKey, type Origin } from \"./items\";\nimport { drawBackground, drawForeground, font } from \"./overlay\";\nimport { createCanvas2dPainter } from \"./renderers/canvas2d\";\nimport type { RenderItem } from \"./renderers/types\";\nimport { liftedBarRect, type HoverMark } from \"./scene\";\nimport { itemsSignature } from \"./signature\";\nimport type { ChartThemeInput } from \"./theme\";\nimport { CANVAS_TOOLTIP_ALPHA } from \"./tooltip\";\nimport type { ChartOptions, ChartRect, ChartView } from \"./types\";\n\n/**\n * The canvas a chart draws on: a browser `HTMLCanvasElement`, an\n * `OffscreenCanvas` or the node of a mini-program `<canvas type=\"2d\">`\n * (`SelectorQuery.fields({ node: true })`)\n */\nexport interface ChartCanvas {\n width: number;\n height: number;\n getContext(type: \"2d\"): unknown;\n /** Mini-program canvases schedule their frames themselves */\n requestAnimationFrame?: (callback: () => void) => number;\n cancelAnimationFrame?: (id: number) => void;\n}\n\n/** A touch point relative to the canvas (`x` / `y`) with its identifier */\nexport interface ChartTouch {\n x: number;\n y: number;\n identifier?: number;\n}\n\nexport interface CanvasChartConfig {\n canvas: ChartCanvas;\n /** Size of the canvas in CSS pixels (rpx converted by the host) */\n width: number;\n height: number;\n /**\n * Device pixel ratio (`wx.getWindowInfo().pixelRatio` in mini-programs)\n * @default 1\n */\n pixelRatio?: number;\n options: ChartOptions;\n /** Colors and fonts: values of the Minerva CSS variables */\n theme?: ChartThemeInput;\n}\n\nexport interface CanvasChartInstance {\n setOptions(options: ChartOptions): void;\n setTheme(theme: ChartThemeInput | undefined): void;\n /** New CSS size (and pixel ratio) of the canvas */\n resize(width: number, height: number, pixelRatio?: number): void;\n /** Draws now (frames are otherwise scheduled automatically) */\n render(): void;\n /** Touch handlers: pass the `touches` / `changedTouches` of the event */\n touchStart(touches: readonly ChartTouch[]): void;\n touchMove(touches: readonly ChartTouch[]): void;\n touchEnd(changedTouches: readonly ChartTouch[]): void;\n touchCancel(changedTouches?: readonly ChartTouch[]): void;\n /** Mouse / pen handlers (H5, desktop mini-programs) */\n pointerDown(x: number, y: number, options?: ChartPointerOptions): void;\n pointerMove(x: number, y: number, options?: ChartPointerOptions): void;\n pointerUp(x: number, y: number, options?: ChartPointerOptions): void;\n pointerLeave(): void;\n /** Zooms around a pixel (factor < 1 zooms in) */\n zoomAt(x: number, y: number, factor: number): void;\n resetZoom(): void;\n getView(): ChartView;\n setView(view: Partial<ChartView>): void;\n toggleSeries(id: string): void;\n clearHover(): void;\n getPlotRect(): ChartRect | null;\n toPixel(x: number, y: number): { x: number; y: number } | null;\n fromPixel(x: number, y: number): { x: number; y: number } | null;\n /** The platform-free controller (scene, gestures) */\n getController(): ChartController;\n on<K extends keyof ChartControllerEventMap>(\n type: K,\n listener: (event: ChartControllerEventMap[K]) => void,\n ): () => void;\n destroy(): void;\n}\n\nconst mid = (r: [number, number]) => (r[0] + r[1]) / 2;\n\nconst roundedRect = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n) => {\n ctx.beginPath();\n ctx.moveTo(x + r, y);\n ctx.lineTo(x + w - r, y);\n ctx.arcTo(x + w, y, x + w, y + r, r);\n ctx.lineTo(x + w, y + h - r);\n ctx.arcTo(x + w, y + h, x + w - r, y + h, r);\n ctx.lineTo(x + r, y + h);\n ctx.arcTo(x, y + h, x, y + h - r, r);\n ctx.lineTo(x, y + r);\n ctx.arcTo(x, y, x + r, y, r);\n ctx.closePath();\n};\n\n/**\n * Draws the shapes of `scenePrimitives` (CSS pixels of the chart) clipped to\n * the plot: the data of horizontal charts\n */\nexport const drawPrimitives = (\n ctx: CanvasRenderingContext2D,\n primitives: readonly ChartPrimitive[],\n plot: { x: number; y: number; width: number; height: number },\n) => {\n ctx.save();\n ctx.beginPath();\n ctx.rect(plot.x, plot.y, plot.width, plot.height);\n ctx.clip();\n ctx.lineJoin = \"round\";\n ctx.lineCap = \"round\";\n for (const p of primitives) {\n if (p.kind === \"area\") {\n ctx.globalAlpha = p.opacity;\n ctx.fillStyle = p.color;\n p.segments.forEach((run, k) => {\n const bottoms = p.bottoms?.[k];\n const n = run.length / 2;\n if (n < 2) return;\n ctx.beginPath();\n for (let i = 0; i < n; i++) {\n if (i === 0) ctx.moveTo(run[0], run[1]);\n else ctx.lineTo(run[i * 2], run[i * 2 + 1]);\n }\n // back along the bottom edge (or the baseline)\n for (let i = n - 1; i >= 0; i--) {\n const b = bottoms ? bottoms[i] : p.baseline;\n if (p.horizontal) ctx.lineTo(b, run[i * 2 + 1]);\n else ctx.lineTo(run[i * 2], b);\n }\n ctx.closePath();\n ctx.fill();\n });\n ctx.globalAlpha = 1;\n } else if (p.kind === \"line\") {\n ctx.strokeStyle = p.color;\n ctx.lineWidth = p.width;\n ctx.beginPath();\n for (const run of p.segments) {\n for (let i = 0; i < run.length; i += 2) {\n if (i === 0) ctx.moveTo(run[0], run[1]);\n else ctx.lineTo(run[i], run[i + 1]);\n }\n }\n ctx.stroke();\n } else if (p.kind === \"bars\") {\n ctx.globalAlpha = p.opacity ?? 1;\n const r = p.radius ?? 0;\n for (let k = 0; k < p.rects.length; k += 4) {\n const [x, y, w, h] = [\n p.rects[k],\n p.rects[k + 1],\n p.rects[k + 2],\n p.rects[k + 3],\n ];\n ctx.fillStyle = p.colors?.[k / 4] ?? p.color;\n const radius = Math.min(r, w / 2, h / 2);\n if (radius > 0.5) {\n roundedRect(ctx, x, y, w, h, radius);\n ctx.fill();\n } else {\n ctx.fillRect(x, y, w, h);\n }\n }\n ctx.globalAlpha = 1;\n } else {\n const stroke = p.stroke ?? 0;\n for (let k = 0; k < p.dots.length; k += 3) {\n const color = p.colors[k / 3] ?? \"#888\";\n const r = p.dots[k + 2] / 2;\n ctx.beginPath();\n ctx.arc(\n p.dots[k],\n p.dots[k + 1],\n Math.max(0, r - stroke / 2),\n 0,\n Math.PI * 2,\n );\n if (p.opacity > 0) {\n ctx.globalAlpha = p.opacity;\n ctx.fillStyle = color;\n ctx.fill();\n }\n if (stroke > 0) {\n // rings stay opaque (hollow box plot outliers)\n ctx.globalAlpha = 1;\n ctx.lineWidth = stroke;\n ctx.strokeStyle = color;\n ctx.stroke();\n }\n }\n ctx.globalAlpha = 1;\n }\n }\n ctx.restore();\n};\n\n/** The visual map of a heatmap: gradient bar, value labels, hover caret */\nconst drawColorLegend = (\n ctx: CanvasRenderingContext2D,\n ramp: NonNullable<NonNullable<ChartScene[\"legend\"]>[\"colors\"]>,\n scene: ChartScene,\n) => {\n const { theme } = scene;\n const { bar, stops } = ramp;\n const n = stops.length;\n if (typeof ctx.createLinearGradient === \"function\") {\n const gradient = ctx.createLinearGradient(bar.x, 0, bar.x + bar.width, 0);\n stops.forEach((c, k) => gradient.addColorStop(k / Math.max(1, n - 1), c));\n ctx.fillStyle = gradient;\n roundedRect(ctx, bar.x, bar.y, bar.width, bar.height, bar.height / 2);\n ctx.fill();\n } else {\n // contexts without gradients: even steps\n const w = bar.width / n;\n stops.forEach((c, k) => {\n ctx.fillStyle = c;\n ctx.fillRect(bar.x + k * w, bar.y, w + 0.5, bar.height);\n });\n }\n ctx.fillStyle = toCss(theme.text, 0.35);\n for (const t of ramp.ticks)\n ctx.fillRect(Math.round(t), bar.y - 2, 1, bar.height + 4);\n ctx.font = font(theme, 11);\n ctx.textBaseline = \"middle\";\n ctx.fillStyle = toCss(theme.textMuted);\n for (const l of ramp.labels) {\n ctx.textAlign = l.align;\n ctx.fillText(l.text, l.x, l.y);\n }\n if (ramp.caret !== null) {\n roundedRect(ctx, ramp.caret - 2, bar.y - 3, 4, bar.height + 6, 2);\n ctx.fillStyle = toCss(theme.text);\n ctx.fill();\n ctx.lineWidth = 1.5;\n ctx.strokeStyle = toCss(theme.background);\n ctx.stroke();\n }\n};\n\n/** Scale of a hovered heatmap cell (like the DOM host) */\nconst CELL_LIFT = 1.16;\n\n/** A rounded rectangle grown by `d` on every side (shrunk when negative) */\nconst grownRect = (\n ctx: CanvasRenderingContext2D,\n r: { x: number; y: number; width: number; height: number },\n radius: number,\n d: number,\n) => {\n const w = Math.max(0, r.width + d * 2);\n const h = Math.max(0, r.height + d * 2);\n roundedRect(\n ctx,\n r.x - d,\n r.y - d,\n w,\n h,\n Math.max(0, Math.min(radius + d, w / 2, h / 2)),\n );\n};\n\n/**\n * A lifted shape: the lift shadow under a halo of the background, an\n * optional accent line around the halo, the fill, a ring inside the edge\n */\nconst drawLifted = (\n ctx: CanvasRenderingContext2D,\n r: { x: number; y: number; width: number; height: number },\n radius: number,\n fill: string,\n backdrop: boolean,\n ring: { color: string; width: number } | null,\n halo: number,\n accent: { color: string; width: number } | null,\n theme: ChartScene[\"theme\"],\n) => {\n const background = toCss(theme.background);\n if (ring) {\n ctx.save();\n ctx.shadowColor = \"rgba(15, 23, 42, 0.4)\";\n ctx.shadowBlur = 14;\n ctx.shadowOffsetY = 5;\n grownRect(ctx, r, radius, halo + (accent?.width ?? 0));\n ctx.fillStyle = accent ? accent.color : background;\n ctx.fill();\n ctx.restore();\n if (accent) {\n grownRect(ctx, r, radius, halo);\n ctx.fillStyle = background;\n ctx.fill();\n }\n } else if (backdrop) {\n grownRect(ctx, r, radius, 0);\n ctx.fillStyle = background;\n ctx.fill();\n }\n grownRect(ctx, r, radius, 0);\n ctx.fillStyle = fill;\n ctx.fill();\n if (ring && ring.width > 0) {\n grownRect(ctx, r, radius, -ring.width / 2);\n ctx.lineWidth = ring.width;\n ctx.strokeStyle = ring.color;\n ctx.stroke();\n }\n};\n\n/** Hovered bars (thicker, clipped to the plot) and heatmap cells, lifted */\nconst drawLiftedMarks = (\n ctx: CanvasRenderingContext2D,\n marks: readonly HoverMark[],\n plot: { x: number; y: number; width: number; height: number },\n theme: ChartScene[\"theme\"],\n) => {\n for (const mark of marks) {\n if (mark.kind === \"bar\") {\n const r = liftedBarRect(mark);\n ctx.save();\n ctx.beginPath();\n ctx.rect(plot.x, plot.y, plot.width, plot.height);\n ctx.clip();\n const ring =\n mark.ring === null\n ? null\n : {\n color: mark.ring,\n width: Math.min(\n mark.backdrop ? 2 : 1.5,\n Math.max(0, (Math.min(r.width, r.height) - 2) / 4),\n ),\n };\n drawLifted(\n ctx,\n r,\n mark.radius,\n mark.color,\n mark.backdrop,\n ring,\n 1.5,\n null,\n theme,\n );\n ctx.restore();\n } else if (mark.kind === \"cell\") {\n const w = mark.width * CELL_LIFT;\n const h = mark.height * CELL_LIFT;\n const r = {\n x: mark.x + (mark.width - w) / 2,\n y: mark.y + (mark.height - h) / 2,\n width: w,\n height: h,\n };\n drawLifted(\n ctx,\n r,\n Math.max(2, mark.radius) * CELL_LIFT,\n mark.color,\n false,\n { color: mark.ring, width: Math.min(2, Math.min(w, h) / 5) },\n 2,\n { color: toCss(theme.primary, 0.6), width: 1.5 },\n theme,\n );\n }\n }\n};\n\n/** Draws a scene (legend, axes, data, labels, hover) on a 2D context */\nexport const drawScene = (\n ctx: CanvasRenderingContext2D,\n scene: ChartScene,\n items: readonly RenderItem[],\n origin: Origin,\n pixelRatio: number,\n painter = createCanvas2dPainter(ctx),\n) => {\n const { width, height, theme, model, view, layout } = scene;\n const { plot, scales } = layout;\n const dpr = pixelRatio;\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, Math.ceil(width * dpr), Math.ceil(height * dpr));\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n drawBackground(ctx, {\n width,\n height,\n scales,\n x: model.x,\n y: model.y,\n xTicks: layout.xTicks,\n yTicks: layout.yTicks,\n y2: model.y2,\n y2Ticks: layout.y2Ticks,\n theme,\n annotations: scene.annotations,\n });\n\n // color legend of heatmaps\n const ramp = scene.legend?.colors;\n if (ramp) drawColorLegend(ctx, ramp, scene);\n // legend\n if (scene.legend) {\n ctx.font = font(theme, 12);\n ctx.textBaseline = \"middle\";\n ctx.textAlign = \"left\";\n for (const e of scene.legend.entries) {\n const cy = e.box.y + e.box.height / 2;\n ctx.globalAlpha = e.hidden ? 0.45 : 1;\n ctx.fillStyle = e.color;\n if (e.shape === \"dot\") {\n ctx.beginPath();\n ctx.arc(e.box.x + 5, cy, 4, 0, Math.PI * 2);\n ctx.fill();\n } else if (e.shape === \"line\") {\n ctx.fillRect(e.box.x, cy - 1, 10, 2);\n } else {\n ctx.fillRect(e.box.x + 1, cy - 4, 8, 8);\n }\n ctx.fillStyle = toCss(theme.textMuted);\n ctx.fillText(e.name, e.box.x + 14, cy);\n if (e.hidden) {\n const w = e.box.width - 22;\n ctx.fillRect(e.box.x + 14, cy, w, 1);\n }\n }\n ctx.globalAlpha = 1;\n }\n\n // hover band of bars, below the data (lighter behind lifted bars)\n const lifted = scene.hover?.marks.some((m) => m.kind === \"bar\") ?? false;\n for (const mark of scene.hover?.marks ?? []) {\n if (mark.kind !== \"band\") continue;\n roundedRect(ctx, mark.x, mark.y, mark.width, mark.height, 6);\n ctx.fillStyle = toCss(theme.text, lifted ? 0.04 : 0.06);\n ctx.fill();\n }\n\n // data (horizontal charts: as shapes, the painter draws vertical charts)\n if (scales.horizontal) {\n drawPrimitives(ctx, scenePrimitives(scene), plot);\n } else {\n paintData();\n }\n function paintData() {\n const scale = (range: [number, number], o: number, reverse: boolean) => {\n const s = 2 / (range[1] - range[0]);\n const offset = (o - range[0]) * s - 1;\n return reverse ? [-s, -offset] : [s, offset];\n };\n const [xScale, xOffset] = scale(view.x, origin.x, model.x.reverse);\n const [yScale, yOffset] = scale(view.y, origin.y, model.y.reverse);\n painter.paint(\n items,\n {\n transform: { xScale, xOffset, yScale, yOffset },\n width: Math.max(1, Math.round(plot.width * dpr)),\n height: Math.max(1, Math.round(plot.height * dpr)),\n dpr,\n },\n Math.round(plot.x * dpr),\n Math.round(plot.y * dpr),\n );\n }\n\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n // soft row / column of a hovered heatmap cell, over the data\n for (const mark of scene.hover?.marks ?? []) {\n if (mark.kind !== \"guide\") continue;\n ctx.fillStyle = toCss(theme.text, 0.06);\n ctx.fillRect(mark.x, mark.y, mark.width, mark.height);\n }\n // lifted bars and cells, below the value labels; the plot behind lifted\n // bars is veiled so the hovered one stands out\n if (lifted) {\n ctx.fillStyle = toCss(theme.background, 0.42);\n ctx.fillRect(plot.x, plot.y, plot.width, plot.height);\n }\n if (scene.hover) drawLiftedMarks(ctx, scene.hover.marks, plot, theme);\n drawForeground(ctx, {\n width,\n height,\n scales,\n theme,\n annotations: scene.annotations,\n pointLabels: [],\n clear: false,\n connectors: scene.connectors,\n arrows: scene.arrows,\n });\n // dot labels placed by the scene\n if (scene.pointLabels.length) {\n ctx.save();\n ctx.font = font(theme);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n ctx.lineWidth = 3;\n ctx.lineJoin = \"round\";\n ctx.strokeStyle = toCss(theme.background, 0.9);\n ctx.fillStyle = toCss(theme.text, 0.85);\n for (const { label, box } of scene.pointLabels) {\n const y = box.y + box.height / 2;\n if (label.color) {\n // inside a solid bar: its contrasting color, no halo\n ctx.save();\n ctx.fillStyle = label.color;\n ctx.fillText(label.text, box.x, y);\n ctx.restore();\n continue;\n }\n ctx.strokeText(label.text, box.x, y);\n ctx.fillText(label.text, box.x, y);\n }\n ctx.restore();\n }\n\n // hover\n const hover = scene.hover;\n if (hover) {\n if (hover.crosshairX !== null) {\n ctx.save();\n ctx.strokeStyle = toCss(theme.textMuted, 0.55);\n ctx.lineWidth = 1;\n ctx.setLineDash([3, 3]);\n ctx.beginPath();\n const cx = Math.round(hover.crosshairX) + 0.5;\n ctx.moveTo(cx, plot.y);\n ctx.lineTo(cx, plot.y + plot.height);\n ctx.stroke();\n ctx.restore();\n }\n if (hover.crosshairY !== null) {\n ctx.save();\n ctx.strokeStyle = toCss(theme.textMuted, 0.55);\n ctx.lineWidth = 1;\n ctx.setLineDash([3, 3]);\n ctx.beginPath();\n const cy = Math.round(hover.crosshairY) + 0.5;\n ctx.moveTo(plot.x, cy);\n ctx.lineTo(plot.x + plot.width, cy);\n ctx.stroke();\n ctx.restore();\n }\n for (const mark of hover.marks) {\n if (\n mark.kind === \"band\" ||\n mark.kind === \"guide\" ||\n mark.kind === \"bar\" ||\n mark.kind === \"cell\"\n )\n continue;\n ctx.beginPath();\n ctx.arc(mark.x, mark.y, mark.size / 2 + 4, 0, Math.PI * 2);\n ctx.fillStyle = mark.halo;\n ctx.fill();\n ctx.beginPath();\n ctx.arc(mark.x, mark.y, mark.size / 2 - 1, 0, Math.PI * 2);\n ctx.fillStyle = mark.color;\n ctx.fill();\n ctx.lineWidth = 2;\n ctx.strokeStyle = toCss(theme.background);\n ctx.stroke();\n }\n }\n if (scene.dragging) {\n const d = scene.dragging;\n ctx.beginPath();\n ctx.arc(d.x, d.y, d.size / 2, 0, Math.PI * 2);\n ctx.fillStyle = d.color;\n ctx.globalAlpha = 0.85;\n ctx.fill();\n ctx.globalAlpha = 1;\n ctx.lineWidth = 2;\n ctx.strokeStyle = toCss(theme.background);\n ctx.stroke();\n }\n const tip = hover?.tooltip;\n if (tip) {\n const { box, lineHeight, padding } = tip;\n ctx.save();\n ctx.shadowColor = \"rgba(15, 23, 42, 0.18)\";\n ctx.shadowBlur = 16;\n ctx.shadowOffsetY = 6;\n roundedRect(ctx, box.x, box.y, box.width, box.height, 8);\n ctx.fillStyle = toCss(theme.background, CANVAS_TOOLTIP_ALPHA);\n ctx.fill();\n ctx.restore();\n roundedRect(\n ctx,\n box.x + 0.5,\n box.y + 0.5,\n box.width - 1,\n box.height - 1,\n 8,\n );\n ctx.strokeStyle = toCss(theme.axis, 0.6);\n ctx.lineWidth = 1;\n ctx.stroke();\n ctx.textBaseline = \"middle\";\n let y = box.y + padding + lineHeight / 2;\n const left = box.x + padding + 2;\n const right = box.x + box.width - padding - 2;\n if (tip.text) {\n ctx.font = font(theme, 12);\n ctx.fillStyle = toCss(theme.text);\n ctx.textAlign = \"left\";\n for (const line of tip.text) {\n ctx.fillText(line, left, y);\n y += lineHeight;\n }\n } else {\n const { content } = tip;\n let x = left;\n if (content.titleColor) {\n ctx.fillStyle = content.titleColor;\n ctx.beginPath();\n ctx.arc(x + 4, y, 4, 0, Math.PI * 2);\n ctx.fill();\n x += 14;\n }\n ctx.font = font(theme, 12, 600);\n ctx.fillStyle = toCss(theme.text);\n ctx.textAlign = \"left\";\n ctx.fillText(content.title, x, y);\n y += lineHeight;\n if (content.subtitle) {\n ctx.font = font(theme, 11);\n ctx.fillStyle = toCss(theme.textMuted);\n ctx.fillText(content.subtitle, x, y - 2);\n y += lineHeight;\n }\n for (const row of content.rows) {\n x = left;\n if (row.color) {\n ctx.fillStyle = row.color;\n ctx.beginPath();\n ctx.arc(x + 4, y, 4, 0, Math.PI * 2);\n ctx.fill();\n }\n // names in one column, values right-aligned in another\n x += tip.swatchWidth;\n ctx.font = font(theme, 12);\n ctx.textAlign = \"left\";\n ctx.fillStyle = toCss(theme.textMuted);\n ctx.fillText(row.name, x, y);\n ctx.font = font(theme, 12, 600);\n ctx.textAlign = \"right\";\n ctx.fillStyle = toCss(theme.text);\n ctx.fillText(row.value, right, y);\n y += lineHeight;\n }\n }\n }\n};\n\n/**\n * Creates a chart drawn on a 2D canvas: line, area, bar and scatter series,\n * annotations, legend and tooltip, tap / drag / pinch gestures. Works\n * without a DOM (mini-programs); see `createChart` for the GPU version of\n * the web.\n */\nexport const createCanvasChart = (\n config: CanvasChartConfig,\n): CanvasChartInstance => {\n const { canvas } = config;\n const ctx = canvas.getContext(\"2d\") as CanvasRenderingContext2D | null;\n let width = config.width;\n let height = config.height;\n let dpr = config.pixelRatio ?? 1;\n let destroyed = false;\n let frameId: number | null = null;\n let items: RenderItem[] = [];\n let itemsModel: unknown = null;\n let itemsKey0 = \"\";\n let itemsKey = \"\";\n let options = config.options;\n /** Ids of the themes seen (the controller replaces its theme on changes) */\n const themeIds = new WeakMap<object, number>();\n let themeCount = 0;\n const themeId = (theme: object) => {\n let id = themeIds.get(theme);\n if (id === undefined) themeIds.set(theme, (id = ++themeCount));\n return id;\n };\n let origin: Origin = { x: 0, y: 0 };\n let version = 0;\n let fontSet = \"\";\n\n const measureText = (text: string, f: string) => {\n if (!ctx) return text.length * 6.5;\n if (f !== fontSet) {\n ctx.font = f;\n fontSet = f;\n }\n return ctx.measureText(text).width;\n };\n\n const painter = ctx ? createCanvas2dPainter(ctx) : null;\n\n const g = globalThis as {\n requestAnimationFrame?: (cb: () => void) => number;\n cancelAnimationFrame?: (id: number) => void;\n };\n\n const render = () => {\n frameId = null;\n if (destroyed || !ctx || !painter) return;\n const scene = controller.getScene();\n if (!scene) return;\n const pw = Math.max(1, Math.round(width * dpr));\n const ph = Math.max(1, Math.round(height * dpr));\n if (canvas.width !== pw) canvas.width = pw;\n if (canvas.height !== ph) canvas.height = ph;\n fontSet = \"\";\n if (itemsModel !== scene.model) {\n itemsModel = scene.model;\n // a new model (any setOptions) keeps the items when nothing they\n // depend on changed\n itemsKey0 = itemsSignature(\n scene.model,\n themeId(scene.theme),\n (index) => options.series[index]?.stack,\n );\n }\n // heatmap cells: their gaps and corners follow their size on screen\n const sc = scene.layout.scales;\n const density = { x: 1 / Math.abs(sc.xPerPx), y: 1 / Math.abs(sc.yPerPx) };\n const key = `${itemsKey0}|${cellStyleKey(scene.model, density)}`;\n if (key !== itemsKey) {\n itemsKey = key;\n origin = { x: mid(scene.model.base.x), y: mid(scene.model.base.y) };\n items = buildItems(scene.model, origin, ++version, density);\n }\n drawScene(ctx, scene, items, origin, dpr, painter);\n fontSet = \"\";\n };\n\n const schedule = () => {\n if (destroyed || frameId !== null) return;\n if (canvas.requestAnimationFrame)\n frameId = canvas.requestAnimationFrame(render);\n else if (g.requestAnimationFrame) frameId = g.requestAnimationFrame(render);\n else frameId = setTimeout(render, 16) as unknown as number;\n };\n\n const controller = createChartController({\n options: config.options,\n theme: config.theme,\n measureText,\n onInvalidate: schedule,\n });\n controller.setSize(width, height);\n\n const touchOptions = (t: ChartTouch, i: number): ChartPointerOptions => ({\n id: t.identifier ?? i,\n touch: true,\n });\n\n return {\n setOptions: (o) => {\n options = o;\n controller.setOptions(o);\n },\n setTheme: (t) => controller.setTheme(t),\n resize(w, h, ratio) {\n width = w;\n height = h;\n if (ratio) dpr = ratio;\n controller.setSize(w, h);\n schedule();\n },\n render() {\n if (frameId !== null) {\n if (canvas.cancelAnimationFrame) canvas.cancelAnimationFrame(frameId);\n else if (g.cancelAnimationFrame) g.cancelAnimationFrame(frameId);\n else clearTimeout(frameId);\n }\n render();\n },\n touchStart(touches) {\n touches.forEach((t, i) =>\n controller.pointerDown(t.x, t.y, touchOptions(t, i)),\n );\n },\n touchMove(touches) {\n touches.forEach((t, i) =>\n controller.pointerMove(t.x, t.y, touchOptions(t, i)),\n );\n },\n touchEnd(touches) {\n touches.forEach((t, i) =>\n controller.pointerUp(t.x, t.y, touchOptions(t, i)),\n );\n },\n touchCancel(touches = [{ x: 0, y: 0 }]) {\n touches.forEach((t, i) => controller.pointerCancel(touchOptions(t, i)));\n },\n pointerDown: (x, y, o) => controller.pointerDown(x, y, o),\n pointerMove: (x, y, o) => controller.pointerMove(x, y, o),\n pointerUp: (x, y, o) => controller.pointerUp(x, y, o),\n pointerLeave: () => controller.pointerLeave(),\n zoomAt: (x, y, f) => controller.zoomAt(x, y, f),\n resetZoom: () => controller.resetZoom(),\n getView: () => controller.getView(),\n setView: (v) => controller.setView(v),\n toggleSeries: (id) => controller.toggleSeries(id),\n clearHover: () => controller.clearHover(),\n getPlotRect: () => controller.getPlotRect(),\n toPixel: (x, y) => controller.toPixel(x, y),\n fromPixel: (x, y) => controller.fromPixel(x, y),\n getController: () => controller,\n on: (type, listener) => controller.on(type, listener),\n destroy() {\n if (destroyed) return;\n destroyed = true;\n if (frameId !== null) {\n if (canvas.cancelAnimationFrame) canvas.cancelAnimationFrame(frameId);\n else if (g.cancelAnimationFrame) g.cancelAnimationFrame(frameId);\n else clearTimeout(frameId);\n }\n painter?.destroy();\n controller.destroy();\n },\n };\n};\n"],"mappings":";;;;;;;;;AAiGA,IAAMA,KAAO,OAAyBC,EAAE,KAAKA,EAAE,MAAM,GAE/CC,KACJ,GACA,GACA,GACA,GACA,GACA,MACG;CAWH,AAVAC,EAAI,UAAU,GACdA,EAAI,OAAOC,IAAIH,GAAGI,CAAC,GACnBF,EAAI,OAAOC,IAAIE,IAAIL,GAAGI,CAAC,GACvBF,EAAI,MAAMC,IAAIE,GAAGD,GAAGD,IAAIE,GAAGD,IAAIJ,GAAGA,CAAC,GACnCE,EAAI,OAAOC,IAAIE,GAAGD,IAAIE,IAAIN,CAAC,GAC3BE,EAAI,MAAMC,IAAIE,GAAGD,IAAIE,GAAGH,IAAIE,IAAIL,GAAGI,IAAIE,GAAGN,CAAC,GAC3CE,EAAI,OAAOC,IAAIH,GAAGI,IAAIE,CAAC,GACvBJ,EAAI,MAAMC,GAAGC,IAAIE,GAAGH,GAAGC,IAAIE,IAAIN,GAAGA,CAAC,GACnCE,EAAI,OAAOC,GAAGC,IAAIJ,CAAC,GACnBE,EAAI,MAAMC,GAAGC,GAAGD,IAAIH,GAAGI,GAAGJ,CAAC,GAC3BE,EAAI,UAAU;AAChB,GAMaK,KACX,GACA,GACA,MACG;CAMH,AALAL,EAAI,KAAK,GACTA,EAAI,UAAU,GACdA,EAAI,KAAKM,EAAK,GAAGA,EAAK,GAAGA,EAAK,OAAOA,EAAK,MAAM,GAChDN,EAAI,KAAK,GACT,EAAI,WAAW,SACf,EAAI,UAAU;CACd,KAAK,IAAMO,KAAKC,GACd,IAAID,EAAE,SAAS,QAqBb,AApBA,EAAI,cAAcA,EAAE,SACpB,EAAI,YAAYA,EAAE,OAClBA,EAAE,SAAS,SAAS,GAAK,MAAM;EAC7B,IAAME,IAAUF,EAAE,UAAUG,IACtBC,IAAIC,EAAI,SAAS;EACvB,IAAI,MAAI,IACR;KAAI,UAAU;GACd,KAAK,IAAIC,IAAI,GAAGA,IAAIF,GAAG,KACrB,AAAIE,MAAM,IAAGb,EAAI,OAAOY,EAAI,IAAIA,EAAI,EAAE,IACjCZ,EAAI,OAAOY,EAAIC,IAAI,IAAID,EAAIC,IAAI,IAAI,EAAE;GAG5C,KAAK,IAAIA,IAAIF,IAAI,GAAGE,KAAK,GAAG,KAAK;IAC/B,IAAMC,IAAIL,IAAUA,EAAQI,KAAKN,EAAE;IACnC,AAAIA,EAAE,aAAYP,EAAI,OAAOc,GAAGF,EAAIC,IAAI,IAAI,EAAE,IACzCb,EAAI,OAAOY,EAAIC,IAAI,IAAIC,CAAC;GAC/B;GAEA,AADAd,EAAI,UAAU,GACdA,EAAI,KAAK;EAZK;CAahB,CAAC,GACD,EAAI,cAAc;MACb,IAAIO,EAAE,SAAS,QAAQ;EAG5B,AAFA,EAAI,cAAcA,EAAE,OACpB,EAAI,YAAYA,EAAE,OAClBP,EAAI,UAAU;EACd,KAAK,IAAMY,KAAOL,EAAE,UAClB,KAAK,IAAIM,IAAI,GAAGA,IAAID,EAAI,QAAQ,KAAK,GACnC,AAAIC,MAAM,IAAGb,EAAI,OAAOY,EAAI,IAAIA,EAAI,EAAE,IACjCZ,EAAI,OAAOY,EAAIC,IAAID,EAAIC,IAAI,EAAE;EAGtC,EAAI,OAAO;CACb,OAAO,IAAIN,EAAE,SAAS,QAAQ;EAC5B,EAAI,cAAcA,EAAE,WAAW;EAC/B,IAAMT,IAAIS,EAAE,UAAU;EACtB,KAAK,IAAIG,IAAI,GAAGA,IAAIH,EAAE,MAAM,QAAQ,KAAK,GAAG;GAC1C,IAAM,CAACN,GAAGC,GAAGC,GAAGC,KAAK;IACnBG,EAAE,MAAMG;IACRH,EAAE,MAAMG,IAAI;IACZH,EAAE,MAAMG,IAAI;IACZH,EAAE,MAAMG,IAAI;GACd;GACA,EAAI,YAAYH,EAAE,SAASG,IAAI,MAAMH,EAAE;GACvC,IAAMQ,IAAS,KAAK,IAAIjB,GAAGK,IAAI,GAAGC,IAAI,CAAC;GACvC,AAAIW,IAAS,MACXhB,EAAYC,GAAKC,GAAGC,GAAGC,GAAGC,GAAGW,CAAM,GACnCf,EAAI,KAAK,KAETA,EAAI,SAASC,GAAGC,GAAGC,GAAGC,CAAC;EAE3B;EACA,EAAI,cAAc;CACpB,OAAO;EACL,IAAMY,IAAST,EAAE,UAAU;EAC3B,KAAK,IAAIG,IAAI,GAAGA,IAAIH,EAAE,KAAK,QAAQ,KAAK,GAAG;GACzC,IAAMU,IAAQV,EAAE,OAAOG,IAAI,MAAM,QAC3BZ,IAAIS,EAAE,KAAKG,IAAI,KAAK;GAc1B,AAbAV,EAAI,UAAU,GACdA,EAAI,IACFO,EAAE,KAAKG,IACPH,EAAE,KAAKG,IAAI,IACX,KAAK,IAAI,GAAGZ,IAAIkB,IAAS,CAAC,GAC1B,GACA,KAAK,KAAK,CACZ,GACIT,EAAE,UAAU,MACd,EAAI,cAAcA,EAAE,SACpB,EAAI,YAAYU,GAChBjB,EAAI,KAAK,IAEPgB,IAAS,MAEX,EAAI,cAAc,GAClB,EAAI,YAAYA,GAChB,EAAI,cAAcC,GAClBjB,EAAI,OAAO;EAEf;EACA,EAAI,cAAc;CACpB;CAEF,EAAI,QAAQ;AACd,GAGMkB,KACJ,GACA,GACA,MACG;CACH,IAAM,EAAE,aAAUC,GACZ,EAAE,QAAK,aAAUC,GACjBT,IAAIU,EAAM;CAChB,IAAI,OAAOrB,EAAI,wBAAyB,YAAY;EAClD,IAAMsB,IAAWtB,EAAI,qBAAqBuB,EAAI,GAAG,GAAGA,EAAI,IAAIA,EAAI,OAAO,CAAC;EAIxE,AAHAF,EAAM,SAAS,GAAG,MAAMC,EAAS,aAAaZ,IAAI,KAAK,IAAI,GAAGC,IAAI,CAAC,GAAGa,CAAC,CAAC,GACxE,EAAI,YAAYF,GAChBvB,EAAYC,GAAKuB,EAAI,GAAGA,EAAI,GAAGA,EAAI,OAAOA,EAAI,QAAQA,EAAI,SAAS,CAAC,GACpEvB,EAAI,KAAK;CACX,OAAO;EAEL,IAAMG,IAAIoB,EAAI,QAAQZ;EACtB,EAAM,SAAS,GAAG,MAAM;GAEtB,AADA,EAAI,YAAYa,GAChBxB,EAAI,SAASuB,EAAI,IAAIb,IAAIP,GAAGoB,EAAI,GAAGpB,IAAI,IAAKoB,EAAI,MAAM;EACxD,CAAC;CACH;CACA,EAAI,YAAYE,EAAMC,EAAM,MAAM,GAAI;CACtC,KAAK,IAAM,KAAKN,EAAK,OACnB,EAAI,SAAS,KAAK,MAAM,CAAC,GAAGG,EAAI,IAAI,GAAG,GAAGA,EAAI,SAAS,CAAC;CAG1D,AAFA,EAAI,OAAOI,EAAKD,GAAO,EAAE,GACzB,EAAI,eAAe,UACnB,EAAI,YAAYD,EAAMC,EAAM,SAAS;CACrC,KAAK,IAAME,KAAKR,EAAK,QAEnB,AADA,EAAI,YAAYQ,EAAE,OAClB5B,EAAI,SAAS4B,EAAE,MAAMA,EAAE,GAAGA,EAAE,CAAC;CAE/B,AAAIR,EAAK,UAAU,SACjBrB,EAAYC,GAAKoB,EAAK,QAAQ,GAAGG,EAAI,IAAI,GAAG,GAAGA,EAAI,SAAS,GAAG,CAAC,GAChE,EAAI,YAAYE,EAAMC,EAAM,IAAI,GAChC1B,EAAI,KAAK,GACT,EAAI,YAAY,KAChB,EAAI,cAAcyB,EAAMC,EAAM,UAAU,GACxC1B,EAAI,OAAO;AAEf,GAGM6B,IAAY,MAGZC,KACJ,GACA,GACA,GACA,MACG;CACH,IAAM3B,IAAI,KAAK,IAAI,GAAGL,EAAE,QAAQiC,IAAI,CAAC,GAC/B3B,IAAI,KAAK,IAAI,GAAGN,EAAE,SAASiC,IAAI,CAAC;CACtC,EACE/B,GACAF,EAAE,IAAIiC,GACNjC,EAAE,IAAIiC,GACN5B,GACAC,GACA,KAAK,IAAI,GAAG,KAAK,IAAIW,IAASgB,GAAG5B,IAAI,GAAGC,IAAI,CAAC,CAAC,CAChD;AACF,GAMM4B,KACJ,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,MACG;CACH,IAAMC,IAAaR,EAAMC,EAAM,UAAU;CAuBzC,AAtBIQ,KACFlC,EAAI,KAAK,GACT,EAAI,cAAc,yBAClB,EAAI,aAAa,IACjB,EAAI,gBAAgB,GACpB8B,EAAU9B,GAAKF,GAAGiB,GAAQoB,KAAQC,GAAQ,SAAS,EAAE,GACrD,EAAI,YAAYA,IAASA,EAAO,QAAQH,GACxCjC,EAAI,KAAK,GACTA,EAAI,QAAQ,GACRoC,MACFN,EAAU9B,GAAKF,GAAGiB,GAAQoB,CAAI,GAC9B,EAAI,YAAYF,GAChBjC,EAAI,KAAK,MAEFqC,MACTP,EAAU9B,GAAKF,GAAGiB,GAAQ,CAAC,GAC3B,EAAI,YAAYkB,GAChBjC,EAAI,KAAK,IAEX8B,EAAU9B,GAAKF,GAAGiB,GAAQ,CAAC,GAC3B,EAAI,YAAYuB,GAChBtC,EAAI,KAAK,GACLkC,KAAQA,EAAK,QAAQ,MACvBJ,EAAU9B,GAAKF,GAAGiB,GAAQ,CAACmB,EAAK,QAAQ,CAAC,GACzC,EAAI,YAAYA,EAAK,OACrB,EAAI,cAAcA,EAAK,OACvBlC,EAAI,OAAO;AAEf,GAGMuC,KACJ,GACA,GACA,GACA,MACG;CACH,KAAK,IAAMC,KAAQC,GACjB,IAAID,EAAK,SAAS,OAAO;EACvB,IAAM1C,IAAI4C,EAAcF,CAAI;EAI5B,AAHAxC,EAAI,KAAK,GACTA,EAAI,UAAU,GACdA,EAAI,KAAKM,EAAK,GAAGA,EAAK,GAAGA,EAAK,OAAOA,EAAK,MAAM,GAChDN,EAAI,KAAK;EACT,IAAMkC,IACJM,EAAK,SAAS,OACV,OACA;GACE,OAAOA,EAAK;GACZ,OAAO,KAAK,IACVA,EAAK,WAAW,IAAI,KACpB,KAAK,IAAI,IAAI,KAAK,IAAI1C,EAAE,OAAOA,EAAE,MAAM,IAAI,KAAK,CAAC,CACnD;EACF;EAYN,AAXAkC,EACEhC,GACAF,GACA0C,EAAK,QACLA,EAAK,OACLA,EAAK,UACLN,GACA,KACA,MACAR,CACF,GACA1B,EAAI,QAAQ;CACd,OAAO,IAAIwC,EAAK,SAAS,QAAQ;EAC/B,IAAMrC,IAAIqC,EAAK,QAAQX,GACjBzB,IAAIoC,EAAK,SAASX;EAOxB,EACE7B,GACA;GAPA,GAAGwC,EAAK,KAAKA,EAAK,QAAQrC,KAAK;GAC/B,GAAGqC,EAAK,KAAKA,EAAK,SAASpC,KAAK;GAChC,OAAOD;GACP,QAAQC;EAIR,GACA,KAAK,IAAI,GAAGoC,EAAK,MAAM,IAAIX,GAC3BW,EAAK,OACL,IACA;GAAE,OAAOA,EAAK;GAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAIrC,GAAGC,CAAC,IAAI,CAAC;EAAE,GAC3D,GACA;GAAE,OAAOqB,EAAMC,EAAM,SAAS,EAAG;GAAG,OAAO;EAAI,GAC/CA,CACF;CACF;AAEJ,GAGaiB,KACX,GACA,GACA,GACA,GACA,GACA,IAAUC,EAAsB5C,CAAG,MAChC;CACH,IAAM,EAAE,UAAO,WAAQ,UAAO,UAAO,SAAM,cAAWmB,GAChD,EAAE,SAAM,cAAW0B,GACnBC,IAAMC;CAIZ,AAHA/C,EAAI,aAAa,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,GACjCA,EAAI,UAAU,GAAG,GAAG,KAAK,KAAKgD,IAAQF,CAAG,GAAG,KAAK,KAAKG,IAASH,CAAG,CAAC,GACnE9C,EAAI,aAAa8C,GAAK,GAAG,GAAGA,GAAK,GAAG,CAAC,GACrCI,EAAelD,GAAK;EAClB;EACA;EACA;EACA,GAAGmD,EAAM;EACT,GAAGA,EAAM;EACT,QAAQN,EAAO;EACf,QAAQA,EAAO;EACf,IAAIM,EAAM;EACV,SAASN,EAAO;EAChB;EACA,aAAa1B,EAAM;CACrB,CAAC;CAGD,IAAMC,IAAOD,EAAM,QAAQ;CAG3B,IAFIC,KAAMF,EAAgBlB,GAAKoB,GAAMD,CAAK,GAEtCA,EAAM,QAAQ;EAGhB,AAFA,EAAI,OAAOQ,EAAKD,GAAO,EAAE,GACzB,EAAI,eAAe,UACnB,EAAI,YAAY;EAChB,KAAK,IAAM,KAAKP,EAAM,OAAO,SAAS;GACpC,IAAMiC,IAAK,EAAE,IAAI,IAAI,EAAE,IAAI,SAAS;GAcpC,IAbA,EAAI,cAAc,EAAE,SAAS,MAAO,GACpC,EAAI,YAAY,EAAE,OACd,EAAE,UAAU,SACdpD,EAAI,UAAU,GACdA,EAAI,IAAI,EAAE,IAAI,IAAI,GAAGoD,GAAI,GAAG,GAAG,KAAK,KAAK,CAAC,GAC1CpD,EAAI,KAAK,KACA,EAAE,UAAU,SACrBA,EAAI,SAAS,EAAE,IAAI,GAAGoD,IAAK,GAAG,IAAI,CAAC,IAEnCpD,EAAI,SAAS,EAAE,IAAI,IAAI,GAAGoD,IAAK,GAAG,GAAG,CAAC,GAExC,EAAI,YAAY3B,EAAMC,EAAM,SAAS,GACrC1B,EAAI,SAAS,EAAE,MAAM,EAAE,IAAI,IAAI,IAAIoD,CAAE,GACjC,EAAE,QAAQ;IACZ,IAAMjD,IAAI,EAAE,IAAI,QAAQ;IACxB,EAAI,SAAS,EAAE,IAAI,IAAI,IAAIiD,GAAIjD,GAAG,CAAC;GACrC;EACF;EACA,EAAI,cAAc;CACpB;CAGA,IAAMkD,IAASlC,EAAM,OAAO,MAAM,MAAM,MAAMmC,EAAE,SAAS,KAAK,KAAK;CACnE,KAAK,IAAMd,KAAQrB,EAAM,OAAO,SAAS,CAAC,GACxC,AAAIqB,EAAK,SAAS,WAClBzC,EAAYC,GAAKwC,EAAK,GAAGA,EAAK,GAAGA,EAAK,OAAOA,EAAK,QAAQ,CAAC,GAC3D,EAAI,YAAYf,EAAMC,EAAM,MAAM2B,IAAS,MAAO,GAAI,GACtDrD,EAAI,KAAK;CAIX,AAAIuD,EAAO,aACTlD,EAAeL,GAAKwD,EAAgBrC,CAAK,GAAGb,CAAI,IAEhDmD,EAAU;CAEZ,SAASA,IAAY;EACnB,IAAMC,KAAS,GAAyB,GAAW,MAAqB;GACtE,IAAMC,IAAI,KAAKC,EAAM,KAAKA,EAAM,KAC1BC,KAAUC,IAAIF,EAAM,MAAMD,IAAI;GACpC,OAAOI,IAAU,CAAC,CAACJ,GAAG,CAACE,CAAM,IAAI,CAACF,GAAGE,CAAM;EAC7C,GACM,CAACG,GAAQC,KAAWP,EAAMQ,EAAK,GAAGC,EAAO,GAAGhB,EAAM,EAAE,OAAO,GAC3D,CAACiB,GAAQC,KAAWX,EAAMQ,EAAK,GAAGC,EAAO,GAAGhB,EAAM,EAAE,OAAO;EACjE,EAAQ,MACNmB,GACA;GACE,WAAW;IAAE;IAAQ;IAAS;IAAQ;GAAQ;GAC9C,OAAO,KAAK,IAAI,GAAG,KAAK,MAAMhE,EAAK,QAAQwC,CAAG,CAAC;GAC/C,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAMxC,EAAK,SAASwC,CAAG,CAAC;GACjD;EACF,GACA,KAAK,MAAMxC,EAAK,IAAIwC,CAAG,GACvB,KAAK,MAAMxC,EAAK,IAAIwC,CAAG,CACzB;CACF;CAEA,EAAI,aAAaA,GAAK,GAAG,GAAGA,GAAK,GAAG,CAAC;CAErC,KAAK,IAAMN,KAAQrB,EAAM,OAAO,SAAS,CAAC,GACxC,AAAIqB,EAAK,SAAS,YAClB,EAAI,YAAYf,EAAMC,EAAM,MAAM,GAAI,GACtC1B,EAAI,SAASwC,EAAK,GAAGA,EAAK,GAAGA,EAAK,OAAOA,EAAK,MAAM;CAqBtD,IAjBIa,MACF,EAAI,YAAY5B,EAAMC,EAAM,YAAY,GAAI,GAC5C1B,EAAI,SAASM,EAAK,GAAGA,EAAK,GAAGA,EAAK,OAAOA,EAAK,MAAM,IAElDa,EAAM,SAAOoB,EAAgBvC,GAAKmB,EAAM,MAAM,OAAOb,GAAMoB,CAAK,GACpE6C,EAAevE,GAAK;EAClB;EACA;EACA;EACA;EACA,aAAamB,EAAM;EACnB,aAAa,CAAC;EACd,OAAO;EACP,YAAYA,EAAM;EAClB,QAAQA,EAAM;CAChB,CAAC,GAEGA,EAAM,YAAY,QAAQ;EAQ5B,AAPAnB,EAAI,KAAK,GACT,EAAI,OAAO2B,EAAKD,CAAK,GACrB,EAAI,YAAY,QAChB,EAAI,eAAe,UACnB,EAAI,YAAY,GAChB,EAAI,WAAW,SACf,EAAI,cAAcD,EAAMC,EAAM,YAAY,EAAG,GAC7C,EAAI,YAAYD,EAAMC,EAAM,MAAM,GAAI;EACtC,KAAK,IAAM,EAAE,UAAO,YAASP,EAAM,aAAa;GAC9C,IAAMjB,IAAIsE,EAAI,IAAIA,EAAI,SAAS;GAC/B,IAAIC,EAAM,OAAO;IAKf,AAHAzE,EAAI,KAAK,GACT,EAAI,YAAYyE,EAAM,OACtBzE,EAAI,SAASyE,EAAM,MAAMD,EAAI,GAAGtE,CAAC,GACjCF,EAAI,QAAQ;IACZ;GACF;GAEA,AADAA,EAAI,WAAWyE,EAAM,MAAMD,EAAI,GAAGtE,CAAC,GACnCF,EAAI,SAASyE,EAAM,MAAMD,EAAI,GAAGtE,CAAC;EACnC;EACA,EAAI,QAAQ;CACd;CAGA,IAAMwE,IAAQvD,EAAM;CACpB,IAAIuD,GAAO;EACT,IAAIA,EAAM,eAAe,MAAM;GAK7B,AAJA1E,EAAI,KAAK,GACT,EAAI,cAAcyB,EAAMC,EAAM,WAAW,GAAI,GAC7C,EAAI,YAAY,GAChB1B,EAAI,YAAY,CAAC,GAAG,CAAC,CAAC,GACtBA,EAAI,UAAU;GACd,IAAM2E,IAAK,KAAK,MAAMD,EAAM,UAAU,IAAI;GAI1C,AAHA1E,EAAI,OAAO2E,GAAIrE,EAAK,CAAC,GACrBN,EAAI,OAAO2E,GAAIrE,EAAK,IAAIA,EAAK,MAAM,GACnCN,EAAI,OAAO,GACXA,EAAI,QAAQ;EACd;EACA,IAAI0E,EAAM,eAAe,MAAM;GAK7B,AAJA1E,EAAI,KAAK,GACT,EAAI,cAAcyB,EAAMC,EAAM,WAAW,GAAI,GAC7C,EAAI,YAAY,GAChB1B,EAAI,YAAY,CAAC,GAAG,CAAC,CAAC,GACtBA,EAAI,UAAU;GACd,IAAMoD,IAAK,KAAK,MAAMsB,EAAM,UAAU,IAAI;GAI1C,AAHA1E,EAAI,OAAOM,EAAK,GAAG8C,CAAE,GACrBpD,EAAI,OAAOM,EAAK,IAAIA,EAAK,OAAO8C,CAAE,GAClCpD,EAAI,OAAO,GACXA,EAAI,QAAQ;EACd;EACA,KAAK,IAAMwC,KAAQkC,EAAM,OACvB,AACElC,EAAK,SAAS,UACdA,EAAK,SAAS,WACdA,EAAK,SAAS,SACdA,EAAK,SAAS,WAGhBxC,EAAI,UAAU,GACdA,EAAI,IAAIwC,EAAK,GAAGA,EAAK,GAAGA,EAAK,OAAO,IAAI,GAAG,GAAG,KAAK,KAAK,CAAC,GACzD,EAAI,YAAYA,EAAK,MACrBxC,EAAI,KAAK,GACTA,EAAI,UAAU,GACdA,EAAI,IAAIwC,EAAK,GAAGA,EAAK,GAAGA,EAAK,OAAO,IAAI,GAAG,GAAG,KAAK,KAAK,CAAC,GACzD,EAAI,YAAYA,EAAK,OACrBxC,EAAI,KAAK,GACT,EAAI,YAAY,GAChB,EAAI,cAAcyB,EAAMC,EAAM,UAAU,GACxC1B,EAAI,OAAO;CAEf;CACA,IAAImB,EAAM,UAAU;EAClB,IAAMY,IAAIZ,EAAM;EAShB,AARAnB,EAAI,UAAU,GACdA,EAAI,IAAI+B,EAAE,GAAGA,EAAE,GAAGA,EAAE,OAAO,GAAG,GAAG,KAAK,KAAK,CAAC,GAC5C,EAAI,YAAYA,EAAE,OAClB,EAAI,cAAc,KAClB/B,EAAI,KAAK,GACT,EAAI,cAAc,GAClB,EAAI,YAAY,GAChB,EAAI,cAAcyB,EAAMC,EAAM,UAAU,GACxC1B,EAAI,OAAO;CACb;CACA,IAAM4E,IAAMF,GAAO;CACnB,IAAIE,GAAK;EACP,IAAM,EAAE,QAAK,eAAY,eAAYA;EAoBrC,AAnBA5E,EAAI,KAAK,GACT,EAAI,cAAc,0BAClB,EAAI,aAAa,IACjB,EAAI,gBAAgB,GACpBD,EAAYC,GAAKwE,EAAI,GAAGA,EAAI,GAAGA,EAAI,OAAOA,EAAI,QAAQ,CAAC,GACvD,EAAI,YAAY/C,EAAMC,EAAM,YAAYmD,CAAoB,GAC5D7E,EAAI,KAAK,GACTA,EAAI,QAAQ,GACZD,EACEC,GACAwE,EAAI,IAAI,IACRA,EAAI,IAAI,IACRA,EAAI,QAAQ,GACZA,EAAI,SAAS,GACb,CACF,GACA,EAAI,cAAc/C,EAAMC,EAAM,MAAM,EAAG,GACvC,EAAI,YAAY,GAChB1B,EAAI,OAAO,GACX,EAAI,eAAe;EACnB,IAAIE,IAAIsE,EAAI,IAAIM,IAAUC,IAAa,GACjCC,IAAOR,EAAI,IAAIM,IAAU,GACzBG,IAAQT,EAAI,IAAIA,EAAI,QAAQM,IAAU;EAC5C,IAAIF,EAAI,MAAM;GAGZ,AAFA,EAAI,OAAOjD,EAAKD,GAAO,EAAE,GACzB,EAAI,YAAYD,EAAMC,EAAM,IAAI,GAChC,EAAI,YAAY;GAChB,KAAK,IAAMwD,KAAQN,EAAI,MAErB,AADA5E,EAAI,SAASkF,GAAMF,GAAM9E,CAAC,GAC1B,KAAK6E;EAET,OAAO;GACL,IAAM,EAAE,eAAYH,GAChB3E,IAAI+E;GAaR,AAZIG,EAAQ,eACV,EAAI,YAAYA,EAAQ,YACxBnF,EAAI,UAAU,GACdA,EAAI,IAAIC,IAAI,GAAGC,GAAG,GAAG,GAAG,KAAK,KAAK,CAAC,GACnCF,EAAI,KAAK,GACT,KAAK,KAEP,EAAI,OAAO2B,EAAKD,GAAO,IAAI,GAAG,GAC9B,EAAI,YAAYD,EAAMC,EAAM,IAAI,GAChC,EAAI,YAAY,QAChB1B,EAAI,SAASmF,EAAQ,OAAOlF,GAAGC,CAAC,GAChC,KAAK6E,GACDI,EAAQ,aACV,EAAI,OAAOxD,EAAKD,GAAO,EAAE,GACzB,EAAI,YAAYD,EAAMC,EAAM,SAAS,GACrC1B,EAAI,SAASmF,EAAQ,UAAUlF,GAAGC,IAAI,CAAC,GACvC,KAAK6E;GAEP,KAAK,IAAMK,KAAOD,EAAQ,MAkBxB,AAjBA,IAAIH,GACAI,EAAI,UACN,EAAI,YAAYA,EAAI,OACpBpF,EAAI,UAAU,GACdA,EAAI,IAAIC,IAAI,GAAGC,GAAG,GAAG,GAAG,KAAK,KAAK,CAAC,GACnCF,EAAI,KAAK,IAGX,KAAK4E,EAAI,aACT,EAAI,OAAOjD,EAAKD,GAAO,EAAE,GACzB,EAAI,YAAY,QAChB,EAAI,YAAYD,EAAMC,EAAM,SAAS,GACrC1B,EAAI,SAASoF,EAAI,MAAMnF,GAAGC,CAAC,GAC3B,EAAI,OAAOyB,EAAKD,GAAO,IAAI,GAAG,GAC9B,EAAI,YAAY,SAChB,EAAI,YAAYD,EAAMC,EAAM,IAAI,GAChC1B,EAAI,SAASoF,EAAI,OAAOH,GAAO/E,CAAC,GAChC,KAAK6E;EAET;CACF;AACF,GAQaM,KACX,MACwB;CACxB,IAAM,EAAE,cAAWC,GACbtF,IAAMuF,EAAO,WAAW,IAAI,GAC9BvC,IAAQsC,EAAO,OACfrC,IAASqC,EAAO,QAChBxC,IAAMwC,EAAO,cAAc,GAC3BE,IAAY,IACZC,IAAyB,MACzBnB,IAAsB,CAAC,GACvBoB,IAAsB,MACtBC,IAAY,IACZC,IAAW,IACXC,IAAUP,EAAO,SAEfQ,oBAAW,IAAI,QAAwB,GACzCC,IAAa,GACXC,KAAW,MAAkB;EACjC,IAAIC,IAAKH,EAAS,IAAIpE,CAAK;EAE3B,OADIuE,MAAO,KAAA,KAAWH,EAAS,IAAIpE,GAAQ,IAAK,EAAEqE,CAAW,GACtDE;CACT,GACI9B,IAAiB;EAAE,GAAG;EAAG,GAAG;CAAE,GAC9B+B,IAAU,GACVC,IAAU,IAERC,KAAe,GAAc,MAC5BpG,KACDqG,MAAMF,MACR,EAAI,OAAOE,GACX,IAAUA,IAELrG,EAAI,YAAYsG,CAAI,CAAC,CAAC,SALZA,EAAK,SAAS,KAQ3BC,IAAUvG,IAAM4C,EAAsB5C,CAAG,IAAI,MAE7CwG,IAAI,YAKJC,UAAe;EAEnB,IADA,IAAU,MACNjB,KAAa,CAACxF,KAAO,CAACuG,GAAS;EACnC,IAAMpF,IAAQuF,EAAW,SAAS;EAClC,IAAI,CAACvF,GAAO;EACZ,IAAMwF,IAAK,KAAK,IAAI,GAAG,KAAK,MAAM3D,IAAQF,CAAG,CAAC,GACxC8D,IAAK,KAAK,IAAI,GAAG,KAAK,MAAM3D,IAASH,CAAG,CAAC;EAI/C,AAHIyC,EAAO,UAAUoB,MAAI,EAAO,QAAQA,IACpCpB,EAAO,WAAWqB,MAAI,EAAO,SAASA,IAC1C,IAAU,IACNlB,MAAevE,EAAM,UACvB,IAAaA,EAAM,OAGnB,IAAY0F,EACV1F,EAAM,OACN6E,EAAQ7E,EAAM,KAAK,IAClB,MAAU0E,EAAQ,OAAOiB,EAAM,EAAE,KACpC;EAGF,IAAMC,IAAK5F,EAAM,OAAO,QAClB6F,IAAU;GAAE,GAAG,IAAI,KAAK,IAAID,EAAG,MAAM;GAAG,GAAG,IAAI,KAAK,IAAIA,EAAG,MAAM;EAAE,GACnEE,IAAM,GAAGtB,EAAU,GAAGuB,EAAa/F,EAAM,OAAO6F,CAAO;EAO7D,AANIC,MAAQrB,MACV,IAAWqB,GACX,IAAS;GAAE,GAAGpH,EAAIsB,EAAM,MAAM,KAAK,CAAC;GAAG,GAAGtB,EAAIsB,EAAM,MAAM,KAAK,CAAC;EAAE,GAClE,IAAQgG,EAAWhG,EAAM,OAAOgD,GAAQ,EAAE+B,GAASc,CAAO,IAE5DrE,EAAU3C,GAAKmB,GAAOmD,GAAOH,GAAQrB,GAAKyD,CAAO,GACjD,IAAU;CACZ,GAEMa,UAAiB;EACrB,AAAI5B,KAAaC,MAAY,SAC7B,AAGKA,IAHDF,EAAO,wBACCA,EAAO,sBAAsBkB,CAAM,IACtCD,EAAE,wBAAiCA,EAAE,sBAAsBC,CAAM,IAC3D,WAAWA,GAAQ,EAAE;CACtC,GAEMC,IAAaW,EAAsB;EACvC,SAAS/B,EAAO;EAChB,OAAOA,EAAO;EACd;EACA,cAAc8B;CAChB,CAAC;CACD,EAAW,QAAQpE,GAAOC,CAAM;CAEhC,IAAMqE,KAAgB,GAAe,OAAoC;EACvE,IAAIC,EAAE,cAAc1G;EACpB,OAAO;CACT;CAEA,OAAO;EACL,aAAa,MAAM;GAEjB,AADA,IAAUiD,GACV4C,EAAW,WAAW5C,CAAC;EACzB;EACA,WAAW,MAAM4C,EAAW,SAASa,CAAC;EACtC,OAAO,GAAG,GAAG,GAAO;GAKlB,AAJA,IAAQpH,GACR,IAASC,GACLoH,MAAO,IAAMA,IACjBd,EAAW,QAAQvG,GAAGC,CAAC,GACvBgH,EAAS;EACX;EACA,SAAS;GAMP,AALI3B,MAAY,SACVF,EAAO,uBAAsBA,EAAO,qBAAqBE,CAAO,IAC3De,EAAE,uBAAsBA,EAAE,qBAAqBf,CAAO,IAC1D,aAAaA,CAAO,IAE3BgB,EAAO;EACT;EACA,WAAW,GAAS;GAClB,EAAQ,SAAS,GAAG,MAClBC,EAAW,YAAYa,EAAE,GAAGA,EAAE,GAAGD,EAAaC,GAAG1G,CAAC,CAAC,CACrD;EACF;EACA,UAAU,GAAS;GACjB,EAAQ,SAAS,GAAG,MAClB6F,EAAW,YAAYa,EAAE,GAAGA,EAAE,GAAGD,EAAaC,GAAG1G,CAAC,CAAC,CACrD;EACF;EACA,SAAS,GAAS;GAChB,EAAQ,SAAS,GAAG,MAClB6F,EAAW,UAAUa,EAAE,GAAGA,EAAE,GAAGD,EAAaC,GAAG1G,CAAC,CAAC,CACnD;EACF;EACA,YAAY,IAAU,CAAC;GAAE,GAAG;GAAG,GAAG;EAAE,CAAC,GAAG;GACtC,EAAQ,SAAS,GAAG,MAAM6F,EAAW,cAAcY,EAAaC,GAAG1G,CAAC,CAAC,CAAC;EACxE;EACA,cAAc,GAAG,GAAG,MAAM6F,EAAW,YAAYzG,GAAGC,GAAG4D,CAAC;EACxD,cAAc,GAAG,GAAG,MAAM4C,EAAW,YAAYzG,GAAGC,GAAG4D,CAAC;EACxD,YAAY,GAAG,GAAG,MAAM4C,EAAW,UAAUzG,GAAGC,GAAG4D,CAAC;EACpD,oBAAoB4C,EAAW,aAAa;EAC5C,SAAS,GAAG,GAAG,MAAMA,EAAW,OAAOzG,GAAGC,GAAGmG,CAAC;EAC9C,iBAAiBK,EAAW,UAAU;EACtC,eAAeA,EAAW,QAAQ;EAClC,UAAU,MAAMA,EAAW,QAAQe,CAAC;EACpC,eAAe,MAAOf,EAAW,aAAaT,CAAE;EAChD,kBAAkBS,EAAW,WAAW;EACxC,mBAAmBA,EAAW,YAAY;EAC1C,UAAU,GAAG,MAAMA,EAAW,QAAQzG,GAAGC,CAAC;EAC1C,YAAY,GAAG,MAAMwG,EAAW,UAAUzG,GAAGC,CAAC;EAC9C,qBAAqBwG;EACrB,KAAK,GAAM,MAAaA,EAAW,GAAGgB,GAAMC,CAAQ;EACpD,UAAU;GACR,AAAInC,MACJ,IAAY,IACRC,MAAY,SACVF,EAAO,uBAAsBA,EAAO,qBAAqBE,CAAO,IAC3De,EAAE,uBAAsBA,EAAE,qBAAqBf,CAAO,IAC1D,aAAaA,CAAO,IAE3Bc,GAAS,QAAQ,GACjBG,EAAW,QAAQ;EACrB;CACF;AACF"}
|