bezel-charts 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -9
- package/dist/bezel-charts.iife.js +9 -9
- package/dist/bezel-charts.js +272 -44
- package/dist/bezel-charts.min.js +9 -9
- package/package.json +4 -4
- package/src/charts/bars.js +16 -5
- package/src/charts/donut.js +9 -1
- package/src/charts/gauge.js +8 -0
- package/src/charts/heatmap.js +22 -5
- package/src/charts/line.js +27 -5
- package/src/charts/progress.js +9 -0
- package/src/charts/ring.js +7 -0
- package/src/charts/scatter.js +20 -4
- package/src/charts/spark.js +5 -0
- package/src/core/util.js +57 -6
- package/src/element.js +114 -16
- package/src/index.js +1 -1
- package/src/render.js +14 -1
package/dist/bezel-charts.min.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
/*! Bezel Charts v1.
|
|
2
|
-
var _t={dark:{tile:"#15151d",bezel:"#000000",fg:"#f2f1f7",muted:"#8c8aa0",grid:"#2a2935",up:"#5EE6C8",down:"#F675A8",palette:["#9FA1FF","#F675A8","#5EE6C8","#FFC857","#7CC4FF","#FF8A5B"]},light:{tile:"#ffffff",bezel:"#000000",fg:"#17161f",muted:"#6b6980",grid:"#e8e6ef",up:"#12a383",down:"#d63f7c",palette:["#6E70F0","#E2508C","#16A884","#D99A0E","#2F8FE0","#EE6431"]}};var tt="ui-sans-serif,system-ui,-apple-system,'Segoe UI',Roboto,Helvetica,Arial,sans-serif",lt="ui-monospace,SFMono-Regular,Menlo,Consolas,monospace",Ne=0;function Ht(t){return"bzc"+t+(++Ne).toString(36)+Math.random().toString(36).slice(2,6)}function ut(t){return String(t??"").replace(/[&<>"']/g,function(e){return{"&":"&","<":"<",">":">",'"':""","'":"'"}[e]})}function a(t){return Math.round(t*100)/100}function X(t,e,r){return Math.max(e,Math.min(r,t))}function _(t,e){var r=parseFloat(t);return isFinite(r)?r:e}function O(t){return t!=null&&t!==""}function ct(t){return Array.isArray(t)?t.map(function(e){var r=+e;return isFinite(r)?r:0}):O(t)?String(t).split(/[\s,;]+/).filter(Boolean).map(function(e){var r=+e;return isFinite(r)?r:0}):[]}function Z(t){return Array.isArray(t)?t.map(String):O(t)?String(t).split(",").map(function(e){return e.trim()}):[]}function Ct(t){return Array.isArray(t)?Array.isArray(t[0])?t.map(ct):[ct(t)]:O(t)?String(t).split("|").map(ct).filter(function(e){return e.length}):[]}function Lt(t){return t.reduce(function(e,r){return e+r},0)}function vt(t,e,r){return String(t).length*e*(r?.6:.56)}function Nt(t,e){return t=String(t),t.length>e?t.slice(0,Math.max(1,e-1))+"\u2026":t}function J(t){return t===!0||t===""||t==="true"||t==="1"}function g(t,e,r){if(!isFinite(t))return"\u2013";var i=Math.abs(t),l;O(e.decimals)?l=X(parseInt(e.decimals,10)||0,0,6):l=t%1===0?0:i<10?2:i<100?1:0;var n={maximumFractionDigits:l,minimumFractionDigits:O(e.decimals)?l:0};(J(e.compact)||r)&&i>=1e4&&(n={notation:"compact",maximumFractionDigits:1});var s;try{s=new Intl.NumberFormat(e.lang||"en-GB",n).format(i)}catch{s=String(a(i))}return(t<0?"\u2212":"")+(e.prefix||"")+s+(e.suffix||"")}function qt(t,e,r){if(t===e)if(t===0)e=1;else{var i=Math.abs(t)*.1;t-=i,e+=i}for(var l=(e-t)/(r||4),n=Math.pow(10,Math.floor(Math.log10(l))),s=l/n,o=(s<=1?1:s<=2?2:s<=5?5:10)*n,c=Math.floor(t/o)*o,A=Math.ceil(e/o)*o,x=[],y=c;y<=A+o/2;y+=o)x.push(+y.toFixed(10));return{lo:c,hi:A,ticks:x}}function jt(t,e){if(!t.length)return"";for(var r="M"+a(t[0][0])+","+a(t[0][1]),i=1;i<t.length;i++){var l=t[i-1],n=t[i];if(e)r+="L"+a(n[0])+","+a(n[1]);else{var s=(l[0]+n[0])/2;r+="C"+a(s)+","+a(l[1])+" "+a(s)+","+a(n[1])+" "+a(n[0])+","+a(n[1])}}return r}function M(t,e,r,i){return'<text x="'+a(t)+'" y="'+a(e)+'" '+(i||"")+">"+ut(r)+"</text>"}function H(t,e,r,i){return'fill="'+(i||t.muted)+'" font-family="'+lt+'" font-size="'+(e||10)+'"'+(r?" "+r:"")}function pt(t,e,r,i,l){return'<rect class="bzc-hit" x="'+a(t)+'" y="'+a(e)+'" width="'+a(Math.max(1,r))+'" height="'+a(Math.max(1,i))+'" fill="#000" fill-opacity="0" data-tip="'+ut(l)+'"/>'}function ot(t,e,r){return t.animate?' class="'+e+'"'+(r?' style="animation-delay:'+a(r)+'s"':""):""}function at(t,e){var r=Z(t.color).filter(Boolean);return r.length?r:e.palette}function nt(t,e,r,i,l){return M(e+i/2,r+l/2+4,"No data yet",'text-anchor="middle" fill="'+t.muted+'" font-family="'+tt+'" font-size="13"')}function It(t,e){return O(t.notes)?String(t.notes).split(";").map(function(r){var i=r.indexOf(":");if(i<0)return null;var l=r.slice(0,i).trim(),n=r.slice(i+1).trim(),s=e.map(String).indexOf(l);return s<0&&String(parseInt(l,10))===l&&(s=parseInt(l,10)),s>=0&&n?{i:s,text:n}:null}).filter(Boolean):[]}function At(t,e,r,i,l){var n=(O(t.goalLabel)?t.goalLabel:"Goal")+" "+g(_(t.goal,0),t);return'<line x1="'+a(r)+'" x2="'+a(i)+'" y1="'+a(l)+'" y2="'+a(l)+'" stroke="'+e.fg+'" stroke-opacity=".55" stroke-width="1.25" stroke-dasharray="4 4"/>'+M(i,l-5,n,H(e,10,'text-anchor="end"'))}function xt(t,e,r){var i=String(O(e.stat)?e.stat:r||"").toLowerCase();if(!i||i==="none"||!t.length)return null;var l=Lt(t),n={last:t[t.length-1],total:l,sum:l,average:l/t.length,avg:l/t.length,max:Math.max.apply(null,t),min:Math.min.apply(null,t)};if(!(i in n))return null;var s=null;return i==="last"&&t.length>1&&e.delta!=="none"&&(s=t[t.length-1]-t[0]),{val:n[i],delta:s}}function Rt(t,e,r,i,l,n){var s=i,o=l,c="";return t.forEach(function(A,x){var y=13+vt(A,12)+16;s>i&&s+y-16>i+n&&(s=i,o+=20),c+='<circle cx="'+a(s+4)+'" cy="'+a(o+6)+'" r="4" fill="'+e[x%e.length]+'"/>'+M(s+13,o+10,A,'fill="'+r.fg+'" font-family="'+tt+'" font-size="12"'),s+=y}),{svg:c,height:o-l+24}}function Se(t){return Math.max.apply(null,t.map(function(e){return vt(e,10,!0)}))+10}function Bt(t){var e=Math.round(X(_(t.width,360),160,2400)),r=t.frame==="none"?0:4,i=t.frame==="none"?8:20;return{W:e,b:r,P:i,w:e-2*(r+i)}}var Re=".bzc-a{animation:bzc-in .6s ease both}.bzc-d{animation:bzc-draw 1.1s cubic-bezier(.3,.7,.2,1) both}.bzc-g{transform-box:fill-box;transform-origin:50% 100%;animation:bzc-grow .7s cubic-bezier(.2,.8,.2,1) both}.bzc-gn{transform-box:fill-box;transform-origin:50% 0;animation:bzc-grow .7s cubic-bezier(.2,.8,.2,1) both}.bzc-gx{transform-box:fill-box;transform-origin:0 50%;animation:bzc-growx .8s cubic-bezier(.2,.8,.2,1) both}.bzc-s{animation:bzc-sweep 1.1s cubic-bezier(.2,.8,.2,1) both}@keyframes bzc-in{from{opacity:0}}@keyframes bzc-draw{from{stroke-dashoffset:1}}@keyframes bzc-grow{from{transform:scaleY(0)}}@keyframes bzc-growx{from{transform:scaleX(0)}}@keyframes bzc-sweep{from{stroke-dasharray:0 100}}@media (prefers-reduced-motion:reduce){[class^=bzc-]{animation:none!important}}";function it(t,e,r,i,l){var n=Bt(t),s=n.W,o=n.b,c=n.P,A=n.w,x=X(_(t.corners,22),0,60),y=o+c,u="";O(t.heading)&&(u+=M(o+c,y+10,String(t.heading).toUpperCase(),H(e,11,'font-weight="600" letter-spacing="1.3"')),y+=24);var S=l&&l.stat;if(S){if(u+=M(o+c,y+30,g(S.val,t),'fill="'+e.fg+'" font-family="'+tt+'" font-size="32" font-weight="800" letter-spacing="-0.5"'),S.delta!=null){var F=S.delta>0,C=S.delta===0,T=t.delta==="inverse"?!F:F,k=C?e.muted:T?e.up:e.down,E=(C?"\u25CF ":F?"\u25B2 ":"\u25BC ")+g(Math.abs(S.delta),t)+" "+(O(t.deltaLabel)?t.deltaLabel:"since start");u+=M(o+c+A,y+28,E,'text-anchor="end" fill="'+k+'" font-family="'+lt+'" font-size="11" font-weight="600"')}y+=44}var f=i(o+c,y,A,r),R=Math.round(y+r+c+o),v="";t.frame!=="none"?v='<rect width="'+s+'" height="'+R+'" rx="'+x+'" fill="'+e.bezel+'"/><rect x="'+o+'" y="'+o+'" width="'+(s-2*o)+'" height="'+(R-2*o)+'" rx="'+Math.max(0,x-o)+'" fill="'+(t.background||e.tile)+'"/>':O(t.background)&&(v='<rect width="'+s+'" height="'+R+'" rx="'+x+'" fill="'+t.background+'"/>');var b=(O(t.heading)?t.heading+": ":"")+(l&&l.summary||"chart");return'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 '+s+" "+R+'" width="'+s+'" height="'+R+'" role="img" aria-label="'+ut(b)+'"><title>'+ut(b)+"</title>"+(t.animate?"<style>"+Re+"</style>":"")+v+u+f+"</svg>"}function le(t,e){var r=ct(t.values),i=at(t,e)[0],l=_(t.height,64),n=Z(t.labels),s=It(t,n),o=xt(r,t,"last");return it(t,e,l,function(c,A,x,y){if(!r.length)return nt(e,c,A,x,y);var u=r.length===1?[r[0],r[0]]:r,S=Math.min.apply(null,u),F=Math.max.apply(null,u);O(t.goal)&&(S=Math.min(S,+t.goal),F=Math.max(F,+t.goal));var C=(F-S||Math.abs(F)||1)*.12;S-=C,F+=C;var T=function(m){return c+m*x/(u.length-1)},k=function(m){return A+y-(m-S)/(F-S)*y},E=u.map(function(m,h){return[T(h),k(m)]}),f=jt(E,J(t.straight)),R=Ht("g"),v=E[E.length-1],b='<defs><linearGradient id="'+R+'" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="'+i+'" stop-opacity=".32"/><stop offset="1" stop-color="'+i+'" stop-opacity="0"/></linearGradient></defs>';[1/3,2/3].forEach(function(m){b+='<line x1="'+c+'" x2="'+(c+x)+'" y1="'+a(A+y*m)+'" y2="'+a(A+y*m)+'" stroke="'+e.grid+'" stroke-dasharray="2 4"/>'}),b+='<path d="'+f+"L"+a(v[0])+","+(A+y)+"L"+c+","+(A+y)+'Z" fill="url(#'+R+')"'+ot(t,"bzc-a")+"/>",b+='<path d="'+f+'" fill="none" stroke="'+i+'" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" pathLength="1" style="stroke-dasharray:1"'+ot(t,"bzc-d")+"/>",O(t.goal)&&(b+=At(t,e,c,c+x,k(+t.goal))),s.forEach(function(m){if(!(m.i>=r.length)){var h=E[m.i];b+='<circle cx="'+a(h[0])+'" cy="'+a(h[1])+'" r="3.5" fill="'+e.fg+'"/>'+M(X(h[0],c+30,c+x-30),h[1]-9,m.text,H(e,10,'text-anchor="middle"',e.fg))}}),b+='<circle cx="'+a(v[0])+'" cy="'+a(v[1])+'" r="9" fill="'+i+'" fill-opacity=".25"/><circle cx="'+a(v[0])+'" cy="'+a(v[1])+'" r="4.5" fill="'+i+'"/>',J(t.showValues)&&E.forEach(function(m,h){h<r.length&&(b+=M(m[0],m[1]-8,g(r[h],t,!0),H(e,9,'text-anchor="middle"')))});var N=r.length>1?x/(r.length-1):x;return r.forEach(function(m,h){b+=pt(T(h)-N/2,A-6,N,y+12,(n[h]||"#"+(h+1))+": "+g(m,t))}),b},{stat:o,summary:r.length?"latest "+g(r[r.length-1],t):"no data"})}function oe(t,e){var r=Ct(t.values),i=Z(t.series),l=Z(t.labels),n=at(t,e),s=_(t.height,170),o=Math.max.apply(null,[0].concat(r.map(function(y){return y.length}))),c=It(t,l),A=r.length>1||i.length>0,x=xt(r[0]||[],t,"");return it(t,e,s,function(y,u,S,F){if(!o)return nt(e,y,u,S,F);var C="",T=u;if(A){var k=Rt(r.map(function(w,z){return i[z]||"Series "+(z+1)}),n,e,y,T,S);C+=k.svg,T+=k.height}var E=[].concat.apply([],r),f=Math.min.apply(null,E),R=Math.max.apply(null,E);O(t.goal)&&(f=Math.min(f,+t.goal),R=Math.max(R,+t.goal)),J(t.zero)&&(f=Math.min(0,f),R=Math.max(0,R));var v=qt(f,R,4),b=v.ticks.map(function(w){return g(w,t,!0)}),N=Math.max.apply(null,b.map(function(w){return vt(w,10,!0)}))+10,m=l.length?20:4,h=y+N,I=S-N,p=F-(T-u)-m,D=function(w){return o===1?h+I/2:h+w*I/(o-1)},L=function(w){return T+p-(w-v.lo)/(v.hi-v.lo)*p};if(v.ticks.forEach(function(w,z){var $=L(w);C+='<line x1="'+a(h)+'" x2="'+a(h+I)+'" y1="'+a($)+'" y2="'+a($)+'" stroke="'+e.grid+'"'+(w===0?"":' stroke-dasharray="2 4"')+"/>"+M(h-8,$+3.5,b[z],H(e,10,'text-anchor="end"'))}),l.length){for(var U=Math.max(1,Math.ceil(o*(Math.max.apply(null,l.map(function(w){return vt(w,10,!0)}))+10)/I)),W=0;W<o;W+=U)if(l[W]!=null){var q=o>1&&W===0?"start":o>1&&W===o-1?"end":"middle";C+=M(D(W),T+p+15,l[W],H(e,10,'text-anchor="'+q+'"'))}}c.forEach(function(w){if(!(w.i>=o)){var z=D(w.i);C+='<line x1="'+a(z)+'" x2="'+a(z)+'" y1="'+a(T+12)+'" y2="'+a(T+p)+'" stroke="'+e.fg+'" stroke-opacity=".4" stroke-dasharray="3 3"/>'+M(X(z,h+30,h+I-30),T+8,w.text,H(e,10,'text-anchor="middle"',e.fg))}}),r.forEach(function(w,z){var $=n[z%n.length],G=w.map(function(mt,B){return[D(B),L(mt)]});G.length===1&&(G=[[h,G[0][1]],[h+I,G[0][1]]]);var dt=jt(G,J(t.straight));if(z===0){var ht=Ht("g"),et=G[G.length-1];C+='<defs><linearGradient id="'+ht+'" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="'+$+'" stop-opacity=".26"/><stop offset="1" stop-color="'+$+'" stop-opacity="0"/></linearGradient></defs><path d="'+dt+"L"+a(et[0])+","+a(T+p)+"L"+a(G[0][0])+","+a(T+p)+'Z" fill="url(#'+ht+')"'+ot(t,"bzc-a")+"/>"}C+='<path d="'+dt+'" fill="none" stroke="'+$+'" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" pathLength="1" style="stroke-dasharray:1'+(t.animate?";animation-delay:"+z*.15+"s":"")+'"'+(t.animate?' class="bzc-d"':"")+"/>";var ft=G[G.length-1];C+='<circle cx="'+a(ft[0])+'" cy="'+a(ft[1])+'" r="4" fill="'+$+'" stroke="'+(t.background||e.tile)+'" stroke-width="2"/>',J(t.showValues)&&w.forEach(function(mt,B){C+=M(D(B),L(mt)-8,g(mt,t,!0),H(e,9,'text-anchor="middle"'))})}),O(t.goal)&&(C+=At(t,e,h,h+I,L(+t.goal)));for(var st=o>1?I/(o-1):I,Q=0;Q<o;Q++){var d=l[Q]||"#"+(Q+1);r.forEach(function(w,z){Q<w.length&&(d+=`
|
|
3
|
-
`+(
|
|
4
|
-
`+
|
|
5
|
-
Total: `+g(C[d],t):""):m(d)+": "+g(u[d],t)},I=Bt(t),p=c||i.length?Rt(r.map(function(d,w){return v(w)}),n,e,0,0,I.w).height:0,D=x?1:s,L=c&&!x,U=L?10:14,W=3,q=A?D*U+(D-1)*W+(L?14:16):0,st=A?p+Math.max(1,o)*q-6:_(t.height,140)+p,Q=u.indexOf(Math.max.apply(null,u.length?u:[0]));return it(t,e,st,function(d,w,z,$){if(!o)return nt(e,d,w,z,$);var G="",dt=w;p&&(G+=Rt(r.map(function(P,j){return v(j)}),n,e,d,w,z).svg,dt+=p);var ht=Math.min(0,Math.min.apply(null,f)),et=Math.max(0,R);if(O(t.goal)&&(ht=Math.min(ht,+t.goal),et=Math.max(et,+t.goal)),et===ht&&(et=ht+1),A){for(var ft=l.length?Math.min(z*.4,Math.max.apply(null,l.map(function(P){return vt(P,12)}))+10):0,mt=x?[C.map(function(P){return g(P,t)})]:r.map(function(P){return P.map(function(j){return g(j,t)})}),B=Math.max.apply(null,[].concat.apply([],mt).map(function(P){return vt(P,L?10:11,!0)}))+10,Y=d+ft,V=z-ft-B,kt=Math.max(et,0)||1,K=0;K<o;K++){var bt=dt+K*q;l[K]!=null&&(G+=M(d,bt+(q-6)/2+4,Nt(l[K],Math.floor(ft/6.7)),'fill="'+e.fg+'" font-family="'+tt+'" font-size="12"')),x?(G+=Dt(K,Y,bt+5,V,kt),G+=M(d+z,bt+5+U/2+3.8,mt[0][K],'text-anchor="end" fill="'+e.fg+'" font-family="'+lt+'" font-size="11" font-weight="600"')):r.forEach(function(P,j){if(!(K>=P.length)){var rt=P[K],yt=bt+(c?2:5)+j*(U+W),wt=Math.max(0,rt)/kt*V;c||(G+='<rect x="'+a(Y)+'" y="'+a(yt)+'" width="'+a(V)+'" height="'+U+'" rx="'+U/2+'" fill="'+e.grid+'" fill-opacity=".6"/>'),wt>0&&(G+='<rect x="'+a(Y)+'" y="'+a(yt)+'" width="'+a(Math.max(U,wt))+'" height="'+U+'" rx="'+U/2+'" fill="'+b(j,K)+'" fill-opacity="'+N(rt)+'"'+ot(t,"bzc-gx",K*.06+j*.03)+"/>"),G+=M(d+z,yt+U/2+3.8,mt[j][K],'text-anchor="end" fill="'+e.fg+'" font-family="'+lt+'" font-size="'+(c?10:11)+'" font-weight="600"')}}),G+=pt(d,bt,z,q-6,h(K))}if(O(t.goal)&&+t.goal>0){var Ot=Y+ +t.goal/kt*V;G+='<line x1="'+a(Ot)+'" x2="'+a(Ot)+'" y1="'+a(dt-2)+'" y2="'+a(w+$+2)+'" stroke="'+e.fg+'" stroke-opacity=".55" stroke-dasharray="3 3"/>'}return G}function Dt(P,j,rt,yt,wt){var zt='<rect x="'+a(j)+'" y="'+a(rt)+'" width="'+a(yt)+'" height="'+U+'" rx="'+U/2+'" fill="'+e.grid+'" fill-opacity=".6"/>',Pt=0;return r.forEach(function(Wt,St){var Ut=P<Wt.length?Wt[P]:0,Et=Math.max(0,Ut)/wt*yt;if(!(Et<=0)){var Ft=Pt>0?1.5:0;zt+='<rect x="'+a(j+Pt+Ft)+'" y="'+a(rt)+'" width="'+a(Math.max(2,Et-Ft))+'" height="'+U+'" rx="'+a(Math.min(3,Et/2))+'" fill="'+b(St,P)+'"'+ot(t,"bzc-gx",P*.06+St*.03)+"/>",Pt+=Et}}),zt}var ve=l.length?Math.max.apply(null,l.map(function(P){return vt(P,10,!0)})):0,te=l.length?Math.max(1,Math.ceil(o*(ve+8)/z)):1,$t=J(t.angleLabels)&&te>1,xe=Ee*Math.PI/180,ye=function(P){return $t?Nt(P,Le):P};if($t){var Ae=z/o,Gt=0;l.forEach(function(P,j){Gt=Math.max(Gt,Math.cos(xe)*vt(ye(P),10,!0)+4-(j+.5)*Ae)}),Gt=Math.min(Gt,z*.25),d+=Gt,z-=Gt,te=1}var be=J(t.showValues)&&ht<0?14:0,Te=$t?Math.ceil(Math.sin(xe)*Math.min(ve,vt("x".repeat(Le),10,!0)))+18:20,Fe=(l.length?Te:2)+be,Me=J(t.showValues)?16:4,ee=$-(dt-w)-Fe-Me,ke=dt+Me,Mt=function(P){return ke+ee-(P-ht)/(et-ht)*ee},Yt=z/o,Vt=Math.min(Yt*(L?.78:.62),L?s*30:56),we=L?Math.min(3,Vt/s*.15):0,Tt=x?Vt:(Vt-we*(s-1))/s,Kt=Mt(0);G+='<line x1="'+d+'" x2="'+(d+z)+'" y1="'+a(Kt)+'" y2="'+a(Kt)+'" stroke="'+e.grid+'"/>';for(var gt=0;gt<o;gt++){var re=d+gt*Yt+(Yt-Vt)/2;if(x?G+=Ce(gt,re):r.forEach(function(P,j){if(!(gt>=P.length)){var rt=P[gt],yt=re+j*(Tt+we),wt=Math.min(Mt(rt),Kt),zt=Math.abs(Mt(rt)-Kt);zt>.5&&(G+='<rect x="'+a(yt)+'" y="'+a(wt)+'" width="'+a(Tt)+'" height="'+a(zt)+'" rx="'+a(Math.min(6,Tt/2,zt/2))+'" fill="'+b(j,gt)+'" fill-opacity="'+N(rt)+'"'+ot(t,rt<0?"bzc-gn":"bzc-g",gt*.05+j*.03)+"/>"),J(t.showValues)&&(G+=M(yt+Tt/2,rt<0?Mt(rt)+12:Mt(rt)-5,g(rt,t,!0),'text-anchor="middle" fill="'+e.fg+'" font-family="'+lt+'" font-size="'+(c?9:10)+'" font-weight="600"'))}}),l[gt]!=null&>%te===0){var ae=re+Vt/2,ne=ke+ee+be+($t?12:15);G+=$t?M(ae,ne,ye(l[gt]),H(e,10,'text-anchor="end" transform="rotate(-'+Ee+" "+a(ae)+" "+a(ne)+')"')):M(ae,ne,l[gt],H(e,10,'text-anchor="middle"'))}G+=pt(d+gt*Yt,dt,Yt,$-(dt-w),h(gt))}return O(t.goal)&&(G+=At(t,e,d,d+z,Mt(+t.goal))),G;function Ce(P,j){var rt="",yt=0,wt=0;if(r.forEach(function(Pt,Wt){var St=P<Pt.length?Pt[P]:0;if(St){var Ut=St>0?yt:wt,Et=Ut+St;St>0?yt=Et:wt=Et;var Ft=Mt(Math.max(Ut,Et)),ie=Mt(Math.min(Ut,Et)),Xt=ie-Ft,ze=Ut!==0?Math.min(1.5,Xt/2):0;St>0?ie-=ze:Ft+=ze,Xt=ie-Ft,Xt>.5&&(rt+='<rect x="'+a(j)+'" y="'+a(Ft)+'" width="'+a(Tt)+'" height="'+a(Xt)+'" rx="'+a(Math.min(3,Tt/2,Xt/2))+'" fill="'+b(Wt,P)+'"'+ot(t,St<0?"bzc-gn":"bzc-g",P*.05+Wt*.03)+"/>")}}),J(t.showValues)){var zt=C[P];rt+=M(j+Tt/2,zt<0?Mt(k[P])+12:Mt(T[P])-5,g(zt,t,!0),'text-anchor="middle" fill="'+e.fg+'" font-family="'+lt+'" font-size="10" font-weight="600"')}return rt}},{stat:xt(u,t,""),summary:o?x?s+" series stacked across "+o+" groups":c?s+" series across "+o+" groups":"highest "+(l[Q]||"")+" "+g(u[Q],t):"no data"})}function fe(t,e){var r=ct(t.values),i=Z(t.labels),l=at(t,e),n=_(t.max,100)||100,s=_(t.height,140),o=!O(t.prefix)&&!O(t.suffix)&&n===100,c=function(x){return g(x,t)+(o?"%":"")},A=xt(r,t,"");return it(t,e,s,function(x,y,u,S){if(!r.length)return nt(e,x,y,u,S);var F="",C=r.length===1,T=Math.min(S,C?u:u*.55),k=C?x+u/2:x+T/2,E=y+S/2,f=C?T*.12:X(T*.42/(r.length*1.35),5,16),R=f*.38;if(r.forEach(function(m,h){var I=T/2-f/2-h*(f+R);if(!(I<=f/2)){var p=X(m/n*100,0,100),D=l[h%l.length];F+='<circle cx="'+a(k)+'" cy="'+a(E)+'" r="'+a(I)+'" fill="none" stroke="'+D+'" stroke-opacity=".16" stroke-width="'+a(f)+'"/>',p>0&&(F+='<circle cx="'+a(k)+'" cy="'+a(E)+'" r="'+a(I)+'" fill="none" stroke="'+D+'" stroke-width="'+a(f)+'" stroke-linecap="round" pathLength="100" transform="rotate(-90 '+a(k)+" "+a(E)+')" style="stroke-dasharray:'+a(p)+" 100"+(t.animate?";animation-delay:"+h*.12+"s":"")+'"'+(t.animate?' class="bzc-s"':"")+"/>"),F+='<circle cx="'+a(k)+'" cy="'+a(E)+'" r="'+a(I+f/2)+'" fill="#000" fill-opacity="0" class="bzc-hit" data-tip="'+ut((i[h]||"#"+(h+1))+": "+c(m)+(o?"":" of "+g(n,t)))+'"/>'}}),C)F+=M(k,E+T*.08,c(r[0]),'text-anchor="middle" fill="'+e.fg+'" font-family="'+tt+'" font-size="'+a(T*.22)+'" font-weight="800"'),i[0]&&(F+=M(k,E+T*.08+16,i[0],H(e,10,'text-anchor="middle"')));else{var v=x+T+22,b=Math.min(26,S/r.length),N=E-b*r.length/2;r.forEach(function(m,h){var I=N+h*b+b/2;F+='<circle cx="'+a(v+4)+'" cy="'+a(I)+'" r="4" fill="'+l[h%l.length]+'"/>'+M(v+14,I+4,Nt(i[h]||"#"+(h+1),Math.floor((x+u-v-60)/6.7)),'fill="'+e.fg+'" font-family="'+tt+'" font-size="12"')+M(x+u,I+4,c(m),'text-anchor="end" fill="'+e.fg+'" font-family="'+lt+'" font-size="11" font-weight="600"')})}return F},{stat:A,summary:r.map(function(x,y){return(i[y]?i[y]+" ":"")+c(x)}).join(", ")})}function ce(t,e){var r=ct(t.values).map(function(u){return Math.max(0,u)}),i=Z(t.labels),l=at(t,e),n=r.slice(),s=i.slice();if(n.length>6){var o=n.map(function(u,S){return S}).sort(function(u,S){return r[S]-r[u]}),c=o.slice(0,5).sort(function(u,S){return u-S});n=c.map(function(u){return r[u]}),s=c.map(function(u){return i[u]||"#"+(u+1)}),n.push(Lt(o.slice(5).map(function(u){return r[u]}))),s.push("Other")}var A=Lt(n),x=_(t.height,150),y=xt(n,t,"");return it(t,e,x,function(u,S,F,C){if(!A)return nt(e,u,S,F,C);var T="",k=Math.min(C,F*.5),E=u+k/2,f=S+C/2,R=k*.16,v=(k-R)/2,b=0,N=n.filter(Boolean).length>1?.9:0;n.forEach(function(p,D){var L=p/A*100;if(!(L<=0)){var U=Math.max(.01,L-N);T+='<circle cx="'+a(E)+'" cy="'+a(f)+'" r="'+a(v)+'" fill="none" stroke="'+l[D%l.length]+'" stroke-width="'+a(R)+'" pathLength="100" stroke-dasharray="'+a(U)+" "+a(100-U)+'" stroke-dashoffset="'+a(-b)+'" transform="rotate(-90 '+a(E)+" "+a(f)+')"'+ot(t,"bzc-a",D*.08)+"/>",b+=L}}),T+=M(E,f+2,g(A,t,!0),'text-anchor="middle" fill="'+e.fg+'" font-family="'+tt+'" font-size="'+a(k*.17)+'" font-weight="800"'),T+=M(E,f+2+14,(O(t.centerLabel)?t.centerLabel:"Total").toUpperCase(),H(e,9,'text-anchor="middle" letter-spacing="1"'));var m=u+k+22,h=Math.min(24,C/n.length),I=f-h*n.length/2;return n.forEach(function(p,D){var L=I+D*h+h/2,U=Math.round(p/A*100),W=(s[D]||"#"+(D+1))+": "+g(p,t)+" ("+U+"%)";T+='<circle cx="'+a(m+4)+'" cy="'+a(L)+'" r="4" fill="'+l[D%l.length]+'"/>'+M(m+14,L+4,Nt(s[D]||"#"+(D+1),Math.floor((u+F-m-50)/6.7)),'fill="'+e.fg+'" font-family="'+tt+'" font-size="12"')+M(u+F,L+4,U+"%",'text-anchor="end" fill="'+e.muted+'" font-family="'+lt+'" font-size="11" font-weight="600"')+pt(m,L-h/2,u+F-m,h,W)}),b=0,n.forEach(function(p,D){var L=p/A*100;L<=0||(T+='<circle cx="'+a(E)+'" cy="'+a(f)+'" r="'+a(v)+'" fill="none" stroke="#000" stroke-opacity="0" stroke-width="'+a(R)+'" pathLength="100" stroke-dasharray="'+a(L)+" "+a(100-L)+'" stroke-dashoffset="'+a(-b)+'" transform="rotate(-90 '+a(E)+" "+a(f)+')" class="bzc-hit" data-tip="'+ut((s[D]||"#"+(D+1))+": "+g(p,t)+" ("+Math.round(L)+"%)")+'"/>',b+=L)}),T},{stat:y,summary:"total "+g(A,t)+" across "+n.length+" parts"})}function ue(t,e){var r=ct(t.values),i=r.length?r[0]:_(t.value,NaN),l=Z(t.labels),n=_(t.min,0),s=_(t.max,100),o=_(t.height,130);s===n&&(s=n+1);var c=ct(t.zones),A=at(t,e),x=Z(t.color).filter(Boolean).length>1?A:[e.up,e.palette[3],e.down],y=A[0];if(c.length&&isFinite(i)){for(var u=0;u<c.length&&i>=c[u];)u++;y=x[Math.min(u,x.length-1)]}var S=!O(t.prefix)&&!O(t.suffix)&&n===0&&s===100,F=function(C){return g(C,t)+(S?"%":"")};return it(t,e,o,function(C,T,k,E){if(!isFinite(i))return nt(e,C,T,k,E);var f=Math.min(k/2,E-22),R=f*.16,v=f-R/2,b=C+k/2,N=T+f,m=X((i-n)/(s-n),0,1),h=function(q,st){var Q=Math.PI*(1-q);return[b+st*Math.cos(Q),N-st*Math.sin(Q)]},I="M"+a(b-v)+","+a(N)+"A"+a(v)+","+a(v)+" 0 0 1 "+a(b+v)+","+a(N),p='<path d="'+I+'" fill="none" stroke="'+y+'" stroke-opacity=".16" stroke-width="'+a(R)+'" stroke-linecap="round"/>';c.length&&c.forEach(function(q){var st=X((q-n)/(s-n),0,1),Q=h(st,v-R/2-3),d=h(st,v-R/2-8);p+='<line x1="'+a(Q[0])+'" y1="'+a(Q[1])+'" x2="'+a(d[0])+'" y2="'+a(d[1])+'" stroke="'+e.muted+'" stroke-width="1.5"/>'}),m>0&&(p+='<path d="'+I+'" fill="none" stroke="'+y+'" stroke-width="'+a(R)+'" stroke-linecap="round" pathLength="100" style="stroke-dasharray:'+a(m*100)+' 100"'+ot(t,"bzc-s")+"/>");var D=h(m,v);if(p+='<circle cx="'+a(D[0])+'" cy="'+a(D[1])+'" r="'+a(R*.26)+'" fill="'+(t.background||e.tile)+'"'+ot(t,"bzc-a",.9)+"/>",O(t.goal)){var L=X((+t.goal-n)/(s-n),0,1),U=h(L,v+R/2+4),W=h(L,v-R/2-4);p+='<line x1="'+a(U[0])+'" y1="'+a(U[1])+'" x2="'+a(W[0])+'" y2="'+a(W[1])+'" stroke="'+e.fg+'" stroke-width="2" stroke-linecap="round"/>'}return p+=M(b,N-f*.12,F(i),'text-anchor="middle" fill="'+e.fg+'" font-family="'+tt+'" font-size="'+a(f*.34)+'" font-weight="800"'),l[0]&&(p+=M(b,N-f*.12+16,l[0],H(e,10,'text-anchor="middle"'))),p+=M(b-v,N+18,g(n,t,!0),H(e,10,'text-anchor="middle"'))+M(b+v,N+18,g(s,t,!0),H(e,10,'text-anchor="middle"')),p+=pt(b-f,N-f,f*2,f,(l[0]?l[0]+": ":"")+F(i)+" (range "+g(n,t)+" to "+g(s,t)+")"+(O(t.goal)?`
|
|
6
|
-
Goal: `+
|
|
7
|
-
`:F
|
|
8
|
-
`:"")+(
|
|
9
|
-
`+(
|
|
1
|
+
/*! Bezel Charts v1.2.0 | MIT | github.com/ShazMoghaddam/bezel-charts */
|
|
2
|
+
var Wt={dark:{tile:"#15151d",bezel:"#000000",fg:"#f2f1f7",muted:"#8c8aa0",grid:"#2a2935",up:"#5EE6C8",down:"#F675A8",palette:["#9FA1FF","#F675A8","#5EE6C8","#FFC857","#7CC4FF","#FF8A5B"]},light:{tile:"#ffffff",bezel:"#000000",fg:"#17161f",muted:"#6b6980",grid:"#e8e6ef",up:"#12a383",down:"#d63f7c",palette:["#6E70F0","#E2508C","#16A884","#D99A0E","#2F8FE0","#EE6431"]}};var it="ui-sans-serif,system-ui,-apple-system,'Segoe UI',Roboto,Helvetica,Arial,sans-serif",dt="ui-monospace,SFMono-Regular,Menlo,Consolas,monospace",Je=0;function Ht(t){return"bzc"+t+(++Je).toString(36)+Math.random().toString(36).slice(2,6)}function at(t){return String(t??"").replace(/[&<>"']/g,function(e){return{"&":"&","<":"<",">":">",'"':""","'":"'"}[e]})}function a(t){return Math.round(t*100)/100}function _(t,e,r){return Math.max(e,Math.min(r,t))}function I(t,e){var r=parseFloat(t);return isFinite(r)?r:e}function v(t){return t!=null&&t!==""}function K(t){return Array.isArray(t)?t.map(function(e){var r=+e;return isFinite(r)?r:0}):v(t)?String(t).split(/[\s,;]+/).filter(Boolean).map(function(e){var r=+e;return isFinite(r)?r:0}):[]}function U(t){return Array.isArray(t)?t.map(String):v(t)?String(t).split(",").map(function(e){return e.trim()}):[]}function Et(t){return Array.isArray(t)?Array.isArray(t[0])?t.map(K):[K(t)]:v(t)?String(t).split("|").map(K).filter(function(e){return e.length}):[]}function zt(t){return t.reduce(function(e,r){return e+r},0)}function bt(t,e,r){return String(t).length*e*(r?.6:.56)}function Gt(t,e){return t=String(t),t.length>e?t.slice(0,Math.max(1,e-1))+"\u2026":t}function j(t){return t===!0||t===""||t==="true"||t==="1"}function h(t,e,r){if(!isFinite(t))return"\u2013";var l=Math.abs(t),i;v(e.decimals)?i=_(parseInt(e.decimals,10)||0,0,6):i=t%1===0?0:l<10?2:l<100?1:0;var n={maximumFractionDigits:i,minimumFractionDigits:v(e.decimals)?i:0};(j(e.compact)||r)&&l>=1e4&&(n={notation:"compact",maximumFractionDigits:1});var s;try{s=new Intl.NumberFormat(e.lang||"en-GB",n).format(l)}catch{s=String(a(l))}return(t<0?"\u2212":"")+(e.prefix||"")+s+(e.suffix||"")}function ee(t,e,r){if(t===e)if(t===0)e=1;else{var l=Math.abs(t)*.1;t-=l,e+=l}for(var i=(e-t)/(r||4),n=Math.pow(10,Math.floor(Math.log10(i))),s=i/n,o=(s<=1?1:s<=2?2:s<=5?5:10)*n,c=Math.floor(t/o)*o,x=Math.ceil(e/o)*o,g=[],d=c;d<=x+o/2;d+=o)g.push(+d.toFixed(10));return{lo:c,hi:x,ticks:g}}function ie(t,e){if(!t.length)return"";for(var r="M"+a(t[0][0])+","+a(t[0][1]),l=1;l<t.length;l++){var i=t[l-1],n=t[l];if(e)r+="L"+a(n[0])+","+a(n[1]);else{var s=(i[0]+n[0])/2;r+="C"+a(s)+","+a(i[1])+" "+a(s)+","+a(n[1])+" "+a(n[0])+","+a(n[1])}}return r}function S(t,e,r,l){return'<text x="'+a(t)+'" y="'+a(e)+'" '+(l||"")+">"+at(r)+"</text>"}function G(t,e,r,l){return'fill="'+(l||t.muted)+'" font-family="'+dt+'" font-size="'+(e||10)+'"'+(r?" "+r:"")}function vt(t,e,r,l,i){return'<rect class="bzc-hit" x="'+a(t)+'" y="'+a(e)+'" width="'+a(Math.max(1,r))+'" height="'+a(Math.max(1,l))+'" fill="#000" fill-opacity="0" data-tip="'+at(i)+'"/>'}function lt(t,e,r){return t.animate?' class="'+e+'"'+(r?' style="animation-delay:'+a(r)+'s"':""):""}function ut(t,e){var r=U(t.color).filter(Boolean);return r.length?r:e.palette}function ht(t,e,r,l,i){return S(e+l/2,r+i/2+4,"No data yet",'text-anchor="middle" fill="'+t.muted+'" font-family="'+it+'" font-size="13"')}function Xt(t,e){return v(t.notes)?String(t.notes).split(";").map(function(r){var l=r.indexOf(":");if(l<0)return null;var i=r.slice(0,l).trim(),n=r.slice(l+1).trim(),s=e.map(String).indexOf(i);return s<0&&String(parseInt(i,10))===i&&(s=parseInt(i,10)),s>=0&&n?{i:s,text:n}:null}).filter(Boolean):[]}function Dt(t,e,r,l,i){var n=(v(t.goalLabel)?t.goalLabel:"Goal")+" "+h(I(t.goal,0),t);return'<line x1="'+a(r)+'" x2="'+a(l)+'" y1="'+a(i)+'" y2="'+a(i)+'" stroke="'+e.fg+'" stroke-opacity=".55" stroke-width="1.25" stroke-dasharray="4 4"/>'+S(l,i-5,n,G(e,10,'text-anchor="end"'))}function kt(t,e,r){var l=String(v(e.stat)?e.stat:r||"").toLowerCase();if(!l||l==="none"||!t.length)return null;var i=zt(t),n={last:t[t.length-1],total:i,sum:i,average:i/t.length,avg:i/t.length,max:Math.max.apply(null,t),min:Math.min.apply(null,t)};if(!(l in n))return null;var s=null;return l==="last"&&t.length>1&&e.delta!=="none"&&(s=t[t.length-1]-t[0]),{val:n[l],delta:s}}function Bt(t,e,r,l,i,n,s,o){var c=l,x=i,g="",d=o||13;return t.forEach(function(f,C){var E=d+bt(f,12)+16;c>l&&c+E-16>l+n&&(c=l,x+=20),g+=(s?s(C,c,x):'<circle cx="'+a(c+4)+'" cy="'+a(x+6)+'" r="4" fill="'+e[C%e.length]+'"/>')+S(c+d,x+10,f,'fill="'+r.fg+'" font-family="'+it+'" font-size="12"'),c+=E}),{svg:g,height:x-i+24}}var le={solid:"",dashed:"7 5",dotted:"1 5",dashdot:"9 4 1 4"},oe=["circle","square","triangle","diamond"],He=["solid","stripes","dots","grid"];function Ut(t,e,r){if(t==null||t===!1||t==="none"||t==="false")return null;var l=t===!0||t===""||t==="auto"?e:U(t).map(function(i){return e.indexOf(i)<0?r:i});return l.length?function(i){return l[i%l.length]}:null}function _t(t,e,r,l,i){var n=l*1.15,s=l*.85;return t==="square"?'<rect x="'+a(e-s)+'" y="'+a(r-s)+'" width="'+a(2*s)+'" height="'+a(2*s)+'" rx="1"'+i+"/>":t==="triangle"?'<path d="M'+a(e)+","+a(r-n)+"L"+a(e+n)+","+a(r+s)+"L"+a(e-n)+","+a(r+s)+'Z"'+i+"/>":t==="diamond"?'<path d="M'+a(e)+","+a(r-n*1.1)+"L"+a(e+n)+","+a(r)+"L"+a(e)+","+a(r+n*1.1)+"L"+a(e-n)+","+a(r)+'Z"'+i+"/>":'<circle cx="'+a(e)+'" cy="'+a(r)+'" r="'+a(l)+'"'+i+"/>"}function De(t,e,r,l){var i=' stroke="'+l+'" stroke-opacity=".55" stroke-width="1.5"';return'<pattern id="'+t+'" width="6" height="6" patternUnits="userSpaceOnUse"'+(e==="dots"?"":' patternTransform="rotate(45)"')+'><rect width="6" height="6" fill="'+r+'"/>'+(e==="dots"?'<circle cx="3" cy="3" r="1.3" fill="'+l+'" fill-opacity=".55"/>':'<path d="M3,0V6'+(e==="grid"?"M0,3H6":"")+'"'+i+"/>")+"</pattern>"}function Pe(t){return Math.max.apply(null,t.map(function(e){return bt(e,10,!0)}))+10}function se(t,e){for(var r=Et(t.values),l=U(t.series),i=U(t.labels),n=[],s=Math.max.apply(null,[0].concat(r.map(function(d){return d.length}))),o=0;o<s;o++){var c=[i[o]||"#"+(o+1)],x=0;r.forEach(function(d){c.push(o<d.length?h(d[o],t):""),x+=o<d.length?d[o]:0}),e&&c.push(h(x,t)),n.push(c)}var g=r.length>1||l.length?r.map(function(d,f){return l[f]||"Series "+(f+1)}):["Value"];return{head:["Label"].concat(g,e?["Total"]:[]),rows:n}}function Vt(t){var e=Math.round(_(I(t.width,360),160,2400)),r=t.frame==="none"?0:4,l=t.frame==="none"?8:20;return{W:e,b:r,P:l,w:e-2*(r+l)}}var Ke=".bzc-a{animation:bzc-in .6s ease both}.bzc-d{animation:bzc-draw 1.1s cubic-bezier(.3,.7,.2,1) both}.bzc-g{transform-box:fill-box;transform-origin:50% 100%;animation:bzc-grow .7s cubic-bezier(.2,.8,.2,1) both}.bzc-gn{transform-box:fill-box;transform-origin:50% 0;animation:bzc-grow .7s cubic-bezier(.2,.8,.2,1) both}.bzc-gx{transform-box:fill-box;transform-origin:0 50%;animation:bzc-growx .8s cubic-bezier(.2,.8,.2,1) both}.bzc-s{animation:bzc-sweep 1.1s cubic-bezier(.2,.8,.2,1) both}@keyframes bzc-in{from{opacity:0}}@keyframes bzc-draw{from{stroke-dashoffset:1}}@keyframes bzc-grow{from{transform:scaleY(0)}}@keyframes bzc-growx{from{transform:scaleX(0)}}@keyframes bzc-sweep{from{stroke-dasharray:0 100}}@media (prefers-reduced-motion:reduce){[class^=bzc-]{animation:none!important}}";function mt(t,e,r,l,i){var n=Vt(t),s=n.W,o=n.b,c=n.P,x=n.w,g=_(I(t.corners,22),0,60),d=o+c,f="";v(t.heading)&&(f+=S(o+c,d+10,String(t.heading).toUpperCase(),G(e,11,'font-weight="600" letter-spacing="1.3"')),d+=24);var C=i&&i.stat;if(C){if(f+=S(o+c,d+30,h(C.val,t),'fill="'+e.fg+'" font-family="'+it+'" font-size="32" font-weight="800" letter-spacing="-0.5"'),C.delta!=null){var E=C.delta>0,R=C.delta===0,F=t.delta==="inverse"?!E:E,y=R?e.muted:F?e.up:e.down,L=(R?"\u25CF ":E?"\u25B2 ":"\u25BC ")+h(Math.abs(C.delta),t)+" "+(v(t.deltaLabel)?t.deltaLabel:"since start");f+=S(o+c+x,d+28,L,'text-anchor="end" fill="'+y+'" font-family="'+dt+'" font-size="11" font-weight="600"')}d+=44}var m=l(o+c,d,x,r),A=Math.round(d+r+c+o),z="";t.frame!=="none"?z='<rect width="'+s+'" height="'+A+'" rx="'+g+'" fill="'+e.bezel+'"/><rect x="'+o+'" y="'+o+'" width="'+(s-2*o)+'" height="'+(A-2*o)+'" rx="'+Math.max(0,g-o)+'" fill="'+(t.background||e.tile)+'"/>':v(t.background)&&(z='<rect width="'+s+'" height="'+A+'" rx="'+g+'" fill="'+t.background+'"/>');var b=(v(t.heading)?t.heading+": ":"")+(i&&i.summary||"chart");return'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 '+s+" "+A+'" width="'+s+'" height="'+A+'" role="img" aria-label="'+at(b)+'"><title>'+at(b)+"</title>"+(t.animate?"<style>"+Ke+"</style>":"")+z+f+m+"</svg>"}function fe(t,e){var r=K(t.values),l=ut(t,e)[0],i=I(t.height,64),n=U(t.labels),s=Xt(t,n),o=kt(r,t,"last");return mt(t,e,i,function(c,x,g,d){if(!r.length)return ht(e,c,x,g,d);var f=r.length===1?[r[0],r[0]]:r,C=Math.min.apply(null,f),E=Math.max.apply(null,f);v(t.goal)&&(C=Math.min(C,+t.goal),E=Math.max(E,+t.goal));var R=(E-C||Math.abs(E)||1)*.12;C-=R,E+=R;var F=function(k){return c+k*g/(f.length-1)},y=function(k){return x+d-(k-C)/(E-C)*d},L=f.map(function(k,p){return[F(p),y(k)]}),m=ie(L,j(t.straight)),A=Ht("g"),z=L[L.length-1],b='<defs><linearGradient id="'+A+'" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="'+l+'" stop-opacity=".32"/><stop offset="1" stop-color="'+l+'" stop-opacity="0"/></linearGradient></defs>';[1/3,2/3].forEach(function(k){b+='<line x1="'+c+'" x2="'+(c+g)+'" y1="'+a(x+d*k)+'" y2="'+a(x+d*k)+'" stroke="'+e.grid+'" stroke-dasharray="2 4"/>'}),b+='<path d="'+m+"L"+a(z[0])+","+(x+d)+"L"+c+","+(x+d)+'Z" fill="url(#'+A+')"'+lt(t,"bzc-a")+"/>",b+='<path d="'+m+'" fill="none" stroke="'+l+'" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" pathLength="1" style="stroke-dasharray:1"'+lt(t,"bzc-d")+"/>",v(t.goal)&&(b+=Dt(t,e,c,c+g,y(+t.goal))),s.forEach(function(k){if(!(k.i>=r.length)){var p=L[k.i];b+='<circle cx="'+a(p[0])+'" cy="'+a(p[1])+'" r="3.5" fill="'+e.fg+'"/>'+S(_(p[0],c+30,c+g-30),p[1]-9,k.text,G(e,10,'text-anchor="middle"',e.fg))}}),b+='<circle cx="'+a(z[0])+'" cy="'+a(z[1])+'" r="9" fill="'+l+'" fill-opacity=".25"/><circle cx="'+a(z[0])+'" cy="'+a(z[1])+'" r="4.5" fill="'+l+'"/>',j(t.showValues)&&L.forEach(function(k,p){p<r.length&&(b+=S(k[0],k[1]-8,h(r[p],t,!0),G(e,9,'text-anchor="middle"')))});var O=r.length>1?g/(r.length-1):g;return r.forEach(function(k,p){b+=vt(F(p)-O/2,x-6,O,d+12,(n[p]||"#"+(p+1))+": "+h(k,t))}),b},{stat:o,summary:r.length?"latest "+h(r[r.length-1],t):"no data"})}fe.table=function(t){var e=U(t.labels);return{head:["Label","Value"],rows:K(t.values).map(function(r,l){return[e[l]||"#"+(l+1),h(r,t)]})}};function ce(t,e){var r=Et(t.values),l=U(t.series),i=U(t.labels),n=ut(t,e),s=I(t.height,170),o=Math.max.apply(null,[0].concat(r.map(function(R){return R.length}))),c=Xt(t,i),x=r.length>1||l.length>0,g=kt(r[0]||[],t,""),d=Ut(t.dash,Object.keys(le),"solid"),f=Ut(t.markers,oe,"none"),C=t.background||e.tile,E=(d||f)&&function(R,F,y){var L=n[R%n.length],m=d?le[d(R)]:"",A=f?f(R):"none";return'<line x1="'+a(F)+'" x2="'+a(F+18)+'" y1="'+a(y+6)+'" y2="'+a(y+6)+'" stroke="'+L+'" stroke-width="2.5" stroke-linecap="round"'+(m?' stroke-dasharray="'+m+'"':"")+"/>"+(A!=="none"?_t(A,F+9,y+6,3.5,' fill="'+L+'" stroke="'+C+'" stroke-width="1.5"'):"")};return mt(t,e,s,function(R,F,y,L){if(!o)return ht(e,R,F,y,L);var m="",A=F;if(x){var z=Bt(r.map(function(D,u){return l[u]||"Series "+(u+1)}),n,e,R,A,y,E,E&&24);m+=z.svg,A+=z.height}var b=[].concat.apply([],r),O=Math.min.apply(null,b),k=Math.max.apply(null,b);v(t.goal)&&(O=Math.min(O,+t.goal),k=Math.max(k,+t.goal)),j(t.zero)&&(O=Math.min(0,O),k=Math.max(0,k));var p=ee(O,k,4),B=p.ticks.map(function(D){return h(D,t,!0)}),M=Math.max.apply(null,B.map(function(D){return bt(D,10,!0)}))+10,w=i.length?20:4,T=R+M,V=y-M,Y=L-(A-F)-w,tt=function(D){return o===1?T+V/2:T+D*V/(o-1)},Q=function(D){return A+Y-(D-p.lo)/(p.hi-p.lo)*Y};if(p.ticks.forEach(function(D,u){var H=Q(D);m+='<line x1="'+a(T)+'" x2="'+a(T+V)+'" y1="'+a(H)+'" y2="'+a(H)+'" stroke="'+e.grid+'"'+(D===0?"":' stroke-dasharray="2 4"')+"/>"+S(T-8,H+3.5,B[u],G(e,10,'text-anchor="end"'))}),i.length){for(var ot=Math.max(1,Math.ceil(o*(Math.max.apply(null,i.map(function(D){return bt(D,10,!0)}))+10)/V)),q=0;q<o;q+=ot)if(i[q]!=null){var J=o>1&&q===0?"start":o>1&&q===o-1?"end":"middle";m+=S(tt(q),A+Y+15,i[q],G(e,10,'text-anchor="'+J+'"'))}}c.forEach(function(D){if(!(D.i>=o)){var u=tt(D.i);m+='<line x1="'+a(u)+'" x2="'+a(u)+'" y1="'+a(A+12)+'" y2="'+a(A+Y)+'" stroke="'+e.fg+'" stroke-opacity=".4" stroke-dasharray="3 3"/>'+S(_(u,T+30,T+V-30),A+8,D.text,G(e,10,'text-anchor="middle"',e.fg))}}),r.forEach(function(D,u){var H=n[u%n.length],N=D.map(function(X,ft){return[tt(ft),Q(X)]});N.length===1&&(N=[[T,N[0][1]],[T+V,N[0][1]]]);var et=ie(N,j(t.straight));if(u===0){var W=Ht("g"),gt=N[N.length-1];m+='<defs><linearGradient id="'+W+'" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="'+H+'" stop-opacity=".26"/><stop offset="1" stop-color="'+H+'" stop-opacity="0"/></linearGradient></defs><path d="'+et+"L"+a(gt[0])+","+a(A+Y)+"L"+a(N[0][0])+","+a(A+Y)+'Z" fill="url(#'+W+')"'+lt(t,"bzc-a")+"/>"}var xt=d?le[d(u)]:"",Mt=f?f(u):"none";if(m+=xt?'<path d="'+et+'" fill="none" stroke="'+H+'" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="'+xt+'"'+lt(t,"bzc-a",u*.15)+"/>":'<path d="'+et+'" fill="none" stroke="'+H+'" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" pathLength="1" style="stroke-dasharray:1'+(t.animate?";animation-delay:"+u*.15+"s":"")+'"'+(t.animate?' class="bzc-d"':"")+"/>",Mt!=="none"){var P=Math.ceil(D.length/40);D.forEach(function(X,ft){(ft%P===0||ft===D.length-1)&&(m+=_t(Mt,tt(ft),Q(X),3.5,' fill="'+H+'" stroke="'+C+'" stroke-width="1.5"'+lt(t,"bzc-a",.6+u*.15)))})}else{var Z=N[N.length-1];m+='<circle cx="'+a(Z[0])+'" cy="'+a(Z[1])+'" r="4" fill="'+H+'" stroke="'+C+'" stroke-width="2"/>'}j(t.showValues)&&D.forEach(function(X,ft){m+=S(tt(ft),Q(X)-8,h(X,t,!0),G(e,9,'text-anchor="middle"'))})}),v(t.goal)&&(m+=Dt(t,e,T,T+V,Q(+t.goal)));for(var Lt=o>1?V/(o-1):V,st=0;st<o;st++){var pt=i[st]||"#"+(st+1);r.forEach(function(D,u){st<D.length&&(pt+=`
|
|
3
|
+
`+(x?(l[u]||"Series "+(u+1))+": ":"")+h(D[st],t))}),m+=vt(tt(st)-Lt/2,A,Lt,Y,pt)}return m},{stat:g,summary:r.length+" series over "+o+" points"})}ce.table=function(t){return se(t)};var $e=40,Ge=24;function ue(t,e){for(var r=Et(t.values),l=U(t.series),i=U(t.labels),n=ut(t,e),s=r.length,o=Math.max.apply(null,[0].concat(r.map(function(u){return u.length}))),c=s>1,x=j(t.horizontal),g=c&&j(t.stacked),d=!c&&U(t.color).filter(Boolean).length>1,f=r[0]||[],C=[].concat.apply([],r),E=function(u,H){return r.reduce(function(N,et){return u<et.length&&et[u]*H>0?N+et[u]:N},0)},R=[],F=[],y=[],L=0;g&&L<o;L++)F.push(E(L,1)),y.push(E(L,-1)),R.push(F[L]+y[L]);for(var m=g?F.concat(y):C,A=m.length?Math.max.apply(null,m):0,z=function(u){return l[u]||"Series "+(u+1)},b=c?Ut(t.patterns,He,"solid"):null,O="",k=[],p=0;b&&p<s;p++)if(b(p)!=="solid"){var B=Ht("g");O+=De(B,b(p),n[p%n.length],t.background||e.tile),k[p]="url(#"+B+")"}var M=function(u,H){return c?k[u]||n[u%n.length]:d?n[H%n.length]:n[0]},w=b&&function(u,H,N){return'<rect x="'+a(H)+'" y="'+a(N+1)+'" width="10" height="10" rx="2" fill="'+M(u)+'"/>'},T=function(u){return c||d||t.highlight==="none"||u===A?1:.5},V=function(u){return i[u]||"#"+(u+1)},Y=function(u){return c?V(u)+r.map(function(H,N){return u<H.length?`
|
|
4
|
+
`+z(N)+": "+h(H[u],t):""}).join("")+(g?`
|
|
5
|
+
Total: `+h(R[u],t):""):V(u)+": "+h(f[u],t)},tt=Vt(t),Q=c||l.length?Bt(r.map(function(u,H){return z(H)}),n,e,0,0,tt.w,w,w&&15).height:0,ot=g?1:s,q=c&&!g,J=q?10:14,Lt=3,st=x?ot*J+(ot-1)*Lt+(q?14:16):0,pt=x?Q+Math.max(1,o)*st-6:I(t.height,140)+Q,D=f.indexOf(Math.max.apply(null,f.length?f:[0]));return mt(t,e,pt,function(u,H,N,et){if(!o)return ht(e,u,H,N,et);var W=O?"<defs>"+O+"</defs>":"",gt=H;Q&&(W+=Bt(r.map(function($,rt){return z(rt)}),n,e,u,H,N,w,w&&15).svg,gt+=Q);var xt=Math.min(0,Math.min.apply(null,m)),Mt=Math.max(0,A);if(v(t.goal)&&(xt=Math.min(xt,+t.goal),Mt=Math.max(Mt,+t.goal)),Mt===xt&&(Mt=xt+1),x){for(var P=i.length?Math.min(N*.4,Math.max.apply(null,i.map(function($){return bt($,12)}))+10):0,Z=g?[R.map(function($){return h($,t)})]:r.map(function($){return $.map(function(rt){return h(rt,t)})}),X=Math.max.apply(null,[].concat.apply([],Z).map(function($){return bt($,q?10:11,!0)}))+10,ft=u+P,St=N-P-X,Rt=Math.max(Mt,0)||1,nt=0;nt<o;nt++){var At=gt+nt*st;i[nt]!=null&&(W+=S(u,At+(st-6)/2+4,Gt(i[nt],Math.floor(P/6.7)),'fill="'+e.fg+'" font-family="'+it+'" font-size="12"')),g?(W+=We(nt,ft,At+5,St,Rt),W+=S(u+N,At+5+J/2+3.8,Z[0][nt],'text-anchor="end" fill="'+e.fg+'" font-family="'+dt+'" font-size="11" font-weight="600"')):r.forEach(function($,rt){if(!(nt>=$.length)){var ct=$[nt],wt=At+(c?2:5)+rt*(J+Lt),Tt=Math.max(0,ct)/Rt*St;c||(W+='<rect x="'+a(ft)+'" y="'+a(wt)+'" width="'+a(St)+'" height="'+J+'" rx="'+J/2+'" fill="'+e.grid+'" fill-opacity=".6"/>'),Tt>0&&(W+='<rect x="'+a(ft)+'" y="'+a(wt)+'" width="'+a(Math.max(J,Tt))+'" height="'+J+'" rx="'+J/2+'" fill="'+M(rt,nt)+'" fill-opacity="'+T(ct)+'"'+lt(t,"bzc-gx",nt*.06+rt*.03)+"/>"),W+=S(u+N,wt+J/2+3.8,Z[rt][nt],'text-anchor="end" fill="'+e.fg+'" font-family="'+dt+'" font-size="'+(c?10:11)+'" font-weight="600"')}}),W+=vt(u,At,N,st-6,Y(nt))}if(v(t.goal)&&+t.goal>0){var ze=ft+ +t.goal/Rt*St;W+='<line x1="'+a(ze)+'" x2="'+a(ze)+'" y1="'+a(gt-2)+'" y2="'+a(H+et+2)+'" stroke="'+e.fg+'" stroke-opacity=".55" stroke-dasharray="3 3"/>'}return W}function We($,rt,ct,wt,Tt){var Ct='<rect x="'+a(rt)+'" y="'+a(ct)+'" width="'+a(wt)+'" height="'+J+'" rx="'+J/2+'" fill="'+e.grid+'" fill-opacity=".6"/>',Yt=0;return r.forEach(function(jt,Ft){var qt=$<jt.length?jt[$]:0,Nt=Math.max(0,qt)/Tt*wt;if(!(Nt<=0)){var $t=Yt>0?1.5:0;Ct+='<rect x="'+a(rt+Yt+$t)+'" y="'+a(ct)+'" width="'+a(Math.max(2,Nt-$t))+'" height="'+J+'" rx="'+a(Math.min(3,Nt/2))+'" fill="'+M(Ft,$)+'"'+lt(t,"bzc-gx",$*.06+Ft*.03)+"/>",Yt+=Nt}}),Ct}var Le=i.length?Math.max.apply(null,i.map(function($){return bt($,10,!0)})):0,xe=i.length?Math.max(1,Math.ceil(o*(Le+8)/N)):1,Qt=j(t.angleLabels)&&xe>1,Ae=$e*Math.PI/180,Oe=function($){return Qt?Gt($,Ge):$};if(Qt){var Xe=N/o,It=0;i.forEach(function($,rt){It=Math.max(It,Math.cos(Ae)*bt(Oe($),10,!0)+4-(rt+.5)*Xe)}),It=Math.min(It,N*.25),u+=It,N-=It,xe=1}var Te=j(t.showValues)&&xt<0?14:0,_e=Qt?Math.ceil(Math.sin(Ae)*Math.min(Le,bt("x".repeat(Ge),10,!0)))+18:20,Ze=(i.length?_e:2)+Te,Ce=j(t.showValues)?16:4,ye=et-(gt-H)-Ze-Ce,Fe=gt+Ce,Ot=function($){return Fe+ye-($-xt)/(Mt-xt)*ye},Jt=N/o,Kt=Math.min(Jt*(q?.78:.62),q?s*30:56),Ne=q?Math.min(3,Kt/s*.15):0,Pt=g?Kt:(Kt-Ne*(s-1))/s,ne=Ot(0);W+='<line x1="'+u+'" x2="'+(u+N)+'" y1="'+a(ne)+'" y2="'+a(ne)+'" stroke="'+e.grid+'"/>';for(var yt=0;yt<o;yt++){var be=u+yt*Jt+(Jt-Kt)/2;if(g?W+=Qe(yt,be):r.forEach(function($,rt){if(!(yt>=$.length)){var ct=$[yt],wt=be+rt*(Pt+Ne),Tt=Math.min(Ot(ct),ne),Ct=Math.abs(Ot(ct)-ne);Ct>.5&&(W+='<rect x="'+a(wt)+'" y="'+a(Tt)+'" width="'+a(Pt)+'" height="'+a(Ct)+'" rx="'+a(Math.min(6,Pt/2,Ct/2))+'" fill="'+M(rt,yt)+'" fill-opacity="'+T(ct)+'"'+lt(t,ct<0?"bzc-gn":"bzc-g",yt*.05+rt*.03)+"/>"),j(t.showValues)&&(W+=S(wt+Pt/2,ct<0?Ot(ct)+12:Ot(ct)-5,h(ct,t,!0),'text-anchor="middle" fill="'+e.fg+'" font-family="'+dt+'" font-size="'+(c?9:10)+'" font-weight="600"'))}}),i[yt]!=null&&yt%xe===0){var ke=be+Kt/2,Me=Fe+ye+Te+(Qt?12:15);W+=Qt?S(ke,Me,Oe(i[yt]),G(e,10,'text-anchor="end" transform="rotate(-'+$e+" "+a(ke)+" "+a(Me)+')"')):S(ke,Me,i[yt],G(e,10,'text-anchor="middle"'))}W+=vt(u+yt*Jt,gt,Jt,et-(gt-H),Y(yt))}return v(t.goal)&&(W+=Dt(t,e,u,u+N,Ot(+t.goal))),W;function Qe($,rt){var ct="",wt=0,Tt=0;if(r.forEach(function(Yt,jt){var Ft=$<Yt.length?Yt[$]:0;if(Ft){var qt=Ft>0?wt:Tt,Nt=qt+Ft;Ft>0?wt=Nt:Tt=Nt;var $t=Ot(Math.max(qt,Nt)),we=Ot(Math.min(qt,Nt)),te=we-$t,Re=qt!==0?Math.min(1.5,te/2):0;Ft>0?we-=Re:$t+=Re,te=we-$t,te>.5&&(ct+='<rect x="'+a(rt)+'" y="'+a($t)+'" width="'+a(Pt)+'" height="'+a(te)+'" rx="'+a(Math.min(3,Pt/2,te/2))+'" fill="'+M(jt,$)+'"'+lt(t,Ft<0?"bzc-gn":"bzc-g",$*.05+jt*.03)+"/>")}}),j(t.showValues)){var Ct=R[$];ct+=S(rt+Pt/2,Ct<0?Ot(y[$])+12:Ot(F[$])-5,h(Ct,t,!0),'text-anchor="middle" fill="'+e.fg+'" font-family="'+dt+'" font-size="10" font-weight="600"')}return ct}},{stat:kt(f,t,""),summary:o?g?s+" series stacked across "+o+" groups":c?s+" series across "+o+" groups":"highest "+(i[D]||"")+" "+h(f[D],t):"no data"})}ue.table=function(t){return se(t,Et(t.values).length>1&&j(t.stacked))};function he(t,e){var r=K(t.values),l=U(t.labels),i=ut(t,e),n=I(t.max,100)||100,s=I(t.height,140),o=!v(t.prefix)&&!v(t.suffix)&&n===100,c=function(g){return h(g,t)+(o?"%":"")},x=kt(r,t,"");return mt(t,e,s,function(g,d,f,C){if(!r.length)return ht(e,g,d,f,C);var E="",R=r.length===1,F=Math.min(C,R?f:f*.55),y=R?g+f/2:g+F/2,L=d+C/2,m=R?F*.12:_(F*.42/(r.length*1.35),5,16),A=m*.38;if(r.forEach(function(k,p){var B=F/2-m/2-p*(m+A);if(!(B<=m/2)){var M=_(k/n*100,0,100),w=i[p%i.length];E+='<circle cx="'+a(y)+'" cy="'+a(L)+'" r="'+a(B)+'" fill="none" stroke="'+w+'" stroke-opacity=".16" stroke-width="'+a(m)+'"/>',M>0&&(E+='<circle cx="'+a(y)+'" cy="'+a(L)+'" r="'+a(B)+'" fill="none" stroke="'+w+'" stroke-width="'+a(m)+'" stroke-linecap="round" pathLength="100" transform="rotate(-90 '+a(y)+" "+a(L)+')" style="stroke-dasharray:'+a(M)+" 100"+(t.animate?";animation-delay:"+p*.12+"s":"")+'"'+(t.animate?' class="bzc-s"':"")+"/>"),E+='<circle cx="'+a(y)+'" cy="'+a(L)+'" r="'+a(B+m/2)+'" fill="#000" fill-opacity="0" class="bzc-hit" data-tip="'+at((l[p]||"#"+(p+1))+": "+c(k)+(o?"":" of "+h(n,t)))+'"/>'}}),R)E+=S(y,L+F*.08,c(r[0]),'text-anchor="middle" fill="'+e.fg+'" font-family="'+it+'" font-size="'+a(F*.22)+'" font-weight="800"'),l[0]&&(E+=S(y,L+F*.08+16,l[0],G(e,10,'text-anchor="middle"')));else{var z=g+F+22,b=Math.min(26,C/r.length),O=L-b*r.length/2;r.forEach(function(k,p){var B=O+p*b+b/2;E+='<circle cx="'+a(z+4)+'" cy="'+a(B)+'" r="4" fill="'+i[p%i.length]+'"/>'+S(z+14,B+4,Gt(l[p]||"#"+(p+1),Math.floor((g+f-z-60)/6.7)),'fill="'+e.fg+'" font-family="'+it+'" font-size="12"')+S(g+f,B+4,c(k),'text-anchor="end" fill="'+e.fg+'" font-family="'+dt+'" font-size="11" font-weight="600"')})}return E},{stat:x,summary:r.map(function(g,d){return(l[d]?l[d]+" ":"")+c(g)}).join(", ")})}he.table=function(t){var e=U(t.labels),r=I(t.max,100)||100,l=!v(t.prefix)&&!v(t.suffix)&&r===100;return{head:["Label","Value"],rows:K(t.values).map(function(i,n){return[e[n]||"#"+(n+1),h(i,t)+(l?"%":" of "+h(r,t))]})}};function me(t,e){var r=K(t.values).map(function(f){return Math.max(0,f)}),l=U(t.labels),i=ut(t,e),n=r.slice(),s=l.slice();if(n.length>6){var o=n.map(function(f,C){return C}).sort(function(f,C){return r[C]-r[f]}),c=o.slice(0,5).sort(function(f,C){return f-C});n=c.map(function(f){return r[f]}),s=c.map(function(f){return l[f]||"#"+(f+1)}),n.push(zt(o.slice(5).map(function(f){return r[f]}))),s.push("Other")}var x=zt(n),g=I(t.height,150),d=kt(n,t,"");return mt(t,e,g,function(f,C,E,R){if(!x)return ht(e,f,C,E,R);var F="",y=Math.min(R,E*.5),L=f+y/2,m=C+R/2,A=y*.16,z=(y-A)/2,b=0,O=n.filter(Boolean).length>1?.9:0;n.forEach(function(M,w){var T=M/x*100;if(!(T<=0)){var V=Math.max(.01,T-O);F+='<circle cx="'+a(L)+'" cy="'+a(m)+'" r="'+a(z)+'" fill="none" stroke="'+i[w%i.length]+'" stroke-width="'+a(A)+'" pathLength="100" stroke-dasharray="'+a(V)+" "+a(100-V)+'" stroke-dashoffset="'+a(-b)+'" transform="rotate(-90 '+a(L)+" "+a(m)+')"'+lt(t,"bzc-a",w*.08)+"/>",b+=T}}),F+=S(L,m+2,h(x,t,!0),'text-anchor="middle" fill="'+e.fg+'" font-family="'+it+'" font-size="'+a(y*.17)+'" font-weight="800"'),F+=S(L,m+2+14,(v(t.centerLabel)?t.centerLabel:"Total").toUpperCase(),G(e,9,'text-anchor="middle" letter-spacing="1"'));var k=f+y+22,p=Math.min(24,R/n.length),B=m-p*n.length/2;return n.forEach(function(M,w){var T=B+w*p+p/2,V=Math.round(M/x*100),Y=(s[w]||"#"+(w+1))+": "+h(M,t)+" ("+V+"%)";F+='<circle cx="'+a(k+4)+'" cy="'+a(T)+'" r="4" fill="'+i[w%i.length]+'"/>'+S(k+14,T+4,Gt(s[w]||"#"+(w+1),Math.floor((f+E-k-50)/6.7)),'fill="'+e.fg+'" font-family="'+it+'" font-size="12"')+S(f+E,T+4,V+"%",'text-anchor="end" fill="'+e.muted+'" font-family="'+dt+'" font-size="11" font-weight="600"')+vt(k,T-p/2,f+E-k,p,Y)}),b=0,n.forEach(function(M,w){var T=M/x*100;T<=0||(F+='<circle cx="'+a(L)+'" cy="'+a(m)+'" r="'+a(z)+'" fill="none" stroke="#000" stroke-opacity="0" stroke-width="'+a(A)+'" pathLength="100" stroke-dasharray="'+a(T)+" "+a(100-T)+'" stroke-dashoffset="'+a(-b)+'" transform="rotate(-90 '+a(L)+" "+a(m)+')" class="bzc-hit" data-skip="" data-tip="'+at((s[w]||"#"+(w+1))+": "+h(M,t)+" ("+Math.round(T)+"%)")+'"/>',b+=T)}),F},{stat:d,summary:"total "+h(x,t)+" across "+n.length+" parts"})}me.table=function(t){var e=K(t.values).map(function(i){return Math.max(0,i)}),r=U(t.labels),l=zt(e);return{head:["Label","Value","Share"],rows:e.map(function(i,n){return[r[n]||"#"+(n+1),h(i,t),(l?Math.round(i/l*100):0)+"%"]})}};function pe(t,e){var r=K(t.values),l=r.length?r[0]:I(t.value,NaN),i=U(t.labels),n=I(t.min,0),s=I(t.max,100),o=I(t.height,130);s===n&&(s=n+1);var c=K(t.zones),x=ut(t,e),g=U(t.color).filter(Boolean).length>1?x:[e.up,e.palette[3],e.down],d=x[0];if(c.length&&isFinite(l)){for(var f=0;f<c.length&&l>=c[f];)f++;d=g[Math.min(f,g.length-1)]}var C=!v(t.prefix)&&!v(t.suffix)&&n===0&&s===100,E=function(R){return h(R,t)+(C?"%":"")};return mt(t,e,o,function(R,F,y,L){if(!isFinite(l))return ht(e,R,F,y,L);var m=Math.min(y/2,L-22),A=m*.16,z=m-A/2,b=R+y/2,O=F+m,k=_((l-n)/(s-n),0,1),p=function(tt,Q){var ot=Math.PI*(1-tt);return[b+Q*Math.cos(ot),O-Q*Math.sin(ot)]},B="M"+a(b-z)+","+a(O)+"A"+a(z)+","+a(z)+" 0 0 1 "+a(b+z)+","+a(O),M='<path d="'+B+'" fill="none" stroke="'+d+'" stroke-opacity=".16" stroke-width="'+a(A)+'" stroke-linecap="round"/>';c.length&&c.forEach(function(tt){var Q=_((tt-n)/(s-n),0,1),ot=p(Q,z-A/2-3),q=p(Q,z-A/2-8);M+='<line x1="'+a(ot[0])+'" y1="'+a(ot[1])+'" x2="'+a(q[0])+'" y2="'+a(q[1])+'" stroke="'+e.muted+'" stroke-width="1.5"/>'}),k>0&&(M+='<path d="'+B+'" fill="none" stroke="'+d+'" stroke-width="'+a(A)+'" stroke-linecap="round" pathLength="100" style="stroke-dasharray:'+a(k*100)+' 100"'+lt(t,"bzc-s")+"/>");var w=p(k,z);if(M+='<circle cx="'+a(w[0])+'" cy="'+a(w[1])+'" r="'+a(A*.26)+'" fill="'+(t.background||e.tile)+'"'+lt(t,"bzc-a",.9)+"/>",v(t.goal)){var T=_((+t.goal-n)/(s-n),0,1),V=p(T,z+A/2+4),Y=p(T,z-A/2-4);M+='<line x1="'+a(V[0])+'" y1="'+a(V[1])+'" x2="'+a(Y[0])+'" y2="'+a(Y[1])+'" stroke="'+e.fg+'" stroke-width="2" stroke-linecap="round"/>'}return M+=S(b,O-m*.12,E(l),'text-anchor="middle" fill="'+e.fg+'" font-family="'+it+'" font-size="'+a(m*.34)+'" font-weight="800"'),i[0]&&(M+=S(b,O-m*.12+16,i[0],G(e,10,'text-anchor="middle"'))),M+=S(b-z,O+18,h(n,t,!0),G(e,10,'text-anchor="middle"'))+S(b+z,O+18,h(s,t,!0),G(e,10,'text-anchor="middle"')),M+=vt(b-m,O-m,m*2,m,(i[0]?i[0]+": ":"")+E(l)+" (range "+h(n,t)+" to "+h(s,t)+")"+(v(t.goal)?`
|
|
6
|
+
Goal: `+h(+t.goal,t):"")),M},{summary:isFinite(l)?E(l)+" on a scale of "+h(n,t)+" to "+h(s,t):"no data"})}pe.table=function(t){var e=K(t.values),r=e.length?e[0]:I(t.value,NaN),l=U(t.labels),i=I(t.min,0),n=I(t.max,100),s=!v(t.prefix)&&!v(t.suffix)&&i===0&&n===100;return isFinite(r)?{head:["Label","Value"],rows:[[l[0]||"Reading",h(r,t)+(s?"%":"")],["Lowest",h(i,t)],["Highest",h(n,t)]].concat(v(t.goal)?[["Goal",h(+t.goal,t)]]:[])}:{head:["Label","Value"],rows:[]}};function de(t,e){var r=K(t.values).map(function(y){return Math.max(0,y)}),l=U(t.labels),i=ut(t,e),n=r.length===1,s=zt(r),o=v(t.max)?I(t.max,100):n?100:s;o>0||(o=1);var c=!v(t.prefix)&&!v(t.suffix)&&o===100&&n,x=function(y){return h(y,t)+(c?"%":"")},g=Vt(t),d=g.w,f=0,C=[];if(!n&&r.length){var E=0;f=1,r.forEach(function(y,L){var m=l[L]||"#"+(L+1),A=14+bt(m,12)+6+bt(h(y,t),11,!0)+18;E>0&&E+A>d&&(E=0,f++),C.push({x:E,row:f-1,l:m}),E+=A})}var R=36+(f?12+f*20:0),F=kt(r,t,"");return mt(t,e,R,function(y,L,m,A){if(!r.length)return ht(e,y,L,m,A);var z="",b=L+22,O=Ht("c"),k=n?x(r[0])+(c?"":" of "+h(o,t)):h(s,t)+" of "+h(o,t);n&&l[0]&&(z+=S(y,L+11,l[0],'fill="'+e.fg+'" font-family="'+it+'" font-size="12"')),z+=S(y+m,L+11,k,'text-anchor="end" fill="'+e.fg+'" font-family="'+dt+'" font-size="11" font-weight="600"'),z+='<rect x="'+y+'" y="'+b+'" width="'+m+'" height="14" rx="7" fill="'+e.grid+'" fill-opacity=".7"/>',z+='<clipPath id="'+O+'"><rect x="'+y+'" y="'+b+'" width="'+m+'" height="14" rx="7"/></clipPath><g clip-path="url(#'+O+')"><g'+lt(t,"bzc-gx")+">";var p=0;if(r.forEach(function(M,w){var T=Math.min(M,Math.max(0,o-p))/o*m;T>0&&(z+='<rect x="'+a(y+p/o*m)+'" y="'+b+'" width="'+a(T)+'" height="14" fill="'+i[w%i.length]+'"/>'),w>0&&T>0&&(z+='<rect x="'+a(y+p/o*m-1)+'" y="'+b+'" width="2" height="14" fill="'+(t.background||e.tile)+'"/>'),p+=M}),z+="</g></g>",v(t.goal)){var B=y+_(+t.goal/o,0,1)*m;z+='<line x1="'+a(B)+'" x2="'+a(B)+'" y1="'+(b-4)+'" y2="'+(b+18)+'" stroke="'+e.fg+'" stroke-width="2" stroke-linecap="round"/>'}return p=0,r.forEach(function(M,w){var T=Math.min(M,Math.max(0,o-p))/o*m;T>0&&(z+=vt(y+p/o*m,b-4,T,22,(l[w]||(n?"Progress":"#"+(w+1)))+": "+x(M)+(n?"":" ("+Math.round(M/o*100)+"%)"))),p+=M}),C.forEach(function(M,w){var T=y+M.x,V=b+14+12+M.row*20+8;z+='<circle cx="'+a(T+4)+'" cy="'+a(V)+'" r="4" fill="'+i[w%i.length]+'"/><text x="'+a(T+14)+'" y="'+a(V+4)+'" fill="'+e.fg+'" font-family="'+it+'" font-size="12">'+at(M.l)+'<tspan dx="6" fill="'+e.muted+'" font-family="'+dt+'" font-size="11">'+at(h(r[w],t))+"</tspan></text>"}),z},{stat:F,summary:n?x(r[0])+(c?"":" of "+h(o,t)):h(s,t)+" of "+h(o,t)})}de.table=function(t){var e=K(t.values).map(function(s){return Math.max(0,s)}),r=U(t.labels),l=e.length===1,i=v(t.max)?I(t.max,100):l?100:zt(e);i>0||(i=1);var n=!v(t.prefix)&&!v(t.suffix)&&i===100&&l;return l?{head:["Label","Value"],rows:[[r[0]||"Progress",h(e[0],t)+(n?"%":" of "+h(i,t))]]}:{head:["Label","Value","Share"],rows:e.map(function(s,o){return[r[o]||"#"+(o+1),h(s,t),Math.round(s/i*100)+"%"]})}};var Be={weekday:"short",day:"numeric",month:"short",year:"numeric"};function Ue(t,e){if(v(t.start)&&/^\d{4}-\d{2}-\d{2}$/.test(String(t.start)))return new Date(String(t.start)+"T00:00:00Z");var r=new Date;return new Date(Date.UTC(r.getFullYear(),r.getMonth(),r.getDate())-Math.max(0,e-1)*864e5)}function Ve(t,e){try{return new Intl.DateTimeFormat(t,Object.assign({timeZone:"UTC"},e))}catch{return new Intl.DateTimeFormat("en-GB",Object.assign({timeZone:"UTC"},e))}}function ge(t,e){var r=K(t.values),l=ut(t,e)[0],i=t.lang||"en-GB",n=Ue(t,r.length),s=(n.getUTCDay()+6)%7,o=Math.max(1,Math.ceil((s+r.length)/7)),c=Vt(t),x=28,g=Math.max(1,Math.floor((c.w-x)/10));if(o>g){var d=(o-g)*7-s;r=r.slice(d),n=new Date(n.getTime()+d*864e5),s=0,o=g}var f=Math.min(18,(c.w-x)/o),C=f<8?1:3,E=f-C,R=16+7*f+26,F=r.length?Math.max.apply(null,r):0,y=function(b){return Ve(i,b)},L=y({month:"short"}),m=y({weekday:"short"}),A=y(Be),z=kt(r,t,"");return mt(t,e,R,function(b,O,k,p){if(!r.length)return ht(e,b,O,k,p);var B="",M=b+x,w=O+16,T=-99,V=[.28,.5,.75,1];f>=9&&[0,2,4].forEach(function(W){var gt=new Date(Date.UTC(2024,0,1+W));B+=S(b,w+W*f+E/2+3.5,m.format(gt),G(e,9))});for(var Y=0;Y<r.length;Y++){var tt=s+Y,Q=Math.floor(tt/7),ot=tt%7,q=new Date(n.getTime()+Y*864e5),J=M+Q*f,Lt=w+ot*f;(q.getUTCDate()===1||Y===0)&&J-T>30&&(B+=S(J,O+9,L.format(q),G(e,9)),T=J);var st=r[Y]<=0||!F?0:Math.ceil(r[Y]/F*4),pt=st?l:e.grid,D=st?V[st-1]:.7;B+='<rect x="'+a(J)+'" y="'+a(Lt)+'" width="'+a(E)+'" height="'+a(E)+'" rx="'+a(E*.24)+'" fill="'+pt+'" fill-opacity="'+D+'"'+(t.animate?' class="bzc-a" style="animation-delay:'+a(Q*.012)+'s"':"")+' data-tip="'+at(A.format(q)+": "+h(r[Y],t))+'"/>'}var u=w+7*f+14,H=10,N=b+k-5*(H+3)-30;B+=S(b,u+8,h(zt(r),t,!0)+" in "+r.length+" days",G(e,10)),B+=S(N-6,u+8,"Less",G(e,9,'text-anchor="end"'));for(var et=0;et<5;et++)B+='<rect x="'+a(N+et*(H+3))+'" y="'+u+'" width="'+H+'" height="'+H+'" rx="2.5" fill="'+(et?l:e.grid)+'" fill-opacity="'+(et?V[et-1]:.7)+'"/>';return B+=S(N+5*(H+3)+3,u+8,"More",G(e,9)),B},{stat:z,summary:h(zt(r),t)+" across "+r.length+" days"})}ge.table=function(t){var e=K(t.values),r=Ue(t,e.length),l=Ve(t.lang||"en-GB",Be);return{head:["Date","Value"],rows:e.map(function(i,n){return[l.format(new Date(r.getTime()+n*864e5)),h(i,t)]})}};function je(t,e){var r=Math.min(t.length,e.length);if(r<2)return null;var l=0,i=0,n;for(n=0;n<r;n++)l+=t[n],i+=e[n];l/=r,i/=r;var s=0,o=0,c=0;for(n=0;n<r;n++)s+=(t[n]-l)*(t[n]-l),o+=(e[n]-i)*(e[n]-i),c+=(t[n]-l)*(e[n]-i);if(!s)return null;var x=c/s;return{slope:x,intercept:i-x*l,r:o?c/Math.sqrt(s*o):0}}function ve(t,e){for(var r=Et(t.x),l=Et(t.y),i=U(t.series),n=U(t.labels),s=ut(t,e),o=[],c=0;c<Math.max(r.length,l.length);c++){var x=r[c]||[],g=l[c]||[],d=Math.min(x.length,g.length);o.push({xs:x.slice(0,d),ys:g.slice(0,d)})}o=o.filter(function(O){return O.xs.length});var f=o.reduce(function(O,k){return O+k.xs.length},0),C=I(t.height,210),E=o.length>1||i.length>0,R=j(t.trend),F=function(O){return i[O]||"Group "+(O+1)},y={decimals:t.decimals,compact:t.compact,lang:t.lang},L=Xt(t,n),m=Ut(t.markers,oe,"circle"),A=t.background||e.tile,z=function(O){var k=m?m(O):"circle";return k==="none"?"circle":k},b=m&&function(O,k,p){return _t(z(O),k+4,p+6,4,' fill="'+s[O%s.length]+'"')};return mt(t,e,C,function(O,k,p,B){if(!f)return ht(e,O,k,p,B);var M="",w=k;if(E){var T=Bt(o.map(function(P,Z){return F(Z)}),s,e,O,w,p,b);M+=T.svg,w+=T.height}var V=[].concat.apply([],o.map(function(P){return P.xs})),Y=[].concat.apply([],o.map(function(P){return P.ys})),tt=Math.min.apply(null,Y),Q=Math.max.apply(null,Y);v(t.goal)&&(tt=Math.min(tt,+t.goal),Q=Math.max(Q,+t.goal)),j(t.zero)&&(tt=Math.min(0,tt),Q=Math.max(0,Q));var ot=ee(tt,Q,4),q=ee(Math.min.apply(null,V),Math.max.apply(null,V),5),J=ot.ticks.map(function(P){return h(P,t,!0)}),Lt=Pe(J)+(v(t.yLabel)?14:0),st=20+(v(t.xLabel)?16:0),pt=O+Lt,D=p-Lt,u=B-(w-k)-st,H=function(P){return pt+6+(P-q.lo)/(q.hi-q.lo)*(D-12)},N=function(P){return w+6+u-6-(P-ot.lo)/(ot.hi-ot.lo)*(u-6)};ot.ticks.forEach(function(P,Z){var X=N(P);M+='<line x1="'+a(pt)+'" x2="'+a(pt+D)+'" y1="'+a(X)+'" y2="'+a(X)+'" stroke="'+e.grid+'" stroke-dasharray="2 4"/>'+S(pt-8,X+3.5,J[Z],G(e,10,'text-anchor="end"'))});var et=Math.max(1,Math.ceil(q.ticks.length*44/D));if(q.ticks.forEach(function(P,Z){if(!(Z%et)){var X=H(P);M+='<line x1="'+a(X)+'" x2="'+a(X)+'" y1="'+a(w)+'" y2="'+a(w+u)+'" stroke="'+e.grid+'" stroke-dasharray="2 4"/>'+S(X,w+u+15,h(P,y,!0),G(e,10,'text-anchor="middle"'))}}),v(t.xLabel)&&(M+=S(pt+D/2,w+u+32,t.xLabel,G(e,10,'text-anchor="middle" font-weight="600"'))),v(t.yLabel)){var W=w+u/2;M+='<text x="'+a(O+4)+'" y="'+a(W)+'" transform="rotate(-90 '+a(O+4)+" "+a(W)+')" text-anchor="middle" '+G(e,10,'font-weight="600"')+' dominant-baseline="hanging">'+String(t.yLabel).replace(/[&<>"]/g,function(P){return{"&":"&","<":"<",">":">",'"':"""}[P]})+"</text>"}v(t.goal)&&(M+=Dt(t,e,pt,pt+D,N(+t.goal))),R&&o.forEach(function(P,Z){var X=je(P.xs,P.ys);if(X){var ft=Math.min.apply(null,P.xs),St=Math.max.apply(null,P.xs),Rt=X.slope*ft+X.intercept,nt=X.slope*St+X.intercept,At=s[Z%s.length];M+='<line x1="'+a(H(ft))+'" y1="'+a(_(N(Rt),w,w+u))+'" x2="'+a(H(St))+'" y2="'+a(_(N(nt),w,w+u))+'" stroke="'+At+'" stroke-width="2" stroke-dasharray="6 4" stroke-linecap="round" stroke-opacity=".9"/>',M+=S(Math.min(H(St),pt+D)-2,_(N(nt),w+10,w+u)-7,"r = "+X.r.toFixed(2),G(e,10,'text-anchor="end" font-weight="600"',At))}});var gt=0,xt=f>150?3:4.5;o.forEach(function(P,Z){var X=s[Z%s.length];P.xs.forEach(function(ft,St){var Rt=H(ft),nt=N(P.ys[St]),At=(n[gt]?n[gt]+`
|
|
7
|
+
`:E?F(Z)+`
|
|
8
|
+
`:"")+(v(t.xLabel)?t.xLabel:"x")+": "+h(ft,y)+`
|
|
9
|
+
`+(v(t.yLabel)?t.yLabel:"y")+": "+h(P.ys[St],t);M+=_t(z(Z),Rt,nt,xt,' fill="'+X+'" fill-opacity=".85" stroke="'+A+'" stroke-width="1.5"'+(t.animate?' class="bzc-a" style="animation-delay:'+a(Math.min(.8,gt*.012))+'s"':"")),M+=vt(Rt-8,nt-8,16,16,At),gt++})});var Mt=[];return o.forEach(function(P){P.xs.forEach(function(Z,X){Mt.push([H(Z),N(P.ys[X])])})}),L.forEach(function(P){var Z=Mt[P.i];Z&&(M+='<circle cx="'+a(Z[0])+'" cy="'+a(Z[1])+'" r="'+(xt+4)+'" fill="none" stroke="'+e.fg+'" stroke-width="1.5"/>'+S(_(Z[0],pt+30,pt+D-30),Z[1]-xt-9,P.text,G(e,10,'text-anchor="middle"',e.fg)))}),M},{summary:f+" points"+(E?" in "+o.length+" groups":"")})}ve.table=function(t){var e=Et(t.x),r=Et(t.y),l=U(t.series),i=U(t.labels),n=e.length>1||l.length>0,s={decimals:t.decimals,compact:t.compact,lang:t.lang},o=[],c=0;return e.forEach(function(x,g){for(var d=r[g]||[],f=0;f<Math.min(x.length,d.length);f++,c++)o.push([i[c]||"#"+(c+1)].concat(n?[l[g]||"Group "+(g+1)]:[],[h(x[f],s),h(d[f],t)]))}),{head:["Point"].concat(n?["Group"]:[],[v(t.xLabel)?t.xLabel:"x",v(t.yLabel)?t.yLabel:"y"]),rows:o}};var Zt={spark:fe,line:ce,bars:ue,scatter:ve,ring:he,donut:me,gauge:pe,progress:de,heatmap:ge},tr=t=>t.replace(/-([a-z])/g,(e,r)=>r.toUpperCase());function Ie(t,e){if(!Zt[t])throw new Error(`Bezel Charts: unknown chart type "${t}". Choose one of: ${Object.keys(Zt).join(", ")}.`);let r={};for(let[l,i]of Object.entries(e))r[tr(l)]=i;return r}function re(t,e={}){let r=Ie(t,e);r.animate=j(r.animate),r.frame=r.frame==="none"?"none":"bezel";let l=r.theme==="light"||r.theme==="dark"?r.theme:r.autoTheme||"dark";return Zt[t](r,Wt[l])}function Ye(t,e={}){return Zt[t].table(Ie(t,e))}function Se(t){return t.replace(/<rect class="bzc-hit"[^>]*\/>/g,"").replace(/<circle[^>]* class="bzc-hit"[^>]*\/>/g,"").replace(/ data-tip="[^"]*"/g,"")}function er(t,e={}){return Se(re(t,{...e,animate:!1}))}var qe=["type","values","labels","series","heading","prefix","suffix","decimals","compact","color","theme","frame","width","height","goal","goal-label","notes","show-values","stat","delta","delta-label","max","min","value","zones","horizontal","straight","zero","start","lang","corners","background","center-label","highlight","x","y","x-label","y-label","trend","static","no-tooltips","stacked","angle-labels","dash","markers","patterns"],rr=`:host{display:block;position:relative;max-width:100%}:host([hidden]){display:none}svg{display:block;max-width:100%;height:auto;overflow:visible}.tip{position:absolute;left:0;top:0;pointer-events:none;background:#0b0b10;color:#f2f1f7;font:600 12px/1.5 ${dt};padding:7px 10px;border-radius:10px;white-space:pre;opacity:0;transform:translate(-50%,calc(-100% - 12px));transition:opacity .12s;z-index:3;border:1px solid #2a2935;box-shadow:0 8px 24px rgba(0,0,0,.35)}.tip.on{opacity:1}.c{outline:none}.c:focus-visible{outline:2px solid #fff;outline-offset:3px;box-shadow:0 0 0 7px #000}.k{stroke:currentColor;stroke-width:2;stroke-opacity:1}.sr{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}@media (forced-colors:active){.c:focus-visible{outline-color:Highlight}}`,ar={ArrowLeft:-1,ArrowUp:-1,ArrowRight:1,ArrowDown:1},nr=()=>typeof matchMedia=="function"?matchMedia("(prefers-color-scheme: dark)"):null,ir=()=>{let t=typeof document<"u"&&document.documentElement?.getAttribute?.("data-theme");return t==="light"||t==="dark"?t:null},Ee=new Set;typeof MutationObserver=="function"&&typeof document<"u"&&document.documentElement&&new MutationObserver(()=>Ee.forEach(t=>t.refresh())).observe(document.documentElement,{attributes:!0,attributeFilter:["data-theme"]});var lr=typeof HTMLElement>"u"?class{}:HTMLElement,ae=class extends lr{static get observedAttributes(){return qe}static get themes(){return Wt}get resolvedTheme(){let e=this.getAttribute("theme");return e==="light"||e==="dark"?e:this.options.autoTheme}get chartType(){return this.getAttribute("type")||"spark"}connectedCallback(){this.shadowRoot||(this.attachShadow({mode:"open"}).innerHTML=`<style>${rr}</style><div class="c" role="group" aria-roledescription="chart"></div><p class="sr" id="h">Use the arrow keys to step through the values.</p><div class="tip" aria-hidden="true"></div><div class="sr" aria-live="polite"></div><div class="sr"></div>`,[,this.#t,,this.#r,this.#o,this.#c]=this.shadowRoot.children,this.shadowRoot.addEventListener("pointermove",e=>this.#h(e)),this.shadowRoot.addEventListener("pointerdown",e=>this.#h(e)),this.addEventListener("pointerleave",()=>this.#r.classList.remove("on")),this.#t.addEventListener("keydown",e=>this.#v(e)),this.#t.addEventListener("blur",()=>this.#g())),Ee.add(this),this.#a=nr(),this.#a?.addEventListener?.("change",this.#u),typeof ResizeObserver=="function"?(this.#l=new ResizeObserver(([e])=>{let r=Math.round(e.contentRect.width);(!this.#n||!this.hasAttribute("width")&&r>0&&Math.abs(r-this.#s)>1)&&this.#i()}),this.#l.observe(this)):this.#i()}disconnectedCallback(){Ee.delete(this),this.#l?.disconnect(),this.#a?.removeEventListener?.("change",this.#u)}attributeChangedCallback(){!this.#n||this.#f||(this.#f=!0,queueMicrotask(()=>{this.#f=!1,this.#i()}))}get options(){let e={};for(let r of qe)this.hasAttribute(r)&&(e[r]=this.getAttribute(r));return e.width||(e.width=this.#s||360),e.autoTheme=ir()||(this.#a?this.#a.matches?"dark":"light":"dark"),e}refresh(){this.#n&&this.#i()}toSVG(e={}){return Se(re(this.chartType,{...this.options,...e,animate:!1}))}download(e){let r=URL.createObjectURL(new Blob([this.toSVG()],{type:"image/svg+xml"})),l=Object.assign(document.createElement("a"),{href:r,download:`${(e||this.getAttribute("heading")||this.chartType).replace(/[^\w-]+/g,"-").toLowerCase()}.svg`});document.body.append(l),l.click(),l.remove(),setTimeout(()=>URL.revokeObjectURL(r),1e3)}#l=null;#t=null;#r=null;#o=null;#c=null;#e=-1;#a=null;#s=0;#n=!1;#f=!1;#u=()=>{let e=this.getAttribute("theme");(!e||e==="auto")&&this.refresh()};#i(){if(!this.shadowRoot)return;let e=Math.round(this.getBoundingClientRect?.().width||0);this.#s=e>0?e:360;let r=this.options;r.animate=!this.#n&&!this.hasAttribute("static");let l,i=null;try{l=re(this.chartType,r),i=Ye(this.chartType,r)}catch(c){l=`<p style="font:13px ${it};color:#d63f7c">${at(c.message)}</p>`}let n=this.#t;n.innerHTML=l.replace(/<title>[\s\S]*?<\/title>/,"");let s=n.querySelector("svg");s?(n.setAttribute("aria-label",s.getAttribute("aria-label")),s.removeAttribute("role"),s.removeAttribute("aria-label"),s.setAttribute("aria-hidden","true")):n.removeAttribute("aria-label");let o=!!s&&!this.hasAttribute("no-tooltips");o?(n.setAttribute("tabindex","0"),n.setAttribute("aria-describedby","h")):(n.removeAttribute("tabindex"),n.removeAttribute("aria-describedby")),n.style.color=Wt[r.theme==="light"||r.theme==="dark"?r.theme:r.autoTheme].fg,n.style.borderRadius=`${r.frame==="none"?4:_(+r.corners||22,0,60)}px`,this.#c.innerHTML=i&&i.rows.length?or(r.heading,i):"",this.#e>=0&&o&&this.shadowRoot.activeElement===n?this.#d(this.#e):this.#e=-1,this.#n=!0,this.dispatchEvent(new CustomEvent("bezel-render",{bubbles:!0}))}#h(e){if(this.hasAttribute("no-tooltips"))return;let r=e.target?.closest?.("[data-tip]");if(!r){this.#r.classList.remove("on");return}this.#m(r,e.clientX,e.clientY)}#m(e,r,l){let i=this.#r;i.textContent=e.getAttribute("data-tip");let n=this.getBoundingClientRect?.()||{left:0,top:0,width:0},s=i.offsetWidth/2;i.style.left=`${_(r-n.left,s,Math.max(s,n.width-s))}px`,i.style.top=`${l-n.top}px`,i.classList.add("on")}#p(){return[...this.#t.querySelectorAll("[data-tip]:not([data-skip])")]}#v(e){let r=this.#p(),l=r.length;if(!l)return;let i=this.#e,n=ar[e.key];if(n)this.chartType==="heatmap"&&/Left|Right/.test(e.key)&&(n*=7),i=i<0?n>0?0:l-1:_(i+n,0,l-1);else if(e.key==="Home"||e.key==="End")i=e.key==="Home"?0:l-1;else{e.key==="Escape"&&this.#g();return}e.preventDefault(),this.#d(i,!0)}#d(e,r){let l=this.#p();if(!l.length)return;e=_(e,0,l.length-1),this.#t.querySelector(".k")?.classList.remove("k");let i=l[e],n=i.getBoundingClientRect?.()||{left:0,top:0,width:0};i.classList.add("k"),this.#e=e,this.#m(i,n.left+n.width/2,n.top),r&&(this.#o.textContent=`${i.getAttribute("data-tip").replace(/\n/g,", ")}. ${e+1} of ${l.length}`)}#g(){this.#t.querySelector(".k")?.classList.remove("k"),this.#r.classList.remove("on"),this.#o.textContent="",this.#e=-1}};function or(t,{head:e,rows:r}){let l=i=>i.map((n,s)=>s?`<td>${at(n)}</td>`:`<th scope="row">${at(n)}</th>`).join("");return`<table><caption>${at(t||"Chart data")}</caption><thead><tr>${e.map(i=>`<th scope="col">${at(i)}</th>`).join("")}</tr></thead><tbody>${r.map(i=>`<tr>${l(i)}</tr>`).join("")}</tbody></table>`}var sa="1.2.0",sr=Object.keys(Zt);if(typeof customElements<"u"&&typeof HTMLElement<"u"){for(let t of sr){let e=`bezel-${t}`;customElements.get(e)||customElements.define(e,class extends ae{get chartType(){return t}})}customElements.get("bezel-chart")||customElements.define("bezel-chart",class extends ae{})}export{ae as BezelChart,re as render,Wt as themes,er as toSVG,sr as types,sa as version};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bezel-charts",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "Small, polished charts as zero-dependency web components. Sparklines, lines, bars, rings, donuts, gauges, progress bars and heatmaps, with one-click static SVG export for READMEs.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/bezel-charts.js",
|
|
@@ -38,13 +38,13 @@
|
|
|
38
38
|
"type": "git",
|
|
39
39
|
"url": "git+https://github.com/ShazMoghaddam/bezel-charts.git"
|
|
40
40
|
},
|
|
41
|
-
"homepage": "https://shazmoghaddam.github.io/bezel-charts/",
|
|
41
|
+
"homepage": "https://shazmoghaddam.github.io/bezel-charts/site/",
|
|
42
42
|
"bugs": "https://github.com/ShazMoghaddam/bezel-charts/issues",
|
|
43
43
|
"engines": {
|
|
44
44
|
"node": ">=20"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
|
-
"esbuild": "0.24.
|
|
48
|
-
"linkedom": "0.18.
|
|
47
|
+
"esbuild": "0.24.2",
|
|
48
|
+
"linkedom": "0.18.15"
|
|
49
49
|
}
|
|
50
50
|
}
|
package/src/charts/bars.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { r2, num, has, list, series, tw, trunc, bool, fmt, text, small, hit, anim, palette, emptyState, goalLine, statOf, legend, SANS, MONO } from '../core/util.js';
|
|
1
|
+
import { newId, r2, num, has, list, series, tw, trunc, bool, fmt, text, small, hit, anim, palette, emptyState, goalLine, statOf, legend, seriesTable, styleOf, pattern, PATTERNS, SANS, MONO } from '../core/util.js';
|
|
2
2
|
import { tile, dims } from '../core/tile.js';
|
|
3
3
|
|
|
4
4
|
/** How far angled labels lean, and the longest label they show before shortening it. */
|
|
@@ -23,7 +23,16 @@ export default function bars(o, th) {
|
|
|
23
23
|
var scale = stacked ? ups.concat(downs) : all;
|
|
24
24
|
var top = scale.length ? Math.max.apply(null, scale) : 0;
|
|
25
25
|
var nameOf = function (j) { return names[j] || 'Series ' + (j + 1); };
|
|
26
|
-
|
|
26
|
+
// Patterns tell grouped and stacked series apart without relying on colour alone.
|
|
27
|
+
var patOf = grouped ? styleOf(o.patterns, PATTERNS, 'solid') : null, defs = '', fills = [];
|
|
28
|
+
for (var p = 0; patOf && p < k; p++) {
|
|
29
|
+
if (patOf(p) === 'solid') continue;
|
|
30
|
+
var pid = newId('g');
|
|
31
|
+
defs += pattern(pid, patOf(p), pal[p % pal.length], o.background || th.tile);
|
|
32
|
+
fills[p] = 'url(#' + pid + ')';
|
|
33
|
+
}
|
|
34
|
+
var colourOf = function (j, i) { return grouped ? fills[j] || pal[j % pal.length] : many ? pal[i % pal.length] : pal[0]; };
|
|
35
|
+
var key = patOf && function (j, x, y) { return '<rect x="' + r2(x) + '" y="' + r2(y + 1) + '" width="10" height="10" rx="2" fill="' + colourOf(j) + '"/>'; };
|
|
27
36
|
var opac = function (val) { return grouped || many || o.highlight === 'none' || val === top ? 1 : 0.5; };
|
|
28
37
|
var labelOf = function (i) { return labels[i] || '#' + (i + 1); };
|
|
29
38
|
var tipOf = function (i) {
|
|
@@ -34,7 +43,7 @@ export default function bars(o, th) {
|
|
|
34
43
|
|
|
35
44
|
// Horizontal rows need their height up front, and so does a legend that may wrap.
|
|
36
45
|
var d0 = dims(o);
|
|
37
|
-
var legendH = grouped || names.length ? legend(S.map(function (_, j) { return nameOf(j); }), pal, th, 0, 0, d0.w).height : 0;
|
|
46
|
+
var legendH = grouped || names.length ? legend(S.map(function (_, j) { return nameOf(j); }), pal, th, 0, 0, d0.w, key, key && 15).height : 0;
|
|
38
47
|
var rows = stacked ? 1 : k, thin = grouped && !stacked;
|
|
39
48
|
var subH = thin ? 10 : 14, subGap = 3;
|
|
40
49
|
var rowH = horiz ? rows * subH + (rows - 1) * subGap + (thin ? 14 : 16) : 0;
|
|
@@ -43,9 +52,9 @@ export default function bars(o, th) {
|
|
|
43
52
|
|
|
44
53
|
return tile(o, th, h, function (x0, y0, w, h) {
|
|
45
54
|
if (!n) return emptyState(th, x0, y0, w, h);
|
|
46
|
-
var s = '', top0 = y0;
|
|
55
|
+
var s = defs ? '<defs>' + defs + '</defs>' : '', top0 = y0;
|
|
47
56
|
if (legendH) {
|
|
48
|
-
s += legend(S.map(function (_, j) { return nameOf(j); }), pal, th, x0, y0, w).svg;
|
|
57
|
+
s += legend(S.map(function (_, j) { return nameOf(j); }), pal, th, x0, y0, w, key, key && 15).svg;
|
|
49
58
|
top0 += legendH;
|
|
50
59
|
}
|
|
51
60
|
var lo = Math.min(0, Math.min.apply(null, scale)), hi = Math.max(0, top);
|
|
@@ -178,3 +187,5 @@ export default function bars(o, th) {
|
|
|
178
187
|
summary: !n ? 'no data' : stacked ? k + ' series stacked across ' + n + ' groups' : grouped ? k + ' series across ' + n + ' groups' : 'highest ' + (labels[best] || '') + ' ' + fmt(v0[best], o),
|
|
179
188
|
});
|
|
180
189
|
}
|
|
190
|
+
|
|
191
|
+
bars.table = function (o) { return seriesTable(o, series(o.values).length > 1 && bool(o.stacked)); };
|
package/src/charts/donut.js
CHANGED
|
@@ -42,9 +42,17 @@ export default function donut(o, th) {
|
|
|
42
42
|
if (len <= 0) return;
|
|
43
43
|
s += '<circle cx="' + r2(cx) + '" cy="' + r2(cy) + '" r="' + r2(r) + '" fill="none" stroke="#000" stroke-opacity="0" stroke-width="' + r2(sw) +
|
|
44
44
|
'" pathLength="100" stroke-dasharray="' + r2(len) + ' ' + r2(100 - len) + '" stroke-dashoffset="' + r2(-start) + '" transform="rotate(-90 ' + r2(cx) + ' ' + r2(cy) +
|
|
45
|
-
')" class="bzc-hit" data-tip="' + esc((labels[i] || '#' + (i + 1)) + ': ' + fmt(n, o) + ' (' + Math.round(len) + '%)') + '"/>';
|
|
45
|
+
')" class="bzc-hit" data-skip="" data-tip="' + esc((labels[i] || '#' + (i + 1)) + ': ' + fmt(n, o) + ' (' + Math.round(len) + '%)') + '"/>';
|
|
46
46
|
start += len;
|
|
47
47
|
});
|
|
48
48
|
return s;
|
|
49
49
|
}, { stat: st, summary: 'total ' + fmt(total, o) + ' across ' + v.length + ' parts' });
|
|
50
50
|
}
|
|
51
|
+
|
|
52
|
+
// Every part is listed, including the small ones the chart groups as "Other".
|
|
53
|
+
donut.table = function (o) {
|
|
54
|
+
var v = nums(o.values).map(function (n) { return Math.max(0, n); }), labels = list(o.labels), total = sum(v);
|
|
55
|
+
return { head: ['Label', 'Value', 'Share'], rows: v.map(function (n, i) {
|
|
56
|
+
return [labels[i] || '#' + (i + 1), fmt(n, o), (total ? Math.round(n / total * 100) : 0) + '%'];
|
|
57
|
+
}) };
|
|
58
|
+
};
|
package/src/charts/gauge.js
CHANGED
|
@@ -39,3 +39,11 @@ export default function gauge(o, th) {
|
|
|
39
39
|
return s;
|
|
40
40
|
}, { summary: isFinite(val) ? show(val) + ' on a scale of ' + fmt(mn, o) + ' to ' + fmt(mx, o) : 'no data' });
|
|
41
41
|
}
|
|
42
|
+
|
|
43
|
+
gauge.table = function (o) {
|
|
44
|
+
var v = nums(o.values), val = v.length ? v[0] : num(o.value, NaN), labels = list(o.labels);
|
|
45
|
+
var mn = num(o.min, 0), mx = num(o.max, 100), auto = !has(o.prefix) && !has(o.suffix) && mn === 0 && mx === 100;
|
|
46
|
+
if (!isFinite(val)) return { head: ['Label', 'Value'], rows: [] };
|
|
47
|
+
return { head: ['Label', 'Value'], rows: [[labels[0] || 'Reading', fmt(val, o) + (auto ? '%' : '')], ['Lowest', fmt(mn, o)], ['Highest', fmt(mx, o)]]
|
|
48
|
+
.concat(has(o.goal) ? [['Goal', fmt(+o.goal, o)]] : []) };
|
|
49
|
+
};
|
package/src/charts/heatmap.js
CHANGED
|
@@ -1,11 +1,22 @@
|
|
|
1
1
|
import { esc, r2, has, nums, sum, fmt, text, small, palette, emptyState, statOf } from '../core/util.js';
|
|
2
2
|
import { tile, dims } from '../core/tile.js';
|
|
3
3
|
|
|
4
|
+
var FULL = { weekday: 'short', day: 'numeric', month: 'short', year: 'numeric' };
|
|
5
|
+
|
|
6
|
+
/** The first day shown: the start option, or far enough back that the last value is today. */
|
|
7
|
+
function startOf(o, len) {
|
|
8
|
+
if (has(o.start) && /^\d{4}-\d{2}-\d{2}$/.test(String(o.start))) return new Date(String(o.start) + 'T00:00:00Z');
|
|
9
|
+
var t = new Date();
|
|
10
|
+
return new Date(Date.UTC(t.getFullYear(), t.getMonth(), t.getDate()) - Math.max(0, len - 1) * 864e5);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function dates(lang, opt) {
|
|
14
|
+
try { return new Intl.DateTimeFormat(lang, Object.assign({ timeZone: 'UTC' }, opt)); } catch (e) { return new Intl.DateTimeFormat('en-GB', Object.assign({ timeZone: 'UTC' }, opt)); }
|
|
15
|
+
}
|
|
16
|
+
|
|
4
17
|
export default function heatmap(o, th) {
|
|
5
18
|
var v = nums(o.values), c = palette(o, th)[0], lang = o.lang || 'en-GB';
|
|
6
|
-
var start;
|
|
7
|
-
if (has(o.start) && /^\d{4}-\d{2}-\d{2}$/.test(String(o.start))) start = new Date(String(o.start) + 'T00:00:00Z');
|
|
8
|
-
else { var t = new Date(); start = new Date(Date.UTC(t.getFullYear(), t.getMonth(), t.getDate()) - Math.max(0, v.length - 1) * 864e5); }
|
|
19
|
+
var start = startOf(o, v.length);
|
|
9
20
|
var offset = (start.getUTCDay() + 6) % 7, cols = Math.max(1, Math.ceil((offset + v.length) / 7));
|
|
10
21
|
var d0 = dims(o), leftW = 28, maxCols = Math.max(1, Math.floor((d0.w - leftW) / 10));
|
|
11
22
|
// On narrow screens keep the most recent weeks that fit, rather than shrinking cells until they are unreadable.
|
|
@@ -19,8 +30,8 @@ export default function heatmap(o, th) {
|
|
|
19
30
|
var pitch = Math.min(18, (d0.w - leftW) / cols), gap = pitch < 8 ? 1 : 3, cell = pitch - gap;
|
|
20
31
|
var h = 16 + 7 * pitch + 26;
|
|
21
32
|
var max = v.length ? Math.max.apply(null, v) : 0;
|
|
22
|
-
var dfm = function (opt) {
|
|
23
|
-
var monthF = dfm({ month: 'short' }), dayF = dfm({ weekday: 'short' }), fullF = dfm(
|
|
33
|
+
var dfm = function (opt) { return dates(lang, opt); };
|
|
34
|
+
var monthF = dfm({ month: 'short' }), dayF = dfm({ weekday: 'short' }), fullF = dfm(FULL);
|
|
24
35
|
var st = statOf(v, o, '');
|
|
25
36
|
return tile(o, th, h, function (x0, y0, w, h) {
|
|
26
37
|
if (!v.length) return emptyState(th, x0, y0, w, h);
|
|
@@ -51,3 +62,9 @@ export default function heatmap(o, th) {
|
|
|
51
62
|
return s;
|
|
52
63
|
}, { stat: st, summary: fmt(sum(v), o) + ' across ' + v.length + ' days' });
|
|
53
64
|
}
|
|
65
|
+
|
|
66
|
+
// Every day, including the early weeks a narrow chart leaves out.
|
|
67
|
+
heatmap.table = function (o) {
|
|
68
|
+
var v = nums(o.values), start = startOf(o, v.length), f = dates(o.lang || 'en-GB', FULL);
|
|
69
|
+
return { head: ['Date', 'Value'], rows: v.map(function (n, i) { return [f.format(new Date(start.getTime() + i * 864e5)), fmt(n, o)]; }) };
|
|
70
|
+
};
|
package/src/charts/line.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { newId, r2, clamp, num, has, list, series, tw, bool, fmt, niceScale, pathOf, text, small, hit, anim, palette, emptyState, parseNotes, goalLine, statOf, legend,
|
|
1
|
+
import { newId, r2, clamp, num, has, list, series, tw, bool, fmt, niceScale, pathOf, text, small, hit, anim, palette, emptyState, parseNotes, goalLine, statOf, legend, seriesTable, styleOf, marker, DASHES, SHAPES } from '../core/util.js';
|
|
2
2
|
import { tile } from '../core/tile.js';
|
|
3
3
|
|
|
4
4
|
export default function line(o, th) {
|
|
@@ -6,11 +6,19 @@ export default function line(o, th) {
|
|
|
6
6
|
var h = num(o.height, 170), n = Math.max.apply(null, [0].concat(S.map(function (s) { return s.length; })));
|
|
7
7
|
var notes = parseNotes(o, labels), multi = S.length > 1 || names.length > 0;
|
|
8
8
|
var st = statOf(S[0] || [], o, '');
|
|
9
|
+
var dashOf = styleOf(o.dash, Object.keys(DASHES), 'solid'), markOf = styleOf(o.markers, SHAPES, 'none');
|
|
10
|
+
var bg = o.background || th.tile;
|
|
11
|
+
// With dashes or markers, the legend shows a short sample of each line instead of a dot.
|
|
12
|
+
var key = (dashOf || markOf) && function (k, x, y) {
|
|
13
|
+
var c = pal[k % pal.length], dk = dashOf ? DASHES[dashOf(k)] : '', mk = markOf ? markOf(k) : 'none';
|
|
14
|
+
return '<line x1="' + r2(x) + '" x2="' + r2(x + 18) + '" y1="' + r2(y + 6) + '" y2="' + r2(y + 6) + '" stroke="' + c + '" stroke-width="2.5" stroke-linecap="round"' +
|
|
15
|
+
(dk ? ' stroke-dasharray="' + dk + '"' : '') + '/>' + (mk !== 'none' ? marker(mk, x + 9, y + 6, 3.5, ' fill="' + c + '" stroke="' + bg + '" stroke-width="1.5"') : '');
|
|
16
|
+
};
|
|
9
17
|
return tile(o, th, h, function (x0, y0, w, h) {
|
|
10
18
|
if (!n) return emptyState(th, x0, y0, w, h);
|
|
11
19
|
var s = '', top = y0;
|
|
12
20
|
if (multi) {
|
|
13
|
-
var lg = legend(S.map(function (_, k) { return names[k] || 'Series ' + (k + 1); }), pal, th, x0, top, w);
|
|
21
|
+
var lg = legend(S.map(function (_, k) { return names[k] || 'Series ' + (k + 1); }), pal, th, x0, top, w, key, key && 24);
|
|
14
22
|
s += lg.svg;
|
|
15
23
|
top += lg.height;
|
|
16
24
|
}
|
|
@@ -54,9 +62,21 @@ export default function line(o, th) {
|
|
|
54
62
|
s += '<defs><linearGradient id="' + g + '" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="' + c + '" stop-opacity=".26"/><stop offset="1" stop-color="' + c + '" stop-opacity="0"/></linearGradient></defs>' +
|
|
55
63
|
'<path d="' + d + 'L' + r2(last[0]) + ',' + r2(top + ph) + 'L' + r2(P[0][0]) + ',' + r2(top + ph) + 'Z" fill="url(#' + g + ')"' + anim(o, 'bzc-a') + '/>';
|
|
56
64
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
s +=
|
|
65
|
+
var dk = dashOf ? DASHES[dashOf(k)] : '', mk = markOf ? markOf(k) : 'none';
|
|
66
|
+
// The draw-in animation is itself a dash, so dashed lines fade in instead.
|
|
67
|
+
s += dk
|
|
68
|
+
? '<path d="' + d + '" fill="none" stroke="' + c + '" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="' + dk + '"' + anim(o, 'bzc-a', k * 0.15) + '/>'
|
|
69
|
+
: '<path d="' + d + '" fill="none" stroke="' + c + '" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" pathLength="1" style="stroke-dasharray:1' + (o.animate ? ';animation-delay:' + k * 0.15 + 's' : '') + '"' + (o.animate ? ' class="bzc-d"' : '') + '/>';
|
|
70
|
+
if (mk !== 'none') {
|
|
71
|
+
// Long series get a marker on every few points, and always on the last.
|
|
72
|
+
var every = Math.ceil(v.length / 40);
|
|
73
|
+
v.forEach(function (y, i) {
|
|
74
|
+
if (i % every === 0 || i === v.length - 1) s += marker(mk, X(i), Y(y), 3.5, ' fill="' + c + '" stroke="' + bg + '" stroke-width="1.5"' + anim(o, 'bzc-a', 0.6 + k * 0.15));
|
|
75
|
+
});
|
|
76
|
+
} else {
|
|
77
|
+
var e = P[P.length - 1];
|
|
78
|
+
s += '<circle cx="' + r2(e[0]) + '" cy="' + r2(e[1]) + '" r="4" fill="' + c + '" stroke="' + bg + '" stroke-width="2"/>';
|
|
79
|
+
}
|
|
60
80
|
if (bool(o.showValues)) v.forEach(function (y, i) { s += text(X(i), Y(y) - 8, fmt(y, o, true), small(th, 9, 'text-anchor="middle"')); });
|
|
61
81
|
});
|
|
62
82
|
if (has(o.goal)) s += goalLine(o, th, px, px + pw, Y(+o.goal));
|
|
@@ -69,3 +89,5 @@ export default function line(o, th) {
|
|
|
69
89
|
return s;
|
|
70
90
|
}, { stat: st, summary: S.length + ' series over ' + n + ' points' });
|
|
71
91
|
}
|
|
92
|
+
|
|
93
|
+
line.table = function (o) { return seriesTable(o); };
|
package/src/charts/progress.js
CHANGED
|
@@ -55,3 +55,12 @@ export default function progress(o, th) {
|
|
|
55
55
|
return s;
|
|
56
56
|
}, { stat: st, summary: single ? show(v[0]) + (auto ? '' : ' of ' + fmt(max, o)) : fmt(total, o) + ' of ' + fmt(max, o) });
|
|
57
57
|
}
|
|
58
|
+
|
|
59
|
+
progress.table = function (o) {
|
|
60
|
+
var v = nums(o.values).map(function (n) { return Math.max(0, n); }), labels = list(o.labels), single = v.length === 1;
|
|
61
|
+
var max = has(o.max) ? num(o.max, 100) : single ? 100 : sum(v);
|
|
62
|
+
if (!(max > 0)) max = 1;
|
|
63
|
+
var auto = !has(o.prefix) && !has(o.suffix) && max === 100 && single;
|
|
64
|
+
if (single) return { head: ['Label', 'Value'], rows: [[labels[0] || 'Progress', fmt(v[0], o) + (auto ? '%' : ' of ' + fmt(max, o))]] };
|
|
65
|
+
return { head: ['Label', 'Value', 'Share'], rows: v.map(function (n, i) { return [labels[i] || '#' + (i + 1), fmt(n, o), Math.round(n / max * 100) + '%']; }) };
|
|
66
|
+
};
|
package/src/charts/ring.js
CHANGED
|
@@ -38,3 +38,10 @@ export default function ring(o, th) {
|
|
|
38
38
|
return s;
|
|
39
39
|
}, { stat: st, summary: v.map(function (n, i) { return (labels[i] ? labels[i] + ' ' : '') + show(n); }).join(', ') });
|
|
40
40
|
}
|
|
41
|
+
|
|
42
|
+
ring.table = function (o) {
|
|
43
|
+
var labels = list(o.labels), max = num(o.max, 100) || 100, auto = !has(o.prefix) && !has(o.suffix) && max === 100;
|
|
44
|
+
return { head: ['Label', 'Value'], rows: nums(o.values).map(function (n, i) {
|
|
45
|
+
return [labels[i] || '#' + (i + 1), fmt(n, o) + (auto ? '%' : ' of ' + fmt(max, o))];
|
|
46
|
+
}) };
|
|
47
|
+
};
|