highcharts
Version:
JavaScript charting framework
11 lines • 9.09 kB
JavaScript
/**
* Highmaps JS v13.0.1 (2026-08-17)
* @module highcharts/modules/heatmap
* @requires highcharts
*
* (c) 2009-2026 Highsoft AS
* Author: Torstein Hønsi
*
* A commercial license may be required depending on use,
* see www.highcharts.com/license
*/import*as e from"../highcharts.js";import"./coloraxis.js";let t={};t.n=e=>{let r=e&&e.__esModule?()=>e.default:()=>e;return t.d(r,{a:r}),r},t.d=(e,r)=>{if(Array.isArray(r))for(var i=0;i<r.length;){var a=r[i++],s=r[i++];t.o(e,a)?0===s&&i++:0===s?Object.defineProperty(e,a,{enumerable:!0,value:r[i++]}):Object.defineProperty(e,a,{enumerable:!0,get:s})}else for(var a in r)t.o(r,a)&&!t.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:r[a]})},t.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);let r=e.default;var i,a=t.n(r);let s=e.default.Color;var o=t.n(s);let l=e.default.SeriesRegistry;var n=t.n(l);let h=e.default.SVGElement;var p=t.n(h);let{column:{prototype:u}}=n().seriesTypes;var d=i||(i={});function c(e){let t=this.series,r=t.chart.renderer;this.moveToTopOnHover&&this.graphic&&(t.stateMarkerGraphic||(t.stateMarkerGraphic=new(p())(r,"use").css({pointerEvents:"none"}).add(this.graphic.parentGroup)),e?.state==="hover"?(this.graphic.attr({id:this.id}),t.stateMarkerGraphic.attr({href:`${r.url}#${this.id}`,visibility:"visible"})):t.stateMarkerGraphic.attr({href:""}))}d.pointMembers={dataLabelOnNull:!0,moveToTopOnHover:!0,isValid:function(){return null!==this.value&&this.value!==1/0&&this.value!==-1/0&&(void 0===this.value||!isNaN(this.value))}},d.seriesMembers={colorKey:"value",axisTypes:["xAxis","yAxis","colorAxis"],parallelArrays:["x","y","value"],pointArrayMap:["value"],trackerGroups:["group","markerGroup","dataLabelsGroup"],colorAttribs:function(e){let t={};return(0,r.defined)(e.color)&&(!e.state||"normal"===e.state)&&(t[this.colorProp||"fill"]=e.color),t},pointAttribs:u.pointAttribs},d.compose=function(e){let t=e.prototype.pointClass;return(0,r.addEvent)(t,"afterSetState",c),e};let m=i,{scatter:{prototype:{pointClass:g}}}=n().seriesTypes;class y extends g{applyOptions(e,t){return(this.isNull||null===this.value)&&delete this.color,super.applyOptions(e,t),this.formatPrefix=this.isNull||null===this.value?"null":"point",this}getCellAttributes(){let e=this.series,t=e.options,i=(t.colsize||1)/2,a=(t.rowsize||1)/2,s=e.xAxis,o=e.yAxis,l=this.options.marker||e.options.marker,n=e.pointPlacementToXValue(),h=(0,r.pick)(this.pointPadding,t.pointPadding,0),p={x1:(0,r.clamp)(Math.round(s.len-s.translate(this.x-i,!1,!0,!1,!0,-n)),-s.len,2*s.len),x2:(0,r.clamp)(Math.round(s.len-s.translate(this.x+i,!1,!0,!1,!0,-n)),-s.len,2*s.len),y1:(0,r.clamp)(Math.round(o.translate(this.y-a,!1,!0,!1,!0)),-o.len,2*o.len),y2:(0,r.clamp)(Math.round(o.translate(this.y+a,!1,!0,!1,!0)),-o.len,2*o.len)};for(let e of[["width","x"],["height","y"]]){let t=e[0],i=e[1],a=i+"1",n=i+"2",u=Math.abs(p[a]-p[n]),d=l&&l.lineWidth||0,c=Math.abs(p[a]+p[n])/2,m=l&&l[t];if((0,r.defined)(m)&&m<u){let e=m/2+d/2;p[a]=c-e,p[n]=c+e}h&&(("x"===i&&s.reversed||"y"===i&&!o.reversed)&&(a=n,n=i+"1"),p[a]+=h,p[n]-=h)}return p}haloPath(e){if(!e)return[];let{x:t=0,y:r=0,width:i=0,height:a=0}=this.shapeArgs||{};return[["M",t-e,r-e],["L",t-e,r+a+e],["L",t+i+e,r+a+e],["L",t+i+e,r-e],["Z"]]}isValid(){return this.value!==1/0&&this.value!==-1/0}}(0,r.extend)(y.prototype,{dataLabelOnNull:!0,moveToTopOnHover:!0,ttBelow:!1});let b=e.default.SVGRenderer;var v=t.n(b);let{doc:x}=a(),{series:f,seriesTypes:{column:M,scatter:k}}=n(),{prototype:{symbols:A}}=v(),{colorFromPoint:C,getContext:w}={colorFromPoint:function(e,t){let i=t.series.colorAxis;if(i){let a=i.toColor(e||0,t).split(")")[0].split("(")[1].split(",").map(e=>(0,r.pick)(parseFloat(e),parseInt(e,10)));return a[3]=255*(0,r.pick)(a[3],1),(0,r.defined)(e)&&t.visible||(a[3]=0),a}return[0,0,0,0]},getContext:function(e){let{canvas:t,context:r}=e;return t&&r?.clearRect?(r.clearRect(0,0,t.width,t.height),r):(e.canvas=x.createElement("canvas"),e.context=e.canvas.getContext("2d",{willReadFrequently:!0})||void 0,e.context)}};class P extends k{constructor(){super(...arguments),this.valueMax=NaN,this.valueMin=NaN,this.isDirtyCanvas=!0}drawPoints(){let e=this,t=e.options,r=t.interpolation,i=t.marker||{};if(r){let{image:t,chart:r,xAxis:i,yAxis:a}=e,{reversed:s=!1,len:o}=i,{reversed:l=!1,len:n}=a,h={width:o,height:n};if(!t||e.isDirtyData||e.isDirtyCanvas){let o=w(e),{canvas:n,options:{colsize:p=1,rowsize:u=1},points:d,points:{length:c}}=e,m=r.colorAxis&&r.colorAxis[0];if(n&&o&&m){let{min:m,max:g}=i.getExtremes(),{min:y,max:b}=a.getExtremes(),v=g-m,x=b-y,f=Math.round(v/p/8*8),M=Math.round(x/u/8*8),[k,A]=[[f,f/v,s,"ceil"],[M,M/x,!l,"floor"]].map(([e,t,r,i])=>r?r=>Math[i](e-t*r):e=>Math[i](t*e)),w=n.width=f+1,P=w*(n.height=M+1),T=(c-1)/P,O=new Uint8ClampedArray(4*P),D=(e,t)=>4*Math.ceil(w*A(t-y)+k(e-m));e.buildKDTree();for(let e=0;e<P;e++){let t=d[Math.ceil(T*e)],{x:r,y:i}=t;O.set(C(t.value,t),D(r,i))}o.putImageData(new ImageData(O,w),0,0),t?t.attr({...h,href:n.toDataURL("image/png",1)}):(e.directTouch=!1,e.image=r.renderer.image(n.toDataURL("image/png",1)).attr(h).add(e.group))}e.isDirtyCanvas=!1}else(t.width!==o||t.height!==n)&&t.attr(h)}else(i.enabled||e._hasPointMarkers)&&(f.prototype.drawPoints.call(e),e.points.forEach(t=>{t.graphic&&(t.graphic[e.chart.styledMode?"css":"animate"](e.colorAttribs(t)),null===t.value&&t.graphic.addClass("highcharts-null-point"))}))}getSymbol(){this.symbol=this.options.marker?.symbol||"rect"}getExtremes(){let{dataMin:e,dataMax:t}=f.prototype.getExtremes.call(this,this.getColumn("value"));return(0,r.isNumber)(e)&&(this.valueMin=e),(0,r.isNumber)(t)&&(this.valueMax=t),f.prototype.getExtremes.call(this)}getValidPoints(e,t){return f.prototype.getValidPoints.call(this,e,t,!0)}hasData(){return!!this.dataTable.rowCount}init(){super.init.apply(this,arguments);let e=this.options;e.pointRange=(0,r.pick)(e.pointRange,e.colsize||1),this.yAxis.axisPointRange=e.rowsize||1,A.ellipse=A.circle,e.marker&&(0,r.isNumber)(e.borderRadius)&&(e.marker.r=e.borderRadius);let t=this.canvas=document.createElement("canvas");t&&(this.context=t?.getContext("webgpu"))}markerAttribs(e,t){let r=e.shapeArgs||{};if(e.hasImage)return{x:e.plotX,y:e.plotY};if(t&&"normal"!==t){let i=e.options.marker||{},a=this.options.marker||{},s=a.states?.[t]||{},o=i.states?.[t]||{},l=(o.width||s.width||r.width||0)+(o.widthPlus||s.widthPlus||0),n=(o.height||s.height||r.height||0)+(o.heightPlus||s.heightPlus||0);return{x:(r.x||0)+((r.width||0)-l)/2,y:(r.y||0)+((r.height||0)-n)/2,width:l,height:n}}return r}pointAttribs(e,t){let i=f.prototype.pointAttribs.call(this,e,t),a=this.options||{},s=this.chart.options.plotOptions||{},l=s.series||{},n=s.heatmap||{},h=e?.options.borderColor||a.borderColor||n.borderColor||l.borderColor,p=e?.options.borderWidth||a.borderWidth||n.borderWidth||l.borderWidth||i["stroke-width"];if(i.stroke=e?.marker?.lineColor||a.marker?.lineColor||h||this.color,i["stroke-width"]=p,t&&"normal"!==t){let s=(0,r.merge)(a.states?.[t],a.marker?.states?.[t],e?.options.marker?.states?.[t]||{});i.fill=s.color||o().parse(i.fill).brighten(s.brightness||0).get(),i.stroke=s.lineColor||i.stroke}return i}translate(){let{borderRadius:e,marker:t}=this.options,i=t?.symbol||"rect",a=A[i]?i:"rect",s=-1!==["circle","square"].indexOf(a);for(let t of(this.generatePoints(),this.points)){let o=t.getCellAttributes(),l=Math.min(o.x1,o.x2),n=Math.min(o.y1,o.y2),h=Math.max(Math.abs(o.x2-o.x1),0),p=Math.max(Math.abs(o.y2-o.y1),0);if(t.hasImage=0===(t.marker?.symbol||i||"").indexOf("url"),s){let e=Math.abs(h-p);l=Math.min(o.x1,o.x2)+(h<p?0:e/2),n=Math.min(o.y1,o.y2)+(h<p?e/2:0),h=p=Math.min(h,p)}t.hasImage&&(t.marker={width:h,height:p}),t.plotX=t.clientX=(o.x1+o.x2)/2,t.plotY=(o.y1+o.y2)/2,t.shapeType="path",t.shapeArgs=(0,r.merge)(!0,{x:l,y:n,width:h,height:p},{d:A[a](l,n,h,p,{r:(0,r.isNumber)(e)?e:0})})}(0,r.fireEvent)(this,"afterTranslate")}}P.defaultOptions=(0,r.merge)(k.defaultOptions,{animation:!1,borderRadius:0,borderWidth:0,interpolation:!1,nullColor:"var(--highcharts-neutral-color-3)",dataLabels:{formatter:function(){let{numberFormatter:e}=this.series.chart,{value:t}=this.point;return(0,r.isNumber)(t)?e(t,-1):""},inside:!0,verticalAlign:"middle",crop:!1,overflow:"allow",padding:0},marker:{radius:0,lineColor:void 0,states:{hover:{lineWidthPlus:0},select:{}}},clip:!0,pointRange:null,tooltip:{pointFormat:"{point.x}, {point.y}: {point.value}<br/>"},states:{hover:{halo:!1,brightness:.2}},legendSymbol:"rectangle"}),(0,r.addEvent)(P,"afterDataClassLegendClick",function(){this.isDirtyCanvas=!0,this.drawPoints(),this.options.enableMouseTracking&&this.drawTracker()}),(0,r.extend)(P.prototype,{axisTypes:m.seriesMembers.axisTypes,colorKey:m.seriesMembers.colorKey,directTouch:!0,getExtremesFromAll:!0,keysAffectYAxis:["y"],parallelArrays:m.seriesMembers.parallelArrays,pointArrayMap:["y","value"],pointClass:y,specialGroup:"group",trackerGroups:m.seriesMembers.trackerGroups,alignDataLabel:M.prototype.alignDataLabel,colorAttribs:m.seriesMembers.colorAttribs}),m.compose(P),n().registerSeriesType("heatmap",P);let T=a();export{T as default};