@qfo/qfchart 0.7.1 → 0.7.3

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/dist/index.d.ts CHANGED
@@ -275,9 +275,14 @@ declare class QFChart implements ChartContext {
275
275
  private chartContainer;
276
276
  private overlayContainer;
277
277
  private _lastTables;
278
+ private _lastLayout;
279
+ private _mainHeightOverride;
280
+ private _paneDragState;
281
+ private _paneResizeRafId;
278
282
  constructor(container: HTMLElement, options?: QFChartOptions);
279
283
  private onKeyDown;
280
284
  private onFullscreenChange;
285
+ private bindPaneResizeEvents;
281
286
  private bindDrawingEvents;
282
287
  getChart(): echarts.ECharts;
283
288
  getMarketData(): OHLCV[];
@@ -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(st,ct){typeof exports=="object"&&typeof module<"u"?ct(exports,require("echarts")):typeof define=="function"&&define.amd?define(["exports","echarts"],ct):(st=typeof globalThis<"u"?globalThis:st||self,ct(st.QFChart={},st.echarts))})(this,function(st,ct){"use strict";function Mt(g){var t=Object.create(null);return g&&Object.keys(g).forEach(function(e){if(e!=="default"){var i=Object.getOwnPropertyDescriptor(g,e);Object.defineProperty(t,e,i.get?i:{enumerable:!0,get:function(){return g[e]}})}}),t.default=g,Object.freeze(t)}var W=Mt(ct),_t=Object.defineProperty,Dt=(g,t,e)=>t in g?_t(g,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):g[t]=e,rt=(g,t,e)=>(Dt(g,typeof t!="symbol"?t+"":t,e),e);class zt{constructor(t,e,i,s={}){rt(this,"id"),rt(this,"plots"),rt(this,"paneIndex"),rt(this,"height"),rt(this,"collapsed"),rt(this,"titleColor"),rt(this,"controls"),this.id=t,this.plots=e,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(t){Object.keys(t).forEach(e=>{if(!this.plots[e])this.plots[e]=t[e];else{const i=this.plots[e],s=t[e];if(!i.data)return;s.options&&(i.options={...i.options,...s.options});const n=new Map;i.data?.forEach(l=>{n.set(l.time,l)}),s.data?.forEach(l=>{n.set(l.time,l)}),i.data=Array.from(n.values()).sort((l,d)=>l.time-d.time)}})}}class Z{static createMinFunction(t){return e=>{const i=(e.max-e.min)*(t/100);return e.min-i}}static createMaxFunction(t){return e=>{const i=(e.max-e.min)*(t/100);return e.max+i}}static autoDetectDecimals(t){if(!t||t.length===0)return 2;const e=t[t.length-1].close;if(e===0||!isFinite(e)||isNaN(e))return 2;const i=Math.abs(e);if(i>=1)return 2;const s=Math.ceil(-Math.log10(i));return Math.min(s+4,10)}static formatValue(t,e){return typeof t=="number"?t.toFixed(e):String(t)}}class It{static calculate(t,e,i,s=!1,n=null,l){let d=0;t>0&&(d=1/t*100);const h=i.yAxisPadding!==void 0?i.yAxisPadding:5,c=Array.from(e.values()).map(k=>k.paneIndex).filter(k=>k>0).sort((k,z)=>k-z).filter((k,z,E)=>E.indexOf(k)===z),y=c.length>0,p=i.dataZoom?.visible??!0,f=i.dataZoom?.position??"top",r=i.dataZoom?.height??6,o=i.dataZoom?.start??0,u=i.dataZoom?.end??100;let a=8,x=92,m=-1;if(n)if(n==="main")m=0;else{const k=e.get(n);k&&(m=k.paneIndex)}if(m!==-1){const k=[],z=[],E=[],$=[],H=i.dataZoom?.start??50,O=i.dataZoom?.end??100;(i.dataZoom?.zoomOnTouch??!0)&&$.push({type:"inside",xAxisIndex:"all",start:H,end:O,filterMode:"weakFilter"});const Y=y?Math.max(...c):0,V=[];for(let T=0;T<=Y;T++){const N=T===m;k.push({left:"10%",right:"10%",top:N?"5%":"0%",height:N?"90%":"0%",show:N,containLabel:!1}),z.push({type:"category",gridIndex:T,data:[],show:N,axisLabel:{show:N,color:"#94a3b8",fontFamily:i.fontFamily},axisLine:{show:N,lineStyle:{color:"#334155"}},splitLine:{show:N,lineStyle:{color:"#334155",opacity:.5}}});let it,nt;if(T===0&&m===0?(it=i.yAxisMin!==void 0&&i.yAxisMin!=="auto"?i.yAxisMin:Z.createMinFunction(h),nt=i.yAxisMax!==void 0&&i.yAxisMax!=="auto"?i.yAxisMax:Z.createMaxFunction(h)):(it=Z.createMinFunction(h),nt=Z.createMaxFunction(h)),E.push({position:"right",gridIndex:T,show:N,scale:!0,min:it,max:nt,axisLabel:{show:N,color:"#94a3b8",fontFamily:i.fontFamily,formatter:X=>{if(i.yAxisLabelFormatter)return i.yAxisLabelFormatter(X);const ot=i.yAxisDecimalPlaces!==void 0?i.yAxisDecimalPlaces:Z.autoDetectDecimals(l);return Z.formatValue(X,ot)}},splitLine:{show:N,lineStyle:{color:"#334155",opacity:.5}}}),T>0){const X=Array.from(e.values()).find(ot=>ot.paneIndex===T);X&&V.push({index:T,height:N?90:0,top:N?5:0,isCollapsed:!1,indicatorId:X.id,titleColor:X.titleColor,controls:X.controls})}}return{grid:k,xAxis:z,yAxis:E,dataZoom:$,paneLayout:V,mainPaneHeight:m===0?90:0,mainPaneTop:m===0?5:0,pixelToPercent:d,overlayYAxisMap:new Map,separatePaneYAxisOffset:1}}p?f==="top"?(a=r+4,x=95):(x=100-r-2,a=8):(a=5,x=95);let S=5;t>0&&(S=20/t*100);let I=75,A=[];if(y){const k=c.map(O=>{const Y=Array.from(e.values()).find(V=>V.paneIndex===O);return{index:O,requestedHeight:Y?.height,isCollapsed:Y?.collapsed??!1,indicatorId:Y?.id,titleColor:Y?.titleColor,controls:Y?.controls}}).map(O=>({...O,height:O.isCollapsed?3:O.requestedHeight!==void 0?O.requestedHeight:15})),z=k.reduce((O,Y)=>O+Y.height,0),E=k.length*S,$=z+E;I=x-a-$,s?I=3:I<20&&(I=Math.max(I,10));let H=a+I+S;A=k.map(O=>{const Y={index:O.index,height:O.height,top:H,isCollapsed:O.isCollapsed,indicatorId:O.indicatorId,titleColor:O.titleColor,controls:O.controls};return H+=O.height+S,Y})}else I=x-a,s&&(I=3);const v=[];v.push({left:"10%",right:"10%",top:a+"%",height:I+"%",containLabel:!1}),A.forEach(k=>{v.push({left:"10%",right:"10%",top:k.top+"%",height:k.height+"%",containLabel:!1})});const b=[0,...A.map((k,z)=>z+1)],C=[],w=A.length===0;C.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:k=>{if(i.yAxisLabelFormatter)return i.yAxisLabelFormatter(k);const z=i.yAxisDecimalPlaces!==void 0?i.yAxisDecimalPlaces:Z.autoDetectDecimals(l);return Z.formatValue(k,z)}},axisTick:{show:!s},axisPointer:{label:{show:w,fontSize:11,backgroundColor:"#475569"}}}),A.forEach((k,z)=>{const E=z===A.length-1;C.push({type:"category",gridIndex:z+1,data:[],axisLabel:{show:!1},axisLine:{show:!k.isCollapsed,lineStyle:{color:"#334155"}},axisTick:{show:!1},splitLine:{show:!1},axisPointer:{label:{show:E,fontSize:11,backgroundColor:"#475569"}}})});const M=[];let P,D;i.yAxisMin!==void 0&&i.yAxisMin!=="auto"?P=i.yAxisMin:P=Z.createMinFunction(h),i.yAxisMax!==void 0&&i.yAxisMax!=="auto"?D=i.yAxisMax:D=Z.createMaxFunction(h),M.push({position:"right",scale:!0,min:P,max:D,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:k=>{if(i.yAxisLabelFormatter)return i.yAxisLabelFormatter(k);const z=i.yAxisDecimalPlaces!==void 0?i.yAxisDecimalPlaces:Z.autoDetectDecimals(l);return Z.formatValue(k,z)}}});let _=1,F=-1/0,R=1/0;l&&l.length>0&&(F=Math.min(...l.map(k=>k.low)),R=Math.max(...l.map(k=>k.high)));const G=new Map;e.forEach((k,z)=>{k.paneIndex===0&&!k.collapsed&&l&&l.length>0&&Object.entries(k.plots).forEach(([E,$])=>{const H=`${z}::${E}`,O=["background","barcolor","char"],Y=$.options.style==="shape"&&($.options.location==="abovebar"||$.options.location==="AboveBar"||$.options.location==="belowbar"||$.options.location==="BelowBar");if(O.includes($.options.style)){G.has(H)||(G.set(H,_),_++);return}if($.options.style==="shape"&&!Y){G.has(H)||(G.set(H,_),_++);return}const V=[];if($.data&&Object.values($.data).forEach(T=>{typeof T=="number"&&!isNaN(T)&&isFinite(T)&&V.push(T)}),V.length>0){const T=Math.min(...V),N=Math.max(...V),it=N-T,nt=R-F,X=T>=F*.5&&N<=R*1.5,ot=it>nt*.01;X&&ot||G.has(H)||(G.set(H,_),_++)}})});const Q=G.size>0?_-1:0,U=new Set;G.forEach((k,z)=>{e.forEach(E=>{Object.entries(E.plots).forEach(([$,H])=>{`${E.id}::${$}`===z&&["background","barcolor","char"].includes(H.options.style)&&U.add(k)})})});for(let k=0;k<Q;k++){const z=k+1,E=U.has(z);M.push({position:"left",scale:!E,min:E?0:Z.createMinFunction(h),max:E?1:Z.createMaxFunction(h),gridIndex:0,show:!1,splitLine:{show:!1},axisLine:{show:!1},axisLabel:{show:!1}})}const tt=_;A.forEach((k,z)=>{M.push({position:"right",scale:!0,min:Z.createMinFunction(h),max:Z.createMaxFunction(h),gridIndex:z+1,splitLine:{show:!k.isCollapsed,lineStyle:{color:"#334155",opacity:.3}},axisLabel:{show:!k.isCollapsed,color:"#94a3b8",fontFamily:i.fontFamily||"sans-serif",fontSize:10,formatter:E=>{if(i.yAxisLabelFormatter)return i.yAxisLabelFormatter(E);const $=i.yAxisDecimalPlaces!==void 0?i.yAxisDecimalPlaces:Z.autoDetectDecimals(l);return Z.formatValue(E,$)}},axisLine:{show:!k.isCollapsed,lineStyle:{color:"#334155"}}})});const et=[];return p&&((i.dataZoom?.zoomOnTouch??!0)&&et.push({type:"inside",xAxisIndex:b,start:o,end:u,filterMode:"weakFilter"}),f==="top"?et.push({type:"slider",xAxisIndex:b,top:"1%",height:r+"%",start:o,end:u,borderColor:"#334155",textStyle:{color:"#cbd5e1"},brushSelect:!1,filterMode:"weakFilter"}):et.push({type:"slider",xAxisIndex:b,bottom:"1%",height:r+"%",start:o,end:u,borderColor:"#334155",textStyle:{color:"#cbd5e1"},brushSelect:!1,filterMode:"weakFilter"})),{grid:v,xAxis:C,yAxis:M,dataZoom:et,paneLayout:A,mainPaneHeight:I,mainPaneTop:a,pixelToPercent:d,overlayYAxisMap:G,separatePaneYAxisOffset:tt}}static calculateMaximized(t,e,i){return{grid:[],xAxis:[],yAxis:[],dataZoom:[],paneLayout:[],mainPaneHeight:0,mainPaneTop:0,pixelToPercent:0}}}class Lt{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:n,colorArray:l,plotOptions:d}=t,h="#2962ff";return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(c,y)=>{const p=c.dataIndex;if(p===0)return;const f=y.value(1),r=y.value(2);if(f===null||isNaN(f)||r===null||isNaN(r))return;const o=y.coord([p-1,r]),u=y.coord([p,f]);return{type:"line",shape:{x1:o[0],y1:o[1],x2:u[0],y2:u[1]},style:{stroke:l[p]||d.color||h,lineWidth:d.linewidth||1},silent:!0}},data:n.map((c,y)=>[y,c,y>0?n[y-1]:null])}}}class Et{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:n,colorArray:l,plotOptions:d}=t,h="#2962ff";return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(c,y)=>{const p=y.value(0),f=y.value(1);if(isNaN(f)||f===null)return;const r=y.coord([p,f]),o=y.size([1,0])[0];return{type:"line",shape:{x1:r[0]-o/2,y1:r[1],x2:r[0]+o/2,y2:r[1]},style:{stroke:l[c.dataIndex]||d.color||h,lineWidth:d.linewidth||1},silent:!0}},data:n.map((c,y)=>[y,c])}}}class St{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:n,colorArray:l,plotOptions:d}=t;return{name:e,type:"bar",xAxisIndex:i,yAxisIndex:s,data:n.map((h,c)=>({value:h,itemStyle:l[c]?{color:l[c]}:void 0})),itemStyle:{color:d.color||"#2962ff"}}}}const yt=new Map;function $t(g,t="#00da3c",e="64px"){if(typeof document>"u")return"";const i=`${g}-${t}-${e}`;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 "+e+" Arial",n.fillStyle=t,n.textAlign="center",n.textBaseline="middle",n.fillText(g,16,16);const l=s.toDataURL("image/png");return yt.set(i,l),l}return""}class gt{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:n,colorArray:l,plotOptions:d}=t,h="#2962ff",c=d.style;if(c==="char")return{name:e,type:"scatter",xAxisIndex:i,yAxisIndex:s,symbolSize:0,data:n.map((p,f)=>({value:[f,p],itemStyle:{opacity:0}})),silent:!0};const y=n.map((p,f)=>{if(p===null)return null;const r=l[f]||d.color||h,o={value:[f,p],itemStyle:{color:r}};return c==="cross"?(o.symbol=`image://${$t("+",r,"24px")}`,o.symbolSize=16):(o.symbol="circle",o.symbolSize=6),o}).filter(p=>p!==null);return{name:e,type:"scatter",xAxisIndex:i,yAxisIndex:s,data:y}}}class kt{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:n,colorArray:l,optionsArray:d,plotOptions:h}=t,c="#2962ff",y=h.style==="candle",p=n.map((f,r)=>{if(f===null||!Array.isArray(f)||f.length!==4)return null;const[o,u,a,x]=f,m=d[r]||{},S=m.color||l[r]||h.color||c,I=m.wickcolor||h.wickcolor||S,A=m.bordercolor||h.bordercolor||I;return[r,o,x,a,u,S,I,A]}).filter(f=>f!==null);return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(f,r)=>{const o=r.value(0),u=r.value(1),a=r.value(2),x=r.value(3),m=r.value(4),S=r.value(5),I=r.value(6),A=r.value(7);if(isNaN(u)||isNaN(a)||isNaN(x)||isNaN(m))return null;const v=r.coord([o,0])[0],b=r.coord([o,u])[1],C=r.coord([o,a])[1],w=r.coord([o,x])[1],M=r.coord([o,m])[1],P=r.size([1,0])[0]*.6;if(y){const D=Math.min(b,C),_=Math.max(b,C),F=Math.abs(C-b);return{type:"group",children:[{type:"line",shape:{x1:v,y1:M,x2:v,y2:D},style:{stroke:I,lineWidth:1}},{type:"line",shape:{x1:v,y1:_,x2:v,y2:w},style:{stroke:I,lineWidth:1}},{type:"rect",shape:{x:v-P/2,y:D,width:P,height:F||1},style:{fill:S,stroke:A,lineWidth:1}}]}}else{const D=P*.5;return{type:"group",children:[{type:"line",shape:{x1:v,y1:w,x2:v,y2:M},style:{stroke:S,lineWidth:1}},{type:"line",shape:{x1:v-D,y1:b,x2:v,y2:b},style:{stroke:S,lineWidth:1}},{type:"line",shape:{x1:v,y1:C,x2:v+D,y2:C},style:{stroke:S,lineWidth:1}}]}}},data:p}}}class lt{static getShapeSymbol(t){switch(t){case"arrowdown":case"shape_arrow_down":return"path://M12 24l-12-12h8v-12h8v12h8z";case"arrowup":case"shape_arrow_up":return"path://M12 0l12 12h-8v12h-8v-12h-8z";case"circle":case"shape_circle":return"circle";case"cross":case"shape_cross":return"path://M11 2h2v9h9v2h-9v9h-2v-9h-9v-2h9z";case"diamond":case"shape_diamond":return"diamond";case"flag":case"shape_flag":return"path://M6 2v20h2v-8h12l-2-6 2-6h-12z";case"labeldown":case"shape_label_down":return"path://M2 1h20a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1h-8l-2 3-2-3h-8a1 1 0 0 1-1-1v-14a1 1 0 0 1 1-1z";case"labelleft":case"shape_label_left":return"path://M0 10l3-3v-5a1 1 0 0 1 1-1h18a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1h-18a1 1 0 0 1-1-1v-5z";case"labelright":case"shape_label_right":return"path://M24 10l-3-3v-5a1 1 0 0 0-1-1h-18a1 1 0 0 0-1 1v16a1 1 0 0 0 1 1h18a1 1 0 0 0 1-1v-5z";case"labelup":case"shape_label_up":return"path://M12 1l2 3h8a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1h-20a1 1 0 0 1-1-1v-14a1 1 0 0 1 1-1h8z";case"square":case"shape_square":return"rect";case"triangledown":case"shape_triangle_down":return"path://M12 21l-10-18h20z";case"triangleup":case"shape_triangle_up":return"triangle";case"xcross":case"shape_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(t){return 0}static getShapeSize(t,e,i){if(e!==void 0&&i!==void 0)return[e,i];let s;switch(t){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 e!==void 0?[e,e]:i!==void 0?[i,i]:s}static getLabelConfig(t,e){switch(e){case"abovebar":case"AboveBar":return{position:"top",distance:5};case"belowbar":case"BelowBar":return{position:"bottom",distance:5};case"top":case"Top":return{position:"bottom",distance:5};case"bottom":case"Bottom":return{position:"top",distance:5};case"absolute":case"Absolute":default:return t==="labelup"||t==="labeldown"||t==="shape_label_up"||t==="shape_label_down"?{position:"inside",distance:0}:{position:"top",distance:5}}}}class Tt{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:n,colorArray:l,optionsArray:d,plotOptions:h,candlestickData:c}=t,y="#2962ff",p=n.map((f,r)=>{const o=d[r]||{},u=h,a=o.location||u.location||"absolute";if(a!=="absolute"&&a!=="Absolute"&&!f||f==null)return null;const x=o.color||u.color||y,m=o.shape||u.shape||"circle",S=o.size||u.size||"normal",I=o.text||u.text,A=o.textcolor||u.textcolor||"white",v=o.width||u.width,b=o.height||u.height;let C=f,w=[0,0];a==="abovebar"||a==="AboveBar"||a==="ab"?(c&&c[r]&&(C=c[r].high),w=[0,"-150%"]):a==="belowbar"||a==="BelowBar"||a==="bl"?(c&&c[r]&&(C=c[r].low),w=[0,"150%"]):a==="top"||a==="Top"?(C=f,w=[0,0]):(a==="bottom"||a==="Bottom")&&(C=f,w=[0,0]);const M=lt.getShapeSymbol(m),P=lt.getShapeSize(S,v,b),D=lt.getShapeRotation(m);let _=P;m.includes("label")&&(Array.isArray(P)?_=[P[0]*2.5,P[1]*2.5]:_=P*2.5);const F=lt.getLabelConfig(m,a);return{value:[r,C],symbol:M,symbolSize:_,symbolRotate:D,symbolOffset:w,itemStyle:{color:x},label:{show:!!I,position:F.position,distance:F.distance,formatter:I,color:A,fontSize:10,fontWeight:"bold"}}}).filter(f=>f!==null);return{name:e,type:"scatter",xAxisIndex:i,yAxisIndex:s,data:p}}}class Nt{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:n,colorArray:l}=t;return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,z:-10,renderItem:(d,h)=>{const c=h.value(0);if(isNaN(c))return;const y=h.coord([c,.5]),p=h.size([1,0])[0],f=d.coordSys,r=y[0]-p/2,o=l[d.dataIndex],u=h.value(1);if(!(!o||u===null||u===void 0||isNaN(u)))return{type:"rect",shape:{x:r,y:f.y,width:p,height:f.height},style:{fill:o,opacity:.3},silent:!0}},data:n.map((d,h)=>[h,d!=null&&!isNaN(d)?.5:null])}}}class xt{static parseColor(t){if(!t)return{color:"#888888",opacity:.2};const e=t.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)/);if(e){const i=e[1],s=e[2],n=e[3],l=e[4]?parseFloat(e[4]):1;return{color:`rgb(${i},${s},${n})`,opacity:l}}return{color:t,opacity:.3}}}class Ft{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,plotOptions:n,plotDataArrays:l,indicatorId:d,plotName:h}=t,c=t.dataArray.length,y=n.plot1?`${d}::${n.plot1}`:null,p=n.plot2?`${d}::${n.plot2}`:null;if(!y||!p)return console.warn(`Fill plot "${h}" missing plot1 or plot2 reference`),null;const f=l?.get(y),r=l?.get(p);if(!f||!r)return console.warn(`Fill plot "${h}" references non-existent plots: ${n.plot1}, ${n.plot2}`),null;const{color:o,opacity:u}=xt.parseColor(n.color||"rgba(128, 128, 128, 0.2)"),a=[];for(let x=0;x<c;x++){const m=f[x],S=r[x],I=x>0?f[x-1]:null,A=x>0?r[x-1]:null;a.push([x,m,S,I,A])}return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,z:1,renderItem:(x,m)=>{const S=x.dataIndex;if(S===0)return null;const I=m.value(1),A=m.value(2),v=m.value(3),b=m.value(4);if(I===null||A===null||v===null||b===null||isNaN(I)||isNaN(A)||isNaN(v)||isNaN(b))return null;const C=m.coord([S-1,v]),w=m.coord([S,I]),M=m.coord([S,A]),P=m.coord([S-1,b]);return{type:"polygon",shape:{points:[C,w,M,P]},style:{fill:o,opacity:u},silent:!0}},data:a}}}class Ot{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:n,candlestickData:l,dataIndexOffset:d}=t,h=d||0,c=[];for(let p=0;p<n.length;p++){const f=n[p];if(!f)continue;const r=Array.isArray(f)?f:[f];for(const o of r)o&&typeof o=="object"&&!o._deleted&&c.push(o)}const y=c.map(p=>{const f=p.text||"",r=p.color||"#2962ff",o=p.textcolor||"#ffffff",u=p.yloc||"price",a=p.style||"style_label_down",x=p.size||"normal",m=p.textalign||"align_center",S=p.tooltip||"",I=this.styleToShape(a),A=p.xloc==="bar_index"||p.xloc==="bi"?p.x+h:p.x;let v=p.y,b=[0,0];u==="abovebar"||u==="AboveBar"||u==="ab"?(l&&l[A]&&(v=l[A].high),b=[0,"-150%"]):(u==="belowbar"||u==="BelowBar"||u==="bl")&&(l&&l[A]&&(v=l[A].low),b=[0,"150%"]);const C=lt.getShapeSymbol(I),w=lt.getShapeSize(x),M=this.getSizePx(x);let P;const D=I==="labeldown"||I==="shape_label_down"||I==="labelup"||I==="shape_label_up"||I==="labelleft"||I==="labelright";let _=[0,0];if(D){const Q=f.length*M*.65,U=M*2.5,tt=Math.max(U,Q+M*1.6),et=M*2.8,k=3/24;if(I==="labelleft"||I==="labelright"){const z=tt/(1-k);P=[z,et];const E=typeof b[0]=="string"?0:b[0];I==="labelleft"?(b=[E+z*.42,b[1]],_=[z*k*.5,0]):(b=[E-z*.42,b[1]],_=[-z*k*.5,0])}else{const z=et/(1-k);P=[tt,z],I==="labeldown"?(b=[b[0],typeof b[1]=="string"?b[1]:b[1]-z*.42],_=[0,-z*k*.5]):(b=[b[0],typeof b[1]=="string"?b[1]:b[1]+z*.42],_=[0,z*k*.5])}}else I==="none"?P=0:Array.isArray(w)?P=[w[0]*1.5,w[1]*1.5]:P=w*1.5;const F=this.getLabelPosition(a,u),R=F==="inside"||F.startsWith("inside"),G={value:[A,v],symbol:C,symbolSize:P,symbolOffset:b,itemStyle:{color:r},label:{show:!!f,position:F,distance:R?0:5,offset:_,formatter:f,color:o,fontSize:M,fontWeight:"bold",align:R?"center":m==="align_left"||m==="left"?"left":m==="align_right"||m==="right"?"right":"center",verticalAlign:"middle",padding:[2,6]}};return S&&(G.tooltip={formatter:S}),G}).filter(p=>p!==null);return{name:e,type:"scatter",xAxisIndex:i,yAxisIndex:s,data:y,z:20}}styleToShape(t){switch(t.startsWith("style_")?t.substring(6):t){case"label_down":return"labeldown";case"label_up":return"labelup";case"label_left":return"labelleft";case"label_right":return"labelright";case"label_lower_left":return"labeldown";case"label_lower_right":return"labeldown";case"label_upper_left":return"labelup";case"label_upper_right":return"labelup";case"label_center":return"labeldown";case"circle":return"circle";case"square":return"square";case"diamond":return"diamond";case"flag":return"flag";case"arrowup":return"arrowup";case"arrowdown":return"arrowdown";case"cross":return"cross";case"xcross":return"xcross";case"triangleup":return"triangleup";case"triangledown":return"triangledown";case"text_outline":return"none";case"none":return"none";default:return"labeldown"}}getLabelPosition(t,e){switch(t.startsWith("style_")?t.substring(6):t){case"label_down":case"label_up":case"label_left":case"label_right":case"label_lower_left":case"label_lower_right":case"label_upper_left":case"label_upper_right":case"label_center":return"inside";case"text_outline":case"none":return e==="abovebar"||e==="AboveBar"||e==="ab"?"top":e==="belowbar"||e==="BelowBar"||e==="bl"?"bottom":"top";default:return e==="belowbar"||e==="BelowBar"||e==="bl"?"bottom":"top"}}getSizePx(t){switch(t){case"tiny":return 8;case"small":return 9;case"normal":case"auto":return 10;case"large":return 12;case"huge":return 14;default:return 10}}}class Zt{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:n,dataIndexOffset:l}=t,d=l||0,h="#2962ff",c=[];for(let o=0;o<n.length;o++){const u=n[o];if(!u)continue;const a=Array.isArray(u)?u:[u];for(const x of a)x&&typeof x=="object"&&!x._deleted&&c.push(x)}if(c.length===0)return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,data:[],silent:!0};let y=1/0,p=-1/0;for(const o of c)o.y1<y&&(y=o.y1),o.y1>p&&(p=o.y1),o.y2<y&&(y=o.y2),o.y2>p&&(p=o.y2);const f=(t.candlestickData?.length||0)+d,r=Math.max(0,f-1);return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(o,u)=>{const a=[];for(const x of c){if(x._deleted)continue;const m=x.xloc==="bar_index"||x.xloc==="bi"?d:0;let S=u.coord([x.x1+m,x.y1]),I=u.coord([x.x2+m,x.y2]);const A=x.extend||"none";if(A!=="none"){const w=o.coordSys;[S,I]=this.extendLine(S,I,A,w.x,w.x+w.width,w.y,w.y+w.height)}const v=x.color||h,b=x.width||1;a.push({type:"line",shape:{x1:S[0],y1:S[1],x2:I[0],y2:I[1]},style:{stroke:v,lineWidth:b,lineDash:this.getDashPattern(x.style)}});const C=x.style||"style_solid";if(C==="style_arrow_left"||C==="style_arrow_both"){const w=this.arrowHead(I,S,b,v);w&&a.push(w)}if(C==="style_arrow_right"||C==="style_arrow_both"){const w=this.arrowHead(S,I,b,v);w&&a.push(w)}}return{type:"group",children:a}},data:[[0,r,y,p]],clip:!0,encode:{x:[0,1],y:[2,3]},z:15,silent:!0,emphasis:{disabled:!0}}}getDashPattern(t){switch(t){case"style_dotted":return[2,2];case"style_dashed":return[6,4];default:return}}extendLine(t,e,i,s,n,l,d){const h=e[0]-t[0],c=e[1]-t[1];if(h===0&&c===0)return[t,e];const y=(r,o)=>{let u=1/0;if(o[0]!==0){const a=o[0]>0?(n-r[0])/o[0]:(s-r[0])/o[0];u=Math.min(u,a)}if(o[1]!==0){const a=o[1]>0?(d-r[1])/o[1]:(l-r[1])/o[1];u=Math.min(u,a)}return isFinite(u)||(u=0),[r[0]+u*o[0],r[1]+u*o[1]]};let p=t,f=e;return(i==="right"||i==="both")&&(f=y(t,[h,c])),(i==="left"||i==="both")&&(p=y(e,[-h,-c])),[p,f]}arrowHead(t,e,i,s){const n=e[0]-t[0],l=e[1]-t[1],d=Math.sqrt(n*n+l*l);if(d<1)return null;const h=Math.max(8,i*4),c=n/d,y=l/d,p=e[0]-c*h,f=e[1]-y*h,r=-y*h*.4,o=c*h*.4;return{type:"polygon",shape:{points:[[e[0],e[1]],[p+r,f+o],[p-r,f-o]]},style:{fill:s}}}}class Wt{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:n,dataIndexOffset:l}=t,d=l||0,h=[];for(let r=0;r<n.length;r++){const o=n[r];if(!o)continue;const u=Array.isArray(o)?o:[o];for(const a of u){if(!a||typeof a!="object"||a._deleted)continue;const x=a.line1,m=a.line2;!x||!m||x._deleted||m._deleted||h.push(a)}}if(h.length===0)return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,data:[],silent:!0};let c=1/0,y=-1/0;for(const r of h)for(const o of[r.line1.y1,r.line1.y2,r.line2.y1,r.line2.y2])o<c&&(c=o),o>y&&(y=o);const p=(t.candlestickData?.length||0)+d,f=Math.max(0,p-1);return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(r,o)=>{const u=[];for(const a of h){if(a._deleted)continue;const x=a.line1,m=a.line2;if(!x||!m||x._deleted||m._deleted)continue;const S=x.xloc==="bar_index"||x.xloc==="bi"?d:0,I=m.xloc==="bar_index"||m.xloc==="bi"?d:0;let A=o.coord([x.x1+S,x.y1]),v=o.coord([x.x2+S,x.y2]),b=o.coord([m.x1+I,m.y1]),C=o.coord([m.x2+I,m.y2]);const w=x.extend||"none",M=m.extend||"none";if(w!=="none"||M!=="none"){const _=r.coordSys,F=_.x,R=_.x+_.width,G=_.y,Q=_.y+_.height;w!=="none"&&([A,v]=this.extendLine(A,v,w,F,R,G,Q)),M!=="none"&&([b,C]=this.extendLine(b,C,M,F,R,G,Q))}const{color:P,opacity:D}=xt.parseColor(a.color||"rgba(128, 128, 128, 0.2)");u.push({type:"polygon",shape:{points:[A,v,C,b]},style:{fill:P,opacity:D},silent:!0})}return{type:"group",children:u}},data:[[0,f,c,y]],clip:!0,encode:{x:[0,1],y:[2,3]},z:10,silent:!0,emphasis:{disabled:!0}}}extendLine(t,e,i,s,n,l,d){const h=e[0]-t[0],c=e[1]-t[1];if(h===0&&c===0)return[t,e];const y=(r,o)=>{let u=1/0;if(o[0]!==0){const a=o[0]>0?(n-r[0])/o[0]:(s-r[0])/o[0];u=Math.min(u,a)}if(o[1]!==0){const a=o[1]>0?(d-r[1])/o[1]:(l-r[1])/o[1];u=Math.min(u,a)}return isFinite(u)||(u=0),[r[0]+u*o[0],r[1]+u*o[1]]};let p=t,f=e;return(i==="right"||i==="both")&&(f=y(t,[h,c])),(i==="left"||i==="both")&&(p=y(e,[-h,-c])),[p,f]}}class Gt{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:n,dataIndexOffset:l}=t,d=l||0,h=[];for(let r=0;r<n.length;r++){const o=n[r];if(!o)continue;const u=Array.isArray(o)?o:[o];for(const a of u)a&&typeof a=="object"&&!a._deleted&&a.points&&a.points.length>=2&&h.push(a)}if(h.length===0)return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,data:[],silent:!0};let c=1/0,y=-1/0;for(const r of h)for(const o of r.points){const u=o.price??0;u<c&&(c=u),u>y&&(y=u)}const p=(t.candlestickData?.length||0)+d,f=Math.max(0,p-1);return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(r,o)=>{const u=[];for(const a of h){if(a._deleted)continue;const x=a.points;if(!x||x.length<2)continue;const m=a.xloc==="bi"||a.xloc==="bar_index",S=m?d:0,I=[];for(const C of x){const w=m?(C.index??0)+S:C.time??0,M=C.price??0;I.push(o.coord([w,M]))}if(I.length<2)continue;const A=a.line_color||"#2962ff",v=a.line_width||1,b=this.getDashPattern(a.line_style);if(a.fill_color&&a.fill_color!==""&&a.fill_color!=="na"){const{color:C,opacity:w}=xt.parseColor(a.fill_color);if(a.curved){const M=this.buildCurvedPath(I,a.closed);u.push({type:"path",shape:{pathData:M+" Z"},style:{fill:C,opacity:w,stroke:"none"},silent:!0})}else u.push({type:"polygon",shape:{points:I},style:{fill:C,opacity:w,stroke:"none"},silent:!0})}if(a.curved){const C=this.buildCurvedPath(I,a.closed);u.push({type:"path",shape:{pathData:C},style:{fill:"none",stroke:A,lineWidth:v,lineDash:b},silent:!0})}else{const C=a.closed?[...I,I[0]]:I;u.push({type:"polyline",shape:{points:C},style:{fill:"none",stroke:A,lineWidth:v,lineDash:b},silent:!0})}}return{type:"group",children:u}},data:[[0,f,c,y]],clip:!0,encode:{x:[0,1],y:[2,3]},z:12,silent:!0,emphasis:{disabled:!0}}}buildCurvedPath(t,e){const i=t.length;if(i<2)return"";if(i===2)return`M ${t[0][0]} ${t[0][1]} L ${t[1][0]} ${t[1][1]}`;const s=.5;let n=`M ${t[0][0]} ${t[0][1]}`;const l=h=>e?t[(h%i+i)%i]:h<0?t[0]:h>=i?t[i-1]:t[h],d=e?i:i-1;for(let h=0;h<d;h++){const c=l(h-1),y=l(h),p=l(h+1),f=l(h+2),r=y[0]+(p[0]-c[0])*s/3,o=y[1]+(p[1]-c[1])*s/3,u=p[0]-(f[0]-y[0])*s/3,a=p[1]-(f[1]-y[1])*s/3;n+=` C ${r} ${o}, ${u} ${a}, ${p[0]} ${p[1]}`}return e&&(n+=" Z"),n}getDashPattern(t){switch(t){case"style_dotted":return[2,2];case"style_dashed":return[6,4];default:return}}}function mt(g){if(!g||typeof g!="string")return g;if(g.startsWith("#")){const t=g.slice(1);if(t.length===8){const e=parseInt(t.slice(0,2),16),i=parseInt(t.slice(2,4),16),s=parseInt(t.slice(4,6),16),n=parseInt(t.slice(6,8),16)/255;return`rgba(${e},${i},${s},${n.toFixed(3)})`}}return g}class Ht{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:n,dataIndexOffset:l}=t,d=l||0,h=[];for(let r=0;r<n.length;r++){const o=n[r];if(!o)continue;const u=Array.isArray(o)?o:[o];for(const a of u)a&&typeof a=="object"&&!a._deleted&&h.push(a)}if(h.length===0)return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,data:[],silent:!0};let c=1/0,y=-1/0;for(const r of h)r.top<c&&(c=r.top),r.top>y&&(y=r.top),r.bottom<c&&(c=r.bottom),r.bottom>y&&(y=r.bottom);const p=(t.candlestickData?.length||0)+d,f=Math.max(0,p-1);return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(r,o)=>{const u=[];for(const a of h){if(a._deleted)continue;const x=a.xloc==="bar_index"||a.xloc==="bi"?d:0,m=o.coord([a.left+x,a.top]),S=o.coord([a.right+x,a.bottom]);let I=m[0],A=m[1],v=S[0]-m[0],b=S[1]-m[1];const C=a.extend||"none";if(C!=="none"){const D=r.coordSys;(C==="left"||C==="both")&&(I=D.x,v=C==="both"?D.width:S[0]-D.x),(C==="right"||C==="both")&&C==="right"&&(v=D.x+D.width-m[0])}const w=mt(a.bgcolor)||"#2962ff";u.push({type:"rect",shape:{x:I,y:A,width:v,height:b},style:{fill:w}});const M=mt(a.border_color)||"#2962ff",P=a.border_width??1;if(P>0&&u.push({type:"rect",shape:{x:I,y:A,width:v,height:b},style:{fill:"none",stroke:M,lineWidth:P,lineDash:this.getDashPattern(a.border_style)}}),a.text){const D=this.getTextX(I,v,a.text_halign),_=this.getTextY(A,b,a.text_valign);u.push({type:"text",style:{x:D,y:_,text:a.text,fill:mt(a.text_color)||"#000000",fontSize:this.getSizePixels(a.text_size),fontFamily:a.text_font_family==="monospace"?"monospace":"sans-serif",fontWeight:a.text_formatting==="format_bold"?"bold":"normal",fontStyle:a.text_formatting==="format_italic"?"italic":"normal",textAlign:this.mapHAlign(a.text_halign),textVerticalAlign:this.mapVAlign(a.text_valign)}})}}return{type:"group",children:u}},data:[[0,f,c,y]],clip:!0,encode:{x:[0,1],y:[2,3]},z:14,silent:!0,emphasis:{disabled:!0}}}getDashPattern(t){switch(t){case"style_dotted":return[2,2];case"style_dashed":return[6,4];default:return}}getSizePixels(t){if(typeof t=="number"&&t>0)return t;switch(t){case"auto":case"size.auto":return 12;case"tiny":case"size.tiny":return 8;case"small":case"size.small":return 10;case"normal":case"size.normal":return 14;case"large":case"size.large":return 20;case"huge":case"size.huge":return 36;default:return 12}}mapHAlign(t){switch(t){case"left":case"text.align_left":return"left";case"right":case"text.align_right":return"right";case"center":case"text.align_center":default:return"center"}}mapVAlign(t){switch(t){case"top":case"text.align_top":return"top";case"bottom":case"text.align_bottom":return"bottom";case"center":case"text.align_center":default:return"middle"}}getTextX(t,e,i){switch(i){case"left":case"text.align_left":return t+4;case"right":case"text.align_right":return t+e-4;case"center":case"text.align_center":default:return t+e/2}}getTextY(t,e,i){switch(i){case"top":case"text.align_top":return t+4;case"bottom":case"text.align_bottom":return t+e-4;case"center":case"text.align_center":default:return t+e/2}}}var Bt=Object.defineProperty,Rt=(g,t,e)=>t in g?Bt(g,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):g[t]=e,jt=(g,t,e)=>(Rt(g,typeof t!="symbol"?t+"":t,e),e);const B=class{static register(t,e){this.renderers.set(t,e)}static get(t){return this.renderers.get(t)||this.renderers.get("line")}};jt(B,"renderers",new Map),B.register("line",new Lt),B.register("step",new Et),B.register("histogram",new St),B.register("columns",new St),B.register("circles",new gt),B.register("cross",new gt),B.register("char",new gt),B.register("bar",new kt),B.register("candle",new kt),B.register("shape",new Tt),B.register("background",new Nt),B.register("fill",new Ft),B.register("label",new Ot),B.register("drawing_line",new Zt),B.register("linefill",new Wt),B.register("drawing_polyline",new Gt),B.register("drawing_box",new Ht);let Yt=B;var Vt=Object.defineProperty,qt=(g,t,e)=>t in g?Vt(g,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):g[t]=e,Xt=(g,t,e)=>(qt(g,typeof t!="symbol"?t+"":t,e),e);const Pt=class At{static buildCandlestickSeries(t,e,i){const s=e.upColor||"#00da3c",n=e.downColor||"#ec0000",l=t.map(h=>[h.open,h.close,h.low,h.high]);if(i&&i>l.length){const h=i-l.length;for(let c=0;c<h;c++)l.push(null)}let d;if(e.lastPriceLine?.visible!==!1&&t.length>0){const h=t[t.length-1],c=h.close,y=h.close>=h.open,p=e.lastPriceLine?.color||(y?s:n);let f=e.lastPriceLine?.lineStyle||"dashed";f.startsWith("linestyle_")&&(f=f.replace("linestyle_",""));const r=e.yAxisDecimalPlaces!==void 0?e.yAxisDecimalPlaces:Z.autoDetectDecimals(t);d={symbol:["none","none"],precision:r,data:[{yAxis:c,label:{show:!0,position:"end",formatter:o=>e.yAxisLabelFormatter?e.yAxisLabelFormatter(o.value):Z.formatValue(o.value,r),color:"#fff",backgroundColor:p,padding:[2,4],borderRadius:2,fontSize:11,fontWeight:"bold"},lineStyle:{color:p,type:f,width:1,opacity:.8}}],animation:!1,silent:!0}}return{type:"candlestick",name:e.title||"Market",data:l,itemStyle:{color:s,color0:n,borderColor:s,borderColor0:n},markLine:d,xAxisIndex:0,yAxisIndex:0,z:5}}static buildIndicatorSeries(t,e,i,s,n=0,l,d,h=1){const c=[],y=new Array(s).fill(null),p=new Map;return t.forEach((f,r)=>{f.collapsed||Object.keys(f.plots).sort((o,u)=>{const a=f.plots[o],x=f.plots[u],m=a.options.style==="fill",S=x.options.style==="fill";return m&&!S?1:!m&&S?-1:0}).forEach(o=>{const u=f.plots[o],a=`${r}::${o}`;let x=0,m=0;const S=u.options.overlay;if(f.paneIndex===0||S===!0)x=0,d&&d.has(a)?m=d.get(a):m=0;else{const C=i.findIndex(w=>w.index===f.paneIndex);C!==-1&&(x=C+1,m=h+C)}const I=new Array(s).fill(null),A=new Array(s).fill(null),v=new Array(s).fill(null);if(u.data?.forEach(C=>{const w=e.get(C.time);if(w!==void 0){const M=C.options?.offset??u.options.offset??0,P=w+n+M;if(P>=0&&P<s){let D=C.value;const _=C.options?.color,F=C.options!=null&&"color"in C.options,R=_===null||_==="na"||_==="NaN"||typeof _=="number"&&isNaN(_)||F&&_===void 0;R&&(D=null),I[P]=D,A[P]=R?null:_||u.options.color||At.DEFAULT_COLOR,v[P]=C.options||{}}}}),p.set(`${r}::${o}`,I),u.options?.style?.startsWith("style_")&&(u.options.style=u.options.style.replace("style_","")),u.options.style==="barcolor"){u.data?.forEach(C=>{const w=e.get(C.time);if(w!==void 0){const M=C.options?.offset??u.options.offset??0,P=w+n+M;if(P>=0&&P<s){const D=C.options?.color||u.options.color||At.DEFAULT_COLOR;!(D===null||D==="na"||D==="NaN"||typeof D=="number"&&isNaN(D))&&C.value!==null&&C.value!==void 0&&(y[P]=D)}}});return}if(u.options.style==="table")return;const b=Yt.get(u.options.style).render({seriesName:a,xAxisIndex:x,yAxisIndex:m,dataArray:I,colorArray:A,optionsArray:v,plotOptions:u.options,candlestickData:l,plotDataArrays:p,indicatorId:r,plotName:o,dataIndexOffset:n});b&&c.push(b)})}),{series:c,barColors:y}}};Xt(Pt,"DEFAULT_COLOR","#2962ff");let ut=Pt;class Ut{static build(t,e,i,s=!1,n=null){const l=[],d=t.pixelToPercent,h=t.mainPaneTop;if(!n||n==="main"){const c=10*d;if(l.push({type:"text",left:"8.5%",top:h+c+"%",z:10,style:{text:e.title||"Market",fill:e.titleColor||"#fff",font:`bold 16px ${e.fontFamily||"sans-serif"}`,textVerticalAlign:"top"}}),e.watermark!==!1){const p=t.mainPaneTop+t.mainPaneHeight;l.push({type:"text",right:"11%",top:p-3+"%",z:10,style:{text:"QFChart",fill:e.fontColor||"#cbd5e1",font:"bold 16px sans-serif",opacity:.1},cursor:"pointer",onclick:()=>{window.open("https://quantforge.org","_blank")}})}const y=[];if(e.controls?.collapse&&y.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 ${e.fontFamily}`,x:10,y:10,textAlign:"center",textVerticalAlign:"middle"},silent:!0}]}),e.controls?.maximize){const p=n==="main",f=e.controls?.collapse?25:0;y.push({type:"group",x:f,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:p?"\u2750":"\u25A1",fill:"#cbd5e1",font:`14px ${e.fontFamily}`,x:10,y:10,textAlign:"center",textVerticalAlign:"middle"},silent:!0}]})}if(e.controls?.fullscreen){let p=0;e.controls?.collapse&&(p+=25),e.controls?.maximize&&(p+=25),y.push({type:"group",x:p,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 ${e.fontFamily}`,x:10,y:10,textAlign:"center",textVerticalAlign:"middle"},silent:!0}]})}y.length>0&&l.push({type:"group",right:"10.5%",top:h+"%",children:y})}return t.paneLayout.forEach(c=>{if(n&&c.indicatorId!==n)return;l.push({type:"text",left:"8.5%",top:c.top+10*d+"%",z:10,style:{text:c.indicatorId||"",fill:c.titleColor||"#fff",font:`bold 12px ${e.fontFamily||"sans-serif"}`,textVerticalAlign:"top"}});const y=[];if(c.controls?.collapse&&y.push({type:"group",children:[{type:"rect",shape:{width:20,height:20,r:2},style:{fill:"#334155",stroke:"#475569",lineWidth:1},onclick:()=>c.indicatorId&&i(c.indicatorId,"collapse")},{type:"text",style:{text:c.isCollapsed?"+":"\u2212",fill:"#cbd5e1",font:`bold 14px ${e.fontFamily}`,x:10,y:10,textAlign:"center",textVerticalAlign:"middle"},silent:!0}]}),c.controls?.maximize){const p=n===c.indicatorId,f=c.controls?.collapse?25:0;y.push({type:"group",x:f,children:[{type:"rect",shape:{width:20,height:20,r:2},style:{fill:"#334155",stroke:"#475569",lineWidth:1},onclick:()=>c.indicatorId&&i(c.indicatorId,"maximize")},{type:"text",style:{text:p?"\u2750":"\u25A1",fill:"#cbd5e1",font:`14px ${e.fontFamily}`,x:10,y:10,textAlign:"center",textVerticalAlign:"middle"},silent:!0}]})}y.length>0&&l.push({type:"group",right:"10.5%",top:c.top+"%",children:y})}),l}}class Jt{static format(t,e){if(!t||t.length===0)return"";const i=e.title||"Market",s=e.upColor||"#00da3c",n=e.downColor||"#ec0000",l=e.fontFamily||"sans-serif",d=t[0].axisValue;let h=`<div style="font-weight: bold; margin-bottom: 5px; color: #cbd5e1; font-family: ${l};">${d}</div>`;const c=t.find(p=>p.seriesType==="candlestick"),y=t.filter(p=>p.seriesType!=="candlestick");if(c){const[p,f,r,o,u]=c.value,a=r>=f?s:n;h+=`
18
- <div style="margin-bottom: 8px; font-family: ${l};">
19
- <div style="display:flex; justify-content:space-between; color:${a}; font-weight:bold;">
17
+ (function(nt,ut){typeof exports=="object"&&typeof module<"u"?ut(exports,require("echarts")):typeof define=="function"&&define.amd?define(["exports","echarts"],ut):(nt=typeof globalThis<"u"?globalThis:nt||self,ut(nt.QFChart={},nt.echarts))})(this,function(nt,ut){"use strict";function Pt(x){var t=Object.create(null);return x&&Object.keys(x).forEach(function(e){if(e!=="default"){var i=Object.getOwnPropertyDescriptor(x,e);Object.defineProperty(t,e,i.get?i:{enumerable:!0,get:function(){return x[e]}})}}),t.default=x,Object.freeze(t)}var H=Pt(ut),Dt=Object.defineProperty,Mt=(x,t,e)=>t in x?Dt(x,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):x[t]=e,ht=(x,t,e)=>(Mt(x,typeof t!="symbol"?t+"":t,e),e);class zt{constructor(t,e,i,s={}){ht(this,"id"),ht(this,"plots"),ht(this,"paneIndex"),ht(this,"height"),ht(this,"collapsed"),ht(this,"titleColor"),ht(this,"controls"),this.id=t,this.plots=e,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(t){Object.keys(t).forEach(e=>{if(!this.plots[e])this.plots[e]=t[e];else{const i=this.plots[e],s=t[e];if(!i.data)return;s.options&&(i.options={...i.options,...s.options});const a=new Map;i.data?.forEach(o=>{a.set(o.time,o)}),s.data?.forEach(o=>{a.set(o.time,o)}),i.data=Array.from(a.values()).sort((o,u)=>o.time-u.time)}})}}class Z{static createMinFunction(t){return e=>{const i=(e.max-e.min)*(t/100);return e.min-i}}static createMaxFunction(t){return e=>{const i=(e.max-e.min)*(t/100);return e.max+i}}static autoDetectDecimals(t){if(!t||t.length===0)return 2;const e=t[t.length-1].close;if(e===0||!isFinite(e)||isNaN(e))return 2;const i=Math.abs(e);if(i>=1)return 2;const s=Math.ceil(-Math.log10(i));return Math.min(s+4,10)}static formatValue(t,e){return typeof t=="number"?t.toFixed(e):String(t)}}class At{static calculate(t,e,i,s=!1,a=null,o,u){let d=0;t>0&&(d=1/t*100);const p=i.yAxisPadding!==void 0?i.yAxisPadding:5,g=Array.from(e.values()).map(S=>S.paneIndex).filter(S=>S>0).sort((S,L)=>S-L).filter((S,L,N)=>N.indexOf(S)===L),r=g.length>0,l=i.dataZoom?.visible??!0,h=i.dataZoom?.position??"top",n=i.dataZoom?.height??6,c=i.dataZoom?.start??0,f=i.dataZoom?.end??100;let m=8,w=92,C=-1;if(a)if(a==="main")C=0;else{const S=e.get(a);S&&(C=S.paneIndex)}if(C!==-1){const S=[],L=[],N=[],R=[],V=i.dataZoom?.start??50,E=i.dataZoom?.end??100;(i.dataZoom?.zoomOnTouch??!0)&&R.push({type:"inside",xAxisIndex:"all",start:V,end:E,filterMode:"weakFilter"});const T=r?Math.max(...g):0,B=[];for(let O=0;O<=T;O++){const j=O===C;S.push({left:"10%",right:"10%",top:j?"5%":"0%",height:j?"90%":"0%",show:j,containLabel:!1}),L.push({type:"category",gridIndex:O,data:[],show:j,axisLabel:{show:j,color:"#94a3b8",fontFamily:i.fontFamily},axisLine:{show:j,lineStyle:{color:"#334155"}},splitLine:{show:j,lineStyle:{color:"#334155",opacity:.5}}});let st,at;if(O===0&&C===0?(st=i.yAxisMin!==void 0&&i.yAxisMin!=="auto"?i.yAxisMin:Z.createMinFunction(p),at=i.yAxisMax!==void 0&&i.yAxisMax!=="auto"?i.yAxisMax:Z.createMaxFunction(p)):(st=Z.createMinFunction(p),at=Z.createMaxFunction(p)),N.push({position:"right",gridIndex:O,show:j,scale:!0,min:st,max:at,axisLabel:{show:j,color:"#94a3b8",fontFamily:i.fontFamily,formatter:Q=>{if(i.yAxisLabelFormatter)return i.yAxisLabelFormatter(Q);const rt=i.yAxisDecimalPlaces!==void 0?i.yAxisDecimalPlaces:Z.autoDetectDecimals(o);return Z.formatValue(Q,rt)}},splitLine:{show:j,lineStyle:{color:"#334155",opacity:.5}}}),O>0){const Q=Array.from(e.values()).find(rt=>rt.paneIndex===O);Q&&B.push({index:O,height:j?90:0,top:j?5:0,isCollapsed:!1,indicatorId:Q.id,titleColor:Q.titleColor,controls:Q.controls})}}return{grid:S,xAxis:L,yAxis:N,dataZoom:R,paneLayout:B,mainPaneHeight:C===0?90:0,mainPaneTop:C===0?5:0,pixelToPercent:d,overlayYAxisMap:new Map,separatePaneYAxisOffset:1}}l?h==="top"?(m=n+4,w=95):(w=100-n-2,m=8):(m=5,w=95);let A=5;t>0&&(A=20/t*100);let v=75,y=[];if(r){const S=g.map(E=>{const T=Array.from(e.values()).find(B=>B.paneIndex===E);return{index:E,requestedHeight:T?.height,isCollapsed:T?.collapsed??!1,indicatorId:T?.id,titleColor:T?.titleColor,controls:T?.controls}}).map(E=>({...E,height:E.isCollapsed?3:E.requestedHeight!==void 0?E.requestedHeight:15})),L=S.reduce((E,T)=>E+T.height,0),N=S.length*A,R=L+N;v=w-m-R,u!==void 0&&u>0&&!s?v=u:s?v=3:v<20&&(v=Math.max(v,10));let V=m+v+A;y=S.map(E=>{const T={index:E.index,height:E.height,top:V,isCollapsed:E.isCollapsed,indicatorId:E.indicatorId,titleColor:E.titleColor,controls:E.controls};return V+=E.height+A,T})}else v=w-m,s&&(v=3);const b=[];if(y.length>0){b.push({yPercent:m+v+A/2,aboveId:"main",belowId:y[0].indicatorId||""});for(let S=0;S<y.length-1;S++)b.push({yPercent:y[S].top+y[S].height+A/2,aboveId:y[S].indicatorId||"",belowId:y[S+1].indicatorId||""})}const _=[];_.push({left:"10%",right:"10%",top:m+"%",height:v+"%",containLabel:!1}),y.forEach(S=>{_.push({left:"10%",right:"10%",top:S.top+"%",height:S.height+"%",containLabel:!1})});const I=[0,...y.map((S,L)=>L+1)],P=[],k=y.length===0;P.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:S=>{if(i.yAxisLabelFormatter)return i.yAxisLabelFormatter(S);const L=i.yAxisDecimalPlaces!==void 0?i.yAxisDecimalPlaces:Z.autoDetectDecimals(o);return Z.formatValue(S,L)}},axisTick:{show:!s},axisPointer:{label:{show:k,fontSize:11,backgroundColor:"#475569"}}}),y.forEach((S,L)=>{const N=L===y.length-1;P.push({type:"category",gridIndex:L+1,data:[],axisLabel:{show:!1},axisLine:{show:!S.isCollapsed,lineStyle:{color:"#334155"}},axisTick:{show:!1},splitLine:{show:!1},axisPointer:{label:{show:N,fontSize:11,backgroundColor:"#475569"}}})});const D=[];let M,$;i.yAxisMin!==void 0&&i.yAxisMin!=="auto"?M=i.yAxisMin:M=Z.createMinFunction(p),i.yAxisMax!==void 0&&i.yAxisMax!=="auto"?$=i.yAxisMax:$=Z.createMaxFunction(p),D.push({position:"right",scale:!0,min:M,max:$,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:S=>{if(i.yAxisLabelFormatter)return i.yAxisLabelFormatter(S);const L=i.yAxisDecimalPlaces!==void 0?i.yAxisDecimalPlaces:Z.autoDetectDecimals(o);return Z.formatValue(S,L)}}});let F=1,U=-1/0,tt=1/0;o&&o.length>0&&(U=Math.min(...o.map(S=>S.low)),tt=Math.max(...o.map(S=>S.high)));const W=new Map;e.forEach((S,L)=>{S.paneIndex===0&&!S.collapsed&&o&&o.length>0&&Object.entries(S.plots).forEach(([N,R])=>{const V=`${L}::${N}`,E=["background","barcolor","char"],T=R.options.style==="shape"&&(R.options.location==="abovebar"||R.options.location==="AboveBar"||R.options.location==="belowbar"||R.options.location==="BelowBar");if(E.includes(R.options.style)){W.has(V)||(W.set(V,F),F++);return}if(R.options.style==="shape"&&!T){W.has(V)||(W.set(V,F),F++);return}const B=[];if(R.data&&Object.values(R.data).forEach(O=>{typeof O=="number"&&!isNaN(O)&&isFinite(O)&&B.push(O)}),B.length>0){const O=Math.min(...B),j=Math.max(...B),st=j-O,at=tt-U,Q=O>=U*.5&&j<=tt*1.5,rt=st>at*.01;Q&&rt||W.has(V)||(W.set(V,F),F++)}})});const et=W.size>0?F-1:0,ot=new Set;W.forEach((S,L)=>{e.forEach(N=>{Object.entries(N.plots).forEach(([R,V])=>{`${N.id}::${R}`===L&&["background","barcolor","char"].includes(V.options.style)&&ot.add(S)})})});for(let S=0;S<et;S++){const L=S+1,N=ot.has(L);D.push({position:"left",scale:!N,min:N?0:Z.createMinFunction(p),max:N?1:Z.createMaxFunction(p),gridIndex:0,show:!1,splitLine:{show:!1},axisLine:{show:!1},axisLabel:{show:!1}})}const it=F;y.forEach((S,L)=>{D.push({position:"right",scale:!0,min:Z.createMinFunction(p),max:Z.createMaxFunction(p),gridIndex:L+1,splitLine:{show:!S.isCollapsed,lineStyle:{color:"#334155",opacity:.3}},axisLabel:{show:!S.isCollapsed,color:"#94a3b8",fontFamily:i.fontFamily||"sans-serif",fontSize:10,formatter:N=>{if(i.yAxisLabelFormatter)return i.yAxisLabelFormatter(N);const R=i.yAxisDecimalPlaces!==void 0?i.yAxisDecimalPlaces:Z.autoDetectDecimals(o);return Z.formatValue(N,R)}},axisLine:{show:!S.isCollapsed,lineStyle:{color:"#334155"}}})});const G=[];return l&&((i.dataZoom?.zoomOnTouch??!0)&&G.push({type:"inside",xAxisIndex:I,start:c,end:f,filterMode:"weakFilter"}),h==="top"?G.push({type:"slider",xAxisIndex:I,top:"1%",height:n+"%",start:c,end:f,borderColor:"#334155",textStyle:{color:"#cbd5e1"},brushSelect:!1,filterMode:"weakFilter"}):G.push({type:"slider",xAxisIndex:I,bottom:"1%",height:n+"%",start:c,end:f,borderColor:"#334155",textStyle:{color:"#cbd5e1"},brushSelect:!1,filterMode:"weakFilter"})),{grid:_,xAxis:P,yAxis:D,dataZoom:G,paneLayout:y,mainPaneHeight:v,mainPaneTop:m,pixelToPercent:d,paneBoundaries:b,overlayYAxisMap:W,separatePaneYAxisOffset:it}}static calculateMaximized(t,e,i){return{grid:[],xAxis:[],yAxis:[],dataZoom:[],paneLayout:[],mainPaneHeight:0,mainPaneTop:0,pixelToPercent:0,paneBoundaries:[]}}}class Lt{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:a,colorArray:o,plotOptions:u}=t,d="#2962ff";return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(p,g)=>{const r=p.dataIndex;if(r===0)return;const l=g.value(1),h=g.value(2);if(l===null||isNaN(l)||h===null||isNaN(h))return;const n=g.coord([r-1,h]),c=g.coord([r,l]);return{type:"line",shape:{x1:n[0],y1:n[1],x2:c[0],y2:c[1]},style:{stroke:o[r]||u.color||d,lineWidth:u.linewidth||1},silent:!0}},data:a.map((p,g)=>[g,p,g>0?a[g-1]:null])}}}class $t{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:a,colorArray:o,plotOptions:u}=t,d="#2962ff";return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(p,g)=>{const r=g.value(0),l=g.value(1);if(isNaN(l)||l===null)return;const h=g.coord([r,l]),n=g.size([1,0])[0];return{type:"line",shape:{x1:h[0]-n/2,y1:h[1],x2:h[0]+n/2,y2:h[1]},style:{stroke:o[p.dataIndex]||u.color||d,lineWidth:u.linewidth||1},silent:!0}},data:a.map((p,g)=>[g,p])}}}class St{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:a,colorArray:o,plotOptions:u}=t,d="#2962ff",p=u.histbase??0,g=u.style==="columns",r=u.linewidth??1,l=a.map((h,n)=>h==null||typeof h=="number"&&isNaN(h)?null:[n,h,o[n]||u.color||d]);return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(h,n)=>{const c=n.value(0),f=n.value(1),m=n.value(2);if(f==null||isNaN(f))return null;const w=n.coord([c,p]),C=n.coord([c,f]),A=n.size([1,0])[0];let v;g?v=A*.6:v=Math.max(1,r);const y=w[0],b=w[1],_=C[1],I=Math.min(b,_),P=Math.abs(_-b);return{type:"rect",shape:{x:y-v/2,y:I,width:v,height:P||1},style:{fill:m}}},data:l.filter(h=>h!==null)}}}const mt=new Map;function Et(x,t="#00da3c",e="64px"){if(typeof document>"u")return"";const i=`${x}-${t}-${e}`;if(mt.has(i))return mt.get(i);const s=document.createElement("canvas"),a=s.getContext("2d");if(s.width=32,s.height=32,a){a.font="bold "+e+" Arial",a.fillStyle=t,a.textAlign="center",a.textBaseline="middle",a.fillText(x,16,16);const o=s.toDataURL("image/png");return mt.set(i,o),o}return""}class bt{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:a,colorArray:o,plotOptions:u}=t,d="#2962ff",p=u.style;if(p==="char")return{name:e,type:"scatter",xAxisIndex:i,yAxisIndex:s,symbolSize:0,data:a.map((r,l)=>({value:[l,r],itemStyle:{opacity:0}})),silent:!0};const g=a.map((r,l)=>{if(r===null)return null;const h=o[l]||u.color||d,n={value:[l,r],itemStyle:{color:h}};return p==="cross"?(n.symbol=`image://${Et("+",h,"24px")}`,n.symbolSize=16):(n.symbol="circle",n.symbolSize=6),n}).filter(r=>r!==null);return{name:e,type:"scatter",xAxisIndex:i,yAxisIndex:s,data:g}}}class _t{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:a,colorArray:o,optionsArray:u,plotOptions:d}=t,p="#2962ff",g=d.style==="candle",r=a.map((l,h)=>{if(l===null||!Array.isArray(l)||l.length!==4)return null;const[n,c,f,m]=l,w=u[h]||{},C=w.color||o[h]||d.color||p,A=w.wickcolor||d.wickcolor||C,v=w.bordercolor||d.bordercolor||A;return[h,n,m,f,c,C,A,v]}).filter(l=>l!==null);return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(l,h)=>{const n=h.value(0),c=h.value(1),f=h.value(2),m=h.value(3),w=h.value(4),C=h.value(5),A=h.value(6),v=h.value(7);if(isNaN(c)||isNaN(f)||isNaN(m)||isNaN(w))return null;const y=h.coord([n,0])[0],b=h.coord([n,c])[1],_=h.coord([n,f])[1],I=h.coord([n,m])[1],P=h.coord([n,w])[1],k=h.size([1,0])[0]*.6;if(g){const D=Math.min(b,_),M=Math.max(b,_),$=Math.abs(_-b);return{type:"group",children:[{type:"line",shape:{x1:y,y1:P,x2:y,y2:D},style:{stroke:A,lineWidth:1}},{type:"line",shape:{x1:y,y1:M,x2:y,y2:I},style:{stroke:A,lineWidth:1}},{type:"rect",shape:{x:y-k/2,y:D,width:k,height:$||1},style:{fill:C,stroke:v,lineWidth:1}}]}}else{const D=k*.5;return{type:"group",children:[{type:"line",shape:{x1:y,y1:I,x2:y,y2:P},style:{stroke:C,lineWidth:1}},{type:"line",shape:{x1:y-D,y1:b,x2:y,y2:b},style:{stroke:C,lineWidth:1}},{type:"line",shape:{x1:y,y1:_,x2:y+D,y2:_},style:{stroke:C,lineWidth:1}}]}}},data:r}}}class dt{static getShapeSymbol(t){switch(t){case"arrowdown":case"shape_arrow_down":return"path://M12 24l-12-12h8v-12h8v12h8z";case"arrowup":case"shape_arrow_up":return"path://M12 0l12 12h-8v12h-8v-12h-8z";case"circle":case"shape_circle":return"circle";case"cross":case"shape_cross":return"path://M11 2h2v9h9v2h-9v9h-2v-9h-9v-2h9z";case"diamond":case"shape_diamond":return"diamond";case"flag":case"shape_flag":return"path://M6 2v20h2v-8h12l-2-6 2-6h-12z";case"labeldown":case"shape_label_down":return"path://M2 1h20a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1h-8l-2 3-2-3h-8a1 1 0 0 1-1-1v-14a1 1 0 0 1 1-1z";case"labelleft":case"shape_label_left":return"path://M0 10l3-3v-5a1 1 0 0 1 1-1h18a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1h-18a1 1 0 0 1-1-1v-5z";case"labelright":case"shape_label_right":return"path://M24 10l-3-3v-5a1 1 0 0 0-1-1h-18a1 1 0 0 0-1 1v16a1 1 0 0 0 1 1h18a1 1 0 0 0 1-1v-5z";case"labelup":case"shape_label_up":return"path://M12 1l2 3h8a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1h-20a1 1 0 0 1-1-1v-14a1 1 0 0 1 1-1h8z";case"square":case"shape_square":return"rect";case"triangledown":case"shape_triangle_down":return"path://M12 21l-10-18h20z";case"triangleup":case"shape_triangle_up":return"triangle";case"xcross":case"shape_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(t){return 0}static getShapeSize(t,e,i){if(e!==void 0&&i!==void 0)return[e,i];let s;switch(t){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 e!==void 0?[e,e]:i!==void 0?[i,i]:s}static getLabelConfig(t,e){switch(e){case"abovebar":case"AboveBar":return{position:"top",distance:5};case"belowbar":case"BelowBar":return{position:"bottom",distance:5};case"top":case"Top":return{position:"bottom",distance:5};case"bottom":case"Bottom":return{position:"top",distance:5};case"absolute":case"Absolute":default:return t==="labelup"||t==="labeldown"||t==="shape_label_up"||t==="shape_label_down"?{position:"inside",distance:0}:{position:"top",distance:5}}}}class Nt{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:a,colorArray:o,optionsArray:u,plotOptions:d,candlestickData:p}=t,g="#2962ff",r=a.map((l,h)=>{const n=u[h]||{},c=d,f=n.location||c.location||"absolute";if(f!=="absolute"&&f!=="Absolute"&&!l||l==null)return null;const m=n.color||c.color||g,w=n.shape||c.shape||"circle",C=n.size||c.size||"normal",A=n.text||c.text,v=n.textcolor||c.textcolor||"white",y=n.width||c.width,b=n.height||c.height;let _=l,I=[0,0];f==="abovebar"||f==="AboveBar"||f==="ab"?(p&&p[h]&&(_=p[h].high),I=[0,"-150%"]):f==="belowbar"||f==="BelowBar"||f==="bl"?(p&&p[h]&&(_=p[h].low),I=[0,"150%"]):f==="top"||f==="Top"?(_=l,I=[0,0]):(f==="bottom"||f==="Bottom")&&(_=l,I=[0,0]);const P=dt.getShapeSymbol(w),k=dt.getShapeSize(C,y,b),D=dt.getShapeRotation(w);let M=k;w.includes("label")&&(Array.isArray(k)?M=[k[0]*2.5,k[1]*2.5]:M=k*2.5);const $=dt.getLabelConfig(w,f);return{value:[h,_],symbol:P,symbolSize:M,symbolRotate:D,symbolOffset:I,itemStyle:{color:m},label:{show:!!A,position:$.position,distance:$.distance,formatter:A,color:v,fontSize:10,fontWeight:"bold"}}}).filter(l=>l!==null);return{name:e,type:"scatter",xAxisIndex:i,yAxisIndex:s,data:r}}}class Ft{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:a,colorArray:o}=t;return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,z:-10,renderItem:(u,d)=>{const p=d.value(0);if(isNaN(p))return;const g=d.coord([p,.5]),r=d.size([1,0])[0],l=u.coordSys,h=g[0]-r/2,n=o[u.dataIndex],c=d.value(1);if(!(!n||c===null||c===void 0||isNaN(c)))return{type:"rect",shape:{x:h,y:l.y,width:r,height:l.height},style:{fill:n,opacity:.3},silent:!0}},data:a.map((u,d)=>[d,u!=null&&!isNaN(u)?.5:null])}}}class ct{static parseColor(t){if(!t)return{color:"#888888",opacity:.2};const e=t.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)/);if(e){const s=e[1],a=e[2],o=e[3],u=e[4]?parseFloat(e[4]):1;return{color:`rgb(${s},${a},${o})`,opacity:u}}const i=t.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);if(i){const s=parseInt(i[1],16),a=parseInt(i[2],16),o=parseInt(i[3],16),u=parseInt(i[4],16)/255;return{color:`rgb(${s},${a},${o})`,opacity:u}}return{color:t,opacity:.3}}static toRgba(t,e){const i=t.match(/rgb\((\d+),\s*(\d+),\s*(\d+)\)/);if(i)return`rgba(${i[1]},${i[2]},${i[3]},${e})`;const s=t.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);if(s){const o=parseInt(s[1],16),u=parseInt(s[2],16),d=parseInt(s[3],16);return`rgba(${o},${u},${d},${e})`}const a=t.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);if(a){const o=parseInt(a[1],16),u=parseInt(a[2],16),d=parseInt(a[3],16);return`rgba(${o},${u},${d},${e})`}return t}}class Tt{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,plotOptions:a,plotDataArrays:o,indicatorId:u,plotName:d,optionsArray:p}=t,g=t.dataArray.length,r=a.plot1?`${u}::${a.plot1}`:null,l=a.plot2?`${u}::${a.plot2}`:null;if(!r||!l)return console.warn(`Fill plot "${d}" missing plot1 or plot2 reference`),null;const h=o?.get(r),n=o?.get(l);if(!h||!n)return console.warn(`Fill plot "${d}" references non-existent plots: ${a.plot1}, ${a.plot2}`),null;if(a.gradient===!0)return this.renderGradientFill(e,i,s,h,n,g,p,a);const{color:c,opacity:f}=ct.parseColor(a.color||"rgba(128, 128, 128, 0.2)"),m=[];for(let w=0;w<g;w++){const C=h[w],A=n[w],v=w>0?h[w-1]:null,y=w>0?n[w-1]:null;m.push([w,C,A,v,y])}return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,z:1,renderItem:(w,C)=>{const A=w.dataIndex;if(A===0)return null;const v=C.value(1),y=C.value(2),b=C.value(3),_=C.value(4);if(v===null||y===null||b===null||_===null||isNaN(v)||isNaN(y)||isNaN(b)||isNaN(_))return null;const I=C.coord([A-1,b]),P=C.coord([A,v]),k=C.coord([A,y]),D=C.coord([A-1,_]);return{type:"polygon",shape:{points:[I,P,k,D]},style:{fill:c,opacity:f},silent:!0}},data:m}}renderGradientFill(t,e,i,s,a,o,u,d){const p=[];for(let r=0;r<o;r++){const l=u?.[r];if(l&&l.top_color!==void 0){const h=ct.parseColor(l.top_color),n=ct.parseColor(l.bottom_color);p[r]={topColor:h.color,topOpacity:h.opacity,bottomColor:n.color,bottomOpacity:n.opacity}}else p[r]={topColor:"rgba(128,128,128,0.2)",topOpacity:.2,bottomColor:"rgba(128,128,128,0.2)",bottomOpacity:.2}}const g=[];for(let r=0;r<o;r++){const l=s[r],h=a[r],n=r>0?s[r-1]:null,c=r>0?a[r-1]:null;g.push([r,l,h,n,c])}return{name:t,type:"custom",xAxisIndex:e,yAxisIndex:i,z:1,renderItem:(r,l)=>{const h=r.dataIndex;if(h===0)return null;const n=l.value(1),c=l.value(2),f=l.value(3),m=l.value(4);if(n===null||c===null||f===null||m===null||isNaN(n)||isNaN(c)||isNaN(f)||isNaN(m))return null;const w=l.coord([h-1,f]),C=l.coord([h,n]),A=l.coord([h,c]),v=l.coord([h-1,m]),y=p[h]||p[h-1];if(!y)return null;const b=ct.toRgba(y.topColor,y.topOpacity),_=ct.toRgba(y.bottomColor,y.bottomOpacity),I=n>=c;return{type:"polygon",shape:{points:[w,C,A,v]},style:{fill:{type:"linear",x:0,y:0,x2:0,y2:1,colorStops:[{offset:0,color:I?b:_},{offset:1,color:I?_:b}]}},silent:!0}},data:g}}}class Ot{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:a,candlestickData:o,dataIndexOffset:u}=t,d=u||0,p=[];for(let r=0;r<a.length;r++){const l=a[r];if(!l)continue;const h=Array.isArray(l)?l:[l];for(const n of h)n&&typeof n=="object"&&!n._deleted&&p.push(n)}const g=p.map(r=>{const l=r.text||"",h=r.color||"#2962ff",n=r.textcolor||"#ffffff",c=r.yloc||"price",f=r.style||"style_label_down",m=r.size||"normal",w=r.textalign||"align_center",C=r.tooltip||"",A=this.styleToShape(f),v=r.xloc==="bar_index"||r.xloc==="bi"?r.x+d:r.x;let y=r.y,b=[0,0];c==="abovebar"||c==="AboveBar"||c==="ab"?(o&&o[v]&&(y=o[v].high),b=[0,"-150%"]):(c==="belowbar"||c==="BelowBar"||c==="bl")&&(o&&o[v]&&(y=o[v].low),b=[0,"150%"]);const _=dt.getShapeSymbol(A),I=dt.getShapeSize(m),P=this.getSizePx(m);let k;const D=A==="labeldown"||A==="shape_label_down"||A==="labelup"||A==="shape_label_up"||A==="labelleft"||A==="labelright";let M=[0,0];if(D){const tt=l.length*P*.65,W=P*2.5,et=Math.max(W,tt+P*1.6),ot=P*2.8,it=3/24;if(A==="labelleft"||A==="labelright"){const G=et/(1-it);k=[G,ot];const S=typeof b[0]=="string"?0:b[0];A==="labelleft"?(b=[S+G*.42,b[1]],M=[G*it*.5,0]):(b=[S-G*.42,b[1]],M=[-G*it*.5,0])}else{const G=ot/(1-it);k=[et,G],A==="labeldown"?(b=[b[0],typeof b[1]=="string"?b[1]:b[1]-G*.42],M=[0,-G*it*.5]):(b=[b[0],typeof b[1]=="string"?b[1]:b[1]+G*.42],M=[0,G*it*.5])}}else A==="none"?k=0:Array.isArray(I)?k=[I[0]*1.5,I[1]*1.5]:k=I*1.5;const $=this.getLabelPosition(f,c),F=$==="inside"||$.startsWith("inside"),U={value:[v,y],symbol:_,symbolSize:k,symbolOffset:b,itemStyle:{color:h},label:{show:!!l,position:$,distance:F?0:5,offset:M,formatter:l,color:n,fontSize:P,fontWeight:"bold",align:F?"center":w==="align_left"||w==="left"?"left":w==="align_right"||w==="right"?"right":"center",verticalAlign:"middle",padding:[2,6]}};return C&&(U.tooltip={formatter:C}),U}).filter(r=>r!==null);return{name:e,type:"scatter",xAxisIndex:i,yAxisIndex:s,data:g,z:20}}styleToShape(t){switch(t.startsWith("style_")?t.substring(6):t){case"label_down":return"labeldown";case"label_up":return"labelup";case"label_left":return"labelleft";case"label_right":return"labelright";case"label_lower_left":return"labeldown";case"label_lower_right":return"labeldown";case"label_upper_left":return"labelup";case"label_upper_right":return"labelup";case"label_center":return"labeldown";case"circle":return"circle";case"square":return"square";case"diamond":return"diamond";case"flag":return"flag";case"arrowup":return"arrowup";case"arrowdown":return"arrowdown";case"cross":return"cross";case"xcross":return"xcross";case"triangleup":return"triangleup";case"triangledown":return"triangledown";case"text_outline":return"none";case"none":return"none";default:return"labeldown"}}getLabelPosition(t,e){switch(t.startsWith("style_")?t.substring(6):t){case"label_down":case"label_up":case"label_left":case"label_right":case"label_lower_left":case"label_lower_right":case"label_upper_left":case"label_upper_right":case"label_center":return"inside";case"text_outline":case"none":return e==="abovebar"||e==="AboveBar"||e==="ab"?"top":e==="belowbar"||e==="BelowBar"||e==="bl"?"bottom":"top";default:return e==="belowbar"||e==="BelowBar"||e==="bl"?"bottom":"top"}}getSizePx(t){switch(t){case"tiny":return 8;case"small":return 9;case"normal":case"auto":return 10;case"large":return 12;case"huge":return 14;default:return 10}}}class Zt{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:a,dataIndexOffset:o}=t,u=o||0,d="#2962ff",p=[];for(let l=0;l<a.length;l++){const h=a[l];if(!h)continue;const n=Array.isArray(h)?h:[h];for(const c of n)c&&typeof c=="object"&&!c._deleted&&p.push(c)}if(p.length===0)return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,data:[],silent:!0};const g=(t.candlestickData?.length||0)+u,r=Math.max(0,g-1);return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(l,h)=>{const n=[];for(const c of p){if(c._deleted)continue;const f=c.xloc==="bar_index"||c.xloc==="bi"?u:0;let m=h.coord([c.x1+f,c.y1]),w=h.coord([c.x2+f,c.y2]);const C=c.extend||"none";if(C!=="none"&&C!=="n"){const b=l.coordSys;[m,w]=this.extendLine(m,w,C,b.x,b.x+b.width,b.y,b.y+b.height)}const A=c.color||d,v=c.width||1;n.push({type:"line",shape:{x1:m[0],y1:m[1],x2:w[0],y2:w[1]},style:{fill:"none",stroke:A,lineWidth:v,lineDash:this.getDashPattern(c.style)}});const y=c.style||"style_solid";if(y==="style_arrow_left"||y==="style_arrow_both"){const b=this.arrowHead(w,m,v,A);b&&n.push(b)}if(y==="style_arrow_right"||y==="style_arrow_both"){const b=this.arrowHead(m,w,v,A);b&&n.push(b)}}return{type:"group",children:n}},data:[[0,r]],clip:!0,encode:{x:[0,1]},itemStyle:{color:"transparent",borderColor:"transparent"},z:15,silent:!0,emphasis:{disabled:!0}}}getDashPattern(t){switch(t){case"style_dotted":return[2,2];case"style_dashed":return[6,4];default:return}}extendLine(t,e,i,s,a,o,u){const d=e[0]-t[0],p=e[1]-t[1];if(d===0&&p===0)return[t,e];const g=(h,n)=>{let c=1/0;if(n[0]!==0){const f=n[0]>0?(a-h[0])/n[0]:(s-h[0])/n[0];c=Math.min(c,f)}if(n[1]!==0){const f=n[1]>0?(u-h[1])/n[1]:(o-h[1])/n[1];c=Math.min(c,f)}return isFinite(c)||(c=0),[h[0]+c*n[0],h[1]+c*n[1]]};let r=t,l=e;return(i==="right"||i==="r"||i==="both"||i==="b")&&(l=g(t,[d,p])),(i==="left"||i==="l"||i==="both"||i==="b")&&(r=g(e,[-d,-p])),[r,l]}arrowHead(t,e,i,s){const a=e[0]-t[0],o=e[1]-t[1],u=Math.sqrt(a*a+o*o);if(u<1)return null;const d=Math.max(8,i*4),p=a/u,g=o/u,r=e[0]-p*d,l=e[1]-g*d,h=-g*d*.4,n=p*d*.4;return{type:"polygon",shape:{points:[[e[0],e[1]],[r+h,l+n],[r-h,l-n]]},style:{fill:s}}}}class Ht{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:a,dataIndexOffset:o}=t,u=o||0,d=[];for(let r=0;r<a.length;r++){const l=a[r];if(!l)continue;const h=Array.isArray(l)?l:[l];for(const n of h){if(!n||typeof n!="object"||n._deleted)continue;const c=n.line1,f=n.line2;!c||!f||c._deleted||f._deleted||d.push(n)}}if(d.length===0)return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,data:[],silent:!0};const p=(t.candlestickData?.length||0)+u,g=Math.max(0,p-1);return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(r,l)=>{const h=[];for(const n of d){if(n._deleted)continue;const c=n.line1,f=n.line2;if(!c||!f||c._deleted||f._deleted)continue;const m=c.xloc==="bar_index"||c.xloc==="bi"?u:0,w=f.xloc==="bar_index"||f.xloc==="bi"?u:0;let C=l.coord([c.x1+m,c.y1]),A=l.coord([c.x2+m,c.y2]),v=l.coord([f.x1+w,f.y1]),y=l.coord([f.x2+w,f.y2]);const b=c.extend||"none",_=f.extend||"none";if(b!=="none"||_!=="none"){const k=r.coordSys,D=k.x,M=k.x+k.width,$=k.y,F=k.y+k.height;b!=="none"&&([C,A]=this.extendLine(C,A,b,D,M,$,F)),_!=="none"&&([v,y]=this.extendLine(v,y,_,D,M,$,F))}const{color:I,opacity:P}=ct.parseColor(n.color||"rgba(128, 128, 128, 0.2)");h.push({type:"polygon",shape:{points:[C,A,y,v]},style:{fill:I,opacity:P},silent:!0})}return{type:"group",children:h}},data:[[0,g]],clip:!0,encode:{x:[0,1]},z:10,silent:!0,emphasis:{disabled:!0}}}extendLine(t,e,i,s,a,o,u){const d=e[0]-t[0],p=e[1]-t[1];if(d===0&&p===0)return[t,e];const g=(h,n)=>{let c=1/0;if(n[0]!==0){const f=n[0]>0?(a-h[0])/n[0]:(s-h[0])/n[0];c=Math.min(c,f)}if(n[1]!==0){const f=n[1]>0?(u-h[1])/n[1]:(o-h[1])/n[1];c=Math.min(c,f)}return isFinite(c)||(c=0),[h[0]+c*n[0],h[1]+c*n[1]]};let r=t,l=e;return(i==="right"||i==="both")&&(l=g(t,[d,p])),(i==="left"||i==="both")&&(r=g(e,[-d,-p])),[r,l]}}class Wt{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:a,dataIndexOffset:o}=t,u=o||0,d=[];for(let r=0;r<a.length;r++){const l=a[r];if(!l)continue;const h=Array.isArray(l)?l:[l];for(const n of h)n&&typeof n=="object"&&!n._deleted&&n.points&&n.points.length>=2&&d.push(n)}if(d.length===0)return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,data:[],silent:!0};const p=(t.candlestickData?.length||0)+u,g=Math.max(0,p-1);return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(r,l)=>{const h=[];for(const n of d){if(n._deleted)continue;const c=n.points;if(!c||c.length<2)continue;const f=n.xloc==="bi"||n.xloc==="bar_index",m=f?u:0,w=[];for(const y of c){const b=f?(y.index??0)+m:y.time??0,_=y.price??0;w.push(l.coord([b,_]))}if(w.length<2)continue;const C=n.line_color||"#2962ff",A=n.line_width||1,v=this.getDashPattern(n.line_style);if(n.fill_color&&n.fill_color!==""&&n.fill_color!=="na"){const{color:y,opacity:b}=ct.parseColor(n.fill_color);if(n.curved){const _=this.buildCurvedPath(w,n.closed);h.push({type:"path",shape:{pathData:_+" Z"},style:{fill:y,opacity:b,stroke:"none"},silent:!0})}else h.push({type:"polygon",shape:{points:w},style:{fill:y,opacity:b,stroke:"none"},silent:!0})}if(n.curved){const y=this.buildCurvedPath(w,n.closed);h.push({type:"path",shape:{pathData:y},style:{fill:"none",stroke:C,lineWidth:A,lineDash:v},silent:!0})}else{const y=n.closed?[...w,w[0]]:w;h.push({type:"polyline",shape:{points:y},style:{fill:"none",stroke:C,lineWidth:A,lineDash:v},silent:!0})}}return{type:"group",children:h}},data:[[0,g]],clip:!0,encode:{x:[0,1]},itemStyle:{color:"transparent",borderColor:"transparent"},z:12,silent:!0,emphasis:{disabled:!0}}}buildCurvedPath(t,e){const i=t.length;if(i<2)return"";if(i===2)return`M ${t[0][0]} ${t[0][1]} L ${t[1][0]} ${t[1][1]}`;const s=.5;let a=`M ${t[0][0]} ${t[0][1]}`;const o=d=>e?t[(d%i+i)%i]:d<0?t[0]:d>=i?t[i-1]:t[d],u=e?i:i-1;for(let d=0;d<u;d++){const p=o(d-1),g=o(d),r=o(d+1),l=o(d+2),h=g[0]+(r[0]-p[0])*s/3,n=g[1]+(r[1]-p[1])*s/3,c=r[0]-(l[0]-g[0])*s/3,f=r[1]-(l[1]-g[1])*s/3;a+=` C ${h} ${n}, ${c} ${f}, ${r[0]} ${r[1]}`}return e&&(a+=" Z"),a}getDashPattern(t){switch(t){case"style_dotted":return[2,2];case"style_dashed":return[6,4];default:return}}}function vt(x){if(!x||typeof x!="string")return x;if(x.startsWith("#")){const t=x.slice(1);if(t.length===8){const e=parseInt(t.slice(0,2),16),i=parseInt(t.slice(2,4),16),s=parseInt(t.slice(4,6),16),a=parseInt(t.slice(6,8),16)/255;return`rgba(${e},${i},${s},${a.toFixed(3)})`}}return x}class Gt{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:a,dataIndexOffset:o}=t,u=o||0,d=[];for(let r=0;r<a.length;r++){const l=a[r];if(!l)continue;const h=Array.isArray(l)?l:[l];for(const n of h)n&&typeof n=="object"&&!n._deleted&&d.push(n)}if(d.length===0)return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,data:[],silent:!0};const p=(t.candlestickData?.length||0)+u,g=Math.max(0,p-1);return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(r,l)=>{const h=[];for(const n of d){if(n._deleted)continue;const c=n.xloc==="bar_index"||n.xloc==="bi"?u:0,f=l.coord([n.left+c,n.top]),m=l.coord([n.right+c,n.bottom]);let w=f[0],C=f[1],A=m[0]-f[0],v=m[1]-f[1];const y=n.extend||"none";if(y!=="none"&&y!=="n"){const k=r.coordSys;(y==="left"||y==="l"||y==="both"||y==="b")&&(w=k.x,A=y==="both"||y==="b"?k.width:m[0]-k.x),(y==="right"||y==="r"||y==="both"||y==="b")&&(y==="right"||y==="r")&&(A=k.x+k.width-f[0])}const b=vt(n.bgcolor)||"#2962ff";h.push({type:"rect",shape:{x:w,y:C,width:A,height:v},style:{fill:b,stroke:"none"}});const _=n.border_color,I=_==null||typeof _=="number"&&isNaN(_)||_==="na"||_==="NaN"?null:vt(_)||"#2962ff",P=n.border_width??1;if(P>0&&I&&h.push({type:"rect",shape:{x:w,y:C,width:A,height:v},style:{fill:"none",stroke:I,lineWidth:P,lineDash:this.getDashPattern(n.border_style)}}),n.text){const k=this.getTextX(w,A,n.text_halign),D=this.getTextY(C,v,n.text_valign);h.push({type:"text",style:{x:k,y:D,text:n.text,fill:vt(n.text_color)||"#000000",fontSize:this.getSizePixels(n.text_size),fontFamily:n.text_font_family==="monospace"?"monospace":"sans-serif",fontWeight:n.text_formatting==="format_bold"?"bold":"normal",fontStyle:n.text_formatting==="format_italic"?"italic":"normal",textAlign:this.mapHAlign(n.text_halign),textVerticalAlign:this.mapVAlign(n.text_valign)}})}}return{type:"group",children:h}},data:[[0,g]],clip:!0,encode:{x:[0,1]},itemStyle:{color:"transparent",borderColor:"transparent"},z:14,silent:!0,emphasis:{disabled:!0}}}getDashPattern(t){switch(t){case"style_dotted":return[2,2];case"style_dashed":return[6,4];default:return}}getSizePixels(t){if(typeof t=="number"&&t>0)return t;switch(t){case"auto":case"size.auto":return 12;case"tiny":case"size.tiny":return 8;case"small":case"size.small":return 10;case"normal":case"size.normal":return 14;case"large":case"size.large":return 20;case"huge":case"size.huge":return 36;default:return 12}}mapHAlign(t){switch(t){case"left":case"text.align_left":return"left";case"right":case"text.align_right":return"right";case"center":case"text.align_center":default:return"center"}}mapVAlign(t){switch(t){case"top":case"text.align_top":return"top";case"bottom":case"text.align_bottom":return"bottom";case"center":case"text.align_center":default:return"middle"}}getTextX(t,e,i){switch(i){case"left":case"text.align_left":return t+4;case"right":case"text.align_right":return t+e-4;case"center":case"text.align_center":default:return t+e/2}}getTextY(t,e,i){switch(i){case"top":case"text.align_top":return t+4;case"bottom":case"text.align_bottom":return t+e-4;case"center":case"text.align_center":default:return t+e/2}}}var Rt=Object.defineProperty,Bt=(x,t,e)=>t in x?Rt(x,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):x[t]=e,Yt=(x,t,e)=>(Bt(x,typeof t!="symbol"?t+"":t,e),e);const Y=class{static register(t,e){this.renderers.set(t,e)}static get(t){return this.renderers.get(t)||this.renderers.get("line")}};Yt(Y,"renderers",new Map),Y.register("line",new Lt),Y.register("step",new $t),Y.register("histogram",new St),Y.register("columns",new St),Y.register("circles",new bt),Y.register("cross",new bt),Y.register("char",new bt),Y.register("bar",new _t),Y.register("candle",new _t),Y.register("shape",new Nt),Y.register("background",new Ft),Y.register("fill",new Tt),Y.register("label",new Ot),Y.register("drawing_line",new Zt),Y.register("linefill",new Ht),Y.register("drawing_polyline",new Wt),Y.register("drawing_box",new Gt);let jt=Y;var qt=Object.defineProperty,Vt=(x,t,e)=>t in x?qt(x,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):x[t]=e,Xt=(x,t,e)=>(Vt(x,typeof t!="symbol"?t+"":t,e),e);const kt=class Ct{static buildCandlestickSeries(t,e,i){const s=e.upColor||"#00da3c",a=e.downColor||"#ec0000",o=t.map(d=>[d.open,d.close,d.low,d.high]);if(i&&i>o.length){const d=i-o.length;for(let p=0;p<d;p++)o.push(null)}let u;if(e.lastPriceLine?.visible!==!1&&t.length>0){const d=t[t.length-1],p=d.close,g=d.close>=d.open,r=e.lastPriceLine?.color||(g?s:a);let l=e.lastPriceLine?.lineStyle||"dashed";l.startsWith("linestyle_")&&(l=l.replace("linestyle_",""));const h=e.yAxisDecimalPlaces!==void 0?e.yAxisDecimalPlaces:Z.autoDetectDecimals(t);u={symbol:["none","none"],precision:h,data:[{yAxis:p,label:{show:!0,position:"end",formatter:n=>e.yAxisLabelFormatter?e.yAxisLabelFormatter(n.value):Z.formatValue(n.value,h),color:"#fff",backgroundColor:r,padding:[2,4],borderRadius:2,fontSize:11,fontWeight:"bold"},lineStyle:{color:r,type:l,width:1,opacity:.8}}],animation:!1,silent:!0}}return{type:"candlestick",name:e.title||"Market",data:o,itemStyle:{color:s,color0:a,borderColor:s,borderColor0:a},markLine:u,xAxisIndex:0,yAxisIndex:0,z:5}}static buildIndicatorSeries(t,e,i,s,a=0,o,u,d=1){const p=[],g=new Array(s).fill(null),r=new Map;return t.forEach((l,h)=>{l.collapsed||Object.keys(l.plots).sort((n,c)=>{const f=l.plots[n],m=l.plots[c],w=f.options.style==="fill",C=m.options.style==="fill";return w&&!C?1:!w&&C?-1:0}).forEach(n=>{const c=l.plots[n],f=`${h}::${n}`;let m=0,w=0,C=c.options.overlay;if(c.options.style==="fill"&&C===void 0){const I=c.options.plot1,P=c.options.plot2;if(I&&P){const k=l.plots[I],D=l.plots[P];k?.options?.overlay===!0&&D?.options?.overlay===!0&&(C=!0)}}if(l.paneIndex===0||C===!0)m=0,u&&u.has(f)?w=u.get(f):w=0;else{const I=i.findIndex(P=>P.index===l.paneIndex);I!==-1&&(m=I+1,w=d+I)}const A=new Array(s).fill(null),v=new Array(s).fill(null),y=new Array(s).fill(null),b=new Array(s).fill(null);if(c.data?.forEach(I=>{const P=e.get(I.time);if(P!==void 0){const k=I.options?.offset??c.options.offset??0,D=P+a+k;if(D>=0&&D<s){let M=I.value;const $=I.options?.color;v[D]=M;const F=I.options!=null&&"color"in I.options,U=$===null||$==="na"||$==="NaN"||typeof $=="number"&&isNaN($)||F&&$===void 0;U&&(M=null),A[D]=M,y[D]=U?null:$||c.options.color||Ct.DEFAULT_COLOR,b[D]=I.options||{}}}}),r.set(`${h}::${n}`,v),c.options?.style?.startsWith("style_")&&(c.options.style=c.options.style.replace("style_","")),c.options.style==="barcolor"){c.data?.forEach(I=>{const P=e.get(I.time);if(P!==void 0){const k=I.options?.offset??c.options.offset??0,D=P+a+k;if(D>=0&&D<s){const M=I.options?.color||c.options.color||Ct.DEFAULT_COLOR;!(M===null||M==="na"||M==="NaN"||typeof M=="number"&&isNaN(M))&&I.value!==null&&I.value!==void 0&&(g[D]=M)}}});return}if(c.options.style==="table")return;const _=jt.get(c.options.style).render({seriesName:f,xAxisIndex:m,yAxisIndex:w,dataArray:A,colorArray:y,optionsArray:b,plotOptions:c.options,candlestickData:o,plotDataArrays:r,indicatorId:h,plotName:n,dataIndexOffset:a});_&&p.push(_)})}),{series:p,barColors:g}}};Xt(kt,"DEFAULT_COLOR","#2962ff");let gt=kt;class Ut{static build(t,e,i,s=!1,a=null){const o=[],u=t.pixelToPercent,d=t.mainPaneTop;if(!a||a==="main"){const p=10*u;if(o.push({type:"text",left:"8.5%",top:d+p+"%",z:10,style:{text:e.title||"Market",fill:e.titleColor||"#fff",font:`bold 16px ${e.fontFamily||"sans-serif"}`,textVerticalAlign:"top"}}),e.watermark!==!1){const r=t.mainPaneTop+t.mainPaneHeight;o.push({type:"text",right:"11%",top:r-3+"%",z:10,style:{text:"QFChart",fill:e.fontColor||"#cbd5e1",font:"bold 16px sans-serif",opacity:.1},cursor:"pointer",onclick:()=>{window.open("https://quantforge.org","_blank")}})}const g=[];if(e.controls?.collapse&&g.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 ${e.fontFamily}`,x:10,y:10,textAlign:"center",textVerticalAlign:"middle"},silent:!0}]}),e.controls?.maximize){const r=a==="main",l=e.controls?.collapse?25:0;g.push({type:"group",x:l,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:r?"\u2750":"\u25A1",fill:"#cbd5e1",font:`14px ${e.fontFamily}`,x:10,y:10,textAlign:"center",textVerticalAlign:"middle"},silent:!0}]})}if(e.controls?.fullscreen){let r=0;e.controls?.collapse&&(r+=25),e.controls?.maximize&&(r+=25),g.push({type:"group",x:r,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 ${e.fontFamily}`,x:10,y:10,textAlign:"center",textVerticalAlign:"middle"},silent:!0}]})}g.length>0&&o.push({type:"group",right:"10.5%",top:d+"%",children:g})}return t.paneLayout.forEach(p=>{if(a&&p.indicatorId!==a)return;o.push({type:"text",left:"8.5%",top:p.top+10*u+"%",z:10,style:{text:p.indicatorId||"",fill:p.titleColor||"#fff",font:`bold 12px ${e.fontFamily||"sans-serif"}`,textVerticalAlign:"top"}});const g=[];if(p.controls?.collapse&&g.push({type:"group",children:[{type:"rect",shape:{width:20,height:20,r:2},style:{fill:"#334155",stroke:"#475569",lineWidth:1},onclick:()=>p.indicatorId&&i(p.indicatorId,"collapse")},{type:"text",style:{text:p.isCollapsed?"+":"\u2212",fill:"#cbd5e1",font:`bold 14px ${e.fontFamily}`,x:10,y:10,textAlign:"center",textVerticalAlign:"middle"},silent:!0}]}),p.controls?.maximize){const r=a===p.indicatorId,l=p.controls?.collapse?25:0;g.push({type:"group",x:l,children:[{type:"rect",shape:{width:20,height:20,r:2},style:{fill:"#334155",stroke:"#475569",lineWidth:1},onclick:()=>p.indicatorId&&i(p.indicatorId,"maximize")},{type:"text",style:{text:r?"\u2750":"\u25A1",fill:"#cbd5e1",font:`14px ${e.fontFamily}`,x:10,y:10,textAlign:"center",textVerticalAlign:"middle"},silent:!0}]})}g.length>0&&o.push({type:"group",right:"10.5%",top:p.top+"%",children:g})}),o}}class Jt{static format(t,e){if(!t||t.length===0)return"";const i=e.title||"Market",s=e.upColor||"#00da3c",a=e.downColor||"#ec0000",o=e.fontFamily||"sans-serif",u=t[0].axisValue;let d=`<div style="font-weight: bold; margin-bottom: 5px; color: #cbd5e1; font-family: ${o};">${u}</div>`;const p=t.find(r=>r.seriesType==="candlestick"),g=t.filter(r=>r.seriesType!=="candlestick");if(p){const[r,l,h,n,c]=p.value,f=h>=l?s:a;d+=`
18
+ <div style="margin-bottom: 8px; font-family: ${o};">
19
+ <div style="display:flex; justify-content:space-between; color:${f}; 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: ${r>=f?s:n}">${f}</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}">${o}</span>
26
- <span>Close:</span> <span style="text-align: right; color: ${r>=f?s:n}">${r}</span>
23
+ <span>Open:</span> <span style="text-align: right; color: ${h>=l?s:a}">${l}</span>
24
+ <span>High:</span> <span style="text-align: right; color: ${s}">${c}</span>
25
+ <span>Low:</span> <span style="text-align: right; color: ${a}">${n}</span>
26
+ <span>Close:</span> <span style="text-align: right; color: ${h>=l?s:a}">${h}</span>
27
27
  </div>
28
28
  </div>
29
- `}if(y.length>0){h+='<div style="border-top: 1px solid #334155; margin: 5px 0; padding-top: 5px;"></div>';const p={};y.forEach(f=>{const r=f.seriesName.split("::"),o=r.length>1?r[0]:"Unknown",u=r.length>1?r[1]:f.seriesName;p[o]||(p[o]=[]),p[o].push({...f,displayName:u})}),Object.keys(p).forEach(f=>{h+=`
30
- <div style="margin-top: 8px; font-family: ${l};">
31
- <div style="font-weight:bold; color: #fff; margin-bottom: 2px;">${f}</div>
32
- `,p[f].forEach(r=>{let o=r.value;if(Array.isArray(o)&&(o=o[1]),o==null)return;const u=typeof o=="number"?o.toLocaleString(void 0,{maximumFractionDigits:4}):o;h+=`
29
+ `}if(g.length>0){d+='<div style="border-top: 1px solid #334155; margin: 5px 0; padding-top: 5px;"></div>';const r={};g.forEach(l=>{const h=l.seriesName.split("::"),n=h.length>1?h[0]:"Unknown",c=h.length>1?h[1]:l.seriesName;r[n]||(r[n]=[]),r[n].push({...l,displayName:c})}),Object.keys(r).forEach(l=>{d+=`
30
+ <div style="margin-top: 8px; font-family: ${o};">
31
+ <div style="font-weight:bold; color: #fff; margin-bottom: 2px;">${l}</div>
32
+ `,r[l].forEach(h=>{let n=h.value;if(Array.isArray(n)&&(n=n[1]),n==null)return;const c=typeof n=="number"?n.toLocaleString(void 0,{maximumFractionDigits:4}):n;d+=`
33
33
  <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 2px; padding-left: 8px;">
34
- <div>${r.marker} <span style="color: #cbd5e1;">${r.displayName}</span></div>
35
- <div style="font-size: 10px; color: #fff;padding-left:10px;">${u}</div>
36
- </div>`}),h+="</div>"})}return h}}var Kt=Object.defineProperty,Qt=(g,t,e)=>t in g?Kt(g,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):g[t]=e,ht=(g,t,e)=>(Qt(g,typeof t!="symbol"?t+"":t,e),e);class te{constructor(t,e){ht(this,"plugins",new Map),ht(this,"activePluginId",null),ht(this,"context"),ht(this,"toolbarContainer"),ht(this,"tooltipElement",null),ht(this,"hideTimeout",null),this.context=t,this.toolbarContainer=e,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(t,e){if(!this.tooltipElement)return;this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=null);const i=t.getBoundingClientRect();this.tooltipElement.textContent=e,this.tooltipElement.style.display="block";const s=this.tooltipElement.getBoundingClientRect(),n=i.top+(i.height-s.height)/2,l=i.right+10;this.tooltipElement.style.top=`${n}px`,this.tooltipElement.style.left=`${l}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(t){if(this.plugins.has(t.id)){console.warn(`Plugin with id ${t.id} is already registered.`);return}this.plugins.set(t.id,t),t.init(this.context),this.addButton(t)}unregister(t){const e=this.plugins.get(t);e&&(this.activePluginId===t&&this.deactivatePlugin(),e.destroy?.(),this.plugins.delete(t),this.removeButton(t))}activatePlugin(t){if(this.activePluginId===t){this.deactivatePlugin();return}this.activePluginId&&this.deactivatePlugin();const e=this.plugins.get(t);e&&(this.activePluginId=t,this.setButtonActive(t,!0),e.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(t){const e=document.createElement("button");e.id=`qfchart-plugin-btn-${t.id}`,e.style.width="30px",e.style.height="30px",e.style.padding="4px",e.style.border="1px solid transparent",e.style.borderRadius="4px",e.style.backgroundColor="transparent",e.style.cursor="pointer",e.style.color=this.context.getOptions().fontColor||"#cbd5e1",e.style.display="flex",e.style.alignItems="center",e.style.justifyContent="center",t.icon?e.innerHTML=t.icon:e.innerText=(t.name||t.id).substring(0,2).toUpperCase(),e.addEventListener("mouseenter",()=>{this.activePluginId!==t.id&&(e.style.backgroundColor="rgba(255, 255, 255, 0.1)"),this.showTooltip(e,t.name||t.id)}),e.addEventListener("mouseleave",()=>{this.activePluginId!==t.id&&(e.style.backgroundColor="transparent"),this.hideTooltip()}),e.onclick=()=>this.activatePlugin(t.id),this.toolbarContainer.appendChild(e)}removeButton(t){const e=this.toolbarContainer.querySelector(`#qfchart-plugin-btn-${t}`);e&&e.remove()}setButtonActive(t,e){const i=this.toolbarContainer.querySelector(`#qfchart-plugin-btn-${t}`);i&&(e?(i.style.backgroundColor="#2563eb",i.style.color="#ffffff"):(i.style.backgroundColor="transparent",i.style.color=this.context.getOptions().fontColor||"#cbd5e1"))}}var ee=Object.defineProperty,ie=(g,t,e)=>t in g?ee(g,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):g[t]=e,q=(g,t,e)=>(ie(g,typeof t!="symbol"?t+"":t,e),e);class se{constructor(t){q(this,"context"),q(this,"isEditing",!1),q(this,"currentDrawing",null),q(this,"editingPointIndex",null),q(this,"zr"),q(this,"editGroup",null),q(this,"editLine",null),q(this,"editStartPoint",null),q(this,"editEndPoint",null),q(this,"isMovingShape",!1),q(this,"dragStart",null),q(this,"initialPixelPoints",[]),q(this,"onDrawingMouseDown",e=>{if(this.isEditing)return;const i=this.context.getDrawing(e.id);i&&(this.isEditing=!0,this.isMovingShape=!0,this.currentDrawing=JSON.parse(JSON.stringify(i)),this.dragStart={x:e.x,y:e.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))}),q(this,"onPointMouseDown",e=>{if(this.isEditing)return;const i=this.context.getDrawing(e.id);i&&(this.isEditing=!0,this.currentDrawing=JSON.parse(JSON.stringify(i)),this.editingPointIndex=e.pointIndex,this.context.lockChart(),this.createEditGraphic(),this.zr.on("mousemove",this.onMouseMove),this.zr.on("mouseup",this.onMouseUp))}),q(this,"onMouseMove",e=>{if(!this.isEditing||!this.currentDrawing)return;const i=e.offsetX,s=e.offsetY;if(this.isMovingShape&&this.dragStart){const n=i-this.dragStart.x,l=s-this.dragStart.y,d={x:this.initialPixelPoints[0].x+n,y:this.initialPixelPoints[0].y+l},h={x:this.initialPixelPoints[1].x+n,y:this.initialPixelPoints[1].y+l};this.editLine.setShape({x1:d.x,y1:d.y,x2:h.x,y2:h.y}),this.editStartPoint.setShape({cx:d.x,cy:d.y}),this.editEndPoint.setShape({cx:h.x,cy:h.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})))}),q(this,"onMouseUp",e=>{this.isEditing&&this.finishEditing(e.offsetX,e.offsetY)}),this.context=t,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 W.graphic.Group;const t=this.currentDrawing.points[0],e=this.currentDrawing.points[1],i=this.context.coordinateConversion.dataToPixel(t),s=this.context.coordinateConversion.dataToPixel(e);!i||!s||(this.editLine=new W.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 W.graphic.Circle({shape:{cx:i.x,cy:i.y,r:5},style:{fill:"#fff",stroke:"#3b82f6",lineWidth:2},z:1e3}),this.editEndPoint=new W.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(t,e){if(this.currentDrawing){if(this.isMovingShape&&this.dragStart){const i=t-this.dragStart.x,s=e-this.dragStart.y,n=this.initialPixelPoints.map((l,d)=>{const h=l.x+i,c=l.y+s;return this.context.coordinateConversion.pixelToData({x:h,y:c})});n.every(l=>l!==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:t,y:e});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 ne=Object.defineProperty,oe=(g,t,e)=>t in g?ne(g,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):g[t]=e,ae=(g,t,e)=>(oe(g,typeof t!="symbol"?t+"":t,e),e);class re{constructor(){ae(this,"handlers",new Map)}on(t,e){this.handlers.has(t)||this.handlers.set(t,new Set),this.handlers.get(t).add(e)}off(t,e){const i=this.handlers.get(t);i&&i.delete(e)}emit(t,e){const i=this.handlers.get(t);i&&i.forEach(s=>{try{s(e)}catch(n){console.error(`Error in EventBus handler for ${t}:`,n)}})}clear(){this.handlers.clear()}}class J{static safeParseColor(t){if(!t||typeof t!="string")return{color:"#888888",opacity:1};const e=t.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)/);if(e){const i=e[4]?parseFloat(e[4]):1;return{color:`rgb(${e[1]},${e[2]},${e[3]})`,opacity:i}}return{color:t,opacity:1}}static render(t,e,i){J.clearAll(t);const s=new Map;for(const n of e)n&&!n._deleted&&s.set(n.position,n);s.forEach(n=>{const l=J.buildTable(n);J.positionTable(l,n.position,i),t.appendChild(l)})}static clearAll(t){for(;t.firstChild;)t.removeChild(t.firstChild)}static buildTable(t){const e=document.createElement("table");if(e.style.borderCollapse="separate",e.style.borderSpacing="0",e.style.pointerEvents="auto",e.style.fontSize="14px",e.style.lineHeight="1.4",e.style.fontFamily="sans-serif",e.style.margin="4px",t.bgcolor){const{color:d,opacity:h}=J.safeParseColor(t.bgcolor);e.style.backgroundColor=d,h<1&&(e.style.opacity=String(h))}if(t.frame_width>0&&t.frame_color){const{color:d}=J.safeParseColor(t.frame_color);e.style.border=`${t.frame_width}px solid ${d}`}else t.frame_width>0&&(e.style.border=`${t.frame_width}px solid #999`);const i=new Map,s=new Set;if(t.merges)for(const d of t.merges){const h=`${d.startCol},${d.startRow}`;i.set(h,{colspan:d.endCol-d.startCol+1,rowspan:d.endRow-d.startRow+1});for(let c=d.startRow;c<=d.endRow;c++)for(let y=d.startCol;y<=d.endCol;y++)c===d.startRow&&y===d.startCol||s.add(`${y},${c}`)}const n=t.rows||0,l=t.columns||0;for(let d=0;d<n;d++){const h=document.createElement("tr");for(let c=0;c<l;c++){const y=`${c},${d}`;if(s.has(y))continue;const p=document.createElement("td"),f=i.get(y);if(f&&(f.colspan>1&&(p.colSpan=f.colspan),f.rowspan>1&&(p.rowSpan=f.rowspan)),t.border_width>0){const o=t.border_color?J.safeParseColor(t.border_color).color:"#999";p.style.border=`${t.border_width}px solid ${o}`}const r=t.cells?.[d]?.[c];if(r&&!r._merged){if(p.textContent=r.text||"",r.bgcolor){const{color:o,opacity:u}=J.safeParseColor(r.bgcolor);p.style.backgroundColor=o,u<1&&(p.style.backgroundColor=r.bgcolor)}if(r.text_color){const{color:o}=J.safeParseColor(r.text_color);p.style.color=o}p.style.fontSize=J.getSizePixels(r.text_size)+"px",p.style.textAlign=J.mapHAlign(r.text_halign),p.style.verticalAlign=J.mapVAlign(r.text_valign),r.text_font_family==="monospace"&&(p.style.fontFamily="monospace"),r.width>0&&(p.style.width=r.width+"%"),r.height>0&&(p.style.height=r.height+"%"),r.tooltip&&(p.title=r.tooltip)}p.style.padding="4px 6px",p.style.whiteSpace="nowrap",h.appendChild(p)}e.appendChild(h)}return e}static positionTable(t,e,i){t.style.position="absolute";const s=8,n=i?i.y+"px":"0",l=i?i.x+"px":"0",d=i?i.y+i.height-s+"px":"0",h=i?i.x+i.width-s+"px":"0",c=i?i.x+i.width/2+"px":"50%",y=i?i.y+i.height/2+"px":"50%";switch(e){case"top_left":t.style.top=n,t.style.left=l;break;case"top_center":t.style.top=n,t.style.left=c,t.style.transform="translateX(-50%)";break;case"top_right":t.style.top=n,t.style.left=h,t.style.transform="translateX(-100%)";break;case"middle_left":t.style.top=y,t.style.left=l,t.style.transform="translateY(-50%)";break;case"middle_center":t.style.top=y,t.style.left=c,t.style.transform="translate(-50%, -50%)";break;case"middle_right":t.style.top=y,t.style.left=h,t.style.transform="translate(-100%, -50%)";break;case"bottom_left":t.style.top=d,t.style.left=l,t.style.transform="translateY(-100%)";break;case"bottom_center":t.style.top=d,t.style.left=c,t.style.transform="translate(-50%, -100%)";break;case"bottom_right":t.style.top=d,t.style.left=h,t.style.transform="translate(-100%, -100%)";break;default:t.style.top=n,t.style.left=h,t.style.transform="translateX(-100%)";break}}static getSizePixels(t){if(typeof t=="number"&&t>0)return t;switch(t){case"auto":case"size.auto":return 12;case"tiny":case"size.tiny":return 8;case"small":case"size.small":return 10;case"normal":case"size.normal":return 14;case"large":case"size.large":return 20;case"huge":case"size.huge":return 36;default:return 14}}static mapHAlign(t){switch(t){case"left":case"text.align_left":return"left";case"right":case"text.align_right":return"right";case"center":case"text.align_center":default:return"center"}}static mapVAlign(t){switch(t){case"top":case"text.align_top":return"top";case"bottom":case"text.align_bottom":return"bottom";case"center":case"text.align_center":default:return"middle"}}}var le=Object.defineProperty,he=(g,t,e)=>t in g?le(g,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):g[t]=e,L=(g,t,e)=>(he(g,typeof t!="symbol"?t+"":t,e),e);class ce{constructor(t,e={}){L(this,"chart"),L(this,"options"),L(this,"marketData",[]),L(this,"indicators",new Map),L(this,"timeToIndex",new Map),L(this,"pluginManager"),L(this,"drawingEditor"),L(this,"events",new re),L(this,"isMainCollapsed",!1),L(this,"maximizedPaneId",null),L(this,"countdownInterval",null),L(this,"selectedDrawingId",null),L(this,"drawings",[]),L(this,"coordinateConversion",{pixelToData:n=>{const l=this.chart.getOption();if(!l||!l.grid)return null;const d=l.grid.length;for(let h=0;h<d;h++)if(this.chart.containPixel({gridIndex:h},[n.x,n.y])){this.chart.convertFromPixel({seriesIndex:h},[n.x,n.y]);const c=this.chart.convertFromPixel({gridIndex:h},[n.x,n.y]);if(c)return{timeIndex:Math.round(c[0]),value:c[1],paneIndex:h}}return null},dataToPixel:n=>{const l=n.paneIndex||0,d=this.chart.convertToPixel({gridIndex:l},[n.timeIndex,n.value]);return d?{x:d[0],y:d[1]}:null}}),L(this,"upColor","#00da3c"),L(this,"downColor","#ec0000"),L(this,"defaultPadding",0),L(this,"padding"),L(this,"dataIndexOffset",0),L(this,"rootContainer"),L(this,"layoutContainer"),L(this,"toolbarContainer"),L(this,"leftSidebar"),L(this,"rightSidebar"),L(this,"chartContainer"),L(this,"overlayContainer"),L(this,"_lastTables",[]),L(this,"onKeyDown",n=>{(n.key==="Delete"||n.key==="Backspace")&&this.selectedDrawingId&&(this.removeDrawing(this.selectedDrawingId),this.selectedDrawingId=null,this.render())}),L(this,"onFullscreenChange",()=>{this.render()}),L(this,"isLocked",!1),L(this,"lockedState",null),this.rootContainer=t,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,...e},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=W.init(this.chartContainer),this.chartContainer.style.position="relative",this.overlayContainer=document.createElement("div"),this.overlayContainer.style.cssText="position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:100;overflow:hidden;",this.chartContainer.appendChild(this.overlayContainer),this.pluginManager=new te(this,this.toolbarContainer),this.drawingEditor=new se(this),this.chart.on("dataZoom",n=>{this.events.emit("chart:dataZoom",n);const l=this.options.databox?.triggerOn,d=this.options.databox?.position;l==="click"&&d==="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 t=null;const e=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]),l=this.drawings.filter(h=>(h.paneIndex||0)===n)[i.dataIndex];if(!l)return null;const d=i.event?.target?.name;return{drawing:l,targetName:d,paneIdx:n}};this.chart.on("mouseover",i=>{const s=e(i);if(!s)return;const n=i.event?.target?.parent;if(n){const l=s.drawing.id===this.selectedDrawingId;t&&(clearTimeout(t),t=null),l||n.children().forEach(d=>{d.name&&d.name.startsWith("point")&&d.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 l=s.targetName==="point-start"?0:1;this.events.emit("drawing:point:hover",{id:s.drawing.id,pointIndex:l}),this.chart.getZr().setCursorStyle("pointer")}}),this.chart.on("mouseout",i=>{const s=e(i);if(!s)return;const n=i.event?.target?.parent;if(s.drawing.id!==this.selectedDrawingId){if(t=setTimeout(()=>{if(n){if(this.selectedDrawingId===s.drawing.id)return;n.children().forEach(l=>{l.name&&l.name.startsWith("point")&&l.attr("style",{opacity:0})})}},50),s.targetName==="line")this.events.emit("drawing:mouseout",{id:s.drawing.id});else if(s.targetName?.startsWith("point")){const l=s.targetName==="point-start"?0:1;this.events.emit("drawing:point:mouseout",{id:s.drawing.id,pointIndex:l})}this.chart.getZr().setCursorStyle("default")}}),this.chart.on("mousedown",i=>{const s=e(i);if(!s)return;const n=i.event?.event||i.event,l=n?.offsetX,d=n?.offsetY;if(s.targetName==="line")this.events.emit("drawing:mousedown",{id:s.drawing.id,x:l,y:d});else if(s.targetName?.startsWith("point")){const h=s.targetName==="point-start"?0:1;this.events.emit("drawing:point:mousedown",{id:s.drawing.id,pointIndex:h,x:l,y:d})}}),this.chart.on("click",i=>{const s=e(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(t){this.pluginManager.register(t)}addDrawing(t){this.drawings.push(t),this.render()}removeDrawing(t){const e=this.drawings.findIndex(i=>i.id===t);if(e!==-1){const i=this.drawings[e];this.drawings.splice(e,1),this.events.emit("drawing:deleted",{id:i.id}),this.render()}}getDrawing(t){return this.drawings.find(e=>e.id===t)}updateDrawing(t){const e=this.drawings.findIndex(i=>i.id===t.id);e!==-1&&(this.drawings[e]=t,this.render())}lockChart(){if(this.isLocked)return;this.isLocked=!0;const t=this.chart.getOption();this.chart.setOption({dataZoom:t.dataZoom.map(e=>({...e,disabled:!0})),tooltip:{show:!1}})}unlockChart(){if(!this.isLocked)return;this.isLocked=!1;const t=this.chart.getOption();(this.options.dataZoom||{}).visible,t.dataZoom&&this.chart.setOption({dataZoom:t.dataZoom.map(e=>({...e,disabled:!1})),tooltip:{show:!0}})}setZoom(t,e){this.chart.dispatchAction({type:"dataZoom",start:t,end:e})}setMarketData(t){this.marketData=t,this.rebuildTimeIndex(),this.render()}updateData(t){if(t.length===0)return;const e=new Map;this.marketData.forEach(a=>{e.set(a.time,a)}),t.forEach(a=>{e.has(a.time),e.set(a.time,a)}),this.marketData=Array.from(e.values()).sort((a,x)=>a.time-x.time),this.rebuildTimeIndex();const i=this.dataIndexOffset,s=ut.buildCandlestickSeries(this.marketData,this.options),n={value:[NaN,NaN,NaN,NaN],itemStyle:{opacity:0}},l=[...Array(i).fill(n),...s.data,...Array(i).fill(n)],d=[...Array(i).fill(""),...this.marketData.map(a=>new Date(a.time).toLocaleString()),...Array(i).fill("")],h=this.chart.getOption(),c=It.calculate(this.chart.getHeight(),this.indicators,this.options,this.isMainCollapsed,this.maximizedPaneId,this.marketData),y=[...Array(i).fill(null),...this.marketData,...Array(i).fill(null)],{series:p,barColors:f}=ut.buildIndicatorSeries(this.indicators,this.timeToIndex,c.paneLayout,d.length,i,y,c.overlayYAxisMap,c.separatePaneYAxisOffset),r=l.map((a,x)=>f[x]?{value:a.value||a,itemStyle:{color:f[x],color0:f[x],borderColor:f[x],borderColor0:f[x]}}:a),o={xAxis:h.xAxis.map((a,x)=>({data:d})),series:[{data:r,markLine:s.markLine},...p.map(a=>{const x={data:a.data};return a.renderItem&&(x.renderItem=a.renderItem),x})]};this.chart.setOption(o,{notMerge:!1});const u=[];this.indicators.forEach(a=>{Object.values(a.plots).forEach(x=>{x.options?.style==="table"&&x.data?.forEach(m=>{(Array.isArray(m.value)?m.value:[m.value]).forEach(S=>{S&&!S._deleted&&u.push(S)})})})}),this._lastTables=u,this._renderTableOverlays(),this.startCountdown()}startCountdown(){if(this.stopCountdown(),!this.options.lastPriceLine?.showCountdown||!this.options.interval||this.marketData.length===0)return;const t=()=>{if(this.marketData.length===0)return;const e=this.marketData[this.marketData.length-1].time+(this.options.interval||0),i=Date.now(),s=e-i;if(s<=0)return;const n=Math.abs(s),l=Math.floor(n/36e5),d=Math.floor(n%36e5/6e4),h=Math.floor(n%6e4/1e3),c=`${l>0?l.toString().padStart(2,"0")+":":""}${d.toString().padStart(2,"0")}:${h.toString().padStart(2,"0")}`,y=this.chart.getOption();if(!y||!y.series)return;const p=y.series.findIndex(x=>x.type==="candlestick");if(p===-1)return;const f=y.series[p];if(!f.markLine||!f.markLine.data||!f.markLine.data[0])return;const r=f.markLine.data[0];r.label.formatter;const o=r.yAxis;let u="";if(this.options.yAxisLabelFormatter)u=this.options.yAxisLabelFormatter(o);else{const x=this.options.yAxisDecimalPlaces!==void 0?this.options.yAxisDecimalPlaces:Z.autoDetectDecimals(this.marketData);u=Z.formatValue(o,x)}const a=`${u}
37
- ${c}`;this.chart.setOption({series:[{name:this.options.title||"Market",markLine:{data:[{...r,label:{...r.label,formatter:a}}]}}]})};t(),this.countdownInterval=setInterval(t,1e3)}stopCountdown(){this.countdownInterval&&(clearInterval(this.countdownInterval),this.countdownInterval=null)}addIndicator(t,e,i={}){const s=i.overlay!==void 0?i.overlay:i.isOverlay??!1;let n=0;if(!s){let d=0;this.indicators.forEach(h=>{h.paneIndex>d&&(d=h.paneIndex)}),n=d+1}const l=new zt(t,e,n,{height:i.height,collapsed:!1,titleColor:i.titleColor,controls:i.controls});return this.indicators.set(t,l),this.render(),l}setIndicator(t,e,i=!1){this.addIndicator(t,{[t]:e},{overlay:i})}removeIndicator(t){this.indicators.delete(t),this.render()}toggleIndicator(t,e="collapse"){if(e==="fullscreen"){document.fullscreenElement?document.exitFullscreen():this.rootContainer.requestFullscreen();return}if(e==="maximize"){this.maximizedPaneId===t?this.maximizedPaneId=null:this.maximizedPaneId=t,this.render();return}if(t==="main"){this.isMainCollapsed=!this.isMainCollapsed,this.render();return}const i=this.indicators.get(t);i&&(i.toggleCollapse(),this.render())}resize(){this.chart.resize(),this._renderTableOverlays()}_renderTableOverlays(){const t=this.chart.getModel().getComponent("grid",0)?.coordinateSystem?.getRect();J.render(this.overlayContainer,this._lastTables,t)}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 t=this.marketData.length,e=Math.ceil(t*this.padding);this.dataIndexOffset=e}render(){if(this.marketData.length===0)return;let t=null;try{const A=this.chart.getOption();if(A&&A.dataZoom&&A.dataZoom.length>0){const v=A.dataZoom.find(b=>b.type==="slider"||b.type==="inside");v&&(t={start:v.start,end:v.end})}}catch{}const e=this.options.databox?.position,i=this.leftSidebar.style.display,s=this.rightSidebar.style.display,n=e==="left"?"block":"none",l=e==="right"?"block":"none";(i!==n||s!==l)&&(this.leftSidebar.style.display=n,this.rightSidebar.style.display=l,this.chart.resize());const d=this.dataIndexOffset,h=[...Array(d).fill(""),...this.marketData.map(A=>new Date(A.time).toLocaleString()),...Array(d).fill("")],c=It.calculate(this.chart.getHeight(),this.indicators,this.options,this.isMainCollapsed,this.maximizedPaneId,this.marketData);if(!t&&c.dataZoom&&this.marketData.length>0){const A=this.marketData.length,v=h.length,b=d/v,C=A/v;c.dataZoom.forEach(w=>{if(w.start!==void 0){const M=w.start/100,P=b+M*C;w.start=P*100}if(w.end!==void 0){const M=w.end/100,P=b+M*C;w.end=P*100}})}t&&c.dataZoom&&c.dataZoom.forEach(A=>{A.start=t.start,A.end=t.end}),c.xAxis.forEach(A=>{A.data=h,A.boundaryGap=!1});const y=ut.buildCandlestickSeries(this.marketData,this.options),p={value:[NaN,NaN,NaN,NaN],itemStyle:{opacity:0}};y.data=[...Array(d).fill(p),...y.data,...Array(d).fill(p)];const f=[...Array(d).fill(null),...this.marketData,...Array(d).fill(null)],{series:r,barColors:o}=ut.buildIndicatorSeries(this.indicators,this.timeToIndex,c.paneLayout,h.length,d,f,c.overlayYAxisMap,c.separatePaneYAxisOffset);y.data=y.data.map((A,v)=>o[v]?{value:A.value||A,itemStyle:{color:o[v],color0:o[v],borderColor:o[v],borderColor0:o[v]}}:A);const u=Ut.build(c,this.options,this.toggleIndicator.bind(this),this.isMainCollapsed,this.maximizedPaneId),a=new Map;this.drawings.forEach(A=>{const v=A.paneIndex||0;a.has(v)||a.set(v,[]),a.get(v).push(A)});const x=[];a.forEach((A,v)=>{x.push({type:"custom",name:`drawings-pane-${v}`,xAxisIndex:v,yAxisIndex:v,clip:!0,renderItem:(b,C)=>{const w=A[b.dataIndex];if(!w)return;const M=w.points[0],P=w.points[1];if(!M||!P)return;const D=C.coord([M.timeIndex,M.value]),_=C.coord([P.timeIndex,P.value]),F=w.id===this.selectedDrawingId;if(w.type==="line")return{type:"group",children:[{type:"line",name:"line",shape:{x1:D[0],y1:D[1],x2:_[0],y2:_[1]},style:{stroke:w.style?.color||"#3b82f6",lineWidth:w.style?.lineWidth||2}},{type:"circle",name:"point-start",shape:{cx:D[0],cy:D[1],r:4},style:{fill:"#fff",stroke:w.style?.color||"#3b82f6",lineWidth:1,opacity:F?1:0}},{type:"circle",name:"point-end",shape:{cx:_[0],cy:_[1],r:4},style:{fill:"#fff",stroke:w.style?.color||"#3b82f6",lineWidth:1,opacity:F?1:0}}]};if(w.type==="fibonacci"){const R=D[0],G=D[1],Q=_[0],U=_[1],tt=Math.min(R,Q),et=Math.max(R,Q),k=et-tt,z=U-G,E=[0,.236,.382,.5,.618,.786,1],$=["#787b86","#f44336","#ff9800","#4caf50","#2196f3","#00bcd4","#787b86"],H=[];H.push({type:"line",name:"line",shape:{x1:R,y1:G,x2:Q,y2:U},style:{stroke:"#999",lineWidth:1,lineDash:[4,4]}}),H.push({type:"circle",name:"point-start",shape:{cx:R,cy:G,r:4},style:{fill:"#fff",stroke:w.style?.color||"#3b82f6",lineWidth:1,opacity:F?1:0},z:100}),H.push({type:"circle",name:"point-end",shape:{cx:Q,cy:U,r:4},style:{fill:"#fff",stroke:w.style?.color||"#3b82f6",lineWidth:1,opacity:F?1:0},z:100}),E.forEach((V,T)=>{const N=U-z*V,it=$[T%$.length];H.push({type:"line",name:"fib-line",shape:{x1:tt,y1:N,x2:et,y2:N},style:{stroke:it,lineWidth:1},silent:!0});const nt=w.points[0].value,X=w.points[1].value,ot=X-nt,bt=X-ot*V;if(H.push({type:"text",style:{text:`${V} (${bt.toFixed(2)})`,x:tt+5,y:N-10,fill:it,fontSize:10},silent:!0}),T<E.length-1){const wt=E[T+1],pt=U-z*wt,vt=Math.abs(pt-N),Ct=Math.min(N,pt);H.push({type:"rect",shape:{x:tt,y:Ct,width:k,height:vt},style:{fill:$[(T+1)%$.length],opacity:.1},silent:!0})}});const O=[],Y=[];return E.forEach((V,T)=>{const N=U-z*V,it=$[T%$.length];Y.push({type:"line",shape:{x1:tt,y1:N,x2:et,y2:N},style:{stroke:it,lineWidth:1},silent:!0});const nt=w.points[0].value,X=w.points[1].value,ot=X-nt,bt=X-ot*V;if(Y.push({type:"text",style:{text:`${V} (${bt.toFixed(2)})`,x:tt+5,y:N-10,fill:it,fontSize:10},silent:!0}),T<E.length-1){const wt=E[T+1],pt=U-z*wt,vt=Math.abs(pt-N),Ct=Math.min(N,pt);O.push({type:"rect",name:"line",shape:{x:tt,y:Ct,width:k,height:vt},style:{fill:$[(T+1)%$.length],opacity:.1}})}}),{type:"group",children:[...O,...Y,{type:"line",name:"line",shape:{x1:R,y1:G,x2:Q,y2:U},style:{stroke:"#999",lineWidth:1,lineDash:[4,4]}},{type:"circle",name:"point-start",shape:{cx:R,cy:G,r:4},style:{fill:"#fff",stroke:w.style?.color||"#3b82f6",lineWidth:1,opacity:F?1:0},z:100},{type:"circle",name:"point-end",shape:{cx:Q,cy:U,r:4},style:{fill:"#fff",stroke:w.style?.color||"#3b82f6",lineWidth:1,opacity:F?1:0},z:100}]}}},data:A.map(b=>[b.points[0].timeIndex,b.points[0].value,b.points[1].timeIndex,b.points[1].value]),encode:{x:[0,2],y:[1,3]},z:100,silent:!1})});const m=A=>{const v=Jt.format(A,this.options),b=this.options.databox?.position;return b==="left"?(this.leftSidebar.innerHTML=v,""):b==="right"?(this.rightSidebar.innerHTML=v,""):this.options.databox?`<div style="min-width: 200px;">${v}</div>`:""},S=[];this.indicators.forEach(A=>{Object.values(A.plots).forEach(v=>{v.options?.style==="table"&&v.data?.forEach(b=>{(Array.isArray(b.value)?b.value:[b.value]).forEach(C=>{C&&!C._deleted&&S.push(C)})})})});const I={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:m,extraCssText:e!=="floating"&&e!==void 0?"display: none !important;":void 0,position:(A,v,b,C,w)=>{if(this.options.databox?.position==="floating"){const M={top:10};return M[["left","right"][+(A[0]<w.viewSize[0]/2)]]=30,M}return null}},axisPointer:{link:{xAxisIndex:"all"},label:{backgroundColor:"#475569"}},graphic:u,grid:c.grid,xAxis:c.xAxis,yAxis:c.yAxis,dataZoom:c.dataZoom,series:[y,...r,...x]};this.chart.setOption(I,!0),this._lastTables=S,this._renderTableOverlays()}}var de=Object.defineProperty,pe=(g,t,e)=>t in g?de(g,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):g[t]=e,dt=(g,t,e)=>(pe(g,typeof t!="symbol"?t+"":t,e),e);class ft{constructor(t){dt(this,"id"),dt(this,"name"),dt(this,"icon"),dt(this,"context"),dt(this,"eventListeners",[]),this.id=t.id,this.name=t.name,this.icon=t.icon}init(t){this.context=t,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(t,e){this.context.events.on(t,e),this.eventListeners.push({event:t,handler:e})}off(t,e){this.context.events.off(t,e),this.eventListeners=this.eventListeners.filter(i=>i.event!==t||i.handler!==e)}removeAllListeners(){this.eventListeners.forEach(({event:t,handler:e})=>{this.context.events.off(t,e)}),this.eventListeners=[]}get chart(){return this.context.getChart()}get marketData(){return this.context.getMarketData()}}var ue=Object.defineProperty,fe=(g,t,e)=>t in g?ue(g,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):g[t]=e,j=(g,t,e)=>(fe(g,typeof t!="symbol"?t+"":t,e),e);class ye extends ft{constructor(t){super({id:"measure",name:t?.name||"Measure",icon:t?.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>'}),j(this,"zr"),j(this,"state","idle"),j(this,"startPoint",null),j(this,"endPoint",null),j(this,"group",null),j(this,"rect",null),j(this,"labelRect",null),j(this,"labelText",null),j(this,"lineV",null),j(this,"lineH",null),j(this,"arrowStart",null),j(this,"arrowEnd",null),j(this,"onMouseDown",()=>{this.state==="finished"&&this.removeGraphic()}),j(this,"onChartInteraction",()=>{this.group&&this.removeGraphic()}),j(this,"onClick",e=>{this.state==="idle"?(this.state="drawing",this.startPoint=[e.offsetX,e.offsetY],this.endPoint=[e.offsetX,e.offsetY],this.initGraphic(),this.updateGraphic()):this.state==="drawing"&&(this.state="finished",this.endPoint=[e.offsetX,e.offsetY],this.updateGraphic(),this.context.disableTools(),this.enableClearListeners())}),j(this,"clearHandlers",{}),j(this,"onMouseMove",e=>{this.state==="drawing"&&(this.endPoint=[e.offsetX,e.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 t=()=>{this.removeGraphic()};setTimeout(()=>{this.zr.on("click",t)},10),this.zr.on("mousedown",this.onMouseDown),this.context.events.on("chart:dataZoom",this.onChartInteraction),this.clearHandlers={click:t,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 W.graphic.Group,this.rect=new W.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 W.graphic.Line({shape:{x1:0,y1:0,x2:0,y2:0},style:{stroke:"#fff",lineWidth:1,lineDash:[4,4]},z:101}),this.lineH=new W.graphic.Line({shape:{x1:0,y1:0,x2:0,y2:0},style:{stroke:"#fff",lineWidth:1,lineDash:[4,4]},z:101}),this.arrowStart=new W.graphic.Polygon({shape:{points:[[0,0],[-5,10],[5,10]]},style:{fill:"#fff"},z:102}),this.arrowEnd=new W.graphic.Polygon({shape:{points:[[0,0],[-5,-10],[5,-10]]},style:{fill:"#fff"},z:102}),this.labelRect=new W.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 W.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[t,e]=this.startPoint,[i,s]=this.endPoint,n=this.context.coordinateConversion.pixelToData({x:t,y:e}),l=this.context.coordinateConversion.pixelToData({x:i,y:s});if(!n||!l)return;const d=Math.round(n.timeIndex),h=Math.round(l.timeIndex),c=n.value,y=l.value,p=h-d,f=y-c,r=f/c*100,o=f>=0,u=o?"rgba(33, 150, 243, 0.2)":"rgba(236, 0, 0, 0.2)",a=o?"#2196F3":"#ec0000";this.rect.setShape({x:Math.min(t,i),y:Math.min(e,s),width:Math.abs(i-t),height:Math.abs(s-e)}),this.rect.setStyle({fill:u});const x=(t+i)/2,m=(e+s)/2;this.lineV.setShape({x1:x,y1:e,x2:x,y2:s}),this.lineV.setStyle({stroke:a}),this.lineH.setShape({x1:t,y1:m,x2:i,y2:m}),this.lineH.setStyle({stroke:a});const S=Math.min(e,s),I=Math.max(e,s);this.arrowStart.setStyle({fill:"none"}),this.arrowEnd.setStyle({fill:"none"}),o?(this.arrowStart.setShape({points:[[x,S],[x-4,S+6],[x+4,S+6]]}),this.arrowStart.setStyle({fill:a})):(this.arrowEnd.setShape({points:[[x,I],[x-4,I-6],[x+4,I-6]]}),this.arrowEnd.setStyle({fill:a}));const A=[`${f.toFixed(2)} (${r.toFixed(2)}%)`,`${p} bars, ${(p*0).toFixed(0)}d`].join(`
38
- `),v=140,b=40,C=Math.max(e,s),w=Math.min(e,s);let M=(t+i)/2-v/2,P=C+10;const D=this.chart.getHeight();P+b>D&&(P=w-b-10),this.labelRect.setShape({x:M,y:P,width:v,height:b}),this.labelRect.setStyle({fill:"#1e293b",stroke:a,lineWidth:1}),this.labelText.setStyle({x:M+v/2,y:P+b/2,text:A,fill:"#fff"})}}var ge=Object.defineProperty,xe=(g,t,e)=>t in g?ge(g,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):g[t]=e,K=(g,t,e)=>(xe(g,typeof t!="symbol"?t+"":t,e),e);class me extends ft{constructor(t){super({id:"trend-line",name:t?.name||"Trend Line",icon:t?.icon||'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="2" y1="22" x2="22" y2="2" /></svg>'}),K(this,"zr"),K(this,"state","idle"),K(this,"startPoint",null),K(this,"endPoint",null),K(this,"group",null),K(this,"line",null),K(this,"startCircle",null),K(this,"endCircle",null),K(this,"onMouseDown",()=>{}),K(this,"onChartInteraction",()=>{}),K(this,"onClick",e=>{if(this.state==="idle")this.state="drawing",this.startPoint=[e.offsetX,e.offsetY],this.endPoint=[e.offsetX,e.offsetY],this.initGraphic(),this.updateGraphic();else if(this.state==="drawing"){if(this.state="finished",this.endPoint=[e.offsetX,e.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()}}),K(this,"clearHandlers",{}),K(this,"onMouseMove",e=>{this.state==="drawing"&&(this.endPoint=[e.offsetX,e.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 W.graphic.Group,this.line=new W.graphic.Line({shape:{x1:0,y1:0,x2:0,y2:0},style:{stroke:"#3b82f6",lineWidth:2},z:100}),this.startCircle=new W.graphic.Circle({shape:{cx:0,cy:0,r:4},style:{fill:"#fff",stroke:"#3b82f6",lineWidth:1},z:101}),this.endCircle=new W.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[t,e]=this.startPoint,[i,s]=this.endPoint;this.line.setShape({x1:t,y1:e,x2:i,y2:s}),this.startCircle.setShape({cx:t,cy:e}),this.endCircle.setShape({cx:i,cy:s})}}var be=Object.defineProperty,we=(g,t,e)=>t in g?be(g,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):g[t]=e,at=(g,t,e)=>(we(g,typeof t!="symbol"?t+"":t,e),e);class ve extends ft{constructor(t={}){super({id:"fibonacci-tool",name:t.name||"Fibonacci Retracement",icon:t.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>'}),at(this,"startPoint",null),at(this,"endPoint",null),at(this,"state","idle"),at(this,"graphicGroup",null),at(this,"levels",[0,.236,.382,.5,.618,.786,1]),at(this,"colors",["#787b86","#f44336","#ff9800","#4caf50","#2196f3","#00bcd4","#787b86"]),at(this,"onClick",e=>{this.state==="idle"?(this.state="drawing",this.startPoint=[e.offsetX,e.offsetY],this.endPoint=[e.offsetX,e.offsetY],this.initGraphic(),this.updateGraphic()):this.state==="drawing"&&(this.state="finished",this.endPoint=[e.offsetX,e.offsetY],this.updateGraphic(),this.saveDrawing(),this.removeGraphic(),this.context.disableTools())}),at(this,"onMouseMove",e=>{this.state==="drawing"&&(this.endPoint=[e.offsetX,e.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 t=this.context.getChart().getZr();t.on("click",this.onClick),t.on("mousemove",this.onMouseMove)}unbindEvents(){const t=this.context.getChart().getZr();t.off("click",this.onClick),t.off("mousemove",this.onMouseMove)}initGraphic(){this.graphicGroup=new W.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 t=this.startPoint[0],e=this.startPoint[1],i=this.endPoint[0],s=this.endPoint[1],n=new W.graphic.Line({shape:{x1:t,y1:e,x2:i,y2:s},style:{stroke:"#999",lineWidth:1,lineDash:[4,4]},silent:!0});this.graphicGroup.add(n);const l=Math.min(t,i),d=Math.max(t,i),h=d-l,c=s-e;this.levels.forEach((y,p)=>{const f=s-c*y,r=this.colors[p%this.colors.length],o=new W.graphic.Line({shape:{x1:l,y1:f,x2:d,y2:f},style:{stroke:r,lineWidth:1},silent:!0});if(this.graphicGroup.add(o),p<this.levels.length-1){const u=this.levels[p+1],a=s-c*u,x=Math.abs(a-f),m=Math.min(f,a),S=new W.graphic.Rect({shape:{x:l,y:m,width:h,height:x},style:{fill:this.colors[(p+1)%this.colors.length],opacity:.1},silent:!0});this.graphicGroup.add(S)}})}saveDrawing(){if(!this.startPoint||!this.endPoint)return;const t=this.context.coordinateConversion.pixelToData({x:this.startPoint[0],y:this.startPoint[1]}),e=this.context.coordinateConversion.pixelToData({x:this.endPoint[0],y:this.endPoint[1]});if(t&&e){const i=t.paneIndex||0;this.context.addDrawing({id:`fib-${Date.now()}`,type:"fibonacci",points:[t,e],paneIndex:i,style:{color:"#3b82f6",lineWidth:1}})}}}st.AbstractPlugin=ft,st.FibonacciTool=ve,st.LineTool=me,st.MeasureTool=ye,st.QFChart=ce});
34
+ <div>${h.marker} <span style="color: #cbd5e1;">${h.displayName}</span></div>
35
+ <div style="font-size: 10px; color: #fff;padding-left:10px;">${c}</div>
36
+ </div>`}),d+="</div>"})}return d}}var Kt=Object.defineProperty,Qt=(x,t,e)=>t in x?Kt(x,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):x[t]=e,pt=(x,t,e)=>(Qt(x,typeof t!="symbol"?t+"":t,e),e);class te{constructor(t,e){pt(this,"plugins",new Map),pt(this,"activePluginId",null),pt(this,"context"),pt(this,"toolbarContainer"),pt(this,"tooltipElement",null),pt(this,"hideTimeout",null),this.context=t,this.toolbarContainer=e,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(t,e){if(!this.tooltipElement)return;this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=null);const i=t.getBoundingClientRect();this.tooltipElement.textContent=e,this.tooltipElement.style.display="block";const s=this.tooltipElement.getBoundingClientRect(),a=i.top+(i.height-s.height)/2,o=i.right+10;this.tooltipElement.style.top=`${a}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(t){if(this.plugins.has(t.id)){console.warn(`Plugin with id ${t.id} is already registered.`);return}this.plugins.set(t.id,t),t.init(this.context),this.addButton(t)}unregister(t){const e=this.plugins.get(t);e&&(this.activePluginId===t&&this.deactivatePlugin(),e.destroy?.(),this.plugins.delete(t),this.removeButton(t))}activatePlugin(t){if(this.activePluginId===t){this.deactivatePlugin();return}this.activePluginId&&this.deactivatePlugin();const e=this.plugins.get(t);e&&(this.activePluginId=t,this.setButtonActive(t,!0),e.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(t){const e=document.createElement("button");e.id=`qfchart-plugin-btn-${t.id}`,e.style.width="30px",e.style.height="30px",e.style.padding="4px",e.style.border="1px solid transparent",e.style.borderRadius="4px",e.style.backgroundColor="transparent",e.style.cursor="pointer",e.style.color=this.context.getOptions().fontColor||"#cbd5e1",e.style.display="flex",e.style.alignItems="center",e.style.justifyContent="center",t.icon?e.innerHTML=t.icon:e.innerText=(t.name||t.id).substring(0,2).toUpperCase(),e.addEventListener("mouseenter",()=>{this.activePluginId!==t.id&&(e.style.backgroundColor="rgba(255, 255, 255, 0.1)"),this.showTooltip(e,t.name||t.id)}),e.addEventListener("mouseleave",()=>{this.activePluginId!==t.id&&(e.style.backgroundColor="transparent"),this.hideTooltip()}),e.onclick=()=>this.activatePlugin(t.id),this.toolbarContainer.appendChild(e)}removeButton(t){const e=this.toolbarContainer.querySelector(`#qfchart-plugin-btn-${t}`);e&&e.remove()}setButtonActive(t,e){const i=this.toolbarContainer.querySelector(`#qfchart-plugin-btn-${t}`);i&&(e?(i.style.backgroundColor="#2563eb",i.style.color="#ffffff"):(i.style.backgroundColor="transparent",i.style.color=this.context.getOptions().fontColor||"#cbd5e1"))}}var ee=Object.defineProperty,ie=(x,t,e)=>t in x?ee(x,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):x[t]=e,X=(x,t,e)=>(ie(x,typeof t!="symbol"?t+"":t,e),e);class se{constructor(t){X(this,"context"),X(this,"isEditing",!1),X(this,"currentDrawing",null),X(this,"editingPointIndex",null),X(this,"zr"),X(this,"editGroup",null),X(this,"editLine",null),X(this,"editStartPoint",null),X(this,"editEndPoint",null),X(this,"isMovingShape",!1),X(this,"dragStart",null),X(this,"initialPixelPoints",[]),X(this,"onDrawingMouseDown",e=>{if(this.isEditing)return;const i=this.context.getDrawing(e.id);i&&(this.isEditing=!0,this.isMovingShape=!0,this.currentDrawing=JSON.parse(JSON.stringify(i)),this.dragStart={x:e.x,y:e.y},this.initialPixelPoints=i.points.map(s=>{const a=this.context.coordinateConversion.dataToPixel(s);return a?{x:a.x,y:a.y}:{x:0,y:0}}),this.context.lockChart(),this.createEditGraphic(),this.zr.on("mousemove",this.onMouseMove),this.zr.on("mouseup",this.onMouseUp))}),X(this,"onPointMouseDown",e=>{if(this.isEditing)return;const i=this.context.getDrawing(e.id);i&&(this.isEditing=!0,this.currentDrawing=JSON.parse(JSON.stringify(i)),this.editingPointIndex=e.pointIndex,this.context.lockChart(),this.createEditGraphic(),this.zr.on("mousemove",this.onMouseMove),this.zr.on("mouseup",this.onMouseUp))}),X(this,"onMouseMove",e=>{if(!this.isEditing||!this.currentDrawing)return;const i=e.offsetX,s=e.offsetY;if(this.isMovingShape&&this.dragStart){const a=i-this.dragStart.x,o=s-this.dragStart.y,u={x:this.initialPixelPoints[0].x+a,y:this.initialPixelPoints[0].y+o},d={x:this.initialPixelPoints[1].x+a,y:this.initialPixelPoints[1].y+o};this.editLine.setShape({x1:u.x,y1:u.y,x2:d.x,y2:d.y}),this.editStartPoint.setShape({cx:u.x,cy:u.y}),this.editEndPoint.setShape({cx:d.x,cy:d.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})))}),X(this,"onMouseUp",e=>{this.isEditing&&this.finishEditing(e.offsetX,e.offsetY)}),this.context=t,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 H.graphic.Group;const t=this.currentDrawing.points[0],e=this.currentDrawing.points[1],i=this.context.coordinateConversion.dataToPixel(t),s=this.context.coordinateConversion.dataToPixel(e);!i||!s||(this.editLine=new H.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 H.graphic.Circle({shape:{cx:i.x,cy:i.y,r:5},style:{fill:"#fff",stroke:"#3b82f6",lineWidth:2},z:1e3}),this.editEndPoint=new H.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(t,e){if(this.currentDrawing){if(this.isMovingShape&&this.dragStart){const i=t-this.dragStart.x,s=e-this.dragStart.y,a=this.initialPixelPoints.map((o,u)=>{const d=o.x+i,p=o.y+s;return this.context.coordinateConversion.pixelToData({x:d,y:p})});a.every(o=>o!==null)&&a[0]&&a[1]&&(this.currentDrawing.points[0]=a[0],this.currentDrawing.points[1]=a[1],a[0].paneIndex!==void 0&&(this.currentDrawing.paneIndex=a[0].paneIndex),this.context.updateDrawing(this.currentDrawing))}else if(this.editingPointIndex!==null){const i=this.context.coordinateConversion.pixelToData({x:t,y:e});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 ne=Object.defineProperty,oe=(x,t,e)=>t in x?ne(x,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):x[t]=e,ae=(x,t,e)=>(oe(x,typeof t!="symbol"?t+"":t,e),e);class re{constructor(){ae(this,"handlers",new Map)}on(t,e){this.handlers.has(t)||this.handlers.set(t,new Set),this.handlers.get(t).add(e)}off(t,e){const i=this.handlers.get(t);i&&i.delete(e)}emit(t,e){const i=this.handlers.get(t);i&&i.forEach(s=>{try{s(e)}catch(a){console.error(`Error in EventBus handler for ${t}:`,a)}})}clear(){this.handlers.clear()}}class J{static safeParseColor(t){if(!t||typeof t!="string")return{color:"#888888",opacity:1};const e=t.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)/);if(e){const i=e[4]?parseFloat(e[4]):1;return{color:`rgb(${e[1]},${e[2]},${e[3]})`,opacity:i}}return{color:t,opacity:1}}static render(t,e,i){J.clearAll(t);const s=new Map;for(const a of e)a&&!a._deleted&&s.set(a.position,a);s.forEach(a=>{const o=a._paneIndex??0,u=i?i(o):void 0,d=J.buildTable(a);J.positionTable(d,a.position,u),t.appendChild(d)})}static clearAll(t){for(;t.firstChild;)t.removeChild(t.firstChild)}static buildTable(t){const e=document.createElement("table"),i=t.border_width??0,s=t.frame_width??0;if(i>0&&t.border_color||s>0&&t.frame_color?(e.style.borderCollapse="separate",e.style.borderSpacing="0"):e.style.borderCollapse="collapse",e.style.pointerEvents="none",e.style.fontSize="14px",e.style.lineHeight="1.4",e.style.fontFamily="sans-serif",e.style.margin="4px",t.bgcolor){const{color:r,opacity:l}=J.safeParseColor(t.bgcolor);e.style.backgroundColor=r,l<1&&(e.style.opacity=String(l))}if(s>0&&t.frame_color){const{color:r}=J.safeParseColor(t.frame_color);e.style.border=`${s}px solid ${r}`}else e.style.border="none";const a=new Map,o=new Set;if(t.merges)for(const r of t.merges){const l=`${r.startCol},${r.startRow}`;a.set(l,{colspan:r.endCol-r.startCol+1,rowspan:r.endRow-r.startRow+1});for(let h=r.startRow;h<=r.endRow;h++)for(let n=r.startCol;n<=r.endCol;n++)h===r.startRow&&n===r.startCol||o.add(`${n},${h}`)}const u=i>0&&!!t.border_color,d=u?J.safeParseColor(t.border_color).color:"",p=t.rows||0,g=t.columns||0;for(let r=0;r<p;r++){const l=document.createElement("tr");for(let h=0;h<g;h++){const n=`${h},${r}`;if(o.has(n))continue;const c=document.createElement("td"),f=a.get(n);f&&(f.colspan>1&&(c.colSpan=f.colspan),f.rowspan>1&&(c.rowSpan=f.rowspan)),u?c.style.border=`${i}px solid ${d}`:c.style.border="none";const m=t.cells?.[r]?.[h];if(m&&!m._merged){if(c.textContent=m.text||"",m.bgcolor){const{color:w,opacity:C}=J.safeParseColor(m.bgcolor);c.style.backgroundColor=w,C<1&&(c.style.backgroundColor=m.bgcolor)}if(m.text_color){const{color:w}=J.safeParseColor(m.text_color);c.style.color=w}c.style.fontSize=J.getSizePixels(m.text_size)+"px",c.style.textAlign=J.mapHAlign(m.text_halign),c.style.verticalAlign=J.mapVAlign(m.text_valign),m.text_font_family==="monospace"&&(c.style.fontFamily="monospace"),m.width>0&&(c.style.width=m.width+"%"),m.height>0&&(c.style.height=m.height+"%"),m.tooltip&&(c.title=m.tooltip)}c.style.padding="4px 6px",c.style.whiteSpace="nowrap",l.appendChild(c)}e.appendChild(l)}return e}static positionTable(t,e,i){t.style.position="absolute";const s=8,a=i?i.y+"px":"0",o=i?i.x+"px":"0",u=i?i.y+i.height-s+"px":"0",d=i?i.x+i.width-s+"px":"0",p=i?i.x+i.width/2+"px":"50%",g=i?i.y+i.height/2+"px":"50%";switch(e){case"top_left":t.style.top=a,t.style.left=o;break;case"top_center":t.style.top=a,t.style.left=p,t.style.transform="translateX(-50%)";break;case"top_right":t.style.top=a,t.style.left=d,t.style.transform="translateX(-100%)";break;case"middle_left":t.style.top=g,t.style.left=o,t.style.transform="translateY(-50%)";break;case"middle_center":t.style.top=g,t.style.left=p,t.style.transform="translate(-50%, -50%)";break;case"middle_right":t.style.top=g,t.style.left=d,t.style.transform="translate(-100%, -50%)";break;case"bottom_left":t.style.top=u,t.style.left=o,t.style.transform="translateY(-100%)";break;case"bottom_center":t.style.top=u,t.style.left=p,t.style.transform="translate(-50%, -100%)";break;case"bottom_right":t.style.top=u,t.style.left=d,t.style.transform="translate(-100%, -100%)";break;default:t.style.top=a,t.style.left=d,t.style.transform="translateX(-100%)";break}}static getSizePixels(t){if(typeof t=="number"&&t>0)return t;switch(t){case"auto":case"size.auto":return 12;case"tiny":case"size.tiny":return 8;case"small":case"size.small":return 10;case"normal":case"size.normal":return 14;case"large":case"size.large":return 20;case"huge":case"size.huge":return 36;default:return 14}}static mapHAlign(t){switch(t){case"left":case"text.align_left":return"left";case"right":case"text.align_right":return"right";case"center":case"text.align_center":default:return"center"}}static mapVAlign(t){switch(t){case"top":case"text.align_top":return"top";case"bottom":case"text.align_bottom":return"bottom";case"center":case"text.align_center":default:return"middle"}}}var le=Object.defineProperty,he=(x,t,e)=>t in x?le(x,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):x[t]=e,z=(x,t,e)=>(he(x,typeof t!="symbol"?t+"":t,e),e);class ce{constructor(t,e={}){z(this,"chart"),z(this,"options"),z(this,"marketData",[]),z(this,"indicators",new Map),z(this,"timeToIndex",new Map),z(this,"pluginManager"),z(this,"drawingEditor"),z(this,"events",new re),z(this,"isMainCollapsed",!1),z(this,"maximizedPaneId",null),z(this,"countdownInterval",null),z(this,"selectedDrawingId",null),z(this,"drawings",[]),z(this,"coordinateConversion",{pixelToData:o=>{const u=this.chart.getOption();if(!u||!u.grid)return null;const d=u.grid.length;for(let p=0;p<d;p++)if(this.chart.containPixel({gridIndex:p},[o.x,o.y])){this.chart.convertFromPixel({seriesIndex:p},[o.x,o.y]);const g=this.chart.convertFromPixel({gridIndex:p},[o.x,o.y]);if(g)return{timeIndex:Math.round(g[0]),value:g[1],paneIndex:p}}return null},dataToPixel:o=>{const u=o.paneIndex||0,d=this.chart.convertToPixel({gridIndex:u},[o.timeIndex,o.value]);return d?{x:d[0],y:d[1]}:null}}),z(this,"upColor","#00da3c"),z(this,"downColor","#ec0000"),z(this,"defaultPadding",0),z(this,"padding"),z(this,"dataIndexOffset",0),z(this,"rootContainer"),z(this,"layoutContainer"),z(this,"toolbarContainer"),z(this,"leftSidebar"),z(this,"rightSidebar"),z(this,"chartContainer"),z(this,"overlayContainer"),z(this,"_lastTables",[]),z(this,"_lastLayout",null),z(this,"_mainHeightOverride",null),z(this,"_paneDragState",null),z(this,"_paneResizeRafId",null),z(this,"onKeyDown",o=>{(o.key==="Delete"||o.key==="Backspace")&&this.selectedDrawingId&&(this.removeDrawing(this.selectedDrawingId),this.selectedDrawingId=null,this.render())}),z(this,"onFullscreenChange",()=>{this.render()}),z(this,"isLocked",!1),z(this,"lockedState",null),this.rootContainer=t,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,...e},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=H.init(this.chartContainer),this.chartContainer.style.position="relative",this.overlayContainer=document.createElement("div"),this.overlayContainer.style.cssText="position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:100;overflow:hidden;",this.chartContainer.appendChild(this.overlayContainer),this.pluginManager=new te(this,this.toolbarContainer),this.drawingEditor=new se(this),this.chart.on("dataZoom",o=>{this.events.emit("chart:dataZoom",o);const u=this.options.databox?.triggerOn,d=this.options.databox?.position;u==="click"&&d==="floating"&&this.chart.dispatchAction({type:"hideTip"})}),this.chart.on("finished",o=>this.events.emit("chart:updated",o)),this.chart.getZr().on("mousedown",o=>{this._paneDragState||this.events.emit("mouse:down",o)}),this.chart.getZr().on("mousemove",o=>{this._paneDragState||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._paneDragState||this.events.emit("mouse:click",o)});const i=this.chart.getZr(),s=i.setCursorStyle,a=this;i.setCursorStyle=function(o){if(a._paneDragState){s.call(this,"row-resize");return}o==="grab"&&(o="crosshair"),s.call(this,o)},this.bindDrawingEvents(),this.bindPaneResizeEvents(),window.addEventListener("resize",this.resize.bind(this)),document.addEventListener("fullscreenchange",this.onFullscreenChange),document.addEventListener("keydown",this.onKeyDown)}bindPaneResizeEvents(){const t=this.chart.getZr(),e=s=>{if(!this._lastLayout||this._lastLayout.paneBoundaries.length===0||this.maximizedPaneId)return null;const a=this.chart.getHeight();if(a<=0)return null;for(const o of this._lastLayout.paneBoundaries){const u=o.yPercent/100*a;if(Math.abs(s-u)<=6){if(o.aboveId==="main"&&this.isMainCollapsed||this.indicators.get(o.belowId)?.collapsed||o.aboveId!=="main"&&this.indicators.get(o.aboveId)?.collapsed)continue;return o}}return null},i=s=>s==="main"?this._lastLayout?.mainPaneHeight??50:this.indicators.get(s)?.height??15;t.on("mousemove",s=>{if(this._paneDragState){const a=s.offsetY-this._paneDragState.startY,o=this.chart.getHeight();if(o<=0)return;const u=a/o*100,d=this._paneDragState.aboveId==="main"?10:5,p=5;let g=this._paneDragState.startAboveHeight+u,r=this._paneDragState.startBelowHeight-u;if(g<d&&(g=d,r=this._paneDragState.startAboveHeight+this._paneDragState.startBelowHeight-d),r<p&&(r=p,g=this._paneDragState.startAboveHeight+this._paneDragState.startBelowHeight-p),this._paneDragState.aboveId==="main")this._mainHeightOverride=g;else{const h=this.indicators.get(this._paneDragState.aboveId);h&&(h.height=g)}const l=this.indicators.get(this._paneDragState.belowId);l&&(l.height=r),this._paneResizeRafId||(this._paneResizeRafId=requestAnimationFrame(()=>{this._paneResizeRafId=null,this.render()})),t.setCursorStyle("row-resize"),s.stop?.();return}e(s.offsetY)&&t.setCursorStyle("row-resize")}),t.on("mousedown",s=>{const a=e(s.offsetY);a&&(this._paneDragState={startY:s.offsetY,aboveId:a.aboveId,belowId:a.belowId,startAboveHeight:i(a.aboveId),startBelowHeight:i(a.belowId)},t.setCursorStyle("row-resize"),s.stop?.())}),t.on("mouseup",()=>{this._paneDragState&&(this._paneDragState=null,this._paneResizeRafId&&(cancelAnimationFrame(this._paneResizeRafId),this._paneResizeRafId=null),this.render())})}bindDrawingEvents(){let t=null;const e=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 a=parseInt(s[1]),o=this.drawings.filter(d=>(d.paneIndex||0)===a)[i.dataIndex];if(!o)return null;const u=i.event?.target?.name;return{drawing:o,targetName:u,paneIdx:a}};this.chart.on("mouseover",i=>{const s=e(i);if(!s)return;const a=i.event?.target?.parent;if(a){const o=s.drawing.id===this.selectedDrawingId;t&&(clearTimeout(t),t=null),o||a.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 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=e(i);if(!s)return;const a=i.event?.target?.parent;if(s.drawing.id!==this.selectedDrawingId){if(t=setTimeout(()=>{if(a){if(this.selectedDrawingId===s.drawing.id)return;a.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=e(i);if(!s)return;const a=i.event?.event||i.event,o=a?.offsetX,u=a?.offsetY;if(s.targetName==="line")this.events.emit("drawing:mousedown",{id:s.drawing.id,x:o,y:u});else if(s.targetName?.startsWith("point")){const d=s.targetName==="point-start"?0:1;this.events.emit("drawing:point:mousedown",{id:s.drawing.id,pointIndex:d,x:o,y:u})}}),this.chart.on("click",i=>{const s=e(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 a=s.targetName==="point-start"?0:1;this.events.emit("drawing:point:click",{id:s.drawing.id,pointIndex:a})}}}),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(t){this.pluginManager.register(t)}addDrawing(t){this.drawings.push(t),this.render()}removeDrawing(t){const e=this.drawings.findIndex(i=>i.id===t);if(e!==-1){const i=this.drawings[e];this.drawings.splice(e,1),this.events.emit("drawing:deleted",{id:i.id}),this.render()}}getDrawing(t){return this.drawings.find(e=>e.id===t)}updateDrawing(t){const e=this.drawings.findIndex(i=>i.id===t.id);e!==-1&&(this.drawings[e]=t,this.render())}lockChart(){if(this.isLocked)return;this.isLocked=!0;const t=this.chart.getOption();this.chart.setOption({dataZoom:t.dataZoom.map(e=>({...e,disabled:!0})),tooltip:{show:!1}})}unlockChart(){if(!this.isLocked)return;this.isLocked=!1;const t=this.chart.getOption();(this.options.dataZoom||{}).visible,t.dataZoom&&this.chart.setOption({dataZoom:t.dataZoom.map(e=>({...e,disabled:!1})),tooltip:{show:!0}})}setZoom(t,e){this.chart.dispatchAction({type:"dataZoom",start:t,end:e})}setMarketData(t){this.marketData=t,this.rebuildTimeIndex(),this.render()}updateData(t){if(t.length===0)return;const e=new Map;this.marketData.forEach(f=>{e.set(f.time,f)}),t.forEach(f=>{e.has(f.time),e.set(f.time,f)}),this.marketData=Array.from(e.values()).sort((f,m)=>f.time-m.time),this.rebuildTimeIndex();const i=this.dataIndexOffset,s=gt.buildCandlestickSeries(this.marketData,this.options),a={value:[NaN,NaN,NaN,NaN],itemStyle:{opacity:0}},o=[...Array(i).fill(a),...s.data,...Array(i).fill(a)],u=[...Array(i).fill(""),...this.marketData.map(f=>new Date(f.time).toLocaleString()),...Array(i).fill("")],d=this.chart.getOption(),p=At.calculate(this.chart.getHeight(),this.indicators,this.options,this.isMainCollapsed,this.maximizedPaneId,this.marketData,this._mainHeightOverride??void 0);this._lastLayout=p;const g=[...Array(i).fill(null),...this.marketData,...Array(i).fill(null)],{series:r,barColors:l}=gt.buildIndicatorSeries(this.indicators,this.timeToIndex,p.paneLayout,u.length,i,g,p.overlayYAxisMap,p.separatePaneYAxisOffset),h=o.map((f,m)=>l[m]?{value:f.value||f,itemStyle:{color:l[m],color0:l[m],borderColor:l[m],borderColor0:l[m]}}:f),n={xAxis:d.xAxis.map((f,m)=>({data:u})),series:[{data:h,markLine:s.markLine},...r.map(f=>{const m={data:f.data};return f.renderItem&&(m.renderItem=f.renderItem),m})]};this.chart.setOption(n,{notMerge:!1});const c=[];this.indicators.forEach(f=>{Object.values(f.plots).forEach(m=>{m.options?.style==="table"&&m.data?.forEach(w=>{(Array.isArray(w.value)?w.value:[w.value]).forEach(C=>{C&&!C._deleted&&(C._paneIndex=C.force_overlay?0:f.paneIndex,c.push(C))})})})}),this._lastTables=c,this._renderTableOverlays(),this.startCountdown()}startCountdown(){if(this.stopCountdown(),!this.options.lastPriceLine?.showCountdown||!this.options.interval||this.marketData.length===0)return;const t=()=>{if(this.marketData.length===0)return;const e=this.marketData[this.marketData.length-1].time+(this.options.interval||0),i=Date.now(),s=e-i;if(s<=0)return;const a=Math.abs(s),o=Math.floor(a/36e5),u=Math.floor(a%36e5/6e4),d=Math.floor(a%6e4/1e3),p=`${o>0?o.toString().padStart(2,"0")+":":""}${u.toString().padStart(2,"0")}:${d.toString().padStart(2,"0")}`,g=this.chart.getOption();if(!g||!g.series)return;const r=g.series.findIndex(m=>m.type==="candlestick");if(r===-1)return;const l=g.series[r];if(!l.markLine||!l.markLine.data||!l.markLine.data[0])return;const h=l.markLine.data[0];h.label.formatter;const n=h.yAxis;let c="";if(this.options.yAxisLabelFormatter)c=this.options.yAxisLabelFormatter(n);else{const m=this.options.yAxisDecimalPlaces!==void 0?this.options.yAxisDecimalPlaces:Z.autoDetectDecimals(this.marketData);c=Z.formatValue(n,m)}const f=`${c}
37
+ ${p}`;this.chart.setOption({series:[{name:this.options.title||"Market",markLine:{data:[{...h,label:{...h.label,formatter:f}}]}}]})};t(),this.countdownInterval=setInterval(t,1e3)}stopCountdown(){this.countdownInterval&&(clearInterval(this.countdownInterval),this.countdownInterval=null)}addIndicator(t,e,i={}){const s=i.overlay!==void 0?i.overlay:i.isOverlay??!1;let a=0;if(!s){let u=0;this.indicators.forEach(d=>{d.paneIndex>u&&(u=d.paneIndex)}),a=u+1}const o=new zt(t,e,a,{height:i.height,collapsed:!1,titleColor:i.titleColor,controls:i.controls});return this.indicators.set(t,o),this.render(),o}setIndicator(t,e,i=!1){this.addIndicator(t,{[t]:e},{overlay:i})}removeIndicator(t){this.indicators.delete(t),this.render()}toggleIndicator(t,e="collapse"){if(e==="fullscreen"){document.fullscreenElement?document.exitFullscreen():this.rootContainer.requestFullscreen();return}if(e==="maximize"){this.maximizedPaneId===t?this.maximizedPaneId=null:this.maximizedPaneId=t,this.render();return}if(t==="main"){this.isMainCollapsed=!this.isMainCollapsed,this.render();return}const i=this.indicators.get(t);i&&(i.toggleCollapse(),this.render())}resize(){this.chart.resize(),this._renderTableOverlays()}_renderTableOverlays(){const t=this.chart.getModel(),e=i=>t.getComponent("grid",i)?.coordinateSystem?.getRect();J.render(this.overlayContainer,this._lastTables,e)}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 t=this.marketData.length,e=Math.ceil(t*this.padding);this.dataIndexOffset=e}render(){if(this.marketData.length===0)return;let t=null;try{const v=this.chart.getOption();if(v&&v.dataZoom&&v.dataZoom.length>0){const y=v.dataZoom.find(b=>b.type==="slider"||b.type==="inside");y&&(t={start:y.start,end:y.end})}}catch{}const e=this.options.databox?.position,i=this.leftSidebar.style.display,s=this.rightSidebar.style.display,a=e==="left"?"block":"none",o=e==="right"?"block":"none";(i!==a||s!==o)&&(this.leftSidebar.style.display=a,this.rightSidebar.style.display=o,this.chart.resize());const u=this.dataIndexOffset,d=[...Array(u).fill(""),...this.marketData.map(v=>new Date(v.time).toLocaleString()),...Array(u).fill("")],p=At.calculate(this.chart.getHeight(),this.indicators,this.options,this.isMainCollapsed,this.maximizedPaneId,this.marketData,this._mainHeightOverride??void 0);if(this._lastLayout=p,!t&&p.dataZoom&&this.marketData.length>0){const v=this.marketData.length,y=d.length,b=u/y,_=v/y;p.dataZoom.forEach(I=>{if(I.start!==void 0){const P=I.start/100,k=b+P*_;I.start=k*100}if(I.end!==void 0){const P=I.end/100,k=b+P*_;I.end=k*100}})}t&&p.dataZoom&&p.dataZoom.forEach(v=>{v.start=t.start,v.end=t.end}),p.xAxis.forEach(v=>{v.data=d,v.boundaryGap=!1});const g=gt.buildCandlestickSeries(this.marketData,this.options),r={value:[NaN,NaN,NaN,NaN],itemStyle:{opacity:0}};g.data=[...Array(u).fill(r),...g.data,...Array(u).fill(r)];const l=[...Array(u).fill(null),...this.marketData,...Array(u).fill(null)],{series:h,barColors:n}=gt.buildIndicatorSeries(this.indicators,this.timeToIndex,p.paneLayout,d.length,u,l,p.overlayYAxisMap,p.separatePaneYAxisOffset);g.data=g.data.map((v,y)=>n[y]?{value:v.value||v,itemStyle:{color:n[y],color0:n[y],borderColor:n[y],borderColor0:n[y]}}:v);const c=Ut.build(p,this.options,this.toggleIndicator.bind(this),this.isMainCollapsed,this.maximizedPaneId),f=new Map;this.drawings.forEach(v=>{const y=v.paneIndex||0;f.has(y)||f.set(y,[]),f.get(y).push(v)});const m=[];f.forEach((v,y)=>{m.push({type:"custom",name:`drawings-pane-${y}`,xAxisIndex:y,yAxisIndex:y,clip:!0,renderItem:(b,_)=>{const I=v[b.dataIndex];if(!I)return;const P=I.points[0],k=I.points[1];if(!P||!k)return;const D=_.coord([P.timeIndex,P.value]),M=_.coord([k.timeIndex,k.value]),$=I.id===this.selectedDrawingId;if(I.type==="line")return{type:"group",children:[{type:"line",name:"line",shape:{x1:D[0],y1:D[1],x2:M[0],y2:M[1]},style:{stroke:I.style?.color||"#3b82f6",lineWidth:I.style?.lineWidth||2}},{type:"circle",name:"point-start",shape:{cx:D[0],cy:D[1],r:4},style:{fill:"#fff",stroke:I.style?.color||"#3b82f6",lineWidth:1,opacity:$?1:0}},{type:"circle",name:"point-end",shape:{cx:M[0],cy:M[1],r:4},style:{fill:"#fff",stroke:I.style?.color||"#3b82f6",lineWidth:1,opacity:$?1:0}}]};if(I.type==="fibonacci"){const F=D[0],U=D[1],tt=M[0],W=M[1],et=Math.min(F,tt),ot=Math.max(F,tt),it=ot-et,G=W-U,S=[0,.236,.382,.5,.618,.786,1],L=["#787b86","#f44336","#ff9800","#4caf50","#2196f3","#00bcd4","#787b86"],N=[];N.push({type:"line",name:"line",shape:{x1:F,y1:U,x2:tt,y2:W},style:{stroke:"#999",lineWidth:1,lineDash:[4,4]}}),N.push({type:"circle",name:"point-start",shape:{cx:F,cy:U,r:4},style:{fill:"#fff",stroke:I.style?.color||"#3b82f6",lineWidth:1,opacity:$?1:0},z:100}),N.push({type:"circle",name:"point-end",shape:{cx:tt,cy:W,r:4},style:{fill:"#fff",stroke:I.style?.color||"#3b82f6",lineWidth:1,opacity:$?1:0},z:100}),S.forEach((E,T)=>{const B=W-G*E,O=L[T%L.length];N.push({type:"line",name:"fib-line",shape:{x1:et,y1:B,x2:ot,y2:B},style:{stroke:O,lineWidth:1},silent:!0});const j=I.points[0].value,st=I.points[1].value,at=st-j,Q=st-at*E;if(N.push({type:"text",style:{text:`${E} (${Q.toFixed(2)})`,x:et+5,y:B-10,fill:O,fontSize:10},silent:!0}),T<S.length-1){const rt=S[T+1],yt=W-G*rt,wt=Math.abs(yt-B),It=Math.min(B,yt);N.push({type:"rect",shape:{x:et,y:It,width:it,height:wt},style:{fill:L[(T+1)%L.length],opacity:.1},silent:!0})}});const R=[],V=[];return S.forEach((E,T)=>{const B=W-G*E,O=L[T%L.length];V.push({type:"line",shape:{x1:et,y1:B,x2:ot,y2:B},style:{stroke:O,lineWidth:1},silent:!0});const j=I.points[0].value,st=I.points[1].value,at=st-j,Q=st-at*E;if(V.push({type:"text",style:{text:`${E} (${Q.toFixed(2)})`,x:et+5,y:B-10,fill:O,fontSize:10},silent:!0}),T<S.length-1){const rt=S[T+1],yt=W-G*rt,wt=Math.abs(yt-B),It=Math.min(B,yt);R.push({type:"rect",name:"line",shape:{x:et,y:It,width:it,height:wt},style:{fill:L[(T+1)%L.length],opacity:.1}})}}),{type:"group",children:[...R,...V,{type:"line",name:"line",shape:{x1:F,y1:U,x2:tt,y2:W},style:{stroke:"#999",lineWidth:1,lineDash:[4,4]}},{type:"circle",name:"point-start",shape:{cx:F,cy:U,r:4},style:{fill:"#fff",stroke:I.style?.color||"#3b82f6",lineWidth:1,opacity:$?1:0},z:100},{type:"circle",name:"point-end",shape:{cx:tt,cy:W,r:4},style:{fill:"#fff",stroke:I.style?.color||"#3b82f6",lineWidth:1,opacity:$?1:0},z:100}]}}},data:v.map(b=>[b.points[0].timeIndex,b.points[0].value,b.points[1].timeIndex,b.points[1].value]),encode:{x:[0,2],y:[1,3]},z:100,silent:!1})});const w=v=>{const y=Jt.format(v,this.options),b=this.options.databox?.position;return b==="left"?(this.leftSidebar.innerHTML=y,""):b==="right"?(this.rightSidebar.innerHTML=y,""):this.options.databox?`<div style="min-width: 200px;">${y}</div>`:""},C=[];this.indicators.forEach(v=>{Object.values(v.plots).forEach(y=>{y.options?.style==="table"&&y.data?.forEach(b=>{(Array.isArray(b.value)?b.value:[b.value]).forEach(_=>{_&&!_._deleted&&(_._paneIndex=_.force_overlay?0:v.paneIndex,C.push(_))})})})});const A={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:w,extraCssText:e!=="floating"&&e!==void 0?"display: none !important;":void 0,position:(v,y,b,_,I)=>{if(this.options.databox?.position==="floating"){const P={top:10};return P[["left","right"][+(v[0]<I.viewSize[0]/2)]]=30,P}return null}},axisPointer:{link:{xAxisIndex:"all"},label:{backgroundColor:"#475569"}},graphic:c,grid:p.grid,xAxis:p.xAxis,yAxis:p.yAxis,dataZoom:p.dataZoom,series:[g,...h,...m]};this.chart.setOption(A,!0),this._lastTables=C,this._renderTableOverlays()}}var de=Object.defineProperty,pe=(x,t,e)=>t in x?de(x,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):x[t]=e,ft=(x,t,e)=>(pe(x,typeof t!="symbol"?t+"":t,e),e);class xt{constructor(t){ft(this,"id"),ft(this,"name"),ft(this,"icon"),ft(this,"context"),ft(this,"eventListeners",[]),this.id=t.id,this.name=t.name,this.icon=t.icon}init(t){this.context=t,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(t,e){this.context.events.on(t,e),this.eventListeners.push({event:t,handler:e})}off(t,e){this.context.events.off(t,e),this.eventListeners=this.eventListeners.filter(i=>i.event!==t||i.handler!==e)}removeAllListeners(){this.eventListeners.forEach(({event:t,handler:e})=>{this.context.events.off(t,e)}),this.eventListeners=[]}get chart(){return this.context.getChart()}get marketData(){return this.context.getMarketData()}}var ue=Object.defineProperty,fe=(x,t,e)=>t in x?ue(x,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):x[t]=e,q=(x,t,e)=>(fe(x,typeof t!="symbol"?t+"":t,e),e);class ye extends xt{constructor(t){super({id:"measure",name:t?.name||"Measure",icon:t?.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>'}),q(this,"zr"),q(this,"state","idle"),q(this,"startPoint",null),q(this,"endPoint",null),q(this,"group",null),q(this,"rect",null),q(this,"labelRect",null),q(this,"labelText",null),q(this,"lineV",null),q(this,"lineH",null),q(this,"arrowStart",null),q(this,"arrowEnd",null),q(this,"onMouseDown",()=>{this.state==="finished"&&this.removeGraphic()}),q(this,"onChartInteraction",()=>{this.group&&this.removeGraphic()}),q(this,"onClick",e=>{this.state==="idle"?(this.state="drawing",this.startPoint=[e.offsetX,e.offsetY],this.endPoint=[e.offsetX,e.offsetY],this.initGraphic(),this.updateGraphic()):this.state==="drawing"&&(this.state="finished",this.endPoint=[e.offsetX,e.offsetY],this.updateGraphic(),this.context.disableTools(),this.enableClearListeners())}),q(this,"clearHandlers",{}),q(this,"onMouseMove",e=>{this.state==="drawing"&&(this.endPoint=[e.offsetX,e.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 t=()=>{this.removeGraphic()};setTimeout(()=>{this.zr.on("click",t)},10),this.zr.on("mousedown",this.onMouseDown),this.context.events.on("chart:dataZoom",this.onChartInteraction),this.clearHandlers={click:t,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 H.graphic.Group,this.rect=new H.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 H.graphic.Line({shape:{x1:0,y1:0,x2:0,y2:0},style:{stroke:"#fff",lineWidth:1,lineDash:[4,4]},z:101}),this.lineH=new H.graphic.Line({shape:{x1:0,y1:0,x2:0,y2:0},style:{stroke:"#fff",lineWidth:1,lineDash:[4,4]},z:101}),this.arrowStart=new H.graphic.Polygon({shape:{points:[[0,0],[-5,10],[5,10]]},style:{fill:"#fff"},z:102}),this.arrowEnd=new H.graphic.Polygon({shape:{points:[[0,0],[-5,-10],[5,-10]]},style:{fill:"#fff"},z:102}),this.labelRect=new H.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 H.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[t,e]=this.startPoint,[i,s]=this.endPoint,a=this.context.coordinateConversion.pixelToData({x:t,y:e}),o=this.context.coordinateConversion.pixelToData({x:i,y:s});if(!a||!o)return;const u=Math.round(a.timeIndex),d=Math.round(o.timeIndex),p=a.value,g=o.value,r=d-u,l=g-p,h=l/p*100,n=l>=0,c=n?"rgba(33, 150, 243, 0.2)":"rgba(236, 0, 0, 0.2)",f=n?"#2196F3":"#ec0000";this.rect.setShape({x:Math.min(t,i),y:Math.min(e,s),width:Math.abs(i-t),height:Math.abs(s-e)}),this.rect.setStyle({fill:c});const m=(t+i)/2,w=(e+s)/2;this.lineV.setShape({x1:m,y1:e,x2:m,y2:s}),this.lineV.setStyle({stroke:f}),this.lineH.setShape({x1:t,y1:w,x2:i,y2:w}),this.lineH.setStyle({stroke:f});const C=Math.min(e,s),A=Math.max(e,s);this.arrowStart.setStyle({fill:"none"}),this.arrowEnd.setStyle({fill:"none"}),n?(this.arrowStart.setShape({points:[[m,C],[m-4,C+6],[m+4,C+6]]}),this.arrowStart.setStyle({fill:f})):(this.arrowEnd.setShape({points:[[m,A],[m-4,A-6],[m+4,A-6]]}),this.arrowEnd.setStyle({fill:f}));const v=[`${l.toFixed(2)} (${h.toFixed(2)}%)`,`${r} bars, ${(r*0).toFixed(0)}d`].join(`
38
+ `),y=140,b=40,_=Math.max(e,s),I=Math.min(e,s);let P=(t+i)/2-y/2,k=_+10;const D=this.chart.getHeight();k+b>D&&(k=I-b-10),this.labelRect.setShape({x:P,y:k,width:y,height:b}),this.labelRect.setStyle({fill:"#1e293b",stroke:f,lineWidth:1}),this.labelText.setStyle({x:P+y/2,y:k+b/2,text:v,fill:"#fff"})}}var ge=Object.defineProperty,xe=(x,t,e)=>t in x?ge(x,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):x[t]=e,K=(x,t,e)=>(xe(x,typeof t!="symbol"?t+"":t,e),e);class me extends xt{constructor(t){super({id:"trend-line",name:t?.name||"Trend Line",icon:t?.icon||'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="2" y1="22" x2="22" y2="2" /></svg>'}),K(this,"zr"),K(this,"state","idle"),K(this,"startPoint",null),K(this,"endPoint",null),K(this,"group",null),K(this,"line",null),K(this,"startCircle",null),K(this,"endCircle",null),K(this,"onMouseDown",()=>{}),K(this,"onChartInteraction",()=>{}),K(this,"onClick",e=>{if(this.state==="idle")this.state="drawing",this.startPoint=[e.offsetX,e.offsetY],this.endPoint=[e.offsetX,e.offsetY],this.initGraphic(),this.updateGraphic();else if(this.state==="drawing"){if(this.state="finished",this.endPoint=[e.offsetX,e.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 a=i.paneIndex||0;this.context.addDrawing({id:`line-${Date.now()}`,type:"line",points:[i,s],paneIndex:a,style:{color:"#3b82f6",lineWidth:2}})}}this.removeGraphic(),this.context.disableTools()}}),K(this,"clearHandlers",{}),K(this,"onMouseMove",e=>{this.state==="drawing"&&(this.endPoint=[e.offsetX,e.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 H.graphic.Group,this.line=new H.graphic.Line({shape:{x1:0,y1:0,x2:0,y2:0},style:{stroke:"#3b82f6",lineWidth:2},z:100}),this.startCircle=new H.graphic.Circle({shape:{cx:0,cy:0,r:4},style:{fill:"#fff",stroke:"#3b82f6",lineWidth:1},z:101}),this.endCircle=new H.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[t,e]=this.startPoint,[i,s]=this.endPoint;this.line.setShape({x1:t,y1:e,x2:i,y2:s}),this.startCircle.setShape({cx:t,cy:e}),this.endCircle.setShape({cx:i,cy:s})}}var be=Object.defineProperty,ve=(x,t,e)=>t in x?be(x,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):x[t]=e,lt=(x,t,e)=>(ve(x,typeof t!="symbol"?t+"":t,e),e);class we extends xt{constructor(t={}){super({id:"fibonacci-tool",name:t.name||"Fibonacci Retracement",icon:t.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>'}),lt(this,"startPoint",null),lt(this,"endPoint",null),lt(this,"state","idle"),lt(this,"graphicGroup",null),lt(this,"levels",[0,.236,.382,.5,.618,.786,1]),lt(this,"colors",["#787b86","#f44336","#ff9800","#4caf50","#2196f3","#00bcd4","#787b86"]),lt(this,"onClick",e=>{this.state==="idle"?(this.state="drawing",this.startPoint=[e.offsetX,e.offsetY],this.endPoint=[e.offsetX,e.offsetY],this.initGraphic(),this.updateGraphic()):this.state==="drawing"&&(this.state="finished",this.endPoint=[e.offsetX,e.offsetY],this.updateGraphic(),this.saveDrawing(),this.removeGraphic(),this.context.disableTools())}),lt(this,"onMouseMove",e=>{this.state==="drawing"&&(this.endPoint=[e.offsetX,e.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 t=this.context.getChart().getZr();t.on("click",this.onClick),t.on("mousemove",this.onMouseMove)}unbindEvents(){const t=this.context.getChart().getZr();t.off("click",this.onClick),t.off("mousemove",this.onMouseMove)}initGraphic(){this.graphicGroup=new H.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 t=this.startPoint[0],e=this.startPoint[1],i=this.endPoint[0],s=this.endPoint[1],a=new H.graphic.Line({shape:{x1:t,y1:e,x2:i,y2:s},style:{stroke:"#999",lineWidth:1,lineDash:[4,4]},silent:!0});this.graphicGroup.add(a);const o=Math.min(t,i),u=Math.max(t,i),d=u-o,p=s-e;this.levels.forEach((g,r)=>{const l=s-p*g,h=this.colors[r%this.colors.length],n=new H.graphic.Line({shape:{x1:o,y1:l,x2:u,y2:l},style:{stroke:h,lineWidth:1},silent:!0});if(this.graphicGroup.add(n),r<this.levels.length-1){const c=this.levels[r+1],f=s-p*c,m=Math.abs(f-l),w=Math.min(l,f),C=new H.graphic.Rect({shape:{x:o,y:w,width:d,height:m},style:{fill:this.colors[(r+1)%this.colors.length],opacity:.1},silent:!0});this.graphicGroup.add(C)}})}saveDrawing(){if(!this.startPoint||!this.endPoint)return;const t=this.context.coordinateConversion.pixelToData({x:this.startPoint[0],y:this.startPoint[1]}),e=this.context.coordinateConversion.pixelToData({x:this.endPoint[0],y:this.endPoint[1]});if(t&&e){const i=t.paneIndex||0;this.context.addDrawing({id:`fib-${Date.now()}`,type:"fibonacci",points:[t,e],paneIndex:i,style:{color:"#3b82f6",lineWidth:1}})}}}nt.AbstractPlugin=xt,nt.FibonacciTool=we,nt.LineTool=me,nt.MeasureTool=ye,nt.QFChart=ce});