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