chartai 0.1.0 → 1.1.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/dist/chart-library.d.ts +34 -146
- package/dist/chart-library.d.ts.map +1 -1
- package/dist/chart-library.js +411 -322
- package/dist/chart-library.min.js +1 -1
- package/dist/charts/area.d.ts +6 -0
- package/dist/charts/area.d.ts.map +1 -0
- package/dist/charts/area.js +65 -0
- package/dist/charts/area.min.js +1 -0
- package/dist/charts/bar.d.ts +11 -0
- package/dist/charts/bar.d.ts.map +1 -0
- package/dist/charts/bar.js +65 -0
- package/dist/charts/bar.min.js +1 -0
- package/dist/charts/boids.js +167 -0
- package/dist/charts/boids.min.js +18 -0
- package/dist/charts/candlestick.d.ts +21 -0
- package/dist/charts/candlestick.d.ts.map +1 -0
- package/dist/charts/candlestick.js +10 -0
- package/dist/charts/candlestick.min.js +1 -0
- package/dist/charts/experimental/baseline-area.js +70 -0
- package/dist/charts/experimental/baseline-area.min.js +1 -0
- package/dist/charts/experimental/bubble.js +48 -0
- package/dist/charts/experimental/bubble.min.js +1 -0
- package/dist/charts/experimental/error-band.js +111 -0
- package/dist/charts/experimental/error-band.min.js +1 -0
- package/dist/charts/experimental/heatmap.js +69 -0
- package/dist/charts/experimental/heatmap.min.js +1 -0
- package/dist/charts/experimental/histogram.js +139 -0
- package/dist/charts/experimental/histogram.min.js +7 -0
- package/dist/charts/experimental/ohlc.js +132 -0
- package/dist/charts/experimental/ohlc.min.js +32 -0
- package/dist/charts/experimental/step.js +67 -0
- package/dist/charts/experimental/step.min.js +1 -0
- package/dist/charts/experimental/waterfall.js +121 -0
- package/dist/charts/experimental/waterfall.min.js +7 -0
- package/dist/charts/line.d.ts +12 -0
- package/dist/charts/line.d.ts.map +1 -0
- package/dist/charts/line.js +62 -0
- package/dist/charts/line.min.js +1 -0
- package/dist/charts/scatter.d.ts +11 -0
- package/dist/charts/scatter.d.ts.map +1 -0
- package/dist/charts/scatter.js +46 -0
- package/dist/charts/scatter.min.js +1 -0
- package/dist/chunk-0eh4rzy9.min.js +2 -0
- package/dist/chunk-0jepamv9.js +7 -0
- package/dist/chunk-1ngxm8t2.js +129 -0
- package/dist/chunk-50bcv2hw.min.js +2 -0
- package/dist/chunk-5gtx3pza.js +9 -0
- package/dist/chunk-64q9a7nw.min.js +2 -0
- package/dist/chunk-831dem4f.js +4 -0
- package/dist/chunk-93yrr7er.js +35 -0
- package/dist/chunk-bbyt23tw.min.js +2 -0
- package/dist/chunk-cbydth3q.min.js +2 -0
- package/dist/chunk-cvtt04m6.min.js +2 -0
- package/dist/chunk-g2qmt43n.min.js +33 -0
- package/dist/chunk-gm0d4cgx.min.js +2 -0
- package/dist/chunk-mmsy3yqt.js +27 -0
- package/dist/chunk-n8ew0z0e.js +637 -0
- package/dist/chunk-t0kdz02m.js +129 -0
- package/dist/chunk-wdfq2fpx.min.js +2 -0
- package/dist/chunk-yabjrff2.js +11 -0
- package/dist/gpu-worker.js +630 -686
- package/dist/gpu-worker.min.js +1 -1
- package/dist/msg.d.ts +33 -0
- package/dist/msg.d.ts.map +1 -0
- package/dist/plugins/coords.d.ts +18 -0
- package/dist/plugins/coords.d.ts.map +1 -0
- package/dist/plugins/experimental/annotations.js +164 -0
- package/dist/plugins/experimental/annotations.min.js +1 -0
- package/dist/plugins/experimental/crosshair.js +82 -0
- package/dist/plugins/experimental/crosshair.min.js +1 -0
- package/dist/plugins/experimental/minimap.js +190 -0
- package/dist/plugins/experimental/minimap.min.js +1 -0
- package/dist/plugins/experimental/range-selector.js +220 -0
- package/dist/plugins/experimental/range-selector.min.js +1 -0
- package/dist/plugins/experimental/ruler.js +434 -0
- package/dist/plugins/experimental/ruler.min.js +59 -0
- package/dist/plugins/experimental/stats.js +229 -0
- package/dist/plugins/experimental/stats.min.js +8 -0
- package/dist/plugins/experimental/threshold.js +96 -0
- package/dist/plugins/experimental/threshold.min.js +1 -0
- package/dist/plugins/experimental/tooltip-pin.js +177 -0
- package/dist/plugins/experimental/tooltip-pin.min.js +1 -0
- package/dist/plugins/experimental/watermark.js +76 -0
- package/dist/plugins/experimental/watermark.min.js +1 -0
- package/dist/plugins/hover.d.ts +15 -2
- package/dist/plugins/hover.d.ts.map +1 -1
- package/dist/plugins/hover.js +75 -14
- package/dist/plugins/hover.min.js +1 -1
- package/dist/plugins/labels-panel.d.ts +4 -0
- package/dist/plugins/labels-panel.d.ts.map +1 -0
- package/dist/plugins/labels-panel.js +122 -0
- package/dist/plugins/labels-panel.min.js +1 -0
- package/dist/plugins/labels.d.ts +17 -2
- package/dist/plugins/labels.d.ts.map +1 -1
- package/dist/plugins/labels.js +11 -99
- package/dist/plugins/labels.min.js +1 -1
- package/dist/plugins/legend.d.ts +16 -0
- package/dist/plugins/legend.d.ts.map +1 -0
- package/dist/plugins/legend.js +353 -0
- package/dist/plugins/legend.min.js +37 -0
- package/dist/plugins/shared.d.ts +7 -0
- package/dist/plugins/shared.d.ts.map +1 -0
- package/dist/plugins/zoom.d.ts +10 -2
- package/dist/plugins/zoom.d.ts.map +1 -1
- package/dist/plugins/zoom.js +63 -62
- package/dist/plugins/zoom.min.js +1 -1
- package/dist/types.d.ts +187 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +0 -0
- package/dist/types.min.js +0 -0
- package/dist/worker-inline.d.ts +1 -1
- package/dist/worker-inline.d.ts.map +1 -1
- package/package.json +11 -11
- package/readme.md +54 -42
- package/dist/chunk-bgfkgcmg.js +0 -25
- package/dist/chunk-cj3zanvs.min.js +0 -2
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DEFAULT_FONT
|
|
3
|
+
} from "../../chunk-1ngxm8t2.js";
|
|
4
|
+
import {
|
|
5
|
+
MARGIN
|
|
6
|
+
} from "../../chunk-831dem4f.js";
|
|
7
|
+
import {
|
|
8
|
+
ChartManager
|
|
9
|
+
} from "../../chunk-n8ew0z0e.js";
|
|
10
|
+
import"../../chunk-93yrr7er.js";
|
|
11
|
+
import"../../chunk-5gtx3pza.js";
|
|
12
|
+
|
|
13
|
+
// src/plugins/experimental/watermark.ts
|
|
14
|
+
var watermarkPlugin = {
|
|
15
|
+
name: "watermark",
|
|
16
|
+
beforeDraw(ctx, chart) {
|
|
17
|
+
const cfg = chart.config;
|
|
18
|
+
const text = cfg.watermarkText;
|
|
19
|
+
if (!text)
|
|
20
|
+
return;
|
|
21
|
+
const { width: w, height: h } = chart;
|
|
22
|
+
const m = MARGIN;
|
|
23
|
+
const chartW = w - m.left - m.right;
|
|
24
|
+
const chartH = h - m.top - m.bottom;
|
|
25
|
+
const position = cfg.watermarkPosition ?? "center";
|
|
26
|
+
const opacity = cfg.watermarkOpacity ?? 0.07;
|
|
27
|
+
const fontSize = cfg.watermarkFontSize ?? Math.max(12, Math.round(Math.min(chartW, chartH) * 0.06));
|
|
28
|
+
const dark = ChartManager.isDark;
|
|
29
|
+
const color = cfg.watermarkColor ?? (dark ? "#ffffff" : "#000000");
|
|
30
|
+
const fontFamily = cfg.fontFamily ?? DEFAULT_FONT;
|
|
31
|
+
const rotation = cfg.watermarkRotation ?? (position === "center" ? -30 : 0);
|
|
32
|
+
const pad = 16;
|
|
33
|
+
let x;
|
|
34
|
+
let y;
|
|
35
|
+
ctx.save();
|
|
36
|
+
ctx.globalAlpha = opacity;
|
|
37
|
+
ctx.font = `bold ${fontSize}px ${fontFamily}`;
|
|
38
|
+
ctx.fillStyle = color;
|
|
39
|
+
ctx.textBaseline = "middle";
|
|
40
|
+
switch (position) {
|
|
41
|
+
case "center":
|
|
42
|
+
x = m.left + chartW / 2;
|
|
43
|
+
y = m.top + chartH / 2;
|
|
44
|
+
ctx.textAlign = "center";
|
|
45
|
+
break;
|
|
46
|
+
case "top-left":
|
|
47
|
+
x = m.left + pad;
|
|
48
|
+
y = m.top + pad + fontSize / 2;
|
|
49
|
+
ctx.textAlign = "left";
|
|
50
|
+
break;
|
|
51
|
+
case "top-right":
|
|
52
|
+
x = w - m.right - pad;
|
|
53
|
+
y = m.top + pad + fontSize / 2;
|
|
54
|
+
ctx.textAlign = "right";
|
|
55
|
+
break;
|
|
56
|
+
case "bottom-left":
|
|
57
|
+
x = m.left + pad;
|
|
58
|
+
y = h - m.bottom - pad - fontSize / 2;
|
|
59
|
+
ctx.textAlign = "left";
|
|
60
|
+
break;
|
|
61
|
+
case "bottom-right":
|
|
62
|
+
x = w - m.right - pad;
|
|
63
|
+
y = h - m.bottom - pad - fontSize / 2;
|
|
64
|
+
ctx.textAlign = "right";
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
ctx.translate(x, y);
|
|
68
|
+
if (rotation !== 0)
|
|
69
|
+
ctx.rotate(rotation * Math.PI / 180);
|
|
70
|
+
ctx.fillText(text, 0, 0);
|
|
71
|
+
ctx.restore();
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
export {
|
|
75
|
+
watermarkPlugin
|
|
76
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{l as w}from"../../chunk-cvtt04m6.js";import{o as c}from"../../chunk-0eh4rzy9.js";import{q as b}from"../../chunk-50bcv2hw.js";import"../../chunk-wdfq2fpx.js";import"../../chunk-bbyt23tw.js";var W={name:"watermark",beforeDraw(t,l){let o=l.config,f=o.watermarkText;if(!f)return;let{width:m,height:s}=l,r=c,g=m-r.left-r.right,k=s-r.top-r.bottom,p=o.watermarkPosition??"center",u=o.watermarkOpacity??0.07,i=o.watermarkFontSize??Math.max(12,Math.round(Math.min(g,k)*0.06)),y=b.isDark,d=o.watermarkColor??(y?"#ffffff":"#000000"),P=o.fontFamily??w,h=o.watermarkRotation??(p==="center"?-30:0),e=16,a,n;switch(t.save(),t.globalAlpha=u,t.font=`bold ${i}px ${P}`,t.fillStyle=d,t.textBaseline="middle",p){case"center":a=r.left+g/2,n=r.top+k/2,t.textAlign="center";break;case"top-left":a=r.left+e,n=r.top+e+i/2,t.textAlign="left";break;case"top-right":a=m-r.right-e,n=r.top+e+i/2,t.textAlign="right";break;case"bottom-left":a=r.left+e,n=s-r.bottom-e-i/2,t.textAlign="left";break;case"bottom-right":a=m-r.right-e,n=s-r.bottom-e-i/2,t.textAlign="right";break}if(t.translate(a,n),h!==0)t.rotate(h*Math.PI/180);t.fillText(f,0,0),t.restore()}};export{W as watermarkPlugin};
|
package/dist/plugins/hover.d.ts
CHANGED
|
@@ -1,3 +1,16 @@
|
|
|
1
|
-
import type { ChartPlugin } from "../
|
|
2
|
-
export
|
|
1
|
+
import type { ChartPlugin, HoverData } from "../types.ts";
|
|
2
|
+
export interface HoverConfig {
|
|
3
|
+
onHover?: (data: HoverData | null) => void;
|
|
4
|
+
showTooltip?: boolean;
|
|
5
|
+
pillDecayMs?: number;
|
|
6
|
+
fontFamily?: string;
|
|
7
|
+
formatX?: (value: number) => string;
|
|
8
|
+
formatY?: (value: number) => string;
|
|
9
|
+
}
|
|
10
|
+
declare module "../types.ts" {
|
|
11
|
+
interface ChartPluginRegistry {
|
|
12
|
+
hover: HoverConfig;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export declare const hoverPlugin: ChartPlugin<HoverConfig>;
|
|
3
16
|
//# sourceMappingURL=hover.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hover.d.ts","sourceRoot":"","sources":["../../src/plugins/hover.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"hover.d.ts","sourceRoot":"","sources":["../../src/plugins/hover.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAiB,SAAS,EAAE,MAAM,aAAa,CAAC;AAyEzE,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,KAAK,IAAI,CAAC;IAC3C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACrC;AAED,OAAO,QAAQ,aAAa,CAAC;IAC3B,UAAU,mBAAmB;QAC3B,KAAK,EAAE,WAAW,CAAC;KACpB;CACF;AAiCD,eAAO,MAAM,WAAW,EAAE,WAAW,CAAC,WAAW,CAkPhD,CAAC"}
|
package/dist/plugins/hover.js
CHANGED
|
@@ -1,9 +1,71 @@
|
|
|
1
|
+
import {
|
|
2
|
+
dataToScreen,
|
|
3
|
+
screenToData
|
|
4
|
+
} from "../chunk-mmsy3yqt.js";
|
|
5
|
+
import {
|
|
6
|
+
DEFAULT_FONT
|
|
7
|
+
} from "../chunk-1ngxm8t2.js";
|
|
8
|
+
import {
|
|
9
|
+
MARGIN
|
|
10
|
+
} from "../chunk-831dem4f.js";
|
|
1
11
|
import {
|
|
2
12
|
ChartManager
|
|
3
|
-
} from "../
|
|
4
|
-
import"../chunk-
|
|
13
|
+
} from "../chunk-n8ew0z0e.js";
|
|
14
|
+
import"../chunk-93yrr7er.js";
|
|
15
|
+
import"../chunk-5gtx3pza.js";
|
|
5
16
|
|
|
6
17
|
// src/plugins/hover.ts
|
|
18
|
+
var MAX_HOVER_PX = 50;
|
|
19
|
+
function findNearestPoint(chart, screenX, screenY, width, height) {
|
|
20
|
+
if (chart.series.length === 0)
|
|
21
|
+
return null;
|
|
22
|
+
const { x: dataX, y: dataY } = screenToData(screenX, screenY, chart, width, height);
|
|
23
|
+
const rX = chart.bounds.maxX - chart.bounds.minX;
|
|
24
|
+
const vW = rX / chart.view.zoomX;
|
|
25
|
+
const vMinX = chart.bounds.minX + chart.view.panX * rX;
|
|
26
|
+
let bsi = -1, bi = -1, bdx = Infinity, bdy = Infinity;
|
|
27
|
+
for (let s = 0;s < chart.series.length; s++) {
|
|
28
|
+
if (chart.config?.hiddenSeries?.has(s))
|
|
29
|
+
continue;
|
|
30
|
+
const sr2 = chart.series[s];
|
|
31
|
+
const n = sr2.rawX.length;
|
|
32
|
+
if (n === 0)
|
|
33
|
+
continue;
|
|
34
|
+
let lo = 0, hi = n - 1;
|
|
35
|
+
while (lo < hi) {
|
|
36
|
+
const mid = lo + hi >> 1;
|
|
37
|
+
if (sr2.rawX[mid] < dataX)
|
|
38
|
+
lo = mid + 1;
|
|
39
|
+
else
|
|
40
|
+
hi = mid;
|
|
41
|
+
}
|
|
42
|
+
let idx = lo;
|
|
43
|
+
if (lo > 0 && Math.abs(sr2.rawX[lo - 1] - dataX) < Math.abs(sr2.rawX[lo] - dataX))
|
|
44
|
+
idx = lo - 1;
|
|
45
|
+
const dx = Math.abs(sr2.rawX[idx] - dataX);
|
|
46
|
+
const dy = Math.abs(sr2.rawY[idx] - dataY);
|
|
47
|
+
if (dx < bdx || dx === bdx && dy < bdy) {
|
|
48
|
+
bdx = dx;
|
|
49
|
+
bdy = dy;
|
|
50
|
+
bsi = s;
|
|
51
|
+
bi = idx;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (bsi === -1)
|
|
55
|
+
return null;
|
|
56
|
+
const sr = chart.series[bsi];
|
|
57
|
+
if (Math.abs((sr.rawX[bi] - vMinX) / vW * width - screenX) > MAX_HOVER_PX)
|
|
58
|
+
return null;
|
|
59
|
+
return {
|
|
60
|
+
x: sr.rawX[bi],
|
|
61
|
+
y: sr.rawY[bi],
|
|
62
|
+
index: bi,
|
|
63
|
+
screenX,
|
|
64
|
+
screenY,
|
|
65
|
+
seriesIndex: bsi,
|
|
66
|
+
seriesLabel: sr.label
|
|
67
|
+
};
|
|
68
|
+
}
|
|
7
69
|
var states = new WeakMap;
|
|
8
70
|
var drawBox = (ctx, x, y, w, h, r, fill, stroke) => {
|
|
9
71
|
ctx.beginPath();
|
|
@@ -17,7 +79,7 @@ var drawBox = (ctx, x, y, w, h, r, fill, stroke) => {
|
|
|
17
79
|
var hoverPlugin = {
|
|
18
80
|
name: "hover",
|
|
19
81
|
install(chart, el) {
|
|
20
|
-
const mgr = ChartManager
|
|
82
|
+
const mgr = ChartManager;
|
|
21
83
|
const ac = new AbortController;
|
|
22
84
|
const s = {
|
|
23
85
|
hoverResult: null,
|
|
@@ -55,7 +117,7 @@ var hoverPlugin = {
|
|
|
55
117
|
if (chart.dragging)
|
|
56
118
|
return;
|
|
57
119
|
const r = el.getBoundingClientRect();
|
|
58
|
-
update(
|
|
120
|
+
update(findNearestPoint(chart, clientX - r.left, clientY - r.top, r.width, r.height));
|
|
59
121
|
};
|
|
60
122
|
el.addEventListener("mousemove", (e) => handleHover(e.clientX, e.clientY), {
|
|
61
123
|
signal: ac.signal
|
|
@@ -74,17 +136,14 @@ var hoverPlugin = {
|
|
|
74
136
|
const { hoverResult: hvr } = s;
|
|
75
137
|
const w = chart.width;
|
|
76
138
|
const h = chart.height;
|
|
77
|
-
const margin =
|
|
78
|
-
const dark = ChartManager.
|
|
139
|
+
const margin = MARGIN;
|
|
140
|
+
const dark = ChartManager.isDark;
|
|
79
141
|
const {
|
|
80
142
|
formatX = String,
|
|
81
143
|
formatY = String,
|
|
82
|
-
fontFamily =
|
|
144
|
+
fontFamily = DEFAULT_FONT
|
|
83
145
|
} = chart.config;
|
|
84
|
-
const
|
|
85
|
-
const ry = (chart.bounds.maxY - chart.bounds.minY) / chart.view.zoomY;
|
|
86
|
-
const px = (hvr.x - (chart.bounds.minX + chart.view.panX * (chart.bounds.maxX - chart.bounds.minX))) / rx * w;
|
|
87
|
-
const py = h * (1 - (hvr.y - (chart.bounds.minY + chart.view.panY * (chart.bounds.maxY - chart.bounds.minY))) / ry);
|
|
146
|
+
const { x: px, y: py } = dataToScreen(hvr.x, hvr.y, chart, w, h);
|
|
88
147
|
const mainSeries = chart.series[hvr.seriesIndex] || chart.series[0];
|
|
89
148
|
const rgb = `${Math.round(mainSeries.color.r * 255)},${Math.round(mainSeries.color.g * 255)},${Math.round(mainSeries.color.b * 255)}`;
|
|
90
149
|
const col = `rgb(${rgb})`;
|
|
@@ -100,7 +159,9 @@ var hoverPlugin = {
|
|
|
100
159
|
ctx.fill();
|
|
101
160
|
ctx.strokeStyle = dark ? "rgba(0,0,0,0.6)" : "rgba(255,255,255,0.9)";
|
|
102
161
|
ctx.stroke();
|
|
103
|
-
const seriesData = chart.series.map((ser) => {
|
|
162
|
+
const seriesData = chart.series.map((ser, si) => {
|
|
163
|
+
if (chart.config?.hiddenSeries?.has(si))
|
|
164
|
+
return null;
|
|
104
165
|
let l = 0, r = ser.rawX.length - 1;
|
|
105
166
|
while (l <= r) {
|
|
106
167
|
const m = l + r >> 1;
|
|
@@ -114,7 +175,7 @@ var hoverPlugin = {
|
|
|
114
175
|
ser.rawX[m] < hvr.x ? l = m + 1 : r = m - 1;
|
|
115
176
|
}
|
|
116
177
|
return null;
|
|
117
|
-
}).filter(
|
|
178
|
+
}).filter((x) => x !== null);
|
|
118
179
|
seriesData.sort((a, b) => Math.abs(b.rawVal) - Math.abs(a.rawVal));
|
|
119
180
|
const totalSeries = seriesData.length;
|
|
120
181
|
const displayData = seriesData.slice(0, 5);
|
|
@@ -150,7 +211,7 @@ var hoverPlugin = {
|
|
|
150
211
|
ctx.restore();
|
|
151
212
|
};
|
|
152
213
|
drawPill(Math.max(margin.left, Math.min(w - margin.right, s.pillX)), h - margin.bottom + 4, formatX(hvr.x), true);
|
|
153
|
-
drawPill(
|
|
214
|
+
drawPill(margin.left, Math.max(9, Math.min(h - margin.bottom - 9, s.pillY)), formatY(hvr.y), false);
|
|
154
215
|
const boxW = Math.max(...displayData.map((d) => ctx.measureText(d.label + d.val).width)) + 40;
|
|
155
216
|
const boxH = 30 + displayData.length * 18 + (remainingCount > 0 ? 18 : 0);
|
|
156
217
|
let bx = hvr.screenX + 14, by = hvr.screenY - boxH - 6;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{j as W,k as B}from"../chunk-cbydth3q.js";import{l as V}from"../chunk-cvtt04m6.js";import{o as L}from"../chunk-0eh4rzy9.js";import{q as I}from"../chunk-50bcv2hw.js";import"../chunk-wdfq2fpx.js";import"../chunk-bbyt23tw.js";var _=50;function q(e,t,r,i,o){if(e.series.length===0)return null;let{x:a,y:s}=B(t,r,e,i,o),l=e.bounds.maxX-e.bounds.minX,g=l/e.view.zoomX,f=e.bounds.minX+e.view.panX*l,b=-1,u=-1,M=1/0,Y=1/0;for(let p=0;p<e.series.length;p++){if(e.config?.hiddenSeries?.has(p))continue;let h=e.series[p],A=h.rawX.length;if(A===0)continue;let m=0,d=A-1;while(m<d){let S=m+d>>1;if(h.rawX[S]<a)m=S+1;else d=S}let X=m;if(m>0&&Math.abs(h.rawX[m-1]-a)<Math.abs(h.rawX[m]-a))X=m-1;let C=Math.abs(h.rawX[X]-a),$=Math.abs(h.rawY[X]-s);if(C<M||C===M&&$<Y)M=C,Y=$,b=p,u=X}if(b===-1)return null;let c=e.series[b];if(Math.abs((c.rawX[u]-f)/g*i-t)>_)return null;return{x:c.rawX[u],y:c.rawY[u],index:u,screenX:t,screenY:r,seriesIndex:b,seriesLabel:c.label}}var k=new WeakMap,O=(e,t,r,i,o,a,s,l)=>{e.beginPath(),e.roundRect(t,r,i,o,a),e.fillStyle=s,e.fill(),e.strokeStyle=l,e.lineWidth=1.5,e.stroke()},Q={name:"hover",install(e,t){let r=I,i=new AbortController,o={hoverResult:null,pillX:0,pillY:0,pillTargetX:0,pillTargetY:0,pillAnimRef:null,abort:i};k.set(e,o);let a=(l)=>{if(e.config.onHover)e.config.onHover(l);if(!(e.config.showTooltip??!1))return;if(o.hoverResult=l,r.drawChart(e),l&&!o.pillAnimRef){let g=performance.now(),f=(b)=>{if(!o.hoverResult)return o.pillAnimRef=null;let u=1-Math.pow(0.5,(b-g)/(e.config.pillDecayMs??60));g=b,o.pillX+=(o.pillTargetX-o.pillX)*u,o.pillY+=(o.pillTargetY-o.pillY)*u,r.drawChart(e),o.pillAnimRef=requestAnimationFrame(f)};o.pillAnimRef=requestAnimationFrame(f)}},s=(l,g)=>{if(e.dragging)return;let f=t.getBoundingClientRect();a(q(e,l-f.left,g-f.top,f.width,f.height))};t.addEventListener("mousemove",(l)=>s(l.clientX,l.clientY),{signal:i.signal}),t.addEventListener("touchmove",(l)=>{if(l.touches.length===1)s(l.touches[0].clientX,l.touches[0].clientY)},{signal:i.signal,passive:!0}),["mouseleave","pointerdown","touchend","touchcancel"].forEach((l)=>t.addEventListener(l,()=>a(null),{signal:i.signal}))},afterDraw(e,t){let r=k.get(t);if(!r?.hoverResult||!t.config.showTooltip)return;let{hoverResult:i}=r,o=t.width,a=t.height,s=L,l=I.isDark,{formatX:g=String,formatY:f=String,fontFamily:b=V}=t.config,{x:u,y:M}=W(i.x,i.y,t,o,a),Y=t.series[i.seriesIndex]||t.series[0],c=`${Math.round(Y.color.r*255)},${Math.round(Y.color.g*255)},${Math.round(Y.color.b*255)}`,p=`rgb(${c})`,h=l?`oklch(from ${p} calc(l + 0.1) c h)`:p;e.save(),e.setLineDash([4,3]),e.strokeStyle=`rgba(${c},0.4)`,e.stroke(new Path2D(`M${u} 0V${a-s.bottom}M${s.left} ${M}H${o}`)),e.restore(),e.beginPath(),e.arc(u,M,4.5,0,Math.PI*2),e.fillStyle=p,e.fill(),e.strokeStyle=l?"rgba(0,0,0,0.6)":"rgba(255,255,255,0.9)",e.stroke();let A=t.series.map((n,v)=>{if(t.config?.hiddenSeries?.has(v))return null;let w=0,y=n.rawX.length-1;while(w<=y){let T=w+y>>1;if(Math.abs(n.rawX[T]-i.x)<0.0001)return{label:n.label,val:f(n.rawY[T]),rawVal:n.rawY[T],col:`rgb(${Math.round(n.color.r*255)},${Math.round(n.color.g*255)},${Math.round(n.color.b*255)})`};n.rawX[T]<i.x?w=T+1:y=T-1}return null}).filter((n)=>n!==null);A.sort((n,v)=>Math.abs(v.rawVal)-Math.abs(n.rawVal));let m=A.length,d=A.slice(0,5),X=m-d.length;if(r.pillTargetX=u,r.pillTargetY=M,!r.pillAnimRef)r.pillX=u,r.pillY=M;let C=(n,v,w,y)=>{e.font=`600 10px ${b}`;let T=e.measureText(w).width,H=T+12,P=18,z=y?n-H/2:n-H,G=y?v:v-P/2;e.save();let N=y?Math.atan((r.pillTargetX-r.pillX)/80)*0.2:Math.atan((r.pillTargetY-r.pillY)/80)*0.2;e.translate(n,v),e.rotate(N);let E=y?-H/2:-H,F=y?0:-P/2;e.beginPath(),e.roundRect(E,F,H,P,4),e.fillStyle=l?"rgba(0,0,0,0.75)":"rgba(255,255,255,0.75)",e.fill(),e.fillStyle=`rgba(${c},0.2)`,e.fill(),e.strokeStyle=h,e.lineWidth=1.5,e.stroke(),e.fillStyle=h,e.textAlign="center",e.textBaseline="middle",e.fillText(w,E+H/2,F+P/2),e.restore()};C(Math.max(s.left,Math.min(o-s.right,r.pillX)),a-s.bottom+4,g(i.x),!0),C(s.left,Math.max(9,Math.min(a-s.bottom-9,r.pillY)),f(i.y),!1);let $=Math.max(...d.map((n)=>e.measureText(n.label+n.val).width))+40,S=30+d.length*18+(X>0?18:0),R=i.screenX+14,D=i.screenY-S-6;if(R+$>o)R=i.screenX-$-14;if(D=Math.max(4,Math.min(a-S-4,i.screenY-S-6)),O(e,R,D,$,S,6,l?"rgba(28,28,30,0.95)":"rgba(255,255,255,0.96)","rgba(0,0,0,0.08)"),e.textAlign="left",e.textBaseline="middle",e.fillStyle=l?"#888":"#999",e.fillText(g(i.x),R+10,D+15),d.forEach((n,v)=>{let w=D+35+v*18;e.fillStyle=n.col,e.beginPath(),e.roundRect(R+10,w-4,8,8,2),e.fill(),e.fillStyle=l?"#eee":"#1a1a1a",e.fillText(`${n.label}: ${n.val}`,R+24,w)}),X>0){let n=D+35+d.length*18;e.fillStyle=l?"#666":"#aaa",e.fillText(`+${X} more`,R+10,n)}},uninstall(e){let t=k.get(e);if(t?.pillAnimRef)cancelAnimationFrame(t.pillAnimRef);t?.abort.abort(),k.delete(e)}};export{Q as hoverPlugin};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"labels-panel.d.ts","sourceRoot":"","sources":["../../src/plugins/labels-panel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAA8B,MAAM,aAAa,CAAC;AAG3E,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,aAAa,CAAC;AAgDrB,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,YAAY,CAgFvD,CAAC"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DEFAULT_FONT,
|
|
3
|
+
DEFAULT_LABEL_SIZE
|
|
4
|
+
} from "../chunk-1ngxm8t2.js";
|
|
5
|
+
import {
|
|
6
|
+
MARGIN
|
|
7
|
+
} from "../chunk-831dem4f.js";
|
|
8
|
+
import {
|
|
9
|
+
ChartManager
|
|
10
|
+
} from "../chunk-n8ew0z0e.js";
|
|
11
|
+
import"../chunk-93yrr7er.js";
|
|
12
|
+
import"../chunk-5gtx3pza.js";
|
|
13
|
+
|
|
14
|
+
// src/plugins/labels-panel.ts
|
|
15
|
+
var niceTicks = (min, max, count) => {
|
|
16
|
+
const range = max - min;
|
|
17
|
+
if (range <= 0)
|
|
18
|
+
return [min];
|
|
19
|
+
const rough = range / count, mag = 10 ** Math.floor(Math.log10(rough)), res = rough / mag;
|
|
20
|
+
const step = mag * (res <= 1.5 ? 1 : res <= 3 ? 2 : res <= 7 ? 5 : 10);
|
|
21
|
+
const ticks = [];
|
|
22
|
+
for (let v = Math.ceil(min / step) * step;v <= max; v += step)
|
|
23
|
+
ticks.push(v);
|
|
24
|
+
return ticks;
|
|
25
|
+
};
|
|
26
|
+
var getViewState = (chart) => {
|
|
27
|
+
const { width: w, height: h } = chart, m = MARGIN;
|
|
28
|
+
const { bounds: b, view: v } = chart, fullX = b.maxX - b.minX, fullY = b.maxY - b.minY;
|
|
29
|
+
const rx = fullX / v.zoomX, ry = fullY / v.zoomY;
|
|
30
|
+
const mx = b.minX + v.panX * fullX, my = b.minY + v.panY * fullY;
|
|
31
|
+
const bgc = chart.config.bgColor ?? (ChartManager.isDark ? [0.11, 0.11, 0.12] : [0.98, 0.98, 0.98]);
|
|
32
|
+
return {
|
|
33
|
+
w,
|
|
34
|
+
h,
|
|
35
|
+
m,
|
|
36
|
+
rx,
|
|
37
|
+
ry,
|
|
38
|
+
mx,
|
|
39
|
+
my,
|
|
40
|
+
bg: `rgb(${Math.round(bgc[0] * 255)},${Math.round(bgc[1] * 255)},${Math.round(bgc[2] * 255)})`,
|
|
41
|
+
bgAlpha: `rgba(${Math.round(bgc[0] * 255)},${Math.round(bgc[1] * 255)},${Math.round(bgc[2] * 255)},0.95)`,
|
|
42
|
+
border: ChartManager.isDark ? "rgba(255,255,255,0.15)" : "rgba(0,0,0,0.15)",
|
|
43
|
+
font: chart.config.fontFamily ?? DEFAULT_FONT,
|
|
44
|
+
text: chart.config.textColor ?? (ChartManager.isDark ? "#c0c0c0" : "#333333"),
|
|
45
|
+
grid: chart.config.gridColor ?? (ChartManager.isDark ? "rgba(255,255,255,0.06)" : "rgba(0,0,0,0.06)")
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
var labelsPanelPlugin = {
|
|
49
|
+
name: "labels-panel",
|
|
50
|
+
beforeDraw(ctx, chart) {
|
|
51
|
+
const { w, h, m, rx, ry, mx, my, grid } = getViewState(chart);
|
|
52
|
+
ctx.strokeStyle = grid;
|
|
53
|
+
ctx.lineWidth = 1;
|
|
54
|
+
ctx.beginPath();
|
|
55
|
+
niceTicks(my, my + ry, 7).forEach((v) => {
|
|
56
|
+
const y = h * (1 - (v - my) / ry);
|
|
57
|
+
if (y > 5 && y < h - m.bottom - 5) {
|
|
58
|
+
ctx.moveTo(m.left, y);
|
|
59
|
+
ctx.lineTo(w, y);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
niceTicks(mx, mx + rx, 8).forEach((v) => {
|
|
63
|
+
const x = w * ((v - mx) / rx);
|
|
64
|
+
if (x > m.left && x < w) {
|
|
65
|
+
ctx.moveTo(x, 0);
|
|
66
|
+
ctx.lineTo(x, h - m.bottom);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
ctx.stroke();
|
|
70
|
+
},
|
|
71
|
+
afterDraw(ctx, chart) {
|
|
72
|
+
const { w, h, m, rx, ry, mx, my, bgAlpha, border, font, text } = getViewState(chart);
|
|
73
|
+
const {
|
|
74
|
+
formatX = String,
|
|
75
|
+
formatY = String,
|
|
76
|
+
labelSize = DEFAULT_LABEL_SIZE
|
|
77
|
+
} = chart.config;
|
|
78
|
+
ctx.fillStyle = bgAlpha;
|
|
79
|
+
ctx.fillRect(0, 0, m.left, h - m.bottom);
|
|
80
|
+
ctx.fillRect(0, h - m.bottom, w, m.bottom);
|
|
81
|
+
ctx.strokeStyle = border;
|
|
82
|
+
ctx.lineWidth = 1;
|
|
83
|
+
ctx.beginPath();
|
|
84
|
+
ctx.moveTo(0, 0);
|
|
85
|
+
ctx.lineTo(m.left, 0);
|
|
86
|
+
ctx.moveTo(m.left, 0);
|
|
87
|
+
ctx.lineTo(m.left, h - m.bottom);
|
|
88
|
+
ctx.moveTo(0, 0);
|
|
89
|
+
ctx.lineTo(0, h);
|
|
90
|
+
ctx.moveTo(0, h);
|
|
91
|
+
ctx.lineTo(w, h);
|
|
92
|
+
ctx.moveTo(m.left, h - m.bottom);
|
|
93
|
+
ctx.lineTo(w, h - m.bottom);
|
|
94
|
+
ctx.moveTo(w, h - m.bottom);
|
|
95
|
+
ctx.lineTo(w, h);
|
|
96
|
+
ctx.stroke();
|
|
97
|
+
ctx.font = `${labelSize}px ${font}`;
|
|
98
|
+
ctx.fillStyle = text;
|
|
99
|
+
ctx.textAlign = "center";
|
|
100
|
+
ctx.textBaseline = "middle";
|
|
101
|
+
niceTicks(my, my + ry, 7).forEach((v) => {
|
|
102
|
+
const y = h * (1 - (v - my) / ry);
|
|
103
|
+
if (y > 5 && y < h - m.bottom - 5)
|
|
104
|
+
ctx.fillText(formatY(v), m.left / 2, y);
|
|
105
|
+
});
|
|
106
|
+
ctx.textAlign = "right";
|
|
107
|
+
ctx.textBaseline = "top";
|
|
108
|
+
niceTicks(mx, mx + rx, 8).forEach((v) => {
|
|
109
|
+
const x = w * ((v - mx) / rx);
|
|
110
|
+
if (x < m.left - 10 || x > w + 30)
|
|
111
|
+
return;
|
|
112
|
+
ctx.save();
|
|
113
|
+
ctx.translate(x, h - m.bottom * 0.7);
|
|
114
|
+
ctx.rotate(-Math.PI / 14);
|
|
115
|
+
ctx.fillText(formatX(v), 0, 0);
|
|
116
|
+
ctx.restore();
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
export {
|
|
121
|
+
labelsPanelPlugin
|
|
122
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{l as C,m as M}from"../chunk-cvtt04m6.js";import{o as y}from"../chunk-0eh4rzy9.js";import{q as T}from"../chunk-50bcv2hw.js";import"../chunk-wdfq2fpx.js";import"../chunk-bbyt23tw.js";var d=(o,f,n)=>{let t=f-o;if(t<=0)return[o];let e=t/n,l=10**Math.floor(Math.log10(e)),a=e/l,r=l*(a<=1.5?1:a<=3?2:a<=7?5:10),m=[];for(let s=Math.ceil(o/r)*r;s<=f;s+=r)m.push(s);return m},p=(o)=>{let{width:f,height:n}=o,t=y,{bounds:e,view:l}=o,a=e.maxX-e.minX,r=e.maxY-e.minY,m=a/l.zoomX,s=r/l.zoomY,b=e.minX+l.panX*a,i=e.minY+l.panY*r,g=o.config.bgColor??(T.isDark?[0.11,0.11,0.12]:[0.98,0.98,0.98]);return{w:f,h:n,m:t,rx:m,ry:s,mx:b,my:i,bg:`rgb(${Math.round(g[0]*255)},${Math.round(g[1]*255)},${Math.round(g[2]*255)})`,bgAlpha:`rgba(${Math.round(g[0]*255)},${Math.round(g[1]*255)},${Math.round(g[2]*255)},0.95)`,border:T.isDark?"rgba(255,255,255,0.15)":"rgba(0,0,0,0.15)",font:o.config.fontFamily??C,text:o.config.textColor??(T.isDark?"#c0c0c0":"#333333"),grid:o.config.gridColor??(T.isDark?"rgba(255,255,255,0.06)":"rgba(0,0,0,0.06)")}},E={name:"labels-panel",beforeDraw(o,f){let{w:n,h:t,m:e,rx:l,ry:a,mx:r,my:m,grid:s}=p(f);o.strokeStyle=s,o.lineWidth=1,o.beginPath(),d(m,m+a,7).forEach((b)=>{let i=t*(1-(b-m)/a);if(i>5&&i<t-e.bottom-5)o.moveTo(e.left,i),o.lineTo(n,i)}),d(r,r+l,8).forEach((b)=>{let i=n*((b-r)/l);if(i>e.left&&i<n)o.moveTo(i,0),o.lineTo(i,t-e.bottom)}),o.stroke()},afterDraw(o,f){let{w:n,h:t,m:e,rx:l,ry:a,mx:r,my:m,bgAlpha:s,border:b,font:i,text:g}=p(f),{formatX:k=String,formatY:v=String,labelSize:S=M}=f.config;o.fillStyle=s,o.fillRect(0,0,e.left,t-e.bottom),o.fillRect(0,t-e.bottom,n,e.bottom),o.strokeStyle=b,o.lineWidth=1,o.beginPath(),o.moveTo(0,0),o.lineTo(e.left,0),o.moveTo(e.left,0),o.lineTo(e.left,t-e.bottom),o.moveTo(0,0),o.lineTo(0,t),o.moveTo(0,t),o.lineTo(n,t),o.moveTo(e.left,t-e.bottom),o.lineTo(n,t-e.bottom),o.moveTo(n,t-e.bottom),o.lineTo(n,t),o.stroke(),o.font=`${S}px ${i}`,o.fillStyle=g,o.textAlign="center",o.textBaseline="middle",d(m,m+a,7).forEach((u)=>{let h=t*(1-(u-m)/a);if(h>5&&h<t-e.bottom-5)o.fillText(v(u),e.left/2,h)}),o.textAlign="right",o.textBaseline="top",d(r,r+l,8).forEach((u)=>{let h=n*((u-r)/l);if(h<e.left-10||h>n+30)return;o.save(),o.translate(h,t-e.bottom*0.7),o.rotate(-Math.PI/14),o.fillText(k(u),0,0),o.restore()})}};export{E as labelsPanelPlugin};
|
package/dist/plugins/labels.d.ts
CHANGED
|
@@ -1,3 +1,18 @@
|
|
|
1
|
-
import type { ChartPlugin } from "../
|
|
2
|
-
export declare const
|
|
1
|
+
import type { ChartPlugin } from "../types.ts";
|
|
2
|
+
export declare const DEFAULT_FONT = "-apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif";
|
|
3
|
+
export declare const DEFAULT_LABEL_SIZE = 12;
|
|
4
|
+
export interface LabelsConfig {
|
|
5
|
+
textColor?: string;
|
|
6
|
+
gridColor?: string;
|
|
7
|
+
fontFamily?: string;
|
|
8
|
+
labelSize?: number;
|
|
9
|
+
formatX?: (value: number) => string;
|
|
10
|
+
formatY?: (value: number) => string;
|
|
11
|
+
}
|
|
12
|
+
declare module "../types.ts" {
|
|
13
|
+
interface ChartPluginRegistry {
|
|
14
|
+
labels: LabelsConfig;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export declare const labelsPlugin: ChartPlugin<LabelsConfig>;
|
|
3
18
|
//# sourceMappingURL=labels.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"labels.d.ts","sourceRoot":"","sources":["../../src/plugins/labels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"labels.d.ts","sourceRoot":"","sources":["../../src/plugins/labels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAA8B,MAAM,aAAa,CAAC;AAI3E,eAAO,MAAM,YAAY,2EAC+C,CAAC;AACzE,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACrC;AAED,OAAO,QAAQ,aAAa,CAAC;IAC3B,UAAU,mBAAmB;QAC3B,MAAM,EAAE,YAAY,CAAC;KACtB;CACF;AA6DD,eAAO,MAAM,YAAY,EAAE,WAAW,CAAC,YAAY,CAmGlD,CAAC"}
|
package/dist/plugins/labels.js
CHANGED
|
@@ -1,102 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import"../chunk-bgfkgcmg.js";
|
|
5
|
-
|
|
6
|
-
// src/plugins/labels.ts
|
|
7
|
-
var niceTicks = (min, max, count) => {
|
|
8
|
-
const range = max - min;
|
|
9
|
-
if (range <= 0)
|
|
10
|
-
return [min];
|
|
11
|
-
const rough = range / count, mag = 10 ** Math.floor(Math.log10(rough)), res = rough / mag;
|
|
12
|
-
const step = mag * (res <= 1.5 ? 1 : res <= 3 ? 2 : res <= 7 ? 5 : 10);
|
|
13
|
-
const ticks = [];
|
|
14
|
-
for (let v = Math.ceil(min / step) * step;v <= max; v += step)
|
|
15
|
-
ticks.push(v);
|
|
16
|
-
return ticks;
|
|
17
|
-
};
|
|
18
|
-
var getViewState = (chart) => {
|
|
19
|
-
const mgr = ChartManager.getInstance(), w = chart.width, h = chart.height, m = ChartManager.MARGIN;
|
|
20
|
-
const { bounds: b, view: v } = chart, fullX = b.maxX - b.minX, fullY = b.maxY - b.minY;
|
|
21
|
-
const rx = fullX / v.zoomX, ry = fullY / v.zoomY;
|
|
22
|
-
const mx = b.minX + v.panX * fullX, my = b.minY + v.panY * fullY;
|
|
23
|
-
const bgc = chart.bgColor ?? (mgr.isDark ? [0.11, 0.11, 0.12] : [0.98, 0.98, 0.98]);
|
|
24
|
-
return {
|
|
25
|
-
w,
|
|
26
|
-
h,
|
|
27
|
-
m,
|
|
28
|
-
rx,
|
|
29
|
-
ry,
|
|
30
|
-
mx,
|
|
31
|
-
my,
|
|
32
|
-
bg: `${Math.round(bgc[0] * 255)},${Math.round(bgc[1] * 255)},${Math.round(bgc[2] * 255)}`,
|
|
33
|
-
font: chart.fontFamily ?? ChartManager.DEFAULT_FONT,
|
|
34
|
-
text: chart.textColor ?? (mgr.isDark ? "#c0c0c0" : "#333333"),
|
|
35
|
-
grid: chart.gridColor ?? (mgr.isDark ? "rgba(255,255,255,0.06)" : "rgba(0,0,0,0.06)")
|
|
36
|
-
};
|
|
37
|
-
};
|
|
38
|
-
var labelsPlugin = {
|
|
39
|
-
name: "labels",
|
|
40
|
-
beforeDraw(ctx, chart) {
|
|
41
|
-
const { w, h, m, rx, ry, mx, my, grid } = getViewState(chart);
|
|
42
|
-
ctx.strokeStyle = grid;
|
|
43
|
-
ctx.lineWidth = 1;
|
|
44
|
-
ctx.beginPath();
|
|
45
|
-
niceTicks(my, my + ry, 7).forEach((v) => {
|
|
46
|
-
const y = h * (1 - (v - my) / ry);
|
|
47
|
-
if (y > 5 && y < h - m.bottom - 5) {
|
|
48
|
-
ctx.moveTo(m.left, y);
|
|
49
|
-
ctx.lineTo(w, y);
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
niceTicks(mx, mx + rx, 8).forEach((v) => {
|
|
53
|
-
const x = w * ((v - mx) / rx);
|
|
54
|
-
if (x > m.left && x < w) {
|
|
55
|
-
ctx.moveTo(x, 0);
|
|
56
|
-
ctx.lineTo(x, h - m.bottom);
|
|
57
|
-
}
|
|
58
|
-
});
|
|
59
|
-
ctx.stroke();
|
|
60
|
-
},
|
|
61
|
-
afterDraw(ctx, chart) {
|
|
62
|
-
const { w, h, m, rx, ry, mx, my, bg, font, text } = getViewState(chart);
|
|
63
|
-
const {
|
|
64
|
-
formatX = String,
|
|
65
|
-
formatY = String,
|
|
66
|
-
labelSize = ChartManager.DEFAULT_LABEL_SIZE
|
|
67
|
-
} = chart.config;
|
|
68
|
-
const drawFade = (dir, x, y, fw, fh) => {
|
|
69
|
-
const g = dir === "left" ? ctx.createLinearGradient(x, 0, x + fw, 0) : ctx.createLinearGradient(0, y, 0, y + fh);
|
|
70
|
-
const alphas = dir === "left" ? [1, 0.7, 0.2, 0.05, 0] : [0, 0.05, 0.2, 0.7, 1];
|
|
71
|
-
[0, 0.35, 0.55, 0.7, 1].forEach((s, i) => g.addColorStop(s, `rgba(${bg},${alphas[i]})`));
|
|
72
|
-
ctx.fillStyle = g;
|
|
73
|
-
ctx.fillRect(x, y, fw, fh);
|
|
74
|
-
};
|
|
75
|
-
drawFade("left", 0, 0, m.left + 20, h);
|
|
76
|
-
drawFade("bottom", 0, h - m.bottom - 20, w, m.bottom + 20);
|
|
77
|
-
ctx.font = `${labelSize}px ${font}`;
|
|
78
|
-
ctx.fillStyle = text;
|
|
79
|
-
ctx.textAlign = "right";
|
|
80
|
-
ctx.textBaseline = "middle";
|
|
81
|
-
niceTicks(my, my + ry, 7).forEach((v) => {
|
|
82
|
-
const y = h * (1 - (v - my) / ry);
|
|
83
|
-
if (y > 5 && y < h - m.bottom - 5)
|
|
84
|
-
ctx.fillText(formatY(v), m.left - 5, y);
|
|
85
|
-
});
|
|
86
|
-
ctx.textAlign = "right";
|
|
87
|
-
ctx.textBaseline = "top";
|
|
88
|
-
niceTicks(mx, mx + rx, 8).forEach((v) => {
|
|
89
|
-
const x = w * ((v - mx) / rx);
|
|
90
|
-
if (x < m.left - 10 || x > w + 30)
|
|
91
|
-
return;
|
|
92
|
-
ctx.save();
|
|
93
|
-
ctx.translate(x, h - m.bottom + 5);
|
|
94
|
-
ctx.rotate(-Math.PI / 14);
|
|
95
|
-
ctx.fillText(formatX(v), 0, 0);
|
|
96
|
-
ctx.restore();
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
};
|
|
100
|
-
export {
|
|
2
|
+
DEFAULT_FONT,
|
|
3
|
+
DEFAULT_LABEL_SIZE,
|
|
101
4
|
labelsPlugin
|
|
5
|
+
} from "../chunk-1ngxm8t2.js";
|
|
6
|
+
import"../chunk-831dem4f.js";
|
|
7
|
+
import"../chunk-n8ew0z0e.js";
|
|
8
|
+
import"../chunk-93yrr7er.js";
|
|
9
|
+
import"../chunk-5gtx3pza.js";
|
|
10
|
+
export {
|
|
11
|
+
labelsPlugin,
|
|
12
|
+
DEFAULT_LABEL_SIZE,
|
|
13
|
+
DEFAULT_FONT
|
|
102
14
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as
|
|
1
|
+
import{l as a,m as b,n as c}from"../chunk-cvtt04m6.js";import"../chunk-0eh4rzy9.js";import"../chunk-50bcv2hw.js";import"../chunk-wdfq2fpx.js";import"../chunk-bbyt23tw.js";export{c as labelsPlugin,b as DEFAULT_LABEL_SIZE,a as DEFAULT_FONT};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ChartPlugin } from "../types.ts";
|
|
2
|
+
export interface LegendConfig {
|
|
3
|
+
maxLabelChars?: number;
|
|
4
|
+
fontFamily?: string;
|
|
5
|
+
labelSize?: number;
|
|
6
|
+
textColor?: string;
|
|
7
|
+
defaultOpen?: boolean;
|
|
8
|
+
alwaysOpen?: boolean;
|
|
9
|
+
}
|
|
10
|
+
declare module "../types.ts" {
|
|
11
|
+
interface ChartPluginRegistry {
|
|
12
|
+
legend: LegendConfig;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export declare const legendPlugin: ChartPlugin<LegendConfig>;
|
|
16
|
+
//# sourceMappingURL=legend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legend.d.ts","sourceRoot":"","sources":["../../src/plugins/legend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAA8B,MAAM,aAAa,CAAC;AAI3E,MAAM,WAAW,YAAY;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,OAAO,QAAQ,aAAa,CAAC;IAC3B,UAAU,mBAAmB;QAC3B,MAAM,EAAE,YAAY,CAAC;KACtB;CACF;AAwED,eAAO,MAAM,YAAY,EAAE,WAAW,CAAC,YAAY,CA2IlD,CAAC"}
|