@stacksjs/charts 0.72.57 → 0.72.61
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/index.js +4 -4
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{scaleBand as h,scaleLinear as r}from"@ts-charts/scale";import{arc as x,area as n,curveLinear as p,curveMonotoneX as c,line as o,pie as d}from"@ts-charts/shape";var L=["#3b82f6","#10b981","#f59e0b","#ef4444","#8b5cf6","#ec4899","#14b8a6","#f97316","#6366f1","#84cc16"];function F(q){return L[q%L.length]??L[0]}function T(q,J){if(q.startsWith("#")){let N=q.slice(1),z=Number.parseInt(N.slice(0,2),16),Z=Number.parseInt(N.slice(2,4),16),K=Number.parseInt(N.slice(4,6),16);return`rgba(${z}, ${Z}, ${K}, ${J})`}if(q.startsWith("rgb("))return q.replace("rgb(","rgba(").replace(")",`, ${J})`);return q}import{format as u}from"@ts-charts/format";import{scaleLinear as m}from"@ts-charts/scale";var b=m;function A(q,J,N=8){if(!Number.isFinite(q)||!Number.isFinite(J)||J<=q)return[Number.isFinite(q)?q:0];let Z=b().domain([q,J]).nice(N).ticks(N);if(Z.length===0)return[q,J];return Z}var g=u("~s");function R(q){if(!Number.isFinite(q))return"";if(Math.abs(q)>=1000)return g(q).replace("G","B").toUpperCase();if(Number.isInteger(q))return q.toString();return q.toFixed(2)}var f=r,a=h,l="rgba(148, 163, 184, 0.18)",I="#64748b",i="rgba(15, 23, 42, 0.92)";class w{static instances=new WeakMap;static register(...q){}type;data;options;canvas;ctx;resizeObserver=null;hitItems=[];tooltipEl=null;boundMove=(q)=>this.handleMouseMove(q);boundLeave=()=>this.hideTooltip();constructor(q,J){this.canvas=q instanceof HTMLCanvasElement?q:q.canvas;let N=this.canvas.getContext("2d");if(!N)throw Error("Chart: 2D canvas context unavailable");this.ctx=N,this.type=J.type,this.data=J.data,this.options=J.options??{},w.instances.set(this.canvas,this),this.attachInteractions(),this.observeResize(),this.render()}update(){this.render()}resize(){this.render()}destroy(){if(this.resizeObserver)this.resizeObserver.disconnect(),this.resizeObserver=null;if(this.canvas.removeEventListener("mousemove",this.boundMove),this.canvas.removeEventListener("mouseleave",this.boundLeave),this.tooltipEl?.parentNode)this.tooltipEl.parentNode.removeChild(this.tooltipEl);this.tooltipEl=null,this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),w.instances.delete(this.canvas)}observeResize(){if(this.options.responsive===!1||typeof ResizeObserver>"u")return;this.resizeObserver=new ResizeObserver(()=>this.render()),this.resizeObserver.observe(this.canvas.parentElement??this.canvas)}attachInteractions(){if(this.options.plugins?.tooltip?.enabled===!1)return;this.canvas.addEventListener("mousemove",this.boundMove),this.canvas.addEventListener("mouseleave",this.boundLeave)}syncCanvasSize(){let q=typeof window<"u"?window.devicePixelRatio||1:1,J=this.canvas.getBoundingClientRect(),N=J.width||this.canvas.clientWidth||this.canvas.width,z=J.height||this.canvas.clientHeight||this.canvas.height,Z=Math.max(1,Math.floor(N*q)),K=Math.max(1,Math.floor(z*q));if(this.canvas.width!==Z)this.canvas.width=Z;if(this.canvas.height!==K)this.canvas.height=K;return this.ctx.setTransform(q,0,0,q,0,0),{width:N,height:z}}render(){let{width:q,height:J}=this.syncCanvasSize();if(this.ctx.clearRect(0,0,q,J),this.hitItems=[],this.type==="doughnut"||this.type==="pie"){this.renderRadial(q,J);return}if(this.type==="radar"){this.renderCartesian(q,J,"line");return}this.renderCartesian(q,J,this.type)}renderCartesian(q,J,N){let z=this.data.labels??[],Z=this.data.datasets,K=this.layoutLegend(q,J),$=8+(this.options.plugins?.title?.display?24:0)+(K.position==="top"?K.h:0),Q=28+(K.position==="bottom"?K.h:0),j=48+(K.position==="left"?K.w:0),V=16+(K.position==="right"?K.w:0)+(this.hasRightAxis()?40:0),H={x:j,y:$,w:Math.max(1,q-j-V),h:Math.max(1,J-$-Q)};if(this.options.plugins?.title?.display&&this.options.plugins.title.text){let Y=this.options.plugins.title;this.ctx.fillStyle=Y.color??I,this.ctx.font=`${Y.font?.size??14}px system-ui, sans-serif`,this.ctx.textAlign="center",this.ctx.textBaseline="top",this.ctx.fillText(Y.text??"",q/2,8)}this.drawLegend(K,Z);let G=this.computeAxis(Z.filter((Y)=>(Y.yAxisID??"y")==="y"),"y"),P=this.hasRightAxis()?this.computeAxis(Z.filter((Y)=>Y.yAxisID==="y1"),"y1"):null;if(this.drawGridAndYAxis(H,G,"left"),P)this.drawYAxis(H,P,"right");if(this.drawXAxis(H,z),N==="bar")this.drawBars(H,z,Z,G,P);else this.drawLines(H,z,Z,G,P)}hasRightAxis(){return this.data.datasets.some((q)=>q.yAxisID==="y1")}computeAxis(q,J){let N=this.options.scales?.[J]??{},z=Number.POSITIVE_INFINITY,Z=Number.NEGATIVE_INFINITY;if(N.stacked){let M=this.data.labels??[];for(let $=0;$<M.length;$++){let Q=0,j=0;for(let V of q){let H=V.data[$]??0;if(H>=0)Q+=H;else j+=H}if(Q>Z)Z=Q;if(j<z)z=j}}else for(let M of q)for(let $ of M.data){if($<z)z=$;if($>Z)Z=$}if(!Number.isFinite(z))z=0;if(!Number.isFinite(Z))Z=1;if(N.beginAtZero!==!1&&z>0)z=0;if(N.min!==void 0)z=N.min;if(N.max!==void 0)Z=N.max;if(z===Z)Z=z+1;let K=A(z,Z,N.ticks?.maxTicksLimit??6);return{ticks:K,min:K[0]??z,max:K[K.length-1]??Z}}drawGridAndYAxis(q,J,N){let z=this.options.scales?.y??{},Z=z.grid?.display!==!1,K=z.ticks?.color??I,M=z.grid?.color??l;this.ctx.save(),this.ctx.font=`${z.ticks?.font?.size??11}px system-ui, sans-serif`,this.ctx.textBaseline="middle";for(let $ of J.ticks){let Q=this.scaleY(q,J,$);if(Z)this.ctx.strokeStyle=M,this.ctx.lineWidth=1,this.ctx.beginPath(),this.ctx.moveTo(q.x,Q),this.ctx.lineTo(q.x+q.w,Q),this.ctx.stroke();let j=z.ticks?.callback?z.ticks.callback($,J.ticks.indexOf($),J.ticks):R($);this.ctx.fillStyle=K,this.ctx.textAlign=N==="left"?"right":"left";let V=N==="left"?q.x-8:q.x+q.w+8;this.ctx.fillText(String(j),V,Q)}this.ctx.restore()}drawYAxis(q,J,N){let z=this.options.scales?.y1??{},Z=z.ticks?.color??I;this.ctx.save(),this.ctx.font=`${z.ticks?.font?.size??11}px system-ui, sans-serif`,this.ctx.textBaseline="middle";for(let K of J.ticks){let M=this.scaleY(q,J,K),$=z.ticks?.callback?z.ticks.callback(K,J.ticks.indexOf(K),J.ticks):R(K);this.ctx.fillStyle=Z,this.ctx.textAlign=N==="left"?"right":"left";let Q=N==="left"?q.x-8:q.x+q.w+8;this.ctx.fillText(String($),Q,M)}this.ctx.restore()}drawXAxis(q,J){let N=this.options.scales?.x??{},z=N.ticks?.color??I;if(N.display===!1||J.length===0)return;this.ctx.save(),this.ctx.font=`${N.ticks?.font?.size??11}px system-ui, sans-serif`,this.ctx.textBaseline="top",this.ctx.textAlign="center",this.ctx.fillStyle=z;let Z=Math.min(J.length,Math.max(2,Math.floor(q.w/60))),K=Math.max(1,Math.floor(J.length/Z));for(let M=0;M<J.length;M+=K){let $=this.scaleX(q,J.length,M);this.ctx.fillText(J[M]??"",$,q.y+q.h+8)}this.ctx.restore()}scaleX(q,J,N){if(J<=1)return q.x+q.w/2;return f().domain([0,J-1]).range([q.x,q.x+q.w])(N)}scaleY(q,J,N){if(J.max===J.min)return q.y+q.h/2;return f().domain([J.min,J.max]).range([q.y+q.h,q.y])(N)}drawLines(q,J,N,z,Z){N.forEach((K,M)=>{let $=K.yAxisID==="y1"&&Z?Z:z;if(K.type==="bar"){this.drawBarSeries(q,J,[K],z,Z);return}let Q=(typeof K.borderColor==="string"?K.borderColor:null)??F(M),j=K.backgroundColor&&typeof K.backgroundColor==="string"?K.backgroundColor:K.fill?T(Q,0.15):null,V=K.data.map((Y,S)=>({x:this.scaleX(q,J.length||K.data.length,S),y:this.scaleY(q,$,Y),value:Y}));if(V.length===0)return;let H=(K.tension??0)>0?c:p;if(j){let Y=q.y+q.h,S=n().x((B)=>B.x).y0(()=>Y).y1((B)=>B.y).curve(H).context(this.ctx);this.ctx.beginPath(),S(V),this.ctx.fillStyle=j,this.ctx.fill(),S.context(null)}let G=o().x((Y)=>Y.x).y((Y)=>Y.y).curve(H).context(this.ctx);this.ctx.beginPath(),G(V),this.ctx.lineWidth=K.borderWidth??2,this.ctx.strokeStyle=Q,this.ctx.lineJoin="round",this.ctx.lineCap="round",this.ctx.stroke(),G.context(null);let P=K.pointRadius??0;if(P>0){this.ctx.fillStyle=K.pointBackgroundColor??Q;for(let Y of V)this.ctx.beginPath(),this.ctx.arc(Y.x,Y.y,P,0,Math.PI*2),this.ctx.fill()}V.forEach((Y,S)=>{this.hitItems.push({datasetIndex:M,dataIndex:S,x:Y.x,y:Y.y,label:J[S]??String(S),value:Y.value})})})}drawBars(q,J,N,z,Z){this.drawBarSeries(q,J,N,z,Z)}drawBarSeries(q,J,N,z,Z){let K=J.length||(N[0]?.data.length??0);if(K===0)return;let $=!!this.options.scales?.y?.stacked,Q=Array.from({length:K},(G,P)=>P),j=a().domain(Q).range([q.x,q.x+q.w]).paddingInner(0.3),V=j.bandwidth(),H=$?V:V/Math.max(1,N.length);for(let G=0;G<K;G++){let P=j(G),Y=0,S=0;N.forEach((B,D)=>{let W=B.yAxisID==="y1"&&Z?Z:z,X=B.data[G]??0,U=$?X>=0?Y:S:0,O=U+X,C=this.scaleY(q,W,U),E=this.scaleY(q,W,O),_=$?P:P+D*H,k=Math.min(C,E),v=Math.abs(E-C),y=Array.isArray(B.backgroundColor)?B.backgroundColor[G]??F(D):typeof B.backgroundColor==="string"?B.backgroundColor:F(D);if(this.ctx.fillStyle=y,this.ctx.fillRect(_,k,Math.max(1,H-2),v),B.borderWidth&&B.borderColor&&typeof B.borderColor==="string")this.ctx.lineWidth=B.borderWidth,this.ctx.strokeStyle=B.borderColor,this.ctx.strokeRect(_,k,Math.max(1,H-2),v);if($)if(X>=0)Y=O;else S=O;this.hitItems.push({datasetIndex:D,dataIndex:G,x:_+H/2,y:k,label:J[G]??String(G),value:X})})}}renderRadial(q,J){let N=this.data.datasets;if(N.length===0)return;let z=N[0];if(!z)return;let Z=this.data.labels??[],K=this.layoutLegend(q,J),M=q,$=J,Q=0,j=0;if(K.position==="right")M=q-K.w;else if(K.position==="left")M=q-K.w,Q=K.w;else if(K.position==="top")$=J-K.h,j=K.h;else if(K.position==="bottom")$=J-K.h;this.drawLegend(K,N.map((X,U)=>({...X,label:Z[U]??X.label})),Z);let V=Q+M/2,H=j+$/2,G=Math.min(M,$)/2-8,P=this.options.cutout,Y=typeof P==="string"&&P.endsWith("%")?Number.parseFloat(P)/100:this.type==="doughnut"?0.6:0,S=G*Y,D=d().value((X)=>Math.max(0,X||0)).startAngle(-Math.PI/2).endAngle(-Math.PI/2+Math.PI*2).sort(null)(z.data),W=x().innerRadius(S).outerRadius(G);this.ctx.save(),this.ctx.translate(V,H);for(let X of D){let U=X.index,O=z.data[U]??0,C=Array.isArray(z.backgroundColor)?z.backgroundColor[U]??F(U):typeof z.backgroundColor==="string"?z.backgroundColor:F(U);this.ctx.beginPath(),W.context(this.ctx)(X),this.ctx.fillStyle=C,this.ctx.fill();let E=(X.startAngle+X.endAngle)/2-Math.PI/2,_=(G+S)/2;this.hitItems.push({datasetIndex:0,dataIndex:U,x:V+Math.cos(E)*_,y:H+Math.sin(E)*_,label:Z[U]??String(U),value:O})}this.ctx.restore(),W.context(null)}layoutLegend(q,J){let N=this.options.plugins?.legend;if(N?.display===!1||!this.data.datasets.some((Z)=>Z.label))return{w:0,h:0,position:"none"};let z=N?.position??"top";if(z==="left"||z==="right")return{w:100,h:0,position:z};return{w:0,h:Math.max(24,Math.ceil(this.data.datasets.length/4)*18+8),position:z}}drawLegend(q,J,N){if(q.position==="none")return;let z=this.options.plugins?.legend,Z=N&&(this.type==="pie"||this.type==="doughnut")?N.map(($,Q)=>{let j=J[0],V=Array.isArray(j?.backgroundColor)?j.backgroundColor[Q]??F(Q):typeof j?.backgroundColor==="string"?j.backgroundColor:F(Q);return{label:$,color:V}}):J.map(($,Q)=>({label:$.label??`Dataset ${Q+1}`,color:typeof $.borderColor==="string"?$.borderColor:Array.isArray($.backgroundColor)?$.backgroundColor[0]??F(Q):typeof $.backgroundColor==="string"?$.backgroundColor:F(Q)}));if(Z.length===0)return;this.ctx.save(),this.ctx.font=`${z?.labels?.font?.size??12}px system-ui, sans-serif`,this.ctx.fillStyle=z?.labels?.color??I,this.ctx.textBaseline="middle";let K=z?.labels?.boxWidth??12,M=z?.labels?.padding??8;if(q.position==="top"||q.position==="bottom"){let $=q.position==="top"?12:(this.canvas.clientHeight||0)-12,Q=M;this.ctx.textAlign="left";for(let j of Z)this.ctx.fillStyle=j.color,this.ctx.fillRect(Q,$-K/2,K,K),Q+=K+4,this.ctx.fillStyle=z?.labels?.color??I,this.ctx.fillText(j.label,Q,$),Q+=this.ctx.measureText(j.label).width+M*2}else{let $=q.position==="right"?(this.canvas.clientWidth||0)-110:8,Q=M+6;for(let j of Z)this.ctx.fillStyle=j.color,this.ctx.fillRect($,Q-K/2,K,K),this.ctx.fillStyle=z?.labels?.color??I,this.ctx.textAlign="left",this.ctx.fillText(j.label,$+K+4,Q),Q+=18}this.ctx.restore()}handleMouseMove(q){if(this.hitItems.length===0)return;let J=this.canvas.getBoundingClientRect(),N=q.clientX-J.left,z=q.clientY-J.top;if((this.options.interaction?.mode??this.options.plugins?.tooltip?.mode??"nearest")==="index"){let $=this.findClosestByIndex(N);if($)this.showTooltip(q.clientX,q.clientY,$);else this.hideTooltip();return}let K=null,M=Number.POSITIVE_INFINITY;for(let $ of this.hitItems){let Q=$.x-N,j=$.y-z,V=Q*Q+j*j;if(V<M)M=V,K=$}if(K&&M<3600)this.showTooltip(q.clientX,q.clientY,[K]);else this.hideTooltip()}findClosestByIndex(q){let J=-1,N=Number.POSITIVE_INFINITY;for(let z of this.hitItems){let Z=Math.abs(z.x-q);if(Z<N)N=Z,J=z.dataIndex}if(J<0)return null;return this.hitItems.filter((z)=>z.dataIndex===J)}showTooltip(q,J,N){if(!this.tooltipEl)this.tooltipEl=document.createElement("div"),Object.assign(this.tooltipEl.style,{position:"fixed",pointerEvents:"none",background:this.options.plugins?.tooltip?.backgroundColor??i,color:this.options.plugins?.tooltip?.bodyColor??"#fff",padding:"6px 10px",borderRadius:"6px",font:"12px system-ui, sans-serif",zIndex:"9999",whiteSpace:"pre-line",transform:"translate(8px, 8px)"}),document.body.appendChild(this.tooltipEl);let z=this.options.plugins?.tooltip?.callbacks,Z=[];N.forEach((Q)=>{let j=this.data.datasets[Q.datasetIndex];if(!j)return;let V={dataset:j,datasetIndex:Q.datasetIndex,dataIndex:Q.dataIndex,parsed:{y:Q.value},raw:Q.value,label:Q.label,formattedValue:R(Q.value)},H=z?.label?z.label(V):`${j.label??""}: ${R(Q.value)}`,G=Array.isArray(H)?H.join(`
|
|
3
|
-
`):
|
|
4
|
-
`):
|
|
5
|
-
`));this.tooltipEl.appendChild(
|
|
2
|
+
import{scaleBand as F,scaleLinear as H}from"@ts-charts/scale";import{arc as _,area as X,curveLinear as G,curveMonotoneX as V,line as U,pie as j}from"@ts-charts/shape";var M=["#3b82f6","#10b981","#f59e0b","#ef4444","#8b5cf6","#ec4899","#14b8a6","#f97316","#6366f1","#84cc16"];function y(t){return M[t%M.length]??M[0]}function B(t,i){if(t.startsWith("#")){let n=t.slice(1),e=Number.parseInt(n.slice(0,2),16),a=Number.parseInt(n.slice(2,4),16),s=Number.parseInt(n.slice(4,6),16);return`rgba(${e}, ${a}, ${s}, ${i})`}if(t.startsWith("rgb("))return t.replace("rgb(","rgba(").replace(")",`, ${i})`);return t}import{format as z}from"@ts-charts/format";import{scaleLinear as P}from"@ts-charts/scale";var W=P;function R(t,i,n=8){if(!Number.isFinite(t)||!Number.isFinite(i)||i<=t)return[Number.isFinite(t)?t:0];let a=W().domain([t,i]).nice(n).ticks(n);if(a.length===0)return[t,i];return a}var Y=z("~s");function v(t){if(!Number.isFinite(t))return"";if(Math.abs(t)>=1000)return Y(t).replace("G","B").toUpperCase();if(Number.isInteger(t))return t.toString();return t.toFixed(2)}var N=H,J=F,Z="rgba(148, 163, 184, 0.18)",C="#64748b",q="rgba(15, 23, 42, 0.92)";class E{static instances=new WeakMap;static register(...t){}type;data;options;canvas;ctx;resizeObserver=null;hitItems=[];tooltipEl=null;boundMove=(t)=>this.handleMouseMove(t);boundLeave=()=>this.hideTooltip();constructor(t,i){this.canvas=t instanceof HTMLCanvasElement?t:t.canvas;let n=this.canvas.getContext("2d");if(!n)throw Error("Chart: 2D canvas context unavailable");this.ctx=n,this.type=i.type,this.data=i.data,this.options=i.options??{},E.instances.set(this.canvas,this),this.attachInteractions(),this.observeResize(),this.render()}update(){this.render()}resize(){this.render()}destroy(){if(this.resizeObserver)this.resizeObserver.disconnect(),this.resizeObserver=null;if(this.canvas.removeEventListener("mousemove",this.boundMove),this.canvas.removeEventListener("mouseleave",this.boundLeave),this.tooltipEl?.parentNode)this.tooltipEl.parentNode.removeChild(this.tooltipEl);this.tooltipEl=null,this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),E.instances.delete(this.canvas)}observeResize(){if(this.options.responsive===!1||typeof ResizeObserver>"u")return;this.resizeObserver=new ResizeObserver(()=>this.render()),this.resizeObserver.observe(this.canvas.parentElement??this.canvas)}attachInteractions(){if(this.options.plugins?.tooltip?.enabled===!1)return;this.canvas.addEventListener("mousemove",this.boundMove),this.canvas.addEventListener("mouseleave",this.boundLeave)}syncCanvasSize(){let t=typeof window<"u"?window.devicePixelRatio||1:1,i=this.canvas.getBoundingClientRect(),n=i.width||this.canvas.clientWidth||this.canvas.width,e=i.height||this.canvas.clientHeight||this.canvas.height,a=Math.max(1,Math.floor(n*t)),s=Math.max(1,Math.floor(e*t));if(this.canvas.width!==a)this.canvas.width=a;if(this.canvas.height!==s)this.canvas.height=s;return this.ctx.setTransform(t,0,0,t,0,0),{width:n,height:e}}render(){let{width:t,height:i}=this.syncCanvasSize();if(this.ctx.clearRect(0,0,t,i),this.hitItems=[],this.type==="doughnut"||this.type==="pie"){this.renderRadial(t,i);return}if(this.type==="radar"){this.renderCartesian(t,i,"line");return}this.renderCartesian(t,i,this.type)}renderCartesian(t,i,n){let e=this.data.labels??[],a=this.data.datasets,s=this.layoutLegend(t,i),r=8+(this.options.plugins?.title?.display?24:0)+(s.position==="top"?s.h:0),o=28+(s.position==="bottom"?s.h:0),l=48+(s.position==="left"?s.w:0),d=16+(s.position==="right"?s.w:0)+(this.hasRightAxis()?40:0),u={x:l,y:r,w:Math.max(1,t-l-d),h:Math.max(1,i-r-o)};if(this.options.plugins?.title?.display&&this.options.plugins.title.text){let h=this.options.plugins.title;this.ctx.fillStyle=h.color??C,this.ctx.font=`${h.font?.size??14}px system-ui, sans-serif`,this.ctx.textAlign="center",this.ctx.textBaseline="top",this.ctx.fillText(h.text??"",t/2,8)}this.drawLegend(s,a);let x=this.computeAxis(a.filter((h)=>(h.yAxisID??"y")==="y"),"y"),f=this.hasRightAxis()?this.computeAxis(a.filter((h)=>h.yAxisID==="y1"),"y1"):null;if(this.drawGridAndYAxis(u,x,"left"),f)this.drawYAxis(u,f,"right");if(this.drawXAxis(u,e),n==="bar")this.drawBars(u,e,a,x,f);else this.drawLines(u,e,a,x,f)}hasRightAxis(){return this.data.datasets.some((t)=>t.yAxisID==="y1")}computeAxis(t,i){let n=this.options.scales?.[i]??{},e=Number.POSITIVE_INFINITY,a=Number.NEGATIVE_INFINITY;if(n.stacked){let c=this.data.labels??[];for(let r=0;r<c.length;r++){let o=0,l=0;for(let d of t){let u=d.data[r]??0;if(u>=0)o+=u;else l+=u}if(o>a)a=o;if(l<e)e=l}}else for(let c of t)for(let r of c.data){if(r<e)e=r;if(r>a)a=r}if(!Number.isFinite(e))e=0;if(!Number.isFinite(a))a=1;if(n.beginAtZero!==!1&&e>0)e=0;if(n.min!==void 0)e=n.min;if(n.max!==void 0)a=n.max;if(e===a)a=e+1;let s=R(e,a,n.ticks?.maxTicksLimit??6);return{ticks:s,min:s[0]??e,max:s[s.length-1]??a}}drawGridAndYAxis(t,i,n){let e=this.options.scales?.y??{},a=e.grid?.display!==!1,s=e.ticks?.color??C,c=e.grid?.color??Z;this.ctx.save(),this.ctx.font=`${e.ticks?.font?.size??11}px system-ui, sans-serif`,this.ctx.textBaseline="middle";for(let r of i.ticks){let o=this.scaleY(t,i,r);if(a)this.ctx.strokeStyle=c,this.ctx.lineWidth=1,this.ctx.beginPath(),this.ctx.moveTo(t.x,o),this.ctx.lineTo(t.x+t.w,o),this.ctx.stroke();let l=e.ticks?.callback?e.ticks.callback(r,i.ticks.indexOf(r),i.ticks):v(r);this.ctx.fillStyle=s,this.ctx.textAlign=n==="left"?"right":"left";let d=n==="left"?t.x-8:t.x+t.w+8;this.ctx.fillText(String(l),d,o)}this.ctx.restore()}drawYAxis(t,i,n){let e=this.options.scales?.y1??{},a=e.ticks?.color??C;this.ctx.save(),this.ctx.font=`${e.ticks?.font?.size??11}px system-ui, sans-serif`,this.ctx.textBaseline="middle";for(let s of i.ticks){let c=this.scaleY(t,i,s),r=e.ticks?.callback?e.ticks.callback(s,i.ticks.indexOf(s),i.ticks):v(s);this.ctx.fillStyle=a,this.ctx.textAlign=n==="left"?"right":"left";let o=n==="left"?t.x-8:t.x+t.w+8;this.ctx.fillText(String(r),o,c)}this.ctx.restore()}drawXAxis(t,i){let n=this.options.scales?.x??{},e=n.ticks?.color??C;if(n.display===!1||i.length===0)return;this.ctx.save(),this.ctx.font=`${n.ticks?.font?.size??11}px system-ui, sans-serif`,this.ctx.textBaseline="top",this.ctx.textAlign="center",this.ctx.fillStyle=e;let a=Math.min(i.length,Math.max(2,Math.floor(t.w/60))),s=Math.max(1,Math.floor(i.length/a));for(let c=0;c<i.length;c+=s){let r=this.scaleX(t,i.length,c);this.ctx.fillText(i[c]??"",r,t.y+t.h+8)}this.ctx.restore()}scaleX(t,i,n){if(i<=1)return t.x+t.w/2;return N().domain([0,i-1]).range([t.x,t.x+t.w])(n)}scaleY(t,i,n){if(i.max===i.min)return t.y+t.h/2;return N().domain([i.min,i.max]).range([t.y+t.h,t.y])(n)}drawLines(t,i,n,e,a){n.forEach((s,c)=>{let r=s.yAxisID==="y1"&&a?a:e;if(s.type==="bar"){this.drawBarSeries(t,i,[s],e,a);return}let o=(typeof s.borderColor==="string"?s.borderColor:null)??y(c),l=s.backgroundColor&&typeof s.backgroundColor==="string"?s.backgroundColor:s.fill?B(o,0.15):null,d=s.data.map((h,b)=>({x:this.scaleX(t,i.length||s.data.length,b),y:this.scaleY(t,r,h),value:h}));if(d.length===0)return;let u=(s.tension??0)>0?V:G;if(l){let h=t.y+t.h,b=X().x((p)=>p.x).y0(()=>h).y1((p)=>p.y).curve(u).context(this.ctx);this.ctx.beginPath(),b(d),this.ctx.fillStyle=l,this.ctx.fill(),b.context(null)}let x=U().x((h)=>h.x).y((h)=>h.y).curve(u).context(this.ctx);this.ctx.beginPath(),x(d),this.ctx.lineWidth=s.borderWidth??2,this.ctx.strokeStyle=o,this.ctx.lineJoin="round",this.ctx.lineCap="round",this.ctx.stroke(),x.context(null);let f=s.pointRadius??0;if(f>0){this.ctx.fillStyle=s.pointBackgroundColor??o;for(let h of d)this.ctx.beginPath(),this.ctx.arc(h.x,h.y,f,0,Math.PI*2),this.ctx.fill()}d.forEach((h,b)=>{this.hitItems.push({datasetIndex:c,dataIndex:b,x:h.x,y:h.y,label:i[b]??String(b),value:h.value})})})}drawBars(t,i,n,e,a){this.drawBarSeries(t,i,n,e,a)}drawBarSeries(t,i,n,e,a){let s=i.length||(n[0]?.data.length??0);if(s===0)return;let r=!!this.options.scales?.y?.stacked,o=Array.from({length:s},(x,f)=>f),l=J().domain(o).range([t.x,t.x+t.w]).paddingInner(0.3),d=l.bandwidth(),u=r?d:d/Math.max(1,n.length);for(let x=0;x<s;x++){let f=l(x),h=0,b=0;n.forEach((p,k)=>{let A=p.yAxisID==="y1"&&a?a:e,m=p.data[x]??0,g=r?m>=0?h:b:0,w=g+m,L=this.scaleY(t,A,g),T=this.scaleY(t,A,w),I=r?f:f+k*u,S=Math.min(L,T),D=Math.abs(T-L),O=Array.isArray(p.backgroundColor)?p.backgroundColor[x]??y(k):typeof p.backgroundColor==="string"?p.backgroundColor:y(k);if(this.ctx.fillStyle=O,this.ctx.fillRect(I,S,Math.max(1,u-2),D),p.borderWidth&&p.borderColor&&typeof p.borderColor==="string")this.ctx.lineWidth=p.borderWidth,this.ctx.strokeStyle=p.borderColor,this.ctx.strokeRect(I,S,Math.max(1,u-2),D);if(r)if(m>=0)h=w;else b=w;this.hitItems.push({datasetIndex:k,dataIndex:x,x:I+u/2,y:S,label:i[x]??String(x),value:m})})}}renderRadial(t,i){let n=this.data.datasets;if(n.length===0)return;let e=n[0];if(!e)return;let a=this.data.labels??[],s=this.layoutLegend(t,i),c=t,r=i,o=0,l=0;if(s.position==="right")c=t-s.w;else if(s.position==="left")c=t-s.w,o=s.w;else if(s.position==="top")r=i-s.h,l=s.h;else if(s.position==="bottom")r=i-s.h;this.drawLegend(s,n.map((m,g)=>({...m,label:a[g]??m.label})),a);let d=o+c/2,u=l+r/2,x=Math.min(c,r)/2-8,f=this.options.cutout,h=typeof f==="string"&&f.endsWith("%")?Number.parseFloat(f)/100:this.type==="doughnut"?0.6:0,b=x*h,k=j().value((m)=>Math.max(0,m||0)).startAngle(-Math.PI/2).endAngle(-Math.PI/2+Math.PI*2).sort(null)(e.data),A=_().innerRadius(b).outerRadius(x);this.ctx.save(),this.ctx.translate(d,u);for(let m of k){let g=m.index,w=e.data[g]??0,L=Array.isArray(e.backgroundColor)?e.backgroundColor[g]??y(g):typeof e.backgroundColor==="string"?e.backgroundColor:y(g);this.ctx.beginPath(),A.context(this.ctx)(m),this.ctx.fillStyle=L,this.ctx.fill();let T=(m.startAngle+m.endAngle)/2-Math.PI/2,I=(x+b)/2;this.hitItems.push({datasetIndex:0,dataIndex:g,x:d+Math.cos(T)*I,y:u+Math.sin(T)*I,label:a[g]??String(g),value:w})}this.ctx.restore(),A.context(null)}layoutLegend(t,i){let n=this.options.plugins?.legend;if(n?.display===!1||!this.data.datasets.some((a)=>a.label))return{w:0,h:0,position:"none"};let e=n?.position??"top";if(e==="left"||e==="right")return{w:100,h:0,position:e};return{w:0,h:Math.max(24,Math.ceil(this.data.datasets.length/4)*18+8),position:e}}drawLegend(t,i,n){if(t.position==="none")return;let e=this.options.plugins?.legend,a=n&&(this.type==="pie"||this.type==="doughnut")?n.map((r,o)=>{let l=i[0],d=Array.isArray(l?.backgroundColor)?l.backgroundColor[o]??y(o):typeof l?.backgroundColor==="string"?l.backgroundColor:y(o);return{label:r,color:d}}):i.map((r,o)=>({label:r.label??`Dataset ${o+1}`,color:typeof r.borderColor==="string"?r.borderColor:Array.isArray(r.backgroundColor)?r.backgroundColor[0]??y(o):typeof r.backgroundColor==="string"?r.backgroundColor:y(o)}));if(a.length===0)return;this.ctx.save(),this.ctx.font=`${e?.labels?.font?.size??12}px system-ui, sans-serif`,this.ctx.fillStyle=e?.labels?.color??C,this.ctx.textBaseline="middle";let s=e?.labels?.boxWidth??12,c=e?.labels?.padding??8;if(t.position==="top"||t.position==="bottom"){let r=t.position==="top"?12:(this.canvas.clientHeight||0)-12,o=c;this.ctx.textAlign="left";for(let l of a)this.ctx.fillStyle=l.color,this.ctx.fillRect(o,r-s/2,s,s),o+=s+4,this.ctx.fillStyle=e?.labels?.color??C,this.ctx.fillText(l.label,o,r),o+=this.ctx.measureText(l.label).width+c*2}else{let r=t.position==="right"?(this.canvas.clientWidth||0)-110:8,o=c+6;for(let l of a)this.ctx.fillStyle=l.color,this.ctx.fillRect(r,o-s/2,s,s),this.ctx.fillStyle=e?.labels?.color??C,this.ctx.textAlign="left",this.ctx.fillText(l.label,r+s+4,o),o+=18}this.ctx.restore()}handleMouseMove(t){if(this.hitItems.length===0)return;let i=this.canvas.getBoundingClientRect(),n=t.clientX-i.left,e=t.clientY-i.top;if((this.options.interaction?.mode??this.options.plugins?.tooltip?.mode??"nearest")==="index"){let r=this.findClosestByIndex(n);if(r)this.showTooltip(t.clientX,t.clientY,r);else this.hideTooltip();return}let s=null,c=Number.POSITIVE_INFINITY;for(let r of this.hitItems){let o=r.x-n,l=r.y-e,d=o*o+l*l;if(d<c)c=d,s=r}if(s&&c<3600)this.showTooltip(t.clientX,t.clientY,[s]);else this.hideTooltip()}findClosestByIndex(t){let i=-1,n=Number.POSITIVE_INFINITY;for(let e of this.hitItems){let a=Math.abs(e.x-t);if(a<n)n=a,i=e.dataIndex}if(i<0)return null;return this.hitItems.filter((e)=>e.dataIndex===i)}showTooltip(t,i,n){if(!this.tooltipEl)this.tooltipEl=document.createElement("div"),Object.assign(this.tooltipEl.style,{position:"fixed",pointerEvents:"none",background:this.options.plugins?.tooltip?.backgroundColor??q,color:this.options.plugins?.tooltip?.bodyColor??"#fff",padding:"6px 10px",borderRadius:"6px",font:"12px system-ui, sans-serif",zIndex:"9999",whiteSpace:"pre-line",transform:"translate(8px, 8px)"}),document.body.appendChild(this.tooltipEl);let e=this.options.plugins?.tooltip?.callbacks,a=[];n.forEach((o)=>{let l=this.data.datasets[o.datasetIndex];if(!l)return;let d={dataset:l,datasetIndex:o.datasetIndex,dataIndex:o.dataIndex,parsed:{y:o.value},raw:o.value,label:o.label,formattedValue:v(o.value)},u=e?.label?e.label(d):`${l.label??""}: ${v(o.value)}`,x=Array.isArray(u)?u.join(`
|
|
3
|
+
`):u;a.push(x)});let s=e?.title?e.title(n.flatMap((o)=>{let l=this.data.datasets[o.datasetIndex];if(!l)return[];return[{dataset:l,datasetIndex:o.datasetIndex,dataIndex:o.dataIndex,parsed:{y:o.value},raw:o.value,label:o.label,formattedValue:v(o.value)}]})):n[0]?.label,c=Array.isArray(s)?s.join(`
|
|
4
|
+
`):s;if(this.tooltipEl.textContent="",c){let o=document.createElement("strong");o.textContent=c,this.tooltipEl.appendChild(o),this.tooltipEl.appendChild(document.createElement("br"))}let r=document.createTextNode(a.join(`
|
|
5
|
+
`));this.tooltipEl.appendChild(r),this.tooltipEl.style.left=`${t}px`,this.tooltipEl.style.top=`${i}px`,this.tooltipEl.style.display="block"}hideTooltip(){if(this.tooltipEl)this.tooltipEl.style.display="none"}}var ht=E,lt=[];export{E as Chart,M as DEFAULT_PALETTE,ht as default,v as formatTick,R as niceTicks,y as paletteColor,lt as registerables,B as withAlpha};
|
package/package.json
CHANGED