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.
Files changed (116) hide show
  1. package/dist/chart-library.d.ts +34 -146
  2. package/dist/chart-library.d.ts.map +1 -1
  3. package/dist/chart-library.js +411 -322
  4. package/dist/chart-library.min.js +1 -1
  5. package/dist/charts/area.d.ts +6 -0
  6. package/dist/charts/area.d.ts.map +1 -0
  7. package/dist/charts/area.js +65 -0
  8. package/dist/charts/area.min.js +1 -0
  9. package/dist/charts/bar.d.ts +11 -0
  10. package/dist/charts/bar.d.ts.map +1 -0
  11. package/dist/charts/bar.js +65 -0
  12. package/dist/charts/bar.min.js +1 -0
  13. package/dist/charts/boids.js +167 -0
  14. package/dist/charts/boids.min.js +18 -0
  15. package/dist/charts/candlestick.d.ts +21 -0
  16. package/dist/charts/candlestick.d.ts.map +1 -0
  17. package/dist/charts/candlestick.js +10 -0
  18. package/dist/charts/candlestick.min.js +1 -0
  19. package/dist/charts/experimental/baseline-area.js +70 -0
  20. package/dist/charts/experimental/baseline-area.min.js +1 -0
  21. package/dist/charts/experimental/bubble.js +48 -0
  22. package/dist/charts/experimental/bubble.min.js +1 -0
  23. package/dist/charts/experimental/error-band.js +111 -0
  24. package/dist/charts/experimental/error-band.min.js +1 -0
  25. package/dist/charts/experimental/heatmap.js +69 -0
  26. package/dist/charts/experimental/heatmap.min.js +1 -0
  27. package/dist/charts/experimental/histogram.js +139 -0
  28. package/dist/charts/experimental/histogram.min.js +7 -0
  29. package/dist/charts/experimental/ohlc.js +132 -0
  30. package/dist/charts/experimental/ohlc.min.js +32 -0
  31. package/dist/charts/experimental/step.js +67 -0
  32. package/dist/charts/experimental/step.min.js +1 -0
  33. package/dist/charts/experimental/waterfall.js +121 -0
  34. package/dist/charts/experimental/waterfall.min.js +7 -0
  35. package/dist/charts/line.d.ts +12 -0
  36. package/dist/charts/line.d.ts.map +1 -0
  37. package/dist/charts/line.js +62 -0
  38. package/dist/charts/line.min.js +1 -0
  39. package/dist/charts/scatter.d.ts +11 -0
  40. package/dist/charts/scatter.d.ts.map +1 -0
  41. package/dist/charts/scatter.js +46 -0
  42. package/dist/charts/scatter.min.js +1 -0
  43. package/dist/chunk-0eh4rzy9.min.js +2 -0
  44. package/dist/chunk-0jepamv9.js +7 -0
  45. package/dist/chunk-1ngxm8t2.js +129 -0
  46. package/dist/chunk-50bcv2hw.min.js +2 -0
  47. package/dist/chunk-5gtx3pza.js +9 -0
  48. package/dist/chunk-64q9a7nw.min.js +2 -0
  49. package/dist/chunk-831dem4f.js +4 -0
  50. package/dist/chunk-93yrr7er.js +35 -0
  51. package/dist/chunk-bbyt23tw.min.js +2 -0
  52. package/dist/chunk-cbydth3q.min.js +2 -0
  53. package/dist/chunk-cvtt04m6.min.js +2 -0
  54. package/dist/chunk-g2qmt43n.min.js +33 -0
  55. package/dist/chunk-gm0d4cgx.min.js +2 -0
  56. package/dist/chunk-mmsy3yqt.js +27 -0
  57. package/dist/chunk-n8ew0z0e.js +637 -0
  58. package/dist/chunk-t0kdz02m.js +129 -0
  59. package/dist/chunk-wdfq2fpx.min.js +2 -0
  60. package/dist/chunk-yabjrff2.js +11 -0
  61. package/dist/gpu-worker.js +630 -686
  62. package/dist/gpu-worker.min.js +1 -1
  63. package/dist/msg.d.ts +33 -0
  64. package/dist/msg.d.ts.map +1 -0
  65. package/dist/plugins/coords.d.ts +18 -0
  66. package/dist/plugins/coords.d.ts.map +1 -0
  67. package/dist/plugins/experimental/annotations.js +164 -0
  68. package/dist/plugins/experimental/annotations.min.js +1 -0
  69. package/dist/plugins/experimental/crosshair.js +82 -0
  70. package/dist/plugins/experimental/crosshair.min.js +1 -0
  71. package/dist/plugins/experimental/minimap.js +190 -0
  72. package/dist/plugins/experimental/minimap.min.js +1 -0
  73. package/dist/plugins/experimental/range-selector.js +220 -0
  74. package/dist/plugins/experimental/range-selector.min.js +1 -0
  75. package/dist/plugins/experimental/ruler.js +434 -0
  76. package/dist/plugins/experimental/ruler.min.js +59 -0
  77. package/dist/plugins/experimental/stats.js +229 -0
  78. package/dist/plugins/experimental/stats.min.js +8 -0
  79. package/dist/plugins/experimental/threshold.js +96 -0
  80. package/dist/plugins/experimental/threshold.min.js +1 -0
  81. package/dist/plugins/experimental/tooltip-pin.js +177 -0
  82. package/dist/plugins/experimental/tooltip-pin.min.js +1 -0
  83. package/dist/plugins/experimental/watermark.js +76 -0
  84. package/dist/plugins/experimental/watermark.min.js +1 -0
  85. package/dist/plugins/hover.d.ts +15 -2
  86. package/dist/plugins/hover.d.ts.map +1 -1
  87. package/dist/plugins/hover.js +75 -14
  88. package/dist/plugins/hover.min.js +1 -1
  89. package/dist/plugins/labels-panel.d.ts +4 -0
  90. package/dist/plugins/labels-panel.d.ts.map +1 -0
  91. package/dist/plugins/labels-panel.js +122 -0
  92. package/dist/plugins/labels-panel.min.js +1 -0
  93. package/dist/plugins/labels.d.ts +17 -2
  94. package/dist/plugins/labels.d.ts.map +1 -1
  95. package/dist/plugins/labels.js +11 -99
  96. package/dist/plugins/labels.min.js +1 -1
  97. package/dist/plugins/legend.d.ts +16 -0
  98. package/dist/plugins/legend.d.ts.map +1 -0
  99. package/dist/plugins/legend.js +353 -0
  100. package/dist/plugins/legend.min.js +37 -0
  101. package/dist/plugins/shared.d.ts +7 -0
  102. package/dist/plugins/shared.d.ts.map +1 -0
  103. package/dist/plugins/zoom.d.ts +10 -2
  104. package/dist/plugins/zoom.d.ts.map +1 -1
  105. package/dist/plugins/zoom.js +63 -62
  106. package/dist/plugins/zoom.min.js +1 -1
  107. package/dist/types.d.ts +187 -0
  108. package/dist/types.d.ts.map +1 -0
  109. package/dist/types.js +0 -0
  110. package/dist/types.min.js +0 -0
  111. package/dist/worker-inline.d.ts +1 -1
  112. package/dist/worker-inline.d.ts.map +1 -1
  113. package/package.json +11 -11
  114. package/readme.md +54 -42
  115. package/dist/chunk-bgfkgcmg.js +0 -25
  116. 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};
