minerva-design 1.6.1 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # minerva-design
2
2
 
3
+ ## 1.7.1
4
+
5
+ ### Patch Changes
6
+
7
+ - docs(site): split the docs into docs, components and charts sections
8
+
9
+ ## 1.7.0
10
+
11
+ ### Minor Changes
12
+
13
+ - test(docs): give the feed crossing test room under ci coverage
14
+ feat(charts): order book heatmap legend, size unit, rank-blended heat and fast smoke check
15
+
3
16
  ## 1.6.1
4
17
 
5
18
  ### Patch Changes
@@ -1,2 +1,2 @@
1
- const e=require("../color.cjs"),t=require("../locale.cjs"),n=require("../scale.cjs"),r=require("../renderers/follow.cjs"),i=require("../time.cjs"),a=require("./book.cjs"),o=require("./format.cjs"),s=require("./host.cjs"),c=require("./field.cjs"),l=require("./layout.cjs");var u=256,d=4096,f=.99,p=2,m=[[0,`#0b1322`],[.3,`#0e1c36`],[.5,`#11306a`],[.63,`#1556a8`],[.74,`#1b95c8`],[.83,`#59d6d0`],[.9,`#f2e14b`],[.96,`#ff8c2b`],[1,`#fff6e8`]],h=[[0,`#f7f9fc`],[.3,`#eef3fa`],[.5,`#d6e3f5`],[.63,`#9dbde9`],[.74,`#4f86d6`],[.85,`#2f4fb0`],[.93,`#6a2a9c`],[1,`#c4173f`]],ee=16,g=6,_=14,v=3,y=(t,n=u)=>{let r=new Uint32Array(n);if(!t.length)return r;let i=t.map(([,t])=>e.toOklab(t)),a=0;for(let o=0;o<n;o++){let s=o/Math.max(1,n-1);for(;a+1<t.length-1&&s>t[a+1][0];)a++;let[c]=t[a],l=Math.min(t.length-1,a+1),[u]=t[l],d=u>c?Math.min(1,Math.max(0,(s-c)/(u-c))):0,f=i[a],p=i[l];r[o]=e.packColor(e.fromOklab([f[0]+(p[0]-f[0])*d,f[1]+(p[1]-f[1])*d,f[2]+(p[2]-f[2])*d,1]))}return r},b=e=>{if(!(e>0)||e>=p)return 1;let t=p/e;for(let e=1;e<0xe8d4a51000;e*=10)for(let n of[1,2,5])if(n*e>=t)return n*e;return 1},x={en:{time:`Time`,price:`Price`,liquidity:`Liquidity`,buys:`Buys`,sells:`Sells`,bid:`Bid`,ask:`Ask`,bidSide:`Bid side`,askSide:`Ask side`,name:`Liquidity heatmap`},zh:{time:`时间`,price:`价格`,liquidity:`挂单量`,buys:`主动买入`,sells:`主动卖出`,bid:`买一`,ask:`卖一`,bidSide:`买盘`,askSide:`卖盘`,name:`订单簿热力图`},ja:{time:`時刻`,price:`価格`,liquidity:`指値量`,buys:`買い約定`,sells:`売り約定`,bid:`最良買気配`,ask:`最良売気配`,bidSide:`買い板`,askSide:`売り板`,name:`板ヒートマップ`},fr:{time:`Heure`,price:`Prix`,liquidity:`Liquidité`,buys:`Achats`,sells:`Ventes`,bid:`Meilleur achat`,ask:`Meilleure vente`,bidSide:`Côté achat`,askSide:`Côté vente`,name:`Carte de chaleur de la liquidité`}},te=(e,t,n,r)=>{if(!(e>0)||!(t>0))return 0;let i=Math.min(1,e*r/t);switch(n){case`linear`:return i;case`log`:return Math.log10(1+9*i);default:return Math.sqrt(i)}},ne=(p,ne={})=>{let S=ne,C=a.createOrderBookStore(),w=s.createEmitter(),T=o.createFormatters(S,2,4),E={up:[0,0,0,1],down:[0,0,0,1]},D=new Uint32Array(u),O=new Uint32Array(c.HEAT_TABLE_SIZE+1),k=[0,0,0,1],A=!1,j=0,M=[],N=0,P=NaN,F={buyVolume:0,buyNotional:0,sellVolume:0,sellNotional:0},re=null,I=NaN,ie=0,L=0,R=0,z=-1/0,B=0,V=0,H=null,ae=``,oe=``,se=null,U=null,ce=0,le=!1,W=()=>{},ue=new Promise(e=>{W=e}),de=!0,fe=NaN,G=[0,1],K=[0,1],pe=!1,q=null,me=NaN,he=NaN,ge=0,J={x:0,y:0,w:0,h:0},_e=null,Y=``,X=null,Z=s.createHost(p,{className:`minerva-orderbook-heatmap`,draw:Ke,onTheme:()=>{Ee(),Z.invalidate()}}),{root:Q,doc:ve}=Z;Q.tabIndex=0,Q.setAttribute(`role`,`figure`),Q.style.touchAction=`none`;let ye=t.localeLabels(x,S.locale,S.labels),be=()=>ye,xe=()=>{ye=t.localeLabels(x,S.locale,S.labels),Q.setAttribute(`aria-label`,S.ariaLabel??ye.name)},$=()=>Math.max(10,S.interval??100),Se=()=>Math.max($()*4,S.history??3e5),Ce=()=>Math.max(4,Math.round(S.depth??160)),we=()=>{if(!Number.isFinite(I))return Date.now();let e=Te()-ie;return I+Math.min(Math.max(0,e),$()*3)},Te=()=>typeof performance<`u`?performance.now():Date.now();function Ee(){let t=Z.theme;E=o.sideColors(t,S);let n=e=>{let n=t.resolve?t.resolve(e,t.primary):t.primary;return[n[0],n[1],n[2],1]},r=[t.background[0],t.background[1],t.background[2],1];if(A=t.background[3]>0&&e.luminance(r)<.4,S.colors?.length){let t=S.colors.map(n);k=t[0]??r,D=e.oklabRamp(t.length>1?t:[k,k],u)}else{let t=(A?m:h).map(([t,n])=>[t,e.parseColor(n)??r]);k=t[0][1],D=y(t,u)}let i=S.colorScale??`sqrt`;O=c.heatTable(D,e=>te(e,1,i,1)),oe=``}let De=()=>{T=o.createFormatters(S,j>0?Math.max(a.decimalsOf(j),a.inferPriceDecimals(C)):a.inferPriceDecimals(C),a.inferSizeDecimals(C))},Oe=()=>{M=[],H=null,ae=oe=``,se=null,P=NaN,L=R=0,z=-1/0,B=0,V=0,he=NaN,F.buyVolume=F.buyNotional=F.sellVolume=F.sellNotional=0},ke=()=>{if(j>0)return;let e=a.inferTickSize(C),t=C.mid();if(S.tickSize&&S.tickSize>0)j=S.tickSize;else if(e>0&&Number.isFinite(t)){let n=t*1e-5/e,r=1;for(let e=1;e<=1e9&&r<n*.75;e*=10)for(let t of[1,2,5])if(r=t*e,r>=n*.75)break;j=a.roundToStep(e*r,e)}else j=Number.isFinite(t)?Math.max(1e-8,t*1e-5):0;j>0&&De()},Ae=()=>{let e=Ce(),t=new Float64Array(e*2),n=new Float32Array(e*2),r=0;for(let i of[`bid`,`ask`]){let a=C.count(i),o=0;for(let s=0;s<a;s++){let a=Math.round(C.priceAt(i,s)/j),c=C.sizeAt(i,s);if(r>0&&t[r-1]===a&&o>0){n[r-1]+=c;continue}if(o>=e)break;t[r]=a,n[r]=c,r++,o++}}return{bins:t.slice(0,r),sizes:n.slice(0,r)}},je=e=>{if(!(j>0))return;let{bins:t,sizes:n}=Ae(),r={seq:N++,time:e,bins:t,sizes:n,bestBid:C.bestBid(),bestAsk:C.bestAsk(),buyVolume:F.buyVolume,buyNotional:F.buyNotional,sellVolume:F.sellVolume,sellNotional:F.sellNotional};F.buyVolume=F.buyNotional=F.sellVolume=F.sellNotional=0,M.push(r);let i=e-Se(),a=0;for(;a<M.length&&M[a].time<i;)a++;a&&(M=M.slice(a))},Me=e=>{if(!Number.isFinite(e))return;let t=$();if(!Number.isFinite(P)){P=Math.floor(e/t)*t;return}if(e-P>Se()){je(P),P=Math.floor(e/t)*t;return}for(;e>=P+t;)je(P),P+=t},Ne=e=>e===void 0||!Number.isFinite(e)?Date.now():((!Number.isFinite(I)||e>=I)&&(I=e,ie=Te()),e),Pe=e=>{if(Number.isFinite(P)&&e>=P)return null;let t=0,n=M.length;for(;t<n;){let r=t+n>>>1;M[r].time<=e?t=r+1:n=r}return t>0?M[t-1]:null},Fe=()=>{if(!Number.isFinite(P)||!(j>0))return null;let e=C.version();return(!se||se.version!==e)&&(se={version:e,...Ae()}),{time:P,bins:se.bins,sizes:se.sizes}},Ie=(e,t,n,r,i,a)=>{let s=$(),l=Fe(),u=Math.min(d,Math.ceil(J.w)),p=Math.min(d,Math.ceil(J.h)),m=b(j/(r-n)*J.h),h=M.length?M[M.length-1].seq:-1,ee=[e,t,n,r,Math.floor(i/s),M.length,h,se?.version??-1,u,p,m,j].join(`|`);if(ee!==ae){let a=l?[...M,l]:M;H=c.buildHeatGrid({sources:a,step:s,tick:j,x0:e,x1:t,y0:n,y1:r,end:i,maxWidth:u,maxHeight:p,rowBins:m},H),ae=ee,oe=``}if(!H)return null;let g=S.maxSize;if(g!==void 0&&g>0)L=g;else{let e=Te();if(e-z>250||!(R>0)){let t=c.percentile(H.cells,f);t>0&&(R=t),z=e}L>0?R>0&&Math.abs(R/L-1)>.001&&(L+=(R-L)*o.ease(a,700)):L=R}let _=Math.max(.01,S.contrast??1),v=L>0?c.HEAT_TABLE_SIZE*_/L:0;return`${H.version}|${v}`!==oe&&(c.paintHeatGrid(H,O,v),oe=`${H.version}|${v}`),H},Le=()=>{let e=$(),t=[],n=0,r=M.length;for(;n<r;){let t=n+r>>>1;M[t].time+e<G[0]?n=t+1:r=t}for(let e=n;e<M.length;e++){let n=M[e];if(n.time>G[1])break;t.push(n)}return t},Re=(e,t)=>{let n=$(),r=Math.max(1,Math.ceil(g/Math.max(1e-6,t))),i=[],a=NaN,o=0,s=0,c={bv:0,bn:0,sv:0,sn:0},l=()=>{let e=(o+s)/2;c.sv>0&&i.push({time:e,price:c.sn/c.sv,volume:c.sv,buy:!1}),c.bv>0&&i.push({time:e,price:c.bn/c.bv,volume:c.bv,buy:!0}),c.bv=c.bn=c.sv=c.sn=0},u=(e,t,i)=>{let u=Math.floor(e/r);u!==a&&(Number.isFinite(a)&&l(),a=u,o=t),s=t+n,c.bv+=i.buyVolume,c.bn+=i.buyNotional,c.sv+=i.sellVolume,c.sn+=i.sellNotional};for(let t of e)u(t.seq,t.time,t);return Number.isFinite(P)&&P<=G[1]&&u(N,P,F),Number.isFinite(a)&&l(),i},ze=e=>{e.save(),e.beginPath(),e.rect(J.x,J.y,J.w,J.h),e.clip()},Be=(t,n,r,i,a)=>{if(S.bestLines===!1)return;let o=$(),s=n.map(e=>[e.time,e.time+o,e.bestBid,e.bestAsk]);if(Number.isFinite(P)&&s.push([P,P+o,C.bestBid(),C.bestAsk()]),!s.length)return;for(let e=0;e+1<s.length;e++)s[e][1]=s[e+1][0];let c=a>=2,l=e=>{let t=r(e[0]),n=r(e[1]);return c?[t,n]:[(t+n)/2,(t+n)/2]};ze(t),t.beginPath();let u=[],d=()=>{if(u.length){u.forEach((e,n)=>{let[r,a]=l(e),o=i(e[3]);n?t.lineTo(r,o):t.moveTo(r,o),t.lineTo(a,o)});for(let e=u.length-1;e>=0;e--){let[n,r]=l(u[e]),a=i(u[e][2]);t.lineTo(r,a),t.lineTo(n,a)}t.closePath(),u=[]}};for(let e of s){let[,,t,n]=e;Number.isFinite(t)&&Number.isFinite(n)&&n>t?u.push(e):d()}d(),t.fillStyle=e.toCss(Z.theme.text,A?.08:.07),t.fill(),t.lineJoin=`round`;for(let[n,r]of[[2,E.up],[3,E.down]]){t.beginPath();let a=!1;for(let e of s){let r=e[n];if(!Number.isFinite(r)){a=!1;continue}let o=i(r),[s,u]=l(e);a?t.lineTo(s,o):t.moveTo(s,o),c&&t.lineTo(u,o),a=!0}t.strokeStyle=e.toCss(k,.55),t.lineWidth=3.5,t.stroke(),t.strokeStyle=e.toCss(r),t.lineWidth=1.5,t.stroke()}t.restore()},Ve=(t,n,r,i,a)=>{if(!n.length)return;let s=0;for(let e of n){let t=r(e.time);t>=J.x&&t<=J.x+J.w&&(s=Math.max(s,e.volume))}s>0&&(B=B>0?Math.max(s,B*.995):s);let c=S.bubbleVolume??B;if(!(c>0))return;let l=Math.max(v,S.bubbleSize??_),u=Math.min(v,l),d=n.map(e=>({...e,d:o.clamp(Math.sqrt(e.volume/c)*l,u,l)})).sort((e,t)=>e.d-t.d);ze(t),t.lineWidth=1,t.textAlign=`center`,t.textBaseline=`middle`,t.font=o.fontOf(Z.theme,S,600,Math.max(8,a-1));let f=A?[1,1,1,1]:[0,0,0,1];for(let n of d){let a=r(n.time),o=i(n.price),s=n.d/2;if(a<J.x-s||a>J.x+J.w+s||o<J.y-s||o>J.y+J.h+s)continue;let c=n.buy?E.up:E.down;if(t.beginPath(),t.arc(a,o,Math.max(1,s-.5),0,Math.PI*2),t.fillStyle=e.toCss(c,.35),t.fill(),t.strokeStyle=e.toCss(e.mixOklab(c,f,.2),.9),t.stroke(),n.d>=26){let r=T.compact(n.volume);t.measureText(r).width<=n.d-6&&(t.fillStyle=e.toCss(A?[1,1,1,1]:[.08,.08,.1,1]),t.fillText(r,a,o+.5))}}t.restore()},He=(e,t)=>{let n=[],r=[],i=C.count(e),a=0,o=NaN;for(let s=0;s<i;s++){let i=Math.round(C.priceAt(e,s)/j);if(i!==o){if(++a>Ce())break;o=i}let c=Math.floor(i/t),l=C.sizeAt(e,s);n.length&&n[n.length-1]===c?r[r.length-1]+=l:(n.push(c),r.push(l))}return{side:e,buckets:n,sizes:r}},Ue=(t,n,r,i,a,s)=>{let c=Z.theme,[u,d]=K,f=Math.max(1,j*s/(d-u)*J.h),p=e=>(e*s-.5)*j,m=e=>(e*s+s-.5)*j,h=0,ee=[`bid`,`ask`].map(e=>{let t=He(e,s);return t.buckets.forEach((e,n)=>{m(e)>=u&&p(e)<=d&&(h=Math.max(h,t.sizes[n]))}),t});if((h>V||h<V*.6||!(V>0))&&(V=l.fineCeil(h)),!(V>0))return;let g=n+2,_=Math.max(4,r-6);t.strokeStyle=e.toCss(c.text,.07),t.lineWidth=1,t.setLineDash([2,3]),t.beginPath();for(let e of[.5,1]){let n=Math.round(g+_*e)-.5;t.moveTo(n,J.y),t.lineTo(n,J.y+J.h)}t.stroke(),t.setLineDash([]),t.save(),t.beginPath(),t.rect(n,J.y,r,J.h),t.clip();let v=+(f>=4),y=(e,n)=>{let r=Math.round(i(m(e))),a=Math.max(r+1,Math.round(i(p(e)))-v),o=Math.max(1,Math.min(_,n/V*_));t.rect(g,r,o,a-r)};for(let{side:n,buckets:r,sizes:i}of ee){let a=n===`bid`?E.up:E.down;t.beginPath();for(let e=1;e<r.length;e++){let t=r[e];m(t)>=u&&p(t)<=d&&y(t,i[e])}t.fillStyle=e.toCss(a,A?.62:.55),t.fill();let o=r[0];o!==void 0&&m(o)>=u&&p(o)<=d&&(t.beginPath(),y(o,i[0]),t.fillStyle=e.toCss(a),t.fill())}t.restore();let b=Math.round(J.y+J.h+4)+.5;t.strokeStyle=e.toCss(c.textMuted,.7),t.beginPath(),t.moveTo(g,b),t.lineTo(g+_,b);for(let e of[0,.5,1]){let n=Math.round(g+_*e)+.5;t.moveTo(n,b),t.lineTo(n,b+3)}t.stroke(),t.font=o.fontOf(c,S,400,Math.max(8,a-1)),t.fillStyle=e.toCss(c.textMuted),t.textBaseline=`top`;let x=T.compact(V),te=t.measureText(x).width;t.textAlign=`right`,t.fillText(x,g+_+2,b+4),te+t.measureText(`0`).width+8<_&&(t.textAlign=`left`,t.fillText(`0`,g-1,b+4))},We=e=>{if(!_e||S.tooltip===!1||!(j>0)||X||!pe)return null;let[t,n]=_e;if(t<J.x||t>J.x+J.w||n<J.y||n>J.y+J.h)return null;let[r,i]=G,[o,s]=K,c=r+(t-J.x)/J.w*(i-r),l=o+(J.y+J.h-n)/J.h*(s-o),u=Math.floor(Math.round(l/j)/e),d=Math.min(12,a.decimalsOf(j)+2),f=+(u*e*j).toFixed(d),p=+((u*e+e-1)*j).toFixed(d),m=+((f+p)/2).toFixed(d),h=Pe(c);return{hx:t,hy:n,time:c,start:h?h.time:Number.isFinite(P)&&c>=P?P:NaN,column:h,bucket:u,ry:e,low:f,high:p,rowPrice:m}},Ge=(t,n,r,i,a,s,c,l=`left`)=>{let u=Math.min(t.measureText(n).width+10,a),d=l===`center`?r-u/2:r;t.fillStyle=c?e.toCss(s):e.toCss(k),o.roundRect(t,d,i-ee/2,u,ee,3),t.fill(),c||(t.strokeStyle=e.toCss(s),t.lineWidth=1,t.stroke()),t.fillStyle=c?e.luminance(s)>.6?`#111`:`#fff`:e.toCss(s),t.textAlign=l,t.textBaseline=`middle`,t.fillText(n,l===`center`?r:d+5,i+.5)};function Ke(t){let r=Z.ctx;if(!r)return!1;let{width:a,height:s,dpr:c,theme:u}=Z,d=ge?t-ge:0;ge=t;let f=be(),p=S.fontSize??(a<420?10:11),m=o.fontOf(u,S,400,p),h=o.fontOf(u,S,600,p),g=$(),_=!Number.isFinite(I);_&&C.count(`bid`)+C.count(`ask`)>0&&Me(Date.now());let v=we();he=Number.isFinite(he)&&v>he-g*4?Math.max(he,v):v;let y=he;r.setTransform(c,0,0,c,0,0),r.clearRect(0,0,a,s),ke();let x=C.mid();r.font=h;let te=T.price(Number.isFinite(x)?x*1.0001:0),ne=Math.ceil(r.measureText(te).width)+18;r.font=m;let w=S.profile===!1?0:Math.round(o.clamp(a*.12,56,120)),D=p+12;J={x:0,y:0,w:Math.max(10,a-ne-w),h:Math.max(10,s-D)};let O=J.x+J.w,A=O+w;if(Number.isFinite(fe)||(fe=Math.max(g*10,S.window??6e4)),de){let e=M.length?M[0].time:P;G=l.fitTimeRange(e,y,fe,Math.min(fe,g*60));let t=C.bestBid(),n=C.bestAsk();for(let e of Le())Number.isFinite(e.bestBid)&&!(e.bestBid>=t)&&(t=e.bestBid),Number.isFinite(e.bestAsk)&&!(e.bestAsk<=n)&&(n=e.bestAsk);Number.isFinite(t)||(t=n),Number.isFinite(n)||(n=t);let r=j>0?j*Math.max(40,J.h/6):0,i=S.priceSpan??(Number.isFinite(me)?me:void 0);if(r>0||i!==void 0){q=l.fitPriceRange(q,t,n,r,i);let[e,a]=q;if(Number.isFinite(e)&&Number.isFinite(a)){if(!pe)K=[e,a],pe=!0;else{let t=o.ease(d,280);K=[K[0]+(e-K[0])*t,K[1]+(a-K[1])*t]}}}}let[N,F]=G,[L,R]=K,z=e=>J.x+(e-N)/(F-N)*J.w,B=e=>J.y+J.h-(e-L)/(R-L)*J.h,V=pe&&j>0,H=Le(),ae=g/(F-N)*J.w,oe=V?b(j/(R-L)*J.h):1,se=e.toCss(k);if(U){let e=U.canvas;e.style.left=`${J.x}px`,e.style.top=`${J.y}px`,e.style.width=`${J.w}px`,e.style.height=`${J.h}px`;let t=Math.max(1,Math.round(J.w*c)),n=Math.max(1,Math.round(J.h*c));(e.width!==t||e.height!==n)&&U.resize(t,n);let r=V&&Number.isFinite(P)?Ie(N,F,L,R,y,d):null;r&&(oe=r.rowBins);let i=t/J.w,a=n/J.h,o=r?[(z(r.t0)-J.x)*i,(B(r.p1)-J.y)*a,(z(r.t1)-J.x)*i,(B(r.p0)-J.y)*a]:[0,0,0,0];U.render(r,o,k)}else r.fillStyle=se,r.fillRect(J.x,J.y,J.w,J.h);let ce=V?n.linearTicks(L,R,Math.max(2,Math.floor(J.h/44))):[],le=i.timeTicks(N,F,Math.max(2,Math.floor(J.w/75)),void 0,S.timeZone??`local`);r.strokeStyle=e.toCss(u.axis),r.lineWidth=1,r.beginPath();for(let e of ce){let t=Math.round(B(e))+.5;r.moveTo(A,t),r.lineTo(A+4,t)}for(let e of le.values){let t=Math.round(z(e))+.5;t<=J.x+1||t>=O-1||(r.moveTo(t,J.y+J.h),r.lineTo(t,J.y+J.h+4))}r.stroke(),V&&(S.bubbles!==!1&&Ve(r,Re(H,ae),z,B,p),Be(r,H,z,B,ae),w&&Ue(r,O,w,B,p,oe)),r.strokeStyle=e.toCss(u.axis),r.lineWidth=1,r.beginPath(),r.moveTo(0,Math.round(J.y+J.h)+.5),r.lineTo(a,Math.round(J.y+J.h)+.5),w&&(r.moveTo(Math.round(O)+.5,J.y),r.lineTo(Math.round(O)+.5,J.y+J.h)),r.moveTo(Math.round(A)+.5,J.y),r.lineTo(Math.round(A)+.5,J.y+J.h),r.stroke();let W=V?We(oe):null;r.font=m;let ue=W?o.formatClock(Number.isFinite(W.start)?W.start:W.time,g<1e3,S.timeZone):``,_e=W?r.measureText(ue).width/2+8:0;r.fillStyle=e.toCss(u.textMuted),r.textAlign=`center`,r.textBaseline=`top`;for(let e of le.values){let t=z(e),n=le.format(e),i=r.measureText(n).width/2;t-i<J.x+2||t+i>O-2||W&&Math.abs(t-W.hx)<_e+i||r.fillText(n,t,J.y+J.h+6)}let Y=re,X=[{price:C.bestAsk(),color:E.down,filled:!0},{price:C.bestBid(),color:E.up,filled:!0}];Y&&Y.price!==C.bestBid()&&Y.price!==C.bestAsk()&&X.push({price:Y.price,color:Y.side===`buy`?E.up:E.down,filled:!1});let Q=V?X.filter(e=>Number.isFinite(e.price)&&e.price>=L&&e.price<=R):[],ve=W?Math.round(B(W.rowPrice))+.5:NaN,ye=l.layoutAxisLabels(Q.map(e=>({y:B(e.price),h:ee})),W?{y:ve,h:ee}:null,ce.map(B),p+2,[J.y,J.y+J.h]);r.fillStyle=e.toCss(u.textMuted),r.textAlign=`left`,r.textBaseline=`middle`,ce.forEach((e,t)=>{ye.ticks[t]&&r.fillText(T.price(e),A+6,B(e))}),r.font=h,Q.forEach((t,n)=>{let i=ye.pinned[n];if(i==null)return;let o=B(t.price);Math.abs(i-o)>1&&(r.strokeStyle=e.toCss(t.color),r.lineWidth=1,r.beginPath(),r.moveTo(A-4,o),r.lineTo(A+1,i),r.stroke()),Ge(r,T.price(t.price),A+1,i,a-A-2,t.color,t.filled)}),qe(r,z,B,A,f,W,ve,ue),r.font=m,Z.describe(`${S.ariaLabel??f.name}. ${f.bid} ${T.price(C.bestBid())}, ${f.ask} ${T.price(C.bestAsk())}.`);let xe=_||Te()-ie<2e3;return de&&xe&&Number.isFinite(P)||pe&&q!==null&&Math.abs(K[0]-q[0])>1e-9}function qe(t,n,r,i,a,c,l,u){let{theme:d}=Z;if(!c){Z.tooltip.style.display=`none`,Y&&(Y=``,w.emit(`hover`,null));return}let{hx:f,hy:p,time:m,start:h,column:g,bucket:_,ry:v,low:y,high:b,rowPrice:x}=c,te=e=>Math.floor(e/v)===_,ne=$(),D=0,O=NaN,k=NaN,A=0,M=0;if(g){for(let e=0;e<g.bins.length;e++)te(g.bins[e])&&(D+=g.sizes[e]);({bestBid:O,bestAsk:k,buyVolume:A,sellVolume:M}=g)}else if(Number.isFinite(h)){let e=Fe();if(e)for(let t=0;t<e.bins.length;t++)te(e.bins[t])&&(D+=e.sizes[t]);O=C.bestBid(),k=C.bestAsk(),A=F.buyVolume,M=F.sellVolume}let N=b<=O?`bid`:y>=k?`ask`:null;if(t.strokeStyle=e.toCss(d.text,.5),t.lineWidth=1,t.setLineDash([3,3]),t.beginPath(),t.moveTo(Math.round(f)+.5,J.y),t.lineTo(Math.round(f)+.5,J.y+J.h),t.moveTo(J.x,l),t.lineTo(i,l),t.stroke(),t.setLineDash([]),Number.isFinite(h)){let i=n(h),a=n(h+ne),o=r((_*v+v-.5)*j),s=r((_*v-.5)*j);t.strokeStyle=e.toCss(d.text,.85),t.strokeRect(i,o,Math.max(2,a-i),Math.max(2,s-o))}t.font=o.fontOf(d,S,600,S.fontSize??(Z.width<420?10:11)),Ge(t,T.price(x),i+1,l,Z.width-i-2,d.text,!0),Ge(t,u,o.clamp(f,J.x+40,J.x+J.w-40),J.y+J.h+ee/2+2,J.w,d.text,!0,`center`);let P=N===`bid`?E.up:N===`ask`?E.down:null;s.tooltipHtml(ve,Z.tooltip,{text:o.formatClock(Number.isFinite(h)?h:m,!0,S.timeZone),color:void 0,badge:N&&P?{text:N===`bid`?a.bidSide:a.askSide,color:e.toCss(P)}:void 0},[[a.price,v>1?`${T.price(y)} – ${T.price(b)}`:T.price(x)],[a.liquidity,T.size(D)],[a.buys,T.size(A)],[a.sells,T.size(M)]]),Z.tooltip.style.display=`block`,Z.placeTooltip(Z.tooltip,f,p,f>J.w*.6?`left`:`right`);let re=`${h}|${_}|${v}|${D}|${A}|${M}`;if(re!==Y){Y=re;let e={time:Number.isFinite(h)?h:m,price:y,priceHigh:b,size:D,side:N,buyVolume:A,sellVolume:M};w.emit(`hover`,e)}}let Je=async(e=new Set)=>{let t=++ce,n=await c.createHeatFieldRenderer(S.renderer??`auto`,()=>{let e=ve.createElement(`canvas`);return Object.assign(e.style,{position:`absolute`,left:`0`,top:`0`,pointerEvents:`none`}),e.setAttribute(`aria-hidden`,`true`),e},t=>{le||U?.kind!==t||(U.destroy(),U.canvas.remove(),U=null,Je(new Set([...e,t])))},e);if(le||t!==ce){n?.destroy();return}U&&(U.destroy(),U.canvas.remove()),U=n,n?(Q.dataset.renderer=n.kind,Q.insertBefore(n.canvas,Z.canvas),w.emit(`renderer`,n.kind)):delete Q.dataset.renderer,W(n?.kind??null),Z.invalidate()},Ye=r.followDefaultRenderer(()=>S.renderer,()=>void Je()),Xe=e=>{de!==e&&(de=e,w.emit(`follow`,e))},Ze=e=>{let t=M.length?M[0].time:P;if(!Number.isFinite(t))return e;let n=e[1]-e[0],r=(Number.isFinite(he)?he:we())+$()+n/2,i=Math.max(t-n/2,Math.min(e[0],r-n));return[i,i+n]},Qe=e=>{if(S.interactive===!1)return;let[t,n]=s.localPoint(Q,e);Q.setPointerCapture?.(e.pointerId),X={x:t,y:n,viewX:[...G],viewY:[...K],axis:t>J.x+J.w,span:K[1]-K[0]}},$e=e=>{let[t,n]=s.localPoint(Q,e);if(_e=[t,n],X){let e=t-X.x,r=n-X.y;if(X.axis){let e=X.span*Math.exp(r*.006),t=(X.viewY[0]+X.viewY[1])/2;me=e,K=[t-e/2,t+e/2],q=[K[0],K[1]]}else if(Math.abs(e)+Math.abs(r)>3){Xe(!1);let t=(X.viewX[1]-X.viewX[0])/J.w*e,n=(X.viewY[1]-X.viewY[0])/J.h*r;G=Ze([X.viewX[0]-t,X.viewX[1]-t]),K=[X.viewY[0]+n,X.viewY[1]+n]}}Z.invalidate()},et=e=>{Q.releasePointerCapture?.(e.pointerId),X=null,Z.invalidate()},tt=()=>{X||(_e=null,Z.invalidate())},nt=(e,t)=>{let[n,r]=G,i=o.clamp((de?fe:r-n)*e,$()*10,Se());if(fe=i,!de){let e=n+(t-J.x)/J.w*(r-n),a=(e-n)/(r-n);G=Ze([e-i*a,e+i*(1-a)])}Z.invalidate()},rt=e=>{let t=o.clamp((K[1]-K[0])*e,j*6||1e-9,1/0),n=(K[0]+K[1])/2;me=t,K=[n-t/2,n+t/2],q=[K[0],K[1]],Z.invalidate()},it=e=>{if(S.interactive===!1||!(e.ctrlKey||e.metaKey))return;e.preventDefault();let[t]=s.localPoint(Q,e),n=Math.exp(e.deltaY*.002);e.shiftKey||t>J.x+J.w?rt(n):nt(n,t)},at=()=>{S.interactive!==!1&&ct.resetView()},ot=e=>{if(S.interactive!==!1){switch(e.key){case`+`:case`=`:nt(.8,J.x+J.w);break;case`-`:nt(1.25,J.x+J.w);break;case`ArrowUp`:case`ArrowDown`:{if(e.shiftKey){rt(e.key===`ArrowUp`?.8:1.25);break}Xe(!1);let t=(K[1]-K[0])*.1*(e.key===`ArrowUp`?1:-1);K=[K[0]+t,K[1]+t],Z.invalidate();break}case`ArrowLeft`:case`ArrowRight`:{Xe(!1);let t=(G[1]-G[0])*.1*(e.key===`ArrowLeft`?-1:1);G=Ze([G[0]+t,G[1]+t]),Z.invalidate();break}case`0`:case`Home`:ct.resetView();break;default:return}e.preventDefault()}};Q.addEventListener(`pointerdown`,Qe),Q.addEventListener(`pointermove`,$e),Q.addEventListener(`pointerup`,et),Q.addEventListener(`pointercancel`,et),Q.addEventListener(`pointerleave`,tt),Q.addEventListener(`wheel`,it,{passive:!1}),Q.addEventListener(`dblclick`,at),Q.addEventListener(`keydown`,ot);let st=e=>{let t=Ne(e.time);C.count(`bid`)+C.count(`ask`)>0&&(ke(),Me(t)),C.applyDelta(e)},ct={setBook(e){let t=Ne(e.time);C.count(`bid`)+C.count(`ask`)>0&&Me(t),C.setSnapshot(e),ke(),De(),Number.isFinite(P)||Me(t),Z.invalidate()},applyDeltas(e){if(Array.isArray(e))for(let t of e)st(t);else st(e);!Number.isFinite(P)&&j>0&&Me(we()),Z.invalidate()},addTrades(e){let t=Array.isArray(e)?e:[e];for(let e of t){if(!(e.size>0)||!Number.isFinite(e.price))continue;Number.isFinite(I)&&(Ne(e.time),Me(e.time));let t=!Number.isFinite(P)||e.time>=P?F:Pe(e.time);t&&(e.side===`buy`?(t.buyVolume+=e.size,t.buyNotional+=e.size*e.price):(t.sellVolume+=e.size,t.sellNotional+=e.size*e.price)),(!re||e.time>=re.time)&&(re=e)}Z.invalidate()},clear(){C.clear(),Oe(),re=null,I=NaN,j=0,me=NaN,q=null,pe=!1,Z.invalidate()},setOptions(e){let t=S;S=e,xe(),(e.tickSize!==t.tickSize||(e.interval??100)!==(t.interval??100))&&(Oe(),j=0,me=NaN,ke()),e.window!==t.window&&(fe=NaN),e.priceSpan!==t.priceSpan&&(me=NaN),(e.renderer??`auto`)!==(t.renderer??`auto`)&&Je(),Ee(),De(),Z.invalidate()},resetView(){fe=NaN,me=NaN,q=null,Xe(!0),Z.invalidate()},getRenderer:()=>U?.kind??null,ready:ue,getStore:()=>C,on:(e,t)=>w.on(e,t),resize(){Z.invalidate()},destroy(){le=!0,Ye(),Q.removeEventListener(`pointerdown`,Qe),Q.removeEventListener(`pointermove`,$e),Q.removeEventListener(`pointerup`,et),Q.removeEventListener(`pointercancel`,et),Q.removeEventListener(`pointerleave`,tt),Q.removeEventListener(`wheel`,it),Q.removeEventListener(`dblclick`,at),Q.removeEventListener(`keydown`,ot),U?.destroy(),U=null,w.clear(),Z.destroy(),W(null)}};return xe(),Ee(),Je(),ct};exports.createOrderBookHeatmap=ne,exports.heatIntensity=te,exports.positionedRamp=y,exports.rowBucket=b;
1
+ const e=require("../color.cjs"),t=require("../locale.cjs"),n=require("../scale.cjs"),r=require("../renderers/follow.cjs"),i=require("../time.cjs"),a=require("./book.cjs"),o=require("./format.cjs"),s=require("./host.cjs"),c=require("./field.cjs"),l=require("./layout.cjs");var u=256,d=4096,f=.99,p=2,m=[[0,`#0b1322`],[.3,`#0d1a2e`],[.5,`#102a4e`],[.65,`#154a8a`],[.76,`#1b86b8`],[.85,`#3fc3c0`],[.91,`#e8d84a`],[.96,`#ff8c2b`],[1,`#ffe6c2`]],h=[[0,`#fbfcfe`],[.3,`#f3f6fc`],[.5,`#dde7f7`],[.65,`#a8c4ec`],[.76,`#5b8bd6`],[.85,`#2f4fb0`],[.93,`#6a2a9c`],[1,`#c4173f`]],g=16,_=6,v=14,y=3,b=(t,n=u)=>{let r=new Uint32Array(n);if(!t.length)return r;let i=t.map(([,t])=>e.toOklab(t)),a=0;for(let o=0;o<n;o++){let s=o/Math.max(1,n-1);for(;a+1<t.length-1&&s>t[a+1][0];)a++;let[c]=t[a],l=Math.min(t.length-1,a+1),[u]=t[l],d=u>c?Math.min(1,Math.max(0,(s-c)/(u-c))):0,f=i[a],p=i[l];r[o]=e.packColor(e.fromOklab([f[0]+(p[0]-f[0])*d,f[1]+(p[1]-f[1])*d,f[2]+(p[2]-f[2])*d,1]))}return r},x=e=>{if(!(e>0)||e>=p)return 1;let t=p/e;for(let e=1;e<0xe8d4a51000;e*=10)for(let n of[1,2,5])if(n*e>=t)return n*e;return 1},S={en:{time:`Time`,price:`Price`,liquidity:`Liquidity`,buys:`Buys`,sells:`Sells`,bid:`Bid`,ask:`Ask`,bidSide:`Bid side`,askSide:`Ask side`,bubbleHint:`Bubble area = trade size`,name:`Liquidity heatmap`},zh:{time:`时间`,price:`价格`,liquidity:`挂单量`,buys:`主动买入`,sells:`主动卖出`,bid:`买一`,ask:`卖一`,bidSide:`买盘`,askSide:`卖盘`,bubbleHint:`气泡面积 = 成交量`,name:`订单簿热力图`},ja:{time:`時刻`,price:`価格`,liquidity:`指値量`,buys:`買い約定`,sells:`売り約定`,bid:`最良買気配`,ask:`最良売気配`,bidSide:`買い板`,askSide:`売り板`,bubbleHint:`バブル面積 = 出来高`,name:`板ヒートマップ`},fr:{time:`Heure`,price:`Prix`,liquidity:`Liquidité`,buys:`Achats`,sells:`Ventes`,bid:`Meilleur achat`,ask:`Meilleure vente`,bidSide:`Côté achat`,askSide:`Côté vente`,bubbleHint:`Aire de la bulle = volume`,name:`Carte de chaleur de la liquidité`}},C=(e,t,n,r)=>{if(!(e>0)||!(t>0))return 0;let i=Math.min(1,e*r/t);switch(n){case`linear`:return i;case`log`:return Math.log10(1+9*i)**1.2;default:return Math.sqrt(i)}},ee=48,w=(e,t)=>{if(!(t>=e.min)||!(e.max>e.min))return 0;let n=Math.log(t/e.min)/Math.log(e.max/e.min),r=Math.min(47.999999,Math.max(0,n*ee)),i=Math.floor(r),a=r-i,o=e.cdf[i]??0;return o+((e.cdf[i+1]??o)-o)*a},T=(e,t=0)=>{let n=1/0,r=0,i=0;for(let t=0;t<e.length;t++){let a=e[t];a>0&&(i++,a<n&&(n=a),a>r&&(r=a))}if(!i||!(r>n))return null;let a=new Float32Array(49),o=Math.log(r/n);for(let t=0;t<e.length;t++){let r=e[t];if(!(r>0))continue;let i=Math.log(r/n)/o;a[Math.min(ee,Math.floor(i*ee))]+=1}let s=0;for(let e=0;e<=ee;e++)s+=a[e],a[e]=s/i;return{version:t,min:n,max:r,cdf:a}},te=(e,t,n)=>r=>{let i=Math.min(1,Math.max(0,n(r)));if(!e||!(t>0))return i;let a=w(e,r*t);return Math.min(1,.55*i+.45*a)},E=(p,ee={})=>{let w=ee,E=a.createOrderBookStore(),D=s.createEmitter(),O=o.createFormatters(w,2,4),k={up:[0,0,0,1],down:[0,0,0,1]},A=new Uint32Array(u),j=new Uint32Array(c.HEAT_TABLE_SIZE+1),M=e=>Math.sqrt(e),N=null,P=[0,0,0,1],F=!1,I=0,L=[],ne=0,R=NaN,z={buyVolume:0,buyNotional:0,sellVolume:0,sellNotional:0},re=null,ie=NaN,ae=0,B=0,V=0,oe=-1/0,se=0,H=0,U=null,ce=``,W=``,G=null,K=null,le=0,ue=!1,de=()=>{},fe=new Promise(e=>{de=e}),pe=!0,me=NaN,q=[0,1],J=[0,1],he=!1,ge=null,_e=NaN,ve=NaN,ye=0,Y={x:0,y:0,w:0,h:0},be=null,xe=``,X=null,Z=s.createHost(p,{className:`minerva-orderbook-heatmap`,draw:$e,onTheme:()=>{Ae(),Z.invalidate()}}),{root:Q,doc:Se}=Z;Q.tabIndex=0,Q.setAttribute(`role`,`figure`),Q.style.touchAction=`none`;let Ce=t.localeLabels(S,w.locale,w.labels),we=()=>Ce,Te=()=>{Ce=t.localeLabels(S,w.locale,w.labels),Q.setAttribute(`aria-label`,w.ariaLabel??Ce.name)},$=()=>Math.max(10,w.interval??100),Ee=()=>Math.max($()*4,w.history??3e5),De=()=>Math.max(4,Math.round(w.depth??160)),Oe=()=>{if(!Number.isFinite(ie))return Date.now();let e=ke()-ae;return ie+Math.min(Math.max(0,e),$()*3)},ke=()=>typeof performance<`u`?performance.now():Date.now();function Ae(){let t=Z.theme;k=o.sideColors(t,w);let n=e=>{let n=t.resolve?t.resolve(e,t.primary):t.primary;return[n[0],n[1],n[2],1]},r=[t.background[0],t.background[1],t.background[2],1];if(F=t.background[3]>0&&e.luminance(r)<.4,w.colors?.length){let t=w.colors.map(n);P=t[0]??r,A=e.oklabRamp(t.length>1?t:[P,P],u)}else{let t=(F?m:h).map(([t,n])=>[t,e.parseColor(n)??r]);P=t[0][1],A=b(t,u)}let i=w.colorScale??`sqrt`;M=e=>C(e,1,i,1),j=c.heatTable(A,M),W=``}let je=()=>{O=o.createFormatters(w,I>0?Math.max(a.decimalsOf(I),a.inferPriceDecimals(E)):a.inferPriceDecimals(E),a.inferSizeDecimals(E))},Me=e=>{let t=w.sizeUnit?.trim();return t?`${e} ${t}`:e},Ne=()=>{L=[],U=null,ce=W=``,G=null,N=null,R=NaN,B=V=0,oe=-1/0,se=0,H=0,ve=NaN,z.buyVolume=z.buyNotional=z.sellVolume=z.sellNotional=0},Pe=()=>{if(I>0)return;let e=a.inferTickSize(E),t=E.mid();if(w.tickSize&&w.tickSize>0)I=w.tickSize;else if(e>0&&Number.isFinite(t)){let n=t*1e-5/e,r=1;for(let e=1;e<=1e9&&r<n*.75;e*=10)for(let t of[1,2,5])if(r=t*e,r>=n*.75)break;I=a.roundToStep(e*r,e)}else I=Number.isFinite(t)?Math.max(1e-8,t*1e-5):0;I>0&&je()},Fe=()=>{let e=De(),t=new Float64Array(e*2),n=new Float32Array(e*2),r=0;for(let i of[`bid`,`ask`]){let a=E.count(i),o=0;for(let s=0;s<a;s++){let a=Math.round(E.priceAt(i,s)/I),c=E.sizeAt(i,s);if(r>0&&t[r-1]===a&&o>0){n[r-1]+=c;continue}if(o>=e)break;t[r]=a,n[r]=c,r++,o++}}return{bins:t.slice(0,r),sizes:n.slice(0,r)}},Ie=e=>{if(!(I>0))return;let{bins:t,sizes:n}=Fe(),r={seq:ne++,time:e,bins:t,sizes:n,bestBid:E.bestBid(),bestAsk:E.bestAsk(),buyVolume:z.buyVolume,buyNotional:z.buyNotional,sellVolume:z.sellVolume,sellNotional:z.sellNotional};z.buyVolume=z.buyNotional=z.sellVolume=z.sellNotional=0,L.push(r);let i=e-Ee(),a=0;for(;a<L.length&&L[a].time<i;)a++;a&&(L=L.slice(a))},Le=e=>{if(!Number.isFinite(e))return;let t=$();if(!Number.isFinite(R)){R=Math.floor(e/t)*t;return}if(e-R>Ee()){Ie(R),R=Math.floor(e/t)*t;return}for(;e>=R+t;)Ie(R),R+=t},Re=e=>e===void 0||!Number.isFinite(e)?Date.now():((!Number.isFinite(ie)||e>=ie)&&(ie=e,ae=ke()),e),ze=e=>{if(Number.isFinite(R)&&e>=R)return null;let t=0,n=L.length;for(;t<n;){let r=t+n>>>1;L[r].time<=e?t=r+1:n=r}return t>0?L[t-1]:null},Be=()=>{if(!Number.isFinite(R)||!(I>0))return null;let e=E.version();return(!G||G.version!==e)&&(G={version:e,...Fe()}),{time:R,bins:G.bins,sizes:G.sizes}},Ve=(e,t,n,r,i,a)=>{let s=$(),l=Be(),u=Math.min(d,Math.ceil(Y.w)),p=Math.min(d,Math.ceil(Y.h)),m=x(I/(r-n)*Y.h),h=L.length?L[L.length-1].seq:-1,g=[e,t,n,r,Math.floor(i/s),L.length,h,G?.version??-1,u,p,m,I].join(`|`);if(g!==ce){let a=l?[...L,l]:L;U=c.buildHeatGrid({sources:a,step:s,tick:I,x0:e,x1:t,y0:n,y1:r,end:i,maxWidth:u,maxHeight:p,rowBins:m},U),ce=g,W=``}if(!U)return null;let _=w.maxSize;if(_!==void 0&&_>0)B=_;else{let e=ke();if(e-oe>250||!(V>0)){let t=c.percentile(U.cells,f);t>0&&(V=t),oe=e,N=T(U.cells,U.version)}B>0?V>0&&Math.abs(V/B-1)>.001&&(B+=(V-B)*o.ease(a,700)):B=V}let v=Math.max(.01,w.contrast??1),y=B>0?c.HEAT_TABLE_SIZE*v/B:0,b=`${U.version}|${y}|${N?.version??-1}`;return b!==W&&(j=c.heatTable(A,te(N,B/v,M)),c.paintHeatGrid(U,j,y),W=b),U},He=()=>{let e=$(),t=[],n=0,r=L.length;for(;n<r;){let t=n+r>>>1;L[t].time+e<q[0]?n=t+1:r=t}for(let e=n;e<L.length;e++){let n=L[e];if(n.time>q[1])break;t.push(n)}return t},Ue=(e,t)=>{let n=$(),r=Math.max(1,Math.ceil(_/Math.max(1e-6,t))),i=[],a=NaN,o=0,s=0,c={bv:0,bn:0,sv:0,sn:0},l=()=>{let e=(o+s)/2;c.sv>0&&i.push({time:e,price:c.sn/c.sv,volume:c.sv,buy:!1}),c.bv>0&&i.push({time:e,price:c.bn/c.bv,volume:c.bv,buy:!0}),c.bv=c.bn=c.sv=c.sn=0},u=(e,t,i)=>{let u=Math.floor(e/r);u!==a&&(Number.isFinite(a)&&l(),a=u,o=t),s=t+n,c.bv+=i.buyVolume,c.bn+=i.buyNotional,c.sv+=i.sellVolume,c.sn+=i.sellNotional};for(let t of e)u(t.seq,t.time,t);return Number.isFinite(R)&&R<=q[1]&&u(ne,R,z),Number.isFinite(a)&&l(),i},We=e=>{e.save(),e.beginPath(),e.rect(Y.x,Y.y,Y.w,Y.h),e.clip()},Ge=(t,n,r,i,a)=>{if(w.bestLines===!1)return;let o=$(),s=n.map(e=>[e.time,e.time+o,e.bestBid,e.bestAsk]);if(Number.isFinite(R)&&s.push([R,R+o,E.bestBid(),E.bestAsk()]),!s.length)return;for(let e=0;e+1<s.length;e++)s[e][1]=s[e+1][0];let c=a>=2,l=e=>{let t=r(e[0]),n=r(e[1]);return c?[t,n]:[(t+n)/2,(t+n)/2]};We(t),t.beginPath();let u=[],d=()=>{if(u.length){u.forEach((e,n)=>{let[r,a]=l(e),o=i(e[3]);n?t.lineTo(r,o):t.moveTo(r,o),t.lineTo(a,o)});for(let e=u.length-1;e>=0;e--){let[n,r]=l(u[e]),a=i(u[e][2]);t.lineTo(r,a),t.lineTo(n,a)}t.closePath(),u=[]}};for(let e of s){let[,,t,n]=e;Number.isFinite(t)&&Number.isFinite(n)&&n>t?u.push(e):d()}d(),t.fillStyle=e.toCss(Z.theme.text,F?.08:.07),t.fill(),t.lineJoin=`round`;for(let[n,r]of[[2,k.up],[3,k.down]]){t.beginPath();let a=!1;for(let e of s){let r=e[n];if(!Number.isFinite(r)){a=!1;continue}let o=i(r),[s,u]=l(e);a?t.lineTo(s,o):t.moveTo(s,o),c&&t.lineTo(u,o),a=!0}t.strokeStyle=e.toCss(P,.55),t.lineWidth=3.5,t.stroke(),t.strokeStyle=e.toCss(r),t.lineWidth=1.5,t.stroke()}t.restore()},Ke=(t,n,r,i,a)=>{if(!n.length)return;let s=0;for(let e of n){let t=r(e.time);t>=Y.x&&t<=Y.x+Y.w&&(s=Math.max(s,e.volume))}s>0&&(se=se>0?Math.max(s,se*.995):s);let c=w.bubbleVolume??se;if(!(c>0))return;let l=Math.max(y,w.bubbleSize??v),u=Math.min(y,l),d=n.map(e=>({...e,d:o.clamp(Math.sqrt(e.volume/c)*l,u,l)})).sort((e,t)=>e.d-t.d);We(t),t.lineWidth=1,t.textAlign=`center`,t.textBaseline=`middle`,t.font=o.fontOf(Z.theme,w,600,Math.max(8,a-1));let f=F?[1,1,1,1]:[0,0,0,1];for(let n of d){let a=r(n.time),o=i(n.price),s=n.d/2;if(a<Y.x-s||a>Y.x+Y.w+s||o<Y.y-s||o>Y.y+Y.h+s)continue;let c=n.buy?k.up:k.down;if(t.beginPath(),t.arc(a,o,Math.max(1,s-.5),0,Math.PI*2),t.fillStyle=e.toCss(c,.35),t.fill(),t.strokeStyle=e.toCss(e.mixOklab(c,f,.2),.9),t.stroke(),n.d>=26){let r=O.compact(n.volume);t.measureText(r).width<=n.d-6&&(t.fillStyle=e.toCss(F?[1,1,1,1]:[.08,.08,.1,1]),t.fillText(r,a,o+.5))}}t.restore()},qe=(e,t)=>{let n=[],r=[],i=E.count(e),a=0,o=NaN;for(let s=0;s<i;s++){let i=Math.round(E.priceAt(e,s)/I);if(i!==o){if(++a>De())break;o=i}let c=Math.floor(i/t),l=E.sizeAt(e,s);n.length&&n[n.length-1]===c?r[r.length-1]+=l:(n.push(c),r.push(l))}return{side:e,buckets:n,sizes:r}},Je=(t,n,r,i,a,s)=>{let c=Z.theme,[u,d]=J,f=Math.max(1,I*s/(d-u)*Y.h),p=e=>(e*s-.5)*I,m=e=>(e*s+s-.5)*I,h=0,g=[`bid`,`ask`].map(e=>{let t=qe(e,s);return t.buckets.forEach((e,n)=>{m(e)>=u&&p(e)<=d&&(h=Math.max(h,t.sizes[n]))}),t});if((h>H||h<H*.6||!(H>0))&&(H=l.fineCeil(h)),!(H>0))return;let _=n+2,v=Math.max(4,r-6);t.strokeStyle=e.toCss(c.text,.07),t.lineWidth=1,t.setLineDash([2,3]),t.beginPath();for(let e of[.5,1]){let n=Math.round(_+v*e)-.5;t.moveTo(n,Y.y),t.lineTo(n,Y.y+Y.h)}t.stroke(),t.setLineDash([]),t.save(),t.beginPath(),t.rect(n,Y.y,r,Y.h),t.clip();let y=+(f>=4),b=(e,n)=>{let r=Math.round(i(m(e))),a=Math.max(r+1,Math.round(i(p(e)))-y),o=Math.max(1,Math.min(v,n/H*v));t.rect(_,r,o,a-r)};for(let{side:n,buckets:r,sizes:i}of g){let a=n===`bid`?k.up:k.down;t.beginPath();for(let e=1;e<r.length;e++){let t=r[e];m(t)>=u&&p(t)<=d&&b(t,i[e])}t.fillStyle=e.toCss(a,F?.62:.55),t.fill();let o=r[0];o!==void 0&&m(o)>=u&&p(o)<=d&&(t.beginPath(),b(o,i[0]),t.fillStyle=e.toCss(a),t.fill())}t.restore();let x=Math.round(Y.y+Y.h+4)+.5;t.strokeStyle=e.toCss(c.textMuted,.7),t.beginPath(),t.moveTo(_,x),t.lineTo(_+v,x);for(let e of[0,.5,1]){let n=Math.round(_+v*e)+.5;t.moveTo(n,x),t.lineTo(n,x+3)}t.stroke(),t.font=o.fontOf(c,w,400,Math.max(8,a-1)),t.fillStyle=e.toCss(c.textMuted),t.textBaseline=`top`;let S=O.compact(H),C=t.measureText(S).width;t.textAlign=`right`,t.fillText(S,_+v+2,x+4),C+t.measureText(`0`).width+8<v&&(t.textAlign=`left`,t.fillText(`0`,_-1,x+4))},Ye=e=>{if(!be||w.tooltip===!1||!(I>0)||X||!he)return null;let[t,n]=be;if(t<Y.x||t>Y.x+Y.w||n<Y.y||n>Y.y+Y.h)return null;let[r,i]=q,[o,s]=J,c=r+(t-Y.x)/Y.w*(i-r),l=o+(Y.y+Y.h-n)/Y.h*(s-o),u=Math.floor(Math.round(l/I)/e),d=Math.min(12,a.decimalsOf(I)+2),f=+(u*e*I).toFixed(d),p=+((u*e+e-1)*I).toFixed(d),m=+((f+p)/2).toFixed(d),h=ze(c);return{hx:t,hy:n,time:c,start:h?h.time:Number.isFinite(R)&&c>=R?R:NaN,column:h,bucket:u,ry:e,low:f,high:p,rowPrice:m}},Xe=(t,n,r,i,a,s,c,l=`left`)=>{let u=Math.min(t.measureText(n).width+10,a),d=l===`center`?r-u/2:r;t.fillStyle=c?e.toCss(s):e.toCss(P),o.roundRect(t,d,i-g/2,u,g,3),t.fill(),c||(t.strokeStyle=e.toCss(s),t.lineWidth=1,t.stroke()),t.fillStyle=c?e.luminance(s)>.6?`#111`:`#fff`:e.toCss(s),t.textAlign=l,t.textBaseline=`middle`,t.fillText(n,l===`center`?r:d+5,i+.5)},Ze=e=>`rgb(${e&255}, ${e>>>8&255}, ${e>>>16&255})`,Qe=(t,n)=>{if(Y.w<200||Y.h<96)return;let r=Z.theme,i=we(),a=w.sizeUnit?.trim(),s=a?`${i.liquidity} · ${a}`:i.liquidity,c=o.fontOf(r,w,600,n-1),l=o.fontOf(r,w,400,n-1),u=n-2,d=B>0?O.size(B):`–`;t.font=c;let f=t.measureText(s).width;t.font=o.fontOf(r,w,400,u);let p=t.measureText(`0`).width,m=t.measureText(d).width;t.font=l;let h=t.measureText(i.bubbleHint).width,g=u+10,_=Math.max(76,f,h+g)+14,v=n-1,y=14+v+3+7+2+u+6+v,b=Y.x+8,x=Y.y+8;if(b+_>Y.x+Y.w-8)return;t.fillStyle=e.toCss(r.background,F?.82:.88),t.strokeStyle=e.toCss(r.axis,.6),t.lineWidth=1,o.roundRect(t,b+.5,x+.5,_,y,6),t.fill(),t.stroke();let S=b+7;t.textAlign=`left`,t.textBaseline=`middle`,t.font=c,t.fillStyle=e.toCss(r.textMuted),t.fillText(s,S,x+7+v/2);let C=x+7+v+3,ee=t.createLinearGradient(S,C,S+76,C);for(let e=0;e<=8;e++){let t=e/8,n=A[Math.round(t*(A.length-1))]??0;ee.addColorStop(t,Ze(n))}t.fillStyle=ee,o.roundRect(t,S,C,76,7,2),t.fill(),t.font=o.fontOf(r,w,400,u),t.fillStyle=e.toCss(r.textMuted);let T=C+7+2+u/2;t.fillText(`0`,S,T),t.textAlign=`right`,t.fillText(d,S+Math.max(76,m+p),T),t.textAlign=`left`;let te=T+u/2+6+v/2,E=u/2;for(let[n,r]of[k.up,k.down].entries())t.fillStyle=e.toCss(r,.9),t.beginPath(),t.arc(S+E+n*(u+4),te,E,0,Math.PI*2),t.fill();t.font=l,t.fillStyle=e.toCss(r.textMuted),t.fillText(i.bubbleHint,S+g,te)};function $e(t){let r=Z.ctx;if(!r)return!1;let{width:a,height:s,dpr:c,theme:u}=Z,d=ye?t-ye:0;ye=t;let f=we(),p=w.fontSize??(a<420?10:11),m=o.fontOf(u,w,400,p),h=o.fontOf(u,w,600,p),_=$(),v=!Number.isFinite(ie);v&&E.count(`bid`)+E.count(`ask`)>0&&Le(Date.now());let y=Oe();ve=Number.isFinite(ve)&&y>ve-_*4?Math.max(ve,y):y;let b=ve;r.setTransform(c,0,0,c,0,0),r.clearRect(0,0,a,s),Pe();let S=E.mid();r.font=h;let C=O.price(Number.isFinite(S)?S*1.0001:0),ee=Math.ceil(r.measureText(C).width)+18;r.font=m;let T=w.profile===!1?0:Math.round(o.clamp(a*.12,56,120)),te=p+12;Y={x:0,y:0,w:Math.max(10,a-ee-T),h:Math.max(10,s-te)};let D=Y.x+Y.w,A=D+T;if(Number.isFinite(me)||(me=Math.max(_*10,w.window??6e4)),pe){let e=L.length?L[0].time:R;q=l.fitTimeRange(e,b,me,Math.min(me,_*60));let t=E.bestBid(),n=E.bestAsk();for(let e of He())Number.isFinite(e.bestBid)&&!(e.bestBid>=t)&&(t=e.bestBid),Number.isFinite(e.bestAsk)&&!(e.bestAsk<=n)&&(n=e.bestAsk);Number.isFinite(t)||(t=n),Number.isFinite(n)||(n=t);let r=I>0?I*Math.max(40,Y.h/6):0,i=w.priceSpan??(Number.isFinite(_e)?_e:void 0);if(r>0||i!==void 0){ge=l.fitPriceRange(ge,t,n,r,i);let[e,a]=ge;if(Number.isFinite(e)&&Number.isFinite(a)){if(!he)J=[e,a],he=!0;else{let t=o.ease(d,280);J=[J[0]+(e-J[0])*t,J[1]+(a-J[1])*t]}}}}let[j,M]=q,[N,F]=J,ne=e=>Y.x+(e-j)/(M-j)*Y.w,z=e=>Y.y+Y.h-(e-N)/(F-N)*Y.h,B=he&&I>0,V=He(),oe=_/(M-j)*Y.w,se=B?x(I/(F-N)*Y.h):1,H=e.toCss(P);if(K){let e=K.canvas;e.style.left=`${Y.x}px`,e.style.top=`${Y.y}px`,e.style.width=`${Y.w}px`,e.style.height=`${Y.h}px`;let t=Math.max(1,Math.round(Y.w*c)),n=Math.max(1,Math.round(Y.h*c));(e.width!==t||e.height!==n)&&K.resize(t,n);let r=B&&Number.isFinite(R)?Ve(j,M,N,F,b,d):null;r&&(se=r.rowBins);let i=t/Y.w,a=n/Y.h,o=r?[(ne(r.t0)-Y.x)*i,(z(r.p1)-Y.y)*a,(ne(r.t1)-Y.x)*i,(z(r.p0)-Y.y)*a]:[0,0,0,0];K.render(r,o,P)}else r.fillStyle=H,r.fillRect(Y.x,Y.y,Y.w,Y.h);let U=B?n.linearTicks(N,F,Math.max(2,Math.floor(Y.h/44))):[],ce=i.timeTicks(j,M,Math.max(2,Math.floor(Y.w/75)),void 0,w.timeZone??`local`);r.strokeStyle=e.toCss(u.axis),r.lineWidth=1,r.beginPath();for(let e of U){let t=Math.round(z(e))+.5;r.moveTo(A,t),r.lineTo(A+4,t)}for(let e of ce.values){let t=Math.round(ne(e))+.5;t<=Y.x+1||t>=D-1||(r.moveTo(t,Y.y+Y.h),r.lineTo(t,Y.y+Y.h+4))}r.stroke(),B&&(w.bubbles!==!1&&Ke(r,Ue(V,oe),ne,z,p),Ge(r,V,ne,z,oe),T&&Je(r,D,T,z,p,se)),r.strokeStyle=e.toCss(u.axis),r.lineWidth=1,r.beginPath(),r.moveTo(0,Math.round(Y.y+Y.h)+.5),r.lineTo(a,Math.round(Y.y+Y.h)+.5),T&&(r.moveTo(Math.round(D)+.5,Y.y),r.lineTo(Math.round(D)+.5,Y.y+Y.h)),r.moveTo(Math.round(A)+.5,Y.y),r.lineTo(Math.round(A)+.5,Y.y+Y.h),r.stroke(),w.legend!==!1&&Qe(r,p);let W=B?Ye(se):null;r.font=m;let G=W?o.formatClock(Number.isFinite(W.start)?W.start:W.time,_<1e3,w.timeZone):``,le=W?r.measureText(G).width/2+8:0;r.fillStyle=e.toCss(u.textMuted),r.textAlign=`center`,r.textBaseline=`top`;for(let e of ce.values){let t=ne(e),n=ce.format(e),i=r.measureText(n).width/2;t-i<Y.x+2||t+i>D-2||W&&Math.abs(t-W.hx)<le+i||r.fillText(n,t,Y.y+Y.h+6)}let ue=re,de=[{price:E.bestAsk(),color:k.down,filled:!0},{price:E.bestBid(),color:k.up,filled:!0}];ue&&ue.price!==E.bestBid()&&ue.price!==E.bestAsk()&&de.push({price:ue.price,color:ue.side===`buy`?k.up:k.down,filled:!1});let fe=B?de.filter(e=>Number.isFinite(e.price)&&e.price>=N&&e.price<=F):[],be=W?Math.round(z(W.rowPrice))+.5:NaN,xe=l.layoutAxisLabels(fe.map(e=>({y:z(e.price),h:g})),W?{y:be,h:g}:null,U.map(z),p+2,[Y.y,Y.y+Y.h]);r.fillStyle=e.toCss(u.textMuted),r.textAlign=`left`,r.textBaseline=`middle`,U.forEach((e,t)=>{xe.ticks[t]&&r.fillText(O.price(e),A+6,z(e))}),r.font=h,fe.forEach((t,n)=>{let i=xe.pinned[n];if(i==null)return;let o=z(t.price);Math.abs(i-o)>1&&(r.strokeStyle=e.toCss(t.color),r.lineWidth=1,r.beginPath(),r.moveTo(A-4,o),r.lineTo(A+1,i),r.stroke()),Xe(r,O.price(t.price),A+1,i,a-A-2,t.color,t.filled)}),et(r,ne,z,A,f,W,be,G),r.font=m,Z.describe(`${w.ariaLabel??f.name}. ${f.bid} ${O.price(E.bestBid())}, ${f.ask} ${O.price(E.bestAsk())}.`);let X=v||ke()-ae<2e3;return pe&&X&&Number.isFinite(R)||he&&ge!==null&&Math.abs(J[0]-ge[0])>1e-9}function et(t,n,r,i,a,c,l,u){let{theme:d}=Z;if(!c){Z.tooltip.style.display=`none`,xe&&(xe=``,D.emit(`hover`,null));return}let{hx:f,hy:p,time:m,start:h,column:_,bucket:v,ry:y,low:b,high:x,rowPrice:S}=c,C=e=>Math.floor(e/y)===v,ee=$(),T=0,te=NaN,A=NaN,j=0,M=0;if(_){for(let e=0;e<_.bins.length;e++)C(_.bins[e])&&(T+=_.sizes[e]);({bestBid:te,bestAsk:A,buyVolume:j,sellVolume:M}=_)}else if(Number.isFinite(h)){let e=Be();if(e)for(let t=0;t<e.bins.length;t++)C(e.bins[t])&&(T+=e.sizes[t]);te=E.bestBid(),A=E.bestAsk(),j=z.buyVolume,M=z.sellVolume}let N=x<=te?`bid`:b>=A?`ask`:null;if(t.strokeStyle=e.toCss(d.text,.5),t.lineWidth=1,t.setLineDash([3,3]),t.beginPath(),t.moveTo(Math.round(f)+.5,Y.y),t.lineTo(Math.round(f)+.5,Y.y+Y.h),t.moveTo(Y.x,l),t.lineTo(i,l),t.stroke(),t.setLineDash([]),Number.isFinite(h)){let i=n(h),a=n(h+ee),o=r((v*y+y-.5)*I),s=r((v*y-.5)*I);t.strokeStyle=e.toCss(d.text,.85),t.strokeRect(i,o,Math.max(2,a-i),Math.max(2,s-o))}t.font=o.fontOf(d,w,600,w.fontSize??(Z.width<420?10:11)),Xe(t,O.price(S),i+1,l,Z.width-i-2,d.text,!0),Xe(t,u,o.clamp(f,Y.x+40,Y.x+Y.w-40),Y.y+Y.h+g/2+2,Y.w,d.text,!0,`center`);let P=N===`bid`?k.up:N===`ask`?k.down:null;s.tooltipHtml(Se,Z.tooltip,{text:o.formatClock(Number.isFinite(h)?h:m,!0,w.timeZone),color:void 0,badge:N&&P?{text:N===`bid`?a.bidSide:a.askSide,color:e.toCss(P)}:void 0},[[a.price,y>1?`${O.price(b)} – ${O.price(x)}`:O.price(S)],[a.liquidity,Me(O.size(T))],[a.buys,Me(O.size(j))],[a.sells,Me(O.size(M))]]),Z.tooltip.style.display=`block`,Z.placeTooltip(Z.tooltip,f,p,f>Y.w*.6?`left`:`right`);let F=`${h}|${v}|${y}|${T}|${j}|${M}`;if(F!==xe){xe=F;let e={time:Number.isFinite(h)?h:m,price:b,priceHigh:x,size:T,side:N,buyVolume:j,sellVolume:M};D.emit(`hover`,e)}}let tt=async(e=new Set)=>{let t=++le,n=await c.createHeatFieldRenderer(w.renderer??`auto`,()=>{let e=Se.createElement(`canvas`);return Object.assign(e.style,{position:`absolute`,left:`0`,top:`0`,pointerEvents:`none`}),e.setAttribute(`aria-hidden`,`true`),e},t=>{ue||K?.kind!==t||(K.destroy(),K.canvas.remove(),K=null,tt(new Set([...e,t])))},e);if(ue||t!==le){n?.destroy();return}K&&(K.destroy(),K.canvas.remove()),K=n,n?(Q.dataset.renderer=n.kind,Q.insertBefore(n.canvas,Z.canvas),D.emit(`renderer`,n.kind)):delete Q.dataset.renderer,de(n?.kind??null),Z.invalidate()},nt=r.followDefaultRenderer(()=>w.renderer,()=>void tt()),rt=e=>{pe!==e&&(pe=e,D.emit(`follow`,e))},it=e=>{let t=L.length?L[0].time:R;if(!Number.isFinite(t))return e;let n=e[1]-e[0],r=(Number.isFinite(ve)?ve:Oe())+$()+n/2,i=Math.max(t-n/2,Math.min(e[0],r-n));return[i,i+n]},at=e=>{if(w.interactive===!1)return;let[t,n]=s.localPoint(Q,e);Q.setPointerCapture?.(e.pointerId),X={x:t,y:n,viewX:[...q],viewY:[...J],axis:t>Y.x+Y.w,span:J[1]-J[0]}},ot=e=>{let[t,n]=s.localPoint(Q,e);if(be=[t,n],X){let e=t-X.x,r=n-X.y;if(X.axis){let e=X.span*Math.exp(r*.006),t=(X.viewY[0]+X.viewY[1])/2;_e=e,J=[t-e/2,t+e/2],ge=[J[0],J[1]]}else if(Math.abs(e)+Math.abs(r)>3){rt(!1);let t=(X.viewX[1]-X.viewX[0])/Y.w*e,n=(X.viewY[1]-X.viewY[0])/Y.h*r;q=it([X.viewX[0]-t,X.viewX[1]-t]),J=[X.viewY[0]+n,X.viewY[1]+n]}}Z.invalidate()},st=e=>{Q.releasePointerCapture?.(e.pointerId),X=null,Z.invalidate()},ct=()=>{X||(be=null,Z.invalidate())},lt=(e,t)=>{let[n,r]=q,i=o.clamp((pe?me:r-n)*e,$()*10,Ee());if(me=i,!pe){let e=n+(t-Y.x)/Y.w*(r-n),a=(e-n)/(r-n);q=it([e-i*a,e+i*(1-a)])}Z.invalidate()},ut=e=>{let t=o.clamp((J[1]-J[0])*e,I*6||1e-9,1/0),n=(J[0]+J[1])/2;_e=t,J=[n-t/2,n+t/2],ge=[J[0],J[1]],Z.invalidate()},dt=e=>{if(w.interactive===!1||!(e.ctrlKey||e.metaKey))return;e.preventDefault();let[t]=s.localPoint(Q,e),n=Math.exp(e.deltaY*.002);e.shiftKey||t>Y.x+Y.w?ut(n):lt(n,t)},ft=()=>{w.interactive!==!1&&ht.resetView()},pt=e=>{if(w.interactive!==!1){switch(e.key){case`+`:case`=`:lt(.8,Y.x+Y.w);break;case`-`:lt(1.25,Y.x+Y.w);break;case`ArrowUp`:case`ArrowDown`:{if(e.shiftKey){ut(e.key===`ArrowUp`?.8:1.25);break}rt(!1);let t=(J[1]-J[0])*.1*(e.key===`ArrowUp`?1:-1);J=[J[0]+t,J[1]+t],Z.invalidate();break}case`ArrowLeft`:case`ArrowRight`:{rt(!1);let t=(q[1]-q[0])*.1*(e.key===`ArrowLeft`?-1:1);q=it([q[0]+t,q[1]+t]),Z.invalidate();break}case`0`:case`Home`:ht.resetView();break;default:return}e.preventDefault()}};Q.addEventListener(`pointerdown`,at),Q.addEventListener(`pointermove`,ot),Q.addEventListener(`pointerup`,st),Q.addEventListener(`pointercancel`,st),Q.addEventListener(`pointerleave`,ct),Q.addEventListener(`wheel`,dt,{passive:!1}),Q.addEventListener(`dblclick`,ft),Q.addEventListener(`keydown`,pt);let mt=e=>{let t=Re(e.time);E.count(`bid`)+E.count(`ask`)>0&&(Pe(),Le(t)),E.applyDelta(e)},ht={setBook(e){let t=Re(e.time);E.count(`bid`)+E.count(`ask`)>0&&Le(t),E.setSnapshot(e),Pe(),je(),Number.isFinite(R)||Le(t),Z.invalidate()},applyDeltas(e){if(Array.isArray(e))for(let t of e)mt(t);else mt(e);!Number.isFinite(R)&&I>0&&Le(Oe()),Z.invalidate()},addTrades(e){let t=Array.isArray(e)?e:[e];for(let e of t){if(!(e.size>0)||!Number.isFinite(e.price))continue;Number.isFinite(ie)&&(Re(e.time),Le(e.time));let t=!Number.isFinite(R)||e.time>=R?z:ze(e.time);t&&(e.side===`buy`?(t.buyVolume+=e.size,t.buyNotional+=e.size*e.price):(t.sellVolume+=e.size,t.sellNotional+=e.size*e.price)),(!re||e.time>=re.time)&&(re=e)}Z.invalidate()},clear(){E.clear(),Ne(),re=null,ie=NaN,I=0,_e=NaN,ge=null,he=!1,Z.invalidate()},setOptions(e){let t=w;w=e,Te(),(e.tickSize!==t.tickSize||(e.interval??100)!==(t.interval??100))&&(Ne(),I=0,_e=NaN,Pe()),e.window!==t.window&&(me=NaN),e.priceSpan!==t.priceSpan&&(_e=NaN),(e.renderer??`auto`)!==(t.renderer??`auto`)&&tt(),Ae(),je(),Z.invalidate()},resetView(){me=NaN,_e=NaN,ge=null,rt(!0),Z.invalidate()},getRenderer:()=>K?.kind??null,ready:fe,getStore:()=>E,on:(e,t)=>D.on(e,t),resize(){Z.invalidate()},destroy(){ue=!0,nt(),Q.removeEventListener(`pointerdown`,at),Q.removeEventListener(`pointermove`,ot),Q.removeEventListener(`pointerup`,st),Q.removeEventListener(`pointercancel`,st),Q.removeEventListener(`pointerleave`,ct),Q.removeEventListener(`wheel`,dt),Q.removeEventListener(`dblclick`,ft),Q.removeEventListener(`keydown`,pt),K?.destroy(),K=null,D.clear(),Z.destroy(),de(null)}};return Te(),Ae(),tt(),ht};exports.createOrderBookHeatmap=E,exports.heatCurve=te,exports.heatIntensity=C,exports.positionedRamp=b,exports.rowBucket=x,exports.sizeCdf=T;
2
2
  //# sourceMappingURL=heatmap.cjs.map