@qfo/qfchart 0.6.4 → 0.6.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -223,6 +223,7 @@ const chart = new QFChart(container, {
223
223
  fontColor: '#cbd5e1',
224
224
  fontFamily: 'sans-serif',
225
225
  padding: 0.2, // Vertical padding for auto-scaling
226
+ yAxisDecimalPlaces: undefined, // Auto-detect decimals (default), or set number (e.g. 2)
226
227
  dataZoom: {
227
228
  visible: true,
228
229
  position: 'top',
@@ -14,25 +14,25 @@
14
14
  * See the License for the specific language governing permissions and
15
15
  * limitations under the License.
16
16
  */
17
- (function(ot,lt){typeof exports=="object"&&typeof module<"u"?lt(exports,require("echarts")):typeof define=="function"&&define.amd?define(["exports","echarts"],lt):(ot=typeof globalThis<"u"?globalThis:ot||self,lt(ot.QFChart={},ot.echarts))})(this,function(ot,lt){"use strict";function mt(r){var e=Object.create(null);return r&&Object.keys(r).forEach(function(t){if(t!=="default"){var i=Object.getOwnPropertyDescriptor(r,t);Object.defineProperty(e,t,i.get?i:{enumerable:!0,get:function(){return r[t]}})}}),e.default=r,Object.freeze(e)}var j=mt(lt),bt=Object.defineProperty,vt=(r,e,t)=>e in r?bt(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,at=(r,e,t)=>(vt(r,typeof e!="symbol"?e+"":e,t),t);class wt{constructor(e,t,i,s={}){at(this,"id"),at(this,"plots"),at(this,"paneIndex"),at(this,"height"),at(this,"collapsed"),at(this,"titleColor"),at(this,"controls"),this.id=e,this.plots=t,this.paneIndex=i,this.height=s.height,this.collapsed=s.collapsed||!1,this.titleColor=s.titleColor,this.controls=s.controls}toggleCollapse(){this.collapsed=!this.collapsed}isVisible(){return!this.collapsed}updateData(e){Object.keys(e).forEach(t=>{if(!this.plots[t])this.plots[t]=e[t];else{const i=this.plots[t],s=e[t];if(!i.data)return;s.options&&(i.options={...i.options,...s.options});const o=new Map;i.data?.forEach(n=>{o.set(n.time,n)}),s.data?.forEach(n=>{o.set(n.time,n)}),i.data=Array.from(o.values()).sort((n,u)=>n.time-u.time)}})}}class gt{static calculate(e,t,i,s=!1,o=null,n){let u=0;e>0&&(u=1/e*100);const p=i.yAxisPadding!==void 0?i.yAxisPadding:5,h=l=>f=>{const P=(f.max-f.min)*(l/100);return f.min-P},S=l=>f=>{const P=(f.max-f.min)*(l/100);return f.max+P},x=Array.from(t.values()).map(l=>l.paneIndex).filter(l=>l>0).sort((l,f)=>l-f).filter((l,f,P)=>P.indexOf(l)===f),y=x.length>0,A=i.dataZoom?.visible??!0,v=i.dataZoom?.position??"top",d=i.dataZoom?.height??6,m=i.dataZoom?.start??0,M=i.dataZoom?.end??100;let $=8,q=92,g=-1;if(o)if(o==="main")g=0;else{const l=t.get(o);l&&(g=l.paneIndex)}if(g!==-1){const l=[],f=[],P=[],T=[],H=i.dataZoom?.start??50,C=i.dataZoom?.end??100;(i.dataZoom?.zoomOnTouch??!0)&&T.push({type:"inside",xAxisIndex:"all",start:H,end:C});const N=y?Math.max(...x):0,L=[];for(let F=0;F<=N;F++){const G=F===g;l.push({left:"10%",right:"10%",top:G?"5%":"0%",height:G?"90%":"0%",show:G,containLabel:!1}),f.push({type:"category",gridIndex:F,data:[],show:G,axisLabel:{show:G,color:"#94a3b8",fontFamily:i.fontFamily},axisLine:{show:G,lineStyle:{color:"#334155"}},splitLine:{show:G,lineStyle:{color:"#334155",opacity:.5}}});let R,V;if(F===0&&g===0?(R=i.yAxisMin!==void 0&&i.yAxisMin!=="auto"?i.yAxisMin:h(p),V=i.yAxisMax!==void 0&&i.yAxisMax!=="auto"?i.yAxisMax:S(p)):(R=h(p),V=S(p)),P.push({position:"right",gridIndex:F,show:G,scale:!0,min:R,max:V,axisLabel:{show:G,color:"#94a3b8",fontFamily:i.fontFamily,formatter:Y=>{if(i.yAxisLabelFormatter)return i.yAxisLabelFormatter(Y);const K=i.yAxisDecimalPlaces!==void 0?i.yAxisDecimalPlaces:2;return typeof Y=="number"?Y.toFixed(K):String(Y)}},splitLine:{show:G,lineStyle:{color:"#334155",opacity:.5}}}),F>0){const Y=Array.from(t.values()).find(K=>K.paneIndex===F);Y&&L.push({index:F,height:G?90:0,top:G?5:0,isCollapsed:!1,indicatorId:Y.id,titleColor:Y.titleColor,controls:Y.controls})}}return{grid:l,xAxis:f,yAxis:P,dataZoom:T,paneLayout:L,mainPaneHeight:g===0?90:0,mainPaneTop:g===0?5:0,pixelToPercent:u,overlayYAxisMap:new Map,separatePaneYAxisOffset:1}}A?v==="top"?($=d+4,q=95):(q=100-d-2,$=8):($=5,q=95);let I=5;e>0&&(I=20/e*100);let E=75,z=[];if(y){const l=x.map(C=>{const N=Array.from(t.values()).find(L=>L.paneIndex===C);return{index:C,requestedHeight:N?.height,isCollapsed:N?.collapsed??!1,indicatorId:N?.id,titleColor:N?.titleColor,controls:N?.controls}}).map(C=>({...C,height:C.isCollapsed?3:C.requestedHeight!==void 0?C.requestedHeight:15})),f=l.reduce((C,N)=>C+N.height,0),P=l.length*I,T=f+P;E=q-$-T,s?E=3:E<20&&(E=Math.max(E,10));let H=$+E+I;z=l.map(C=>{const N={index:C.index,height:C.height,top:H,isCollapsed:C.isCollapsed,indicatorId:C.indicatorId,titleColor:C.titleColor,controls:C.controls};return H+=C.height+I,N})}else E=q-$,s&&(E=3);const D=[];D.push({left:"10%",right:"10%",top:$+"%",height:E+"%",containLabel:!1}),z.forEach(l=>{D.push({left:"10%",right:"10%",top:l.top+"%",height:l.height+"%",containLabel:!1})});const B=[0,...z.map((l,f)=>f+1)],W=[],X=z.length===0;W.push({type:"category",data:[],gridIndex:0,scale:!0,axisLine:{onZero:!1,show:!s,lineStyle:{color:"#334155"}},splitLine:{show:!s,lineStyle:{color:"#334155",opacity:.5}},axisLabel:{show:!s,color:"#94a3b8",fontFamily:i.fontFamily||"sans-serif",formatter:l=>{if(i.yAxisLabelFormatter)return i.yAxisLabelFormatter(l);const f=i.yAxisDecimalPlaces!==void 0?i.yAxisDecimalPlaces:2;return typeof l=="number"?l.toFixed(f):String(l)}},axisTick:{show:!s},axisPointer:{label:{show:X,fontSize:11,backgroundColor:"#475569"}}}),z.forEach((l,f)=>{const P=f===z.length-1;W.push({type:"category",gridIndex:f+1,data:[],axisLabel:{show:!1},axisLine:{show:!l.isCollapsed,lineStyle:{color:"#334155"}},axisTick:{show:!1},splitLine:{show:!1},axisPointer:{label:{show:P,fontSize:11,backgroundColor:"#475569"}}})});const Z=[];let _,st;i.yAxisMin!==void 0&&i.yAxisMin!=="auto"?_=i.yAxisMin:_=h(p),i.yAxisMax!==void 0&&i.yAxisMax!=="auto"?st=i.yAxisMax:st=S(p),Z.push({position:"right",scale:!0,min:_,max:st,gridIndex:0,splitLine:{show:!s,lineStyle:{color:"#334155",opacity:.5}},axisLine:{show:!s,lineStyle:{color:"#334155"}},axisLabel:{show:!s,color:"#94a3b8",fontFamily:i.fontFamily||"sans-serif",formatter:l=>{if(i.yAxisLabelFormatter)return i.yAxisLabelFormatter(l);const f=i.yAxisDecimalPlaces!==void 0?i.yAxisDecimalPlaces:2;return typeof l=="number"?l.toFixed(f):String(l)}}});let Q=1,it=-1/0,c=1/0;n&&n.length>0&&(it=Math.min(...n.map(l=>l.low)),c=Math.max(...n.map(l=>l.high)));const a=new Map;t.forEach((l,f)=>{l.paneIndex===0&&!l.collapsed&&n&&n.length>0&&Object.entries(l.plots).forEach(([P,T])=>{const H=`${f}::${P}`,C=["background","barcolor","char"],N=T.options.style==="shape"&&(T.options.location==="abovebar"||T.options.location==="belowbar");if(C.includes(T.options.style)){a.has(H)||(a.set(H,Q),Q++);return}if(T.options.style==="shape"&&!N){a.has(H)||(a.set(H,Q),Q++);return}const L=[];if(T.data&&Object.values(T.data).forEach(F=>{typeof F=="number"&&!isNaN(F)&&isFinite(F)&&L.push(F)}),L.length>0){const F=Math.min(...L),G=Math.max(...L),R=G-F,V=c-it,Y=F>=it*.5&&G<=c*1.5,K=R>V*.01;Y&&K||a.has(H)||(a.set(H,Q),Q++)}})});const w=a.size>0?Q-1:0;for(let l=0;l<w;l++)Z.push({position:"left",scale:!0,min:h(p),max:S(p),gridIndex:0,show:!1,splitLine:{show:!1},axisLine:{show:!1},axisLabel:{show:!1}});const k=Q;z.forEach((l,f)=>{Z.push({position:"right",scale:!0,min:h(p),max:S(p),gridIndex:f+1,splitLine:{show:!l.isCollapsed,lineStyle:{color:"#334155",opacity:.3}},axisLabel:{show:!l.isCollapsed,color:"#94a3b8",fontFamily:i.fontFamily||"sans-serif",fontSize:10,formatter:P=>{if(i.yAxisLabelFormatter)return i.yAxisLabelFormatter(P);const T=i.yAxisDecimalPlaces!==void 0?i.yAxisDecimalPlaces:2;return typeof P=="number"?P.toFixed(T):String(P)}},axisLine:{show:!l.isCollapsed,lineStyle:{color:"#334155"}}})});const b=[];return A&&((i.dataZoom?.zoomOnTouch??!0)&&b.push({type:"inside",xAxisIndex:B,start:m,end:M}),v==="top"?b.push({type:"slider",xAxisIndex:B,top:"1%",height:d+"%",start:m,end:M,borderColor:"#334155",textStyle:{color:"#cbd5e1"},brushSelect:!1}):b.push({type:"slider",xAxisIndex:B,bottom:"1%",height:d+"%",start:m,end:M,borderColor:"#334155",textStyle:{color:"#cbd5e1"},brushSelect:!1})),{grid:D,xAxis:W,yAxis:Z,dataZoom:b,paneLayout:z,mainPaneHeight:E,mainPaneTop:$,pixelToPercent:u,overlayYAxisMap:a,separatePaneYAxisOffset:k}}static calculateMaximized(e,t,i){return{grid:[],xAxis:[],yAxis:[],dataZoom:[],paneLayout:[],mainPaneHeight:0,mainPaneTop:0,pixelToPercent:0}}}const ut=new Map;function Ct(r,e="#00da3c",t="64px"){if(typeof document>"u")return"";const i=`${r}-${e}-${t}`;if(ut.has(i))return ut.get(i);const s=document.createElement("canvas"),o=s.getContext("2d");if(s.width=32,s.height=32,o){o.font="bold "+t+" Arial",o.fillStyle=e,o.textAlign="center",o.textBaseline="middle",o.fillText(r,16,16);const n=s.toDataURL("image/png");return ut.set(i,n),n}return""}var kt=Object.defineProperty,St=(r,e,t)=>e in r?kt(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,It=(r,e,t)=>(St(r,typeof e!="symbol"?e+"":e,t),t);const xt=class tt{static parseColor(e){if(!e)return{color:"#888888",opacity:.2};const t=e.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)/);if(t){const i=t[1],s=t[2],o=t[3],n=t[4]?parseFloat(t[4]):1;return{color:`rgb(${i},${s},${o})`,opacity:n}}return{color:e,opacity:.3}}static buildCandlestickSeries(e,t,i){const s=t.upColor||"#00da3c",o=t.downColor||"#ec0000",n=e.map(p=>[p.open,p.close,p.low,p.high]);if(i&&i>n.length){const p=i-n.length;for(let h=0;h<p;h++)n.push(null)}let u;if(t.lastPriceLine?.visible!==!1&&e.length>0){const p=e[e.length-1],h=p.close,S=p.close>=p.open,x=t.lastPriceLine?.color||(S?s:o);let y=t.lastPriceLine?.lineStyle||"dashed";y.startsWith("linestyle_")&&(y=y.replace("linestyle_","")),u={symbol:["none","none"],data:[{yAxis:h,label:{show:!0,position:"end",formatter:A=>{if(t.yAxisLabelFormatter)return t.yAxisLabelFormatter(A.value);const v=t.yAxisDecimalPlaces!==void 0?t.yAxisDecimalPlaces:2;return typeof A.value=="number"?A.value.toFixed(v):A.value},color:"#fff",backgroundColor:x,padding:[2,4],borderRadius:2,fontSize:11,fontWeight:"bold"},lineStyle:{color:x,type:y,width:1,opacity:.8}}],animation:!1,silent:!0}}return{type:"candlestick",name:t.title||"Market",data:n,itemStyle:{color:s,color0:o,borderColor:s,borderColor0:o},markLine:u,xAxisIndex:0,yAxisIndex:0,z:5}}static getShapeSymbol(e){switch(e){case"arrowdown":return"path://M12 24l-12-12h8v-12h8v12h8z";case"arrowup":return"path://M12 0l12 12h-8v12h-8v-12h-8z";case"circle":return"circle";case"cross":return"path://M11 2h2v9h9v2h-9v9h-2v-9h-9v-2h9z";case"diamond":return"diamond";case"flag":return"path://M6 2v20h2v-8h12l-2-6 2-6h-12z";case"labeldown":return"path://M4 2h16a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-6l-2 4l-2 -4h-6a2 2 0 0 1 -2 -2v-12a2 2 0 0 1 2 -2z";case"labelup":return"path://M12 2l2 4h6a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-16a2 2 0 0 1 -2 -2v-12a2 2 0 0 1 2 -2h6z";case"square":return"rect";case"triangledown":return"path://M12 21l-10-18h20z";case"triangleup":return"triangle";case"xcross":return"path://M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z";default:return"circle"}}static getShapeRotation(e){return 0}static getShapeSize(e,t,i){if(t!==void 0&&i!==void 0)return[t,i];let s;switch(e){case"tiny":s=8;break;case"small":s=12;break;case"normal":case"auto":s=16;break;case"large":s=24;break;case"huge":s=32;break;default:s=16}return t!==void 0?[t,t]:i!==void 0?[i,i]:s}static getLabelConfig(e,t){switch(t){case"abovebar":return{position:"top",distance:5};case"belowbar":return{position:"bottom",distance:5};case"top":return{position:"bottom",distance:5};case"bottom":return{position:"top",distance:5};case"absolute":default:return e==="labelup"||e==="labeldown"?{position:"inside",distance:0}:{position:"top",distance:5}}}static buildIndicatorSeries(e,t,i,s,o=0,n,u,p=1){const h=[],S=new Array(s).fill(null),x=new Map;return e.forEach((y,A)=>{y.collapsed||Object.keys(y.plots).sort((v,d)=>{const m=y.plots[v],M=y.plots[d],$=m.options.style==="fill",q=M.options.style==="fill";return $&&!q?1:!$&&q?-1:0}).forEach(v=>{const d=y.plots[v],m=`${A}::${v}`;let M=0,$=0;const q=d.options.overlay;if(q!==void 0?q:y.paneIndex===0)M=0,u&&u.has(m)?$=u.get(m):$=0;else{const z=i.findIndex(D=>D.index===y.paneIndex);z!==-1&&(M=z+1,$=p+z)}const g=new Array(s).fill(null),I=new Array(s).fill(null),E=new Array(s).fill(null);switch(d.data?.forEach(z=>{const D=t.get(z.time);if(D!==void 0){const B=z.options?.offset??d.options.offset??0,W=D+o+B;if(W>=0&&W<s){let X=z.value;const Z=z.options?.color;(Z===null||Z==="na"||Z==="NaN"||typeof Z=="number"&&isNaN(Z))&&(X=null),g[W]=X,I[W]=Z||d.options.color||tt.DEFAULT_COLOR,E[W]=z.options||{}}}}),x.set(`${A}::${v}`,g),d.options?.style?.startsWith("style_")&&(d.options.style=d.options.style.replace("style_","")),d.options.style){case"histogram":case"columns":h.push({name:m,type:"bar",xAxisIndex:M,yAxisIndex:$,data:g.map((c,a)=>({value:c,itemStyle:I[a]?{color:I[a]}:void 0})),itemStyle:{color:d.options.color||tt.DEFAULT_COLOR}});break;case"circles":case"cross":const z=g.map((c,a)=>{if(c===null)return null;const w=I[a]||d.options.color||tt.DEFAULT_COLOR,k={value:[a,c],itemStyle:{color:w}};return d.options.style==="cross"?(k.symbol=`image://${Ct("+",w,"24px")}`,k.symbolSize=16):(k.symbol="circle",k.symbolSize=6),k}).filter(c=>c!==null);h.push({name:m,type:"scatter",xAxisIndex:M,yAxisIndex:$,data:z});break;case"bar":case"candle":const D=g.map((c,a)=>{if(c===null||!Array.isArray(c)||c.length!==4)return null;const[w,k,b,l]=c,f=E[a]||{},P=f.color||I[a]||d.options.color||tt.DEFAULT_COLOR,T=f.wickcolor||d.options.wickcolor||P,H=f.bordercolor||d.options.bordercolor||T;return[a,w,l,b,k,P,T,H]}).filter(c=>c!==null);h.push({name:m,type:"custom",xAxisIndex:M,yAxisIndex:$,renderItem:(c,a)=>{const w=a.value(0),k=a.value(1),b=a.value(2),l=a.value(3),f=a.value(4),P=a.value(5),T=a.value(6),H=a.value(7);if(isNaN(k)||isNaN(b)||isNaN(l)||isNaN(f))return null;const C=a.coord([w,0])[0],N=a.coord([w,k])[1],L=a.coord([w,b])[1],F=a.coord([w,l])[1],G=a.coord([w,f])[1],R=a.size([1,0])[0]*.6;if(d.options.style==="candle"){const V=Math.min(N,L),Y=Math.max(N,L),K=Math.abs(L-N);return{type:"group",children:[{type:"line",shape:{x1:C,y1:G,x2:C,y2:V},style:{stroke:T,lineWidth:1}},{type:"line",shape:{x1:C,y1:Y,x2:C,y2:F},style:{stroke:T,lineWidth:1}},{type:"rect",shape:{x:C-R/2,y:V,width:R,height:K||1},style:{fill:P,stroke:H,lineWidth:1}}]}}else{const V=R*.5;return{type:"group",children:[{type:"line",shape:{x1:C,y1:F,x2:C,y2:G},style:{stroke:P,lineWidth:1}},{type:"line",shape:{x1:C-V,y1:N,x2:C,y2:N},style:{stroke:P,lineWidth:1}},{type:"line",shape:{x1:C,y1:L,x2:C+V,y2:L},style:{stroke:P,lineWidth:1}}]}}},data:D});break;case"shape":const B=g.map((c,a)=>{const w=E[a]||{},k=d.options,b=w.location||k.location||"absolute";if(b!=="absolute"&&!c||c==null)return null;const l=w.color||k.color||tt.DEFAULT_COLOR,f=w.shape||k.shape||"circle",P=w.size||k.size||"normal",T=w.text||k.text,H=w.textcolor||k.textcolor||"white",C=w.width||k.width,N=w.height||k.height;let L=c,F=[0,0];b==="abovebar"?(n&&n[a]&&(L=n[a].high),F=[0,"-150%"]):b==="belowbar"?(n&&n[a]&&(L=n[a].low),F=[0,"150%"]):b==="top"?(L=c,F=[0,0]):b==="bottom"&&(L=c,F=[0,0]);const G=tt.getShapeSymbol(f),R=tt.getShapeSize(P,C,N),V=tt.getShapeRotation(f);let Y=R;f.includes("label")&&(Array.isArray(R)?Y=[R[0]*2.5,R[1]*2.5]:Y=R*2.5);const K=tt.getLabelConfig(f,b);return{value:[a,L],symbol:G,symbolSize:Y,symbolRotate:V,symbolOffset:F,itemStyle:{color:l},label:{show:!!T,position:K.position,distance:K.distance,formatter:T,color:H,fontSize:10,fontWeight:"bold"}}}).filter(c=>c!==null);h.push({name:m,type:"scatter",xAxisIndex:M,yAxisIndex:$,data:B});break;case"background":h.push({name:m,type:"custom",xAxisIndex:M,yAxisIndex:$,z:-10,renderItem:(c,a)=>{const w=a.value(0);if(isNaN(w))return;const k=a.coord([w,0]),b=a.size([1,0])[0],l=c.coordSys,f=k[0]-b/2,P=I[c.dataIndex],T=a.value(1);if(!(!P||T===null||T===void 0||isNaN(T)))return{type:"rect",shape:{x:f,y:l.y,width:b,height:l.height},style:{fill:P,opacity:.3},silent:!0}},data:g.map((c,a)=>[a,c])});break;case"step":h.push({name:m,type:"custom",xAxisIndex:M,yAxisIndex:$,renderItem:(c,a)=>{const w=a.value(0),k=a.value(1);if(isNaN(k)||k===null)return;const b=a.coord([w,k]),l=a.size([1,0])[0];return{type:"line",shape:{x1:b[0]-l/2,y1:b[1],x2:b[0]+l/2,y2:b[1]},style:{stroke:I[c.dataIndex]||d.options.color||tt.DEFAULT_COLOR,lineWidth:d.options.linewidth||1},silent:!0}},data:g.map((c,a)=>[a,c])});break;case"barcolor":d.data?.forEach(c=>{const a=t.get(c.time);if(a!==void 0){const w=c.options?.offset??d.options.offset??0,k=a+o+w;if(k>=0&&k<s){const b=c.options?.color||d.options.color||tt.DEFAULT_COLOR;!(b===null||b==="na"||b==="NaN"||typeof b=="number"&&isNaN(b))&&c.value!==null&&c.value!==void 0&&(S[k]=b)}}});break;case"char":h.push({name:m,type:"scatter",xAxisIndex:M,yAxisIndex:$,symbolSize:0,data:g.map((c,a)=>({value:[a,c],itemStyle:{opacity:0}})),silent:!0});break;case"fill":const W=d.plot1?`${A}::${d.plot1}`:null,X=d.plot2?`${A}::${d.plot2}`:null;if(!W||!X){console.warn(`Fill plot "${v}" missing plot1 or plot2 reference`);break}const Z=x.get(W),_=x.get(X);if(!Z||!_){console.warn(`Fill plot "${v}" references non-existent plots: ${d.plot1}, ${d.plot2}`);break}const{color:st,opacity:Q}=tt.parseColor(d.options.color||"rgba(128, 128, 128, 0.2)"),it=[];for(let c=0;c<s;c++){const a=Z[c],w=_[c],k=c>0?Z[c-1]:null,b=c>0?_[c-1]:null;it.push([c,a,w,k,b])}h.push({name:m,type:"custom",xAxisIndex:M,yAxisIndex:$,z:-5,renderItem:(c,a)=>{const w=c.dataIndex;if(w===0)return null;const k=a.value(1),b=a.value(2),l=a.value(3),f=a.value(4);if(k===null||b===null||l===null||f===null||isNaN(k)||isNaN(b)||isNaN(l)||isNaN(f))return null;const P=a.coord([w-1,l]),T=a.coord([w,k]),H=a.coord([w,b]),C=a.coord([w-1,f]);return{type:"polygon",shape:{points:[P,T,H,C]},style:{fill:st,opacity:Q},silent:!0}},data:it});break;case"line":default:h.push({name:m,type:"custom",xAxisIndex:M,yAxisIndex:$,renderItem:(c,a)=>{const w=c.dataIndex;if(w===0)return;const k=a.value(1),b=a.value(2);if(k===null||isNaN(k)||b===null||isNaN(b))return;const l=a.coord([w-1,b]),f=a.coord([w,k]);return{type:"line",shape:{x1:l[0],y1:l[1],x2:f[0],y2:f[1]},style:{stroke:I[w]||d.options.color||tt.DEFAULT_COLOR,lineWidth:d.options.linewidth||1},silent:!0}},data:g.map((c,a)=>[a,c,a>0?g[a-1]:null])});break}})}),{series:h,barColors:S}}};It(xt,"DEFAULT_COLOR","#2962ff");let ct=xt;class Pt{static build(e,t,i,s=!1,o=null){const n=[],u=e.pixelToPercent,p=e.mainPaneTop;if(!o||o==="main"){const h=10*u;if(n.push({type:"text",left:"8.5%",top:p+h+"%",z:10,style:{text:t.title||"Market",fill:t.titleColor||"#fff",font:`bold 16px ${t.fontFamily||"sans-serif"}`,textVerticalAlign:"top"}}),t.watermark!==!1){const x=e.mainPaneTop+e.mainPaneHeight;n.push({type:"text",right:"11%",top:x-3+"%",z:10,style:{text:"QFChart",fill:t.fontColor||"#cbd5e1",font:"bold 16px sans-serif",opacity:.1},cursor:"pointer",onclick:()=>{window.open("https://quantforge.org","_blank")}})}const S=[];if(t.controls?.collapse&&S.push({type:"group",children:[{type:"rect",shape:{width:20,height:20,r:2},style:{fill:"#334155",stroke:"#475569",lineWidth:1},onclick:()=>i("main","collapse")},{type:"text",style:{text:s?"+":"\u2212",fill:"#cbd5e1",font:`bold 14px ${t.fontFamily}`,x:10,y:10,textAlign:"center",textVerticalAlign:"middle"},silent:!0}]}),t.controls?.maximize){const x=o==="main",y=t.controls?.collapse?25:0;S.push({type:"group",x:y,children:[{type:"rect",shape:{width:20,height:20,r:2},style:{fill:"#334155",stroke:"#475569",lineWidth:1},onclick:()=>i("main","maximize")},{type:"text",style:{text:x?"\u2750":"\u25A1",fill:"#cbd5e1",font:`14px ${t.fontFamily}`,x:10,y:10,textAlign:"center",textVerticalAlign:"middle"},silent:!0}]})}if(t.controls?.fullscreen){let x=0;t.controls?.collapse&&(x+=25),t.controls?.maximize&&(x+=25),S.push({type:"group",x,children:[{type:"rect",shape:{width:20,height:20,r:2},style:{fill:"#334155",stroke:"#475569",lineWidth:1},onclick:()=>i("main","fullscreen")},{type:"text",style:{text:"\u26F6",fill:"#cbd5e1",font:`14px ${t.fontFamily}`,x:10,y:10,textAlign:"center",textVerticalAlign:"middle"},silent:!0}]})}S.length>0&&n.push({type:"group",right:"10.5%",top:p+"%",children:S})}return e.paneLayout.forEach(h=>{if(o&&h.indicatorId!==o)return;n.push({type:"text",left:"8.5%",top:h.top+10*u+"%",z:10,style:{text:h.indicatorId||"",fill:h.titleColor||"#fff",font:`bold 12px ${t.fontFamily||"sans-serif"}`,textVerticalAlign:"top"}});const S=[];if(h.controls?.collapse&&S.push({type:"group",children:[{type:"rect",shape:{width:20,height:20,r:2},style:{fill:"#334155",stroke:"#475569",lineWidth:1},onclick:()=>h.indicatorId&&i(h.indicatorId,"collapse")},{type:"text",style:{text:h.isCollapsed?"+":"\u2212",fill:"#cbd5e1",font:`bold 14px ${t.fontFamily}`,x:10,y:10,textAlign:"center",textVerticalAlign:"middle"},silent:!0}]}),h.controls?.maximize){const x=o===h.indicatorId,y=h.controls?.collapse?25:0;S.push({type:"group",x:y,children:[{type:"rect",shape:{width:20,height:20,r:2},style:{fill:"#334155",stroke:"#475569",lineWidth:1},onclick:()=>h.indicatorId&&i(h.indicatorId,"maximize")},{type:"text",style:{text:x?"\u2750":"\u25A1",fill:"#cbd5e1",font:`14px ${t.fontFamily}`,x:10,y:10,textAlign:"center",textVerticalAlign:"middle"},silent:!0}]})}S.length>0&&n.push({type:"group",right:"10.5%",top:h.top+"%",children:S})}),n}}class Dt{static format(e,t){if(!e||e.length===0)return"";const i=t.title||"Market",s=t.upColor||"#00da3c",o=t.downColor||"#ec0000",n=t.fontFamily||"sans-serif",u=e[0].axisValue;let p=`<div style="font-weight: bold; margin-bottom: 5px; color: #cbd5e1; font-family: ${n};">${u}</div>`;const h=e.find(x=>x.seriesType==="candlestick"),S=e.filter(x=>x.seriesType!=="candlestick");if(h){const[x,y,A,v,d]=h.value,m=A>=y?s:o;p+=`
18
- <div style="margin-bottom: 8px; font-family: ${n};">
17
+ (function(J,rt){typeof exports=="object"&&typeof module<"u"?rt(exports,require("echarts")):typeof define=="function"&&define.amd?define(["exports","echarts"],rt):(J=typeof globalThis<"u"?globalThis:J||self,rt(J.QFChart={},J.echarts))})(this,function(J,rt){"use strict";function kt(a){var e=Object.create(null);return a&&Object.keys(a).forEach(function(t){if(t!=="default"){var i=Object.getOwnPropertyDescriptor(a,t);Object.defineProperty(e,t,i.get?i:{enumerable:!0,get:function(){return a[t]}})}}),e.default=a,Object.freeze(e)}var Z=kt(rt),St=Object.defineProperty,At=(a,e,t)=>e in a?St(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t,nt=(a,e,t)=>(At(a,typeof e!="symbol"?e+"":e,t),t);class Pt{constructor(e,t,i,s={}){nt(this,"id"),nt(this,"plots"),nt(this,"paneIndex"),nt(this,"height"),nt(this,"collapsed"),nt(this,"titleColor"),nt(this,"controls"),this.id=e,this.plots=t,this.paneIndex=i,this.height=s.height,this.collapsed=s.collapsed||!1,this.titleColor=s.titleColor,this.controls=s.controls}toggleCollapse(){this.collapsed=!this.collapsed}isVisible(){return!this.collapsed}updateData(e){Object.keys(e).forEach(t=>{if(!this.plots[t])this.plots[t]=e[t];else{const i=this.plots[t],s=e[t];if(!i.data)return;s.options&&(i.options={...i.options,...s.options});const n=new Map;i.data?.forEach(o=>{n.set(o.time,o)}),s.data?.forEach(o=>{n.set(o.time,o)}),i.data=Array.from(n.values()).sort((o,c)=>o.time-c.time)}})}}class O{static createMinFunction(e){return t=>{const i=(t.max-t.min)*(e/100);return t.min-i}}static createMaxFunction(e){return t=>{const i=(t.max-t.min)*(e/100);return t.max+i}}static autoDetectDecimals(e){if(!e||e.length===0)return 2;const t=e[e.length-1].close;if(t===0||!isFinite(t)||isNaN(t))return 2;const i=Math.abs(t);if(i>=1)return 2;const s=Math.ceil(-Math.log10(i));return Math.min(s+4,10)}static formatValue(e,t){return typeof e=="number"?e.toFixed(t):String(e)}}class vt{static calculate(e,t,i,s=!1,n=null,o){let c=0;e>0&&(c=1/e*100);const r=i.yAxisPadding!==void 0?i.yAxisPadding:5,l=Array.from(t.values()).map(b=>b.paneIndex).filter(b=>b>0).sort((b,P)=>b-P).filter((b,P,L)=>L.indexOf(b)===P),f=l.length>0,y=i.dataZoom?.visible??!0,h=i.dataZoom?.position??"top",d=i.dataZoom?.height??6,p=i.dataZoom?.start??0,u=i.dataZoom?.end??100;let m=8,w=92,C=-1;if(n)if(n==="main")C=0;else{const b=t.get(n);b&&(C=b.paneIndex)}if(C!==-1){const b=[],P=[],L=[],$=[],B=i.dataZoom?.start??50,F=i.dataZoom?.end??100;(i.dataZoom?.zoomOnTouch??!0)&&$.push({type:"inside",xAxisIndex:"all",start:B,end:F});const G=f?Math.max(...l):0,H=[];for(let z=0;z<=G;z++){const W=z===C;b.push({left:"10%",right:"10%",top:W?"5%":"0%",height:W?"90%":"0%",show:W,containLabel:!1}),P.push({type:"category",gridIndex:z,data:[],show:W,axisLabel:{show:W,color:"#94a3b8",fontFamily:i.fontFamily},axisLine:{show:W,lineStyle:{color:"#334155"}},splitLine:{show:W,lineStyle:{color:"#334155",opacity:.5}}});let et,Q;if(z===0&&C===0?(et=i.yAxisMin!==void 0&&i.yAxisMin!=="auto"?i.yAxisMin:O.createMinFunction(r),Q=i.yAxisMax!==void 0&&i.yAxisMax!=="auto"?i.yAxisMax:O.createMaxFunction(r)):(et=O.createMinFunction(r),Q=O.createMaxFunction(r)),L.push({position:"right",gridIndex:z,show:W,scale:!0,min:et,max:Q,axisLabel:{show:W,color:"#94a3b8",fontFamily:i.fontFamily,formatter:U=>{if(i.yAxisLabelFormatter)return i.yAxisLabelFormatter(U);const it=i.yAxisDecimalPlaces!==void 0?i.yAxisDecimalPlaces:O.autoDetectDecimals(o);return O.formatValue(U,it)}},splitLine:{show:W,lineStyle:{color:"#334155",opacity:.5}}}),z>0){const U=Array.from(t.values()).find(it=>it.paneIndex===z);U&&H.push({index:z,height:W?90:0,top:W?5:0,isCollapsed:!1,indicatorId:U.id,titleColor:U.titleColor,controls:U.controls})}}return{grid:b,xAxis:P,yAxis:L,dataZoom:$,paneLayout:H,mainPaneHeight:C===0?90:0,mainPaneTop:C===0?5:0,pixelToPercent:c,overlayYAxisMap:new Map,separatePaneYAxisOffset:1}}y?h==="top"?(m=d+4,w=95):(w=100-d-2,m=8):(m=5,w=95);let S=5;e>0&&(S=20/e*100);let x=75,v=[];if(f){const b=l.map(F=>{const G=Array.from(t.values()).find(H=>H.paneIndex===F);return{index:F,requestedHeight:G?.height,isCollapsed:G?.collapsed??!1,indicatorId:G?.id,titleColor:G?.titleColor,controls:G?.controls}}).map(F=>({...F,height:F.isCollapsed?3:F.requestedHeight!==void 0?F.requestedHeight:15})),P=b.reduce((F,G)=>F+G.height,0),L=b.length*S,$=P+L;x=w-m-$,s?x=3:x<20&&(x=Math.max(x,10));let B=m+x+S;v=b.map(F=>{const G={index:F.index,height:F.height,top:B,isCollapsed:F.isCollapsed,indicatorId:F.indicatorId,titleColor:F.titleColor,controls:F.controls};return B+=F.height+S,G})}else x=w-m,s&&(x=3);const I=[];I.push({left:"10%",right:"10%",top:m+"%",height:x+"%",containLabel:!1}),v.forEach(b=>{I.push({left:"10%",right:"10%",top:b.top+"%",height:b.height+"%",containLabel:!1})});const D=[0,...v.map((b,P)=>P+1)],g=[],A=v.length===0;g.push({type:"category",data:[],gridIndex:0,scale:!0,axisLine:{onZero:!1,show:!s,lineStyle:{color:"#334155"}},splitLine:{show:!s,lineStyle:{color:"#334155",opacity:.5}},axisLabel:{show:!s,color:"#94a3b8",fontFamily:i.fontFamily||"sans-serif",formatter:b=>{if(i.yAxisLabelFormatter)return i.yAxisLabelFormatter(b);const P=i.yAxisDecimalPlaces!==void 0?i.yAxisDecimalPlaces:O.autoDetectDecimals(o);return O.formatValue(b,P)}},axisTick:{show:!s},axisPointer:{label:{show:A,fontSize:11,backgroundColor:"#475569"}}}),v.forEach((b,P)=>{const L=P===v.length-1;g.push({type:"category",gridIndex:P+1,data:[],axisLabel:{show:!1},axisLine:{show:!b.isCollapsed,lineStyle:{color:"#334155"}},axisTick:{show:!1},splitLine:{show:!1},axisPointer:{label:{show:L,fontSize:11,backgroundColor:"#475569"}}})});const N=[];let k,M;i.yAxisMin!==void 0&&i.yAxisMin!=="auto"?k=i.yAxisMin:k=O.createMinFunction(r),i.yAxisMax!==void 0&&i.yAxisMax!=="auto"?M=i.yAxisMax:M=O.createMaxFunction(r),N.push({position:"right",scale:!0,min:k,max:M,gridIndex:0,splitLine:{show:!s,lineStyle:{color:"#334155",opacity:.5}},axisLine:{show:!s,lineStyle:{color:"#334155"}},axisLabel:{show:!s,color:"#94a3b8",fontFamily:i.fontFamily||"sans-serif",formatter:b=>{if(i.yAxisLabelFormatter)return i.yAxisLabelFormatter(b);const P=i.yAxisDecimalPlaces!==void 0?i.yAxisDecimalPlaces:O.autoDetectDecimals(o);return O.formatValue(b,P)}}});let T=1,V=-1/0,tt=1/0;o&&o.length>0&&(V=Math.min(...o.map(b=>b.low)),tt=Math.max(...o.map(b=>b.high)));const Y=new Map;t.forEach((b,P)=>{b.paneIndex===0&&!b.collapsed&&o&&o.length>0&&Object.entries(b.plots).forEach(([L,$])=>{const B=`${P}::${L}`,F=["background","barcolor","char"],G=$.options.style==="shape"&&($.options.location==="abovebar"||$.options.location==="belowbar");if(F.includes($.options.style)){Y.has(B)||(Y.set(B,T),T++);return}if($.options.style==="shape"&&!G){Y.has(B)||(Y.set(B,T),T++);return}const H=[];if($.data&&Object.values($.data).forEach(z=>{typeof z=="number"&&!isNaN(z)&&isFinite(z)&&H.push(z)}),H.length>0){const z=Math.min(...H),W=Math.max(...H),et=W-z,Q=tt-V,U=z>=V*.5&&W<=tt*1.5,it=et>Q*.01;U&&it||Y.has(B)||(Y.set(B,T),T++)}})});const _=Y.size>0?T-1:0,K=new Set;Y.forEach((b,P)=>{t.forEach(L=>{Object.entries(L.plots).forEach(([$,B])=>{`${L.id}::${$}`===P&&["background","barcolor","char"].includes(B.options.style)&&K.add(b)})})});for(let b=0;b<_;b++){const P=b+1,L=K.has(P);N.push({position:"left",scale:!L,min:L?0:O.createMinFunction(r),max:L?1:O.createMaxFunction(r),gridIndex:0,show:!1,splitLine:{show:!1},axisLine:{show:!1},axisLabel:{show:!1}})}const ht=T;v.forEach((b,P)=>{N.push({position:"right",scale:!0,min:O.createMinFunction(r),max:O.createMaxFunction(r),gridIndex:P+1,splitLine:{show:!b.isCollapsed,lineStyle:{color:"#334155",opacity:.3}},axisLabel:{show:!b.isCollapsed,color:"#94a3b8",fontFamily:i.fontFamily||"sans-serif",fontSize:10,formatter:L=>{if(i.yAxisLabelFormatter)return i.yAxisLabelFormatter(L);const $=i.yAxisDecimalPlaces!==void 0?i.yAxisDecimalPlaces:O.autoDetectDecimals(o);return O.formatValue(L,$)}},axisLine:{show:!b.isCollapsed,lineStyle:{color:"#334155"}}})});const ot=[];return y&&((i.dataZoom?.zoomOnTouch??!0)&&ot.push({type:"inside",xAxisIndex:D,start:p,end:u}),h==="top"?ot.push({type:"slider",xAxisIndex:D,top:"1%",height:d+"%",start:p,end:u,borderColor:"#334155",textStyle:{color:"#cbd5e1"},brushSelect:!1}):ot.push({type:"slider",xAxisIndex:D,bottom:"1%",height:d+"%",start:p,end:u,borderColor:"#334155",textStyle:{color:"#cbd5e1"},brushSelect:!1})),{grid:I,xAxis:g,yAxis:N,dataZoom:ot,paneLayout:v,mainPaneHeight:x,mainPaneTop:m,pixelToPercent:c,overlayYAxisMap:Y,separatePaneYAxisOffset:ht}}static calculateMaximized(e,t,i){return{grid:[],xAxis:[],yAxis:[],dataZoom:[],paneLayout:[],mainPaneHeight:0,mainPaneTop:0,pixelToPercent:0}}}class Dt{render(e){const{seriesName:t,xAxisIndex:i,yAxisIndex:s,dataArray:n,colorArray:o,plotOptions:c}=e,r="#2962ff";return{name:t,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(l,f)=>{const y=l.dataIndex;if(y===0)return;const h=f.value(1),d=f.value(2);if(h===null||isNaN(h)||d===null||isNaN(d))return;const p=f.coord([y-1,d]),u=f.coord([y,h]);return{type:"line",shape:{x1:p[0],y1:p[1],x2:u[0],y2:u[1]},style:{stroke:o[y]||c.color||r,lineWidth:c.linewidth||1},silent:!0}},data:n.map((l,f)=>[f,l,f>0?n[f-1]:null])}}}class Mt{render(e){const{seriesName:t,xAxisIndex:i,yAxisIndex:s,dataArray:n,colorArray:o,plotOptions:c}=e,r="#2962ff";return{name:t,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(l,f)=>{const y=f.value(0),h=f.value(1);if(isNaN(h)||h===null)return;const d=f.coord([y,h]),p=f.size([1,0])[0];return{type:"line",shape:{x1:d[0]-p/2,y1:d[1],x2:d[0]+p/2,y2:d[1]},style:{stroke:o[l.dataIndex]||c.color||r,lineWidth:c.linewidth||1},silent:!0}},data:n.map((l,f)=>[f,l])}}}class wt{render(e){const{seriesName:t,xAxisIndex:i,yAxisIndex:s,dataArray:n,colorArray:o,plotOptions:c}=e;return{name:t,type:"bar",xAxisIndex:i,yAxisIndex:s,data:n.map((r,l)=>({value:r,itemStyle:o[l]?{color:o[l]}:void 0})),itemStyle:{color:c.color||"#2962ff"}}}}const yt=new Map;function Et(a,e="#00da3c",t="64px"){if(typeof document>"u")return"";const i=`${a}-${e}-${t}`;if(yt.has(i))return yt.get(i);const s=document.createElement("canvas"),n=s.getContext("2d");if(s.width=32,s.height=32,n){n.font="bold "+t+" Arial",n.fillStyle=e,n.textAlign="center",n.textBaseline="middle",n.fillText(a,16,16);const o=s.toDataURL("image/png");return yt.set(i,o),o}return""}class ft{render(e){const{seriesName:t,xAxisIndex:i,yAxisIndex:s,dataArray:n,colorArray:o,plotOptions:c}=e,r="#2962ff",l=c.style;if(l==="char")return{name:t,type:"scatter",xAxisIndex:i,yAxisIndex:s,symbolSize:0,data:n.map((y,h)=>({value:[h,y],itemStyle:{opacity:0}})),silent:!0};const f=n.map((y,h)=>{if(y===null)return null;const d=o[h]||c.color||r,p={value:[h,y],itemStyle:{color:d}};return l==="cross"?(p.symbol=`image://${Et("+",d,"24px")}`,p.symbolSize=16):(p.symbol="circle",p.symbolSize=6),p}).filter(y=>y!==null);return{name:t,type:"scatter",xAxisIndex:i,yAxisIndex:s,data:f}}}class Ct{render(e){const{seriesName:t,xAxisIndex:i,yAxisIndex:s,dataArray:n,colorArray:o,optionsArray:c,plotOptions:r}=e,l="#2962ff",f=r.style==="candle",y=n.map((h,d)=>{if(h===null||!Array.isArray(h)||h.length!==4)return null;const[p,u,m,w]=h,C=c[d]||{},S=C.color||o[d]||r.color||l,x=C.wickcolor||r.wickcolor||S,v=C.bordercolor||r.bordercolor||x;return[d,p,w,m,u,S,x,v]}).filter(h=>h!==null);return{name:t,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(h,d)=>{const p=d.value(0),u=d.value(1),m=d.value(2),w=d.value(3),C=d.value(4),S=d.value(5),x=d.value(6),v=d.value(7);if(isNaN(u)||isNaN(m)||isNaN(w)||isNaN(C))return null;const I=d.coord([p,0])[0],D=d.coord([p,u])[1],g=d.coord([p,m])[1],A=d.coord([p,w])[1],N=d.coord([p,C])[1],k=d.size([1,0])[0]*.6;if(f){const M=Math.min(D,g),T=Math.max(D,g),V=Math.abs(g-D);return{type:"group",children:[{type:"line",shape:{x1:I,y1:N,x2:I,y2:M},style:{stroke:x,lineWidth:1}},{type:"line",shape:{x1:I,y1:T,x2:I,y2:A},style:{stroke:x,lineWidth:1}},{type:"rect",shape:{x:I-k/2,y:M,width:k,height:V||1},style:{fill:S,stroke:v,lineWidth:1}}]}}else{const M=k*.5;return{type:"group",children:[{type:"line",shape:{x1:I,y1:A,x2:I,y2:N},style:{stroke:S,lineWidth:1}},{type:"line",shape:{x1:I-M,y1:D,x2:I,y2:D},style:{stroke:S,lineWidth:1}},{type:"line",shape:{x1:I,y1:g,x2:I+M,y2:g},style:{stroke:S,lineWidth:1}}]}}},data:y}}}class dt{static getShapeSymbol(e){switch(e){case"arrowdown":return"path://M12 24l-12-12h8v-12h8v12h8z";case"arrowup":return"path://M12 0l12 12h-8v12h-8v-12h-8z";case"circle":return"circle";case"cross":return"path://M11 2h2v9h9v2h-9v9h-2v-9h-9v-2h9z";case"diamond":return"diamond";case"flag":return"path://M6 2v20h2v-8h12l-2-6 2-6h-12z";case"labeldown":return"path://M4 2h16a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-6l-2 4l-2 -4h-6a2 2 0 0 1 -2 -2v-12a2 2 0 0 1 2 -2z";case"labelup":return"path://M12 2l2 4h6a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-16a2 2 0 0 1 -2 -2v-12a2 2 0 0 1 2 -2h6z";case"square":return"rect";case"triangledown":return"path://M12 21l-10-18h20z";case"triangleup":return"triangle";case"xcross":return"path://M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z";default:return"circle"}}static getShapeRotation(e){return 0}static getShapeSize(e,t,i){if(t!==void 0&&i!==void 0)return[t,i];let s;switch(e){case"tiny":s=8;break;case"small":s=12;break;case"normal":case"auto":s=16;break;case"large":s=24;break;case"huge":s=32;break;default:s=16}return t!==void 0?[t,t]:i!==void 0?[i,i]:s}static getLabelConfig(e,t){switch(t){case"abovebar":return{position:"top",distance:5};case"belowbar":return{position:"bottom",distance:5};case"top":return{position:"bottom",distance:5};case"bottom":return{position:"top",distance:5};case"absolute":default:return e==="labelup"||e==="labeldown"?{position:"inside",distance:0}:{position:"top",distance:5}}}}class Lt{render(e){const{seriesName:t,xAxisIndex:i,yAxisIndex:s,dataArray:n,colorArray:o,optionsArray:c,plotOptions:r,candlestickData:l}=e,f="#2962ff",y=n.map((h,d)=>{const p=c[d]||{},u=r,m=p.location||u.location||"absolute";if(m!=="absolute"&&!h||h==null)return null;const w=p.color||u.color||f,C=p.shape||u.shape||"circle",S=p.size||u.size||"normal",x=p.text||u.text,v=p.textcolor||u.textcolor||"white",I=p.width||u.width,D=p.height||u.height;let g=h,A=[0,0];m==="abovebar"?(l&&l[d]&&(g=l[d].high),A=[0,"-150%"]):m==="belowbar"?(l&&l[d]&&(g=l[d].low),A=[0,"150%"]):m==="top"?(g=h,A=[0,0]):m==="bottom"&&(g=h,A=[0,0]);const N=dt.getShapeSymbol(C),k=dt.getShapeSize(S,I,D),M=dt.getShapeRotation(C);let T=k;C.includes("label")&&(Array.isArray(k)?T=[k[0]*2.5,k[1]*2.5]:T=k*2.5);const V=dt.getLabelConfig(C,m);return{value:[d,g],symbol:N,symbolSize:T,symbolRotate:M,symbolOffset:A,itemStyle:{color:w},label:{show:!!x,position:V.position,distance:V.distance,formatter:x,color:v,fontSize:10,fontWeight:"bold"}}}).filter(h=>h!==null);return{name:t,type:"scatter",xAxisIndex:i,yAxisIndex:s,data:y}}}class zt{render(e){const{seriesName:t,xAxisIndex:i,yAxisIndex:s,dataArray:n,colorArray:o}=e;return{name:t,type:"custom",xAxisIndex:i,yAxisIndex:s,z:-10,renderItem:(c,r)=>{const l=r.value(0);if(isNaN(l))return;const f=r.coord([l,.5]),y=r.size([1,0])[0],h=c.coordSys,d=f[0]-y/2,p=o[c.dataIndex],u=r.value(1);if(!(!p||u===null||u===void 0||isNaN(u)))return{type:"rect",shape:{x:d,y:h.y,width:y,height:h.height},style:{fill:p,opacity:.3},silent:!0}},data:n.map((c,r)=>[r,c!=null&&!isNaN(c)?.5:null])}}}class Tt{static parseColor(e){if(!e)return{color:"#888888",opacity:.2};const t=e.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)/);if(t){const i=t[1],s=t[2],n=t[3],o=t[4]?parseFloat(t[4]):1;return{color:`rgb(${i},${s},${n})`,opacity:o}}return{color:e,opacity:.3}}}class Nt{render(e){const{seriesName:t,xAxisIndex:i,yAxisIndex:s,plotOptions:n,plotDataArrays:o,indicatorId:c,plotName:r}=e,l=e.dataArray.length,f=n.plot1?`${c}::${n.plot1}`:null,y=n.plot2?`${c}::${n.plot2}`:null;if(!f||!y)return console.warn(`Fill plot "${r}" missing plot1 or plot2 reference`),null;const h=o?.get(f),d=o?.get(y);if(!h||!d)return console.warn(`Fill plot "${r}" references non-existent plots: ${n.plot1}, ${n.plot2}`),null;const{color:p,opacity:u}=Tt.parseColor(n.color||"rgba(128, 128, 128, 0.2)"),m=[];for(let w=0;w<l;w++){const C=h[w],S=d[w],x=w>0?h[w-1]:null,v=w>0?d[w-1]:null;m.push([w,C,S,x,v])}return{name:t,type:"custom",xAxisIndex:i,yAxisIndex:s,z:-5,renderItem:(w,C)=>{const S=w.dataIndex;if(S===0)return null;const x=C.value(1),v=C.value(2),I=C.value(3),D=C.value(4);if(x===null||v===null||I===null||D===null||isNaN(x)||isNaN(v)||isNaN(I)||isNaN(D))return null;const g=C.coord([S-1,I]),A=C.coord([S,x]),N=C.coord([S,v]),k=C.coord([S-1,D]);return{type:"polygon",shape:{points:[g,A,N,k]},style:{fill:p,opacity:u},silent:!0}},data:m}}}var Ft=Object.defineProperty,$t=(a,e,t)=>e in a?Ft(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t,Ot=(a,e,t)=>($t(a,typeof e!="symbol"?e+"":e,t),t);const q=class{static register(e,t){this.renderers.set(e,t)}static get(e){return this.renderers.get(e)||this.renderers.get("line")}};Ot(q,"renderers",new Map),q.register("line",new Dt),q.register("step",new Mt),q.register("histogram",new wt),q.register("columns",new wt),q.register("circles",new ft),q.register("cross",new ft),q.register("char",new ft),q.register("bar",new Ct),q.register("candle",new Ct),q.register("shape",new Lt),q.register("background",new zt),q.register("fill",new Nt);let Zt=q;var Gt=Object.defineProperty,Wt=(a,e,t)=>e in a?Gt(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t,Ht=(a,e,t)=>(Wt(a,typeof e!="symbol"?e+"":e,t),t);const It=class bt{static buildCandlestickSeries(e,t,i){const s=t.upColor||"#00da3c",n=t.downColor||"#ec0000",o=e.map(r=>[r.open,r.close,r.low,r.high]);if(i&&i>o.length){const r=i-o.length;for(let l=0;l<r;l++)o.push(null)}let c;if(t.lastPriceLine?.visible!==!1&&e.length>0){const r=e[e.length-1],l=r.close,f=r.close>=r.open,y=t.lastPriceLine?.color||(f?s:n);let h=t.lastPriceLine?.lineStyle||"dashed";h.startsWith("linestyle_")&&(h=h.replace("linestyle_",""));const d=t.yAxisDecimalPlaces!==void 0?t.yAxisDecimalPlaces:O.autoDetectDecimals(e);c={symbol:["none","none"],precision:d,data:[{yAxis:l,label:{show:!0,position:"end",formatter:p=>t.yAxisLabelFormatter?t.yAxisLabelFormatter(p.value):O.formatValue(p.value,d),color:"#fff",backgroundColor:y,padding:[2,4],borderRadius:2,fontSize:11,fontWeight:"bold"},lineStyle:{color:y,type:h,width:1,opacity:.8}}],animation:!1,silent:!0}}return{type:"candlestick",name:t.title||"Market",data:o,itemStyle:{color:s,color0:n,borderColor:s,borderColor0:n},markLine:c,xAxisIndex:0,yAxisIndex:0,z:5}}static buildIndicatorSeries(e,t,i,s,n=0,o,c,r=1){const l=[],f=new Array(s).fill(null),y=new Map;return e.forEach((h,d)=>{h.collapsed||Object.keys(h.plots).sort((p,u)=>{const m=h.plots[p],w=h.plots[u],C=m.options.style==="fill",S=w.options.style==="fill";return C&&!S?1:!C&&S?-1:0}).forEach(p=>{const u=h.plots[p],m=`${d}::${p}`;let w=0,C=0;const S=u.options.overlay;if(h.paneIndex===0||S===!0)w=0,c&&c.has(m)?C=c.get(m):C=0;else{const g=i.findIndex(A=>A.index===h.paneIndex);g!==-1&&(w=g+1,C=r+g)}const x=new Array(s).fill(null),v=new Array(s).fill(null),I=new Array(s).fill(null);if(u.data?.forEach(g=>{const A=t.get(g.time);if(A!==void 0){const N=g.options?.offset??u.options.offset??0,k=A+n+N;if(k>=0&&k<s){let M=g.value;const T=g.options?.color;(T===null||T==="na"||T==="NaN"||typeof T=="number"&&isNaN(T))&&(M=null),x[k]=M,v[k]=T||u.options.color||bt.DEFAULT_COLOR,I[k]=g.options||{}}}}),y.set(`${d}::${p}`,x),u.options?.style?.startsWith("style_")&&(u.options.style=u.options.style.replace("style_","")),u.options.style==="barcolor"){u.data?.forEach(g=>{const A=t.get(g.time);if(A!==void 0){const N=g.options?.offset??u.options.offset??0,k=A+n+N;if(k>=0&&k<s){const M=g.options?.color||u.options.color||bt.DEFAULT_COLOR;!(M===null||M==="na"||M==="NaN"||typeof M=="number"&&isNaN(M))&&g.value!==null&&g.value!==void 0&&(f[k]=M)}}});return}const D=Zt.get(u.options.style).render({seriesName:m,xAxisIndex:w,yAxisIndex:C,dataArray:x,colorArray:v,optionsArray:I,plotOptions:u.options,candlestickData:o,plotDataArrays:y,indicatorId:d,plotName:p});D&&l.push(D)})}),{series:l,barColors:f}}};Ht(It,"DEFAULT_COLOR","#2962ff");let pt=It;class Rt{static build(e,t,i,s=!1,n=null){const o=[],c=e.pixelToPercent,r=e.mainPaneTop;if(!n||n==="main"){const l=10*c;if(o.push({type:"text",left:"8.5%",top:r+l+"%",z:10,style:{text:t.title||"Market",fill:t.titleColor||"#fff",font:`bold 16px ${t.fontFamily||"sans-serif"}`,textVerticalAlign:"top"}}),t.watermark!==!1){const y=e.mainPaneTop+e.mainPaneHeight;o.push({type:"text",right:"11%",top:y-3+"%",z:10,style:{text:"QFChart",fill:t.fontColor||"#cbd5e1",font:"bold 16px sans-serif",opacity:.1},cursor:"pointer",onclick:()=>{window.open("https://quantforge.org","_blank")}})}const f=[];if(t.controls?.collapse&&f.push({type:"group",children:[{type:"rect",shape:{width:20,height:20,r:2},style:{fill:"#334155",stroke:"#475569",lineWidth:1},onclick:()=>i("main","collapse")},{type:"text",style:{text:s?"+":"\u2212",fill:"#cbd5e1",font:`bold 14px ${t.fontFamily}`,x:10,y:10,textAlign:"center",textVerticalAlign:"middle"},silent:!0}]}),t.controls?.maximize){const y=n==="main",h=t.controls?.collapse?25:0;f.push({type:"group",x:h,children:[{type:"rect",shape:{width:20,height:20,r:2},style:{fill:"#334155",stroke:"#475569",lineWidth:1},onclick:()=>i("main","maximize")},{type:"text",style:{text:y?"\u2750":"\u25A1",fill:"#cbd5e1",font:`14px ${t.fontFamily}`,x:10,y:10,textAlign:"center",textVerticalAlign:"middle"},silent:!0}]})}if(t.controls?.fullscreen){let y=0;t.controls?.collapse&&(y+=25),t.controls?.maximize&&(y+=25),f.push({type:"group",x:y,children:[{type:"rect",shape:{width:20,height:20,r:2},style:{fill:"#334155",stroke:"#475569",lineWidth:1},onclick:()=>i("main","fullscreen")},{type:"text",style:{text:"\u26F6",fill:"#cbd5e1",font:`14px ${t.fontFamily}`,x:10,y:10,textAlign:"center",textVerticalAlign:"middle"},silent:!0}]})}f.length>0&&o.push({type:"group",right:"10.5%",top:r+"%",children:f})}return e.paneLayout.forEach(l=>{if(n&&l.indicatorId!==n)return;o.push({type:"text",left:"8.5%",top:l.top+10*c+"%",z:10,style:{text:l.indicatorId||"",fill:l.titleColor||"#fff",font:`bold 12px ${t.fontFamily||"sans-serif"}`,textVerticalAlign:"top"}});const f=[];if(l.controls?.collapse&&f.push({type:"group",children:[{type:"rect",shape:{width:20,height:20,r:2},style:{fill:"#334155",stroke:"#475569",lineWidth:1},onclick:()=>l.indicatorId&&i(l.indicatorId,"collapse")},{type:"text",style:{text:l.isCollapsed?"+":"\u2212",fill:"#cbd5e1",font:`bold 14px ${t.fontFamily}`,x:10,y:10,textAlign:"center",textVerticalAlign:"middle"},silent:!0}]}),l.controls?.maximize){const y=n===l.indicatorId,h=l.controls?.collapse?25:0;f.push({type:"group",x:h,children:[{type:"rect",shape:{width:20,height:20,r:2},style:{fill:"#334155",stroke:"#475569",lineWidth:1},onclick:()=>l.indicatorId&&i(l.indicatorId,"maximize")},{type:"text",style:{text:y?"\u2750":"\u25A1",fill:"#cbd5e1",font:`14px ${t.fontFamily}`,x:10,y:10,textAlign:"center",textVerticalAlign:"middle"},silent:!0}]})}f.length>0&&o.push({type:"group",right:"10.5%",top:l.top+"%",children:f})}),o}}class jt{static format(e,t){if(!e||e.length===0)return"";const i=t.title||"Market",s=t.upColor||"#00da3c",n=t.downColor||"#ec0000",o=t.fontFamily||"sans-serif",c=e[0].axisValue;let r=`<div style="font-weight: bold; margin-bottom: 5px; color: #cbd5e1; font-family: ${o};">${c}</div>`;const l=e.find(y=>y.seriesType==="candlestick"),f=e.filter(y=>y.seriesType!=="candlestick");if(l){const[y,h,d,p,u]=l.value,m=d>=h?s:n;r+=`
18
+ <div style="margin-bottom: 8px; font-family: ${o};">
19
19
  <div style="display:flex; justify-content:space-between; color:${m}; font-weight:bold;">
20
20
  <span>${i}</span>
21
21
  </div>
22
22
  <div style="display: grid; grid-template-columns: auto auto; gap: 2px 15px; font-size: 0.9em; color: #cbd5e1;">
23
- <span>Open:</span> <span style="text-align: right; color: ${A>=y?s:o}">${y}</span>
24
- <span>High:</span> <span style="text-align: right; color: ${s}">${d}</span>
25
- <span>Low:</span> <span style="text-align: right; color: ${o}">${v}</span>
26
- <span>Close:</span> <span style="text-align: right; color: ${A>=y?s:o}">${A}</span>
23
+ <span>Open:</span> <span style="text-align: right; color: ${d>=h?s:n}">${h}</span>
24
+ <span>High:</span> <span style="text-align: right; color: ${s}">${u}</span>
25
+ <span>Low:</span> <span style="text-align: right; color: ${n}">${p}</span>
26
+ <span>Close:</span> <span style="text-align: right; color: ${d>=h?s:n}">${d}</span>
27
27
  </div>
28
28
  </div>
29
- `}if(S.length>0){p+='<div style="border-top: 1px solid #334155; margin: 5px 0; padding-top: 5px;"></div>';const x={};S.forEach(y=>{const A=y.seriesName.split("::"),v=A.length>1?A[0]:"Unknown",d=A.length>1?A[1]:y.seriesName;x[v]||(x[v]=[]),x[v].push({...y,displayName:d})}),Object.keys(x).forEach(y=>{p+=`
30
- <div style="margin-top: 8px; font-family: ${n};">
31
- <div style="font-weight:bold; color: #fff; margin-bottom: 2px;">${y}</div>
32
- `,x[y].forEach(A=>{let v=A.value;if(Array.isArray(v)&&(v=v[1]),v==null)return;const d=typeof v=="number"?v.toLocaleString(void 0,{maximumFractionDigits:4}):v;p+=`
29
+ `}if(f.length>0){r+='<div style="border-top: 1px solid #334155; margin: 5px 0; padding-top: 5px;"></div>';const y={};f.forEach(h=>{const d=h.seriesName.split("::"),p=d.length>1?d[0]:"Unknown",u=d.length>1?d[1]:h.seriesName;y[p]||(y[p]=[]),y[p].push({...h,displayName:u})}),Object.keys(y).forEach(h=>{r+=`
30
+ <div style="margin-top: 8px; font-family: ${o};">
31
+ <div style="font-weight:bold; color: #fff; margin-bottom: 2px;">${h}</div>
32
+ `,y[h].forEach(d=>{let p=d.value;if(Array.isArray(p)&&(p=p[1]),p==null)return;const u=typeof p=="number"?p.toLocaleString(void 0,{maximumFractionDigits:4}):p;r+=`
33
33
  <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 2px; padding-left: 8px;">
34
- <div>${A.marker} <span style="color: #cbd5e1;">${A.displayName}</span></div>
35
- <div style="font-size: 10px; color: #fff;padding-left:10px;">${d}</div>
36
- </div>`}),p+="</div>"})}return p}}var At=Object.defineProperty,Mt=(r,e,t)=>e in r?At(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,rt=(r,e,t)=>(Mt(r,typeof e!="symbol"?e+"":e,t),t);class Et{constructor(e,t){rt(this,"plugins",new Map),rt(this,"activePluginId",null),rt(this,"context"),rt(this,"toolbarContainer"),rt(this,"tooltipElement",null),rt(this,"hideTimeout",null),this.context=e,this.toolbarContainer=t,this.createTooltip(),this.renderToolbar()}createTooltip(){this.tooltipElement=document.createElement("div"),Object.assign(this.tooltipElement.style,{position:"fixed",display:"none",backgroundColor:"#1e293b",color:"#e2e8f0",padding:"6px 10px",borderRadius:"6px",fontSize:"13px",lineHeight:"1.4",fontWeight:"500",border:"1px solid #334155",zIndex:"9999",pointerEvents:"none",whiteSpace:"nowrap",boxShadow:"0 4px 6px -1px rgba(0, 0, 0, 0.3), 0 2px 4px -1px rgba(0, 0, 0, 0.15)",fontFamily:this.context.getOptions().fontFamily||"sans-serif",transition:"opacity 0.15s ease-in-out, transform 0.15s ease-in-out",opacity:"0",transform:"translateX(-5px)"}),document.body.appendChild(this.tooltipElement)}destroy(){this.tooltipElement&&this.tooltipElement.parentNode&&this.tooltipElement.parentNode.removeChild(this.tooltipElement),this.tooltipElement=null}showTooltip(e,t){if(!this.tooltipElement)return;this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=null);const i=e.getBoundingClientRect();this.tooltipElement.textContent=t,this.tooltipElement.style.display="block";const s=this.tooltipElement.getBoundingClientRect(),o=i.top+(i.height-s.height)/2,n=i.right+10;this.tooltipElement.style.top=`${o}px`,this.tooltipElement.style.left=`${n}px`,requestAnimationFrame(()=>{this.tooltipElement&&(this.tooltipElement.style.opacity="1",this.tooltipElement.style.transform="translateX(0)")})}hideTooltip(){this.tooltipElement&&(this.tooltipElement.style.opacity="0",this.tooltipElement.style.transform="translateX(-5px)",this.hideTimeout&&clearTimeout(this.hideTimeout),this.hideTimeout=setTimeout(()=>{this.tooltipElement&&(this.tooltipElement.style.display="none"),this.hideTimeout=null},150))}register(e){if(this.plugins.has(e.id)){console.warn(`Plugin with id ${e.id} is already registered.`);return}this.plugins.set(e.id,e),e.init(this.context),this.addButton(e)}unregister(e){const t=this.plugins.get(e);t&&(this.activePluginId===e&&this.deactivatePlugin(),t.destroy?.(),this.plugins.delete(e),this.removeButton(e))}activatePlugin(e){if(this.activePluginId===e){this.deactivatePlugin();return}this.activePluginId&&this.deactivatePlugin();const t=this.plugins.get(e);t&&(this.activePluginId=e,this.setButtonActive(e,!0),t.activate?.())}deactivatePlugin(){this.activePluginId&&(this.plugins.get(this.activePluginId)?.deactivate?.(),this.setButtonActive(this.activePluginId,!1),this.activePluginId=null)}renderToolbar(){this.toolbarContainer.innerHTML="",this.toolbarContainer.classList.add("qfchart-toolbar"),this.toolbarContainer.style.display="flex",this.toolbarContainer.style.flexDirection="column",this.toolbarContainer.style.width="40px",this.toolbarContainer.style.backgroundColor=this.context.getOptions().backgroundColor||"#1e293b",this.toolbarContainer.style.borderRight="1px solid #334155",this.toolbarContainer.style.padding="5px",this.toolbarContainer.style.boxSizing="border-box",this.toolbarContainer.style.gap="5px",this.toolbarContainer.style.flexShrink="0"}addButton(e){const t=document.createElement("button");t.id=`qfchart-plugin-btn-${e.id}`,t.style.width="30px",t.style.height="30px",t.style.padding="4px",t.style.border="1px solid transparent",t.style.borderRadius="4px",t.style.backgroundColor="transparent",t.style.cursor="pointer",t.style.color=this.context.getOptions().fontColor||"#cbd5e1",t.style.display="flex",t.style.alignItems="center",t.style.justifyContent="center",e.icon?t.innerHTML=e.icon:t.innerText=(e.name||e.id).substring(0,2).toUpperCase(),t.addEventListener("mouseenter",()=>{this.activePluginId!==e.id&&(t.style.backgroundColor="rgba(255, 255, 255, 0.1)"),this.showTooltip(t,e.name||e.id)}),t.addEventListener("mouseleave",()=>{this.activePluginId!==e.id&&(t.style.backgroundColor="transparent"),this.hideTooltip()}),t.onclick=()=>this.activatePlugin(e.id),this.toolbarContainer.appendChild(t)}removeButton(e){const t=this.toolbarContainer.querySelector(`#qfchart-plugin-btn-${e}`);t&&t.remove()}setButtonActive(e,t){const i=this.toolbarContainer.querySelector(`#qfchart-plugin-btn-${e}`);i&&(t?(i.style.backgroundColor="#2563eb",i.style.color="#ffffff"):(i.style.backgroundColor="transparent",i.style.color=this.context.getOptions().fontColor||"#cbd5e1"))}}var Lt=Object.defineProperty,zt=(r,e,t)=>e in r?Lt(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,J=(r,e,t)=>(zt(r,typeof e!="symbol"?e+"":e,t),t);class Tt{constructor(e){J(this,"context"),J(this,"isEditing",!1),J(this,"currentDrawing",null),J(this,"editingPointIndex",null),J(this,"zr"),J(this,"editGroup",null),J(this,"editLine",null),J(this,"editStartPoint",null),J(this,"editEndPoint",null),J(this,"isMovingShape",!1),J(this,"dragStart",null),J(this,"initialPixelPoints",[]),J(this,"onDrawingMouseDown",t=>{if(this.isEditing)return;const i=this.context.getDrawing(t.id);i&&(this.isEditing=!0,this.isMovingShape=!0,this.currentDrawing=JSON.parse(JSON.stringify(i)),this.dragStart={x:t.x,y:t.y},this.initialPixelPoints=i.points.map(s=>{const o=this.context.coordinateConversion.dataToPixel(s);return o?{x:o.x,y:o.y}:{x:0,y:0}}),this.context.lockChart(),this.createEditGraphic(),this.zr.on("mousemove",this.onMouseMove),this.zr.on("mouseup",this.onMouseUp))}),J(this,"onPointMouseDown",t=>{if(this.isEditing)return;const i=this.context.getDrawing(t.id);i&&(this.isEditing=!0,this.currentDrawing=JSON.parse(JSON.stringify(i)),this.editingPointIndex=t.pointIndex,this.context.lockChart(),this.createEditGraphic(),this.zr.on("mousemove",this.onMouseMove),this.zr.on("mouseup",this.onMouseUp))}),J(this,"onMouseMove",t=>{if(!this.isEditing||!this.currentDrawing)return;const i=t.offsetX,s=t.offsetY;if(this.isMovingShape&&this.dragStart){const o=i-this.dragStart.x,n=s-this.dragStart.y,u={x:this.initialPixelPoints[0].x+o,y:this.initialPixelPoints[0].y+n},p={x:this.initialPixelPoints[1].x+o,y:this.initialPixelPoints[1].y+n};this.editLine.setShape({x1:u.x,y1:u.y,x2:p.x,y2:p.y}),this.editStartPoint.setShape({cx:u.x,cy:u.y}),this.editEndPoint.setShape({cx:p.x,cy:p.y})}else this.editingPointIndex!==null&&(this.editingPointIndex===0?(this.editLine.setShape({x1:i,y1:s}),this.editStartPoint.setShape({cx:i,cy:s})):(this.editLine.setShape({x2:i,y2:s}),this.editEndPoint.setShape({cx:i,cy:s})))}),J(this,"onMouseUp",t=>{this.isEditing&&this.finishEditing(t.offsetX,t.offsetY)}),this.context=e,this.zr=this.context.getChart().getZr(),this.bindEvents()}bindEvents(){this.context.events.on("drawing:point:mousedown",this.onPointMouseDown),this.context.events.on("drawing:mousedown",this.onDrawingMouseDown)}createEditGraphic(){if(!this.currentDrawing)return;this.editGroup=new j.graphic.Group;const e=this.currentDrawing.points[0],t=this.currentDrawing.points[1],i=this.context.coordinateConversion.dataToPixel(e),s=this.context.coordinateConversion.dataToPixel(t);!i||!s||(this.editLine=new j.graphic.Line({shape:{x1:i.x,y1:i.y,x2:s.x,y2:s.y},style:{stroke:this.currentDrawing.style?.color||"#3b82f6",lineWidth:this.currentDrawing.style?.lineWidth||2,lineDash:[4,4]},silent:!0}),this.editStartPoint=new j.graphic.Circle({shape:{cx:i.x,cy:i.y,r:5},style:{fill:"#fff",stroke:"#3b82f6",lineWidth:2},z:1e3}),this.editEndPoint=new j.graphic.Circle({shape:{cx:s.x,cy:s.y,r:5},style:{fill:"#fff",stroke:"#3b82f6",lineWidth:2},z:1e3}),this.editGroup.add(this.editLine),this.editGroup.add(this.editStartPoint),this.editGroup.add(this.editEndPoint),this.zr.add(this.editGroup))}finishEditing(e,t){if(this.currentDrawing){if(this.isMovingShape&&this.dragStart){const i=e-this.dragStart.x,s=t-this.dragStart.y,o=this.initialPixelPoints.map((n,u)=>{const p=n.x+i,h=n.y+s;return this.context.coordinateConversion.pixelToData({x:p,y:h})});o.every(n=>n!==null)&&o[0]&&o[1]&&(this.currentDrawing.points[0]=o[0],this.currentDrawing.points[1]=o[1],o[0].paneIndex!==void 0&&(this.currentDrawing.paneIndex=o[0].paneIndex),this.context.updateDrawing(this.currentDrawing))}else if(this.editingPointIndex!==null){const i=this.context.coordinateConversion.pixelToData({x:e,y:t});i&&(this.currentDrawing.points[this.editingPointIndex]=i,this.editingPointIndex===0&&i.paneIndex!==void 0&&(this.currentDrawing.paneIndex=i.paneIndex),this.context.updateDrawing(this.currentDrawing))}this.isEditing=!1,this.isMovingShape=!1,this.dragStart=null,this.initialPixelPoints=[],this.currentDrawing=null,this.editingPointIndex=null,this.editGroup&&(this.zr.remove(this.editGroup),this.editGroup=null),this.zr.off("mousemove",this.onMouseMove),this.zr.off("mouseup",this.onMouseUp),this.context.unlockChart()}}}var Ft=Object.defineProperty,$t=(r,e,t)=>e in r?Ft(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,Nt=(r,e,t)=>($t(r,typeof e!="symbol"?e+"":e,t),t);class Ot{constructor(){Nt(this,"handlers",new Map)}on(e,t){this.handlers.has(e)||this.handlers.set(e,new Set),this.handlers.get(e).add(t)}off(e,t){const i=this.handlers.get(e);i&&i.delete(t)}emit(e,t){const i=this.handlers.get(e);i&&i.forEach(s=>{try{s(t)}catch(o){console.error(`Error in EventBus handler for ${e}:`,o)}})}clear(){this.handlers.clear()}}var Zt=Object.defineProperty,Gt=(r,e,t)=>e in r?Zt(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,O=(r,e,t)=>(Gt(r,typeof e!="symbol"?e+"":e,t),t);class Wt{constructor(e,t={}){O(this,"chart"),O(this,"options"),O(this,"marketData",[]),O(this,"indicators",new Map),O(this,"timeToIndex",new Map),O(this,"pluginManager"),O(this,"drawingEditor"),O(this,"events",new Ot),O(this,"isMainCollapsed",!1),O(this,"maximizedPaneId",null),O(this,"countdownInterval",null),O(this,"selectedDrawingId",null),O(this,"drawings",[]),O(this,"coordinateConversion",{pixelToData:o=>{const n=this.chart.getOption();if(!n||!n.grid)return null;const u=n.grid.length;for(let p=0;p<u;p++)if(this.chart.containPixel({gridIndex:p},[o.x,o.y])){this.chart.convertFromPixel({seriesIndex:p},[o.x,o.y]);const h=this.chart.convertFromPixel({gridIndex:p},[o.x,o.y]);if(h)return{timeIndex:Math.round(h[0]),value:h[1],paneIndex:p}}return null},dataToPixel:o=>{const n=o.paneIndex||0,u=this.chart.convertToPixel({gridIndex:n},[o.timeIndex,o.value]);return u?{x:u[0],y:u[1]}:null}}),O(this,"upColor","#00da3c"),O(this,"downColor","#ec0000"),O(this,"defaultPadding",0),O(this,"padding"),O(this,"dataIndexOffset",0),O(this,"rootContainer"),O(this,"layoutContainer"),O(this,"toolbarContainer"),O(this,"leftSidebar"),O(this,"rightSidebar"),O(this,"chartContainer"),O(this,"onKeyDown",o=>{(o.key==="Delete"||o.key==="Backspace")&&this.selectedDrawingId&&(this.removeDrawing(this.selectedDrawingId),this.selectedDrawingId=null,this.render())}),O(this,"onFullscreenChange",()=>{this.render()}),O(this,"isLocked",!1),O(this,"lockedState",null),this.rootContainer=e,this.options={title:"Market",height:"600px",backgroundColor:"#1e293b",upColor:"#00da3c",downColor:"#ec0000",fontColor:"#cbd5e1",fontFamily:"sans-serif",padding:.01,dataZoom:{visible:!0,position:"top",height:6},layout:{mainPaneHeight:"50%",gap:13},watermark:!0,...t},this.options.upColor&&(this.upColor=this.options.upColor),this.options.downColor&&(this.downColor=this.options.downColor),this.padding=this.options.padding!==void 0?this.options.padding:this.defaultPadding,this.options.height&&(typeof this.options.height=="number"?this.rootContainer.style.height=`${this.options.height}px`:this.rootContainer.style.height=this.options.height),this.rootContainer.innerHTML="",this.layoutContainer=document.createElement("div"),this.layoutContainer.style.display="flex",this.layoutContainer.style.width="100%",this.layoutContainer.style.height="100%",this.layoutContainer.style.overflow="hidden",this.rootContainer.appendChild(this.layoutContainer),this.leftSidebar=document.createElement("div"),this.leftSidebar.style.display="none",this.leftSidebar.style.width="250px",this.leftSidebar.style.flexShrink="0",this.leftSidebar.style.overflowY="auto",this.leftSidebar.style.backgroundColor=this.options.backgroundColor||"#1e293b",this.leftSidebar.style.borderRight="1px solid #334155",this.leftSidebar.style.padding="10px",this.leftSidebar.style.boxSizing="border-box",this.leftSidebar.style.color="#cbd5e1",this.leftSidebar.style.fontSize="12px",this.leftSidebar.style.fontFamily=this.options.fontFamily||"sans-serif",this.layoutContainer.appendChild(this.leftSidebar),this.toolbarContainer=document.createElement("div"),this.layoutContainer.appendChild(this.toolbarContainer),this.chartContainer=document.createElement("div"),this.chartContainer.style.flexGrow="1",this.chartContainer.style.height="100%",this.chartContainer.style.overflow="hidden",this.layoutContainer.appendChild(this.chartContainer),this.rightSidebar=document.createElement("div"),this.rightSidebar.style.display="none",this.rightSidebar.style.width="250px",this.rightSidebar.style.flexShrink="0",this.rightSidebar.style.overflowY="auto",this.rightSidebar.style.backgroundColor=this.options.backgroundColor||"#1e293b",this.rightSidebar.style.borderLeft="1px solid #334155",this.rightSidebar.style.padding="10px",this.rightSidebar.style.boxSizing="border-box",this.rightSidebar.style.color="#cbd5e1",this.rightSidebar.style.fontSize="12px",this.rightSidebar.style.fontFamily=this.options.fontFamily||"sans-serif",this.layoutContainer.appendChild(this.rightSidebar),this.chart=j.init(this.chartContainer),this.pluginManager=new Et(this,this.toolbarContainer),this.drawingEditor=new Tt(this),this.chart.on("dataZoom",o=>{this.events.emit("chart:dataZoom",o);const n=this.options.databox?.triggerOn,u=this.options.databox?.position;n==="click"&&u==="floating"&&this.chart.dispatchAction({type:"hideTip"})}),this.chart.on("finished",o=>this.events.emit("chart:updated",o)),this.chart.getZr().on("mousedown",o=>this.events.emit("mouse:down",o)),this.chart.getZr().on("mousemove",o=>this.events.emit("mouse:move",o)),this.chart.getZr().on("mouseup",o=>this.events.emit("mouse:up",o)),this.chart.getZr().on("click",o=>this.events.emit("mouse:click",o));const i=this.chart.getZr(),s=i.setCursorStyle;i.setCursorStyle=function(o){o==="grab"&&(o="crosshair"),s.call(this,o)},this.bindDrawingEvents(),window.addEventListener("resize",this.resize.bind(this)),document.addEventListener("fullscreenchange",this.onFullscreenChange),document.addEventListener("keydown",this.onKeyDown)}bindDrawingEvents(){let e=null;const t=i=>{if(!i||i.componentType!=="series"||!i.seriesName?.startsWith("drawings"))return null;i.seriesIndex;const s=i.seriesName.match(/drawings-pane-(\d+)/);if(!s)return null;const o=parseInt(s[1]),n=this.drawings.filter(p=>(p.paneIndex||0)===o)[i.dataIndex];if(!n)return null;const u=i.event?.target?.name;return{drawing:n,targetName:u,paneIdx:o}};this.chart.on("mouseover",i=>{const s=t(i);if(!s)return;const o=i.event?.target?.parent;if(o){const n=s.drawing.id===this.selectedDrawingId;e&&(clearTimeout(e),e=null),n||o.children().forEach(u=>{u.name&&u.name.startsWith("point")&&u.attr("style",{opacity:1})})}if(s.targetName==="line")this.events.emit("drawing:hover",{id:s.drawing.id,type:s.drawing.type}),this.chart.getZr().setCursorStyle("move");else if(s.targetName?.startsWith("point")){const n=s.targetName==="point-start"?0:1;this.events.emit("drawing:point:hover",{id:s.drawing.id,pointIndex:n}),this.chart.getZr().setCursorStyle("pointer")}}),this.chart.on("mouseout",i=>{const s=t(i);if(!s)return;const o=i.event?.target?.parent;if(s.drawing.id!==this.selectedDrawingId){if(e=setTimeout(()=>{if(o){if(this.selectedDrawingId===s.drawing.id)return;o.children().forEach(n=>{n.name&&n.name.startsWith("point")&&n.attr("style",{opacity:0})})}},50),s.targetName==="line")this.events.emit("drawing:mouseout",{id:s.drawing.id});else if(s.targetName?.startsWith("point")){const n=s.targetName==="point-start"?0:1;this.events.emit("drawing:point:mouseout",{id:s.drawing.id,pointIndex:n})}this.chart.getZr().setCursorStyle("default")}}),this.chart.on("mousedown",i=>{const s=t(i);if(!s)return;const o=i.event?.event||i.event,n=o?.offsetX,u=o?.offsetY;if(s.targetName==="line")this.events.emit("drawing:mousedown",{id:s.drawing.id,x:n,y:u});else if(s.targetName?.startsWith("point")){const p=s.targetName==="point-start"?0:1;this.events.emit("drawing:point:mousedown",{id:s.drawing.id,pointIndex:p,x:n,y:u})}}),this.chart.on("click",i=>{const s=t(i);if(s){if(this.selectedDrawingId!==s.drawing.id&&(this.selectedDrawingId=s.drawing.id,this.events.emit("drawing:selected",{id:s.drawing.id}),this.render()),s.targetName==="line")this.events.emit("drawing:click",{id:s.drawing.id});else if(s.targetName?.startsWith("point")){const o=s.targetName==="point-start"?0:1;this.events.emit("drawing:point:click",{id:s.drawing.id,pointIndex:o})}}}),this.chart.getZr().on("click",i=>{i.target||this.selectedDrawingId&&(this.events.emit("drawing:deselected",{id:this.selectedDrawingId}),this.selectedDrawingId=null,this.render())})}getChart(){return this.chart}getMarketData(){return this.marketData}getTimeToIndex(){return this.timeToIndex}getOptions(){return this.options}disableTools(){this.pluginManager.deactivatePlugin()}registerPlugin(e){this.pluginManager.register(e)}addDrawing(e){this.drawings.push(e),this.render()}removeDrawing(e){const t=this.drawings.findIndex(i=>i.id===e);if(t!==-1){const i=this.drawings[t];this.drawings.splice(t,1),this.events.emit("drawing:deleted",{id:i.id}),this.render()}}getDrawing(e){return this.drawings.find(t=>t.id===e)}updateDrawing(e){const t=this.drawings.findIndex(i=>i.id===e.id);t!==-1&&(this.drawings[t]=e,this.render())}lockChart(){if(this.isLocked)return;this.isLocked=!0;const e=this.chart.getOption();this.chart.setOption({dataZoom:e.dataZoom.map(t=>({...t,disabled:!0})),tooltip:{show:!1}})}unlockChart(){if(!this.isLocked)return;this.isLocked=!1;const e=this.chart.getOption();(this.options.dataZoom||{}).visible,e.dataZoom&&this.chart.setOption({dataZoom:e.dataZoom.map(t=>({...t,disabled:!1})),tooltip:{show:!0}})}setZoom(e,t){this.chart.dispatchAction({type:"dataZoom",start:e,end:t})}setMarketData(e){this.marketData=e,this.rebuildTimeIndex(),this.render()}updateData(e){if(e.length===0)return;const t=new Map;this.marketData.forEach(d=>{t.set(d.time,d)}),e.forEach(d=>{t.has(d.time),t.set(d.time,d)}),this.marketData=Array.from(t.values()).sort((d,m)=>d.time-m.time),this.rebuildTimeIndex();const i=this.dataIndexOffset,s=ct.buildCandlestickSeries(this.marketData,this.options),o={value:[NaN,NaN,NaN,NaN],itemStyle:{opacity:0}},n=[...Array(i).fill(o),...s.data,...Array(i).fill(o)],u=[...Array(i).fill(""),...this.marketData.map(d=>new Date(d.time).toLocaleString()),...Array(i).fill("")],p=this.chart.getOption(),h=gt.calculate(this.chart.getHeight(),this.indicators,this.options,this.isMainCollapsed,this.maximizedPaneId,this.marketData),S=[...Array(i).fill(null),...this.marketData,...Array(i).fill(null)],{series:x,barColors:y}=ct.buildIndicatorSeries(this.indicators,this.timeToIndex,h.paneLayout,u.length,i,S,h.overlayYAxisMap,h.separatePaneYAxisOffset),A=n.map((d,m)=>y[m]?{value:d.value||d,itemStyle:{color:y[m],color0:y[m],borderColor:y[m],borderColor0:y[m]}}:d),v={xAxis:p.xAxis.map((d,m)=>({data:u})),series:[{data:A,markLine:s.markLine},...x.map(d=>{const m={data:d.data};return d.renderItem&&(m.renderItem=d.renderItem),m})]};this.chart.setOption(v,{notMerge:!1}),this.startCountdown()}startCountdown(){if(this.stopCountdown(),!this.options.lastPriceLine?.showCountdown||!this.options.interval||this.marketData.length===0)return;const e=()=>{if(this.marketData.length===0)return;const t=this.marketData[this.marketData.length-1].time+(this.options.interval||0),i=Date.now(),s=t-i;if(s<=0)return;const o=Math.abs(s),n=Math.floor(o/36e5),u=Math.floor(o%36e5/6e4),p=Math.floor(o%6e4/1e3),h=`${n>0?n.toString().padStart(2,"0")+":":""}${u.toString().padStart(2,"0")}:${p.toString().padStart(2,"0")}`,S=this.chart.getOption();if(!S||!S.series)return;const x=S.series.findIndex(M=>M.type==="candlestick");if(x===-1)return;const y=S.series[x];if(!y.markLine||!y.markLine.data||!y.markLine.data[0])return;const A=y.markLine.data[0];A.label.formatter;const v=A.yAxis;let d="";if(this.options.yAxisLabelFormatter)d=this.options.yAxisLabelFormatter(v);else{const M=this.options.yAxisDecimalPlaces!==void 0?this.options.yAxisDecimalPlaces:2;d=typeof v=="number"?v.toFixed(M):v}const m=`${d}
37
- ${h}`;this.chart.setOption({series:[{name:this.options.title||"Market",markLine:{data:[{...A,label:{...A.label,formatter:m}}]}}]})};e(),this.countdownInterval=setInterval(e,1e3)}stopCountdown(){this.countdownInterval&&(clearInterval(this.countdownInterval),this.countdownInterval=null)}addIndicator(e,t,i={}){const s=i.overlay!==void 0?i.overlay:i.isOverlay??!1;let o=0;if(!s){let u=0;this.indicators.forEach(p=>{p.paneIndex>u&&(u=p.paneIndex)}),o=u+1}const n=new wt(e,t,o,{height:i.height,collapsed:!1,titleColor:i.titleColor,controls:i.controls});return this.indicators.set(e,n),this.render(),n}setIndicator(e,t,i=!1){this.addIndicator(e,{[e]:t},{overlay:i})}removeIndicator(e){this.indicators.delete(e),this.render()}toggleIndicator(e,t="collapse"){if(t==="fullscreen"){document.fullscreenElement?document.exitFullscreen():this.rootContainer.requestFullscreen();return}if(t==="maximize"){this.maximizedPaneId===e?this.maximizedPaneId=null:this.maximizedPaneId=e,this.render();return}if(e==="main"){this.isMainCollapsed=!this.isMainCollapsed,this.render();return}const i=this.indicators.get(e);i&&(i.toggleCollapse(),this.render())}resize(){this.chart.resize()}destroy(){this.stopCountdown(),window.removeEventListener("resize",this.resize.bind(this)),document.removeEventListener("fullscreenchange",this.onFullscreenChange),document.removeEventListener("keydown",this.onKeyDown),this.pluginManager.deactivatePlugin(),this.pluginManager.destroy(),this.chart.dispose()}rebuildTimeIndex(){this.timeToIndex.clear(),this.marketData.forEach((i,s)=>{this.timeToIndex.set(i.time,s)});const e=this.marketData.length,t=Math.ceil(e*this.padding);this.dataIndexOffset=t}render(){if(this.marketData.length===0)return;let e=null;try{const g=this.chart.getOption();if(g&&g.dataZoom&&g.dataZoom.length>0){const I=g.dataZoom.find(E=>E.type==="slider"||E.type==="inside");I&&(e={start:I.start,end:I.end})}}catch{}const t=this.options.databox?.position,i=this.leftSidebar.style.display,s=this.rightSidebar.style.display,o=t==="left"?"block":"none",n=t==="right"?"block":"none";(i!==o||s!==n)&&(this.leftSidebar.style.display=o,this.rightSidebar.style.display=n,this.chart.resize());const u=this.dataIndexOffset,p=[...Array(u).fill(""),...this.marketData.map(g=>new Date(g.time).toLocaleString()),...Array(u).fill("")],h=gt.calculate(this.chart.getHeight(),this.indicators,this.options,this.isMainCollapsed,this.maximizedPaneId,this.marketData);if(!e&&h.dataZoom&&this.marketData.length>0){const g=this.marketData.length,I=p.length,E=u/I,z=g/I;h.dataZoom.forEach(D=>{if(D.start!==void 0){const B=D.start/100,W=E+B*z;D.start=W*100}if(D.end!==void 0){const B=D.end/100,W=E+B*z;D.end=W*100}})}e&&h.dataZoom&&h.dataZoom.forEach(g=>{g.start=e.start,g.end=e.end}),h.xAxis.forEach(g=>{g.data=p,g.boundaryGap=!1});const S=ct.buildCandlestickSeries(this.marketData,this.options),x={value:[NaN,NaN,NaN,NaN],itemStyle:{opacity:0}};S.data=[...Array(u).fill(x),...S.data,...Array(u).fill(x)];const y=[...Array(u).fill(null),...this.marketData,...Array(u).fill(null)],{series:A,barColors:v}=ct.buildIndicatorSeries(this.indicators,this.timeToIndex,h.paneLayout,p.length,u,y,h.overlayYAxisMap,h.separatePaneYAxisOffset);S.data=S.data.map((g,I)=>v[I]?{value:g.value||g,itemStyle:{color:v[I],color0:v[I],borderColor:v[I],borderColor0:v[I]}}:g);const d=Pt.build(h,this.options,this.toggleIndicator.bind(this),this.isMainCollapsed,this.maximizedPaneId),m=new Map;this.drawings.forEach(g=>{const I=g.paneIndex||0;m.has(I)||m.set(I,[]),m.get(I).push(g)});const M=[];m.forEach((g,I)=>{M.push({type:"custom",name:`drawings-pane-${I}`,xAxisIndex:I,yAxisIndex:I,clip:!0,renderItem:(E,z)=>{const D=g[E.dataIndex];if(!D)return;const B=D.points[0],W=D.points[1];if(!B||!W)return;const X=z.coord([B.timeIndex,B.value]),Z=z.coord([W.timeIndex,W.value]),_=D.id===this.selectedDrawingId;if(D.type==="line")return{type:"group",children:[{type:"line",name:"line",shape:{x1:X[0],y1:X[1],x2:Z[0],y2:Z[1]},style:{stroke:D.style?.color||"#3b82f6",lineWidth:D.style?.lineWidth||2}},{type:"circle",name:"point-start",shape:{cx:X[0],cy:X[1],r:4},style:{fill:"#fff",stroke:D.style?.color||"#3b82f6",lineWidth:1,opacity:_?1:0}},{type:"circle",name:"point-end",shape:{cx:Z[0],cy:Z[1],r:4},style:{fill:"#fff",stroke:D.style?.color||"#3b82f6",lineWidth:1,opacity:_?1:0}}]};if(D.type==="fibonacci"){const st=X[0],Q=X[1],it=Z[0],c=Z[1],a=Math.min(st,it),w=Math.max(st,it),k=w-a,b=c-Q,l=[0,.236,.382,.5,.618,.786,1],f=["#787b86","#f44336","#ff9800","#4caf50","#2196f3","#00bcd4","#787b86"],P=[];P.push({type:"line",name:"line",shape:{x1:st,y1:Q,x2:it,y2:c},style:{stroke:"#999",lineWidth:1,lineDash:[4,4]}}),P.push({type:"circle",name:"point-start",shape:{cx:st,cy:Q,r:4},style:{fill:"#fff",stroke:D.style?.color||"#3b82f6",lineWidth:1,opacity:_?1:0},z:100}),P.push({type:"circle",name:"point-end",shape:{cx:it,cy:c,r:4},style:{fill:"#fff",stroke:D.style?.color||"#3b82f6",lineWidth:1,opacity:_?1:0},z:100}),l.forEach((C,N)=>{const L=c-b*C,F=f[N%f.length];P.push({type:"line",name:"fib-line",shape:{x1:a,y1:L,x2:w,y2:L},style:{stroke:F,lineWidth:1},silent:!0});const G=D.points[0].value,R=D.points[1].value,V=R-G,Y=R-V*C;if(P.push({type:"text",style:{text:`${C} (${Y.toFixed(2)})`,x:a+5,y:L-10,fill:F,fontSize:10},silent:!0}),N<l.length-1){const K=l[N+1],dt=c-b*K,ft=Math.abs(dt-L),yt=Math.min(L,dt);P.push({type:"rect",shape:{x:a,y:yt,width:k,height:ft},style:{fill:f[(N+1)%f.length],opacity:.1},silent:!0})}});const T=[],H=[];return l.forEach((C,N)=>{const L=c-b*C,F=f[N%f.length];H.push({type:"line",shape:{x1:a,y1:L,x2:w,y2:L},style:{stroke:F,lineWidth:1},silent:!0});const G=D.points[0].value,R=D.points[1].value,V=R-G,Y=R-V*C;if(H.push({type:"text",style:{text:`${C} (${Y.toFixed(2)})`,x:a+5,y:L-10,fill:F,fontSize:10},silent:!0}),N<l.length-1){const K=l[N+1],dt=c-b*K,ft=Math.abs(dt-L),yt=Math.min(L,dt);T.push({type:"rect",name:"line",shape:{x:a,y:yt,width:k,height:ft},style:{fill:f[(N+1)%f.length],opacity:.1}})}}),{type:"group",children:[...T,...H,{type:"line",name:"line",shape:{x1:st,y1:Q,x2:it,y2:c},style:{stroke:"#999",lineWidth:1,lineDash:[4,4]}},{type:"circle",name:"point-start",shape:{cx:st,cy:Q,r:4},style:{fill:"#fff",stroke:D.style?.color||"#3b82f6",lineWidth:1,opacity:_?1:0},z:100},{type:"circle",name:"point-end",shape:{cx:it,cy:c,r:4},style:{fill:"#fff",stroke:D.style?.color||"#3b82f6",lineWidth:1,opacity:_?1:0},z:100}]}}},data:g.map(E=>[E.points[0].timeIndex,E.points[0].value,E.points[1].timeIndex,E.points[1].value]),z:100,silent:!1})});const $=g=>{const I=Dt.format(g,this.options),E=this.options.databox?.position;return E==="left"?(this.leftSidebar.innerHTML=I,""):E==="right"?(this.rightSidebar.innerHTML=I,""):this.options.databox?`<div style="min-width: 200px;">${I}</div>`:""},q={backgroundColor:this.options.backgroundColor,animation:!1,legend:{show:!1},tooltip:{show:!0,showContent:!!this.options.databox,trigger:"axis",triggerOn:this.options.databox?.triggerOn??"mousemove",axisPointer:{type:"cross",label:{backgroundColor:"#475569"}},backgroundColor:"rgba(30, 41, 59, 0.9)",borderWidth:1,borderColor:"#334155",padding:10,textStyle:{color:"#fff",fontFamily:this.options.fontFamily||"sans-serif"},formatter:$,extraCssText:t!=="floating"&&t!==void 0?"display: none !important;":void 0,position:(g,I,E,z,D)=>{if(this.options.databox?.position==="floating"){const B={top:10};return B[["left","right"][+(g[0]<D.viewSize[0]/2)]]=30,B}return null}},axisPointer:{link:{xAxisIndex:"all"},label:{backgroundColor:"#475569"}},graphic:d,grid:h.grid,xAxis:h.xAxis,yAxis:h.yAxis,dataZoom:h.dataZoom,series:[S,...A,...M]};this.chart.setOption(q,!0)}}var Ht=Object.defineProperty,jt=(r,e,t)=>e in r?Ht(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,ht=(r,e,t)=>(jt(r,typeof e!="symbol"?e+"":e,t),t);class pt{constructor(e){ht(this,"id"),ht(this,"name"),ht(this,"icon"),ht(this,"context"),ht(this,"eventListeners",[]),this.id=e.id,this.name=e.name,this.icon=e.icon}init(e){this.context=e,this.onInit()}onInit(){}activate(){this.onActivate(),this.context.events.emit("plugin:activated",this.id)}onActivate(){}deactivate(){this.onDeactivate(),this.context.events.emit("plugin:deactivated",this.id)}onDeactivate(){}destroy(){this.removeAllListeners(),this.onDestroy()}onDestroy(){}on(e,t){this.context.events.on(e,t),this.eventListeners.push({event:e,handler:t})}off(e,t){this.context.events.off(e,t),this.eventListeners=this.eventListeners.filter(i=>i.event!==e||i.handler!==t)}removeAllListeners(){this.eventListeners.forEach(({event:e,handler:t})=>{this.context.events.off(e,t)}),this.eventListeners=[]}get chart(){return this.context.getChart()}get marketData(){return this.context.getMarketData()}}var Rt=Object.defineProperty,Yt=(r,e,t)=>e in r?Rt(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,U=(r,e,t)=>(Yt(r,typeof e!="symbol"?e+"":e,t),t);class Bt extends pt{constructor(e){super({id:"measure",name:e?.name||"Measure",icon:e?.icon||'<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e3e3e3"><path d="M160-240q-33 0-56.5-23.5T80-320v-320q0-33 23.5-56.5T160-720h640q33 0 56.5 23.5T880-640v320q0 33-23.5 56.5T800-240H160Zm0-80h640v-320H680v160h-80v-160h-80v160h-80v-160h-80v160h-80v-160H160v320Zm120-160h80-80Zm160 0h80-80Zm160 0h80-80Zm-120 0Z"/></svg>'}),U(this,"zr"),U(this,"state","idle"),U(this,"startPoint",null),U(this,"endPoint",null),U(this,"group",null),U(this,"rect",null),U(this,"labelRect",null),U(this,"labelText",null),U(this,"lineV",null),U(this,"lineH",null),U(this,"arrowStart",null),U(this,"arrowEnd",null),U(this,"onMouseDown",()=>{this.state==="finished"&&this.removeGraphic()}),U(this,"onChartInteraction",()=>{this.group&&this.removeGraphic()}),U(this,"onClick",t=>{this.state==="idle"?(this.state="drawing",this.startPoint=[t.offsetX,t.offsetY],this.endPoint=[t.offsetX,t.offsetY],this.initGraphic(),this.updateGraphic()):this.state==="drawing"&&(this.state="finished",this.endPoint=[t.offsetX,t.offsetY],this.updateGraphic(),this.context.disableTools(),this.enableClearListeners())}),U(this,"clearHandlers",{}),U(this,"onMouseMove",t=>{this.state==="drawing"&&(this.endPoint=[t.offsetX,t.offsetY],this.updateGraphic())})}onInit(){this.zr=this.chart.getZr()}onActivate(){this.state="idle",this.chart.getZr().setCursorStyle("crosshair"),this.zr.on("click",this.onClick),this.zr.on("mousemove",this.onMouseMove)}onDeactivate(){this.state="idle",this.chart.getZr().setCursorStyle("default"),this.zr.off("click",this.onClick),this.zr.off("mousemove",this.onMouseMove),this.disableClearListeners(),this.state==="drawing"&&this.removeGraphic()}onDestroy(){this.removeGraphic()}enableClearListeners(){const e=()=>{this.removeGraphic()};setTimeout(()=>{this.zr.on("click",e)},10),this.zr.on("mousedown",this.onMouseDown),this.context.events.on("chart:dataZoom",this.onChartInteraction),this.clearHandlers={click:e,mousedown:this.onMouseDown,dataZoom:this.onChartInteraction}}disableClearListeners(){this.clearHandlers.click&&this.zr.off("click",this.clearHandlers.click),this.clearHandlers.mousedown&&this.zr.off("mousedown",this.clearHandlers.mousedown),this.clearHandlers.dataZoom&&this.context.events.off("chart:dataZoom",this.clearHandlers.dataZoom),this.clearHandlers={}}initGraphic(){this.group||(this.group=new j.graphic.Group,this.rect=new j.graphic.Rect({shape:{x:0,y:0,width:0,height:0},style:{fill:"rgba(0,0,0,0)",stroke:"transparent",lineWidth:0},z:100}),this.lineV=new j.graphic.Line({shape:{x1:0,y1:0,x2:0,y2:0},style:{stroke:"#fff",lineWidth:1,lineDash:[4,4]},z:101}),this.lineH=new j.graphic.Line({shape:{x1:0,y1:0,x2:0,y2:0},style:{stroke:"#fff",lineWidth:1,lineDash:[4,4]},z:101}),this.arrowStart=new j.graphic.Polygon({shape:{points:[[0,0],[-5,10],[5,10]]},style:{fill:"#fff"},z:102}),this.arrowEnd=new j.graphic.Polygon({shape:{points:[[0,0],[-5,-10],[5,-10]]},style:{fill:"#fff"},z:102}),this.labelRect=new j.graphic.Rect({shape:{x:0,y:0,width:0,height:0,r:4},style:{fill:"transparent",stroke:"transparent",lineWidth:0,shadowBlur:5,shadowColor:"rgba(0,0,0,0.3)"},z:102}),this.labelText=new j.graphic.Text({style:{x:0,y:0,text:"",fill:"#fff",font:"12px sans-serif",align:"center",verticalAlign:"middle"},z:103}),this.group.add(this.rect),this.group.add(this.lineV),this.group.add(this.lineH),this.group.add(this.arrowStart),this.group.add(this.arrowEnd),this.group.add(this.labelRect),this.group.add(this.labelText),this.zr.add(this.group))}removeGraphic(){this.group&&(this.zr.remove(this.group),this.group=null,this.disableClearListeners())}updateGraphic(){if(!this.startPoint||!this.endPoint||!this.group)return;const[e,t]=this.startPoint,[i,s]=this.endPoint,o=this.context.coordinateConversion.pixelToData({x:e,y:t}),n=this.context.coordinateConversion.pixelToData({x:i,y:s});if(!o||!n)return;const u=Math.round(o.timeIndex),p=Math.round(n.timeIndex),h=o.value,S=n.value,x=p-u,y=S-h,A=y/h*100,v=y>=0,d=v?"rgba(33, 150, 243, 0.2)":"rgba(236, 0, 0, 0.2)",m=v?"#2196F3":"#ec0000";this.rect.setShape({x:Math.min(e,i),y:Math.min(t,s),width:Math.abs(i-e),height:Math.abs(s-t)}),this.rect.setStyle({fill:d});const M=(e+i)/2,$=(t+s)/2;this.lineV.setShape({x1:M,y1:t,x2:M,y2:s}),this.lineV.setStyle({stroke:m}),this.lineH.setShape({x1:e,y1:$,x2:i,y2:$}),this.lineH.setStyle({stroke:m});const q=Math.min(t,s),g=Math.max(t,s);this.arrowStart.setStyle({fill:"none"}),this.arrowEnd.setStyle({fill:"none"}),v?(this.arrowStart.setShape({points:[[M,q],[M-4,q+6],[M+4,q+6]]}),this.arrowStart.setStyle({fill:m})):(this.arrowEnd.setShape({points:[[M,g],[M-4,g-6],[M+4,g-6]]}),this.arrowEnd.setStyle({fill:m}));const I=[`${y.toFixed(2)} (${A.toFixed(2)}%)`,`${x} bars, ${(x*0).toFixed(0)}d`].join(`
38
- `),E=140,z=40,D=Math.max(t,s),B=Math.min(t,s);let W=(e+i)/2-E/2,X=D+10;const Z=this.chart.getHeight();X+z>Z&&(X=B-z-10),this.labelRect.setShape({x:W,y:X,width:E,height:z}),this.labelRect.setStyle({fill:"#1e293b",stroke:m,lineWidth:1}),this.labelText.setStyle({x:W+E/2,y:X+z/2,text:I,fill:"#fff"})}}var qt=Object.defineProperty,Xt=(r,e,t)=>e in r?qt(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,et=(r,e,t)=>(Xt(r,typeof e!="symbol"?e+"":e,t),t);class Ut extends pt{constructor(e){super({id:"trend-line",name:e?.name||"Trend Line",icon:e?.icon||'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="2" y1="22" x2="22" y2="2" /></svg>'}),et(this,"zr"),et(this,"state","idle"),et(this,"startPoint",null),et(this,"endPoint",null),et(this,"group",null),et(this,"line",null),et(this,"startCircle",null),et(this,"endCircle",null),et(this,"onMouseDown",()=>{}),et(this,"onChartInteraction",()=>{}),et(this,"onClick",t=>{if(this.state==="idle")this.state="drawing",this.startPoint=[t.offsetX,t.offsetY],this.endPoint=[t.offsetX,t.offsetY],this.initGraphic(),this.updateGraphic();else if(this.state==="drawing"){if(this.state="finished",this.endPoint=[t.offsetX,t.offsetY],this.updateGraphic(),this.startPoint&&this.endPoint){const i=this.context.coordinateConversion.pixelToData({x:this.startPoint[0],y:this.startPoint[1]}),s=this.context.coordinateConversion.pixelToData({x:this.endPoint[0],y:this.endPoint[1]});if(i&&s){const o=i.paneIndex||0;this.context.addDrawing({id:`line-${Date.now()}`,type:"line",points:[i,s],paneIndex:o,style:{color:"#3b82f6",lineWidth:2}})}}this.removeGraphic(),this.context.disableTools()}}),et(this,"clearHandlers",{}),et(this,"onMouseMove",t=>{this.state==="drawing"&&(this.endPoint=[t.offsetX,t.offsetY],this.updateGraphic())})}onInit(){this.zr=this.chart.getZr()}onActivate(){this.state="idle",this.chart.getZr().setCursorStyle("crosshair"),this.zr.on("click",this.onClick),this.zr.on("mousemove",this.onMouseMove)}onDeactivate(){this.state="idle",this.chart.getZr().setCursorStyle("default"),this.zr.off("click",this.onClick),this.zr.off("mousemove",this.onMouseMove),this.disableClearListeners(),this.state==="drawing"&&this.removeGraphic()}onDestroy(){this.removeGraphic()}saveDataCoordinates(){}updateGraphicFromData(){}enableClearListeners(){}disableClearListeners(){}initGraphic(){this.group||(this.group=new j.graphic.Group,this.line=new j.graphic.Line({shape:{x1:0,y1:0,x2:0,y2:0},style:{stroke:"#3b82f6",lineWidth:2},z:100}),this.startCircle=new j.graphic.Circle({shape:{cx:0,cy:0,r:4},style:{fill:"#fff",stroke:"#3b82f6",lineWidth:1},z:101}),this.endCircle=new j.graphic.Circle({shape:{cx:0,cy:0,r:4},style:{fill:"#fff",stroke:"#3b82f6",lineWidth:1},z:101}),this.group.add(this.line),this.group.add(this.startCircle),this.group.add(this.endCircle),this.zr.add(this.group))}removeGraphic(){this.group&&(this.zr.remove(this.group),this.group=null,this.disableClearListeners())}updateGraphic(){if(!this.startPoint||!this.endPoint||!this.group)return;const[e,t]=this.startPoint,[i,s]=this.endPoint;this.line.setShape({x1:e,y1:t,x2:i,y2:s}),this.startCircle.setShape({cx:e,cy:t}),this.endCircle.setShape({cx:i,cy:s})}}var Vt=Object.defineProperty,Jt=(r,e,t)=>e in r?Vt(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,nt=(r,e,t)=>(Jt(r,typeof e!="symbol"?e+"":e,t),t);class Qt extends pt{constructor(e={}){super({id:"fibonacci-tool",name:e.name||"Fibonacci Retracement",icon:e.icon||'<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e3e3e3"><path d="M120-80v-80h720v80H120Zm0-240v-80h720v80H120Zm0-240v-80h720v80H120Zm0-240v-80h720v80H120Z"/></svg>'}),nt(this,"startPoint",null),nt(this,"endPoint",null),nt(this,"state","idle"),nt(this,"graphicGroup",null),nt(this,"levels",[0,.236,.382,.5,.618,.786,1]),nt(this,"colors",["#787b86","#f44336","#ff9800","#4caf50","#2196f3","#00bcd4","#787b86"]),nt(this,"onClick",t=>{this.state==="idle"?(this.state="drawing",this.startPoint=[t.offsetX,t.offsetY],this.endPoint=[t.offsetX,t.offsetY],this.initGraphic(),this.updateGraphic()):this.state==="drawing"&&(this.state="finished",this.endPoint=[t.offsetX,t.offsetY],this.updateGraphic(),this.saveDrawing(),this.removeGraphic(),this.context.disableTools())}),nt(this,"onMouseMove",t=>{this.state==="drawing"&&(this.endPoint=[t.offsetX,t.offsetY],this.updateGraphic())})}onActivate(){this.state="idle",this.startPoint=null,this.endPoint=null,this.context.getChart().getZr().setCursorStyle("crosshair"),this.bindEvents()}onDeactivate(){this.state="idle",this.startPoint=null,this.endPoint=null,this.removeGraphic(),this.unbindEvents(),this.context.getChart().getZr().setCursorStyle("default")}bindEvents(){const e=this.context.getChart().getZr();e.on("click",this.onClick),e.on("mousemove",this.onMouseMove)}unbindEvents(){const e=this.context.getChart().getZr();e.off("click",this.onClick),e.off("mousemove",this.onMouseMove)}initGraphic(){this.graphicGroup=new j.graphic.Group,this.context.getChart().getZr().add(this.graphicGroup)}removeGraphic(){this.graphicGroup&&(this.context.getChart().getZr().remove(this.graphicGroup),this.graphicGroup=null)}updateGraphic(){if(!this.graphicGroup||!this.startPoint||!this.endPoint)return;this.graphicGroup.removeAll();const e=this.startPoint[0],t=this.startPoint[1],i=this.endPoint[0],s=this.endPoint[1],o=new j.graphic.Line({shape:{x1:e,y1:t,x2:i,y2:s},style:{stroke:"#999",lineWidth:1,lineDash:[4,4]},silent:!0});this.graphicGroup.add(o);const n=Math.min(e,i),u=Math.max(e,i),p=u-n,h=s-t;this.levels.forEach((S,x)=>{const y=s-h*S,A=this.colors[x%this.colors.length],v=new j.graphic.Line({shape:{x1:n,y1:y,x2:u,y2:y},style:{stroke:A,lineWidth:1},silent:!0});if(this.graphicGroup.add(v),x<this.levels.length-1){const d=this.levels[x+1],m=s-h*d,M=Math.abs(m-y),$=Math.min(y,m),q=new j.graphic.Rect({shape:{x:n,y:$,width:p,height:M},style:{fill:this.colors[(x+1)%this.colors.length],opacity:.1},silent:!0});this.graphicGroup.add(q)}})}saveDrawing(){if(!this.startPoint||!this.endPoint)return;const e=this.context.coordinateConversion.pixelToData({x:this.startPoint[0],y:this.startPoint[1]}),t=this.context.coordinateConversion.pixelToData({x:this.endPoint[0],y:this.endPoint[1]});if(e&&t){const i=e.paneIndex||0;this.context.addDrawing({id:`fib-${Date.now()}`,type:"fibonacci",points:[e,t],paneIndex:i,style:{color:"#3b82f6",lineWidth:1}})}}}ot.AbstractPlugin=pt,ot.FibonacciTool=Qt,ot.LineTool=Ut,ot.MeasureTool=Bt,ot.QFChart=Wt});
34
+ <div>${d.marker} <span style="color: #cbd5e1;">${d.displayName}</span></div>
35
+ <div style="font-size: 10px; color: #fff;padding-left:10px;">${u}</div>
36
+ </div>`}),r+="</div>"})}return r}}var Yt=Object.defineProperty,Bt=(a,e,t)=>e in a?Yt(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t,at=(a,e,t)=>(Bt(a,typeof e!="symbol"?e+"":e,t),t);class Vt{constructor(e,t){at(this,"plugins",new Map),at(this,"activePluginId",null),at(this,"context"),at(this,"toolbarContainer"),at(this,"tooltipElement",null),at(this,"hideTimeout",null),this.context=e,this.toolbarContainer=t,this.createTooltip(),this.renderToolbar()}createTooltip(){this.tooltipElement=document.createElement("div"),Object.assign(this.tooltipElement.style,{position:"fixed",display:"none",backgroundColor:"#1e293b",color:"#e2e8f0",padding:"6px 10px",borderRadius:"6px",fontSize:"13px",lineHeight:"1.4",fontWeight:"500",border:"1px solid #334155",zIndex:"9999",pointerEvents:"none",whiteSpace:"nowrap",boxShadow:"0 4px 6px -1px rgba(0, 0, 0, 0.3), 0 2px 4px -1px rgba(0, 0, 0, 0.15)",fontFamily:this.context.getOptions().fontFamily||"sans-serif",transition:"opacity 0.15s ease-in-out, transform 0.15s ease-in-out",opacity:"0",transform:"translateX(-5px)"}),document.body.appendChild(this.tooltipElement)}destroy(){this.tooltipElement&&this.tooltipElement.parentNode&&this.tooltipElement.parentNode.removeChild(this.tooltipElement),this.tooltipElement=null}showTooltip(e,t){if(!this.tooltipElement)return;this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=null);const i=e.getBoundingClientRect();this.tooltipElement.textContent=t,this.tooltipElement.style.display="block";const s=this.tooltipElement.getBoundingClientRect(),n=i.top+(i.height-s.height)/2,o=i.right+10;this.tooltipElement.style.top=`${n}px`,this.tooltipElement.style.left=`${o}px`,requestAnimationFrame(()=>{this.tooltipElement&&(this.tooltipElement.style.opacity="1",this.tooltipElement.style.transform="translateX(0)")})}hideTooltip(){this.tooltipElement&&(this.tooltipElement.style.opacity="0",this.tooltipElement.style.transform="translateX(-5px)",this.hideTimeout&&clearTimeout(this.hideTimeout),this.hideTimeout=setTimeout(()=>{this.tooltipElement&&(this.tooltipElement.style.display="none"),this.hideTimeout=null},150))}register(e){if(this.plugins.has(e.id)){console.warn(`Plugin with id ${e.id} is already registered.`);return}this.plugins.set(e.id,e),e.init(this.context),this.addButton(e)}unregister(e){const t=this.plugins.get(e);t&&(this.activePluginId===e&&this.deactivatePlugin(),t.destroy?.(),this.plugins.delete(e),this.removeButton(e))}activatePlugin(e){if(this.activePluginId===e){this.deactivatePlugin();return}this.activePluginId&&this.deactivatePlugin();const t=this.plugins.get(e);t&&(this.activePluginId=e,this.setButtonActive(e,!0),t.activate?.())}deactivatePlugin(){this.activePluginId&&(this.plugins.get(this.activePluginId)?.deactivate?.(),this.setButtonActive(this.activePluginId,!1),this.activePluginId=null)}renderToolbar(){this.toolbarContainer.innerHTML="",this.toolbarContainer.classList.add("qfchart-toolbar"),this.toolbarContainer.style.display="flex",this.toolbarContainer.style.flexDirection="column",this.toolbarContainer.style.width="40px",this.toolbarContainer.style.backgroundColor=this.context.getOptions().backgroundColor||"#1e293b",this.toolbarContainer.style.borderRight="1px solid #334155",this.toolbarContainer.style.padding="5px",this.toolbarContainer.style.boxSizing="border-box",this.toolbarContainer.style.gap="5px",this.toolbarContainer.style.flexShrink="0"}addButton(e){const t=document.createElement("button");t.id=`qfchart-plugin-btn-${e.id}`,t.style.width="30px",t.style.height="30px",t.style.padding="4px",t.style.border="1px solid transparent",t.style.borderRadius="4px",t.style.backgroundColor="transparent",t.style.cursor="pointer",t.style.color=this.context.getOptions().fontColor||"#cbd5e1",t.style.display="flex",t.style.alignItems="center",t.style.justifyContent="center",e.icon?t.innerHTML=e.icon:t.innerText=(e.name||e.id).substring(0,2).toUpperCase(),t.addEventListener("mouseenter",()=>{this.activePluginId!==e.id&&(t.style.backgroundColor="rgba(255, 255, 255, 0.1)"),this.showTooltip(t,e.name||e.id)}),t.addEventListener("mouseleave",()=>{this.activePluginId!==e.id&&(t.style.backgroundColor="transparent"),this.hideTooltip()}),t.onclick=()=>this.activatePlugin(e.id),this.toolbarContainer.appendChild(t)}removeButton(e){const t=this.toolbarContainer.querySelector(`#qfchart-plugin-btn-${e}`);t&&t.remove()}setButtonActive(e,t){const i=this.toolbarContainer.querySelector(`#qfchart-plugin-btn-${e}`);i&&(t?(i.style.backgroundColor="#2563eb",i.style.color="#ffffff"):(i.style.backgroundColor="transparent",i.style.color=this.context.getOptions().fontColor||"#cbd5e1"))}}var qt=Object.defineProperty,Xt=(a,e,t)=>e in a?qt(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t,j=(a,e,t)=>(Xt(a,typeof e!="symbol"?e+"":e,t),t);class Ut{constructor(e){j(this,"context"),j(this,"isEditing",!1),j(this,"currentDrawing",null),j(this,"editingPointIndex",null),j(this,"zr"),j(this,"editGroup",null),j(this,"editLine",null),j(this,"editStartPoint",null),j(this,"editEndPoint",null),j(this,"isMovingShape",!1),j(this,"dragStart",null),j(this,"initialPixelPoints",[]),j(this,"onDrawingMouseDown",t=>{if(this.isEditing)return;const i=this.context.getDrawing(t.id);i&&(this.isEditing=!0,this.isMovingShape=!0,this.currentDrawing=JSON.parse(JSON.stringify(i)),this.dragStart={x:t.x,y:t.y},this.initialPixelPoints=i.points.map(s=>{const n=this.context.coordinateConversion.dataToPixel(s);return n?{x:n.x,y:n.y}:{x:0,y:0}}),this.context.lockChart(),this.createEditGraphic(),this.zr.on("mousemove",this.onMouseMove),this.zr.on("mouseup",this.onMouseUp))}),j(this,"onPointMouseDown",t=>{if(this.isEditing)return;const i=this.context.getDrawing(t.id);i&&(this.isEditing=!0,this.currentDrawing=JSON.parse(JSON.stringify(i)),this.editingPointIndex=t.pointIndex,this.context.lockChart(),this.createEditGraphic(),this.zr.on("mousemove",this.onMouseMove),this.zr.on("mouseup",this.onMouseUp))}),j(this,"onMouseMove",t=>{if(!this.isEditing||!this.currentDrawing)return;const i=t.offsetX,s=t.offsetY;if(this.isMovingShape&&this.dragStart){const n=i-this.dragStart.x,o=s-this.dragStart.y,c={x:this.initialPixelPoints[0].x+n,y:this.initialPixelPoints[0].y+o},r={x:this.initialPixelPoints[1].x+n,y:this.initialPixelPoints[1].y+o};this.editLine.setShape({x1:c.x,y1:c.y,x2:r.x,y2:r.y}),this.editStartPoint.setShape({cx:c.x,cy:c.y}),this.editEndPoint.setShape({cx:r.x,cy:r.y})}else this.editingPointIndex!==null&&(this.editingPointIndex===0?(this.editLine.setShape({x1:i,y1:s}),this.editStartPoint.setShape({cx:i,cy:s})):(this.editLine.setShape({x2:i,y2:s}),this.editEndPoint.setShape({cx:i,cy:s})))}),j(this,"onMouseUp",t=>{this.isEditing&&this.finishEditing(t.offsetX,t.offsetY)}),this.context=e,this.zr=this.context.getChart().getZr(),this.bindEvents()}bindEvents(){this.context.events.on("drawing:point:mousedown",this.onPointMouseDown),this.context.events.on("drawing:mousedown",this.onDrawingMouseDown)}createEditGraphic(){if(!this.currentDrawing)return;this.editGroup=new Z.graphic.Group;const e=this.currentDrawing.points[0],t=this.currentDrawing.points[1],i=this.context.coordinateConversion.dataToPixel(e),s=this.context.coordinateConversion.dataToPixel(t);!i||!s||(this.editLine=new Z.graphic.Line({shape:{x1:i.x,y1:i.y,x2:s.x,y2:s.y},style:{stroke:this.currentDrawing.style?.color||"#3b82f6",lineWidth:this.currentDrawing.style?.lineWidth||2,lineDash:[4,4]},silent:!0}),this.editStartPoint=new Z.graphic.Circle({shape:{cx:i.x,cy:i.y,r:5},style:{fill:"#fff",stroke:"#3b82f6",lineWidth:2},z:1e3}),this.editEndPoint=new Z.graphic.Circle({shape:{cx:s.x,cy:s.y,r:5},style:{fill:"#fff",stroke:"#3b82f6",lineWidth:2},z:1e3}),this.editGroup.add(this.editLine),this.editGroup.add(this.editStartPoint),this.editGroup.add(this.editEndPoint),this.zr.add(this.editGroup))}finishEditing(e,t){if(this.currentDrawing){if(this.isMovingShape&&this.dragStart){const i=e-this.dragStart.x,s=t-this.dragStart.y,n=this.initialPixelPoints.map((o,c)=>{const r=o.x+i,l=o.y+s;return this.context.coordinateConversion.pixelToData({x:r,y:l})});n.every(o=>o!==null)&&n[0]&&n[1]&&(this.currentDrawing.points[0]=n[0],this.currentDrawing.points[1]=n[1],n[0].paneIndex!==void 0&&(this.currentDrawing.paneIndex=n[0].paneIndex),this.context.updateDrawing(this.currentDrawing))}else if(this.editingPointIndex!==null){const i=this.context.coordinateConversion.pixelToData({x:e,y:t});i&&(this.currentDrawing.points[this.editingPointIndex]=i,this.editingPointIndex===0&&i.paneIndex!==void 0&&(this.currentDrawing.paneIndex=i.paneIndex),this.context.updateDrawing(this.currentDrawing))}this.isEditing=!1,this.isMovingShape=!1,this.dragStart=null,this.initialPixelPoints=[],this.currentDrawing=null,this.editingPointIndex=null,this.editGroup&&(this.zr.remove(this.editGroup),this.editGroup=null),this.zr.off("mousemove",this.onMouseMove),this.zr.off("mouseup",this.onMouseUp),this.context.unlockChart()}}}var _t=Object.defineProperty,Qt=(a,e,t)=>e in a?_t(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t,Jt=(a,e,t)=>(Qt(a,typeof e!="symbol"?e+"":e,t),t);class Kt{constructor(){Jt(this,"handlers",new Map)}on(e,t){this.handlers.has(e)||this.handlers.set(e,new Set),this.handlers.get(e).add(t)}off(e,t){const i=this.handlers.get(e);i&&i.delete(t)}emit(e,t){const i=this.handlers.get(e);i&&i.forEach(s=>{try{s(t)}catch(n){console.error(`Error in EventBus handler for ${e}:`,n)}})}clear(){this.handlers.clear()}}var te=Object.defineProperty,ee=(a,e,t)=>e in a?te(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t,E=(a,e,t)=>(ee(a,typeof e!="symbol"?e+"":e,t),t);class ie{constructor(e,t={}){E(this,"chart"),E(this,"options"),E(this,"marketData",[]),E(this,"indicators",new Map),E(this,"timeToIndex",new Map),E(this,"pluginManager"),E(this,"drawingEditor"),E(this,"events",new Kt),E(this,"isMainCollapsed",!1),E(this,"maximizedPaneId",null),E(this,"countdownInterval",null),E(this,"selectedDrawingId",null),E(this,"drawings",[]),E(this,"coordinateConversion",{pixelToData:n=>{const o=this.chart.getOption();if(!o||!o.grid)return null;const c=o.grid.length;for(let r=0;r<c;r++)if(this.chart.containPixel({gridIndex:r},[n.x,n.y])){this.chart.convertFromPixel({seriesIndex:r},[n.x,n.y]);const l=this.chart.convertFromPixel({gridIndex:r},[n.x,n.y]);if(l)return{timeIndex:Math.round(l[0]),value:l[1],paneIndex:r}}return null},dataToPixel:n=>{const o=n.paneIndex||0,c=this.chart.convertToPixel({gridIndex:o},[n.timeIndex,n.value]);return c?{x:c[0],y:c[1]}:null}}),E(this,"upColor","#00da3c"),E(this,"downColor","#ec0000"),E(this,"defaultPadding",0),E(this,"padding"),E(this,"dataIndexOffset",0),E(this,"rootContainer"),E(this,"layoutContainer"),E(this,"toolbarContainer"),E(this,"leftSidebar"),E(this,"rightSidebar"),E(this,"chartContainer"),E(this,"onKeyDown",n=>{(n.key==="Delete"||n.key==="Backspace")&&this.selectedDrawingId&&(this.removeDrawing(this.selectedDrawingId),this.selectedDrawingId=null,this.render())}),E(this,"onFullscreenChange",()=>{this.render()}),E(this,"isLocked",!1),E(this,"lockedState",null),this.rootContainer=e,this.options={title:"Market",height:"600px",backgroundColor:"#1e293b",upColor:"#00da3c",downColor:"#ec0000",fontColor:"#cbd5e1",fontFamily:"sans-serif",padding:.01,dataZoom:{visible:!0,position:"top",height:6},layout:{mainPaneHeight:"50%",gap:13},watermark:!0,...t},this.options.upColor&&(this.upColor=this.options.upColor),this.options.downColor&&(this.downColor=this.options.downColor),this.padding=this.options.padding!==void 0?this.options.padding:this.defaultPadding,this.options.height&&(typeof this.options.height=="number"?this.rootContainer.style.height=`${this.options.height}px`:this.rootContainer.style.height=this.options.height),this.rootContainer.innerHTML="",this.layoutContainer=document.createElement("div"),this.layoutContainer.style.display="flex",this.layoutContainer.style.width="100%",this.layoutContainer.style.height="100%",this.layoutContainer.style.overflow="hidden",this.rootContainer.appendChild(this.layoutContainer),this.leftSidebar=document.createElement("div"),this.leftSidebar.style.display="none",this.leftSidebar.style.width="250px",this.leftSidebar.style.flexShrink="0",this.leftSidebar.style.overflowY="auto",this.leftSidebar.style.backgroundColor=this.options.backgroundColor||"#1e293b",this.leftSidebar.style.borderRight="1px solid #334155",this.leftSidebar.style.padding="10px",this.leftSidebar.style.boxSizing="border-box",this.leftSidebar.style.color="#cbd5e1",this.leftSidebar.style.fontSize="12px",this.leftSidebar.style.fontFamily=this.options.fontFamily||"sans-serif",this.layoutContainer.appendChild(this.leftSidebar),this.toolbarContainer=document.createElement("div"),this.layoutContainer.appendChild(this.toolbarContainer),this.chartContainer=document.createElement("div"),this.chartContainer.style.flexGrow="1",this.chartContainer.style.height="100%",this.chartContainer.style.overflow="hidden",this.layoutContainer.appendChild(this.chartContainer),this.rightSidebar=document.createElement("div"),this.rightSidebar.style.display="none",this.rightSidebar.style.width="250px",this.rightSidebar.style.flexShrink="0",this.rightSidebar.style.overflowY="auto",this.rightSidebar.style.backgroundColor=this.options.backgroundColor||"#1e293b",this.rightSidebar.style.borderLeft="1px solid #334155",this.rightSidebar.style.padding="10px",this.rightSidebar.style.boxSizing="border-box",this.rightSidebar.style.color="#cbd5e1",this.rightSidebar.style.fontSize="12px",this.rightSidebar.style.fontFamily=this.options.fontFamily||"sans-serif",this.layoutContainer.appendChild(this.rightSidebar),this.chart=Z.init(this.chartContainer),this.pluginManager=new Vt(this,this.toolbarContainer),this.drawingEditor=new Ut(this),this.chart.on("dataZoom",n=>{this.events.emit("chart:dataZoom",n);const o=this.options.databox?.triggerOn,c=this.options.databox?.position;o==="click"&&c==="floating"&&this.chart.dispatchAction({type:"hideTip"})}),this.chart.on("finished",n=>this.events.emit("chart:updated",n)),this.chart.getZr().on("mousedown",n=>this.events.emit("mouse:down",n)),this.chart.getZr().on("mousemove",n=>this.events.emit("mouse:move",n)),this.chart.getZr().on("mouseup",n=>this.events.emit("mouse:up",n)),this.chart.getZr().on("click",n=>this.events.emit("mouse:click",n));const i=this.chart.getZr(),s=i.setCursorStyle;i.setCursorStyle=function(n){n==="grab"&&(n="crosshair"),s.call(this,n)},this.bindDrawingEvents(),window.addEventListener("resize",this.resize.bind(this)),document.addEventListener("fullscreenchange",this.onFullscreenChange),document.addEventListener("keydown",this.onKeyDown)}bindDrawingEvents(){let e=null;const t=i=>{if(!i||i.componentType!=="series"||!i.seriesName?.startsWith("drawings"))return null;i.seriesIndex;const s=i.seriesName.match(/drawings-pane-(\d+)/);if(!s)return null;const n=parseInt(s[1]),o=this.drawings.filter(r=>(r.paneIndex||0)===n)[i.dataIndex];if(!o)return null;const c=i.event?.target?.name;return{drawing:o,targetName:c,paneIdx:n}};this.chart.on("mouseover",i=>{const s=t(i);if(!s)return;const n=i.event?.target?.parent;if(n){const o=s.drawing.id===this.selectedDrawingId;e&&(clearTimeout(e),e=null),o||n.children().forEach(c=>{c.name&&c.name.startsWith("point")&&c.attr("style",{opacity:1})})}if(s.targetName==="line")this.events.emit("drawing:hover",{id:s.drawing.id,type:s.drawing.type}),this.chart.getZr().setCursorStyle("move");else if(s.targetName?.startsWith("point")){const o=s.targetName==="point-start"?0:1;this.events.emit("drawing:point:hover",{id:s.drawing.id,pointIndex:o}),this.chart.getZr().setCursorStyle("pointer")}}),this.chart.on("mouseout",i=>{const s=t(i);if(!s)return;const n=i.event?.target?.parent;if(s.drawing.id!==this.selectedDrawingId){if(e=setTimeout(()=>{if(n){if(this.selectedDrawingId===s.drawing.id)return;n.children().forEach(o=>{o.name&&o.name.startsWith("point")&&o.attr("style",{opacity:0})})}},50),s.targetName==="line")this.events.emit("drawing:mouseout",{id:s.drawing.id});else if(s.targetName?.startsWith("point")){const o=s.targetName==="point-start"?0:1;this.events.emit("drawing:point:mouseout",{id:s.drawing.id,pointIndex:o})}this.chart.getZr().setCursorStyle("default")}}),this.chart.on("mousedown",i=>{const s=t(i);if(!s)return;const n=i.event?.event||i.event,o=n?.offsetX,c=n?.offsetY;if(s.targetName==="line")this.events.emit("drawing:mousedown",{id:s.drawing.id,x:o,y:c});else if(s.targetName?.startsWith("point")){const r=s.targetName==="point-start"?0:1;this.events.emit("drawing:point:mousedown",{id:s.drawing.id,pointIndex:r,x:o,y:c})}}),this.chart.on("click",i=>{const s=t(i);if(s){if(this.selectedDrawingId!==s.drawing.id&&(this.selectedDrawingId=s.drawing.id,this.events.emit("drawing:selected",{id:s.drawing.id}),this.render()),s.targetName==="line")this.events.emit("drawing:click",{id:s.drawing.id});else if(s.targetName?.startsWith("point")){const n=s.targetName==="point-start"?0:1;this.events.emit("drawing:point:click",{id:s.drawing.id,pointIndex:n})}}}),this.chart.getZr().on("click",i=>{i.target||this.selectedDrawingId&&(this.events.emit("drawing:deselected",{id:this.selectedDrawingId}),this.selectedDrawingId=null,this.render())})}getChart(){return this.chart}getMarketData(){return this.marketData}getTimeToIndex(){return this.timeToIndex}getOptions(){return this.options}disableTools(){this.pluginManager.deactivatePlugin()}registerPlugin(e){this.pluginManager.register(e)}addDrawing(e){this.drawings.push(e),this.render()}removeDrawing(e){const t=this.drawings.findIndex(i=>i.id===e);if(t!==-1){const i=this.drawings[t];this.drawings.splice(t,1),this.events.emit("drawing:deleted",{id:i.id}),this.render()}}getDrawing(e){return this.drawings.find(t=>t.id===e)}updateDrawing(e){const t=this.drawings.findIndex(i=>i.id===e.id);t!==-1&&(this.drawings[t]=e,this.render())}lockChart(){if(this.isLocked)return;this.isLocked=!0;const e=this.chart.getOption();this.chart.setOption({dataZoom:e.dataZoom.map(t=>({...t,disabled:!0})),tooltip:{show:!1}})}unlockChart(){if(!this.isLocked)return;this.isLocked=!1;const e=this.chart.getOption();(this.options.dataZoom||{}).visible,e.dataZoom&&this.chart.setOption({dataZoom:e.dataZoom.map(t=>({...t,disabled:!1})),tooltip:{show:!0}})}setZoom(e,t){this.chart.dispatchAction({type:"dataZoom",start:e,end:t})}setMarketData(e){this.marketData=e,this.rebuildTimeIndex(),this.render()}updateData(e){if(e.length===0)return;const t=new Map;this.marketData.forEach(u=>{t.set(u.time,u)}),e.forEach(u=>{t.has(u.time),t.set(u.time,u)}),this.marketData=Array.from(t.values()).sort((u,m)=>u.time-m.time),this.rebuildTimeIndex();const i=this.dataIndexOffset,s=pt.buildCandlestickSeries(this.marketData,this.options),n={value:[NaN,NaN,NaN,NaN],itemStyle:{opacity:0}},o=[...Array(i).fill(n),...s.data,...Array(i).fill(n)],c=[...Array(i).fill(""),...this.marketData.map(u=>new Date(u.time).toLocaleString()),...Array(i).fill("")],r=this.chart.getOption(),l=vt.calculate(this.chart.getHeight(),this.indicators,this.options,this.isMainCollapsed,this.maximizedPaneId,this.marketData),f=[...Array(i).fill(null),...this.marketData,...Array(i).fill(null)],{series:y,barColors:h}=pt.buildIndicatorSeries(this.indicators,this.timeToIndex,l.paneLayout,c.length,i,f,l.overlayYAxisMap,l.separatePaneYAxisOffset),d=o.map((u,m)=>h[m]?{value:u.value||u,itemStyle:{color:h[m],color0:h[m],borderColor:h[m],borderColor0:h[m]}}:u),p={xAxis:r.xAxis.map((u,m)=>({data:c})),series:[{data:d,markLine:s.markLine},...y.map(u=>{const m={data:u.data};return u.renderItem&&(m.renderItem=u.renderItem),m})]};this.chart.setOption(p,{notMerge:!1}),this.startCountdown()}startCountdown(){if(this.stopCountdown(),!this.options.lastPriceLine?.showCountdown||!this.options.interval||this.marketData.length===0)return;const e=()=>{if(this.marketData.length===0)return;const t=this.marketData[this.marketData.length-1].time+(this.options.interval||0),i=Date.now(),s=t-i;if(s<=0)return;const n=Math.abs(s),o=Math.floor(n/36e5),c=Math.floor(n%36e5/6e4),r=Math.floor(n%6e4/1e3),l=`${o>0?o.toString().padStart(2,"0")+":":""}${c.toString().padStart(2,"0")}:${r.toString().padStart(2,"0")}`,f=this.chart.getOption();if(!f||!f.series)return;const y=f.series.findIndex(w=>w.type==="candlestick");if(y===-1)return;const h=f.series[y];if(!h.markLine||!h.markLine.data||!h.markLine.data[0])return;const d=h.markLine.data[0];d.label.formatter;const p=d.yAxis;let u="";if(this.options.yAxisLabelFormatter)u=this.options.yAxisLabelFormatter(p);else{const w=this.options.yAxisDecimalPlaces!==void 0?this.options.yAxisDecimalPlaces:O.autoDetectDecimals(this.marketData);u=O.formatValue(p,w)}const m=`${u}
37
+ ${l}`;this.chart.setOption({series:[{name:this.options.title||"Market",markLine:{data:[{...d,label:{...d.label,formatter:m}}]}}]})};e(),this.countdownInterval=setInterval(e,1e3)}stopCountdown(){this.countdownInterval&&(clearInterval(this.countdownInterval),this.countdownInterval=null)}addIndicator(e,t,i={}){const s=i.overlay!==void 0?i.overlay:i.isOverlay??!1;let n=0;if(!s){let c=0;this.indicators.forEach(r=>{r.paneIndex>c&&(c=r.paneIndex)}),n=c+1}const o=new Pt(e,t,n,{height:i.height,collapsed:!1,titleColor:i.titleColor,controls:i.controls});return this.indicators.set(e,o),this.render(),o}setIndicator(e,t,i=!1){this.addIndicator(e,{[e]:t},{overlay:i})}removeIndicator(e){this.indicators.delete(e),this.render()}toggleIndicator(e,t="collapse"){if(t==="fullscreen"){document.fullscreenElement?document.exitFullscreen():this.rootContainer.requestFullscreen();return}if(t==="maximize"){this.maximizedPaneId===e?this.maximizedPaneId=null:this.maximizedPaneId=e,this.render();return}if(e==="main"){this.isMainCollapsed=!this.isMainCollapsed,this.render();return}const i=this.indicators.get(e);i&&(i.toggleCollapse(),this.render())}resize(){this.chart.resize()}destroy(){this.stopCountdown(),window.removeEventListener("resize",this.resize.bind(this)),document.removeEventListener("fullscreenchange",this.onFullscreenChange),document.removeEventListener("keydown",this.onKeyDown),this.pluginManager.deactivatePlugin(),this.pluginManager.destroy(),this.chart.dispose()}rebuildTimeIndex(){this.timeToIndex.clear(),this.marketData.forEach((i,s)=>{this.timeToIndex.set(i.time,s)});const e=this.marketData.length,t=Math.ceil(e*this.padding);this.dataIndexOffset=t}render(){if(this.marketData.length===0)return;let e=null;try{const x=this.chart.getOption();if(x&&x.dataZoom&&x.dataZoom.length>0){const v=x.dataZoom.find(I=>I.type==="slider"||I.type==="inside");v&&(e={start:v.start,end:v.end})}}catch{}const t=this.options.databox?.position,i=this.leftSidebar.style.display,s=this.rightSidebar.style.display,n=t==="left"?"block":"none",o=t==="right"?"block":"none";(i!==n||s!==o)&&(this.leftSidebar.style.display=n,this.rightSidebar.style.display=o,this.chart.resize());const c=this.dataIndexOffset,r=[...Array(c).fill(""),...this.marketData.map(x=>new Date(x.time).toLocaleString()),...Array(c).fill("")],l=vt.calculate(this.chart.getHeight(),this.indicators,this.options,this.isMainCollapsed,this.maximizedPaneId,this.marketData);if(!e&&l.dataZoom&&this.marketData.length>0){const x=this.marketData.length,v=r.length,I=c/v,D=x/v;l.dataZoom.forEach(g=>{if(g.start!==void 0){const A=g.start/100,N=I+A*D;g.start=N*100}if(g.end!==void 0){const A=g.end/100,N=I+A*D;g.end=N*100}})}e&&l.dataZoom&&l.dataZoom.forEach(x=>{x.start=e.start,x.end=e.end}),l.xAxis.forEach(x=>{x.data=r,x.boundaryGap=!1});const f=pt.buildCandlestickSeries(this.marketData,this.options),y={value:[NaN,NaN,NaN,NaN],itemStyle:{opacity:0}};f.data=[...Array(c).fill(y),...f.data,...Array(c).fill(y)];const h=[...Array(c).fill(null),...this.marketData,...Array(c).fill(null)],{series:d,barColors:p}=pt.buildIndicatorSeries(this.indicators,this.timeToIndex,l.paneLayout,r.length,c,h,l.overlayYAxisMap,l.separatePaneYAxisOffset);f.data=f.data.map((x,v)=>p[v]?{value:x.value||x,itemStyle:{color:p[v],color0:p[v],borderColor:p[v],borderColor0:p[v]}}:x);const u=Rt.build(l,this.options,this.toggleIndicator.bind(this),this.isMainCollapsed,this.maximizedPaneId),m=new Map;this.drawings.forEach(x=>{const v=x.paneIndex||0;m.has(v)||m.set(v,[]),m.get(v).push(x)});const w=[];m.forEach((x,v)=>{w.push({type:"custom",name:`drawings-pane-${v}`,xAxisIndex:v,yAxisIndex:v,clip:!0,renderItem:(I,D)=>{const g=x[I.dataIndex];if(!g)return;const A=g.points[0],N=g.points[1];if(!A||!N)return;const k=D.coord([A.timeIndex,A.value]),M=D.coord([N.timeIndex,N.value]),T=g.id===this.selectedDrawingId;if(g.type==="line")return{type:"group",children:[{type:"line",name:"line",shape:{x1:k[0],y1:k[1],x2:M[0],y2:M[1]},style:{stroke:g.style?.color||"#3b82f6",lineWidth:g.style?.lineWidth||2}},{type:"circle",name:"point-start",shape:{cx:k[0],cy:k[1],r:4},style:{fill:"#fff",stroke:g.style?.color||"#3b82f6",lineWidth:1,opacity:T?1:0}},{type:"circle",name:"point-end",shape:{cx:M[0],cy:M[1],r:4},style:{fill:"#fff",stroke:g.style?.color||"#3b82f6",lineWidth:1,opacity:T?1:0}}]};if(g.type==="fibonacci"){const V=k[0],tt=k[1],Y=M[0],_=M[1],K=Math.min(V,Y),ht=Math.max(V,Y),ot=ht-K,b=_-tt,P=[0,.236,.382,.5,.618,.786,1],L=["#787b86","#f44336","#ff9800","#4caf50","#2196f3","#00bcd4","#787b86"],$=[];$.push({type:"line",name:"line",shape:{x1:V,y1:tt,x2:Y,y2:_},style:{stroke:"#999",lineWidth:1,lineDash:[4,4]}}),$.push({type:"circle",name:"point-start",shape:{cx:V,cy:tt,r:4},style:{fill:"#fff",stroke:g.style?.color||"#3b82f6",lineWidth:1,opacity:T?1:0},z:100}),$.push({type:"circle",name:"point-end",shape:{cx:Y,cy:_,r:4},style:{fill:"#fff",stroke:g.style?.color||"#3b82f6",lineWidth:1,opacity:T?1:0},z:100}),P.forEach((G,H)=>{const z=_-b*G,W=L[H%L.length];$.push({type:"line",name:"fib-line",shape:{x1:K,y1:z,x2:ht,y2:z},style:{stroke:W,lineWidth:1},silent:!0});const et=g.points[0].value,Q=g.points[1].value,U=Q-et,it=Q-U*G;if($.push({type:"text",style:{text:`${G} (${it.toFixed(2)})`,x:K+5,y:z-10,fill:W,fontSize:10},silent:!0}),H<P.length-1){const gt=P[H+1],ct=_-b*gt,xt=Math.abs(ct-z),mt=Math.min(z,ct);$.push({type:"rect",shape:{x:K,y:mt,width:ot,height:xt},style:{fill:L[(H+1)%L.length],opacity:.1},silent:!0})}});const B=[],F=[];return P.forEach((G,H)=>{const z=_-b*G,W=L[H%L.length];F.push({type:"line",shape:{x1:K,y1:z,x2:ht,y2:z},style:{stroke:W,lineWidth:1},silent:!0});const et=g.points[0].value,Q=g.points[1].value,U=Q-et,it=Q-U*G;if(F.push({type:"text",style:{text:`${G} (${it.toFixed(2)})`,x:K+5,y:z-10,fill:W,fontSize:10},silent:!0}),H<P.length-1){const gt=P[H+1],ct=_-b*gt,xt=Math.abs(ct-z),mt=Math.min(z,ct);B.push({type:"rect",name:"line",shape:{x:K,y:mt,width:ot,height:xt},style:{fill:L[(H+1)%L.length],opacity:.1}})}}),{type:"group",children:[...B,...F,{type:"line",name:"line",shape:{x1:V,y1:tt,x2:Y,y2:_},style:{stroke:"#999",lineWidth:1,lineDash:[4,4]}},{type:"circle",name:"point-start",shape:{cx:V,cy:tt,r:4},style:{fill:"#fff",stroke:g.style?.color||"#3b82f6",lineWidth:1,opacity:T?1:0},z:100},{type:"circle",name:"point-end",shape:{cx:Y,cy:_,r:4},style:{fill:"#fff",stroke:g.style?.color||"#3b82f6",lineWidth:1,opacity:T?1:0},z:100}]}}},data:x.map(I=>[I.points[0].timeIndex,I.points[0].value,I.points[1].timeIndex,I.points[1].value]),z:100,silent:!1})});const C=x=>{const v=jt.format(x,this.options),I=this.options.databox?.position;return I==="left"?(this.leftSidebar.innerHTML=v,""):I==="right"?(this.rightSidebar.innerHTML=v,""):this.options.databox?`<div style="min-width: 200px;">${v}</div>`:""},S={backgroundColor:this.options.backgroundColor,animation:!1,legend:{show:!1},tooltip:{show:!0,showContent:!!this.options.databox,trigger:"axis",triggerOn:this.options.databox?.triggerOn??"mousemove",axisPointer:{type:"cross",label:{backgroundColor:"#475569"}},backgroundColor:"rgba(30, 41, 59, 0.9)",borderWidth:1,borderColor:"#334155",padding:10,textStyle:{color:"#fff",fontFamily:this.options.fontFamily||"sans-serif"},formatter:C,extraCssText:t!=="floating"&&t!==void 0?"display: none !important;":void 0,position:(x,v,I,D,g)=>{if(this.options.databox?.position==="floating"){const A={top:10};return A[["left","right"][+(x[0]<g.viewSize[0]/2)]]=30,A}return null}},axisPointer:{link:{xAxisIndex:"all"},label:{backgroundColor:"#475569"}},graphic:u,grid:l.grid,xAxis:l.xAxis,yAxis:l.yAxis,dataZoom:l.dataZoom,series:[f,...d,...w]};this.chart.setOption(S,!0)}}var se=Object.defineProperty,ne=(a,e,t)=>e in a?se(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t,lt=(a,e,t)=>(ne(a,typeof e!="symbol"?e+"":e,t),t);class ut{constructor(e){lt(this,"id"),lt(this,"name"),lt(this,"icon"),lt(this,"context"),lt(this,"eventListeners",[]),this.id=e.id,this.name=e.name,this.icon=e.icon}init(e){this.context=e,this.onInit()}onInit(){}activate(){this.onActivate(),this.context.events.emit("plugin:activated",this.id)}onActivate(){}deactivate(){this.onDeactivate(),this.context.events.emit("plugin:deactivated",this.id)}onDeactivate(){}destroy(){this.removeAllListeners(),this.onDestroy()}onDestroy(){}on(e,t){this.context.events.on(e,t),this.eventListeners.push({event:e,handler:t})}off(e,t){this.context.events.off(e,t),this.eventListeners=this.eventListeners.filter(i=>i.event!==e||i.handler!==t)}removeAllListeners(){this.eventListeners.forEach(({event:e,handler:t})=>{this.context.events.off(e,t)}),this.eventListeners=[]}get chart(){return this.context.getChart()}get marketData(){return this.context.getMarketData()}}var oe=Object.defineProperty,ae=(a,e,t)=>e in a?oe(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t,R=(a,e,t)=>(ae(a,typeof e!="symbol"?e+"":e,t),t);class re extends ut{constructor(e){super({id:"measure",name:e?.name||"Measure",icon:e?.icon||'<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e3e3e3"><path d="M160-240q-33 0-56.5-23.5T80-320v-320q0-33 23.5-56.5T160-720h640q33 0 56.5 23.5T880-640v320q0 33-23.5 56.5T800-240H160Zm0-80h640v-320H680v160h-80v-160h-80v160h-80v-160h-80v160h-80v-160H160v320Zm120-160h80-80Zm160 0h80-80Zm160 0h80-80Zm-120 0Z"/></svg>'}),R(this,"zr"),R(this,"state","idle"),R(this,"startPoint",null),R(this,"endPoint",null),R(this,"group",null),R(this,"rect",null),R(this,"labelRect",null),R(this,"labelText",null),R(this,"lineV",null),R(this,"lineH",null),R(this,"arrowStart",null),R(this,"arrowEnd",null),R(this,"onMouseDown",()=>{this.state==="finished"&&this.removeGraphic()}),R(this,"onChartInteraction",()=>{this.group&&this.removeGraphic()}),R(this,"onClick",t=>{this.state==="idle"?(this.state="drawing",this.startPoint=[t.offsetX,t.offsetY],this.endPoint=[t.offsetX,t.offsetY],this.initGraphic(),this.updateGraphic()):this.state==="drawing"&&(this.state="finished",this.endPoint=[t.offsetX,t.offsetY],this.updateGraphic(),this.context.disableTools(),this.enableClearListeners())}),R(this,"clearHandlers",{}),R(this,"onMouseMove",t=>{this.state==="drawing"&&(this.endPoint=[t.offsetX,t.offsetY],this.updateGraphic())})}onInit(){this.zr=this.chart.getZr()}onActivate(){this.state="idle",this.chart.getZr().setCursorStyle("crosshair"),this.zr.on("click",this.onClick),this.zr.on("mousemove",this.onMouseMove)}onDeactivate(){this.state="idle",this.chart.getZr().setCursorStyle("default"),this.zr.off("click",this.onClick),this.zr.off("mousemove",this.onMouseMove),this.disableClearListeners(),this.state==="drawing"&&this.removeGraphic()}onDestroy(){this.removeGraphic()}enableClearListeners(){const e=()=>{this.removeGraphic()};setTimeout(()=>{this.zr.on("click",e)},10),this.zr.on("mousedown",this.onMouseDown),this.context.events.on("chart:dataZoom",this.onChartInteraction),this.clearHandlers={click:e,mousedown:this.onMouseDown,dataZoom:this.onChartInteraction}}disableClearListeners(){this.clearHandlers.click&&this.zr.off("click",this.clearHandlers.click),this.clearHandlers.mousedown&&this.zr.off("mousedown",this.clearHandlers.mousedown),this.clearHandlers.dataZoom&&this.context.events.off("chart:dataZoom",this.clearHandlers.dataZoom),this.clearHandlers={}}initGraphic(){this.group||(this.group=new Z.graphic.Group,this.rect=new Z.graphic.Rect({shape:{x:0,y:0,width:0,height:0},style:{fill:"rgba(0,0,0,0)",stroke:"transparent",lineWidth:0},z:100}),this.lineV=new Z.graphic.Line({shape:{x1:0,y1:0,x2:0,y2:0},style:{stroke:"#fff",lineWidth:1,lineDash:[4,4]},z:101}),this.lineH=new Z.graphic.Line({shape:{x1:0,y1:0,x2:0,y2:0},style:{stroke:"#fff",lineWidth:1,lineDash:[4,4]},z:101}),this.arrowStart=new Z.graphic.Polygon({shape:{points:[[0,0],[-5,10],[5,10]]},style:{fill:"#fff"},z:102}),this.arrowEnd=new Z.graphic.Polygon({shape:{points:[[0,0],[-5,-10],[5,-10]]},style:{fill:"#fff"},z:102}),this.labelRect=new Z.graphic.Rect({shape:{x:0,y:0,width:0,height:0,r:4},style:{fill:"transparent",stroke:"transparent",lineWidth:0,shadowBlur:5,shadowColor:"rgba(0,0,0,0.3)"},z:102}),this.labelText=new Z.graphic.Text({style:{x:0,y:0,text:"",fill:"#fff",font:"12px sans-serif",align:"center",verticalAlign:"middle"},z:103}),this.group.add(this.rect),this.group.add(this.lineV),this.group.add(this.lineH),this.group.add(this.arrowStart),this.group.add(this.arrowEnd),this.group.add(this.labelRect),this.group.add(this.labelText),this.zr.add(this.group))}removeGraphic(){this.group&&(this.zr.remove(this.group),this.group=null,this.disableClearListeners())}updateGraphic(){if(!this.startPoint||!this.endPoint||!this.group)return;const[e,t]=this.startPoint,[i,s]=this.endPoint,n=this.context.coordinateConversion.pixelToData({x:e,y:t}),o=this.context.coordinateConversion.pixelToData({x:i,y:s});if(!n||!o)return;const c=Math.round(n.timeIndex),r=Math.round(o.timeIndex),l=n.value,f=o.value,y=r-c,h=f-l,d=h/l*100,p=h>=0,u=p?"rgba(33, 150, 243, 0.2)":"rgba(236, 0, 0, 0.2)",m=p?"#2196F3":"#ec0000";this.rect.setShape({x:Math.min(e,i),y:Math.min(t,s),width:Math.abs(i-e),height:Math.abs(s-t)}),this.rect.setStyle({fill:u});const w=(e+i)/2,C=(t+s)/2;this.lineV.setShape({x1:w,y1:t,x2:w,y2:s}),this.lineV.setStyle({stroke:m}),this.lineH.setShape({x1:e,y1:C,x2:i,y2:C}),this.lineH.setStyle({stroke:m});const S=Math.min(t,s),x=Math.max(t,s);this.arrowStart.setStyle({fill:"none"}),this.arrowEnd.setStyle({fill:"none"}),p?(this.arrowStart.setShape({points:[[w,S],[w-4,S+6],[w+4,S+6]]}),this.arrowStart.setStyle({fill:m})):(this.arrowEnd.setShape({points:[[w,x],[w-4,x-6],[w+4,x-6]]}),this.arrowEnd.setStyle({fill:m}));const v=[`${h.toFixed(2)} (${d.toFixed(2)}%)`,`${y} bars, ${(y*0).toFixed(0)}d`].join(`
38
+ `),I=140,D=40,g=Math.max(t,s),A=Math.min(t,s);let N=(e+i)/2-I/2,k=g+10;const M=this.chart.getHeight();k+D>M&&(k=A-D-10),this.labelRect.setShape({x:N,y:k,width:I,height:D}),this.labelRect.setStyle({fill:"#1e293b",stroke:m,lineWidth:1}),this.labelText.setStyle({x:N+I/2,y:k+D/2,text:v,fill:"#fff"})}}var le=Object.defineProperty,he=(a,e,t)=>e in a?le(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t,X=(a,e,t)=>(he(a,typeof e!="symbol"?e+"":e,t),t);class ce extends ut{constructor(e){super({id:"trend-line",name:e?.name||"Trend Line",icon:e?.icon||'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="2" y1="22" x2="22" y2="2" /></svg>'}),X(this,"zr"),X(this,"state","idle"),X(this,"startPoint",null),X(this,"endPoint",null),X(this,"group",null),X(this,"line",null),X(this,"startCircle",null),X(this,"endCircle",null),X(this,"onMouseDown",()=>{}),X(this,"onChartInteraction",()=>{}),X(this,"onClick",t=>{if(this.state==="idle")this.state="drawing",this.startPoint=[t.offsetX,t.offsetY],this.endPoint=[t.offsetX,t.offsetY],this.initGraphic(),this.updateGraphic();else if(this.state==="drawing"){if(this.state="finished",this.endPoint=[t.offsetX,t.offsetY],this.updateGraphic(),this.startPoint&&this.endPoint){const i=this.context.coordinateConversion.pixelToData({x:this.startPoint[0],y:this.startPoint[1]}),s=this.context.coordinateConversion.pixelToData({x:this.endPoint[0],y:this.endPoint[1]});if(i&&s){const n=i.paneIndex||0;this.context.addDrawing({id:`line-${Date.now()}`,type:"line",points:[i,s],paneIndex:n,style:{color:"#3b82f6",lineWidth:2}})}}this.removeGraphic(),this.context.disableTools()}}),X(this,"clearHandlers",{}),X(this,"onMouseMove",t=>{this.state==="drawing"&&(this.endPoint=[t.offsetX,t.offsetY],this.updateGraphic())})}onInit(){this.zr=this.chart.getZr()}onActivate(){this.state="idle",this.chart.getZr().setCursorStyle("crosshair"),this.zr.on("click",this.onClick),this.zr.on("mousemove",this.onMouseMove)}onDeactivate(){this.state="idle",this.chart.getZr().setCursorStyle("default"),this.zr.off("click",this.onClick),this.zr.off("mousemove",this.onMouseMove),this.disableClearListeners(),this.state==="drawing"&&this.removeGraphic()}onDestroy(){this.removeGraphic()}saveDataCoordinates(){}updateGraphicFromData(){}enableClearListeners(){}disableClearListeners(){}initGraphic(){this.group||(this.group=new Z.graphic.Group,this.line=new Z.graphic.Line({shape:{x1:0,y1:0,x2:0,y2:0},style:{stroke:"#3b82f6",lineWidth:2},z:100}),this.startCircle=new Z.graphic.Circle({shape:{cx:0,cy:0,r:4},style:{fill:"#fff",stroke:"#3b82f6",lineWidth:1},z:101}),this.endCircle=new Z.graphic.Circle({shape:{cx:0,cy:0,r:4},style:{fill:"#fff",stroke:"#3b82f6",lineWidth:1},z:101}),this.group.add(this.line),this.group.add(this.startCircle),this.group.add(this.endCircle),this.zr.add(this.group))}removeGraphic(){this.group&&(this.zr.remove(this.group),this.group=null,this.disableClearListeners())}updateGraphic(){if(!this.startPoint||!this.endPoint||!this.group)return;const[e,t]=this.startPoint,[i,s]=this.endPoint;this.line.setShape({x1:e,y1:t,x2:i,y2:s}),this.startCircle.setShape({cx:e,cy:t}),this.endCircle.setShape({cx:i,cy:s})}}var de=Object.defineProperty,pe=(a,e,t)=>e in a?de(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t,st=(a,e,t)=>(pe(a,typeof e!="symbol"?e+"":e,t),t);class ue extends ut{constructor(e={}){super({id:"fibonacci-tool",name:e.name||"Fibonacci Retracement",icon:e.icon||'<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e3e3e3"><path d="M120-80v-80h720v80H120Zm0-240v-80h720v80H120Zm0-240v-80h720v80H120Zm0-240v-80h720v80H120Z"/></svg>'}),st(this,"startPoint",null),st(this,"endPoint",null),st(this,"state","idle"),st(this,"graphicGroup",null),st(this,"levels",[0,.236,.382,.5,.618,.786,1]),st(this,"colors",["#787b86","#f44336","#ff9800","#4caf50","#2196f3","#00bcd4","#787b86"]),st(this,"onClick",t=>{this.state==="idle"?(this.state="drawing",this.startPoint=[t.offsetX,t.offsetY],this.endPoint=[t.offsetX,t.offsetY],this.initGraphic(),this.updateGraphic()):this.state==="drawing"&&(this.state="finished",this.endPoint=[t.offsetX,t.offsetY],this.updateGraphic(),this.saveDrawing(),this.removeGraphic(),this.context.disableTools())}),st(this,"onMouseMove",t=>{this.state==="drawing"&&(this.endPoint=[t.offsetX,t.offsetY],this.updateGraphic())})}onActivate(){this.state="idle",this.startPoint=null,this.endPoint=null,this.context.getChart().getZr().setCursorStyle("crosshair"),this.bindEvents()}onDeactivate(){this.state="idle",this.startPoint=null,this.endPoint=null,this.removeGraphic(),this.unbindEvents(),this.context.getChart().getZr().setCursorStyle("default")}bindEvents(){const e=this.context.getChart().getZr();e.on("click",this.onClick),e.on("mousemove",this.onMouseMove)}unbindEvents(){const e=this.context.getChart().getZr();e.off("click",this.onClick),e.off("mousemove",this.onMouseMove)}initGraphic(){this.graphicGroup=new Z.graphic.Group,this.context.getChart().getZr().add(this.graphicGroup)}removeGraphic(){this.graphicGroup&&(this.context.getChart().getZr().remove(this.graphicGroup),this.graphicGroup=null)}updateGraphic(){if(!this.graphicGroup||!this.startPoint||!this.endPoint)return;this.graphicGroup.removeAll();const e=this.startPoint[0],t=this.startPoint[1],i=this.endPoint[0],s=this.endPoint[1],n=new Z.graphic.Line({shape:{x1:e,y1:t,x2:i,y2:s},style:{stroke:"#999",lineWidth:1,lineDash:[4,4]},silent:!0});this.graphicGroup.add(n);const o=Math.min(e,i),c=Math.max(e,i),r=c-o,l=s-t;this.levels.forEach((f,y)=>{const h=s-l*f,d=this.colors[y%this.colors.length],p=new Z.graphic.Line({shape:{x1:o,y1:h,x2:c,y2:h},style:{stroke:d,lineWidth:1},silent:!0});if(this.graphicGroup.add(p),y<this.levels.length-1){const u=this.levels[y+1],m=s-l*u,w=Math.abs(m-h),C=Math.min(h,m),S=new Z.graphic.Rect({shape:{x:o,y:C,width:r,height:w},style:{fill:this.colors[(y+1)%this.colors.length],opacity:.1},silent:!0});this.graphicGroup.add(S)}})}saveDrawing(){if(!this.startPoint||!this.endPoint)return;const e=this.context.coordinateConversion.pixelToData({x:this.startPoint[0],y:this.startPoint[1]}),t=this.context.coordinateConversion.pixelToData({x:this.endPoint[0],y:this.endPoint[1]});if(e&&t){const i=e.paneIndex||0;this.context.addDrawing({id:`fib-${Date.now()}`,type:"fibonacci",points:[e,t],paneIndex:i,style:{color:"#3b82f6",lineWidth:1}})}}}J.AbstractPlugin=ut,J.FibonacciTool=ue,J.LineTool=ce,J.MeasureTool=re,J.QFChart=ie});