@@ -1,3 +1,16 @@
1
- import type { ChartPlugin } from "../chart-library.ts";
2
- export declare const hoverPlugin: ChartPlugin;
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,EACV,WAAW,EAGZ,MAAM,qBAAqB,CAAC;AAkC7B,eAAO,MAAM,WAAW,EAAE,WA0PzB,CAAC"}
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"}
@@ -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 "../chart-library.js";
4
- import"../chunk-bgfkgcmg.js";
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.getInstance();
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(chart.findNearestPoint(clientX - r.left, clientY - r.top, r.width, r.height));
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 = ChartManager.MARGIN;
78
- const dark = ChartManager.getInstance().isDark;
139
+ const margin = MARGIN;
140
+ const dark = ChartManager.isDark;
79
141
  const {
80
142
  formatX = String,
81
143
  formatY = String,
82
- fontFamily = ChartManager.DEFAULT_FONT
144
+ fontFamily = DEFAULT_FONT
83
145
  } = chart.config;
84
- const rx = (chart.bounds.maxX - chart.bounds.minX) / chart.view.zoomX;
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(Boolean);
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(Math.max(margin.left, margin.left), Math.max(9, Math.min(h - margin.bottom - 9, s.pillY)), formatY(hvr.y), false);
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{a as B}from"../chart-library.js";import"../chunk-cj3zanvs.js";var Y=new WeakMap,m=(j,q,I,G,E,O,J,z)=>{j.beginPath(),j.roundRect(q,I,G,E,O),j.fillStyle=J,j.fill(),j.strokeStyle=z,j.lineWidth=1.5,j.stroke()},l={name:"hover",install(j,q){let I=B.getInstance(),G=new AbortController,E={hoverResult:null,pillX:0,pillY:0,pillTargetX:0,pillTargetY:0,pillAnimRef:null,abort:G};Y.set(j,E);let O=(z)=>{if(j.config.onHover)j.config.onHover(z);if(!(j.config.showTooltip??!1))return;if(E.hoverResult=z,I.drawChart(j),z&&!E.pillAnimRef){let U=performance.now(),Q=(F)=>{if(!E.hoverResult)return E.pillAnimRef=null;let N=1-Math.pow(0.5,(F-U)/(j.config.pillDecayMs??60));U=F,E.pillX+=(E.pillTargetX-E.pillX)*N,E.pillY+=(E.pillTargetY-E.pillY)*N,I.drawChart(j),E.pillAnimRef=requestAnimationFrame(Q)};E.pillAnimRef=requestAnimationFrame(Q)}},J=(z,U)=>{if(j.dragging)return;let Q=q.getBoundingClientRect();O(j.findNearestPoint(z-Q.left,U-Q.top,Q.width,Q.height))};q.addEventListener("mousemove",(z)=>J(z.clientX,z.clientY),{signal:G.signal}),q.addEventListener("touchmove",(z)=>{if(z.touches.length===1)J(z.touches[0].clientX,z.touches[0].clientY)},{signal:G.signal,passive:!0}),["mouseleave","pointerdown","touchend","touchcancel"].forEach((z)=>q.addEventListener(z,()=>O(null),{signal:G.signal}))},afterDraw(j,q){let I=Y.get(q);if(!I?.hoverResult||!q.config.showTooltip)return;let{hoverResult:G}=I,E=q.width,O=q.height,J=B.MARGIN,z=B.getInstance().isDark,{formatX:U=String,formatY:Q=String,fontFamily:F=B.DEFAULT_FONT}=q.config,N=(q.bounds.maxX-q.bounds.minX)/q.view.zoomX,g=(q.bounds.maxY-q.bounds.minY)/q.view.zoomY,P=(G.x-(q.bounds.minX+q.view.panX*(q.bounds.maxX-q.bounds.minX)))/N*E,T=O*(1-(G.y-(q.bounds.minY+q.view.panY*(q.bounds.maxY-q.bounds.minY)))/g),u=q.series[G.seriesIndex]||q.series[0],S=`${Math.round(u.color.r*255)},${Math.round(u.color.g*255)},${Math.round(u.color.b*255)}`,H=`rgb(${S})`,k=z?`oklch(from ${H} calc(l + 0.1) c h)`:H;j.save(),j.setLineDash([4,3]),j.strokeStyle=`rgba(${S},0.4)`,j.stroke(new Path2D(`M${P} 0V${O-J.bottom}M${J.left} ${T}H${E}`)),j.restore(),j.beginPath(),j.arc(P,T,4.5,0,Math.PI*2),j.fillStyle=H,j.fill(),j.strokeStyle=z?"rgba(0,0,0,0.6)":"rgba(255,255,255,0.9)",j.stroke();let D=q.series.map((A)=>{let L=0,R=A.rawX.length-1;while(L<=R){let K=L+R>>1;if(Math.abs(A.rawX[K]-G.x)<0.0001)return{label:A.label,val:Q(A.rawY[K]),rawVal:A.rawY[K],col:`rgb(${Math.round(A.color.r*255)},${Math.round(A.color.g*255)},${Math.round(A.color.b*255)})`};A.rawX[K]<G.x?L=K+1:R=K-1}return null}).filter(Boolean);D.sort((A,L)=>Math.abs(L.rawVal)-Math.abs(A.rawVal));let p=D.length,_=D.slice(0,5),C=p-_.length;if(I.pillTargetX=P,I.pillTargetY=T,!I.pillAnimRef)I.pillX=P,I.pillY=T;let X=(A,L,R,K)=>{j.font=`600 10px ${F}`;let b=j.measureText(R).width,Z=b+12,M=18,y=K?A-Z/2:A-Z,o=K?L:L-M/2;j.save();let d=K?Math.atan((I.pillTargetX-I.pillX)/80)*0.2:Math.atan((I.pillTargetY-I.pillY)/80)*0.2;j.translate(A,L),j.rotate(d);let v=K?-Z/2:-Z,w=K?0:-M/2;j.beginPath(),j.roundRect(v,w,Z,M,4),j.fillStyle=z?"rgba(0,0,0,0.75)":"rgba(255,255,255,0.75)",j.fill(),j.fillStyle=`rgba(${S},0.2)`,j.fill(),j.strokeStyle=k,j.lineWidth=1.5,j.stroke(),j.fillStyle=k,j.textAlign="center",j.textBaseline="middle",j.fillText(R,v+Z/2,w+M/2),j.restore()};X(Math.max(J.left,Math.min(E-J.right,I.pillX)),O-J.bottom+4,U(G.x),!0),X(Math.max(J.left,J.left),Math.max(9,Math.min(O-J.bottom-9,I.pillY)),Q(G.y),!1);let f=Math.max(..._.map((A)=>j.measureText(A.label+A.val).width))+40,W=30+_.length*18+(C>0?18:0),V=G.screenX+14,$=G.screenY-W-6;if(V+f>E)V=G.screenX-f-14;if($=Math.max(4,Math.min(O-W-4,G.screenY-W-6)),m(j,V,$,f,W,6,z?"rgba(28,28,30,0.95)":"rgba(255,255,255,0.96)","rgba(0,0,0,0.08)"),j.textAlign="left",j.textBaseline="middle",j.fillStyle=z?"#888":"#999",j.fillText(U(G.x),V+10,$+15),_.forEach((A,L)=>{let R=$+35+L*18;j.fillStyle=A.col,j.beginPath(),j.roundRect(V+10,R-4,8,8,2),j.fill(),j.fillStyle=z?"#eee":"#1a1a1a",j.fillText(`${A.label}: ${A.val}`,V+24,R)}),C>0){let A=$+35+_.length*18;j.fillStyle=z?"#666":"#aaa",j.fillText(`+${C} more`,V+10,A)}},uninstall(j){let q=Y.get(j);if(q?.pillAnimRef)cancelAnimationFrame(q.pillAnimRef);q?.abort.abort(),Y.delete(j)}};export{l as hoverPlugin};
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,4 @@
1
+ import type { ChartPlugin } from "../types.ts";
2
+ import { type LabelsConfig } from "./labels.ts";
3
+ export declare const labelsPanelPlugin: ChartPlugin<LabelsConfig>;
4
+ //# sourceMappingURL=labels-panel.d.ts.map
@@ -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};
@@ -1,3 +1,18 @@
1
- import type { ChartPlugin } from "../chart-library.ts";
2
- export declare const labelsPlugin: ChartPlugin;
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,EAAiB,MAAM,qBAAqB,CAAC;AA8CtE,eAAO,MAAM,YAAY,EAAE,WAmF1B,CAAC"}
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"}
@@ -1,102 +1,14 @@
1
1
  import {
2
- ChartManager
3
- } from "../chart-library.js";
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 d}from"../chart-library.js";import"../chunk-cj3zanvs.js";var c=(t,m,s)=>{let r=m-t;if(r<=0)return[t];let o=r/s,e=10**Math.floor(Math.log10(o)),n=o/e,a=e*(n<=1.5?1:n<=3?2:n<=7?5:10),l=[];for(let b=Math.ceil(t/a)*a;b<=m;b+=a)l.push(b);return l},S=(t)=>{let m=d.getInstance(),s=t.width,r=t.height,o=d.MARGIN,{bounds:e,view:n}=t,a=e.maxX-e.minX,l=e.maxY-e.minY,b=a/n.zoomX,h=l/n.zoomY,i=e.minX+n.panX*a,p=e.minY+n.panY*l,u=t.bgColor??(m.isDark?[0.11,0.11,0.12]:[0.98,0.98,0.98]);return{w:s,h:r,m:o,rx:b,ry:h,mx:i,my:p,bg:`${Math.round(u[0]*255)},${Math.round(u[1]*255)},${Math.round(u[2]*255)}`,font:t.fontFamily??d.DEFAULT_FONT,text:t.textColor??(m.isDark?"#c0c0c0":"#333333"),grid:t.gridColor??(m.isDark?"rgba(255,255,255,0.06)":"rgba(0,0,0,0.06)")}},$={name:"labels",beforeDraw(t,m){let{w:s,h:r,m:o,rx:e,ry:n,mx:a,my:l,grid:b}=S(m);t.strokeStyle=b,t.lineWidth=1,t.beginPath(),c(l,l+n,7).forEach((h)=>{let i=r*(1-(h-l)/n);if(i>5&&i<r-o.bottom-5)t.moveTo(o.left,i),t.lineTo(s,i)}),c(a,a+e,8).forEach((h)=>{let i=s*((h-a)/e);if(i>o.left&&i<s)t.moveTo(i,0),t.lineTo(i,r-o.bottom)}),t.stroke()},afterDraw(t,m){let{w:s,h:r,m:o,rx:e,ry:n,mx:a,my:l,bg:b,font:h,text:i}=S(m),{formatX:p=String,formatY:u=String,labelSize:w=d.DEFAULT_LABEL_SIZE}=m.config,T=(g,f,y,C,E)=>{let M=g==="left"?t.createLinearGradient(f,0,f+C,0):t.createLinearGradient(0,y,0,y+E),k=g==="left"?[1,0.7,0.2,0.05,0]:[0,0.05,0.2,0.7,1];[0,0.35,0.55,0.7,1].forEach((D,X)=>M.addColorStop(D,`rgba(${b},${k[X]})`)),t.fillStyle=M,t.fillRect(f,y,C,E)};T("left",0,0,o.left+20,r),T("bottom",0,r-o.bottom-20,s,o.bottom+20),t.font=`${w}px ${h}`,t.fillStyle=i,t.textAlign="right",t.textBaseline="middle",c(l,l+n,7).forEach((g)=>{let f=r*(1-(g-l)/n);if(f>5&&f<r-o.bottom-5)t.fillText(u(g),o.left-5,f)}),t.textAlign="right",t.textBaseline="top",c(a,a+e,8).forEach((g)=>{let f=s*((g-a)/e);if(f<o.left-10||f>s+30)return;t.save(),t.translate(f,r-o.bottom+5),t.rotate(-Math.PI/14),t.fillText(p(g),0,0),t.restore()})}};export{$ as labelsPlugin};
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"}