chartjs-chart-treemap 3.1.0 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,8 @@
1
1
  /*!
2
- * chartjs-chart-treemap v3.1.0
2
+ * chartjs-chart-treemap v0.0.0-development
3
3
  * https://chartjs-chart-treemap.pages.dev/
4
- * (c) 2024 Jukka Kurkela
4
+ * (c) 2026 Jukka Kurkela
5
5
  * Released under the MIT license
6
6
  */
7
- !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("chart.js"),require("chart.js/helpers")):"function"==typeof define&&define.amd?define(["exports","chart.js","chart.js/helpers"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self)["chartjs-chart-treemap"]={},t.Chart,t.Chart.helpers)}(this,(function(t,e,n){"use strict";const i=(t,e)=>e>t||t.length>e.length&&t.slice(0,e.length)===e,r=t=>""+t;function o(t,e,i,s=[],a=0,h=[]){const l=a-1;if(t[0]in i&&a>0){const n=s.reduce((function(t,e,n){return n!==l&&(t[r(n)]=e),t}),{});n[e]=s[l],t.forEach((function(t){n[t]=i[t]})),h.push(n)}else for(const r of Object.keys(i)){const l=i[r];n.isObject(l)&&(s.push(r),o(t,e,l,s,a+1,h))}return s.splice(l,1),h}function s(t,e,n){const i=o(t,e,n);if(!i.length)return i;const s=i.reduce((function(t,e){const n=Object.keys(e).length-2;return t>n?t:n}));return i.forEach((function(t){for(let e=0;e<s;e++){const n=r(e);t[n]||(t[n]="")}})),i}function a(t){const e=[...t],n=[];for(;e.length;){const t=e.pop();Array.isArray(t)?e.push(...t):n.push(t)}return n.reverse()}function h(t,e,n){if(!t.length)return;const i=[];for(const r of t){const t=e[r];if(""===t){i.push(n);break}i.push(t)}return i.length?i.join("."):n}function l(t,e,n,i,r,o,s=[]){const a=n[0],l=n.slice(1),u=Object.create(null),c=Object.create(null),f=[];let d,g,p;for(g=0,p=t.length;g<p;++g){const n=t[g];if(r&&n[r]!==o)continue;if(d=n[e]||n[i]||"",!(d in u)){const t=u[d]={value:0};l.forEach((function(e){t[e]=0})),c[d]=[]}u[d].value+=+n[a],u[d].label=n[e]||"";const f=u[d];l.forEach((function(t){f[t]+=n[t]})),u[d].path=h(s,n,d),c[d].push(n)}return Object.keys(u).forEach((t=>{const n={children:c[t]};n[a]=+u[t].value,l.forEach((function(e){n[e]=+u[t][e]})),n[e]=u[t].label,n.label=t,n.path=u[t].path,r&&(n[r]=o),f.push(n)})),f}function u(t,e){let i,r=t.length;if(!r)return e;const o=n.isObject(t[0]);for(e=o?e:"v",i=0,r=t.length;i<r;++i)o?t[i]._idx=i:t[i]={v:t[i],_idx:i};return e}function c(t,e){e?t.sort(((t,n)=>+n[e]-+t[e])):t.sort(((t,e)=>+e-+t))}function f(t,e){let n,i,r;for(n=0,i=0,r=t.length;i<r;++i)n+=e?+t[i][e]:+t[i];return n}function d(t,e,n,r=!0){const o=n.split(".");let s=0;for(const a of e.split(".")){const h=o[s++];if(parseInt(a,10)<parseInt(h,10))break;if(i(h,a)){if(r)throw new Error(`${t} v${n} is not supported. v${e} or newer is required.`);return!1}}return!0}const g=new Map;function p(t,e){const{x:n,y:i,width:r,height:o}=t.getProps(["x","y","width","height"],e);return{left:n,top:i,right:n+r,bottom:i+o}}function m(t,e,n){return Math.max(Math.min(t,n),e)}function x(t,e,i){const r=n.toTRBL(t);return{t:m(r.top,0,i),r:m(r.right,0,e),b:m(r.bottom,0,i),l:m(r.left,0,e)}}function b(t){const e=p(t),i=e.right-e.left,r=e.bottom-e.top,o=x(t.options.borderWidth,i/2,r/2),s=function(t,e,i){const r=n.toTRBLCorners(t),o=Math.min(e,i);return{topLeft:m(r.topLeft,0,o),topRight:m(r.topRight,0,o),bottomLeft:m(r.bottomLeft,0,o),bottomRight:m(r.bottomRight,0,o)}}(t.options.borderRadius,i/2,r/2),a={x:e.left,y:e.top,w:i,h:r,active:t.active,radius:s};return{outer:a,inner:{x:a.x+o.l,y:a.y+o.t,w:a.w-o.l-o.r,h:a.h-o.t-o.b,active:t.active,radius:{topLeft:Math.max(0,s.topLeft-Math.max(o.t,o.l)),topRight:Math.max(0,s.topRight-Math.max(o.t,o.r)),bottomLeft:Math.max(0,s.bottomLeft-Math.max(o.b,o.l)),bottomRight:Math.max(0,s.bottomRight-Math.max(o.b,o.r))}}}}function y(t,e,n,i){const r=null===e,o=null===n,s=!(!t||r&&o)&&p(t,i);return s&&(r||e>=s.left&&e<=s.right)&&(o||n>=s.top&&n<=s.bottom)}function v(t,e){t.rect(e.x,e.y,e.w,e.h)}function w(t,e){if(!e||!1===e.display)return!1;const{w:i,h:r}=t,o=n.toFont(e.font).lineHeight,s=m(2*n.valueOrDefault(e.padding,3),0,Math.min(i,r));return i-s>o&&r-s>o}function _(t,e,i,r,o){const{captions:s,labels:a}=i;t.save(),t.beginPath(),t.rect(e.x,e.y,e.w,e.h),t.clip();const h=r&&(!n.defined(r.l)||r.l===o);h&&a.display?function(t,e,i){const r=i.labels,o=r.formatter;if(!o)return;const s=n.isArray(o)?o:[o];let a=function(t,e){const{font:i,hoverFont:r}=e,o=(t.active?r:i)||i;return n.isArray(o)?o.map((t=>n.toFont(t))):[n.toFont(o)]}(e,r),h=function(t,e,n){const i=n.reduce((function(t,e){return t+=e.string}),""),r=e.join()+i+(t._measureText?"-spriting":"");if(!g.has(r)){t.save();const i=e.length;let o=0,s=0;for(let r=0;r<i;r++){const i=n[Math.min(r,n.length-1)];t.font=i.string;const a=e[r];o=Math.max(o,t.measureText(a).width),s+=i.lineHeight}t.restore(),g.set(r,{width:o,height:s})}return g.get(r)}(t,s,a);const l=function(t,e,n,i){const{overflow:r,padding:o}=n,{width:s,height:a}=i;if("hidden"===r)return!(s+2*o>e.w||a+2*o>e.h);if("fit"===r){const t=Math.min(e.w/(s+2*o),e.h/(a+2*o));if(t<1)return t}return!0}(0,e,r,h);if(!l)return;n.isNumber(l)&&(h={width:h.width*l,height:h.height*l},a=function(t,e){return t.map((function(t){return t.size=Math.floor(t.size*e),t.lineHeight=void 0,n.toFont(t)}))}(a,l));const{color:u,hoverColor:c,align:f}=r,d=(e.active?c:u)||u,p=n.isArray(d)?d:[d],m=function(t,e,n){const{align:i,position:r,padding:o}=e;let s,a;s=M(t,i,o),a="top"===r?t.y+o:"bottom"===r?t.y+t.h-o-n.height:t.y+(t.h-n.height)/2+o;return{x:s,y:a}}(e,r,h);t.textAlign=f,t.textBaseline="middle";let x=0;s.forEach((function(e,n){const i=p[Math.min(n,p.length-1)],r=a[Math.min(n,a.length-1)],o=r.lineHeight;t.font=r.string,t.fillStyle=i,t.fillText(e,m.x,m.y+o/2+x),x+=o}))}(t,e,i):!h&&w(e,s)&&function(t,e,i,r){const{captions:o,spacing:s,rtl:a}=i,{color:h,hoverColor:l,font:u,hoverFont:c,padding:f,align:d,formatter:g}=o,p=(e.active?l:h)||h,m=d||(a?"right":"left"),x=(e.active?c:u)||u,b=n.toFont(x),y=b.lineHeight/2,v=M(e,m,f);t.fillStyle=p,t.font=b.string,t.textAlign=m,t.textBaseline="middle",t.fillText(g||r.g,v,e.y+f+s+y)}(t,e,i,r),t.restore()}function M(t,e,n){return"left"===e?t.x+n:"right"===e?t.x+t.w-n:t.x+t.w/2}class C extends e.Element{constructor(t){super(),this.options=void 0,this.width=void 0,this.height=void 0,t&&Object.assign(this,t)}draw(t,e,i=0){if(!e)return;const r=this.options,{inner:o,outer:s}=b(this),a=(h=s.radius).topLeft||h.topRight||h.bottomLeft||h.bottomRight?n.addRoundedRectPath:v;var h;t.save(),s.w===o.w&&s.h===o.h||(t.beginPath(),a(t,s),t.clip(),a(t,o),t.fillStyle=r.borderColor,t.fill("evenodd")),t.beginPath(),a(t,o),t.fillStyle=r.backgroundColor,t.fill(),function(t,e,n,i){const r=n.dividers;if(!r.display||!i._data.children.length)return;const{x:o,y:s,w:a,h:h}=e,{lineColor:l,lineCapStyle:u,lineDash:c,lineDashOffset:f,lineWidth:d}=r;if(t.save(),t.strokeStyle=l,t.lineCap=u,t.setLineDash(c),t.lineDashOffset=f,t.lineWidth=d,t.beginPath(),a>h){const e=a/2;t.moveTo(o+e,s),t.lineTo(o+e,s+h)}else{const e=h/2;t.moveTo(o,s+e),t.lineTo(o+a,s+e)}t.stroke(),t.restore()}(t,o,r,e),_(t,o,r,e,i),t.restore()}inRange(t,e,n){return y(this,t,e,n)}inXRange(t,e){return y(this,t,null,e)}inYRange(t,e){return y(this,null,t,e)}getCenterPoint(t){const{x:e,y:n,width:i,height:r}=this.getProps(["x","y","width","height"],t);return{x:e+i/2,y:n+r/2}}tooltipPosition(){return this.getCenterPoint()}getRange(t){return"x"===t?this.width/2:this.height/2}}function k(t,e,n,i){const r=t._normalized,o=e*r/n,s=Math.sqrt(r*o),a=r/s;return{d1:s,d2:a,w:"_ix"===i?s:a,h:"_ix"===i?a:s}}C.id="treemap",C.defaults={borderRadius:0,borderWidth:0,captions:{align:void 0,color:"black",display:!0,font:{},formatter:t=>t.raw.g||t.raw._data.label||"",padding:3},dividers:{display:!1,lineCapStyle:"butt",lineColor:"black",lineDash:[],lineDashOffset:0,lineWidth:1},label:void 0,labels:{align:"center",color:"black",display:!1,font:{},formatter:t=>t.raw.g?[t.raw.g,t.raw.v+""]:t.raw._data.label?[t.raw._data.label,t.raw.v+""]:t.raw.v+"",overflow:"cut",position:"middle",padding:3},rtl:!1,spacing:.5,unsorted:!1},C.descriptors={captions:{_fallback:!0},labels:{_fallback:!0},_scriptable:!0,_indexable:!1},C.defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};const R=(t,e)=>t.rtl?t.x+t.iw-e:t.x+t._ix;function O(t,e,n,i){const r={x:R(t,n.w),y:t.y+t._iy,w:n.w,h:n.h,a:e._normalized,v:e.value,vs:e.values,s:i,_data:e._data};return e.group&&(r.g=e.group,r.l=e.level,r.gs=e.groupSum),r}class j{constructor(t){t=t||{w:1,h:1},this.rtl=!!t.rtl,this.unsorted=!!t.unsorted,this.x=t.x||t.left||0,this.y=t.y||t.top||0,this._ix=0,this._iy=0,this.w=t.w||t.width||t.right-t.left,this.h=t.h||t.height||t.bottom-t.top}get area(){return this.w*this.h}get iw(){return this.w-this._ix}get ih(){return this.h-this._iy}get dir(){const t=this.ih;return t<=this.iw&&t>0?"y":"x"}get side(){return"x"===this.dir?this.iw:this.ih}map(t){const{dir:e,side:n}=this,i="x"===e?"_ix":"_iy",r=t.nsum,o=t.get(),s=n*n,a=r*r,h=[];let l=0,u=0;for(const e of o){const n=k(e,s,a,i);u+=n.d1,l=Math.max(l,n.d2),h.push(O(this,e,n,t.sum)),this[i]+=n.d1}return this["x"===e?"_iy":"_ix"]+=l,this[i]-=u,h}}const T=Math.min,E=Math.max;function P(t,e){const n=+e[t.key],i=n*t.ratio;return e._normalized=i,{min:T(t.min,n),max:E(t.max,n),sum:t.sum+n,nmin:T(t.nmin,i),nmax:E(t.nmax,i),nsum:t.nsum+i}}function S(t,e,n){t._arr.push(e),function(t,e){Object.assign(t,e)}(t,n)}class D{constructor(t,e){const n=this;n.key=t,n.ratio=e,n.reset()}get length(){return this._arr.length}reset(){const t=this;t._arr=[],t._hist=[],t.sum=0,t.nsum=0,t.min=1/0,t.max=-1/0,t.nmin=1/0,t.nmax=-1/0}push(t){S(this,t,P(this,t))}pushIf(t,e,...n){const i=P(this,t);if(!e((r=this,{min:r.min,max:r.max,sum:r.sum,nmin:r.nmin,nmax:r.nmax,nsum:r.nsum}),i,n))return t;var r;S(this,t,i)}get(){return this._arr}}function L(t,e,n){if(0===t.sum)return!0;const[i]=n,r=t.nsum*t.nsum,o=e.nsum*e.nsum,s=i*i,a=Math.max(s*t.nmax/r,r/(s*t.nmin));return Math.max(s*e.nmax/o,o/(s*e.nmin))<=a}function F(t,e,n=[],i,r,o){t=t||[];const s=[],h=new j(e),l=new D("value",h.area/f(t,n[0]));let d=h.side;const g=t.length;let p,m;if(!g)return s;const x=t.slice();let b=u(x,n[0]);e?.unsorted||c(x,b);const y=t=>i&&x[t][i];for(p=0;p<g;++p){if(m={value:(v=p,b?+x[v][b]:+x[v]),groupSum:o,_data:t[x[p]._idx],level:void 0,group:void 0},i){m.level=r,m.group=y(p);const t=x[p];m.values=n.reduce((function(e,n){return e[n]=+t[n],e}),{})}m=l.pushIf(m,L,d),m&&(s.push(h.map(l)),d=h.side,l.reset(),l.push(m))}var v;return l.length&&s.push(h.map(l)),a(s)}function A(t,e,n,i){const r=2*i,o=e.getPixelForValue(t.x),s=n.getPixelForValue(t.y),a=e.getPixelForValue(t.x+t.w)-o,h=n.getPixelForValue(t.y+t.h)-s;return{x:o+i,y:s+i,width:a-r,height:h-r,hidden:r>a||r>h}}function z(t,e){let n,i;if(!t||!e)return!0;if(t===e)return!1;if(t.length!==e.length)return!0;for(n=0,i=t.length;n<i;++n)if(t[n]!==e[n])return!0;return!1}class H extends e.DatasetController{constructor(t,e){super(t,e),this._groups=void 0,this._keys=void 0,this._rect=void 0,this._rectChanged=!0}initialize(){this.enableOptionSharing=!0,super.initialize()}getMinMax(t){return{min:0,max:"x"===t.axis?t.right-t.left:t.bottom-t.top}}configure(){super.configure();const{xScale:t,yScale:e}=this.getMeta();if(!t||!e)return;const n=t.right-t.left,i=e.bottom-e.top,r={x:0,y:0,w:n,h:i,rtl:!!this.options.rtl,unsorted:!!this.options.unsorted};var o,s;o=this._rect,s=r,o&&s&&o.x===s.x&&o.y===s.y&&o.w===s.w&&o.h===s.h&&o.rtl===s.rtl&&o.unsorted===s.unsorted||(this._rect=r,this._rectChanged=!0),this._rectChanged&&(t.max=n,t.configure(),e.max=i,e.configure())}update(t){const e=this.getDataset(),{data:i}=this.getMeta(),o=e.groups||[],a=[e.key||""].concat(e.sumKeys||[]),h=e.tree=e.tree||e.data||[];"reset"===t&&this.configure(),(this._rectChanged||z(this._keys,a)||z(this._groups,o)||this._prevTree!==h)&&(this._groups=o.slice(),this._keys=a.slice(),this._prevTree=h,this._rectChanged=!1,e.data=function(t,e,i,o){const a=e.treeLeafKey||"_leaf";n.isObject(t)&&(t=s(i,a,t));const h=e.groups||[],u=h.length,c=n.valueOrDefault(e.spacing,0),f=e.captions||{},d=n.toFont(f.font),g=n.valueOrDefault(f.padding,3);return u?function t(n,o,s,p,m){const b=r(h[o]),y=o>0&&r(h[o-1]),v=l(n,b,i,a,y,p,h.filter(((t,e)=>e<=o))),_=F(v,s,i,b,o,m),M=_.slice();return o<u-1&&_.forEach((n=>{const i=x(e.borderWidth,n.w/2,n.h/2),r={...s,x:n.x+c+i.l,y:n.y+c+i.t,w:n.w-2*c-i.l-i.r,h:n.h-2*c-i.t-i.b};w(r,f)&&(r.y+=d.lineHeight+2*g,r.h-=d.lineHeight+2*g),v.forEach((e=>{M.push(...t(e.children,o+1,r,n.g,n.s))}))})),M}(t,0,o):F(t,o,i)}(h,e,this._keys,this._rect),this._dataCheck(),this._resyncElements()),this.updateElements(i,0,i.length,t)}updateElements(t,e,n,i){const r="reset"===i,o=this.getDataset(),s=this._rect.options=this.resolveDataElementOptions(e,i),a=this.getSharedOptions(s),h=this.includeOptions(i,a),{xScale:l,yScale:u}=this.getMeta(this.index);for(let s=e;s<e+n;s++){const e=a||this.resolveDataElementOptions(s,i),n=A(o.data[s],l,u,e.spacing);r&&(n.width=0,n.height=0),h&&(n.options=e),this.updateElement(t[s],s,n,i)}this.updateSharedOptions(a,i,s)}draw(){const{ctx:t,chartArea:e}=this.chart,i=this.getMeta().data||[],r=this.getDataset(),o=(r.groups||[]).length-1,s=r.data;n.clipArea(t,e);for(let e=0,n=i.length;e<n;++e){const n=i[e];n.hidden||n.draw(t,s[e],o)}n.unclipArea(t)}}H.id="treemap",H.version="3.1.0",H.defaults={dataElementType:"treemap",animations:{numbers:{type:"number",properties:["x","y","width","height"]}}},H.descriptors={_scriptable:!0,_indexable:!1},H.overrides={interaction:{mode:"point",includeInvisible:!0,intersect:!0},hover:{},plugins:{tooltip:{position:"treemap",intersect:!0,callbacks:{title(t){if(t.length){return t[0].dataset.key||""}return""},label(t){const e=t.dataset,n=e.data[t.dataIndex],i=n.g||n._data.label||e.label;return(i?i+": ":"")+n.v}}}},scales:{x:{type:"linear",alignToPixels:!0,bounds:"data",display:!1},y:{type:"linear",alignToPixels:!0,bounds:"data",display:!1,reverse:!0}}},H.beforeRegister=function(){d("chart.js","3.8",e.Chart.version)},H.afterRegister=function(){const t=e.registry.plugins.get("tooltip");t?t.positioners.treemap=function(t){if(!t.length)return!1;return t[t.length-1].element.tooltipPosition()}:console.warn("Unable to register the treemap positioner because tooltip plugin is not registered")},H.afterUnregister=function(){const t=e.registry.plugins.get("tooltip");t&&delete t.positioners.treemap},e.Chart.register(H,C),t.flatten=a,t.getGroupKey=r,t.group=l,t.index=u,t.normalizeTreeToArray=s,t.requireVersion=d,t.sort=c,t.sum=f}));
7
+ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("chart.js"),require("chart.js/helpers")):"function"==typeof define&&define.amd?define(["exports","chart.js","chart.js/helpers"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self)["chartjs-chart-treemap"]={},t.Chart,t.Chart.helpers)}(this,function(t,e,n){"use strict";function i(t,e,n,i){const r=2*i,o=e.getPixelForValue(t.x),s=n.getPixelForValue(t.y),a=e.getPixelForValue(t.x+t.w)-o,h=n.getPixelForValue(t.y+t.h)-s;return{height:h-r,hidden:r>a||r>h,width:a-r,x:o+i,y:s+i}}function r(t,e){let n,i;if(!t||!e)return!0;if(t===e)return!1;if(t.length!==e.length)return!0;for(n=0,i=t.length;n<i;++n)if(t[n]!==e[n])return!0;return!1}function o(t,e,n){return Math.max(Math.min(t,n),e)}function s(t,e,i){const r=n.toTRBL(t);return{b:o(r.bottom,0,i),l:o(r.left,0,e),r:o(r.right,0,e),t:o(r.top,0,i)}}function a(t,e,n,i){const r=t._normalized,o=e*r/n,s=Math.sqrt(r*o),a=r/s;return{d1:s,d2:a,h:"_ix"===i?a:s,w:"_ix"===i?s:a}}const h=(t,e)=>t.rtl?t.x+t.iw-e:t.x+t._ix;function l(t,e,n,i){const r={_data:e._data,a:e._normalized,h:n.h,s:i,v:e.value,vs:e.values,w:n.w,x:h(t,n.w),y:t.y+t._iy};return e.group&&(r.g=e.group,r.l=e.level,r.gs=e.groupSum),r}class u{get area(){return this.w*this.h}get iw(){return this.w-this._ix}get ih(){return this.h-this._iy}get dir(){const t=this.ih;return t<=this.iw&&t>0?"y":"x"}get side(){return"x"===this.dir?this.iw:this.ih}map(t){const{dir:e,side:n}=this,i="x"===e?"_ix":"_iy",r=t.nsum,o=t.get(),s=n*n,h=r*r,u=[];let c=0,d=0;for(const e of o){const n=a(e,s,h,i);d+=n.d1,c=Math.max(c,n.d2),u.push(l(this,e,n,t.sum)),this[i]+=n.d1}return this["x"===e?"_iy":"_ix"]+=c,this[i]-=d,u}constructor(t){t=t||{h:1,w:1},this.rtl=!!t.rtl,this.unsorted=!!t.unsorted,this.x=t.x||t.left||0,this.y=t.y||t.top||0,this._ix=0,this._iy=0,this.w=t.w||t.width||t.right-t.left,this.h=t.h||t.height||t.bottom-t.top}}const c=Math.min,d=Math.max;function f(t,e){const n=+e[t.key],i=n*t.ratio;return e._normalized=i,{max:d(t.max,n),min:c(t.min,n),nmax:d(t.nmax,i),nmin:c(t.nmin,i),nsum:t.nsum+i,sum:t.sum+n}}function p(t,e,n){t._arr.push(e),function(t,e){Object.assign(t,e)}(t,n)}class g{get length(){return this._arr.length}reset(){this._arr=[],this._hist=[],this.sum=0,this.nsum=0,this.min=1/0,this.max=-1/0,this.nmin=1/0,this.nmax=-1/0}push(t){p(this,t,f(this,t))}pushIf(t,e,...n){const i=f(this,t);if(!e((r=this,{max:r.max,min:r.min,nmax:r.nmax,nmin:r.nmin,nsum:r.nsum,sum:r.sum}),i,n))return t;var r;p(this,t,i)}get(){return this._arr}constructor(t,e){this._arr=[],this._hist=[],this.sum=0,this.nsum=0,this.min=1/0,this.max=-1/0,this.nmin=1/0,this.nmax=-1/0,this.key=t,this.ratio=e,this.reset()}}const m=(t,e)=>e>t||t.length>e.length&&t.startsWith(e),x=t=>String(t),y=t=>null!=t&&""!==t;function b(t,e,i,r=[],o=0,s=[]){const a=o-1;if(t[0]in i&&o>0){const n=r.reduce((t,e,n)=>(n!==a&&(t[x(n)]=e),t),{});n[e]=r[a],t.forEach(t=>{n[t]=i[t]}),s.push(n)}else for(const a of Object.keys(i)){const h=i[a];n.isObject(h)&&(r.push(a),b(t,e,h,r,o+1,s))}return r.splice(a,1),s}function v(t,e,n){const i=b(t,e,n);if(!i.length)return i;const r=i.reduce((t,e)=>{const n=Object.keys(e).length-2;return Math.max(t,n)},0);return i.forEach(t=>{for(let e=0;e<r;e++){const n=x(e);t[n]||(t[n]="")}}),i}function w(t){const e=[...t],n=[];for(;e.length;){const t=e.pop();Array.isArray(t)?e.push(...t):n.push(t)}return n.reverse()}function _(t,e,n){const i=[];for(const n of t){const t=e[n];y(t)&&i.push(t)}return i.length?i.join("."):n}function M(t,e,n,i){for(let e=i;e<n.length;e++){const i=x(n[e]);if(y(t[i]))return{group:i,groupIndex:e,value:t[i]}}if(y(t[e]))return{group:e,groupIndex:i,value:t[e]}}function C(t,e,n,i){if(n in t)return;t[n]={value:0};const r=t[n];i.forEach(t=>{r[t]=0}),e[n]=[]}function k(t,e,n,i,r,o,s=[],a=s,h=s.length-1){const l=n[0],u=n.slice(1),c=Object.create(null),d=Object.create(null),f=[],p=a.length?a:[e],g=a.length?h:0;let m,x;for(m=0,x=t.length;m<x;++m){const e=t[m];if(r&&e[r]!==o)continue;const n=M(e,i,p,g);if(!n)return[];const s=n.value;C(c,d,s,u),c[s].value+=+e[l],c[s].label=s,c[s].group=n.group,c[s].groupIndex=n.groupIndex;const a=c[s];u.forEach(t=>{a[t]+=e[t]}),c[s].path=_(p.slice(0,n.groupIndex+1),e,s),d[s].push(e)}return Object.keys(c).forEach(t=>{const n={children:d[t]};n[l]=+c[t].value,u.forEach(e=>{n[e]=+c[t][e]}),n[e]=c[t].label,n.group=c[t].group,n.groupIndex=c[t].groupIndex,n.label=t,n.path=c[t].path,r&&(n[r]=o),f.push(n)}),f}function O(t,e){let i,r=t.length;if(!r)return e;const o=n.isObject(t[0]);for(e=o?e:"v",i=0,r=t.length;i<r;++i)o?t[i]._idx=i:t[i]={_idx:i,v:t[i]};return e}function R(t,e){e?t.sort((t,n)=>+n[e]-+t[e]):t.sort((t,e)=>+e-+t)}function T(t,e){let n,i,r;for(n=0,i=0,r=t.length;i<r;++i)n+=e?+t[i][e]:+t[i];return n}function j(t,e,n,i=!0){const r=n.split(".");let o=0;for(const s of e.split(".")){const a=r[o++];if(Number.parseInt(s,10)<Number.parseInt(a,10))break;if(m(a,s)){if(i)throw new Error(`${t} v${n} is not supported. v${e} or newer is required.`);return!1}}return!0}function E(t,e,n){if(0===t.sum)return!0;const[i]=n,r=t.nsum*t.nsum,o=e.nsum*e.nsum,s=i*i,a=Math.max(s*t.nmax/r,r/(s*t.nmin));return Math.max(s*e.nmax/o,o/(s*e.nmin))<=a}function L(t,e,n=[],i,r,o){t=t||[];const s=[],a=new u(e),h=new g("value",a.area/T(t,n[0]));let l=a.side;const c=t.length;let d,f;if(!c)return s;const p=t.slice(),m=O(p,n[0]);e?.unsorted||R(p,m);const x=t=>m?+p[t][m]:+p[t],y=t=>i&&p[t][i];for(d=0;d<c;++d){if(f={_data:t[p[d]._idx],group:void 0,groupSum:o,level:void 0,value:x(d)},i){f.level=p[d].groupIndex??r,f.group=y(d);const t=p[d];f.values=n.reduce((e,n)=>(e[n]=+t[n],e),{})}f=h.pushIf(f,E,l),f&&(s.push(a.map(h)),l=a.side,h.reset(),h.push(f))}return h.length&&s.push(a.map(h)),w(s)}const P=new Map;function S(t,e,i){if(!i||!1===i.display)return!1;if("headerBoxes"===t)return!0;const{w:r,h:o}=e,s=n.toFont(i.font||{}).lineHeight,a=Math.max(Math.min(2*n.valueOrDefault(i.padding,3),Math.min(r,o)),0);return r-a>s&&o-a>s}function D(t,e,n,i){if("headerBoxes"!==t)return n.lineHeight+2*i;const r=n.lineHeight+2*i;return e.h<2*r?e.h/3:r}function I(t,e,i,r,o){const{captions:s,labels:a,displayMode:h}=i;t.save(),t.beginPath(),t.rect(e.x,e.y,e.w,e.h),t.clip();const l=r&&(!n.defined(r.l)||r.isLeaf);l&&a.display?function(t,e,i,r,o){const s=i.labels,a=B(s.formatter,A(o,r));if(!a)return;const h=n.isArray(a)?a:[a];let l=function(t,e){const{font:i,hoverFont:r}=e,o=(t.active?r:i)||i;return Array.isArray(o)?o.map(t=>n.toFont(t)):[n.toFont(o)]}(e,s),u=F(t,h,l);const c=function(t,e,n,i){const{overflow:r,padding:o}=n,{width:s,height:a}=i;if("hidden"===r)return!(s+2*o>e.w||a+2*o>e.h);if("fit"===r){const t=Math.min(e.w/(s+2*o),e.h/(a+2*o));if(t<1)return t}return!0}(0,e,s,u);if(!c)return;n.isNumber(c)&&(u={height:u.height*c,width:u.width*c},l=function(t,e){return t.map(t=>{const{lineHeight:i,...r}=t;return n.toFont({...r,size:Math.floor(t.size*e)})})}(l,c));const{color:d,hoverColor:f,align:p}=s,g=(e.active?f:d)||d,m=n.isArray(g)?g:[g],x=function(t,e,n){const{align:i,position:r,padding:o}=e,s=z(t,i,o);let a;a="top"===r?t.y+o:"bottom"===r?t.y+t.h-o-n.height:t.y+(t.h-n.height)/2+o;return{x:s,y:a}}(e,s,u);t.textAlign=p,t.textBaseline="middle";let y=0;h.forEach((e,n)=>{const i=m[Math.min(n,m.length-1)],r=l[Math.min(n,l.length-1)],o=r.lineHeight;t.font=r.string,t.fillStyle=i,t.fillText(e,x.x,x.y+o/2+y),y+=o})}(t,e,i,r,o):!l&&S(h,e,s)&&function(t,e,i,r,o){const{captions:s,spacing:a,rtl:h,displayMode:l}=i,{color:u,hoverColor:c,font:d,hoverFont:f,padding:p,align:g}=s,m=(e.active?c:u)||u,x=g||(h?"right":"left"),y=(e.active?f:d)||d,b=n.toFont(y),v=[b];if(b.lineHeight>e.h)return;let w=function(t,e,n){return B(t.formatter,A(e,n))||n.g||""}(s,o,r);if(!w)return;const _=F(t,[w],v);_.width+2*p>e.w&&(w=function(t,e,n,i){const r="...",o=F(t,[r],i).width;if(o>=n)return"";let s,a=1,h=e.length;for(;a<=h;){const r=Math.floor((a+h)/2);s=F(t,[e.slice(0,r)],i).width,s+o>n?h=r-1:a=r+1}const l=e.slice(0,Math.max(0,a-1));return l?l+r:""}(t,w,e.w-2*p,v));const M=b.lineHeight/2,C=z(e,x,p);t.fillStyle=m,t.font=b.string,t.textAlign=x,t.textBaseline="middle";const k="headerBoxes"===l?e.y+e.h/2:e.y+p+a+M;t.fillText(w,C,k)}(t,e,i,r,o),t.restore()}function A(t,e){const n=t.$context||{active:!!t.active,raw:e,type:"data"};return n.active=!!t.active,n.raw=e,n}function B(t,e){return"function"==typeof t?t(e):t}function F(t,e,n){const i=n.reduce((t,e)=>t+=e.string,""),r=e.join()+i+(t._measureText?"-spriting":"");let o=P.get(r);if(!o){t.save();const i=e.length;let s=0,a=0;for(let r=0;r<i;r++){const i=n[Math.min(r,n.length-1)];t.font=i.string;const o=e[r];s=Math.max(s,t.measureText(o).width),a+=i.lineHeight}t.restore(),o={height:a,width:s},P.set(r,o)}return o}function z(t,e,n){return"left"===e?t.x+n:"right"===e?t.x+t.w-n:t.x+t.w/2}function H(t,e,i,r){const o=e.treeLeafKey||"_leaf";n.isObject(t)&&(t=v(i,o,t));const a=e.groups||[],h=a.length,l="headerBoxes"===e.displayMode?0:n.valueOrDefault(e.spacing,0),u=e.captions||{},c=n.toFont(u.font),d=n.valueOrDefault(u.padding,3);const f=h?function t(n,r,f,p,g){const m=x(a[r]),y=k(n,m,i,o,void 0,p,a.filter((t,e)=>e<=r),a,r),b=L(y,f,i,m,r,g),v=b.slice();return r<h-1?b.forEach(n=>{const i=function(t,n){const i="headerBoxes"===e.displayMode?{b:0,l:0,r:0,t:0}:s(e.borderWidth,t.w/2,t.h/2),r={...n,h:t.h-2*l-i.t-i.b,w:t.w-2*l-i.l-i.r,x:t.x+l+i.l,y:t.y+l+i.t};if(S(e.displayMode,r,u)){const t=D(e.displayMode,r,c,d);r.y+=t,r.h-=t}return r}(n,f),r=[],o=n._data.groupIndex+1;o<h&&r.push(...t(n._data.children,o,i,n.g,n.s)),v.push(...r),n.isLeaf=!r.length}):b.forEach(t=>{t.isLeaf=!0}),v}(t,0,r):L(t,r,i);return f.map(t=>{if("headerBoxes"!==e.displayMode||t.isLeaf)return t;if(!S(e.displayMode,t,u))return;const n=D(e.displayMode,t,c,d);return{...t,h:n}}).filter(Boolean)}class $ extends e.DatasetController{initialize(){this.enableOptionSharing=!0,super.initialize()}getMinMax(t){return{max:"x"===t.axis?t.right-t.left:t.bottom-t.top,min:0}}configure(){super.configure();const{xScale:t,yScale:e}=this.getMeta();if(!t||!e)return;const n=t.right-t.left,i=e.bottom-e.top,r={h:i,rtl:!!this.options.rtl,unsorted:!!this.options.unsorted,w:n,x:0,y:0};var o,s;o=this._rect,s=r,o&&s&&o.x===s.x&&o.y===s.y&&o.w===s.w&&o.h===s.h&&o.rtl===s.rtl&&o.unsorted===s.unsorted||(this._rect=r,this._rectChanged=!0),this._rectChanged&&(t.max=n,t.configure(),e.max=i,e.configure())}update(t){const e=this.getDataset(),{data:n}=this.getMeta(),i=e.groups||[],o=[e.key||""].concat(e.sumKeys||[]);e.tree=e.tree||e.data||[];const s=e.tree;"reset"===t&&this.configure(),(this._rectChanged||r(this._keys||[],o)||r(this._groups||[],i)||this._prevTree!==s)&&(this._groups=i.slice(),this._keys=o.slice(),this._prevTree=s,this._rectChanged=!1,e.data=H(s,e,this._keys,this._rect),this._dataCheck(),this._resyncElements()),this.updateElements(n,0,n.length,t)}updateElements(t,e,n,r){const o="reset"===r,s=this.getDataset(),a=this.resolveDataElementOptions(e,r);this._rect.options=a;const h=this.getSharedOptions(a),l=this.includeOptions(r,h||{}),{xScale:u,yScale:c}=this.getMeta();for(let a=e;a<e+n;a++){const e=h||this.resolveDataElementOptions(a,r),n=i(s.data[a],u,c,e.spacing);o&&(n.width=0,n.height=0),l&&(n.options=e),this.updateElement(t[a],a,n,r)}this.updateSharedOptions(h||{},r,a)}draw(){const{ctx:t,chartArea:e}=this.chart,i=this.getMeta().data||[],r=this.getDataset().data;n.clipArea(t,e);for(let e=0,n=i.length;e<n;++e){const n=i[e];n.hidden||n.draw(t,r[e])}n.unclipArea(t)}constructor(t,e){super(t,e),this._groups=void 0,this._keys=void 0,this._rect=void 0,this._rectChanged=!0}}function W(t,e){const{x:n,y:i,width:r,height:o}=t.getProps(["x","y","width","height"],e);return{bottom:i+o,left:n,right:n+r,top:i}}function q(t){const e=W(t),i=e.right-e.left,r=e.bottom-e.top,a=s(t.options.borderWidth,i/2,r/2),h=function(t,e,i){const r=n.toTRBLCorners(t),s=Math.min(e,i);return{bottomLeft:o(r.bottomLeft,0,s),bottomRight:o(r.bottomRight,0,s),topLeft:o(r.topLeft,0,s),topRight:o(r.topRight,0,s)}}(t.options.borderRadius,i/2,r/2),l={active:t.active,h:r,radius:h,w:i,x:e.left,y:e.top};return{inner:{active:t.active,h:l.h-a.t-a.b,radius:{bottomLeft:Math.max(0,h.bottomLeft-Math.max(a.b,a.l)),bottomRight:Math.max(0,h.bottomRight-Math.max(a.b,a.r)),topLeft:Math.max(0,h.topLeft-Math.max(a.t,a.l)),topRight:Math.max(0,h.topRight-Math.max(a.t,a.r))},w:l.w-a.l-a.r,x:l.x+a.l,y:l.y+a.t},outer:l}}function V(t,e,n,i){const r=null===e,o=null===n,s=!(!t||r&&o)&&W(t,i);return s&&(r||e>=s.left&&e<=s.right)&&(o||n>=s.top&&n<=s.bottom)}function K(t,e){t.rect(e.x,e.y,e.w,e.h)}$.id="treemap",$.version="0.0.0-development",$.defaults={animations:{numbers:{properties:["x","y","width","height"],type:"number"}},dataElementType:"treemap"},$.descriptors={_indexable:!1,_scriptable:!0,captions:{_fallback:!0,_scriptable:t=>"formatter"!==t},labels:{_fallback:!0,_scriptable:t=>"formatter"!==t}},$.overrides={hover:{},interaction:{includeInvisible:!0,intersect:!0,mode:"point"},plugins:{tooltip:{callbacks:{label(t){const e=t.dataset,n=e.data[t.dataIndex],i=n.g||n._data.label||e.label;return(i?`${i}: `:"")+n.v},title(t){if(t.length){return t[0].dataset.key||""}return""}},intersect:!0,position:"treemap"}},scales:{x:{alignToPixels:!0,bounds:"data",display:!1,type:"linear"},y:{alignToPixels:!0,bounds:"data",display:!1,reverse:!0,type:"linear"}}},$.beforeRegister=()=>{j("chart.js","3.8",e.Chart.version)},$.afterRegister=()=>{const t=e.registry.plugins.get("tooltip");t?t.positioners.treemap=t=>{if(!t.length)return!1;return t.at(-1).element.tooltipPosition()}:console.warn("Unable to register the treemap positioner because tooltip plugin is not registered")},$.afterUnregister=()=>{const t=e.registry.plugins.get("tooltip");t&&delete t.positioners.treemap};class N extends e.Element{draw(t,e){if(!e)return;const i=this.options,{inner:r,outer:o}=q(this),s=(a=o.radius).topLeft||a.topRight||a.bottomLeft||a.bottomRight?n.addRoundedRectPath:K;var a;t.save(),o.w===r.w&&o.h===r.h||(t.beginPath(),s(t,o),t.clip(),s(t,r),t.fillStyle=i.borderColor,t.fill("evenodd")),t.beginPath(),s(t,r),t.fillStyle=i.backgroundColor,t.fill(),function(t,e,n,i){const r=n.dividers,o=i._data?.children;if(!r.display||!Array.isArray(o)||!o.length)return;const{x:s,y:a,w:h,h:l}=e,{lineColor:u,lineCapStyle:c,lineDash:d,lineDashOffset:f,lineWidth:p}=r;if(t.save(),t.strokeStyle=u,t.lineCap=c,t.setLineDash(d),t.lineDashOffset=f,t.lineWidth=p,t.beginPath(),h>l){const e=h/2;t.moveTo(s+e,a),t.lineTo(s+e,a+l)}else{const e=l/2;t.moveTo(s,a+e),t.lineTo(s+h,a+e)}t.stroke(),t.restore()}(t,r,i,e),I(t,r,i,e,this),t.restore()}inRange(t,e,n){return V(this,t,e,n)}inXRange(t,e){return V(this,t,null,e)}inYRange(t,e){return V(this,null,t,e)}getCenterPoint(t){const{x:e,y:n,width:i,height:r}=this.getProps(["x","y","width","height"],t);return{x:e+i/2,y:n+r/2}}tooltipPosition(){return this.getCenterPoint()}constructor(t){super(),this.width=void 0,this.height=void 0,t&&Object.assign(this,t)}}N.id="treemap",N.defaults={borderRadius:0,borderWidth:0,captions:{align:void 0,color:"black",display:!0,font:{},formatter:t=>{const e=t.raw._data?.label;return t.raw.g||("string"==typeof e?e:"")},padding:3},displayMode:"containerBoxes",dividers:{display:!1,lineCapStyle:"butt",lineColor:"black",lineDash:[],lineDashOffset:0,lineWidth:1},label:void 0,labels:{align:"center",color:"black",display:!1,font:{},formatter(t){const e=t.raw._data?.label;return t.raw.g?[t.raw.g,`${t.raw.v}`]:"string"==typeof e?[e,`${t.raw.v}`]:`${t.raw.v}`},overflow:"cut",padding:3,position:"middle"},rtl:!1,spacing:.5,unsorted:!1},N.descriptors={_indexable:!1,_scriptable:!0,captions:{_fallback:!0,_scriptable:t=>"formatter"!==t},labels:{_fallback:!0,_scriptable:t=>"formatter"!==t}},N.defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"},e.Chart.register($,N),t.TreemapController=$,t.TreemapElement=N,t.flatten=w,t.getGroupKey=x,t.group=k,t.index=O,t.normalizeTreeToArray=v,t.requireVersion=j,t.sort=R,t.sum=T});
8
8
  //# sourceMappingURL=chartjs-chart-treemap.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chartjs-chart-treemap.min.js","sources":["../src/utils.js","../src/element.js","../src/rect.js","../src/statArray.js","../src/squarify.js","../src/helpers/index.js","../src/controller.js","../src/index.js"],"sourcesContent":["import {isObject} from 'chart.js/helpers';\n\nconst isOlderPart = (act, req) => req > act || (act.length > req.length && act.slice(0, req.length) === req);\n\nexport const getGroupKey = (lvl) => '' + lvl;\n\nfunction scanTreeObject(keys, treeLeafKey, obj, tree = [], lvl = 0, result = []) {\n const objIndex = lvl - 1;\n if (keys[0] in obj && lvl > 0) {\n const record = tree.reduce(function(reduced, item, i) {\n if (i !== objIndex) {\n reduced[getGroupKey(i)] = item;\n }\n return reduced;\n }, {});\n record[treeLeafKey] = tree[objIndex];\n keys.forEach(function(k) {\n record[k] = obj[k];\n });\n result.push(record);\n } else {\n for (const childKey of Object.keys(obj)) {\n const child = obj[childKey];\n if (isObject(child)) {\n tree.push(childKey);\n scanTreeObject(keys, treeLeafKey, child, tree, lvl + 1, result);\n }\n }\n }\n tree.splice(objIndex, 1);\n return result;\n}\n\nexport function normalizeTreeToArray(keys, treeLeafKey, obj) {\n const data = scanTreeObject(keys, treeLeafKey, obj);\n if (!data.length) {\n return data;\n }\n const max = data.reduce(function(maxVal, element) {\n // minus 2 because _leaf and value properties are added\n // on top to groups ones\n const ikeys = Object.keys(element).length - 2;\n return maxVal > ikeys ? maxVal : ikeys;\n });\n data.forEach(function(element) {\n for (let i = 0; i < max; i++) {\n const groupKey = getGroupKey(i);\n if (!element[groupKey]) {\n element[groupKey] = '';\n }\n }\n });\n return data;\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat\nexport function flatten(input) {\n const stack = [...input];\n const res = [];\n while (stack.length) {\n // pop value from stack\n const next = stack.pop();\n if (Array.isArray(next)) {\n // push back array items, won't modify the original input\n stack.push(...next);\n } else {\n res.push(next);\n }\n }\n // reverse to restore input order\n return res.reverse();\n}\n\nfunction getPath(groups, value, defaultValue) {\n if (!groups.length) {\n return;\n }\n const path = [];\n for (const grp of groups) {\n const item = value[grp];\n if (item === '') {\n path.push(defaultValue);\n break;\n }\n path.push(item);\n }\n return path.length ? path.join('.') : defaultValue;\n}\n\n/**\n * @param {[]} values\n * @param {string} grp\n * @param {[string]} keys\n * @param {string} treeeLeafKey\n * @param {string} [mainGrp]\n * @param {*} [mainValue]\n * @param {[]} groups\n */\nexport function group(values, grp, keys, treeLeafKey, mainGrp, mainValue, groups = []) {\n const key = keys[0];\n const addKeys = keys.slice(1);\n const tmp = Object.create(null);\n const data = Object.create(null);\n const ret = [];\n let g, i, n;\n for (i = 0, n = values.length; i < n; ++i) {\n const v = values[i];\n if (mainGrp && v[mainGrp] !== mainValue) {\n continue;\n }\n g = v[grp] || v[treeLeafKey] || '';\n if (!(g in tmp)) {\n const tmpRef = tmp[g] = {value: 0};\n addKeys.forEach(function(k) {\n tmpRef[k] = 0;\n });\n data[g] = [];\n }\n tmp[g].value += +v[key];\n tmp[g].label = v[grp] || '';\n const tmpRef = tmp[g];\n addKeys.forEach(function(k) {\n tmpRef[k] += v[k];\n });\n tmp[g].path = getPath(groups, v, g);\n data[g].push(v);\n }\n\n Object.keys(tmp).forEach((k) => {\n const v = {children: data[k]};\n v[key] = +tmp[k].value;\n addKeys.forEach(function(ak) {\n v[ak] = +tmp[k][ak];\n });\n v[grp] = tmp[k].label;\n v.label = k;\n v.path = tmp[k].path;\n\n if (mainGrp) {\n v[mainGrp] = mainValue;\n }\n ret.push(v);\n });\n\n return ret;\n}\n\nexport function index(values, key) {\n let n = values.length;\n let i;\n\n if (!n) {\n return key;\n }\n\n const obj = isObject(values[0]);\n key = obj ? key : 'v';\n\n for (i = 0, n = values.length; i < n; ++i) {\n if (obj) {\n values[i]._idx = i;\n } else {\n values[i] = {v: values[i], _idx: i};\n }\n }\n return key;\n}\n\nexport function sort(values, key) {\n if (key) {\n values.sort((a, b) => +b[key] - +a[key]);\n } else {\n values.sort((a, b) => +b - +a);\n }\n}\n\nexport function sum(values, key) {\n let s, i, n;\n\n for (s = 0, i = 0, n = values.length; i < n; ++i) {\n s += key ? +values[i][key] : +values[i];\n }\n\n return s;\n}\n\n/**\n * @param {string} pkg\n * @param {string} min\n * @param {string} ver\n * @param {boolean} [strict=true]\n * @returns {boolean}\n */\nexport function requireVersion(pkg, min, ver, strict = true) {\n const parts = ver.split('.');\n let i = 0;\n for (const req of min.split('.')) {\n const act = parts[i++];\n if (parseInt(req, 10) < parseInt(act, 10)) {\n break;\n }\n if (isOlderPart(act, req)) {\n if (strict) {\n throw new Error(`${pkg} v${ver} is not supported. v${min} or newer is required.`);\n } else {\n return false;\n }\n }\n }\n return true;\n}\n","import {Element} from 'chart.js';\nimport {toFont, isArray, toTRBL, toTRBLCorners, addRoundedRectPath, valueOrDefault, defined, isNumber} from 'chart.js/helpers';\n\nconst widthCache = new Map();\n\n/**\n * Helper function to get the bounds of the rect\n * @param {TreemapElement} rect the rect\n * @param {boolean} [useFinalPosition]\n * @return {object} bounds of the rect\n * @private\n */\nfunction getBounds(rect, useFinalPosition) {\n const {x, y, width, height} = rect.getProps(['x', 'y', 'width', 'height'], useFinalPosition);\n return {left: x, top: y, right: x + width, bottom: y + height};\n}\n\nfunction limit(value, min, max) {\n return Math.max(Math.min(value, max), min);\n}\n\nexport function parseBorderWidth(value, maxW, maxH) {\n const o = toTRBL(value);\n\n return {\n t: limit(o.top, 0, maxH),\n r: limit(o.right, 0, maxW),\n b: limit(o.bottom, 0, maxH),\n l: limit(o.left, 0, maxW)\n };\n}\n\nfunction parseBorderRadius(value, maxW, maxH) {\n const o = toTRBLCorners(value);\n const maxR = Math.min(maxW, maxH);\n\n return {\n topLeft: limit(o.topLeft, 0, maxR),\n topRight: limit(o.topRight, 0, maxR),\n bottomLeft: limit(o.bottomLeft, 0, maxR),\n bottomRight: limit(o.bottomRight, 0, maxR)\n };\n}\n\nfunction boundingRects(rect) {\n const bounds = getBounds(rect);\n const width = bounds.right - bounds.left;\n const height = bounds.bottom - bounds.top;\n const border = parseBorderWidth(rect.options.borderWidth, width / 2, height / 2);\n const radius = parseBorderRadius(rect.options.borderRadius, width / 2, height / 2);\n const outer = {\n x: bounds.left,\n y: bounds.top,\n w: width,\n h: height,\n active: rect.active,\n radius\n };\n\n return {\n outer,\n inner: {\n x: outer.x + border.l,\n y: outer.y + border.t,\n w: outer.w - border.l - border.r,\n h: outer.h - border.t - border.b,\n active: rect.active,\n radius: {\n topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)),\n topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)),\n bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)),\n bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r)),\n }\n }\n };\n}\n\nfunction inRange(rect, x, y, useFinalPosition) {\n const skipX = x === null;\n const skipY = y === null;\n const bounds = !rect || (skipX && skipY) ? false : getBounds(rect, useFinalPosition);\n\n return bounds\n\t\t&& (skipX || x >= bounds.left && x <= bounds.right)\n\t\t&& (skipY || y >= bounds.top && y <= bounds.bottom);\n}\n\nfunction hasRadius(radius) {\n return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;\n}\n\n/**\n * Add a path of a rectangle to the current sub-path\n * @param {CanvasRenderingContext2D} ctx Context\n * @param {*} rect Bounding rect\n */\nfunction addNormalRectPath(ctx, rect) {\n ctx.rect(rect.x, rect.y, rect.w, rect.h);\n}\n\nexport function shouldDrawCaption(rect, options) {\n if (!options || options.display === false) {\n return false;\n }\n const {w, h} = rect;\n const font = toFont(options.font);\n const min = font.lineHeight;\n const padding = limit(valueOrDefault(options.padding, 3) * 2, 0, Math.min(w, h));\n return (w - padding) > min && (h - padding) > min;\n}\n\nfunction drawText(ctx, rect, options, item, levels) {\n const {captions, labels} = options;\n ctx.save();\n ctx.beginPath();\n ctx.rect(rect.x, rect.y, rect.w, rect.h);\n ctx.clip();\n const isLeaf = item && (!defined(item.l) || item.l === levels);\n if (isLeaf && labels.display) {\n drawLabel(ctx, rect, options);\n } else if (!isLeaf && shouldDrawCaption(rect, captions)) {\n drawCaption(ctx, rect, options, item);\n }\n ctx.restore();\n}\n\nfunction drawCaption(ctx, rect, options, item) {\n const {captions, spacing, rtl} = options;\n const {color, hoverColor, font, hoverFont, padding, align, formatter} = captions;\n const oColor = (rect.active ? hoverColor : color) || color;\n const oAlign = align || (rtl ? 'right' : 'left');\n const optFont = (rect.active ? hoverFont : font) || font;\n const oFont = toFont(optFont);\n const lh = oFont.lineHeight / 2;\n const x = calculateX(rect, oAlign, padding);\n ctx.fillStyle = oColor;\n ctx.font = oFont.string;\n ctx.textAlign = oAlign;\n ctx.textBaseline = 'middle';\n ctx.fillText(formatter || item.g, x, rect.y + padding + spacing + lh);\n}\n\nfunction measureLabelSize(ctx, lines, fonts) {\n const fontsKey = fonts.reduce(function(prev, item) {\n prev += item.string;\n return prev;\n }, '');\n const mapKey = lines.join() + fontsKey + (ctx._measureText ? '-spriting' : '');\n if (!widthCache.has(mapKey)) {\n ctx.save();\n const count = lines.length;\n let width = 0;\n let height = 0;\n for (let i = 0; i < count; i++) {\n const font = fonts[Math.min(i, fonts.length - 1)];\n ctx.font = font.string;\n const text = lines[i];\n width = Math.max(width, ctx.measureText(text).width);\n height += font.lineHeight;\n }\n ctx.restore();\n widthCache.set(mapKey, {width, height});\n }\n return widthCache.get(mapKey);\n}\n\nfunction toFonts(fonts, fitRatio) {\n return fonts.map(function(f) {\n f.size = Math.floor(f.size * fitRatio);\n f.lineHeight = undefined;\n return toFont(f);\n });\n}\n\nfunction labelToDraw(ctx, rect, options, labelSize) {\n const {overflow, padding} = options;\n const {width, height} = labelSize;\n if (overflow === 'hidden') {\n return !((width + padding * 2) > rect.w || (height + padding * 2) > rect.h);\n } else if (overflow === 'fit') {\n const ratio = Math.min(rect.w / (width + padding * 2), rect.h / (height + padding * 2));\n if (ratio < 1) {\n return ratio;\n }\n }\n return true;\n}\n\nfunction getFontFromOptions(rect, labels) {\n const {font, hoverFont} = labels;\n const optFont = (rect.active ? hoverFont : font) || font;\n return isArray(optFont) ? optFont.map(f => toFont(f)) : [toFont(optFont)];\n}\n\nfunction drawLabel(ctx, rect, options) {\n const labels = options.labels;\n const content = labels.formatter;\n if (!content) {\n return;\n }\n const contents = isArray(content) ? content : [content];\n let fonts = getFontFromOptions(rect, labels);\n let labelSize = measureLabelSize(ctx, contents, fonts);\n const lblToDraw = labelToDraw(ctx, rect, labels, labelSize);\n if (!lblToDraw) {\n return;\n }\n if (isNumber(lblToDraw)) {\n labelSize = {width: labelSize.width * lblToDraw, height: labelSize.height * lblToDraw};\n fonts = toFonts(fonts, lblToDraw);\n }\n const {color, hoverColor, align} = labels;\n const optColor = (rect.active ? hoverColor : color) || color;\n const colors = isArray(optColor) ? optColor : [optColor];\n const xyPoint = calculateXYLabel(rect, labels, labelSize);\n ctx.textAlign = align;\n ctx.textBaseline = 'middle';\n let lhs = 0;\n contents.forEach(function(l, i) {\n const c = colors[Math.min(i, colors.length - 1)];\n const f = fonts[Math.min(i, fonts.length - 1)];\n const lh = f.lineHeight;\n ctx.font = f.string;\n ctx.fillStyle = c;\n ctx.fillText(l, xyPoint.x, xyPoint.y + lh / 2 + lhs);\n lhs += lh;\n });\n}\n\nfunction drawDivider(ctx, rect, options, item) {\n const dividers = options.dividers;\n if (!dividers.display || !item._data.children.length) {\n return;\n }\n const {x, y, w, h} = rect;\n const {lineColor, lineCapStyle, lineDash, lineDashOffset, lineWidth} = dividers;\n ctx.save();\n ctx.strokeStyle = lineColor;\n ctx.lineCap = lineCapStyle;\n ctx.setLineDash(lineDash);\n ctx.lineDashOffset = lineDashOffset;\n ctx.lineWidth = lineWidth;\n ctx.beginPath();\n if (w > h) {\n const w2 = w / 2;\n ctx.moveTo(x + w2, y);\n ctx.lineTo(x + w2, y + h);\n } else {\n const h2 = h / 2;\n ctx.moveTo(x, y + h2);\n ctx.lineTo(x + w, y + h2);\n }\n ctx.stroke();\n ctx.restore();\n}\n\nfunction calculateXYLabel(rect, options, labelSize) {\n const {align, position, padding} = options;\n let x, y;\n x = calculateX(rect, align, padding);\n if (position === 'top') {\n y = rect.y + padding;\n } else if (position === 'bottom') {\n y = rect.y + rect.h - padding - labelSize.height;\n } else {\n y = rect.y + (rect.h - labelSize.height) / 2 + padding;\n }\n return {x, y};\n}\n\nfunction calculateX(rect, align, padding) {\n if (align === 'left') {\n return rect.x + padding;\n } else if (align === 'right') {\n return rect.x + rect.w - padding;\n }\n return rect.x + rect.w / 2;\n}\n\nexport default class TreemapElement extends Element {\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.width = undefined;\n this.height = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n draw(ctx, data, levels = 0) {\n if (!data) {\n return;\n }\n const options = this.options;\n const {inner, outer} = boundingRects(this);\n\n const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;\n\n ctx.save();\n\n if (outer.w !== inner.w || outer.h !== inner.h) {\n ctx.beginPath();\n addRectPath(ctx, outer);\n ctx.clip();\n addRectPath(ctx, inner);\n ctx.fillStyle = options.borderColor;\n ctx.fill('evenodd');\n }\n\n ctx.beginPath();\n addRectPath(ctx, inner);\n ctx.fillStyle = options.backgroundColor;\n ctx.fill();\n\n drawDivider(ctx, inner, options, data);\n drawText(ctx, inner, options, data, levels);\n ctx.restore();\n }\n\n inRange(mouseX, mouseY, useFinalPosition) {\n return inRange(this, mouseX, mouseY, useFinalPosition);\n }\n\n inXRange(mouseX, useFinalPosition) {\n return inRange(this, mouseX, null, useFinalPosition);\n }\n\n inYRange(mouseY, useFinalPosition) {\n return inRange(this, null, mouseY, useFinalPosition);\n }\n\n getCenterPoint(useFinalPosition) {\n const {x, y, width, height} = this.getProps(['x', 'y', 'width', 'height'], useFinalPosition);\n return {\n x: x + width / 2,\n y: y + height / 2\n };\n }\n\n tooltipPosition() {\n return this.getCenterPoint();\n }\n\n /**\n * @todo: remove this unused function in v3\n */\n getRange(axis) {\n return axis === 'x' ? this.width / 2 : this.height / 2;\n }\n}\n\nTreemapElement.id = 'treemap';\n\nTreemapElement.defaults = {\n borderRadius: 0,\n borderWidth: 0,\n captions: {\n align: undefined,\n color: 'black',\n display: true,\n font: {},\n formatter: (ctx) => ctx.raw.g || ctx.raw._data.label || '',\n padding: 3\n },\n dividers: {\n display: false,\n lineCapStyle: 'butt',\n lineColor: 'black',\n lineDash: [],\n lineDashOffset: 0,\n lineWidth: 1,\n },\n label: undefined,\n labels: {\n align: 'center',\n color: 'black',\n display: false,\n font: {},\n formatter(ctx) {\n if (ctx.raw.g) {\n return [ctx.raw.g, ctx.raw.v + ''];\n }\n return ctx.raw._data.label ? [ctx.raw._data.label, ctx.raw.v + ''] : ctx.raw.v + '';\n },\n overflow: 'cut',\n position: 'middle',\n padding: 3\n },\n rtl: false,\n spacing: 0.5,\n unsorted: false,\n};\n\nTreemapElement.descriptors = {\n captions: {\n _fallback: true\n },\n labels: {\n _fallback: true\n },\n _scriptable: true,\n _indexable: false\n};\n\nTreemapElement.defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n};\n","function getDims(itm, w2, s2, key) {\n const a = itm._normalized;\n const ar = w2 * a / s2;\n const d1 = Math.sqrt(a * ar);\n const d2 = a / d1;\n const w = key === '_ix' ? d1 : d2;\n const h = key === '_ix' ? d2 : d1;\n\n return {d1, d2, w, h};\n}\n\nconst getX = (rect, w) => rect.rtl ? rect.x + rect.iw - w : rect.x + rect._ix;\n\nfunction buildRow(rect, itm, dims, sum) {\n const r = {\n x: getX(rect, dims.w),\n y: rect.y + rect._iy,\n w: dims.w,\n h: dims.h,\n a: itm._normalized,\n v: itm.value,\n vs: itm.values,\n s: sum,\n _data: itm._data\n };\n if (itm.group) {\n r.g = itm.group;\n r.l = itm.level;\n r.gs = itm.groupSum;\n }\n return r;\n}\n\nexport default class Rect {\n constructor(r) {\n r = r || {w: 1, h: 1};\n this.rtl = !!r.rtl;\n this.unsorted = !!r.unsorted;\n this.x = r.x || r.left || 0;\n this.y = r.y || r.top || 0;\n this._ix = 0;\n this._iy = 0;\n this.w = r.w || r.width || (r.right - r.left);\n this.h = r.h || r.height || (r.bottom - r.top);\n }\n\n get area() {\n return this.w * this.h;\n }\n\n get iw() {\n return this.w - this._ix;\n }\n\n get ih() {\n return this.h - this._iy;\n }\n\n get dir() {\n const ih = this.ih;\n return ih <= this.iw && ih > 0 ? 'y' : 'x';\n }\n\n get side() {\n return this.dir === 'x' ? this.iw : this.ih;\n }\n\n map(arr) {\n const {dir, side} = this;\n const key = dir === 'x' ? '_ix' : '_iy';\n const sum = arr.nsum;\n const row = arr.get();\n const w2 = side * side;\n const s2 = sum * sum;\n const ret = [];\n let maxd2 = 0;\n let totd1 = 0;\n for (const itm of row) {\n const dims = getDims(itm, w2, s2, key);\n totd1 += dims.d1;\n maxd2 = Math.max(maxd2, dims.d2);\n ret.push(buildRow(this, itm, dims, arr.sum));\n this[key] += dims.d1;\n }\n\n this[dir === 'x' ? '_iy' : '_ix'] += maxd2;\n this[key] -= totd1;\n return ret;\n }\n}\n","const min = Math.min;\nconst max = Math.max;\n\nfunction getStat(sa) {\n return {\n min: sa.min,\n max: sa.max,\n sum: sa.sum,\n nmin: sa.nmin,\n nmax: sa.nmax,\n nsum: sa.nsum\n };\n}\n\nfunction getNewStat(sa, o) {\n const v = +o[sa.key];\n const n = v * sa.ratio;\n o._normalized = n;\n\n return {\n min: min(sa.min, v),\n max: max(sa.max, v),\n sum: sa.sum + v,\n nmin: min(sa.nmin, n),\n nmax: max(sa.nmax, n),\n nsum: sa.nsum + n\n };\n}\n\nfunction setStat(sa, stat) {\n Object.assign(sa, stat);\n}\n\nfunction push(sa, o, stat) {\n sa._arr.push(o);\n setStat(sa, stat);\n}\n\nexport default class StatArray {\n constructor(key, ratio) {\n const me = this;\n me.key = key;\n me.ratio = ratio;\n me.reset();\n }\n\n get length() {\n return this._arr.length;\n }\n\n reset() {\n const me = this;\n me._arr = [];\n me._hist = [];\n me.sum = 0;\n me.nsum = 0;\n me.min = Infinity;\n me.max = -Infinity;\n me.nmin = Infinity;\n me.nmax = -Infinity;\n }\n\n push(o) {\n push(this, o, getNewStat(this, o));\n }\n\n pushIf(o, fn, ...args) {\n const nstat = getNewStat(this, o);\n if (!fn(getStat(this), nstat, args)) {\n return o;\n }\n push(this, o, nstat);\n }\n\n get() {\n return this._arr;\n }\n}\n","import {sum, index, sort, flatten} from './utils';\nimport Rect from './rect';\nimport StatArray from './statArray';\n\nfunction compareAspectRatio(oldStat, newStat, args) {\n if (oldStat.sum === 0) {\n return true;\n }\n\n const [length] = args;\n const os2 = oldStat.nsum * oldStat.nsum;\n const ns2 = newStat.nsum * newStat.nsum;\n const l2 = length * length;\n const or = Math.max(l2 * oldStat.nmax / os2, os2 / (l2 * oldStat.nmin));\n const nr = Math.max(l2 * newStat.nmax / ns2, ns2 / (l2 * newStat.nmin));\n return nr <= or;\n}\n\n/**\n *\n * @param {number[]|object[]} values\n * @param {object} rectangle\n * @param {string} [key]\n * @param {string} [grp]\n * @param {number} [lvl]\n * @param {number} [gsum]\n */\nexport default function squarify(values, rectangle, keys = [], grp, lvl, gsum) {\n values = values || [];\n const rows = [];\n const rect = new Rect(rectangle);\n const row = new StatArray('value', rect.area / sum(values, keys[0]));\n let length = rect.side;\n const n = values.length;\n let i, o;\n\n if (!n) {\n return rows;\n }\n\n const tmp = values.slice();\n let key = index(tmp, keys[0]);\n\n if (!rectangle?.unsorted) {\n sort(tmp, key);\n }\n\n const val = (idx) => key ? +tmp[idx][key] : +tmp[idx];\n const gval = (idx) => grp && tmp[idx][grp];\n\n for (i = 0; i < n; ++i) {\n o = {value: val(i), groupSum: gsum, _data: values[tmp[i]._idx], level: undefined, group: undefined};\n if (grp) {\n o.level = lvl;\n o.group = gval(i);\n const tmpRef = tmp[i];\n o.values = keys.reduce(function(obj, k) {\n obj[k] = +tmpRef[k];\n return obj;\n }, {});\n }\n o = row.pushIf(o, compareAspectRatio, length);\n if (o) {\n rows.push(rect.map(row));\n length = rect.side;\n row.reset();\n row.push(o);\n }\n }\n if (row.length) {\n rows.push(rect.map(row));\n }\n return flatten(rows);\n}\n","export function scaleRect(sq, xScale, yScale, sp) {\n const sp2 = sp * 2;\n const x = xScale.getPixelForValue(sq.x);\n const y = yScale.getPixelForValue(sq.y);\n const w = xScale.getPixelForValue(sq.x + sq.w) - x;\n const h = yScale.getPixelForValue(sq.y + sq.h) - y;\n return {\n x: x + sp,\n y: y + sp,\n width: w - sp2,\n height: h - sp2,\n hidden: sp2 > w || sp2 > h,\n };\n}\n\nexport function rectNotEqual(r1, r2) {\n return !r1 || !r2\n\t\t|| r1.x !== r2.x\n\t\t|| r1.y !== r2.y\n\t\t|| r1.w !== r2.w\n\t\t|| r1.h !== r2.h\n || r1.rtl !== r2.rtl\n || r1.unsorted !== r2.unsorted;\n}\n\nexport function arrayNotEqual(a, b) {\n let i, n;\n\n if (!a || !b) {\n return true;\n }\n\n if (a === b) {\n return false;\n }\n\n if (a.length !== b.length) {\n return true;\n }\n\n for (i = 0, n = a.length; i < n; ++i) {\n if (a[i] !== b[i]) {\n return true;\n }\n }\n return false;\n}\n","import {Chart, DatasetController, registry} from 'chart.js';\nimport {toFont, valueOrDefault, isObject, clipArea, unclipArea} from 'chart.js/helpers';\nimport {group, requireVersion, normalizeTreeToArray, getGroupKey} from './utils';\nimport {shouldDrawCaption, parseBorderWidth} from './element';\nimport squarify from './squarify';\nimport {version} from '../package.json';\nimport {arrayNotEqual, rectNotEqual, scaleRect} from './helpers/index';\n\nfunction buildData(tree, dataset, keys, mainRect) {\n const treeLeafKey = dataset.treeLeafKey || '_leaf';\n if (isObject(tree)) {\n tree = normalizeTreeToArray(keys, treeLeafKey, tree);\n }\n const groups = dataset.groups || [];\n const glen = groups.length;\n const sp = valueOrDefault(dataset.spacing, 0);\n const captions = dataset.captions || {};\n const font = toFont(captions.font);\n const padding = valueOrDefault(captions.padding, 3);\n\n function recur(treeElements, gidx, rect, parent, gs) {\n const g = getGroupKey(groups[gidx]);\n const pg = (gidx > 0) && getGroupKey(groups[gidx - 1]);\n const gdata = group(treeElements, g, keys, treeLeafKey, pg, parent, groups.filter((item, index) => index <= gidx));\n const gsq = squarify(gdata, rect, keys, g, gidx, gs);\n const ret = gsq.slice();\n if (gidx < glen - 1) {\n gsq.forEach((sq) => {\n const bw = parseBorderWidth(dataset.borderWidth, sq.w / 2, sq.h / 2);\n const subRect = {\n ...rect,\n x: sq.x + sp + bw.l,\n y: sq.y + sp + bw.t,\n w: sq.w - 2 * sp - bw.l - bw.r,\n h: sq.h - 2 * sp - bw.t - bw.b,\n };\n if (shouldDrawCaption(subRect, captions)) {\n subRect.y += font.lineHeight + padding * 2;\n subRect.h -= font.lineHeight + padding * 2;\n }\n gdata.forEach((gEl) => {\n ret.push(...recur(gEl.children, gidx + 1, subRect, sq.g, sq.s));\n });\n });\n }\n return ret;\n }\n\n return glen\n ? recur(tree, 0, mainRect)\n : squarify(tree, mainRect, keys);\n}\n\nexport default class TreemapController extends DatasetController {\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n\n this._groups = undefined;\n this._keys = undefined;\n this._rect = undefined;\n this._rectChanged = true;\n }\n\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n }\n\n getMinMax(scale) {\n return {\n min: 0,\n max: scale.axis === 'x' ? scale.right - scale.left : scale.bottom - scale.top\n };\n }\n\n configure() {\n super.configure();\n const {xScale, yScale} = this.getMeta();\n if (!xScale || !yScale) {\n // configure is called once before `linkScales`, and at that call we don't have any scales linked yet\n return;\n }\n\n const w = xScale.right - xScale.left;\n const h = yScale.bottom - yScale.top;\n const rect = {x: 0, y: 0, w, h, rtl: !!this.options.rtl, unsorted: !!this.options.unsorted};\n\n if (rectNotEqual(this._rect, rect)) {\n this._rect = rect;\n this._rectChanged = true;\n }\n\n if (this._rectChanged) {\n xScale.max = w;\n xScale.configure();\n yScale.max = h;\n yScale.configure();\n }\n }\n\n update(mode) {\n const dataset = this.getDataset();\n const {data} = this.getMeta();\n const groups = dataset.groups || [];\n const keys = [dataset.key || ''].concat(dataset.sumKeys || []);\n const tree = dataset.tree = dataset.tree || dataset.data || [];\n\n if (mode === 'reset') {\n // reset is called before 2nd configure and is only called if animations are enabled. So wen need an extra configure call here.\n this.configure();\n }\n\n if (this._rectChanged || arrayNotEqual(this._keys, keys) || arrayNotEqual(this._groups, groups) || this._prevTree !== tree) {\n this._groups = groups.slice();\n this._keys = keys.slice();\n this._prevTree = tree;\n this._rectChanged = false;\n\n dataset.data = buildData(tree, dataset, this._keys, this._rect);\n // @ts-ignore using private stuff\n this._dataCheck();\n // @ts-ignore using private stuff\n this._resyncElements();\n }\n\n this.updateElements(data, 0, data.length, mode);\n }\n\n updateElements(rects, start, count, mode) {\n const reset = mode === 'reset';\n const dataset = this.getDataset();\n const firstOpts = this._rect.options = this.resolveDataElementOptions(start, mode);\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions);\n const {xScale, yScale} = this.getMeta(this.index);\n\n for (let i = start; i < start + count; i++) {\n const options = sharedOptions || this.resolveDataElementOptions(i, mode);\n const properties = scaleRect(dataset.data[i], xScale, yScale, options.spacing);\n if (reset) {\n properties.width = 0;\n properties.height = 0;\n }\n\n if (includeOptions) {\n properties.options = options;\n }\n this.updateElement(rects[i], i, properties, mode);\n }\n\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n\n draw() {\n const {ctx, chartArea} = this.chart;\n const metadata = this.getMeta().data || [];\n const dataset = this.getDataset();\n const levels = (dataset.groups || []).length - 1;\n const data = dataset.data;\n\n clipArea(ctx, chartArea);\n for (let i = 0, ilen = metadata.length; i < ilen; ++i) {\n const rect = metadata[i];\n if (!rect.hidden) {\n rect.draw(ctx, data[i], levels);\n }\n }\n unclipArea(ctx);\n }\n}\n\nTreemapController.id = 'treemap';\n\nTreemapController.version = version;\n\nTreemapController.defaults = {\n dataElementType: 'treemap',\n\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'width', 'height']\n },\n },\n\n};\n\nTreemapController.descriptors = {\n _scriptable: true,\n _indexable: false\n};\n\nTreemapController.overrides = {\n interaction: {\n mode: 'point',\n includeInvisible: true,\n intersect: true\n },\n\n hover: {},\n\n plugins: {\n tooltip: {\n position: 'treemap',\n intersect: true,\n callbacks: {\n title(items) {\n if (items.length) {\n const item = items[0];\n return item.dataset.key || '';\n }\n return '';\n },\n label(item) {\n const dataset = item.dataset;\n const dataItem = dataset.data[item.dataIndex];\n const label = dataItem.g || dataItem._data.label || dataset.label;\n return (label ? label + ': ' : '') + dataItem.v;\n }\n }\n },\n },\n scales: {\n x: {\n type: 'linear',\n alignToPixels: true,\n bounds: 'data',\n display: false\n },\n y: {\n type: 'linear',\n alignToPixels: true,\n bounds: 'data',\n display: false,\n reverse: true\n }\n },\n};\n\nTreemapController.beforeRegister = function() {\n requireVersion('chart.js', '3.8', Chart.version);\n};\n\nTreemapController.afterRegister = function() {\n const tooltipPlugin = registry.plugins.get('tooltip');\n if (tooltipPlugin) {\n tooltipPlugin.positioners.treemap = function(active) {\n if (!active.length) {\n return false;\n }\n\n const item = active[active.length - 1];\n const el = item.element;\n\n return el.tooltipPosition();\n };\n } else {\n console.warn('Unable to register the treemap positioner because tooltip plugin is not registered');\n }\n};\n\nTreemapController.afterUnregister = function() {\n const tooltipPlugin = registry.plugins.get('tooltip');\n if (tooltipPlugin) {\n delete tooltipPlugin.positioners.treemap;\n }\n};\n","import {Chart} from 'chart.js';\nimport TreemapController from './controller';\nimport TreemapElement from './element';\n\nChart.register(TreemapController, TreemapElement);\n\nexport * from './utils';\n"],"names":["isOlderPart","act","req","length","slice","getGroupKey","lvl","scanTreeObject","keys","treeLeafKey","obj","tree","result","objIndex","record","reduce","reduced","item","i","forEach","k","push","childKey","Object","child","isObject","splice","normalizeTreeToArray","data","max","maxVal","element","ikeys","groupKey","flatten","input","stack","res","next","pop","Array","isArray","reverse","getPath","groups","value","defaultValue","path","grp","join","group","values","mainGrp","mainValue","key","addKeys","tmp","create","ret","g","n","v","tmpRef","label","children","ak","index","_idx","sort","a","b","sum","s","requireVersion","pkg","min","ver","strict","parts","split","parseInt","Error","widthCache","Map","getBounds","rect","useFinalPosition","x","y","width","height","getProps","left","top","right","bottom","limit","Math","parseBorderWidth","maxW","maxH","o","toTRBL","t","r","l","boundingRects","bounds","border","options","borderWidth","radius","toTRBLCorners","maxR","topLeft","topRight","bottomLeft","bottomRight","parseBorderRadius","borderRadius","outer","w","h","active","inner","inRange","skipX","skipY","addNormalRectPath","ctx","shouldDrawCaption","display","toFont","font","lineHeight","padding","valueOrDefault","drawText","levels","captions","labels","save","beginPath","clip","isLeaf","defined","content","formatter","contents","fonts","hoverFont","optFont","map","f","getFontFromOptions","labelSize","lines","fontsKey","prev","string","mapKey","_measureText","has","count","text","measureText","restore","set","get","measureLabelSize","lblToDraw","overflow","ratio","labelToDraw","isNumber","fitRatio","size","floor","undefined","toFonts","color","hoverColor","align","optColor","colors","xyPoint","position","calculateX","calculateXYLabel","textAlign","textBaseline","lhs","c","lh","fillStyle","fillText","drawLabel","spacing","rtl","oColor","oAlign","oFont","drawCaption","TreemapElement","Element","constructor","cfg","super","this","assign","draw","addRectPath","addRoundedRectPath","borderColor","fill","backgroundColor","dividers","_data","lineColor","lineCapStyle","lineDash","lineDashOffset","lineWidth","strokeStyle","lineCap","setLineDash","w2","moveTo","lineTo","h2","stroke","drawDivider","mouseX","mouseY","inXRange","inYRange","getCenterPoint","tooltipPosition","getRange","axis","getDims","itm","s2","_normalized","ar","d1","sqrt","d2","id","defaults","raw","unsorted","descriptors","_fallback","_scriptable","_indexable","defaultRoutes","getX","iw","_ix","buildRow","dims","_iy","vs","level","gs","groupSum","Rect","area","ih","dir","side","arr","nsum","row","maxd2","totd1","getNewStat","sa","nmin","nmax","stat","_arr","setStat","StatArray","me","reset","_hist","Infinity","pushIf","fn","args","nstat","compareAspectRatio","oldStat","newStat","os2","ns2","l2","or","squarify","rectangle","gsum","rows","gval","idx","scaleRect","sq","xScale","yScale","sp","sp2","getPixelForValue","hidden","arrayNotEqual","TreemapController","DatasetController","chart","datasetIndex","_groups","_keys","_rect","_rectChanged","initialize","enableOptionSharing","getMinMax","scale","configure","getMeta","r1","r2","update","mode","dataset","getDataset","concat","sumKeys","_prevTree","mainRect","glen","recur","treeElements","gidx","parent","pg","gdata","filter","gsq","bw","subRect","gEl","buildData","_dataCheck","_resyncElements","updateElements","rects","start","firstOpts","resolveDataElementOptions","sharedOptions","getSharedOptions","includeOptions","properties","updateElement","updateSharedOptions","chartArea","metadata","clipArea","ilen","unclipArea","version","dataElementType","animations","numbers","type","overrides","interaction","includeInvisible","intersect","hover","plugins","tooltip","callbacks","title","items","dataItem","dataIndex","scales","alignToPixels","beforeRegister","Chart","afterRegister","tooltipPlugin","registry","positioners","treemap","console","warn","afterUnregister","register"],"mappings":"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"}
1
+ {"version":3,"file":"chartjs-chart-treemap.min.js","sources":["../src/helpers/index.ts","../src/options.ts","../src/rect.ts","../src/statArray.ts","../src/utils.ts","../src/squarify.ts","../src/text.ts","../src/controller.ts","../src/geometry.ts","../src/element.ts","../src/index.ts"],"sourcesContent":["export function scaleRect(sq: any, xScale: any, yScale: any, sp: number) {\n const sp2 = sp * 2\n const x = xScale.getPixelForValue(sq.x)\n const y = yScale.getPixelForValue(sq.y)\n const w = xScale.getPixelForValue(sq.x + sq.w) - x\n const h = yScale.getPixelForValue(sq.y + sq.h) - y\n return {\n height: h - sp2,\n hidden: sp2 > w || sp2 > h,\n width: w - sp2,\n x: x + sp,\n y: y + sp,\n }\n}\n\nexport function rectNotEqual(r1: any, r2: any) {\n return (\n !r1 ||\n !r2 ||\n r1.x !== r2.x ||\n r1.y !== r2.y ||\n r1.w !== r2.w ||\n r1.h !== r2.h ||\n r1.rtl !== r2.rtl ||\n r1.unsorted !== r2.unsorted\n )\n}\n\nexport function arrayNotEqual(a: any[], b: any[]) {\n let i: number\n let n: number\n\n if (!a || !b) {\n return true\n }\n\n if (a === b) {\n return false\n }\n\n if (a.length !== b.length) {\n return true\n }\n\n for (i = 0, n = a.length; i < n; ++i) {\n if (a[i] !== b[i]) {\n return true\n }\n }\n return false\n}\n","import type { TreemapBorderRadius, TreemapBorderWidth, TreemapOptions } from './types'\n\nimport { toTRBL, toTRBLCorners } from 'chart.js/helpers'\n\nexport type ParsedBorderWidth = {\n b: number\n l: number\n r: number\n t: number\n}\n\nfunction limit(value: number, min: number, max: number) {\n return Math.max(Math.min(value, max), min)\n}\n\nexport function parseBorderWidth(\n value: TreemapBorderWidth,\n maxW: number,\n maxH: number\n): ParsedBorderWidth {\n const o = toTRBL(value as Parameters<typeof toTRBL>[0])\n\n return {\n b: limit(o.bottom, 0, maxH),\n l: limit(o.left, 0, maxW),\n r: limit(o.right, 0, maxW),\n t: limit(o.top, 0, maxH),\n }\n}\n\nexport function parseBorderRadius(\n value: TreemapOptions['borderRadius'],\n maxW: number,\n maxH: number\n): TreemapBorderRadius {\n const o = toTRBLCorners(value as Parameters<typeof toTRBLCorners>[0])\n const maxR = Math.min(maxW, maxH)\n\n return {\n bottomLeft: limit(o.bottomLeft, 0, maxR),\n bottomRight: limit(o.bottomRight, 0, maxR),\n topLeft: limit(o.topLeft, 0, maxR),\n topRight: limit(o.topRight, 0, maxR),\n }\n}\n","function getDims(itm: any, w2: number, s2: number, key: string) {\n const a = itm._normalized\n const ar = (w2 * a) / s2\n const d1 = Math.sqrt(a * ar)\n const d2 = a / d1\n const w = key === '_ix' ? d1 : d2\n const h = key === '_ix' ? d2 : d1\n\n return { d1, d2, h, w }\n}\n\nconst getX = (rect: Rect, w: number) => (rect.rtl ? rect.x + rect.iw - w : rect.x + rect._ix)\n\nfunction buildRow(rect: Rect, itm: any, dims: any, sum: number) {\n const r: Record<string, any> = {\n _data: itm._data,\n a: itm._normalized,\n h: dims.h,\n s: sum,\n v: itm.value,\n vs: itm.values,\n w: dims.w,\n x: getX(rect, dims.w),\n y: rect.y + rect._iy,\n }\n if (itm.group) {\n r.g = itm.group\n r.l = itm.level\n r.gs = itm.groupSum\n }\n return r\n}\n\nexport default class Rect {\n [key: string]: any\n rtl: boolean\n unsorted: boolean\n x: number\n y: number\n _ix: number\n _iy: number\n w: number\n h: number\n\n constructor(r?: any) {\n r = r || { h: 1, w: 1 }\n this.rtl = !!r.rtl\n this.unsorted = !!r.unsorted\n this.x = r.x || r.left || 0\n this.y = r.y || r.top || 0\n this._ix = 0\n this._iy = 0\n this.w = r.w || r.width || r.right - r.left\n this.h = r.h || r.height || r.bottom - r.top\n }\n\n get area() {\n return this.w * this.h\n }\n\n get iw() {\n return this.w - this._ix\n }\n\n get ih() {\n return this.h - this._iy\n }\n\n get dir() {\n const ih = this.ih\n return ih <= this.iw && ih > 0 ? 'y' : 'x'\n }\n\n get side() {\n return this.dir === 'x' ? this.iw : this.ih\n }\n\n map(arr: any) {\n const { dir, side } = this\n const key = dir === 'x' ? '_ix' : '_iy'\n const sum = arr.nsum\n const row = arr.get()\n const w2 = side * side\n const s2 = sum * sum\n const ret: any[] = []\n let maxd2 = 0\n let totd1 = 0\n for (const itm of row) {\n const dims = getDims(itm, w2, s2, key)\n totd1 += dims.d1\n maxd2 = Math.max(maxd2, dims.d2)\n ret.push(buildRow(this, itm, dims, arr.sum))\n this[key] += dims.d1\n }\n\n this[dir === 'x' ? '_iy' : '_ix'] += maxd2\n this[key] -= totd1\n return ret\n }\n}\n","const min = Math.min\nconst max = Math.max\n\nfunction getStat(sa: StatArray) {\n return {\n max: sa.max,\n min: sa.min,\n nmax: sa.nmax,\n nmin: sa.nmin,\n nsum: sa.nsum,\n sum: sa.sum,\n }\n}\n\nfunction getNewStat(sa: StatArray, o: any) {\n const v = +o[sa.key]\n const n = v * sa.ratio\n o._normalized = n\n\n return {\n max: max(sa.max, v),\n min: min(sa.min, v),\n nmax: max(sa.nmax, n),\n nmin: min(sa.nmin, n),\n nsum: sa.nsum + n,\n sum: sa.sum + v,\n }\n}\n\nfunction setStat(sa: StatArray, stat: any) {\n Object.assign(sa, stat)\n}\n\nfunction push(sa: StatArray, o: any, stat: any) {\n sa._arr.push(o)\n setStat(sa, stat)\n}\n\nexport default class StatArray {\n key: string\n ratio: number\n _arr: any[] = []\n _hist: any[] = []\n sum = 0\n nsum = 0\n min = Infinity\n max = -Infinity\n nmin = Infinity\n nmax = -Infinity\n\n constructor(key: string, ratio: number) {\n this.key = key\n this.ratio = ratio\n this.reset()\n }\n\n get length() {\n return this._arr.length\n }\n\n reset() {\n this._arr = []\n this._hist = []\n this.sum = 0\n this.nsum = 0\n this.min = Infinity\n this.max = -Infinity\n this.nmin = Infinity\n this.nmax = -Infinity\n }\n\n push(o: any) {\n push(this, o, getNewStat(this, o))\n }\n\n pushIf(o: any, fn: any, ...args: any[]) {\n const nstat = getNewStat(this, o)\n if (!fn(getStat(this), nstat, args)) {\n return o\n }\n push(this, o, nstat)\n }\n\n get() {\n return this._arr\n }\n}\n","import { isObject } from 'chart.js/helpers'\n\nconst isOlderPart = (act: string, req: string) =>\n req > act || (act.length > req.length && act.startsWith(req))\n\nexport const getGroupKey = (lvl: unknown) => String(lvl)\n\nconst hasGroupValue = (value: unknown) => value !== undefined && value !== null && value !== ''\n\nfunction scanTreeObject(\n keys: string[],\n treeLeafKey: string,\n obj: Record<string, any>,\n tree: string[] = [],\n lvl = 0,\n result: Record<string, any>[] = []\n) {\n const objIndex = lvl - 1\n if (keys[0] in obj && lvl > 0) {\n const record = tree.reduce<Record<string, any>>((reduced, item, i) => {\n if (i !== objIndex) {\n reduced[getGroupKey(i)] = item\n }\n return reduced\n }, {})\n record[treeLeafKey] = tree[objIndex]\n keys.forEach((k) => {\n record[k] = obj[k]\n })\n result.push(record)\n } else {\n for (const childKey of Object.keys(obj)) {\n const child = obj[childKey]\n if (isObject(child)) {\n tree.push(childKey)\n scanTreeObject(keys, treeLeafKey, child, tree, lvl + 1, result)\n }\n }\n }\n tree.splice(objIndex, 1)\n return result\n}\n\nexport function normalizeTreeToArray(\n keys: string[],\n treeLeafKey: string,\n obj: Record<string, any>\n) {\n const data = scanTreeObject(keys, treeLeafKey, obj)\n if (!data.length) {\n return data\n }\n const max = data.reduce((maxVal, element) => {\n // minus 2 because _leaf and value properties are added\n // on top to groups ones\n const ikeys = Object.keys(element).length - 2\n return Math.max(maxVal, ikeys)\n }, 0)\n data.forEach((element) => {\n for (let i = 0; i < max; i++) {\n const groupKey = getGroupKey(i)\n if (!element[groupKey]) {\n element[groupKey] = ''\n }\n }\n })\n return data\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat\nexport function flatten(input: any[]) {\n const stack = [...input]\n const res = []\n while (stack.length) {\n // pop value from stack\n const next = stack.pop()\n if (Array.isArray(next)) {\n // push back array items, won't modify the original input\n stack.push(...next)\n } else {\n res.push(next)\n }\n }\n // reverse to restore input order\n return res.reverse()\n}\n\nfunction getPath(groups: string[], value: Record<string, any>, defaultValue: string) {\n const path = []\n for (const grp of groups) {\n const item = value[grp]\n if (!hasGroupValue(item)) {\n continue\n }\n path.push(item)\n }\n return path.length ? path.join('.') : defaultValue\n}\n\nfunction resolveGroup(\n value: Record<string, any>,\n treeLeafKey: string,\n allGroups: string[],\n groupIndex: number\n) {\n for (let idx = groupIndex; idx < allGroups.length; idx++) {\n const groupKey = getGroupKey(allGroups[idx])\n if (hasGroupValue(value[groupKey])) {\n return { group: groupKey, groupIndex: idx, value: value[groupKey] }\n }\n }\n if (hasGroupValue(value[treeLeafKey])) {\n return { group: treeLeafKey, groupIndex, value: value[treeLeafKey] }\n }\n return undefined\n}\n\nfunction ensureGroup(\n tmp: Record<string, any>,\n data: Record<string, any[]>,\n groupValue: string,\n addKeys: string[]\n) {\n if (groupValue in tmp) {\n return\n }\n tmp[groupValue] = { value: 0 }\n const tmpRef = tmp[groupValue]\n addKeys.forEach((k) => {\n tmpRef[k] = 0\n })\n data[groupValue] = []\n}\n\nexport function group(\n values: Record<string, any>[],\n grp: string,\n keys: string[],\n treeLeafKey: string,\n mainGrp?: string,\n mainValue?: any,\n groups: string[] = [],\n allGroups: string[] = groups,\n groupIndex = groups.length - 1\n) {\n const key = keys[0]\n const addKeys = keys.slice(1)\n const tmp: Record<string, any> = Object.create(null)\n const data: Record<string, any[]> = Object.create(null)\n const ret: Record<string, any>[] = []\n const resolvedAllGroups = allGroups.length ? allGroups : [grp]\n const resolvedGroupIndex = allGroups.length ? groupIndex : 0\n let i: number\n let n: number\n for (i = 0, n = values.length; i < n; ++i) {\n const v = values[i]\n if (mainGrp && v[mainGrp] !== mainValue) {\n continue\n }\n const itemGroup = resolveGroup(v, treeLeafKey, resolvedAllGroups, resolvedGroupIndex)\n if (!itemGroup) {\n return []\n }\n const g = itemGroup.value\n ensureGroup(tmp, data, g, addKeys)\n tmp[g].value += +v[key]\n tmp[g].label = g\n tmp[g].group = itemGroup.group\n tmp[g].groupIndex = itemGroup.groupIndex\n const tmpRef = tmp[g]\n addKeys.forEach((k) => {\n tmpRef[k] += v[k]\n })\n tmp[g].path = getPath(resolvedAllGroups.slice(0, itemGroup.groupIndex + 1), v, g)\n data[g].push(v)\n }\n\n Object.keys(tmp).forEach((k) => {\n const v: Record<string, any> = { children: data[k] }\n v[key] = +tmp[k].value\n addKeys.forEach((ak) => {\n v[ak] = +tmp[k][ak]\n })\n v[grp] = tmp[k].label\n v.group = tmp[k].group\n v.groupIndex = tmp[k].groupIndex\n v.label = k\n v.path = tmp[k].path\n\n if (mainGrp) {\n v[mainGrp] = mainValue\n }\n ret.push(v)\n })\n\n return ret\n}\n\nexport function index(values: any[], key: string) {\n let n = values.length\n let i: number\n\n if (!n) {\n return key\n }\n\n const obj = isObject(values[0])\n key = obj ? key : 'v'\n\n for (i = 0, n = values.length; i < n; ++i) {\n if (obj) {\n values[i]._idx = i\n } else {\n values[i] = { _idx: i, v: values[i] }\n }\n }\n return key\n}\n\nexport function sort(values: any[], key?: string) {\n if (key) {\n values.sort((a, b) => +b[key] - +a[key])\n } else {\n values.sort((a, b) => +b - +a)\n }\n}\n\nexport function sum(values: any[], key?: string) {\n let s: number\n let i: number\n let n: number\n\n for (s = 0, i = 0, n = values.length; i < n; ++i) {\n s += key ? +values[i][key] : +values[i]\n }\n\n return s\n}\n\nexport function requireVersion(pkg: string, min: string, ver: string, strict = true) {\n const parts = ver.split('.')\n let i = 0\n for (const req of min.split('.')) {\n const act = parts[i++]\n if (Number.parseInt(req, 10) < Number.parseInt(act, 10)) {\n break\n }\n if (isOlderPart(act, req)) {\n if (strict) {\n throw new Error(`${pkg} v${ver} is not supported. v${min} or newer is required.`)\n } else {\n return false\n }\n }\n }\n return true\n}\n","import Rect from './rect'\nimport StatArray from './statArray'\nimport { flatten, index, sort, sum } from './utils'\n\nfunction compareAspectRatio(oldStat: any, newStat: any, args: any[]) {\n if (oldStat.sum === 0) {\n return true\n }\n\n const [length] = args\n const os2 = oldStat.nsum * oldStat.nsum\n const ns2 = newStat.nsum * newStat.nsum\n const l2 = length * length\n const or = Math.max((l2 * oldStat.nmax) / os2, os2 / (l2 * oldStat.nmin))\n const nr = Math.max((l2 * newStat.nmax) / ns2, ns2 / (l2 * newStat.nmin))\n return nr <= or\n}\n\nexport default function squarify(\n values: any[],\n rectangle: any,\n keys: string[] = [],\n grp?: string,\n lvl?: number,\n gsum?: number\n) {\n values = values || []\n const rows: any[] = []\n const rect = new Rect(rectangle)\n const row = new StatArray('value', rect.area / sum(values, keys[0]))\n let length = rect.side\n const n = values.length\n let i: number\n let o: any\n\n if (!n) {\n return rows\n }\n\n const tmp = values.slice()\n const key = index(tmp, keys[0])\n\n if (!rectangle?.unsorted) {\n sort(tmp, key)\n }\n\n const val = (idx: number) => (key ? +tmp[idx][key] : +tmp[idx])\n const gval = (idx: number) => grp && tmp[idx][grp]\n\n for (i = 0; i < n; ++i) {\n o = {\n _data: values[tmp[i]._idx],\n group: undefined,\n groupSum: gsum,\n level: undefined,\n value: val(i),\n }\n if (grp) {\n o.level = tmp[i].groupIndex ?? lvl\n o.group = gval(i)\n const tmpRef = tmp[i]\n o.values = keys.reduce<Record<string, number>>((obj, k) => {\n obj[k] = +tmpRef[k]\n return obj\n }, {})\n }\n o = row.pushIf(o, compareAspectRatio, length)\n if (o) {\n rows.push(rect.map(row))\n length = rect.side\n row.reset()\n row.push(o)\n }\n }\n if (row.length) {\n rows.push(rect.map(row))\n }\n return flatten(rows)\n}\n","import type { Element } from 'chart.js'\nimport type { DrawRect } from './geometry'\nimport type {\n TreemapCaptionsOptions,\n TreemapConfig,\n TreemapDataPoint,\n TreemapDisplayMode,\n TreemapLabelsOptions,\n TreemapOptions,\n TreemapScriptableContext,\n} from './types'\n\nimport { defined, isArray, isNumber, toFont, valueOrDefault } from 'chart.js/helpers'\n\ntype RectSize = {\n h: number\n w: number\n}\n\ntype RectHeight = {\n h: number\n}\n\ntype LabelSize = {\n height: number\n width: number\n}\n\ntype Font = ReturnType<typeof toFont>\n\ntype TextElement = Element<TreemapConfig, TreemapOptions> & {\n $context?: TreemapScriptableContext\n}\n\nconst widthCache = new Map<string, LabelSize>()\n\nexport function shouldDrawCaption(\n displayMode: TreemapDisplayMode,\n rect: RectSize,\n options?: Partial<TreemapCaptionsOptions>\n) {\n if (!options || options.display === false) {\n return false\n }\n if (displayMode === 'headerBoxes') {\n return true\n }\n const { w, h } = rect\n const font = toFont(options.font || {})\n const min = font.lineHeight\n const padding = Math.max(Math.min(valueOrDefault(options.padding, 3) * 2, Math.min(w, h)), 0)\n return w - padding > min && h - padding > min\n}\n\nexport function getCaptionHeight(\n displayMode: TreemapDisplayMode,\n rect: RectHeight,\n font: { lineHeight: number },\n padding: number\n) {\n if (displayMode !== 'headerBoxes') {\n return font.lineHeight + padding * 2\n }\n const captionHeight = font.lineHeight + padding * 2\n return rect.h < 2 * captionHeight ? rect.h / 3 : captionHeight\n}\n\nexport function drawText(\n ctx: CanvasRenderingContext2D,\n rect: DrawRect,\n options: TreemapOptions,\n item: TreemapDataPoint,\n element: TextElement\n) {\n const { captions, labels, displayMode } = options\n ctx.save()\n ctx.beginPath()\n ctx.rect(rect.x, rect.y, rect.w, rect.h)\n ctx.clip()\n const isLeaf = item && (!defined(item.l) || item.isLeaf)\n if (isLeaf && labels.display) {\n drawLabel(ctx, rect, options, item, element)\n } else if (!isLeaf && shouldDrawCaption(displayMode, rect, captions)) {\n drawCaption(ctx, rect, options, item, element)\n }\n ctx.restore()\n}\n\nfunction callbackContext(element: TextElement, item: TreemapDataPoint): TreemapScriptableContext {\n const context =\n element.$context ||\n ({ active: !!element.active, raw: item, type: 'data' } as TreemapScriptableContext)\n context.active = !!element.active\n context.raw = item\n return context\n}\n\nfunction resolveOption<T>(\n option: T | ((context: TreemapScriptableContext) => T) | undefined,\n context: TreemapScriptableContext\n) {\n return typeof option === 'function'\n ? (option as (context: TreemapScriptableContext) => T)(context)\n : option\n}\n\nfunction resolveCaptionText(\n captions: TreemapCaptionsOptions,\n element: TextElement,\n item: TreemapDataPoint\n) {\n return resolveOption(captions.formatter, callbackContext(element, item)) || item.g || ''\n}\n\nfunction drawCaption(\n ctx: CanvasRenderingContext2D,\n rect: DrawRect,\n options: TreemapOptions,\n item: TreemapDataPoint,\n element: TextElement\n) {\n const { captions, spacing, rtl, displayMode } = options\n const { color, hoverColor, font, hoverFont, padding, align } = captions\n const oColor = (rect.active ? hoverColor : color) || color\n const oAlign = align || (rtl ? 'right' : 'left')\n const optFont = (rect.active ? hoverFont : font) || font\n const oFont = toFont(optFont)\n const fonts = [oFont]\n if (oFont.lineHeight > rect.h) {\n return\n }\n let text = resolveCaptionText(captions, element, item)\n if (!text) {\n return\n }\n const captionSize = measureLabelSize(ctx, [text], fonts)\n if (captionSize.width + 2 * padding > rect.w) {\n text = sliceTextToFitWidth(ctx, text, rect.w - 2 * padding, fonts)\n }\n\n const lh = oFont.lineHeight / 2\n const x = calculateX(rect, oAlign, padding)\n ctx.fillStyle = oColor\n ctx.font = oFont.string\n ctx.textAlign = oAlign\n ctx.textBaseline = 'middle'\n const y = displayMode === 'headerBoxes' ? rect.y + rect.h / 2 : rect.y + padding + spacing + lh\n ctx.fillText(text, x, y)\n}\n\nfunction sliceTextToFitWidth(\n ctx: CanvasRenderingContext2D,\n text: string,\n width: number,\n fonts: Font[]\n) {\n const ellipsis = '...'\n const ellipsisWidth = measureLabelSize(ctx, [ellipsis], fonts).width\n if (ellipsisWidth >= width) {\n return ''\n }\n let lowerBoundLen = 1\n let upperBoundLen = text.length\n let currentWidth: number\n while (lowerBoundLen <= upperBoundLen) {\n const currentLen = Math.floor((lowerBoundLen + upperBoundLen) / 2)\n const currentText = text.slice(0, currentLen)\n currentWidth = measureLabelSize(ctx, [currentText], fonts).width\n if (currentWidth + ellipsisWidth > width) {\n upperBoundLen = currentLen - 1\n } else {\n lowerBoundLen = currentLen + 1\n }\n }\n const slicedText = text.slice(0, Math.max(0, lowerBoundLen - 1))\n return slicedText ? slicedText + ellipsis : ''\n}\n\nfunction measureLabelSize(\n ctx: CanvasRenderingContext2D & { _measureText?: unknown },\n lines: string[],\n fonts: Font[]\n) {\n const fontsKey = fonts.reduce((prev, item) => {\n prev += item.string\n return prev\n }, '')\n const mapKey = lines.join() + fontsKey + (ctx._measureText ? '-spriting' : '')\n let size = widthCache.get(mapKey)\n if (!size) {\n ctx.save()\n const count = lines.length\n let width = 0\n let height = 0\n for (let i = 0; i < count; i++) {\n const font = fonts[Math.min(i, fonts.length - 1)]\n ctx.font = font.string\n const text = lines[i]\n width = Math.max(width, ctx.measureText(text).width)\n height += font.lineHeight\n }\n ctx.restore()\n size = { height, width }\n widthCache.set(mapKey, size)\n }\n return size\n}\n\nfunction toFonts(fonts: Font[], fitRatio: number) {\n return fonts.map((f) => {\n const { lineHeight: _lineHeight, ...font } = f\n return toFont({ ...font, size: Math.floor(f.size * fitRatio) })\n })\n}\n\nfunction labelToDraw(\n _ctx: CanvasRenderingContext2D,\n rect: DrawRect,\n options: TreemapLabelsOptions,\n labelSize: LabelSize\n) {\n const { overflow, padding } = options\n const { width, height } = labelSize\n if (overflow === 'hidden') {\n return !(width + padding * 2 > rect.w || height + padding * 2 > rect.h)\n } else if (overflow === 'fit') {\n const ratio = Math.min(rect.w / (width + padding * 2), rect.h / (height + padding * 2))\n if (ratio < 1) {\n return ratio\n }\n }\n return true\n}\n\nfunction getFontFromOptions(rect: DrawRect, labels: TreemapLabelsOptions) {\n const { font, hoverFont } = labels\n const optFont = (rect.active ? hoverFont : font) || font\n return Array.isArray(optFont) ? optFont.map((f) => toFont(f)) : [toFont(optFont)]\n}\n\nfunction drawLabel(\n ctx: CanvasRenderingContext2D,\n rect: DrawRect,\n options: TreemapOptions,\n item: TreemapDataPoint,\n element: TextElement\n) {\n const labels = options.labels\n const content = resolveOption(labels.formatter, callbackContext(element, item))\n if (!content) {\n return\n }\n const contents = isArray(content) ? content : [content]\n let fonts = getFontFromOptions(rect, labels)\n let labelSize = measureLabelSize(ctx, contents, fonts)\n const lblToDraw = labelToDraw(ctx, rect, labels, labelSize)\n if (!lblToDraw) {\n return\n }\n if (isNumber(lblToDraw)) {\n labelSize = { height: labelSize.height * lblToDraw, width: labelSize.width * lblToDraw }\n fonts = toFonts(fonts, lblToDraw)\n }\n const { color, hoverColor, align } = labels\n const optColor = (rect.active ? hoverColor : color) || color\n const colors = isArray(optColor) ? optColor : [optColor]\n const xyPoint = calculateXYLabel(rect, labels, labelSize)\n ctx.textAlign = align\n ctx.textBaseline = 'middle'\n let lhs = 0\n contents.forEach((l, i) => {\n const c = colors[Math.min(i, colors.length - 1)]\n const f = fonts[Math.min(i, fonts.length - 1)]\n const lh = f.lineHeight\n ctx.font = f.string\n ctx.fillStyle = c\n ctx.fillText(l, xyPoint.x, xyPoint.y + lh / 2 + lhs)\n lhs += lh\n })\n}\n\nexport function drawDivider(\n ctx: CanvasRenderingContext2D,\n rect: DrawRect,\n options: TreemapOptions,\n item: TreemapDataPoint\n) {\n const dividers = options.dividers\n const children = item._data?.children\n if (!dividers.display || !Array.isArray(children) || !children.length) {\n return\n }\n const { x, y, w, h } = rect\n const { lineColor, lineCapStyle, lineDash, lineDashOffset, lineWidth } = dividers\n ctx.save()\n ctx.strokeStyle = lineColor\n ctx.lineCap = lineCapStyle\n ctx.setLineDash(lineDash)\n ctx.lineDashOffset = lineDashOffset\n ctx.lineWidth = lineWidth\n ctx.beginPath()\n if (w > h) {\n const w2 = w / 2\n ctx.moveTo(x + w2, y)\n ctx.lineTo(x + w2, y + h)\n } else {\n const h2 = h / 2\n ctx.moveTo(x, y + h2)\n ctx.lineTo(x + w, y + h2)\n }\n ctx.stroke()\n ctx.restore()\n}\n\nfunction calculateXYLabel(rect: DrawRect, options: TreemapLabelsOptions, labelSize: LabelSize) {\n const { align, position, padding } = options\n const x = calculateX(rect, align, padding)\n let y: number\n if (position === 'top') {\n y = rect.y + padding\n } else if (position === 'bottom') {\n y = rect.y + rect.h - padding - labelSize.height\n } else {\n y = rect.y + (rect.h - labelSize.height) / 2 + padding\n }\n return { x, y }\n}\n\nfunction calculateX(rect: DrawRect, align: CanvasTextAlign, padding: number) {\n if (align === 'left') {\n return rect.x + padding\n } else if (align === 'right') {\n return rect.x + rect.w - padding\n }\n return rect.x + rect.w / 2\n}\n","import { Chart, DatasetController, registry } from 'chart.js'\nimport { clipArea, isObject, toFont, unclipArea, valueOrDefault } from 'chart.js/helpers'\n\nimport { version } from '../package.json'\nimport { arrayNotEqual, rectNotEqual, scaleRect } from './helpers/index'\nimport { parseBorderWidth } from './options'\nimport squarify from './squarify'\nimport { getCaptionHeight, shouldDrawCaption } from './text'\nimport { getGroupKey, group, normalizeTreeToArray, requireVersion } from './utils'\n\nfunction buildData(tree: any, dataset: any, keys: any[], mainRect: any) {\n const treeLeafKey = dataset.treeLeafKey || '_leaf'\n if (isObject(tree)) {\n tree = normalizeTreeToArray(keys, treeLeafKey, tree)\n }\n const groups = dataset.groups || []\n const glen = groups.length\n const sp = dataset.displayMode === 'headerBoxes' ? 0 : valueOrDefault(dataset.spacing, 0)\n const captions = dataset.captions || {}\n const font = toFont(captions.font)\n const padding = valueOrDefault(captions.padding, 3)\n\n function getSubRect(sq: any, rect: any) {\n const bw =\n dataset.displayMode === 'headerBoxes'\n ? { b: 0, l: 0, r: 0, t: 0 }\n : parseBorderWidth(dataset.borderWidth, sq.w / 2, sq.h / 2)\n const subRect = {\n ...rect,\n h: sq.h - 2 * sp - bw.t - bw.b,\n w: sq.w - 2 * sp - bw.l - bw.r,\n x: sq.x + sp + bw.l,\n y: sq.y + sp + bw.t,\n }\n if (shouldDrawCaption(dataset.displayMode, subRect, captions)) {\n const captionHeight = getCaptionHeight(dataset.displayMode, subRect, font, padding)\n subRect.y += captionHeight\n subRect.h -= captionHeight\n }\n return subRect\n }\n\n function recur(treeElements: any, gidx: number, rect: any, parent?: any, gs?: any) {\n const g = getGroupKey(groups[gidx])\n const gdata = group(\n treeElements,\n g,\n keys,\n treeLeafKey,\n undefined,\n parent,\n groups.filter((_item: any, index: number) => index <= gidx),\n groups,\n gidx\n )\n const gsq = squarify(gdata, rect, keys, g, gidx, gs)\n const ret = gsq.slice()\n if (gidx < glen - 1) {\n gsq.forEach((sq) => {\n const subRect = getSubRect(sq, rect)\n const children: any[] = []\n const nextGroupIndex = sq._data.groupIndex + 1\n if (nextGroupIndex < glen) {\n children.push(...recur(sq._data.children, nextGroupIndex, subRect, sq.g, sq.s))\n }\n ret.push(...children)\n sq.isLeaf = !children.length\n })\n } else {\n gsq.forEach((sq) => {\n sq.isLeaf = true\n })\n }\n return ret\n }\n\n const result = glen ? recur(tree, 0, mainRect) : squarify(tree, mainRect, keys)\n return result\n .map((d) => {\n if (dataset.displayMode !== 'headerBoxes' || d.isLeaf) {\n return d\n }\n if (!shouldDrawCaption(dataset.displayMode, d, captions)) {\n return undefined\n }\n const captionHeight = getCaptionHeight(dataset.displayMode, d, font, padding)\n return { ...d, h: captionHeight }\n })\n .filter(Boolean)\n}\n\nexport default class TreemapController extends DatasetController {\n options: any\n _groups: any[] | undefined\n _keys: any[] | undefined\n _rect: any\n _rectChanged: boolean\n _prevTree: any\n\n constructor(chart: any, datasetIndex: number) {\n super(chart, datasetIndex)\n\n this._groups = undefined\n this._keys = undefined\n this._rect = undefined\n this._rectChanged = true\n }\n\n override initialize() {\n this.enableOptionSharing = true\n super.initialize()\n }\n\n override getMinMax(scale: any) {\n return {\n max: scale.axis === 'x' ? scale.right - scale.left : scale.bottom - scale.top,\n min: 0,\n }\n }\n\n override configure() {\n super.configure()\n const { xScale, yScale } = this.getMeta() as any\n if (!xScale || !yScale) {\n // configure is called once before `linkScales`, and at that call we don't have any scales linked yet\n return\n }\n\n const w = xScale.right - xScale.left\n const h = yScale.bottom - yScale.top\n const rect = { h, rtl: !!this.options.rtl, unsorted: !!this.options.unsorted, w, x: 0, y: 0 }\n\n if (rectNotEqual(this._rect, rect)) {\n this._rect = rect\n this._rectChanged = true\n }\n\n if (this._rectChanged) {\n xScale.max = w\n xScale.configure()\n yScale.max = h\n yScale.configure()\n }\n }\n\n override update(mode: any) {\n const dataset = this.getDataset() as any\n const { data } = this.getMeta()\n const groups = dataset.groups || []\n const keys = [dataset.key || ''].concat(dataset.sumKeys || [])\n dataset.tree = dataset.tree || dataset.data || []\n const tree = dataset.tree\n\n if (mode === 'reset') {\n // reset is called before 2nd configure and is only called if animations are enabled. So wen need an extra configure call here.\n this.configure()\n }\n\n if (\n this._rectChanged ||\n arrayNotEqual(this._keys || [], keys) ||\n arrayNotEqual(this._groups || [], groups) ||\n this._prevTree !== tree\n ) {\n this._groups = groups.slice()\n this._keys = keys.slice()\n this._prevTree = tree\n this._rectChanged = false\n\n dataset.data = buildData(tree, dataset, this._keys, this._rect)\n // @ts-expect-error using private stuff\n this._dataCheck()\n // @ts-expect-error using private stuff\n this._resyncElements()\n }\n\n this.updateElements(data, 0, data.length, mode)\n }\n\n override updateElements(rects: any[], start: number, count: number, mode: any) {\n const reset = mode === 'reset'\n const dataset = this.getDataset() as any\n const firstOpts = this.resolveDataElementOptions(start, mode)\n this._rect.options = firstOpts\n const sharedOptions = this.getSharedOptions(firstOpts)\n const includeOptions = this.includeOptions(mode, sharedOptions || {})\n const { xScale, yScale } = this.getMeta() as any\n\n for (let i = start; i < start + count; i++) {\n const options = sharedOptions || this.resolveDataElementOptions(i, mode)\n const properties: any = scaleRect(dataset.data[i], xScale, yScale, options.spacing)\n if (reset) {\n properties.width = 0\n properties.height = 0\n }\n\n if (includeOptions) {\n properties.options = options\n }\n this.updateElement(rects[i], i, properties, mode)\n }\n\n this.updateSharedOptions(sharedOptions || {}, mode, firstOpts)\n }\n\n override draw() {\n const { ctx, chartArea } = this.chart\n const metadata = ((this.getMeta() as any).data || []) as any[]\n const dataset = this.getDataset() as any\n const data = dataset.data\n\n clipArea(ctx, chartArea)\n for (let i = 0, ilen = metadata.length; i < ilen; ++i) {\n const rect = metadata[i]\n if (!rect.hidden) {\n rect.draw(ctx, data[i])\n }\n }\n unclipArea(ctx)\n }\n}\n\n;(TreemapController as any).id = 'treemap'\n\n;(TreemapController as any).version = version\n\n;(TreemapController as any).defaults = {\n animations: {\n numbers: {\n properties: ['x', 'y', 'width', 'height'],\n type: 'number',\n },\n },\n dataElementType: 'treemap',\n}\n\n;(TreemapController as any).descriptors = {\n _indexable: false,\n _scriptable: true,\n captions: {\n _fallback: true,\n _scriptable: (name: string) => name !== 'formatter',\n },\n labels: {\n _fallback: true,\n _scriptable: (name: string) => name !== 'formatter',\n },\n}\n\n;(TreemapController as any).overrides = {\n hover: {},\n interaction: {\n includeInvisible: true,\n intersect: true,\n mode: 'point',\n },\n\n plugins: {\n tooltip: {\n callbacks: {\n label(item: any) {\n const dataset = item.dataset\n const dataItem = dataset.data[item.dataIndex]\n const label = dataItem.g || dataItem._data.label || dataset.label\n return (label ? `${label}: ` : '') + dataItem.v\n },\n title(items: any[]) {\n if (items.length) {\n const item = items[0]\n return item.dataset.key || ''\n }\n return ''\n },\n },\n intersect: true,\n position: 'treemap',\n },\n },\n scales: {\n x: {\n alignToPixels: true,\n bounds: 'data',\n display: false,\n type: 'linear',\n },\n y: {\n alignToPixels: true,\n bounds: 'data',\n display: false,\n reverse: true,\n type: 'linear',\n },\n },\n}\n\n;(TreemapController as any).beforeRegister = () => {\n requireVersion('chart.js', '3.8', Chart.version)\n}\n\n;(TreemapController as any).afterRegister = () => {\n const tooltipPlugin = registry.plugins.get('tooltip') as any\n if (tooltipPlugin) {\n tooltipPlugin.positioners.treemap = (active: any[]) => {\n if (!active.length) {\n return false\n }\n\n const item = active.at(-1)\n const el = item.element\n\n return el.tooltipPosition()\n }\n } else {\n console.warn(\n 'Unable to register the treemap positioner because tooltip plugin is not registered'\n )\n }\n}\n\n;(TreemapController as any).afterUnregister = () => {\n const tooltipPlugin = registry.plugins.get('tooltip') as any\n if (tooltipPlugin) {\n delete tooltipPlugin.positioners.treemap\n }\n}\n","import type { Element } from 'chart.js'\nimport type { TreemapBorderRadius, TreemapConfig, TreemapOptions } from './types'\n\nimport { parseBorderRadius, parseBorderWidth } from './options'\n\nexport type DrawRect = {\n active?: boolean\n h: number\n radius: TreemapBorderRadius\n w: number\n x: number\n y: number\n}\n\ntype TreemapElementBase = Element<TreemapConfig, TreemapOptions>\n\nfunction getBounds(rect: TreemapElementBase, useFinalPosition?: boolean) {\n const { x, y, width, height } = rect.getProps(['x', 'y', 'width', 'height'], useFinalPosition)\n return { bottom: y + height, left: x, right: x + width, top: y }\n}\n\nexport function boundingRects(rect: TreemapElementBase) {\n const bounds = getBounds(rect)\n const width = bounds.right - bounds.left\n const height = bounds.bottom - bounds.top\n const border = parseBorderWidth(rect.options.borderWidth, width / 2, height / 2)\n const radius = parseBorderRadius(rect.options.borderRadius, width / 2, height / 2)\n const outer = {\n active: rect.active,\n h: height,\n radius,\n w: width,\n x: bounds.left,\n y: bounds.top,\n }\n\n return {\n inner: {\n active: rect.active,\n h: outer.h - border.t - border.b,\n radius: {\n bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)),\n bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r)),\n topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)),\n topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)),\n },\n w: outer.w - border.l - border.r,\n x: outer.x + border.l,\n y: outer.y + border.t,\n },\n outer,\n }\n}\n\nexport function inRange(\n rect: TreemapElementBase,\n x: number | null,\n y: number | null,\n useFinalPosition?: boolean\n) {\n const skipX = x === null\n const skipY = y === null\n const bounds = !rect || (skipX && skipY) ? false : getBounds(rect, useFinalPosition)\n\n return (\n bounds &&\n (skipX || (x >= bounds.left && x <= bounds.right)) &&\n (skipY || (y >= bounds.top && y <= bounds.bottom))\n )\n}\n\nexport function hasRadius(radius: TreemapBorderRadius) {\n return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight\n}\n\nexport function addNormalRectPath(ctx: CanvasRenderingContext2D, rect: DrawRect) {\n ctx.rect(rect.x, rect.y, rect.w, rect.h)\n}\n","import type {\n TreemapConfig,\n TreemapDataPoint,\n TreemapOptions,\n TreemapScriptableContext,\n} from './types'\n\nimport { Element } from 'chart.js'\nimport { addRoundedRectPath } from 'chart.js/helpers'\n\nimport { addNormalRectPath, boundingRects, hasRadius, inRange } from './geometry'\nimport { drawDivider, drawText } from './text'\n\nexport default class TreemapElement extends Element<TreemapConfig, TreemapOptions> {\n static readonly id = 'treemap'\n\n static override readonly defaults = {\n borderRadius: 0,\n borderWidth: 0,\n captions: {\n align: undefined,\n color: 'black',\n display: true,\n font: {},\n formatter: (ctx: TreemapScriptableContext) => {\n const label = ctx.raw._data?.label\n return ctx.raw.g || (typeof label === 'string' ? label : '')\n },\n padding: 3,\n },\n displayMode: 'containerBoxes',\n dividers: {\n display: false,\n lineCapStyle: 'butt',\n lineColor: 'black',\n lineDash: [],\n lineDashOffset: 0,\n lineWidth: 1,\n },\n label: undefined,\n labels: {\n align: 'center',\n color: 'black',\n display: false,\n font: {},\n formatter(ctx: TreemapScriptableContext) {\n const label = ctx.raw._data?.label\n if (ctx.raw.g) {\n return [ctx.raw.g, `${ctx.raw.v}`]\n }\n return typeof label === 'string' ? [label, `${ctx.raw.v}`] : `${ctx.raw.v}`\n },\n overflow: 'cut',\n padding: 3,\n position: 'middle',\n },\n rtl: false,\n spacing: 0.5,\n unsorted: false,\n }\n\n static readonly descriptors = {\n _indexable: false,\n _scriptable: true,\n captions: {\n _fallback: true,\n _scriptable: (name: string) => name !== 'formatter',\n },\n labels: {\n _fallback: true,\n _scriptable: (name: string) => name !== 'formatter',\n },\n }\n\n static override readonly defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor',\n }\n\n $context?: TreemapScriptableContext\n width: number | undefined\n height: number | undefined\n\n constructor(cfg?: Partial<TreemapConfig> & { options?: TreemapOptions }) {\n super()\n\n this.width = undefined\n this.height = undefined\n\n if (cfg) {\n Object.assign(this, cfg)\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, data?: TreemapDataPoint) {\n if (!data) {\n return\n }\n const options = this.options\n const { inner, outer } = boundingRects(this)\n const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath\n\n ctx.save()\n\n if (outer.w !== inner.w || outer.h !== inner.h) {\n ctx.beginPath()\n addRectPath(ctx, outer)\n ctx.clip()\n addRectPath(ctx, inner)\n ctx.fillStyle = options.borderColor\n ctx.fill('evenodd')\n }\n\n ctx.beginPath()\n addRectPath(ctx, inner)\n ctx.fillStyle = options.backgroundColor\n ctx.fill()\n\n drawDivider(ctx, inner, options, data)\n drawText(ctx, inner, options, data, this)\n ctx.restore()\n }\n\n inRange(mouseX: number, mouseY: number, useFinalPosition?: boolean) {\n return inRange(this, mouseX, mouseY, useFinalPosition)\n }\n\n inXRange(mouseX: number, useFinalPosition?: boolean) {\n return inRange(this, mouseX, null, useFinalPosition)\n }\n\n inYRange(mouseY: number, useFinalPosition?: boolean) {\n return inRange(this, null, mouseY, useFinalPosition)\n }\n\n getCenterPoint(useFinalPosition?: boolean) {\n const { x, y, width, height } = this.getProps(['x', 'y', 'width', 'height'], useFinalPosition)\n return {\n x: x + width / 2,\n y: y + height / 2,\n }\n }\n\n override tooltipPosition() {\n return this.getCenterPoint()\n }\n}\n","import { Chart } from 'chart.js'\n\nimport TreemapController from './controller'\nimport TreemapElement from './element'\n\nChart.register(TreemapController as any, TreemapElement as any)\n\nexport type {\n LabelAlign,\n LabelOverflow,\n LabelPosition,\n TreemapConfig,\n TreemapControllerDatasetOptions,\n TreemapDataPoint,\n TreemapElement as TreemapElementType,\n TreemapOptions,\n} from './types'\n\nexport * from './utils'\nexport { TreemapController, TreemapElement }\n"],"names":["scaleRect","sq","xScale","yScale","sp","sp2","x","getPixelForValue","y","w","h","height","hidden","width","arrayNotEqual","a","b","i","n","length","limit","value","min","max","Math","parseBorderWidth","maxW","maxH","o","toTRBL","bottom","l","left","r","right","t","top","getDims","itm","w2","s2","key","_normalized","ar","d1","sqrt","d2","getX","rect","rtl","iw","_ix","buildRow","dims","sum","_data","s","v","vs","values","_iy","group","g","level","gs","groupSum","Rect","area","this","ih","dir","side","map","arr","nsum","row","get","ret","maxd2","totd1","push","constructor","unsorted","getNewStat","sa","ratio","nmax","nmin","stat","_arr","Object","assign","setStat","StatArray","reset","_hist","Infinity","pushIf","fn","args","nstat","isOlderPart","act","req","startsWith","getGroupKey","lvl","String","hasGroupValue","scanTreeObject","keys","treeLeafKey","obj","tree","result","objIndex","record","reduce","reduced","item","forEach","k","childKey","child","isObject","splice","normalizeTreeToArray","data","maxVal","element","ikeys","groupKey","flatten","input","stack","res","next","pop","Array","isArray","reverse","getPath","groups","defaultValue","path","grp","join","resolveGroup","allGroups","groupIndex","idx","ensureGroup","tmp","groupValue","addKeys","tmpRef","mainGrp","mainValue","slice","create","resolvedAllGroups","resolvedGroupIndex","itemGroup","label","children","ak","index","_idx","sort","requireVersion","pkg","ver","strict","parts","split","Number","parseInt","Error","compareAspectRatio","oldStat","newStat","os2","ns2","l2","or","squarify","rectangle","gsum","rows","val","gval","undefined","widthCache","Map","shouldDrawCaption","displayMode","options","display","toFont","font","lineHeight","padding","valueOrDefault","getCaptionHeight","captionHeight","drawText","ctx","captions","labels","save","beginPath","clip","isLeaf","defined","content","resolveOption","formatter","callbackContext","contents","fonts","hoverFont","optFont","active","f","getFontFromOptions","labelSize","measureLabelSize","lblToDraw","_ctx","overflow","labelToDraw","isNumber","fitRatio","_lineHeight","size","floor","toFonts","color","hoverColor","align","optColor","colors","xyPoint","position","calculateX","calculateXYLabel","textAlign","textBaseline","lhs","c","lh","string","fillStyle","fillText","drawLabel","spacing","oColor","oAlign","oFont","text","resolveCaptionText","captionSize","ellipsis","ellipsisWidth","currentWidth","lowerBoundLen","upperBoundLen","currentLen","slicedText","sliceTextToFitWidth","drawCaption","restore","context","$context","raw","type","option","lines","fontsKey","prev","mapKey","_measureText","count","measureText","set","buildData","dataset","mainRect","glen","recur","treeElements","gidx","parent","gdata","filter","_item","gsq","subRect","bw","borderWidth","getSubRect","nextGroupIndex","d","Boolean","TreemapController","DatasetController","initialize","enableOptionSharing","super","getMinMax","scale","axis","configure","getMeta","r1","r2","_rect","_rectChanged","update","mode","getDataset","concat","sumKeys","_keys","_groups","_prevTree","_dataCheck","_resyncElements","updateElements","rects","start","firstOpts","resolveDataElementOptions","sharedOptions","getSharedOptions","includeOptions","properties","updateElement","updateSharedOptions","draw","chartArea","chart","metadata","clipArea","ilen","unclipArea","datasetIndex","getBounds","useFinalPosition","getProps","boundingRects","bounds","border","radius","toTRBLCorners","maxR","bottomLeft","bottomRight","topLeft","topRight","parseBorderRadius","borderRadius","outer","inner","inRange","skipX","skipY","addNormalRectPath","id","version","defaults","animations","numbers","dataElementType","descriptors","_indexable","_scriptable","_fallback","name","overrides","hover","interaction","includeInvisible","intersect","plugins","tooltip","callbacks","dataItem","dataIndex","title","items","scales","alignToPixels","beforeRegister","Chart","afterRegister","tooltipPlugin","registry","positioners","treemap","at","tooltipPosition","console","warn","afterUnregister","TreemapElement","Element","addRectPath","addRoundedRectPath","borderColor","fill","backgroundColor","dividers","lineColor","lineCapStyle","lineDash","lineDashOffset","lineWidth","strokeStyle","lineCap","setLineDash","moveTo","lineTo","h2","stroke","drawDivider","mouseX","mouseY","inXRange","inYRange","getCenterPoint","cfg","defaultRoutes","register"],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { DatasetController } from 'chart.js';
2
+ export default class TreemapController extends DatasetController {
3
+ options: any;
4
+ _groups: any[] | undefined;
5
+ _keys: any[] | undefined;
6
+ _rect: any;
7
+ _rectChanged: boolean;
8
+ _prevTree: any;
9
+ constructor(chart: any, datasetIndex: number);
10
+ initialize(): void;
11
+ getMinMax(scale: any): {
12
+ max: number;
13
+ min: number;
14
+ };
15
+ configure(): void;
16
+ update(mode: any): void;
17
+ updateElements(rects: any[], start: number, count: number, mode: any): void;
18
+ draw(): void;
19
+ }
@@ -0,0 +1,74 @@
1
+ import type { TreemapConfig, TreemapDataPoint, TreemapOptions, TreemapScriptableContext } from './types';
2
+ import { Element } from 'chart.js';
3
+ export default class TreemapElement extends Element<TreemapConfig, TreemapOptions> {
4
+ static readonly id = "treemap";
5
+ static readonly defaults: {
6
+ borderRadius: number;
7
+ borderWidth: number;
8
+ captions: {
9
+ align: undefined;
10
+ color: string;
11
+ display: boolean;
12
+ font: {};
13
+ formatter: (ctx: TreemapScriptableContext) => string;
14
+ padding: number;
15
+ };
16
+ displayMode: string;
17
+ dividers: {
18
+ display: boolean;
19
+ lineCapStyle: string;
20
+ lineColor: string;
21
+ lineDash: never[];
22
+ lineDashOffset: number;
23
+ lineWidth: number;
24
+ };
25
+ label: undefined;
26
+ labels: {
27
+ align: string;
28
+ color: string;
29
+ display: boolean;
30
+ font: {};
31
+ formatter(ctx: TreemapScriptableContext): string | string[];
32
+ overflow: string;
33
+ padding: number;
34
+ position: string;
35
+ };
36
+ rtl: boolean;
37
+ spacing: number;
38
+ unsorted: boolean;
39
+ };
40
+ static readonly descriptors: {
41
+ _indexable: boolean;
42
+ _scriptable: boolean;
43
+ captions: {
44
+ _fallback: boolean;
45
+ _scriptable: (name: string) => boolean;
46
+ };
47
+ labels: {
48
+ _fallback: boolean;
49
+ _scriptable: (name: string) => boolean;
50
+ };
51
+ };
52
+ static readonly defaultRoutes: {
53
+ backgroundColor: string;
54
+ borderColor: string;
55
+ };
56
+ $context?: TreemapScriptableContext;
57
+ width: number | undefined;
58
+ height: number | undefined;
59
+ constructor(cfg?: Partial<TreemapConfig> & {
60
+ options?: TreemapOptions;
61
+ });
62
+ draw(ctx: CanvasRenderingContext2D, data?: TreemapDataPoint): void;
63
+ inRange(mouseX: number, mouseY: number, useFinalPosition?: boolean): boolean;
64
+ inXRange(mouseX: number, useFinalPosition?: boolean): boolean;
65
+ inYRange(mouseY: number, useFinalPosition?: boolean): boolean;
66
+ getCenterPoint(useFinalPosition?: boolean): {
67
+ x: number;
68
+ y: number;
69
+ };
70
+ tooltipPosition(): {
71
+ x: number;
72
+ y: number;
73
+ };
74
+ }
@@ -0,0 +1,38 @@
1
+ import type { Element } from 'chart.js';
2
+ import type { TreemapBorderRadius, TreemapConfig, TreemapOptions } from './types';
3
+ export type DrawRect = {
4
+ active?: boolean;
5
+ h: number;
6
+ radius: TreemapBorderRadius;
7
+ w: number;
8
+ x: number;
9
+ y: number;
10
+ };
11
+ type TreemapElementBase = Element<TreemapConfig, TreemapOptions>;
12
+ export declare function boundingRects(rect: TreemapElementBase): {
13
+ inner: {
14
+ active: boolean;
15
+ h: number;
16
+ radius: {
17
+ bottomLeft: number;
18
+ bottomRight: number;
19
+ topLeft: number;
20
+ topRight: number;
21
+ };
22
+ w: number;
23
+ x: number;
24
+ y: number;
25
+ };
26
+ outer: {
27
+ active: boolean;
28
+ h: number;
29
+ radius: Required<import("chart.js").BorderRadius>;
30
+ w: number;
31
+ x: number;
32
+ y: number;
33
+ };
34
+ };
35
+ export declare function inRange(rect: TreemapElementBase, x: number | null, y: number | null, useFinalPosition?: boolean): boolean;
36
+ export declare function hasRadius(radius: TreemapBorderRadius): number;
37
+ export declare function addNormalRectPath(ctx: CanvasRenderingContext2D, rect: DrawRect): void;
38
+ export {};
@@ -0,0 +1,9 @@
1
+ export declare function scaleRect(sq: any, xScale: any, yScale: any, sp: number): {
2
+ height: number;
3
+ hidden: boolean;
4
+ width: number;
5
+ x: any;
6
+ y: any;
7
+ };
8
+ export declare function rectNotEqual(r1: any, r2: any): boolean;
9
+ export declare function arrayNotEqual(a: any[], b: any[]): boolean;
@@ -0,0 +1,5 @@
1
+ import TreemapController from './controller';
2
+ import TreemapElement from './element';
3
+ export type { LabelAlign, LabelOverflow, LabelPosition, TreemapConfig, TreemapControllerDatasetOptions, TreemapDataPoint, TreemapElement as TreemapElementType, TreemapOptions, } from './types';
4
+ export * from './utils';
5
+ export { TreemapController, TreemapElement };
@@ -0,0 +1,3 @@
1
+ export type { LabelAlign, LabelOverflow, LabelPosition, TreemapConfig, TreemapControllerDatasetOptions, TreemapDataPoint, TreemapElement as TreemapElementType, TreemapOptions, } from './types';
2
+ export { default as TreemapController } from './controller';
3
+ export { default as TreemapElement } from './element';
@@ -0,0 +1,9 @@
1
+ import type { TreemapBorderRadius, TreemapBorderWidth, TreemapOptions } from './types';
2
+ export type ParsedBorderWidth = {
3
+ b: number;
4
+ l: number;
5
+ r: number;
6
+ t: number;
7
+ };
8
+ export declare function parseBorderWidth(value: TreemapBorderWidth, maxW: number, maxH: number): ParsedBorderWidth;
9
+ export declare function parseBorderRadius(value: TreemapOptions['borderRadius'], maxW: number, maxH: number): TreemapBorderRadius;
package/dist/rect.d.ts ADDED
@@ -0,0 +1,18 @@
1
+ export default class Rect {
2
+ [key: string]: any;
3
+ rtl: boolean;
4
+ unsorted: boolean;
5
+ x: number;
6
+ y: number;
7
+ _ix: number;
8
+ _iy: number;
9
+ w: number;
10
+ h: number;
11
+ constructor(r?: any);
12
+ get area(): number;
13
+ get iw(): number;
14
+ get ih(): number;
15
+ get dir(): "x" | "y";
16
+ get side(): number;
17
+ map(arr: any): any[];
18
+ }
@@ -0,0 +1 @@
1
+ export default function squarify(values: any[], rectangle: any, keys?: string[], grp?: string, lvl?: number, gsum?: number): any[];