chartjs-chart-treemap 3.1.0 → 4.0.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,i){"use strict";const n=new Map;function r(t,e){const{x:i,y:n,width:r,height:o}=t.getProps(["x","y","width","height"],e);return{bottom:n+o,left:i,right:i+r,top:n}}function o(t,e,i){return Math.max(Math.min(t,i),e)}function s(t,e,n){const r=i.toTRBL(t);return{b:o(r.bottom,0,n),l:o(r.left,0,e),r:o(r.right,0,e),t:o(r.top,0,n)}}function a(t){const e=r(t),n=e.right-e.left,a=e.bottom-e.top,h=s(t.options.borderWidth,n/2,a/2),l=function(t,e,n){const r=i.toTRBLCorners(t),s=Math.min(e,n);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,n/2,a/2),c={active:t.active,h:a,radius:l,w:n,x:e.left,y:e.top};return{inner:{active:t.active,h:c.h-h.t-h.b,radius:{bottomLeft:Math.max(0,l.bottomLeft-Math.max(h.b,h.l)),bottomRight:Math.max(0,l.bottomRight-Math.max(h.b,h.r)),topLeft:Math.max(0,l.topLeft-Math.max(h.t,h.l)),topRight:Math.max(0,l.topRight-Math.max(h.t,h.r))},w:c.w-h.l-h.r,x:c.x+h.l,y:c.y+h.t},outer:c}}function h(t,e,i,n){const o=null===e,s=null===i,a=!(!t||o&&s)&&r(t,n);return a&&(o||e>=a.left&&e<=a.right)&&(s||i>=a.top&&i<=a.bottom)}function l(t,e){t.rect(e.x,e.y,e.w,e.h)}function c(t,e,n){if(!n||!1===n.display)return!1;if("headerBoxes"===t)return!0;const{w:r,h:s}=e,a=i.toFont(n.font).lineHeight,h=o(2*i.valueOrDefault(n.padding,3),0,Math.min(r,s));return r-h>a&&s-h>a}function u(t,e,i,n){if("headerBoxes"!==t)return i.lineHeight+2*n;const r=i.lineHeight+2*n;return e.h<2*r?e.h/3:r}function d(t,e,n,r){const{captions:o,labels:s,displayMode:a}=n;t.save(),t.beginPath(),t.rect(e.x,e.y,e.w,e.h),t.clip();const h=r&&(!i.defined(r.l)||r.isLeaf);h&&s.display?function(t,e,n){const r=n.labels,o=r.formatter;if(!o)return;const s=i.isArray(o)?o:[o];let a=function(t,e){const{font:n,hoverFont:r}=e,o=(t.active?r:n)||n;return Array.isArray(o)?o.map(t=>i.toFont(t)):[i.toFont(o)]}(e,r),h=f(t,s,a);const l=function(t,e,i,n){const{overflow:r,padding:o}=i,{width:s,height:a}=n;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;i.isNumber(l)&&(h={height:h.height*l,width:h.width*l},a=function(t,e){return t.map(t=>(t.size=Math.floor(t.size*e),t.lineHeight=void 0,i.toFont(t)))}(a,l));const{color:c,hoverColor:u,align:d}=r,g=(e.active?u:c)||c,m=i.isArray(g)?g:[g],x=function(t,e,i){const{align:n,position:r,padding:o}=e,s=p(t,n,o);let a;a="top"===r?t.y+o:"bottom"===r?t.y+t.h-o-i.height:t.y+(t.h-i.height)/2+o;return{x:s,y:a}}(e,r,h);t.textAlign=d,t.textBaseline="middle";let y=0;s.forEach((e,i)=>{const n=m[Math.min(i,m.length-1)],r=a[Math.min(i,a.length-1)],o=r.lineHeight;t.font=r.string,t.fillStyle=n,t.fillText(e,x.x,x.y+o/2+y),y+=o})}(t,e,n):!h&&c(a,e,o)&&function(t,e,n,r){const{captions:o,spacing:s,rtl:a,displayMode:h}=n,{color:l,hoverColor:c,font:u,hoverFont:d,padding:g,align:m,formatter:x}=o,y=(e.active?c:l)||l,b=m||(a?"right":"left"),v=(e.active?d:u)||u,w=i.toFont(v),_=[w];if(w.lineHeight>e.h)return;let M=x||r.g;const C=f(t,[x],_);C.width+2*g>e.w&&(M=function(t,e,i,n){const r="...",o=f(t,[r],n).width;if(o>=i)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)],n).width,s+o>i?h=r-1:a=r+1}const l=e.slice(0,Math.max(0,a-1));return l?l+r:""}(t,M,e.w-2*g,_));const k=w.lineHeight/2,O=p(e,b,g);t.fillStyle=y,t.font=w.string,t.textAlign=b,t.textBaseline="middle";const R="headerBoxes"===h?e.y+e.h/2:e.y+g+s+k;t.fillText(M,O,R)}(t,e,n,r),t.restore()}function f(t,e,i){const r=i.reduce((t,e)=>t+=e.string,""),o=e.join()+r+(t._measureText?"-spriting":"");if(!n.has(o)){t.save();const r=e.length;let s=0,a=0;for(let n=0;n<r;n++){const r=i[Math.min(n,i.length-1)];t.font=r.string;const o=e[n];s=Math.max(s,t.measureText(o).width),a+=r.lineHeight}t.restore(),n.set(o,{height:a,width:s})}return n.get(o)}function p(t,e,i){return"left"===e?t.x+i:"right"===e?t.x+t.w-i:t.x+t.w/2}class g extends e.Element{draw(t,e){if(!e)return;const n=this.options,{inner:r,outer:o}=a(this),s=(h=o.radius).topLeft||h.topRight||h.bottomLeft||h.bottomRight?i.addRoundedRectPath:l;var h;t.save(),o.w===r.w&&o.h===r.h||(t.beginPath(),s(t,o),t.clip(),s(t,r),t.fillStyle=n.borderColor,t.fill("evenodd")),t.beginPath(),s(t,r),t.fillStyle=n.backgroundColor,t.fill(),function(t,e,i,n){const r=i.dividers;if(!r.display||!n._data.children.length)return;const{x:o,y:s,w:a,h:h}=e,{lineColor:l,lineCapStyle:c,lineDash:u,lineDashOffset:d,lineWidth:f}=r;if(t.save(),t.strokeStyle=l,t.lineCap=c,t.setLineDash(u),t.lineDashOffset=d,t.lineWidth=f,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,r,n,e),d(t,r,n,e),t.restore()}inRange(t,e,i){return h(this,t,e,i)}inXRange(t,e){return h(this,t,null,e)}inYRange(t,e){return h(this,null,t,e)}getCenterPoint(t){const{x:e,y:i,width:n,height:r}=this.getProps(["x","y","width","height"],t);return{x:e+n/2,y:i+r/2}}tooltipPosition(){return this.getCenterPoint()}constructor(t){super(),this.options=void 0,this.width=void 0,this.height=void 0,t&&Object.assign(this,t)}}function m(t,e,i,n){const r=2*n,o=e.getPixelForValue(t.x),s=i.getPixelForValue(t.y),a=e.getPixelForValue(t.x+t.w)-o,h=i.getPixelForValue(t.y+t.h)-s;return{height:h-r,hidden:r>a||r>h,width:a-r,x:o+n,y:s+n}}function x(t,e){let i,n;if(!t||!e)return!0;if(t===e)return!1;if(t.length!==e.length)return!0;for(i=0,n=t.length;i<n;++i)if(t[i]!==e[i])return!0;return!1}function y(t,e,i,n){const r=t._normalized,o=e*r/i,s=Math.sqrt(r*o),a=r/s;return{d1:s,d2:a,h:"_ix"===n?a:s,w:"_ix"===n?s:a}}g.id="treemap",g.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},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=>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",padding:3,position:"middle"},rtl:!1,spacing:.5,unsorted:!1},g.descriptors={_indexable:!1,_scriptable:!0,captions:{_fallback:!0},labels:{_fallback:!0}},g.defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};const b=(t,e)=>t.rtl?t.x+t.iw-e:t.x+t._ix;function v(t,e,i,n){const r={_data:e._data,a:e._normalized,h:i.h,s:n,v:e.value,vs:e.values,w:i.w,x:b(t,i.w),y:t.y+t._iy};return e.group&&(r.g=e.group,r.l=e.level,r.gs=e.groupSum),r}class w{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:i}=this,n="x"===e?"_ix":"_iy",r=t.nsum,o=t.get(),s=i*i,a=r*r,h=[];let l=0,c=0;for(const e of o){const i=y(e,s,a,n);c+=i.d1,l=Math.max(l,i.d2),h.push(v(this,e,i,t.sum)),this[n]+=i.d1}return this["x"===e?"_iy":"_ix"]+=l,this[n]-=c,h}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 _=Math.min,M=Math.max;function C(t,e){const i=+e[t.key],n=i*t.ratio;return e._normalized=n,{max:M(t.max,i),min:_(t.min,i),nmax:M(t.nmax,n),nmin:_(t.nmin,n),nsum:t.nsum+n,sum:t.sum+i}}function k(t,e,i){t._arr.push(e),function(t,e){Object.assign(t,e)}(t,i)}class O{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){k(this,t,C(this,t))}pushIf(t,e,...i){const n=C(this,t);if(!e((r=this,{max:r.max,min:r.min,nmax:r.nmax,nmin:r.nmin,nsum:r.nsum,sum:r.sum}),n,i))return t;var r;k(this,t,n)}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 R=(t,e)=>e>t||t.length>e.length&&t.startsWith(e),T=t=>String(t);function E(t,e,n,r=[],o=0,s=[]){const a=o-1;if(t[0]in n&&o>0){const i=r.reduce((t,e,i)=>(i!==a&&(t[T(i)]=e),t),{});i[e]=r[a],t.forEach(t=>{i[t]=n[t]}),s.push(i)}else for(const a of Object.keys(n)){const h=n[a];i.isObject(h)&&(r.push(a),E(t,e,h,r,o+1,s))}return r.splice(a,1),s}function j(t,e,i){const n=E(t,e,i);if(!n.length)return n;const r=n.reduce((t,e)=>{const i=Object.keys(e).length-2;return Math.max(t,i)},0);return n.forEach(t=>{for(let e=0;e<r;e++){const i=T(e);t[i]||(t[i]="")}}),n}function L(t){const e=[...t],i=[];for(;e.length;){const t=e.pop();Array.isArray(t)?e.push(...t):i.push(t)}return i.reverse()}function P(t,e,i){if(!t.length)return;const n=[];for(const r of t){const t=e[r];if(""===t){n.push(i);break}n.push(t)}return n.length?n.join("."):i}function S(t,e,i,n,r,o,s=[]){const a=i[0],h=i.slice(1),l=Object.create(null),c=Object.create(null),u=[];let d,f,p;for(f=0,p=t.length;f<p;++f){const i=t[f];if(r&&i[r]!==o)continue;if(d=i[e]||i[n]||"",!d)return[];if(!(d in l)){l[d]={value:0};const t=l[d];h.forEach(e=>{t[e]=0}),c[d]=[]}l[d].value+=+i[a],l[d].label=i[e]||"";const u=l[d];h.forEach(t=>{u[t]+=i[t]}),l[d].path=P(s,i,d),c[d].push(i)}return Object.keys(l).forEach(t=>{const i={children:c[t]};i[a]=+l[t].value,h.forEach(e=>{i[e]=+l[t][e]}),i[e]=l[t].label,i.label=t,i.path=l[t].path,r&&(i[r]=o),u.push(i)}),u}function D(t,e){let n,r=t.length;if(!r)return e;const o=i.isObject(t[0]);for(e=o?e:"v",n=0,r=t.length;n<r;++n)o?t[n]._idx=n:t[n]={_idx:n,v:t[n]};return e}function A(t,e){e?t.sort((t,i)=>+i[e]-+t[e]):t.sort((t,e)=>+e-+t)}function B(t,e){let i,n,r;for(i=0,n=0,r=t.length;n<r;++n)i+=e?+t[n][e]:+t[n];return i}function F(t,e,i,n=!0){const r=i.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(R(a,s)){if(n)throw new Error(`${t} v${i} is not supported. v${e} or newer is required.`);return!1}}return!0}function z(t,e,i){if(0===t.sum)return!0;const[n]=i,r=t.nsum*t.nsum,o=e.nsum*e.nsum,s=n*n,a=Math.max(s*t.nmax/r,r/(s*t.nmin));return Math.max(s*e.nmax/o,o/(s*e.nmin))<=a}function H(t,e,i=[],n,r,o){t=t||[];const s=[],a=new w(e),h=new O("value",a.area/B(t,i[0]));let l=a.side;const c=t.length;let u,d;if(!c)return s;const f=t.slice(),p=D(f,i[0]);e?.unsorted||A(f,p);const g=t=>p?+f[t][p]:+f[t],m=t=>n&&f[t][n];for(u=0;u<c;++u){if(d={_data:t[f[u]._idx],group:void 0,groupSum:o,level:void 0,value:g(u)},n){d.level=r,d.group=m(u);const t=f[u];d.values=i.reduce((e,i)=>(e[i]=+t[i],e),{})}d=h.pushIf(d,z,l),d&&(s.push(a.map(h)),l=a.side,h.reset(),h.push(d))}return h.length&&s.push(a.map(h)),L(s)}class W 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 i=t.right-t.left,n=e.bottom-e.top,r={h:n,rtl:!!this.options.rtl,unsorted:!!this.options.unsorted,w:i,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=i,t.configure(),e.max=n,e.configure())}update(t){const e=this.getDataset(),{data:n}=this.getMeta(),r=e.groups||[],o=[e.key||""].concat(e.sumKeys||[]);e.tree=e.tree||e.data||[];const a=e.tree;"reset"===t&&this.configure(),(this._rectChanged||x(this._keys||[],o)||x(this._groups||[],r)||this._prevTree!==a)&&(this._groups=r.slice(),this._keys=o.slice(),this._prevTree=a,this._rectChanged=!1,e.data=function(t,e,n,r){const o=e.treeLeafKey||"_leaf";i.isObject(t)&&(t=j(n,o,t));const a=e.groups||[],h=a.length,l="headerBoxes"===e.displayMode?0:i.valueOrDefault(e.spacing,0),d=e.captions||{},f=i.toFont(d.font),p=i.valueOrDefault(d.padding,3),g=h?function t(i,r,g,m,x){const y=T(a[r]),b=r>0?T(a[r-1]):void 0,v=S(i,y,n,o,b,m,a.filter((t,e)=>e<=r)),w=H(v,g,n,y,r,x),_=w.slice();return r<h-1?w.forEach(i=>{const n="headerBoxes"===e.displayMode?{b:0,l:0,r:0,t:0}:s(e.borderWidth,i.w/2,i.h/2),o={...g,h:i.h-2*l-n.t-n.b,w:i.w-2*l-n.l-n.r,x:i.x+l+n.l,y:i.y+l+n.t};if(c(e.displayMode,o,d)){const t=u(e.displayMode,o,f,p);o.y+=t,o.h-=t}const a=[];v.forEach(e=>{a.push(...t(e.children,r+1,o,i.g,i.s))}),_.push(...a),i.isLeaf=!a.length}):w.forEach(t=>{t.isLeaf=!0}),_}(t,0,r):H(t,r,n);return g.map(t=>{if("headerBoxes"!==e.displayMode||t.isLeaf)return t;if(!c(e.displayMode,t,d))return;const i=u(e.displayMode,t,f,p);return{...t,h:i}}).filter(Boolean)}(a,e,this._keys,this._rect),this._dataCheck(),this._resyncElements()),this.updateElements(n,0,n.length,t)}updateElements(t,e,i,n){const r="reset"===n,o=this.getDataset(),s=this.resolveDataElementOptions(e,n);this._rect.options=s;const a=this.getSharedOptions(s),h=this.includeOptions(n,a||{}),{xScale:l,yScale:c}=this.getMeta();for(let s=e;s<e+i;s++){const e=a||this.resolveDataElementOptions(s,n),i=m(o.data[s],l,c,e.spacing);r&&(i.width=0,i.height=0),h&&(i.options=e),this.updateElement(t[s],s,i,n)}this.updateSharedOptions(a||{},n,s)}draw(){const{ctx:t,chartArea:e}=this.chart,n=this.getMeta().data||[],r=this.getDataset().data;i.clipArea(t,e);for(let e=0,i=n.length;e<i;++e){const i=n[e];i.hidden||i.draw(t,r[e])}i.unclipArea(t)}constructor(t,e){super(t,e),this._groups=void 0,this._keys=void 0,this._rect=void 0,this._rectChanged=!0}}W.id="treemap",W.version="0.0.0-development",W.defaults={animations:{numbers:{properties:["x","y","width","height"],type:"number"}},dataElementType:"treemap"},W.descriptors={_indexable:!1,_scriptable:!0},W.overrides={hover:{},interaction:{includeInvisible:!0,intersect:!0,mode:"point"},plugins:{tooltip:{callbacks:{label(t){const e=t.dataset,i=e.data[t.dataIndex],n=i.g||i._data.label||e.label;return(n?`${n}: `:"")+i.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"}}},W.beforeRegister=()=>{F("chart.js","3.8",e.Chart.version)},W.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")},W.afterUnregister=()=>{const t=e.registry.plugins.get("tooltip");t&&delete t.positioners.treemap},e.Chart.register(W,g),t.TreemapController=W,t.TreemapElement=g,t.flatten=L,t.getGroupKey=T,t.group=S,t.index=D,t.normalizeTreeToArray=j,t.requireVersion=F,t.sort=A,t.sum=B});
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/element.ts","../src/helpers/index.ts","../src/rect.ts","../src/statArray.ts","../src/utils.ts","../src/squarify.ts","../src/controller.ts","../src/index.ts"],"sourcesContent":["import { Element } from 'chart.js'\nimport {\n addRoundedRectPath,\n defined,\n isArray,\n isNumber,\n toFont,\n toTRBL,\n toTRBLCorners,\n valueOrDefault,\n} from 'chart.js/helpers'\n\nconst widthCache = new Map()\n\nfunction getBounds(rect: any, 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\nfunction limit(value: number, min: number, max: number) {\n return Math.max(Math.min(value, max), min)\n}\n\nexport function parseBorderWidth(value: any, maxW: number, maxH: number) {\n const o = toTRBL(value)\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\nfunction parseBorderRadius(value: any, maxW: number, maxH: number) {\n const o = toTRBLCorners(value)\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\nfunction boundingRects(rect: any) {\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\nfunction inRange(rect: any, x: number | null, y: number | null, useFinalPosition?: boolean) {\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\nfunction hasRadius(radius: any) {\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: CanvasRenderingContext2D, rect: any) {\n ctx.rect(rect.x, rect.y, rect.w, rect.h)\n}\n\nexport function shouldDrawCaption(displayMode: any, rect: any, options: any) {\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 = limit(valueOrDefault(options.padding, 3) * 2, 0, Math.min(w, h))\n return w - padding > min && h - padding > min\n}\n\nexport function getCaptionHeight(displayMode: any, rect: any, font: any, padding: number) {\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\nfunction drawText(ctx: CanvasRenderingContext2D, rect: any, options: any, item: any) {\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)\n } else if (!isLeaf && shouldDrawCaption(displayMode, rect, captions)) {\n drawCaption(ctx, rect, options, item)\n }\n ctx.restore()\n}\n\nfunction drawCaption(ctx: CanvasRenderingContext2D, rect: any, options: any, item: any) {\n const { captions, spacing, rtl, displayMode } = 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 fonts = [oFont]\n if (oFont.lineHeight > rect.h) {\n return\n }\n let text = formatter || item.g\n const captionSize = measureLabelSize(ctx, [formatter], 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: any[]\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: any[]\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 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, { height, width })\n }\n return widthCache.get(mapKey)\n}\n\nfunction toFonts(fonts: any[], fitRatio: number) {\n return fonts.map((f) => {\n f.size = Math.floor(f.size * fitRatio)\n f.lineHeight = undefined\n return toFont(f)\n })\n}\n\nfunction labelToDraw(_ctx: CanvasRenderingContext2D, rect: any, options: any, labelSize: any) {\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: any, labels: any) {\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(ctx: CanvasRenderingContext2D, rect: any, options: any) {\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 = { 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\nfunction drawDivider(ctx: CanvasRenderingContext2D, rect: any, options: any, item: any) {\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: any, options: any, labelSize: any) {\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: any, 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\nexport default class TreemapElement extends Element {\n declare options: any\n width: number | undefined\n height: number | undefined\n\n constructor(cfg?: any) {\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: CanvasRenderingContext2D, data: any) {\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)\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\n;(TreemapElement as any).id = 'treemap'\n\n;(TreemapElement as any).defaults = {\n borderRadius: 0,\n borderWidth: 0,\n captions: {\n align: undefined,\n color: 'black',\n display: true,\n font: {},\n formatter: (ctx: any) => ctx.raw.g || ctx.raw._data.label || '',\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: any) {\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 padding: 3,\n position: 'middle',\n },\n rtl: false,\n spacing: 0.5,\n unsorted: false,\n}\n\n;(TreemapElement as any).descriptors = {\n _indexable: false,\n _scriptable: true,\n captions: {\n _fallback: true,\n },\n labels: {\n _fallback: true,\n },\n}\n\n;(TreemapElement as any).defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor',\n}\n","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","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\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 if (!groups.length) {\n return undefined\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\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) {\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 let g: string\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 g = v[grp] || v[treeLeafKey] || ''\n if (!g) {\n return []\n }\n if (!(g in tmp)) {\n tmp[g] = { value: 0 }\n const tmpRef = tmp[g]\n addKeys.forEach((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((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: 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.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 = 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 { Chart, DatasetController, registry } from 'chart.js'\nimport { clipArea, isObject, toFont, unclipArea, valueOrDefault } from 'chart.js/helpers'\n\nimport { version } from '../package.json'\nimport { getCaptionHeight, parseBorderWidth, shouldDrawCaption } from './element'\nimport { arrayNotEqual, rectNotEqual, scaleRect } from './helpers/index'\nimport squarify from './squarify'\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 recur(treeElements: any, gidx: number, rect: any, parent?: any, gs?: any) {\n const g = getGroupKey(groups[gidx])\n const pg = gidx > 0 ? getGroupKey(groups[gidx - 1]) : undefined\n const gdata = group(\n treeElements,\n g,\n keys,\n treeLeafKey,\n pg,\n parent,\n groups.filter((_item: any, index: number) => index <= 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 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 const children: any[] = []\n gdata.forEach((gEl) => {\n children.push(...recur(gEl.children, gidx + 1, 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}\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 { 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":["widthCache","Map","getBounds","rect","useFinalPosition","x","y","width","height","getProps","bottom","left","right","top","limit","value","min","max","Math","parseBorderWidth","maxW","maxH","o","toTRBL","b","l","r","t","boundingRects","bounds","border","options","borderWidth","radius","toTRBLCorners","maxR","bottomLeft","bottomRight","topLeft","topRight","parseBorderRadius","borderRadius","outer","active","h","w","inner","inRange","skipX","skipY","addNormalRectPath","ctx","shouldDrawCaption","displayMode","display","toFont","font","lineHeight","padding","valueOrDefault","getCaptionHeight","captionHeight","drawText","item","captions","labels","save","beginPath","clip","isLeaf","defined","content","formatter","contents","isArray","fonts","hoverFont","optFont","Array","map","f","getFontFromOptions","labelSize","measureLabelSize","lblToDraw","_ctx","overflow","ratio","labelToDraw","isNumber","fitRatio","size","floor","undefined","toFonts","color","hoverColor","align","optColor","colors","xyPoint","position","calculateX","calculateXYLabel","textAlign","textBaseline","lhs","forEach","i","c","length","lh","string","fillStyle","fillText","drawLabel","spacing","rtl","oColor","oAlign","oFont","text","g","captionSize","ellipsis","ellipsisWidth","currentWidth","lowerBoundLen","upperBoundLen","currentLen","slice","slicedText","sliceTextToFitWidth","drawCaption","restore","lines","fontsKey","reduce","prev","mapKey","join","_measureText","has","count","measureText","set","get","TreemapElement","Element","draw","data","this","addRectPath","addRoundedRectPath","borderColor","fill","backgroundColor","dividers","_data","children","lineColor","lineCapStyle","lineDash","lineDashOffset","lineWidth","strokeStyle","lineCap","setLineDash","w2","moveTo","lineTo","h2","stroke","drawDivider","mouseX","mouseY","inXRange","inYRange","getCenterPoint","tooltipPosition","constructor","cfg","super","Object","assign","scaleRect","sq","xScale","yScale","sp","sp2","getPixelForValue","hidden","arrayNotEqual","a","n","getDims","itm","s2","key","_normalized","ar","d1","sqrt","d2","id","defaults","raw","label","v","unsorted","descriptors","_indexable","_scriptable","_fallback","defaultRoutes","getX","iw","_ix","buildRow","dims","sum","s","vs","values","_iy","group","level","gs","groupSum","Rect","area","ih","dir","side","arr","nsum","row","ret","maxd2","totd1","push","getNewStat","sa","nmax","nmin","stat","_arr","setStat","StatArray","reset","_hist","Infinity","pushIf","fn","args","nstat","isOlderPart","act","req","startsWith","getGroupKey","lvl","String","scanTreeObject","keys","treeLeafKey","obj","tree","result","objIndex","record","reduced","k","childKey","child","isObject","splice","normalizeTreeToArray","maxVal","element","ikeys","groupKey","flatten","input","stack","res","next","pop","reverse","getPath","groups","defaultValue","path","grp","mainGrp","mainValue","addKeys","tmp","create","tmpRef","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","idx","gval","TreemapController","DatasetController","initialize","enableOptionSharing","getMinMax","scale","axis","configure","getMeta","r1","r2","_rect","_rectChanged","update","mode","dataset","getDataset","concat","sumKeys","_keys","_groups","_prevTree","mainRect","glen","recur","treeElements","gidx","parent","pg","gdata","filter","_item","gsq","bw","subRect","gEl","d","Boolean","buildData","_dataCheck","_resyncElements","updateElements","rects","start","firstOpts","resolveDataElementOptions","sharedOptions","getSharedOptions","includeOptions","properties","updateElement","updateSharedOptions","chartArea","chart","metadata","clipArea","ilen","unclipArea","datasetIndex","version","animations","numbers","type","dataElementType","overrides","hover","interaction","includeInvisible","intersect","plugins","tooltip","callbacks","dataItem","dataIndex","title","items","scales","alignToPixels","beforeRegister","Chart","afterRegister","tooltipPlugin","registry","positioners","treemap","at","console","warn","afterUnregister","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,27 @@
1
+ import { Element } from 'chart.js';
2
+ export declare function parseBorderWidth(value: any, maxW: number, maxH: number): {
3
+ b: number;
4
+ l: number;
5
+ r: number;
6
+ t: number;
7
+ };
8
+ export declare function shouldDrawCaption(displayMode: any, rect: any, options: any): boolean;
9
+ export declare function getCaptionHeight(displayMode: any, rect: any, font: any, padding: number): any;
10
+ export default class TreemapElement extends Element {
11
+ options: any;
12
+ width: number | undefined;
13
+ height: number | undefined;
14
+ constructor(cfg?: any);
15
+ draw(ctx: CanvasRenderingContext2D, data: any): void;
16
+ inRange(mouseX: number, mouseY: number, useFinalPosition?: boolean): boolean;
17
+ inXRange(mouseX: number, useFinalPosition?: boolean): boolean;
18
+ inYRange(mouseY: number, useFinalPosition?: boolean): boolean;
19
+ getCenterPoint(useFinalPosition?: boolean): {
20
+ x: any;
21
+ y: any;
22
+ };
23
+ tooltipPosition(): {
24
+ x: any;
25
+ y: any;
26
+ };
27
+ }
@@ -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';
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[];
@@ -0,0 +1,18 @@
1
+ export default class StatArray {
2
+ key: string;
3
+ ratio: number;
4
+ _arr: any[];
5
+ _hist: any[];
6
+ sum: number;
7
+ nsum: number;
8
+ min: number;
9
+ max: number;
10
+ nmin: number;
11
+ nmax: number;
12
+ constructor(key: string, ratio: number);
13
+ get length(): number;
14
+ reset(): void;
15
+ push(o: any): void;
16
+ pushIf(o: any, fn: any, ...args: any[]): any;
17
+ get(): any[];
18
+ }
@@ -0,0 +1,113 @@
1
+ import type { Chart, ChartComponent, Color, CoreChartOptions, DatasetController, Element, FontSpec, Scriptable, ScriptableContext, VisualElement } from 'chart.js';
2
+ export type AnyObject = Record<string, unknown>;
3
+ export type LabelPosition = 'top' | 'middle' | 'bottom';
4
+ export type LabelAlign = 'left' | 'center' | 'right';
5
+ export type LabelOverflow = 'cut' | 'hidden' | 'fit';
6
+ type TreemapScriptableContext = ScriptableContext<'treemap'> & {
7
+ raw: TreemapDataPoint;
8
+ };
9
+ type TreemapControllerDatasetCaptionsOptions = {
10
+ align?: Scriptable<LabelAlign, TreemapScriptableContext>;
11
+ color?: Scriptable<Color, TreemapScriptableContext>;
12
+ display?: boolean;
13
+ formatter?: Scriptable<string, TreemapScriptableContext>;
14
+ font?: FontSpec;
15
+ hoverColor?: Scriptable<Color, TreemapScriptableContext>;
16
+ hoverFont?: FontSpec;
17
+ padding?: number;
18
+ };
19
+ type TreemapControllerDatasetLabelsOptions = {
20
+ align?: Scriptable<LabelAlign, TreemapScriptableContext>;
21
+ color?: Scriptable<Color | Color[], TreemapScriptableContext>;
22
+ display?: boolean;
23
+ formatter?: Scriptable<string | Array<string>, TreemapScriptableContext>;
24
+ font?: Scriptable<FontSpec | FontSpec[], TreemapScriptableContext>;
25
+ hoverColor?: Scriptable<Color | Color[], TreemapScriptableContext>;
26
+ hoverFont?: Scriptable<FontSpec | FontSpec[], TreemapScriptableContext>;
27
+ overflow?: Scriptable<LabelOverflow, TreemapScriptableContext>;
28
+ padding?: number;
29
+ position?: Scriptable<LabelPosition, TreemapScriptableContext>;
30
+ };
31
+ type TreemapControllerDatasetDividersOptions = {
32
+ display?: boolean;
33
+ lineCapStyle?: string;
34
+ lineColor?: string;
35
+ lineDash?: number[];
36
+ lineDashOffset?: number;
37
+ lineWidth?: number;
38
+ };
39
+ export interface TreemapControllerDatasetOptions<DType> {
40
+ spacing?: number;
41
+ rtl?: boolean;
42
+ displayType?: 'containerBoxes' | 'headerBoxes';
43
+ backgroundColor?: Scriptable<Color, TreemapScriptableContext>;
44
+ borderColor?: Scriptable<Color, TreemapScriptableContext>;
45
+ borderWidth?: number;
46
+ hoverBackgroundColor?: Scriptable<Color, TreemapScriptableContext>;
47
+ hoverBorderColor?: Scriptable<Color, TreemapScriptableContext>;
48
+ hoverBorderWidth?: number;
49
+ captions?: TreemapControllerDatasetCaptionsOptions;
50
+ dividers?: TreemapControllerDatasetDividersOptions;
51
+ labels?: TreemapControllerDatasetLabelsOptions;
52
+ label?: string;
53
+ data: TreemapDataPoint[];
54
+ groups?: Array<keyof DType>;
55
+ sumKeys?: Array<keyof DType>;
56
+ tree: number[] | DType[] | AnyObject;
57
+ treeLeafKey?: keyof DType;
58
+ key?: keyof DType;
59
+ }
60
+ export interface TreemapDataPoint {
61
+ x: number;
62
+ y: number;
63
+ w: number;
64
+ h: number;
65
+ v: number;
66
+ s: number;
67
+ l?: number;
68
+ g?: string;
69
+ gs?: number;
70
+ vs?: AnyObject;
71
+ _data?: AnyObject;
72
+ isLeaf?: boolean;
73
+ }
74
+ declare module 'chart.js' {
75
+ interface ChartTypeRegistry {
76
+ treemap: {
77
+ chartOptions: CoreChartOptions<'treemap'>;
78
+ datasetOptions: TreemapControllerDatasetOptions<Record<string, unknown>>;
79
+ defaultDataPoint: TreemapDataPoint;
80
+ metaExtensions: AnyObject;
81
+ parsedDataType: unknown;
82
+ scales: never;
83
+ };
84
+ }
85
+ }
86
+ export interface TreemapOptions {
87
+ backgroundColor: Color;
88
+ borderColor: Color;
89
+ borderWidth: number | {
90
+ top?: number;
91
+ right?: number;
92
+ bottom?: number;
93
+ left?: number;
94
+ };
95
+ }
96
+ export interface TreemapConfig {
97
+ x: number;
98
+ y: number;
99
+ width: number;
100
+ height: number;
101
+ }
102
+ export type TreemapController = DatasetController;
103
+ export type TreemapControllerComponent = ChartComponent & {
104
+ prototype: TreemapController;
105
+ new (chart: Chart, datasetIndex: number): TreemapController;
106
+ };
107
+ export interface TreemapElement<T extends TreemapConfig = TreemapConfig, O extends TreemapOptions = TreemapOptions> extends Element<T, O>, VisualElement {
108
+ }
109
+ export type TreemapElementComponent = ChartComponent & {
110
+ prototype: TreemapElement;
111
+ new (cfg: TreemapConfig): TreemapElement;
112
+ };
113
+ export {};