@qfo/qfchart 0.8.0 → 0.8.2
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 +524 -12
- package/dist/qfchart.min.browser.js +34 -18
- package/dist/qfchart.min.es.js +34 -18
- package/package.json +1 -1
- package/src/QFChart.ts +109 -272
- package/src/components/AbstractPlugin.ts +234 -104
- package/src/components/DrawingEditor.ts +297 -248
- package/src/components/DrawingRendererRegistry.ts +13 -0
- package/src/components/GraphicBuilder.ts +2 -2
- package/src/components/LayoutManager.ts +92 -52
- package/src/components/SeriesBuilder.ts +10 -10
- package/src/components/TooltipFormatter.ts +1 -1
- package/src/index.ts +25 -6
- package/src/plugins/ABCDPatternTool/ABCDPatternDrawingRenderer.ts +112 -0
- package/src/plugins/ABCDPatternTool/ABCDPatternTool.ts +136 -0
- package/src/plugins/ABCDPatternTool/index.ts +2 -0
- package/src/plugins/CrossLineTool/CrossLineDrawingRenderer.ts +49 -0
- package/src/plugins/CrossLineTool/CrossLineTool.ts +52 -0
- package/src/plugins/CrossLineTool/index.ts +2 -0
- package/src/plugins/CypherPatternTool/CypherPatternDrawingRenderer.ts +80 -0
- package/src/plugins/CypherPatternTool/CypherPatternTool.ts +84 -0
- package/src/plugins/CypherPatternTool/index.ts +2 -0
- package/src/plugins/ExtendedLineTool/ExtendedLineDrawingRenderer.ts +73 -0
- package/src/plugins/ExtendedLineTool/ExtendedLineTool.ts +173 -0
- package/src/plugins/ExtendedLineTool/index.ts +2 -0
- package/src/plugins/FibSpeedResistanceFanTool/FibSpeedResistanceFanDrawingRenderer.ts +163 -0
- package/src/plugins/FibSpeedResistanceFanTool/FibSpeedResistanceFanTool.ts +210 -0
- package/src/plugins/FibSpeedResistanceFanTool/index.ts +2 -0
- package/src/plugins/FibTrendExtensionTool/FibTrendExtensionDrawingRenderer.ts +141 -0
- package/src/plugins/FibTrendExtensionTool/FibTrendExtensionTool.ts +188 -0
- package/src/plugins/FibTrendExtensionTool/index.ts +2 -0
- package/src/plugins/FibonacciChannelTool/FibonacciChannelDrawingRenderer.ts +128 -0
- package/src/plugins/FibonacciChannelTool/FibonacciChannelTool.ts +231 -0
- package/src/plugins/FibonacciChannelTool/index.ts +2 -0
- package/src/plugins/FibonacciTool/FibonacciDrawingRenderer.ts +107 -0
- package/src/plugins/{FibonacciTool.ts → FibonacciTool/FibonacciTool.ts} +195 -192
- package/src/plugins/FibonacciTool/index.ts +2 -0
- package/src/plugins/HeadAndShouldersTool/HeadAndShouldersDrawingRenderer.ts +95 -0
- package/src/plugins/HeadAndShouldersTool/HeadAndShouldersTool.ts +97 -0
- package/src/plugins/HeadAndShouldersTool/index.ts +2 -0
- package/src/plugins/HorizontalLineTool/HorizontalLineDrawingRenderer.ts +54 -0
- package/src/plugins/HorizontalLineTool/HorizontalLineTool.ts +52 -0
- package/src/plugins/HorizontalLineTool/index.ts +2 -0
- package/src/plugins/HorizontalRayTool/HorizontalRayDrawingRenderer.ts +34 -0
- package/src/plugins/HorizontalRayTool/HorizontalRayTool.ts +52 -0
- package/src/plugins/HorizontalRayTool/index.ts +2 -0
- package/src/plugins/InfoLineTool/InfoLineDrawingRenderer.ts +72 -0
- package/src/plugins/InfoLineTool/InfoLineTool.ts +130 -0
- package/src/plugins/InfoLineTool/index.ts +2 -0
- package/src/plugins/LineTool/LineDrawingRenderer.ts +49 -0
- package/src/plugins/{LineTool.ts → LineTool/LineTool.ts} +161 -190
- package/src/plugins/LineTool/index.ts +2 -0
- package/src/plugins/{MeasureTool.ts → MeasureTool/MeasureTool.ts} +324 -344
- package/src/plugins/MeasureTool/index.ts +1 -0
- package/src/plugins/RayTool/RayDrawingRenderer.ts +69 -0
- package/src/plugins/RayTool/RayTool.ts +162 -0
- package/src/plugins/RayTool/index.ts +2 -0
- package/src/plugins/ThreeDrivesPatternTool/ThreeDrivesPatternDrawingRenderer.ts +106 -0
- package/src/plugins/ThreeDrivesPatternTool/ThreeDrivesPatternTool.ts +98 -0
- package/src/plugins/ThreeDrivesPatternTool/index.ts +2 -0
- package/src/plugins/ToolGroup.ts +211 -0
- package/src/plugins/TrendAngleTool/TrendAngleDrawingRenderer.ts +87 -0
- package/src/plugins/TrendAngleTool/TrendAngleTool.ts +176 -0
- package/src/plugins/TrendAngleTool/index.ts +2 -0
- package/src/plugins/TrianglePatternTool/TrianglePatternDrawingRenderer.ts +107 -0
- package/src/plugins/TrianglePatternTool/TrianglePatternTool.ts +98 -0
- package/src/plugins/TrianglePatternTool/index.ts +2 -0
- package/src/plugins/VerticalLineTool/VerticalLineDrawingRenderer.ts +35 -0
- package/src/plugins/VerticalLineTool/VerticalLineTool.ts +52 -0
- package/src/plugins/VerticalLineTool/index.ts +2 -0
- package/src/plugins/XABCDPatternTool/XABCDPatternDrawingRenderer.ts +178 -0
- package/src/plugins/XABCDPatternTool/XABCDPatternTool.ts +213 -0
- package/src/plugins/XABCDPatternTool/index.ts +2 -0
- package/src/types.ts +39 -11
|
@@ -14,27 +14,43 @@
|
|
|
14
14
|
* See the License for the specific language governing permissions and
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
|
-
(function(ct,vt){typeof exports=="object"&&typeof module<"u"?vt(exports,require("echarts")):typeof define=="function"&&define.amd?define(["exports","echarts"],vt):(ct=typeof globalThis<"u"?globalThis:ct||self,vt(ct.QFChart={},ct.echarts))})(this,function(ct,vt){"use strict";function $t(b){var t=Object.create(null);return b&&Object.keys(b).forEach(function(e){if(e!=="default"){var i=Object.getOwnPropertyDescriptor(b,e);Object.defineProperty(t,e,i.get?i:{enumerable:!0,get:function(){return b[e]}})}}),t.default=b,Object.freeze(t)}var q=$t(vt),Lt=Object.defineProperty,Ft=(b,t,e)=>t in b?Lt(b,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):b[t]=e,yt=(b,t,e)=>(Ft(b,typeof t!="symbol"?t+"":t,e),e);class Tt{constructor(t,e,i,s={}){yt(this,"id"),yt(this,"plots"),yt(this,"paneIndex"),yt(this,"height"),yt(this,"collapsed"),yt(this,"titleColor"),yt(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(a=>{n.set(a.time,a)}),s.data?.forEach(a=>{n.set(a.time,a)}),i.data=Array.from(n.values()).sort((a,d)=>a.time-d.time)}})}}class V{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 _t{static calculate(t,e,i,s=!1,n=null,a,d){let h=0;t>0&&(h=1/t*100);const p=i.yAxisPadding!==void 0?i.yAxisPadding:5,g=i.grid?.show===!0,c=i.grid?.lineColor??"#334155",r=i.grid?.lineOpacity??.5,l=i.grid?.borderColor??"#334155",o=i.grid?.borderShow===!0,f=i.layout?.left??"10%",u=i.layout?.right??"10%",y=Array.from(e.values()).map(E=>E.paneIndex).filter(E=>E>0).sort((E,T)=>E-T).filter((E,T,G)=>G.indexOf(E)===T),I=y.length>0,P=i.dataZoom?.visible??!0,A=i.dataZoom?.position??"top",k=i.dataZoom?.height??6,x=i.dataZoom?.start??0,v=i.dataZoom?.end??100;let C=8,S=92,_=-1;if(n)if(n==="main")_=0;else{const E=e.get(n);E&&(_=E.paneIndex)}if(_!==-1){const E=[],T=[],G=[],j=[],st=i.dataZoom?.start??50,Y=i.dataZoom?.end??100;(i.dataZoom?.zoomOnTouch??!0)&&j.push({type:"inside",xAxisIndex:"all",start:st,end:Y,filterMode:"weakFilter"});const ot=I?Math.max(...y):0,ht=[];for(let U=0;U<=ot;U++){const K=U===_;E.push({left:f,right:u,top:K?"5%":"0%",height:K?"90%":"0%",show:K,containLabel:!1}),T.push({type:"category",gridIndex:U,data:[],show:K,axisLabel:{show:K,color:"#94a3b8",fontFamily:i.fontFamily},axisLine:{show:K&&o,lineStyle:{color:l}},splitLine:{show:K&&g,lineStyle:{color:c,opacity:r}}});let pt,ut;if(U===0&&_===0?(pt=i.yAxisMin!==void 0&&i.yAxisMin!=="auto"?i.yAxisMin:V.createMinFunction(p),ut=i.yAxisMax!==void 0&&i.yAxisMax!=="auto"?i.yAxisMax:V.createMaxFunction(p)):(pt=V.createMinFunction(p),ut=V.createMaxFunction(p)),G.push({position:"right",gridIndex:U,show:K,scale:!0,min:pt,max:ut,axisLabel:{show:K,color:"#94a3b8",fontFamily:i.fontFamily,formatter:ft=>{if(i.yAxisLabelFormatter)return i.yAxisLabelFormatter(ft);const At=i.yAxisDecimalPlaces!==void 0?i.yAxisDecimalPlaces:V.autoDetectDecimals(a);return V.formatValue(ft,At)}},splitLine:{show:K&&g,lineStyle:{color:c,opacity:r}}}),U>0){const ft=Array.from(e.values()).find(At=>At.paneIndex===U);ft&&ht.push({index:U,height:K?90:0,top:K?5:0,isCollapsed:!1,indicatorId:ft.id,titleColor:ft.titleColor,controls:ft.controls})}}return{grid:E,xAxis:T,yAxis:G,dataZoom:j,paneLayout:ht,mainPaneHeight:_===0?90:0,mainPaneTop:_===0?5:0,pixelToPercent:h,overlayYAxisMap:new Map,separatePaneYAxisOffset:1}}P?A==="top"?(C=k+4,S=95):(S=100-k-2,C=8):(C=5,S=95);let M=5;t>0&&(M=20/t*100);let D=75,N=[];if(I){const E=y.map(Y=>{const ot=Array.from(e.values()).find(ht=>ht.paneIndex===Y);return{index:Y,requestedHeight:ot?.height,isCollapsed:ot?.collapsed??!1,indicatorId:ot?.id,titleColor:ot?.titleColor,controls:ot?.controls}}).map(Y=>({...Y,height:Y.isCollapsed?3:Y.requestedHeight!==void 0?Y.requestedHeight:15})),T=E.reduce((Y,ot)=>Y+ot.height,0),G=E.length*M,j=T+G;D=S-C-j,d!==void 0&&d>0&&!s?D=d:s?D=3:D<20&&(D=Math.max(D,10));let st=C+D+M;N=E.map(Y=>{const ot={index:Y.index,height:Y.height,top:st,isCollapsed:Y.isCollapsed,indicatorId:Y.indicatorId,titleColor:Y.titleColor,controls:Y.controls};return st+=Y.height+M,ot})}else D=S-C,s&&(D=3);const L=[];if(N.length>0){L.push({yPercent:C+D+M/2,aboveId:"main",belowId:N[0].indicatorId||""});for(let E=0;E<N.length-1;E++)L.push({yPercent:N[E].top+N[E].height+M/2,aboveId:N[E].indicatorId||"",belowId:N[E+1].indicatorId||""})}const m=[];m.push({left:f,right:u,top:C+"%",height:D+"%",containLabel:!1}),N.forEach(E=>{m.push({left:f,right:u,top:E.top+"%",height:E.height+"%",containLabel:!1})});const z=[0,...N.map((E,T)=>T+1)],w=[],H=N.length===0;w.push({type:"category",data:[],gridIndex:0,scale:!0,axisLine:{onZero:!1,show:!s&&o,lineStyle:{color:l}},splitLine:{show:!s&&g,lineStyle:{color:c,opacity:r}},axisLabel:{show:!s,color:"#94a3b8",fontFamily:i.fontFamily||"sans-serif",formatter:E=>{if(i.yAxisLabelFormatter)return i.yAxisLabelFormatter(E);const T=i.yAxisDecimalPlaces!==void 0?i.yAxisDecimalPlaces:V.autoDetectDecimals(a);return V.formatValue(E,T)}},axisTick:{show:!s},axisPointer:{label:{show:H,fontSize:11,backgroundColor:"#475569"}}}),N.forEach((E,T)=>{const G=T===N.length-1;w.push({type:"category",gridIndex:T+1,data:[],axisLabel:{show:!1},axisLine:{show:!E.isCollapsed&&o,lineStyle:{color:l}},axisTick:{show:!1},splitLine:{show:!1},axisPointer:{label:{show:G,fontSize:11,backgroundColor:"#475569"}}})});const F=[];let W,O;i.yAxisMin!==void 0&&i.yAxisMin!=="auto"?W=i.yAxisMin:W=V.createMinFunction(p),i.yAxisMax!==void 0&&i.yAxisMax!=="auto"?O=i.yAxisMax:O=V.createMaxFunction(p),F.push({position:"right",scale:!0,min:W,max:O,gridIndex:0,splitLine:{show:!s&&g,lineStyle:{color:c,opacity:r}},axisLine:{show:!s&&o,lineStyle:{color:l}},axisLabel:{show:!s,color:"#94a3b8",fontFamily:i.fontFamily||"sans-serif",formatter:E=>{if(i.yAxisLabelFormatter)return i.yAxisLabelFormatter(E);const T=i.yAxisDecimalPlaces!==void 0?i.yAxisDecimalPlaces:V.autoDetectDecimals(a);return V.formatValue(E,T)}}});let Z=1,X=-1/0,B=1/0;a&&a.length>0&&(X=Math.min(...a.map(E=>E.low)),B=Math.max(...a.map(E=>E.high)));const R=new Map;e.forEach((E,T)=>{E.paneIndex===0&&!E.collapsed&&a&&a.length>0&&Object.entries(E.plots).forEach(([G,j])=>{const st=`${T}::${G}`,Y=["background","barcolor","char"],ot=j.options.style==="shape"&&(j.options.location==="abovebar"||j.options.location==="AboveBar"||j.options.location==="belowbar"||j.options.location==="BelowBar");if(Y.includes(j.options.style)){R.has(st)||(R.set(st,Z),Z++);return}if(j.options.style==="shape"&&!ot){R.has(st)||(R.set(st,Z),Z++);return}const ht=[];if(j.data&&Object.values(j.data).forEach(U=>{typeof U=="number"&&!isNaN(U)&&isFinite(U)&&ht.push(U)}),ht.length>0){const U=Math.min(...ht),K=Math.max(...ht),pt=K-U,ut=B-X,ft=U>=X*.5&&K<=B*1.5,At=pt>ut*.01;ft&&At||R.has(st)||(R.set(st,Z),Z++)}})});const J=R.size>0?Z-1:0,it=new Set;R.forEach((E,T)=>{e.forEach(G=>{Object.entries(G.plots).forEach(([j,st])=>{`${G.id}::${j}`===T&&["background","barcolor","char"].includes(st.options.style)&&it.add(E)})})});for(let E=0;E<J;E++){const T=E+1,G=it.has(T);F.push({position:"left",scale:!G,min:G?0:V.createMinFunction(p),max:G?1:V.createMaxFunction(p),gridIndex:0,show:!1,splitLine:{show:!1},axisLine:{show:!1},axisLabel:{show:!1}})}const wt=Z;N.forEach((E,T)=>{F.push({position:"right",scale:!0,min:V.createMinFunction(p),max:V.createMaxFunction(p),gridIndex:T+1,splitLine:{show:!E.isCollapsed&&g,lineStyle:{color:c,opacity:r*.6}},axisLabel:{show:!E.isCollapsed,color:"#94a3b8",fontFamily:i.fontFamily||"sans-serif",fontSize:10,formatter:G=>{if(i.yAxisLabelFormatter)return i.yAxisLabelFormatter(G);const j=i.yAxisDecimalPlaces!==void 0?i.yAxisDecimalPlaces:V.autoDetectDecimals(a);return V.formatValue(G,j)}},axisLine:{show:!E.isCollapsed&&o,lineStyle:{color:l}}})});const dt=[];return P&&((i.dataZoom?.zoomOnTouch??!0)&&dt.push({type:"inside",xAxisIndex:z,start:x,end:v,filterMode:"weakFilter"}),A==="top"?dt.push({type:"slider",xAxisIndex:z,top:"1%",height:k+"%",start:x,end:v,borderColor:"#334155",textStyle:{color:"#cbd5e1"},brushSelect:!1,filterMode:"weakFilter"}):dt.push({type:"slider",xAxisIndex:z,bottom:"1%",height:k+"%",start:x,end:v,borderColor:"#334155",textStyle:{color:"#cbd5e1"},brushSelect:!1,filterMode:"weakFilter"})),{grid:m,xAxis:w,yAxis:F,dataZoom:dt,paneLayout:N,mainPaneHeight:D,mainPaneTop:C,pixelToPercent:h,paneBoundaries:L,overlayYAxisMap:R,separatePaneYAxisOffset:wt}}static calculateMaximized(t,e,i){return{grid:[],xAxis:[],yAxis:[],dataZoom:[],paneLayout:[],mainPaneHeight:0,mainPaneTop:0,pixelToPercent:0,paneBoundaries:[]}}}class Ot{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:n,colorArray:a,plotOptions:d}=t,h="#2962ff";return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(p,g)=>{const c=p.dataIndex;if(c===0)return;const r=g.value(1),l=g.value(2);if(r===null||isNaN(r)||l===null||isNaN(l))return;const o=g.coord([c-1,l]),f=g.coord([c,r]);return{type:"line",shape:{x1:o[0],y1:o[1],x2:f[0],y2:f[1]},style:{stroke:a[c]||d.color||h,lineWidth:d.linewidth||1},silent:!0}},data:n.map((p,g)=>[g,p,g>0?n[g-1]:null])}}}class Zt{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:n,colorArray:a,plotOptions:d}=t,h="#2962ff";return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(p,g)=>{const c=g.value(0),r=g.value(1);if(isNaN(r)||r===null)return;const l=g.coord([c,r]),o=g.size([1,0])[0];return{type:"line",shape:{x1:l[0]-o/2,y1:l[1],x2:l[0]+o/2,y2:l[1]},style:{stroke:a[p.dataIndex]||d.color||h,lineWidth:d.linewidth||1},silent:!0}},data:n.map((p,g)=>[g,p])}}}class Pt{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:n,colorArray:a,plotOptions:d}=t,h="#2962ff",p=d.histbase??0,g=d.style==="columns",c=d.linewidth??1,r=n.map((l,o)=>l==null||typeof l=="number"&&isNaN(l)?null:[o,l,a[o]||d.color||h]);return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(l,o)=>{const f=o.value(0),u=o.value(1),y=o.value(2);if(u==null||isNaN(u))return null;const I=o.coord([f,p]),P=o.coord([f,u]),A=o.size([1,0])[0];let k;g?k=A*.6:k=Math.max(1,c);const x=I[0],v=I[1],C=P[1],S=Math.min(v,C),_=Math.abs(C-v);return{type:"rect",shape:{x:x-k/2,y:S,width:k,height:_||1},style:{fill:y}}},data:r.filter(l=>l!==null)}}}const St=new Map;function Ht(b,t="#00da3c",e="64px"){if(typeof document>"u")return"";const i=`${b}-${t}-${e}`;if(St.has(i))return St.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(b,16,16);const a=s.toDataURL("image/png");return St.set(i,a),a}return""}class kt{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:n,colorArray:a,plotOptions:d}=t,h="#2962ff",p=d.style;if(p==="char")return{name:e,type:"scatter",xAxisIndex:i,yAxisIndex:s,symbolSize:0,data:n.map((c,r)=>({value:[r,c],itemStyle:{opacity:0}})),silent:!0};const g=n.map((c,r)=>{if(c===null)return null;const l=a[r]||d.color||h,o={value:[r,c],itemStyle:{color:l}};return p==="cross"?(o.symbol=`image://${Ht("+",l,"24px")}`,o.symbolSize=16):(o.symbol="circle",o.symbolSize=6),o}).filter(c=>c!==null);return{name:e,type:"scatter",xAxisIndex:i,yAxisIndex:s,data:g}}}class zt{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:n,colorArray:a,optionsArray:d,plotOptions:h}=t,p="#2962ff",g=h.style==="candle",c=[],r=n.map((l,o)=>{if(l===null||!Array.isArray(l)||l.length!==4)return null;const[f,u,y,I]=l,P=d[o]||{},A=P.color||a[o]||h.color||p,k=P.wickcolor||h.wickcolor||A,x=P.bordercolor||h.bordercolor||k;return c[o]={color:A,wickColor:k,borderColor:x},[o,f,I,y,u]}).filter(l=>l!==null);return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(l,o)=>{const f=o.value(0),u=o.value(1),y=o.value(2),I=o.value(3),P=o.value(4);if(isNaN(u)||isNaN(y)||isNaN(I)||isNaN(P))return null;const A=c[f]||{color:p,wickColor:p,borderColor:p},k=A.color,x=A.wickColor,v=A.borderColor,C=o.coord([f,0])[0],S=o.coord([f,u])[1],_=o.coord([f,y])[1],M=o.coord([f,I])[1],D=o.coord([f,P])[1],N=o.size([1,0])[0]*.6;if(g){const L=Math.min(S,_),m=Math.max(S,_),z=Math.abs(_-S);return{type:"group",children:[{type:"line",shape:{x1:C,y1:D,x2:C,y2:L},style:{stroke:x,lineWidth:1}},{type:"line",shape:{x1:C,y1:m,x2:C,y2:M},style:{stroke:x,lineWidth:1}},{type:"rect",shape:{x:C-N/2,y:L,width:N,height:z||1},style:{fill:k,stroke:v,lineWidth:1}}]}}else{const L=N*.5;return{type:"group",children:[{type:"line",shape:{x1:C,y1:M,x2:C,y2:D},style:{stroke:k,lineWidth:1}},{type:"line",shape:{x1:C-L,y1:S,x2:C,y2:S},style:{stroke:k,lineWidth:1}},{type:"line",shape:{x1:C,y1:_,x2:C+L,y2:_},style:{stroke:k,lineWidth:1}}]}}},data:r}}}class xt{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 Gt{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:n,colorArray:a,optionsArray:d,plotOptions:h,candlestickData:p}=t,g="#2962ff",c=n.map((r,l)=>{const o=d[l]||{},f=h,u=o.location||f.location||"absolute";if(u!=="absolute"&&u!=="Absolute"&&!r||r==null)return null;const y=o.color||f.color||g,I=o.shape||f.shape||"circle",P=o.size||f.size||"normal",A=o.text||f.text,k=o.textcolor||f.textcolor||"white",x=o.width||f.width,v=o.height||f.height;let C=r,S=[0,0];u==="abovebar"||u==="AboveBar"||u==="ab"?(p&&p[l]&&(C=p[l].high),S=[0,"-150%"]):u==="belowbar"||u==="BelowBar"||u==="bl"?(p&&p[l]&&(C=p[l].low),S=[0,"150%"]):u==="top"||u==="Top"?(C=r,S=[0,0]):(u==="bottom"||u==="Bottom")&&(C=r,S=[0,0]);const _=xt.getShapeSymbol(I),M=xt.getShapeSize(P,x,v),D=xt.getShapeRotation(I);let N=M;I.includes("label")&&(Array.isArray(M)?N=[M[0]*2.5,M[1]*2.5]:N=M*2.5);const L=xt.getLabelConfig(I,u);return{value:[l,C],symbol:_,symbolSize:N,symbolRotate:D,symbolOffset:S,itemStyle:{color:y},label:{show:!!A,position:L.position,distance:L.distance,formatter:A,color:k,fontSize:10,fontWeight:"bold"}}}).filter(r=>r!==null);return{name:e,type:"scatter",xAxisIndex:i,yAxisIndex:s,data:c}}}class rt{static parseColor(t){if(!t||typeof t!="string")return{color:"#888888",opacity:.2};const e=t.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)/);if(e){const s=e[1],n=e[2],a=e[3],d=e[4]?parseFloat(e[4]):1;return{color:`rgb(${s},${n},${a})`,opacity:d}}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),n=parseInt(i[2],16),a=parseInt(i[3],16),d=parseInt(i[4],16)/255;return{color:`rgb(${s},${n},${a})`,opacity:d}}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 a=parseInt(s[1],16),d=parseInt(s[2],16),h=parseInt(s[3],16);return`rgba(${a},${d},${h},${e})`}const n=t.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);if(n){const a=parseInt(n[1],16),d=parseInt(n[2],16),h=parseInt(n[3],16);return`rgba(${a},${d},${h},${e})`}return t}}class Wt{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:n,colorArray:a}=t,d=[];for(let h=0;h<a.length;h++)d[h]=a[h]?rt.parseColor(a[h]):{color:"",opacity:0};return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,z:-10,renderItem:(h,p)=>{const g=p.value(0);if(isNaN(g))return;const c=p.coord([g,.5]),r=p.size([1,0])[0],l=h.coordSys,o=c[0]-r/2,f=a[h.dataIndex],u=p.value(1);if(!f||u===null||u===void 0||isNaN(u))return;const y=d[h.dataIndex];if(!(!y||y.opacity<=0))return{type:"rect",shape:{x:o,y:l.y,width:r,height:l.height},style:{fill:y.color,opacity:y.opacity},silent:!0}},data:n.map((h,p)=>[p,h!=null&&!isNaN(h)?.5:null])}}}class Et{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,plotOptions:n,plotDataArrays:a,indicatorId:d,plotName:h,optionsArray:p}=t,g=t.dataArray.length,c=n.plot1?`${d}::${n.plot1}`:null,r=n.plot2?`${d}::${n.plot2}`:null;if(!c||!r)return console.warn(`Fill plot "${h}" missing plot1 or plot2 reference`),null;const l=a?.get(c),o=a?.get(r);if(!l||!o)return console.warn(`Fill plot "${h}" references non-existent plots: ${n.plot1}, ${n.plot2}`),null;if(n.gradient===!0)return this.renderGradientFill(e,i,s,l,o,g,p,n);const{color:f,opacity:u}=rt.parseColor(n.color||"rgba(128, 128, 128, 0.2)"),y=p?.some(A=>A&&A.color!==void 0);let I=null;if(y){I=[];for(let A=0;A<g;A++){const k=p?.[A];k&&k.color!==void 0?I[A]=rt.parseColor(k.color):I[A]={color:f,opacity:u}}}const P=[];for(let A=0;A<g;A++){const k=l[A],x=o[A],v=A>0?l[A-1]:null,C=A>0?o[A-1]:null;P.push([A,k,x,v,C])}return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,z:1,clip:!0,encode:{x:0},animation:!1,renderItem:(A,k)=>{const x=A.dataIndex;if(x===0)return null;const v=k.value(1),C=k.value(2),S=k.value(3),_=k.value(4);if(v===null||C===null||S===null||_===null||isNaN(v)||isNaN(C)||isNaN(S)||isNaN(_))return null;const M=I?I[x]:null,D=M?M.opacity:u;if(D<.01)return null;const N=k.coord([x-1,S]),L=k.coord([x,v]),m=k.coord([x,C]),z=k.coord([x-1,_]);return{type:"polygon",shape:{points:[N,L,m,z]},style:{fill:M?M.color:f,opacity:D},silent:!0}},data:P,silent:!0}}renderBatched(t,e,i,s,n){const a=Array.from({length:s},(d,h)=>[h]);return{name:t,type:"custom",xAxisIndex:e,yAxisIndex:i,z:1,clip:!0,encode:{x:0},animation:!1,renderItem:(d,h)=>{const p=d.dataIndex;if(p===0)return null;const g=[];for(let c=0;c<n.length;c++){const r=n[c],l=r.plot1Data[p],o=r.plot2Data[p],f=r.plot1Data[p-1],u=r.plot2Data[p-1];if(l==null||o==null||f==null||u==null||isNaN(l)||isNaN(o)||isNaN(f)||isNaN(u))continue;const y=r.barColors[p];if(!y||y.opacity<.01)continue;const I=h.coord([p-1,f]),P=h.coord([p,l]),A=h.coord([p,o]),k=h.coord([p-1,u]);g.push({type:"polygon",shape:{points:[I,P,A,k]},style:{fill:y.color,opacity:y.opacity},silent:!0})}return g.length>0?{type:"group",children:g,silent:!0}:null},data:a,silent:!0}}renderGradientFill(t,e,i,s,n,a,d,h){const p=[];for(let c=0;c<a;c++){const r=d?.[c];if(r&&r.top_color!==void 0){const l=rt.parseColor(r.top_color),o=rt.parseColor(r.bottom_color);p[c]={topColor:l.color,topOpacity:l.opacity,bottomColor:o.color,bottomOpacity:o.opacity}}else p[c]={topColor:"rgba(128,128,128,0.2)",topOpacity:.2,bottomColor:"rgba(128,128,128,0.2)",bottomOpacity:.2}}const g=[];for(let c=0;c<a;c++){const r=s[c],l=n[c],o=c>0?s[c-1]:null,f=c>0?n[c-1]:null;g.push([c,r,l,o,f])}return{name:t,type:"custom",xAxisIndex:e,yAxisIndex:i,z:1,clip:!0,encode:{x:0},animation:!1,renderItem:(c,r)=>{const l=c.dataIndex;if(l===0)return null;const o=r.value(1),f=r.value(2),u=r.value(3),y=r.value(4);if(o===null||f===null||u===null||y===null||isNaN(o)||isNaN(f)||isNaN(u)||isNaN(y))return null;const I=r.coord([l-1,u]),P=r.coord([l,o]),A=r.coord([l,f]),k=r.coord([l-1,y]),x=p[l]||p[l-1];if(!x||x.topOpacity<.01&&x.bottomOpacity<.01)return null;const v=rt.toRgba(x.topColor,x.topOpacity),C=rt.toRgba(x.bottomColor,x.bottomOpacity),S=o>=f;return{type:"polygon",shape:{points:[I,P,A,k]},style:{fill:{type:"linear",x:0,y:0,x2:0,y2:1,colorStops:[{offset:0,color:S?v:C},{offset:1,color:S?C:v}]}},silent:!0}},data:g,silent:!0}}}class Bt{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:n,candlestickData:a,dataIndexOffset:d}=t,h=d||0,p=[];for(let c=0;c<n.length;c++){const r=n[c];if(!r)continue;const l=Array.isArray(r)?r:[r];for(const o of l)o&&typeof o=="object"&&!o._deleted&&p.push(o)}const g=p.map(c=>{const r=F=>typeof F=="function"?F():F,l=r(c.text)||"",o=r(c.color),f=o!=null&&o!==""?o:"transparent",u=r(c.textcolor)||"#ffffff",y=r(c.yloc)||"price",I=r(c.style)||"style_label_down",P=r(c.size)||"normal",A=r(c.textalign)||"align_center",k=r(c.tooltip)||"",x=this.styleToShape(I),v=c.xloc==="bar_index"||c.xloc==="bi"?c.x+h:c.x;let C=c.y,S=[0,0];y==="abovebar"||y==="AboveBar"||y==="ab"?(a&&a[v]&&(C=a[v].high),S=[0,"-150%"]):(y==="belowbar"||y==="BelowBar"||y==="bl")&&(a&&a[v]&&(C=a[v].low),S=[0,"150%"]);const _=xt.getShapeSymbol(x),M=xt.getShapeSize(P),D=this.getSizePx(P);let N;const L=x==="labeldown"||x==="shape_label_down"||x==="labelup"||x==="shape_label_up"||x==="labelleft"||x==="labelright";let m=[0,0];if(L){const F=l.length*D*.65,W=D*2.5,O=Math.max(W,F+D*1.6),Z=D*2.8,X=3/24;if(x==="labelleft"||x==="labelright"){const B=O/(1-X);N=[B,Z];const R=typeof S[0]=="string"?0:S[0];x==="labelleft"?(S=[R+B*.42,S[1]],m=[B*X*.5,0]):(S=[R-B*.42,S[1]],m=[-B*X*.5,0])}else{const B=Z/(1-X);N=[O,B],x==="labeldown"?(S=[S[0],typeof S[1]=="string"?S[1]:S[1]-B*.42],m=[0,-B*X*.5]):(S=[S[0],typeof S[1]=="string"?S[1]:S[1]+B*.42],m=[0,B*X*.5])}}else x==="none"?N=0:Array.isArray(M)?N=[M[0]*1.5,M[1]*1.5]:N=M*1.5;const z=this.getLabelPosition(I,y),w=z==="inside"||z.startsWith("inside"),H={value:[v,C],symbol:_,symbolSize:N,symbolOffset:S,itemStyle:{color:f},label:{show:!!l,position:z,distance:w?0:5,offset:m,formatter:l,color:u,fontSize:D,fontWeight:"bold",align:w?"center":A==="align_left"||A==="left"?"left":A==="align_right"||A==="right"?"right":"center",verticalAlign:"middle",padding:[2,6]}};return k?(H._tooltipText=k,H.emphasis={scale:!1,itemStyle:{color:f},label:{show:H.label.show,color:u,fontSize:D,fontWeight:"bold"}}):H.emphasis={disabled:!0},H}).filter(c=>c!==null);return{name:e,type:"scatter",xAxisIndex:i,yAxisIndex:s,data:g,z:20,animation:!1,clip:!1}}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 Rt{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:n,dataIndexOffset:a}=t,d=a||0,h="#2962ff",p=[];for(let r=0;r<n.length;r++){const l=n[r];if(!l)continue;const o=Array.isArray(l)?l:[l];for(const f of o)f&&typeof f=="object"&&!f._deleted&&p.push(f)}if(p.length===0)return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,data:[],silent:!0};const g=(t.candlestickData?.length||0)+d,c=Math.max(0,g-1);return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(r,l)=>{const o=[];for(const f of p){if(f._deleted)continue;const u=f.xloc==="bar_index"||f.xloc==="bi"?d:0;let y=l.coord([f.x1+u,f.y1]),I=l.coord([f.x2+u,f.y2]);const P=f.extend||"none";if(P!=="none"&&P!=="n"){const v=r.coordSys;[y,I]=this.extendLine(y,I,P,v.x,v.x+v.width,v.y,v.y+v.height)}const A=f.color||h,k=f.width||1;o.push({type:"line",shape:{x1:y[0],y1:y[1],x2:I[0],y2:I[1]},style:{fill:"none",stroke:A,lineWidth:k,lineDash:this.getDashPattern(f.style)}});const x=f.style||"style_solid";if(x==="style_arrow_left"||x==="style_arrow_both"){const v=this.arrowHead(I,y,k,A);v&&o.push(v)}if(x==="style_arrow_right"||x==="style_arrow_both"){const v=this.arrowHead(y,I,k,A);v&&o.push(v)}}return{type:"group",children:o}},data:[[0,c]],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,n,a,d){const h=e[0]-t[0],p=e[1]-t[1];if(h===0&&p===0)return[t,e];const g=(l,o)=>{let f=1/0;if(o[0]!==0){const u=o[0]>0?(n-l[0])/o[0]:(s-l[0])/o[0];f=Math.min(f,u)}if(o[1]!==0){const u=o[1]>0?(d-l[1])/o[1]:(a-l[1])/o[1];f=Math.min(f,u)}return isFinite(f)||(f=0),[l[0]+f*o[0],l[1]+f*o[1]]};let c=t,r=e;return(i==="right"||i==="r"||i==="both"||i==="b")&&(r=g(t,[h,p])),(i==="left"||i==="l"||i==="both"||i==="b")&&(c=g(e,[-h,-p])),[c,r]}arrowHead(t,e,i,s){const n=e[0]-t[0],a=e[1]-t[1],d=Math.sqrt(n*n+a*a);if(d<1)return null;const h=Math.max(8,i*4),p=n/d,g=a/d,c=e[0]-p*h,r=e[1]-g*h,l=-g*h*.4,o=p*h*.4;return{type:"polygon",shape:{points:[[e[0],e[1]],[c+l,r+o],[c-l,r-o]]},style:{fill:s}}}}class Yt{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:n,dataIndexOffset:a}=t,d=a||0,h=[];for(let c=0;c<n.length;c++){const r=n[c];if(!r)continue;const l=Array.isArray(r)?r:[r];for(const o of l){if(!o||typeof o!="object"||o._deleted)continue;const f=o.line1,u=o.line2;!f||!u||f._deleted||u._deleted||h.push(o)}}if(h.length===0)return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,data:[],silent:!0};const p=(t.candlestickData?.length||0)+d,g=Math.max(0,p-1);return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(c,r)=>{const l=[];for(const o of h){if(o._deleted)continue;const f=o.line1,u=o.line2;if(!f||!u||f._deleted||u._deleted)continue;const y=f.xloc==="bar_index"||f.xloc==="bi"?d:0,I=u.xloc==="bar_index"||u.xloc==="bi"?d:0;let P=r.coord([f.x1+y,f.y1]),A=r.coord([f.x2+y,f.y2]),k=r.coord([u.x1+I,u.y1]),x=r.coord([u.x2+I,u.y2]);const v=f.extend||"none",C=u.extend||"none";if(v!=="none"||C!=="none"){const M=c.coordSys,D=M.x,N=M.x+M.width,L=M.y,m=M.y+M.height;v!=="none"&&([P,A]=this.extendLine(P,A,v,D,N,L,m)),C!=="none"&&([k,x]=this.extendLine(k,x,C,D,N,L,m))}const{color:S,opacity:_}=rt.parseColor(o.color||"rgba(128, 128, 128, 0.2)");l.push({type:"polygon",shape:{points:[P,A,x,k]},style:{fill:S,opacity:_},silent:!0})}return{type:"group",children:l}},data:[[0,g]],clip:!0,encode:{x:[0,1]},z:10,silent:!0,emphasis:{disabled:!0}}}extendLine(t,e,i,s,n,a,d){const h=e[0]-t[0],p=e[1]-t[1];if(h===0&&p===0)return[t,e];const g=(l,o)=>{let f=1/0;if(o[0]!==0){const u=o[0]>0?(n-l[0])/o[0]:(s-l[0])/o[0];f=Math.min(f,u)}if(o[1]!==0){const u=o[1]>0?(d-l[1])/o[1]:(a-l[1])/o[1];f=Math.min(f,u)}return isFinite(f)||(f=0),[l[0]+f*o[0],l[1]+f*o[1]]};let c=t,r=e;return(i==="right"||i==="both")&&(r=g(t,[h,p])),(i==="left"||i==="both")&&(c=g(e,[-h,-p])),[c,r]}}class jt{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:n,dataIndexOffset:a}=t,d=a||0,h=[];for(let c=0;c<n.length;c++){const r=n[c];if(!r)continue;const l=Array.isArray(r)?r:[r];for(const o of l)o&&typeof o=="object"&&!o._deleted&&o.points&&o.points.length>=2&&h.push(o)}if(h.length===0)return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,data:[],silent:!0};const p=(t.candlestickData?.length||0)+d,g=Math.max(0,p-1);return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(c,r)=>{const l=[];for(const o of h){if(o._deleted)continue;const f=o.points;if(!f||f.length<2)continue;const u=o.xloc==="bi"||o.xloc==="bar_index",y=u?d:0,I=[];for(const v of f){const C=u?(v.index??0)+y:v.time??0,S=v.price??0;I.push(r.coord([C,S]))}if(I.length<2)continue;const P=o.line_color,A=P==null||typeof P=="number"&&isNaN(P)||P==="na"||P==="NaN"?null:P||"#2962ff",k=o.line_width||1,x=this.getDashPattern(o.line_style);if(o.fill_color&&o.fill_color!==""&&o.fill_color!=="na"){const{color:v,opacity:C}=rt.parseColor(o.fill_color);if(o.curved){const S=this.buildCurvedPath(I,o.closed);l.push({type:"path",shape:{pathData:S+" Z"},style:{fill:v,opacity:C,stroke:"none"},silent:!0})}else l.push({type:"polygon",shape:{points:I},style:{fill:v,opacity:C,stroke:"none"},silent:!0})}if(A&&k>0)if(o.curved){const v=this.buildCurvedPath(I,o.closed);l.push({type:"path",shape:{pathData:v},style:{fill:"none",stroke:A,lineWidth:k,lineDash:x},silent:!0})}else{const v=o.closed?[...I,I[0]]:I;l.push({type:"polyline",shape:{points:v},style:{fill:"none",stroke:A,lineWidth:k,lineDash:x},silent:!0})}}return{type:"group",children:l}},data:[[0,g]],clip:!0,encode:{x:[0,1]},itemStyle:{color:"transparent",borderColor:"transparent"},z:15,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 a=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 p=a(h-1),g=a(h),c=a(h+1),r=a(h+2),l=g[0]+(c[0]-p[0])*s/3,o=g[1]+(c[1]-p[1])*s/3,f=c[0]-(r[0]-g[0])*s/3,u=c[1]-(r[1]-g[1])*s/3;n+=` C ${l} ${o}, ${f} ${u}, ${c[0]} ${c[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(b){if(!b||typeof b!="string")return b;if(b.startsWith("#")){const t=b.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 b}function Vt(b){if(!b||typeof b!="string")return null;if(b.startsWith("#")){const e=b.slice(1);if(e.length>=6){const i=parseInt(e.slice(0,2),16),s=parseInt(e.slice(2,4),16),n=parseInt(e.slice(4,6),16);if(!isNaN(i)&&!isNaN(s)&&!isNaN(n))return{r:i,g:s,b:n}}if(e.length===3){const i=parseInt(e[0]+e[0],16),s=parseInt(e[1]+e[1],16),n=parseInt(e[2]+e[2],16);if(!isNaN(i)&&!isNaN(s)&&!isNaN(n))return{r:i,g:s,b:n}}return null}const t=b.match(/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/);return t?{r:+t[1],g:+t[2],b:+t[3]}:null}function Xt(b,t,e){return(.299*b+.587*t+.114*e)/255}class qt{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:n,dataIndexOffset:a}=t,d=a||0,h=[];for(let c=0;c<n.length;c++){const r=n[c];if(!r)continue;const l=Array.isArray(r)?r:[r];for(const o of l)o&&typeof o=="object"&&!o._deleted&&h.push(o)}if(h.length===0)return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,data:[],silent:!0};const p=(t.candlestickData?.length||0)+d,g=Math.max(0,p-1);return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(c,r)=>{const l=[];for(const o of h){if(o._deleted)continue;const f=o.xloc==="bar_index"||o.xloc==="bi"?d:0,u=r.coord([o.left+f,o.top]),y=r.coord([o.right+f,o.bottom]);let I=u[0],P=u[1],A=y[0]-u[0],k=y[1]-u[1];const x=o.extend||"none";if(x!=="none"&&x!=="n"){const D=c.coordSys;(x==="left"||x==="l"||x==="both"||x==="b")&&(I=D.x,A=x==="both"||x==="b"?D.width:y[0]-D.x),(x==="right"||x==="r"||x==="both"||x==="b")&&(x==="right"||x==="r")&&(A=D.x+D.width-u[0])}const v=o.bgcolor,C=v==null||typeof v=="number"&&isNaN(v)||v==="na"||v==="NaN"||v===""?null:Mt(v)||"#2962ff";C&&l.push({type:"rect",shape:{x:I,y:P,width:A,height:k},style:{fill:C,stroke:"none"}});const S=o.border_color,_=S==null||typeof S=="number"&&isNaN(S)||S==="na"||S==="NaN"?null:Mt(S)||"#2962ff",M=o.border_width??1;if(M>0&&_&&l.push({type:"rect",shape:{x:I,y:P,width:A,height:k},style:{fill:"none",stroke:_,lineWidth:M,lineDash:this.getDashPattern(o.border_style)}}),o.text){const D=this.getTextX(I,A,o.text_halign),N=this.getTextY(P,k,o.text_valign);let L=Mt(o.text_color)||"#000000";if((!o.text_color||o.text_color==="#000000"||o.text_color==="black"||o.text_color==="color.black")&&C){const w=Vt(C);w&&Xt(w.r,w.g,w.b)<.5&&(L="#FFFFFF")}const m=!o.text_formatting||o.text_formatting==="format_none"||o.text_formatting==="format_bold",z=this.computeFontSize(o.text_size,o.text,Math.abs(A),Math.abs(k),m);l.push({type:"text",style:{x:D,y:N,text:o.text,fill:L,fontSize:z,fontFamily:o.text_font_family==="monospace"?"monospace":"sans-serif",fontWeight:m?"bold":"normal",fontStyle:o.text_formatting==="format_italic"?"italic":"normal",textAlign:this.mapHAlign(o.text_halign),textVerticalAlign:this.mapVAlign(o.text_valign)}})}}return{type:"group",children:l}},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}}computeFontSize(t,e,i,s,n){if(typeof t=="number"&&t>0)return t;switch(t){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}if(!e||i<=0||s<=0)return 12;const a=6,d=i-a*2,h=s-a*2;if(d<=0||h<=0)return 6;const p=e.split(`
|
|
18
|
-
`),
|
|
19
|
-
<div style="margin-bottom: 8px; font-family: ${
|
|
20
|
-
<div style="display:flex; justify-content:space-between; color:${
|
|
17
|
+
(function(T,$t){typeof exports=="object"&&typeof module<"u"?$t(exports,require("echarts")):typeof define=="function"&&define.amd?define(["exports","echarts"],$t):(T=typeof globalThis<"u"?globalThis:T||self,$t(T.QFChart={},T.echarts))})(this,function(T,$t){"use strict";function ei(l){var t=Object.create(null);return l&&Object.keys(l).forEach(function(e){if(e!=="default"){var i=Object.getOwnPropertyDescriptor(l,e);Object.defineProperty(t,e,i.get?i:{enumerable:!0,get:function(){return l[e]}})}}),t.default=l,Object.freeze(t)}var D=ei($t),ii=Object.defineProperty,si=(l,t,e)=>t in l?ii(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,vt=(l,t,e)=>(si(l,typeof t!="symbol"?t+"":t,e),e);class ni{constructor(t,e,i,s={}){vt(this,"id"),vt(this,"plots"),vt(this,"paneIndex"),vt(this,"height"),vt(this,"collapsed"),vt(this,"titleColor"),vt(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 r=new Map;i.data?.forEach(n=>{r.set(n.time,n)}),s.data?.forEach(n=>{r.set(n.time,n)}),i.data=Array.from(r.values()).sort((n,h)=>n.time-h.time)}})}}class V{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 Kt{static calculate(t,e,i,s=!1,r=null,n,h){let a=0;t>0&&(a=1/t*100);const o=i.yAxisPadding!==void 0?i.yAxisPadding:5,d=i.grid?.show===!0,u=i.grid?.lineColor??"#334155",c=i.grid?.lineOpacity??.5,g=i.grid?.borderColor??"#334155",p=i.grid?.borderShow===!0,y=i.layout?.left??"10%",f=i.layout?.right??"10%",x=Array.from(e.values()).map(z=>z.paneIndex).filter(z=>z>0).sort((z,F)=>z-F).filter((z,F,U)=>U.indexOf(z)===F),m=x.length>0,A=i.dataZoom?.visible??!0,v=i.dataZoom?.position??"top",I=i.dataZoom?.height??6,b=i.dataZoom?.start??0,C=i.dataZoom?.end??100;let w=8,k=92,M=-1;if(r)if(r==="main")M=0;else{const z=e.get(r);z&&(M=z.paneIndex)}if(M!==-1){const z=[],F=[],U=[],it=[],at=i.dataZoom?.start??50,Gt=i.dataZoom?.end??100;(i.dataZoom?.zoomOnTouch??!0)&&it.push({type:"inside",xAxisIndex:"all",start:at,end:Gt,filterMode:"weakFilter"});const H=m?Math.max(...x):0,K=[];for(let N=0;N<=H;N++){const tt=N===M;z.push({left:y,right:f,top:tt?"5%":"0%",height:tt?"90%":"0%",show:tt,containLabel:!1}),F.push({type:"category",gridIndex:N,data:[],show:tt,axisLabel:{show:tt,color:"#94a3b8",fontFamily:i.fontFamily},axisLine:{show:tt&&p,lineStyle:{color:g}},splitLine:{show:tt&&d,lineStyle:{color:u,opacity:c}}});let Rt,Ot;if(N===0&&M===0?(Rt=i.yAxisMin!==void 0&&i.yAxisMin!=="auto"?i.yAxisMin:V.createMinFunction(o),Ot=i.yAxisMax!==void 0&&i.yAxisMax!=="auto"?i.yAxisMax:V.createMaxFunction(o)):(Rt=V.createMinFunction(o),Ot=V.createMaxFunction(o)),U.push({position:"right",gridIndex:N,show:tt,scale:!0,min:Rt,max:Ot,axisLabel:{show:tt,color:"#94a3b8",fontFamily:i.fontFamily,formatter:xt=>{if(i.yAxisLabelFormatter)return i.yAxisLabelFormatter(xt);const Ht=i.yAxisDecimalPlaces!==void 0?i.yAxisDecimalPlaces:V.autoDetectDecimals(n);return V.formatValue(xt,Ht)}},splitLine:{show:tt&&d,lineStyle:{color:u,opacity:c}}}),N>0){const xt=Array.from(e.values()).find(Ht=>Ht.paneIndex===N);xt&&K.push({index:N,height:tt?90:0,top:tt?5:0,isCollapsed:!1,indicatorId:xt.id,titleColor:xt.titleColor,controls:xt.controls})}}return{grid:z,xAxis:F,yAxis:U,dataZoom:it,paneLayout:K,mainPaneHeight:M===0?90:0,mainPaneTop:M===0?5:0,pixelToPercent:a,overlayYAxisMap:new Map,separatePaneYAxisOffset:1}}A?v==="top"?(w=I+4,k=95):(k=100-I-2,w=8):(w=5,k=95);let G=5;t>0&&(G=20/t*100);let _=75,E;if(i.layout?.mainPaneHeight!==void 0){const z=i.layout.mainPaneHeight;if(typeof z=="string"){const F=parseFloat(z);isNaN(F)||(E=F)}else typeof z=="number"&&(E=z)}let L=[];if(m){const z=x.map(H=>{const K=Array.from(e.values()).find(N=>N.paneIndex===H);return{index:H,requestedHeight:K?.height,isCollapsed:K?.collapsed??!1,indicatorId:K?.id,titleColor:K?.titleColor,controls:K?.controls}}).map(H=>({...H,rawHeight:H.isCollapsed?3:H.requestedHeight!==void 0?H.requestedHeight:15})),F=k-w,U=z.length*G;if(h!==void 0&&h>0&&!s)_=h;else if(s)_=3;else if(E!==void 0&&E>0)_=E;else{const H=z.reduce((K,N)=>K+N.rawHeight,0);_=F-H-U,_<20&&(_=Math.max(_,10))}const it=h!==void 0&&h>0&&!s||E!==void 0&&E>0&&!s;let at;if(it){const H=F-_-U,K=z.filter(N=>!N.isCollapsed).reduce((N,tt)=>N+tt.rawHeight,0);at=z.map(N=>({...N,height:N.isCollapsed?3:K>0?Math.max(5,N.rawHeight/K*H):H/z.filter(tt=>!tt.isCollapsed).length}))}else at=z.map(H=>({...H,height:H.rawHeight}));let Gt=w+_+G;L=at.map(H=>{const K={index:H.index,height:H.height,top:Gt,isCollapsed:H.isCollapsed,indicatorId:H.indicatorId,titleColor:H.titleColor,controls:H.controls};return Gt+=H.height+G,K})}else _=k-w,s&&(_=3);const P=[];if(L.length>0){P.push({yPercent:w+_+G/2,aboveId:"main",belowId:L[0].indicatorId||""});for(let z=0;z<L.length-1;z++)P.push({yPercent:L[z].top+L[z].height+G/2,aboveId:L[z].indicatorId||"",belowId:L[z+1].indicatorId||""})}const $=[];$.push({left:y,right:f,top:w+"%",height:_+"%",containLabel:!1}),L.forEach(z=>{$.push({left:y,right:f,top:z.top+"%",height:z.height+"%",containLabel:!1})});const S=[0,...L.map((z,F)=>F+1)],R=[],Z=L.length===0;R.push({type:"category",data:[],gridIndex:0,scale:!0,axisLine:{onZero:!1,show:!s&&p,lineStyle:{color:g}},splitLine:{show:!s&&d,lineStyle:{color:u,opacity:c}},axisLabel:{show:!s,color:"#94a3b8",fontFamily:i.fontFamily||"sans-serif",formatter:z=>{if(i.yAxisLabelFormatter)return i.yAxisLabelFormatter(z);const F=i.yAxisDecimalPlaces!==void 0?i.yAxisDecimalPlaces:V.autoDetectDecimals(n);return V.formatValue(z,F)}},axisTick:{show:!s},axisPointer:{label:{show:Z,fontSize:11,backgroundColor:"#475569"}}}),L.forEach((z,F)=>{const U=F===L.length-1;R.push({type:"category",gridIndex:F+1,data:[],axisLabel:{show:!1},axisLine:{show:!z.isCollapsed&&p,lineStyle:{color:g}},axisTick:{show:!1},splitLine:{show:!1},axisPointer:{label:{show:U,fontSize:11,backgroundColor:"#475569"}}})});const q=[];let O,j;i.yAxisMin!==void 0&&i.yAxisMin!=="auto"?O=i.yAxisMin:O=V.createMinFunction(o),i.yAxisMax!==void 0&&i.yAxisMax!=="auto"?j=i.yAxisMax:j=V.createMaxFunction(o),q.push({position:"right",scale:!0,min:O,max:j,gridIndex:0,splitLine:{show:!s&&d,lineStyle:{color:u,opacity:c}},axisLine:{show:!s&&p,lineStyle:{color:g}},axisLabel:{show:!s,color:"#94a3b8",fontFamily:i.fontFamily||"sans-serif",formatter:z=>{if(i.yAxisLabelFormatter)return i.yAxisLabelFormatter(z);const F=i.yAxisDecimalPlaces!==void 0?i.yAxisDecimalPlaces:V.autoDetectDecimals(n);return V.formatValue(z,F)}}});let Y=1,B=-1/0,rt=1/0;n&&n.length>0&&(B=Math.min(...n.map(z=>z.low)),rt=Math.max(...n.map(z=>z.high)));const Q=new Map;e.forEach((z,F)=>{z.paneIndex===0&&!z.collapsed&&n&&n.length>0&&Object.entries(z.plots).forEach(([U,it])=>{const at=`${F}::${U}`,Gt=["background","barcolor","char"],H=it.options.style==="shape"&&(it.options.location==="abovebar"||it.options.location==="AboveBar"||it.options.location==="belowbar"||it.options.location==="BelowBar");if(Gt.includes(it.options.style)){Q.has(at)||(Q.set(at,Y),Y++);return}if(it.options.style==="shape"&&!H){Q.has(at)||(Q.set(at,Y),Y++);return}const K=[];if(it.data&&Object.values(it.data).forEach(N=>{typeof N=="number"&&!isNaN(N)&&isFinite(N)&&K.push(N)}),K.length>0){const N=Math.min(...K),tt=Math.max(...K),Rt=tt-N,Ot=rt-B,xt=N>=B*.5&&tt<=rt*1.5,Ht=Rt>Ot*.01;xt&&Ht||Q.has(at)||(Q.set(at,Y),Y++)}})});const ft=Q.size>0?Y-1:0,qt=new Set;Q.forEach((z,F)=>{e.forEach(U=>{Object.entries(U.plots).forEach(([it,at])=>{`${U.id}::${it}`===F&&["background","barcolor","char"].includes(at.options.style)&&qt.add(z)})})});for(let z=0;z<ft;z++){const F=z+1,U=qt.has(F);q.push({position:"left",scale:!U,min:U?0:V.createMinFunction(o),max:U?1:V.createMaxFunction(o),gridIndex:0,show:!1,splitLine:{show:!1},axisLine:{show:!1},axisLabel:{show:!1}})}const ae=Y;L.forEach((z,F)=>{q.push({position:"right",scale:!0,min:V.createMinFunction(o),max:V.createMaxFunction(o),gridIndex:F+1,splitLine:{show:!z.isCollapsed&&d,lineStyle:{color:u,opacity:c*.6}},axisLabel:{show:!z.isCollapsed,color:"#94a3b8",fontFamily:i.fontFamily||"sans-serif",fontSize:10,formatter:U=>{if(i.yAxisLabelFormatter)return i.yAxisLabelFormatter(U);const it=i.yAxisDecimalPlaces!==void 0?i.yAxisDecimalPlaces:V.autoDetectDecimals(n);return V.formatValue(U,it)}},axisLine:{show:!z.isCollapsed&&p,lineStyle:{color:g}}})});const kt=[],Ut=i.dataZoom?.zoomOnTouch??!0,po=i.dataZoom?.pannable??!0;return Ut&&po&&kt.push({type:"inside",xAxisIndex:S,start:b,end:C,filterMode:"weakFilter"}),A&&(v==="top"?kt.push({type:"slider",xAxisIndex:S,top:"1%",height:I+"%",start:b,end:C,borderColor:"#334155",textStyle:{color:"#cbd5e1"},brushSelect:!1,filterMode:"weakFilter"}):kt.push({type:"slider",xAxisIndex:S,bottom:"1%",height:I+"%",start:b,end:C,borderColor:"#334155",textStyle:{color:"#cbd5e1"},brushSelect:!1,filterMode:"weakFilter"})),{grid:$,xAxis:R,yAxis:q,dataZoom:kt,paneLayout:L,mainPaneHeight:_,mainPaneTop:w,pixelToPercent:a,paneBoundaries:P,overlayYAxisMap:Q,separatePaneYAxisOffset:ae}}static calculateMaximized(t,e,i){return{grid:[],xAxis:[],yAxis:[],dataZoom:[],paneLayout:[],mainPaneHeight:0,mainPaneTop:0,pixelToPercent:0,paneBoundaries:[]}}}class oi{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:r,colorArray:n,plotOptions:h}=t,a="#2962ff";return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(o,d)=>{const u=o.dataIndex;if(u===0)return;const c=d.value(1),g=d.value(2);if(c===null||isNaN(c)||g===null||isNaN(g))return;const p=d.coord([u-1,g]),y=d.coord([u,c]);return{type:"line",shape:{x1:p[0],y1:p[1],x2:y[0],y2:y[1]},style:{stroke:n[u]||h.color||a,lineWidth:h.linewidth||1},silent:!0}},data:r.map((o,d)=>[d,o,d>0?r[d-1]:null])}}}class ri{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:r,colorArray:n,plotOptions:h}=t,a="#2962ff";return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(o,d)=>{const u=d.value(0),c=d.value(1);if(isNaN(c)||c===null)return;const g=d.coord([u,c]),p=d.size([1,0])[0];return{type:"line",shape:{x1:g[0]-p/2,y1:g[1],x2:g[0]+p/2,y2:g[1]},style:{stroke:n[o.dataIndex]||h.color||a,lineWidth:h.linewidth||1},silent:!0}},data:r.map((o,d)=>[d,o])}}}class he{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:r,colorArray:n,plotOptions:h}=t,a="#2962ff",o=h.histbase??0,d=h.style==="columns",u=h.linewidth??1,c=r.map((g,p)=>g==null||typeof g=="number"&&isNaN(g)?null:[p,g,n[p]||h.color||a]);return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(g,p)=>{const y=p.value(0),f=p.value(1),x=p.value(2);if(f==null||isNaN(f))return null;const m=p.coord([y,o]),A=p.coord([y,f]),v=p.size([1,0])[0];let I;d?I=v*.6:I=Math.max(1,u);const b=m[0],C=m[1],w=A[1],k=Math.min(C,w),M=Math.abs(w-C);return{type:"rect",shape:{x:b-I/2,y:k,width:I,height:M||1},style:{fill:x}}},data:c.filter(g=>g!==null)}}}const Jt=new Map;function ai(l,t="#00da3c",e="64px"){if(typeof document>"u")return"";const i=`${l}-${t}-${e}`;if(Jt.has(i))return Jt.get(i);const s=document.createElement("canvas"),r=s.getContext("2d");if(s.width=32,s.height=32,r){r.font="bold "+e+" Arial",r.fillStyle=t,r.textAlign="center",r.textBaseline="middle",r.fillText(l,16,16);const n=s.toDataURL("image/png");return Jt.set(i,n),n}return""}class Qt{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:r,colorArray:n,plotOptions:h}=t,a="#2962ff",o=h.style;if(o==="char")return{name:e,type:"scatter",xAxisIndex:i,yAxisIndex:s,symbolSize:0,data:r.map((u,c)=>({value:[c,u],itemStyle:{opacity:0}})),silent:!0};const d=r.map((u,c)=>{if(u===null)return null;const g=n[c]||h.color||a,p={value:[c,u],itemStyle:{color:g}};return o==="cross"?(p.symbol=`image://${ai("+",g,"24px")}`,p.symbolSize=16):(p.symbol="circle",p.symbolSize=6),p}).filter(u=>u!==null);return{name:e,type:"scatter",xAxisIndex:i,yAxisIndex:s,data:d}}}class ce{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:r,colorArray:n,optionsArray:h,plotOptions:a}=t,o="#2962ff",d=a.style==="candle",u=[],c=r.map((g,p)=>{if(g===null||!Array.isArray(g)||g.length!==4)return null;const[y,f,x,m]=g,A=h[p]||{},v=A.color||n[p]||a.color||o,I=A.wickcolor||a.wickcolor||v,b=A.bordercolor||a.bordercolor||I;return u[p]={color:v,wickColor:I,borderColor:b},[p,y,m,x,f]}).filter(g=>g!==null);return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(g,p)=>{const y=p.value(0),f=p.value(1),x=p.value(2),m=p.value(3),A=p.value(4);if(isNaN(f)||isNaN(x)||isNaN(m)||isNaN(A))return null;const v=u[y]||{color:o,wickColor:o,borderColor:o},I=v.color,b=v.wickColor,C=v.borderColor,w=p.coord([y,0])[0],k=p.coord([y,f])[1],M=p.coord([y,x])[1],G=p.coord([y,m])[1],_=p.coord([y,A])[1],E=p.size([1,0])[0]*.6;if(d){const L=Math.min(k,M),P=Math.max(k,M),$=Math.abs(M-k);return{type:"group",children:[{type:"line",shape:{x1:w,y1:_,x2:w,y2:L},style:{stroke:b,lineWidth:1}},{type:"line",shape:{x1:w,y1:P,x2:w,y2:G},style:{stroke:b,lineWidth:1}},{type:"rect",shape:{x:w-E/2,y:L,width:E,height:$||1},style:{fill:I,stroke:C,lineWidth:1}}]}}else{const L=E*.5;return{type:"group",children:[{type:"line",shape:{x1:w,y1:G,x2:w,y2:_},style:{stroke:I,lineWidth:1}},{type:"line",shape:{x1:w-L,y1:k,x2:w,y2:k},style:{stroke:I,lineWidth:1}},{type:"line",shape:{x1:w,y1:M,x2:w+L,y2:M},style:{stroke:I,lineWidth:1}}]}}},data:c}}}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 li{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:r,colorArray:n,optionsArray:h,plotOptions:a,candlestickData:o}=t,d="#2962ff",u=r.map((c,g)=>{const p=h[g]||{},y=a,f=p.location||y.location||"absolute";if(f!=="absolute"&&f!=="Absolute"&&!c||c==null)return null;const x=p.color||y.color||d,m=p.shape||y.shape||"circle",A=p.size||y.size||"normal",v=p.text||y.text,I=p.textcolor||y.textcolor||"white",b=p.width||y.width,C=p.height||y.height;let w=c,k=[0,0];f==="abovebar"||f==="AboveBar"||f==="ab"?(o&&o[g]&&(w=o[g].high),k=[0,"-150%"]):f==="belowbar"||f==="BelowBar"||f==="bl"?(o&&o[g]&&(w=o[g].low),k=[0,"150%"]):f==="top"||f==="Top"?(w=c,k=[0,0]):(f==="bottom"||f==="Bottom")&&(w=c,k=[0,0]);const M=Dt.getShapeSymbol(m),G=Dt.getShapeSize(A,b,C),_=Dt.getShapeRotation(m);let E=G;m.includes("label")&&(Array.isArray(G)?E=[G[0]*2.5,G[1]*2.5]:E=G*2.5);const L=Dt.getLabelConfig(m,f);return{value:[g,w],symbol:M,symbolSize:E,symbolRotate:_,symbolOffset:k,itemStyle:{color:x},label:{show:!!v,position:L.position,distance:L.distance,formatter:v,color:I,fontSize:10,fontWeight:"bold"}}}).filter(c=>c!==null);return{name:e,type:"scatter",xAxisIndex:i,yAxisIndex:s,data:u}}}class lt{static parseColor(t){if(!t||typeof t!="string")return{color:"#888888",opacity:.2};const e=t.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)/);if(e){const s=e[1],r=e[2],n=e[3],h=e[4]?parseFloat(e[4]):1;return{color:`rgb(${s},${r},${n})`,opacity:h}}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),r=parseInt(i[2],16),n=parseInt(i[3],16),h=parseInt(i[4],16)/255;return{color:`rgb(${s},${r},${n})`,opacity:h}}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 n=parseInt(s[1],16),h=parseInt(s[2],16),a=parseInt(s[3],16);return`rgba(${n},${h},${a},${e})`}const r=t.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);if(r){const n=parseInt(r[1],16),h=parseInt(r[2],16),a=parseInt(r[3],16);return`rgba(${n},${h},${a},${e})`}return t}}class hi{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:r,colorArray:n}=t,h=[];for(let a=0;a<n.length;a++)h[a]=n[a]?lt.parseColor(n[a]):{color:"",opacity:0};return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,z:-10,renderItem:(a,o)=>{const d=o.value(0);if(isNaN(d))return;const u=o.coord([d,.5]),c=o.size([1,0])[0],g=a.coordSys,p=u[0]-c/2,y=n[a.dataIndex],f=o.value(1);if(!y||f===null||f===void 0||isNaN(f))return;const x=h[a.dataIndex];if(!(!x||x.opacity<=0))return{type:"rect",shape:{x:p,y:g.y,width:c,height:g.height},style:{fill:x.color,opacity:x.opacity},silent:!0}},data:r.map((a,o)=>[o,a!=null&&!isNaN(a)?.5:null])}}}class de{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,plotOptions:r,plotDataArrays:n,indicatorId:h,plotName:a,optionsArray:o}=t,d=t.dataArray.length,u=r.plot1?`${h}::${r.plot1}`:null,c=r.plot2?`${h}::${r.plot2}`:null;if(!u||!c)return console.warn(`Fill plot "${a}" missing plot1 or plot2 reference`),null;const g=n?.get(u),p=n?.get(c);if(!g||!p)return console.warn(`Fill plot "${a}" references non-existent plots: ${r.plot1}, ${r.plot2}`),null;if(r.gradient===!0)return this.renderGradientFill(e,i,s,g,p,d,o,r);const{color:y,opacity:f}=lt.parseColor(r.color||"rgba(128, 128, 128, 0.2)"),x=o?.some(v=>v&&v.color!==void 0);let m=null;if(x){m=[];for(let v=0;v<d;v++){const I=o?.[v];I&&I.color!==void 0?m[v]=lt.parseColor(I.color):m[v]={color:y,opacity:f}}}const A=[];for(let v=0;v<d;v++){const I=g[v],b=p[v],C=v>0?g[v-1]:null,w=v>0?p[v-1]:null;A.push([v,I,b,C,w])}return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,z:1,clip:!0,encode:{x:0},animation:!1,renderItem:(v,I)=>{const b=v.dataIndex;if(b===0)return null;const C=I.value(1),w=I.value(2),k=I.value(3),M=I.value(4);if(C===null||w===null||k===null||M===null||isNaN(C)||isNaN(w)||isNaN(k)||isNaN(M))return null;const G=m?m[b]:null,_=G?G.opacity:f;if(_<.01)return null;const E=I.coord([b-1,k]),L=I.coord([b,C]),P=I.coord([b,w]),$=I.coord([b-1,M]);return{type:"polygon",shape:{points:[E,L,P,$]},style:{fill:G?G.color:y,opacity:_},silent:!0}},data:A,silent:!0}}renderBatched(t,e,i,s,r){const n=Array.from({length:s},(h,a)=>[a]);return{name:t,type:"custom",xAxisIndex:e,yAxisIndex:i,z:1,clip:!0,encode:{x:0},animation:!1,renderItem:(h,a)=>{const o=h.dataIndex;if(o===0)return null;const d=[];for(let u=0;u<r.length;u++){const c=r[u],g=c.plot1Data[o],p=c.plot2Data[o],y=c.plot1Data[o-1],f=c.plot2Data[o-1];if(g==null||p==null||y==null||f==null||isNaN(g)||isNaN(p)||isNaN(y)||isNaN(f))continue;const x=c.barColors[o];if(!x||x.opacity<.01)continue;const m=a.coord([o-1,y]),A=a.coord([o,g]),v=a.coord([o,p]),I=a.coord([o-1,f]);d.push({type:"polygon",shape:{points:[m,A,v,I]},style:{fill:x.color,opacity:x.opacity},silent:!0})}return d.length>0?{type:"group",children:d,silent:!0}:null},data:n,silent:!0}}renderGradientFill(t,e,i,s,r,n,h,a){const o=[];for(let u=0;u<n;u++){const c=h?.[u];if(c&&c.top_color!==void 0){const g=lt.parseColor(c.top_color),p=lt.parseColor(c.bottom_color);o[u]={topColor:g.color,topOpacity:g.opacity,bottomColor:p.color,bottomOpacity:p.opacity}}else o[u]={topColor:"rgba(128,128,128,0.2)",topOpacity:.2,bottomColor:"rgba(128,128,128,0.2)",bottomOpacity:.2}}const d=[];for(let u=0;u<n;u++){const c=s[u],g=r[u],p=u>0?s[u-1]:null,y=u>0?r[u-1]:null;d.push([u,c,g,p,y])}return{name:t,type:"custom",xAxisIndex:e,yAxisIndex:i,z:1,clip:!0,encode:{x:0},animation:!1,renderItem:(u,c)=>{const g=u.dataIndex;if(g===0)return null;const p=c.value(1),y=c.value(2),f=c.value(3),x=c.value(4);if(p===null||y===null||f===null||x===null||isNaN(p)||isNaN(y)||isNaN(f)||isNaN(x))return null;const m=c.coord([g-1,f]),A=c.coord([g,p]),v=c.coord([g,y]),I=c.coord([g-1,x]),b=o[g]||o[g-1];if(!b||b.topOpacity<.01&&b.bottomOpacity<.01)return null;const C=lt.toRgba(b.topColor,b.topOpacity),w=lt.toRgba(b.bottomColor,b.bottomOpacity),k=p>=y;return{type:"polygon",shape:{points:[m,A,v,I]},style:{fill:{type:"linear",x:0,y:0,x2:0,y2:1,colorStops:[{offset:0,color:k?C:w},{offset:1,color:k?w:C}]}},silent:!0}},data:d,silent:!0}}}class ci{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:r,candlestickData:n,dataIndexOffset:h}=t,a=h||0,o=[];for(let u=0;u<r.length;u++){const c=r[u];if(!c)continue;const g=Array.isArray(c)?c:[c];for(const p of g)p&&typeof p=="object"&&!p._deleted&&o.push(p)}const d=o.map(u=>{const c=Z=>typeof Z=="function"?Z():Z,g=c(u.text)||"",p=c(u.color),y=p!=null&&p!==""?p:"transparent",f=c(u.textcolor)||"#ffffff",x=c(u.yloc)||"price",m=c(u.style)||"style_label_down",A=c(u.size)||"normal",v=c(u.textalign)||"align_center",I=c(u.tooltip)||"",b=this.styleToShape(m),C=u.xloc==="bar_index"||u.xloc==="bi"?u.x+a:u.x;let w=u.y,k=[0,0];x==="abovebar"||x==="AboveBar"||x==="ab"?(n&&n[C]&&(w=n[C].high),k=[0,"-150%"]):(x==="belowbar"||x==="BelowBar"||x==="bl")&&(n&&n[C]&&(w=n[C].low),k=[0,"150%"]);const M=Dt.getShapeSymbol(b),G=Dt.getShapeSize(A),_=this.getSizePx(A);let E;const L=b==="labeldown"||b==="shape_label_down"||b==="labelup"||b==="shape_label_up"||b==="labelleft"||b==="labelright";let P=[0,0];if(L){const Z=g.length*_*.65,q=_*2.5,O=Math.max(q,Z+_*1.6),j=_*2.8,Y=3/24;if(b==="labelleft"||b==="labelright"){const B=O/(1-Y);E=[B,j];const rt=typeof k[0]=="string"?0:k[0];b==="labelleft"?(k=[rt+B*.42,k[1]],P=[B*Y*.5,0]):(k=[rt-B*.42,k[1]],P=[-B*Y*.5,0])}else{const B=j/(1-Y);E=[O,B],b==="labeldown"?(k=[k[0],typeof k[1]=="string"?k[1]:k[1]-B*.42],P=[0,-B*Y*.5]):(k=[k[0],typeof k[1]=="string"?k[1]:k[1]+B*.42],P=[0,B*Y*.5])}}else b==="none"?E=0:Array.isArray(G)?E=[G[0]*1.5,G[1]*1.5]:E=G*1.5;const $=this.getLabelPosition(m,x),S=$==="inside"||$.startsWith("inside"),R={value:[C,w],symbol:M,symbolSize:E,symbolOffset:k,itemStyle:{color:y},label:{show:!!g,position:$,distance:S?0:5,offset:P,formatter:g,color:f,fontSize:_,fontWeight:"bold",align:S?"center":v==="align_left"||v==="left"?"left":v==="align_right"||v==="right"?"right":"center",verticalAlign:"middle",padding:[2,6]}};return I?(R._tooltipText=I,R.emphasis={scale:!1,itemStyle:{color:y},label:{show:R.label.show,color:f,fontSize:_,fontWeight:"bold"}}):R.emphasis={disabled:!0},R}).filter(u=>u!==null);return{name:e,type:"scatter",xAxisIndex:i,yAxisIndex:s,data:d,z:20,animation:!1,clip:!1}}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 di{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:r,dataIndexOffset:n}=t,h=n||0,a="#2962ff",o=[];for(let c=0;c<r.length;c++){const g=r[c];if(!g)continue;const p=Array.isArray(g)?g:[g];for(const y of p)y&&typeof y=="object"&&!y._deleted&&o.push(y)}if(o.length===0)return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,data:[],silent:!0};const d=(t.candlestickData?.length||0)+h,u=Math.max(0,d-1);return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(c,g)=>{const p=[];for(const y of o){if(y._deleted)continue;const f=y.xloc==="bar_index"||y.xloc==="bi"?h:0;let x=g.coord([y.x1+f,y.y1]),m=g.coord([y.x2+f,y.y2]);const A=y.extend||"none";if(A!=="none"&&A!=="n"){const C=c.coordSys;[x,m]=this.extendLine(x,m,A,C.x,C.x+C.width,C.y,C.y+C.height)}const v=y.color||a,I=y.width||1;p.push({type:"line",shape:{x1:x[0],y1:x[1],x2:m[0],y2:m[1]},style:{fill:"none",stroke:v,lineWidth:I,lineDash:this.getDashPattern(y.style)}});const b=y.style||"style_solid";if(b==="style_arrow_left"||b==="style_arrow_both"){const C=this.arrowHead(m,x,I,v);C&&p.push(C)}if(b==="style_arrow_right"||b==="style_arrow_both"){const C=this.arrowHead(x,m,I,v);C&&p.push(C)}}return{type:"group",children:p}},data:[[0,u]],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,r,n,h){const a=e[0]-t[0],o=e[1]-t[1];if(a===0&&o===0)return[t,e];const d=(g,p)=>{let y=1/0;if(p[0]!==0){const f=p[0]>0?(r-g[0])/p[0]:(s-g[0])/p[0];y=Math.min(y,f)}if(p[1]!==0){const f=p[1]>0?(h-g[1])/p[1]:(n-g[1])/p[1];y=Math.min(y,f)}return isFinite(y)||(y=0),[g[0]+y*p[0],g[1]+y*p[1]]};let u=t,c=e;return(i==="right"||i==="r"||i==="both"||i==="b")&&(c=d(t,[a,o])),(i==="left"||i==="l"||i==="both"||i==="b")&&(u=d(e,[-a,-o])),[u,c]}arrowHead(t,e,i,s){const r=e[0]-t[0],n=e[1]-t[1],h=Math.sqrt(r*r+n*n);if(h<1)return null;const a=Math.max(8,i*4),o=r/h,d=n/h,u=e[0]-o*a,c=e[1]-d*a,g=-d*a*.4,p=o*a*.4;return{type:"polygon",shape:{points:[[e[0],e[1]],[u+g,c+p],[u-g,c-p]]},style:{fill:s}}}}class pi{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:r,dataIndexOffset:n}=t,h=n||0,a=[];for(let u=0;u<r.length;u++){const c=r[u];if(!c)continue;const g=Array.isArray(c)?c:[c];for(const p of g){if(!p||typeof p!="object"||p._deleted)continue;const y=p.line1,f=p.line2;!y||!f||y._deleted||f._deleted||a.push(p)}}if(a.length===0)return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,data:[],silent:!0};const o=(t.candlestickData?.length||0)+h,d=Math.max(0,o-1);return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(u,c)=>{const g=[];for(const p of a){if(p._deleted)continue;const y=p.line1,f=p.line2;if(!y||!f||y._deleted||f._deleted)continue;const x=y.xloc==="bar_index"||y.xloc==="bi"?h:0,m=f.xloc==="bar_index"||f.xloc==="bi"?h:0;let A=c.coord([y.x1+x,y.y1]),v=c.coord([y.x2+x,y.y2]),I=c.coord([f.x1+m,f.y1]),b=c.coord([f.x2+m,f.y2]);const C=y.extend||"none",w=f.extend||"none";if(C!=="none"||w!=="none"){const G=u.coordSys,_=G.x,E=G.x+G.width,L=G.y,P=G.y+G.height;C!=="none"&&([A,v]=this.extendLine(A,v,C,_,E,L,P)),w!=="none"&&([I,b]=this.extendLine(I,b,w,_,E,L,P))}const{color:k,opacity:M}=lt.parseColor(p.color||"rgba(128, 128, 128, 0.2)");g.push({type:"polygon",shape:{points:[A,v,b,I]},style:{fill:k,opacity:M},silent:!0})}return{type:"group",children:g}},data:[[0,d]],clip:!0,encode:{x:[0,1]},z:10,silent:!0,emphasis:{disabled:!0}}}extendLine(t,e,i,s,r,n,h){const a=e[0]-t[0],o=e[1]-t[1];if(a===0&&o===0)return[t,e];const d=(g,p)=>{let y=1/0;if(p[0]!==0){const f=p[0]>0?(r-g[0])/p[0]:(s-g[0])/p[0];y=Math.min(y,f)}if(p[1]!==0){const f=p[1]>0?(h-g[1])/p[1]:(n-g[1])/p[1];y=Math.min(y,f)}return isFinite(y)||(y=0),[g[0]+y*p[0],g[1]+y*p[1]]};let u=t,c=e;return(i==="right"||i==="both")&&(c=d(t,[a,o])),(i==="left"||i==="both")&&(u=d(e,[-a,-o])),[u,c]}}class ui{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:r,dataIndexOffset:n}=t,h=n||0,a=[];for(let u=0;u<r.length;u++){const c=r[u];if(!c)continue;const g=Array.isArray(c)?c:[c];for(const p of g)p&&typeof p=="object"&&!p._deleted&&p.points&&p.points.length>=2&&a.push(p)}if(a.length===0)return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,data:[],silent:!0};const o=(t.candlestickData?.length||0)+h,d=Math.max(0,o-1);return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(u,c)=>{const g=[];for(const p of a){if(p._deleted)continue;const y=p.points;if(!y||y.length<2)continue;const f=p.xloc==="bi"||p.xloc==="bar_index",x=f?h:0,m=[];for(const C of y){const w=f?(C.index??0)+x:C.time??0,k=C.price??0;m.push(c.coord([w,k]))}if(m.length<2)continue;const A=p.line_color,v=A==null||typeof A=="number"&&isNaN(A)||A==="na"||A==="NaN"?null:A||"#2962ff",I=p.line_width||1,b=this.getDashPattern(p.line_style);if(p.fill_color&&p.fill_color!==""&&p.fill_color!=="na"){const{color:C,opacity:w}=lt.parseColor(p.fill_color);if(p.curved){const k=this.buildCurvedPath(m,p.closed);g.push({type:"path",shape:{pathData:k+" Z"},style:{fill:C,opacity:w,stroke:"none"},silent:!0})}else g.push({type:"polygon",shape:{points:m},style:{fill:C,opacity:w,stroke:"none"},silent:!0})}if(v&&I>0)if(p.curved){const C=this.buildCurvedPath(m,p.closed);g.push({type:"path",shape:{pathData:C},style:{fill:"none",stroke:v,lineWidth:I,lineDash:b},silent:!0})}else{const C=p.closed?[...m,m[0]]:m;g.push({type:"polyline",shape:{points:C},style:{fill:"none",stroke:v,lineWidth:I,lineDash:b},silent:!0})}}return{type:"group",children:g}},data:[[0,d]],clip:!0,encode:{x:[0,1]},itemStyle:{color:"transparent",borderColor:"transparent"},z:15,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 r=`M ${t[0][0]} ${t[0][1]}`;const n=a=>e?t[(a%i+i)%i]:a<0?t[0]:a>=i?t[i-1]:t[a],h=e?i:i-1;for(let a=0;a<h;a++){const o=n(a-1),d=n(a),u=n(a+1),c=n(a+2),g=d[0]+(u[0]-o[0])*s/3,p=d[1]+(u[1]-o[1])*s/3,y=u[0]-(c[0]-d[0])*s/3,f=u[1]-(c[1]-d[1])*s/3;r+=` C ${g} ${p}, ${y} ${f}, ${u[0]} ${u[1]}`}return e&&(r+=" Z"),r}getDashPattern(t){switch(t){case"style_dotted":return[2,2];case"style_dashed":return[6,4];default:return}}}function te(l){if(!l||typeof l!="string")return l;if(l.startsWith("#")){const t=l.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),r=parseInt(t.slice(6,8),16)/255;return`rgba(${e},${i},${s},${r.toFixed(3)})`}}return l}function gi(l){if(!l||typeof l!="string")return null;if(l.startsWith("#")){const e=l.slice(1);if(e.length>=6){const i=parseInt(e.slice(0,2),16),s=parseInt(e.slice(2,4),16),r=parseInt(e.slice(4,6),16);if(!isNaN(i)&&!isNaN(s)&&!isNaN(r))return{r:i,g:s,b:r}}if(e.length===3){const i=parseInt(e[0]+e[0],16),s=parseInt(e[1]+e[1],16),r=parseInt(e[2]+e[2],16);if(!isNaN(i)&&!isNaN(s)&&!isNaN(r))return{r:i,g:s,b:r}}return null}const t=l.match(/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/);return t?{r:+t[1],g:+t[2],b:+t[3]}:null}function yi(l,t,e){return(.299*l+.587*t+.114*e)/255}class fi{render(t){const{seriesName:e,xAxisIndex:i,yAxisIndex:s,dataArray:r,dataIndexOffset:n}=t,h=n||0,a=[];for(let u=0;u<r.length;u++){const c=r[u];if(!c)continue;const g=Array.isArray(c)?c:[c];for(const p of g)p&&typeof p=="object"&&!p._deleted&&a.push(p)}if(a.length===0)return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,data:[],silent:!0};const o=(t.candlestickData?.length||0)+h,d=Math.max(0,o-1);return{name:e,type:"custom",xAxisIndex:i,yAxisIndex:s,renderItem:(u,c)=>{const g=[];for(const p of a){if(p._deleted)continue;const y=p.xloc==="bar_index"||p.xloc==="bi"?h:0,f=c.coord([p.left+y,p.top]),x=c.coord([p.right+y,p.bottom]);let m=f[0],A=f[1],v=x[0]-f[0],I=x[1]-f[1];const b=p.extend||"none";if(b!=="none"&&b!=="n"){const _=u.coordSys;(b==="left"||b==="l"||b==="both"||b==="b")&&(m=_.x,v=b==="both"||b==="b"?_.width:x[0]-_.x),(b==="right"||b==="r"||b==="both"||b==="b")&&(b==="right"||b==="r")&&(v=_.x+_.width-f[0])}const C=p.bgcolor,w=C==null||typeof C=="number"&&isNaN(C)||C==="na"||C==="NaN"||C===""?null:te(C)||"#2962ff";w&&g.push({type:"rect",shape:{x:m,y:A,width:v,height:I},style:{fill:w,stroke:"none"}});const k=p.border_color,M=k==null||typeof k=="number"&&isNaN(k)||k==="na"||k==="NaN"?null:te(k)||"#2962ff",G=p.border_width??1;if(G>0&&M&&g.push({type:"rect",shape:{x:m,y:A,width:v,height:I},style:{fill:"none",stroke:M,lineWidth:G,lineDash:this.getDashPattern(p.border_style)}}),p.text){const _=this.getTextX(m,v,p.text_halign),E=this.getTextY(A,I,p.text_valign);let L=te(p.text_color)||"#000000";if((!p.text_color||p.text_color==="#000000"||p.text_color==="black"||p.text_color==="color.black")&&w){const S=gi(w);S&&yi(S.r,S.g,S.b)<.5&&(L="#FFFFFF")}const P=!p.text_formatting||p.text_formatting==="format_none"||p.text_formatting==="format_bold",$=this.computeFontSize(p.text_size,p.text,Math.abs(v),Math.abs(I),P);g.push({type:"text",style:{x:_,y:E,text:p.text,fill:L,fontSize:$,fontFamily:p.text_font_family==="monospace"?"monospace":"sans-serif",fontWeight:P?"bold":"normal",fontStyle:p.text_formatting==="format_italic"?"italic":"normal",textAlign:this.mapHAlign(p.text_halign),textVerticalAlign:this.mapVAlign(p.text_valign)}})}}return{type:"group",children:g}},data:[[0,d]],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}}computeFontSize(t,e,i,s,r){if(typeof t=="number"&&t>0)return t;switch(t){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}if(!e||i<=0||s<=0)return 12;const n=6,h=i-n*2,a=s-n*2;if(h<=0||a<=0)return 6;const o=e.split(`
|
|
18
|
+
`),d=o.length;let u=1;for(const y of o)y.length>u&&(u=y.length);const c=h/(u*(r?.62:.55)),g=a/(d*1.3),p=Math.min(c,g);return Math.max(6,Math.min(p,48))}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 xi=Object.defineProperty,mi=(l,t,e)=>t in l?xi(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,bi=(l,t,e)=>(mi(l,typeof t!="symbol"?t+"":t,e),e);const J=class{static register(t,e){this.renderers.set(t,e)}static get(t){return this.renderers.get(t)||this.renderers.get("line")}};bi(J,"renderers",new Map),J.register("line",new oi),J.register("step",new ri),J.register("histogram",new he),J.register("columns",new he),J.register("circles",new Qt),J.register("cross",new Qt),J.register("char",new Qt),J.register("bar",new ce),J.register("candle",new ce),J.register("shape",new li),J.register("background",new hi),J.register("fill",new de),J.register("label",new ci),J.register("drawing_line",new di),J.register("linefill",new pi),J.register("drawing_polyline",new ui),J.register("drawing_box",new fi);let vi=J;var wi=Object.defineProperty,Ci=(l,t,e)=>t in l?wi(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,Pi=(l,t,e)=>(Ci(l,typeof t!="symbol"?t+"":t,e),e);const pe=class le{static buildCandlestickSeries(t,e,i){const s=e.upColor||"#00da3c",r=e.downColor||"#ec0000",n=t.map(a=>[a.open,a.close,a.low,a.high]);if(i&&i>n.length){const a=i-n.length;for(let o=0;o<a;o++)n.push(null)}let h;if(e.lastPriceLine?.visible!==!1&&t.length>0){const a=t[t.length-1],o=a.close,d=a.close>=a.open,u=e.lastPriceLine?.color||(d?s:r);let c=e.lastPriceLine?.lineStyle||"dashed";c.startsWith("linestyle_")&&(c=c.replace("linestyle_",""));const g=e.yAxisDecimalPlaces!==void 0?e.yAxisDecimalPlaces:V.autoDetectDecimals(t);h={symbol:["none","none"],precision:g,data:[{yAxis:o,label:{show:!0,position:"end",formatter:p=>e.yAxisLabelFormatter?e.yAxisLabelFormatter(p.value):V.formatValue(p.value,g),color:"#fff",backgroundColor:u,padding:[2,4],borderRadius:2,fontSize:11,fontWeight:"bold"},lineStyle:{color:u,type:c,width:1,opacity:.8}}],animation:!1,silent:!0}}return{type:"candlestick",id:"__candlestick__",name:e.title,data:n,itemStyle:{color:s,color0:r,borderColor:s,borderColor0:r},markLine:h,xAxisIndex:0,yAxisIndex:0,z:5}}static buildIndicatorSeries(t,e,i,s,r=0,n,h,a=1){const o=[],d=new Array(s).fill(null),u=new Map;return t.forEach((c,g)=>{if(c.collapsed)return;const p=Object.keys(c.plots).sort((f,x)=>{const m=c.plots[f],A=c.plots[x],v=m.options.style==="fill",I=A.options.style==="fill";return v&&!I?1:!v&&I?-1:0}),y=new Map;if(p.forEach(f=>{const x=c.plots[f],m=x.options.display==="none",A=`${g}::${f}`;let v=0,I=0,b=x.options.overlay;if(x.options.style==="fill"&&b===void 0){const _=x.options.plot1,E=x.options.plot2;if(_&&E){const L=c.plots[_],P=c.plots[E];L?.options?.overlay===!0&&P?.options?.overlay===!0&&(b=!0)}}if(c.paneIndex===0||b===!0)v=0,h&&h.has(A)?I=h.get(A):I=0;else{const _=i.findIndex(E=>E.index===c.paneIndex);_!==-1&&(v=_+1,I=a+_)}const C=new Array(s).fill(null),w=new Array(s).fill(null),k=new Array(s).fill(null),M=new Array(s).fill(null);if(x.data?.forEach(_=>{const E=e.get(_.time);if(E!==void 0){const L=_.options?.offset??x.options.offset??0,P=E+r+L;if(P>=0&&P<s){let $=_.value;const S=_.options?.color;w[P]=$;const R=_.options!=null&&"color"in _.options,Z=S===null||S==="na"||S==="NaN"||typeof S=="number"&&isNaN(S)||R&&S===void 0;Z&&($=null),C[P]=$,k[P]=Z?null:S||x.options.color||le.DEFAULT_COLOR,M[P]=_.options||{}}}}),u.set(`${g}::${f}`,w),m)return;if(x.options?.style?.startsWith("style_")&&(x.options.style=x.options.style.replace("style_","")),x.options.style==="barcolor"){x.data?.forEach(_=>{const E=e.get(_.time);if(E!==void 0){const L=_.options?.offset??x.options.offset??0,P=E+r+L;if(P>=0&&P<s){const $=_.options?.color||x.options.color||le.DEFAULT_COLOR;!($===null||$==="na"||$==="NaN"||typeof $=="number"&&isNaN($))&&_.value!==null&&_.value!==void 0&&(d[P]=$)}}});return}if(x.options.style==="table")return;if(x.options.style==="fill"&&x.options.gradient!==!0){const _=x.options.plot1?`${g}::${x.options.plot1}`:null,E=x.options.plot2?`${g}::${x.options.plot2}`:null;if(_&&E){const L=u.get(_),P=u.get(E);if(L&&P){const{color:$,opacity:S}=lt.parseColor(x.options.color||"rgba(128, 128, 128, 0.2)"),R=M.some(O=>O&&O.color!==void 0),Z=[];for(let O=0;O<s;O++){const j=M[O];R&&j&&j.color!==void 0?Z[O]=lt.parseColor(j.color):Z[O]={color:$,opacity:S}}const q=`${v}:${I}`;y.has(q)||y.set(q,{entries:[],xAxisIndex:v,yAxisIndex:I}),y.get(q).entries.push({plot1Data:L,plot2Data:P,barColors:Z});return}}}if(x.options.color&&typeof x.options.color=="string"&<.parseColor(x.options.color).opacity<.01&&!k.some(_=>_==null?!1:lt.parseColor(_).opacity>=.01))return;const G=vi.get(x.options.style).render({seriesName:A,xAxisIndex:v,yAxisIndex:I,dataArray:C,colorArray:k,optionsArray:M,plotOptions:x.options,candlestickData:n,plotDataArrays:u,indicatorId:g,plotName:f,dataIndexOffset:r});G&&o.push(G)}),y.size>0){const f=new de;y.forEach(({entries:x,xAxisIndex:m,yAxisIndex:A},v)=>{if(x.length>=2){const I=f.renderBatched(`${g}::fills_batch_${v}`,m,A,s,x);I&&o.push(I)}else if(x.length===1){const I=f.renderBatched(`${g}::fills_batch_${v}`,m,A,s,x);I&&o.push(I)}})}}),{series:o,barColors:d}}};Pi(pe,"DEFAULT_COLOR","#2962ff");let It=pe;class ki{static build(t,e,i,s=!1,r=null,n=[]){const h=[],a=t.pixelToPercent,o=t.mainPaneTop;if(!r||r==="main"){const d=10*a;if(h.push({type:"text",left:"8.5%",top:o+d+"%",z:10,style:{text:e.title||"",fill:e.titleColor||"#fff",font:`bold 16px ${e.fontFamily||"sans-serif"}`,textVerticalAlign:"top"}}),n.length>0){const c=20*a,g=16*a;n.forEach((p,y)=>{h.push({type:"text",left:"8.5%",top:o+d+c+y*g+"%",z:10,style:{text:p.id,fill:p.titleColor||"#9e9e9e",font:`bold 12px ${e.fontFamily||"sans-serif"}`,textVerticalAlign:"top"}})})}if(e.watermark!==!1){const c=t.mainPaneTop+t.mainPaneHeight;h.push({type:"text",right:"11%",top:c-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 u=[];if(e.controls?.collapse&&u.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 c=r==="main",g=e.controls?.collapse?25:0;u.push({type:"group",x:g,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:c?"\u2750":"\u25A1",fill:"#cbd5e1",font:`14px ${e.fontFamily}`,x:10,y:10,textAlign:"center",textVerticalAlign:"middle"},silent:!0}]})}if(e.controls?.fullscreen){let c=0;e.controls?.collapse&&(c+=25),e.controls?.maximize&&(c+=25),u.push({type:"group",x:c,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}]})}u.length>0&&h.push({type:"group",right:"10.5%",top:o+"%",children:u})}return t.paneLayout.forEach(d=>{if(r&&d.indicatorId!==r)return;h.push({type:"text",left:"8.5%",top:d.top+10*a+"%",z:10,style:{text:d.indicatorId||"",fill:d.titleColor||"#fff",font:`bold 12px ${e.fontFamily||"sans-serif"}`,textVerticalAlign:"top"}});const u=[];if(d.controls?.collapse&&u.push({type:"group",children:[{type:"rect",shape:{width:20,height:20,r:2},style:{fill:"#334155",stroke:"#475569",lineWidth:1},onclick:()=>d.indicatorId&&i(d.indicatorId,"collapse")},{type:"text",style:{text:d.isCollapsed?"+":"\u2212",fill:"#cbd5e1",font:`bold 14px ${e.fontFamily}`,x:10,y:10,textAlign:"center",textVerticalAlign:"middle"},silent:!0}]}),d.controls?.maximize){const c=r===d.indicatorId,g=d.controls?.collapse?25:0;u.push({type:"group",x:g,children:[{type:"rect",shape:{width:20,height:20,r:2},style:{fill:"#334155",stroke:"#475569",lineWidth:1},onclick:()=>d.indicatorId&&i(d.indicatorId,"maximize")},{type:"text",style:{text:c?"\u2750":"\u25A1",fill:"#cbd5e1",font:`14px ${e.fontFamily}`,x:10,y:10,textAlign:"center",textVerticalAlign:"middle"},silent:!0}]})}u.length>0&&h.push({type:"group",right:"10.5%",top:d.top+"%",children:u})}),h}}class Di{static format(t,e){if(!t||t.length===0)return"";const i=e.title||"",s=e.upColor||"#00da3c",r=e.downColor||"#ec0000",n=e.fontFamily||"sans-serif",h=t[0].axisValue;let a=`<div style="font-weight: bold; margin-bottom: 5px; color: #cbd5e1; font-family: ${n};">${h}</div>`;const o=t.find(u=>u.seriesType==="candlestick"),d=t.filter(u=>u.seriesType!=="candlestick");if(o){const[u,c,g,p,y]=o.value,f=g>=c?s:r;a+=`
|
|
19
|
+
<div style="margin-bottom: 8px; font-family: ${n};">
|
|
20
|
+
<div style="display:flex; justify-content:space-between; color:${f}; font-weight:bold;">
|
|
21
21
|
<span>${i}</span>
|
|
22
22
|
</div>
|
|
23
23
|
<div style="display: grid; grid-template-columns: auto auto; gap: 2px 15px; font-size: 0.9em; color: #cbd5e1;">
|
|
24
|
-
<span>Open:</span> <span style="text-align: right; color: ${
|
|
25
|
-
<span>High:</span> <span style="text-align: right; color: ${s}">${
|
|
26
|
-
<span>Low:</span> <span style="text-align: right; color: ${
|
|
27
|
-
<span>Close:</span> <span style="text-align: right; color: ${
|
|
24
|
+
<span>Open:</span> <span style="text-align: right; color: ${g>=c?s:r}">${c}</span>
|
|
25
|
+
<span>High:</span> <span style="text-align: right; color: ${s}">${y}</span>
|
|
26
|
+
<span>Low:</span> <span style="text-align: right; color: ${r}">${p}</span>
|
|
27
|
+
<span>Close:</span> <span style="text-align: right; color: ${g>=c?s:r}">${g}</span>
|
|
28
28
|
</div>
|
|
29
29
|
</div>
|
|
30
|
-
`}if(
|
|
31
|
-
<div style="margin-top: 8px; font-family: ${
|
|
32
|
-
<div style="font-weight:bold; color: #fff; margin-bottom: 2px;">${
|
|
33
|
-
`,c
|
|
30
|
+
`}if(d.length>0){a+='<div style="border-top: 1px solid #334155; margin: 5px 0; padding-top: 5px;"></div>';const u={};d.forEach(c=>{const g=c.seriesName.split("::"),p=g.length>1?g[0]:"Unknown",y=g.length>1?g[1]:c.seriesName;u[p]||(u[p]=[]),u[p].push({...c,displayName:y})}),Object.keys(u).forEach(c=>{a+=`
|
|
31
|
+
<div style="margin-top: 8px; font-family: ${n};">
|
|
32
|
+
<div style="font-weight:bold; color: #fff; margin-bottom: 2px;">${c}</div>
|
|
33
|
+
`,u[c].forEach(g=>{let p=g.value;if(Array.isArray(p)&&(p=p[1]),p==null)return;const y=typeof p=="number"?p.toLocaleString(void 0,{maximumFractionDigits:4}):p;a+=`
|
|
34
34
|
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 2px; padding-left: 8px;">
|
|
35
|
-
<div>${
|
|
36
|
-
<div style="font-size: 10px; color: #fff;padding-left:10px;">${
|
|
37
|
-
</div>`}),h+="</div>"})}return h}}var ne=Object.defineProperty,ae=(b,t,e)=>t in b?ne(b,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):b[t]=e,bt=(b,t,e)=>(ae(b,typeof t!="symbol"?t+"":t,e),e);class re{constructor(t,e){bt(this,"plugins",new Map),bt(this,"activePluginId",null),bt(this,"context"),bt(this,"toolbarContainer"),bt(this,"tooltipElement",null),bt(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,a=i.right+10;this.tooltipElement.style.top=`${n}px`,this.tooltipElement.style.left=`${a}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 le=Object.defineProperty,he=(b,t,e)=>t in b?le(b,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):b[t]=e,nt=(b,t,e)=>(he(b,typeof t!="symbol"?t+"":t,e),e);class ce{constructor(t){nt(this,"context"),nt(this,"isEditing",!1),nt(this,"currentDrawing",null),nt(this,"editingPointIndex",null),nt(this,"zr"),nt(this,"editGroup",null),nt(this,"editLine",null),nt(this,"editStartPoint",null),nt(this,"editEndPoint",null),nt(this,"isMovingShape",!1),nt(this,"dragStart",null),nt(this,"initialPixelPoints",[]),nt(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))}),nt(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))}),nt(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,a=s-this.dragStart.y,d={x:this.initialPixelPoints[0].x+n,y:this.initialPixelPoints[0].y+a},h={x:this.initialPixelPoints[1].x+n,y:this.initialPixelPoints[1].y+a};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})))}),nt(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 q.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 q.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 q.graphic.Circle({shape:{cx:i.x,cy:i.y,r:5},style:{fill:"#fff",stroke:"#3b82f6",lineWidth:2},z:1e3}),this.editEndPoint=new q.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((a,d)=>{const h=a.x+i,p=a.y+s;return this.context.coordinateConversion.pixelToData({x:h,y:p})});n.every(a=>a!==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 de=Object.defineProperty,pe=(b,t,e)=>t in b?de(b,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):b[t]=e,ue=(b,t,e)=>(pe(b,typeof t!="symbol"?t+"":t,e),e);class fe{constructor(){ue(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 at{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){at.clearAll(t);const s=new Map;for(const n of e)n&&!n._deleted&&s.set(n.position,n);s.forEach(n=>{const a=n._paneIndex??0,d=i?i(a):void 0,h=at.buildTable(n,d);at.positionTable(h,n.position,d),t.appendChild(h)})}static clearAll(t){for(;t.firstChild;)t.removeChild(t.firstChild)}static buildTable(t,e){const i=document.createElement("table"),s=t.border_width??0,n=t.frame_width??0;if(s>0&&t.border_color||n>0&&t.frame_color?(i.style.borderCollapse="separate",i.style.borderSpacing="0"):i.style.borderCollapse="collapse",i.style.pointerEvents="none",i.style.fontSize="14px",i.style.lineHeight="1.4",i.style.fontFamily="sans-serif",i.style.margin="4px",e&&(i.style.maxHeight=e.height+"px",i.style.maxWidth=e.width+"px",i.style.overflow="hidden"),t.bgcolor){const{color:r,opacity:l}=at.safeParseColor(t.bgcolor);i.style.backgroundColor=r,l<1&&(i.style.opacity=String(l))}if(n>0&&t.frame_color){const{color:r}=at.safeParseColor(t.frame_color);i.style.border=`${n}px solid ${r}`}else i.style.border="none";const a=new Map,d=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 o=r.startRow;o<=r.endRow;o++)for(let f=r.startCol;f<=r.endCol;f++)o===r.startRow&&f===r.startCol||d.add(`${f},${o}`)}const h=s>0&&!!t.border_color,p=h?at.safeParseColor(t.border_color).color:"",g=t.rows||0,c=t.columns||0;for(let r=0;r<g;r++){const l=document.createElement("tr");for(let o=0;o<c;o++){const f=`${o},${r}`;if(d.has(f))continue;const u=document.createElement("td"),y=a.get(f);y&&(y.colspan>1&&(u.colSpan=y.colspan),y.rowspan>1&&(u.rowSpan=y.rowspan)),h?u.style.border=`${s}px solid ${p}`:u.style.border="none";const I=t.cells?.[r]?.[o];if(I&&!I._merged){if(u.textContent=I.text||"",I.bgcolor&&typeof I.bgcolor=="string"&&I.bgcolor.length>0){const{color:A,opacity:k}=at.safeParseColor(I.bgcolor);u.style.backgroundColor=A,k<1&&(u.style.backgroundColor=I.bgcolor)}if(I.text_color){const{color:A}=at.safeParseColor(I.text_color);u.style.color=A}if(u.style.fontSize=at.getSizePixels(I.text_size)+"px",u.style.textAlign=at.mapHAlign(I.text_halign),u.style.verticalAlign=at.mapVAlign(I.text_valign),I.text_font_family==="monospace"&&(u.style.fontFamily="monospace"),I.width>0)if(e){const A=Math.max(1,I.width*e.width/100);u.style.width=A+"px"}else u.style.width=I.width+"%";if(I.height>0)if(e){const A=Math.max(1,I.height*e.height/100);u.style.height=A+"px"}else u.style.height=I.height+"%";I.tooltip&&(u.title=I.tooltip)}const P=I?.height??0;P>0&&e&&P*e.height/100<4?u.style.padding="0":u.style.padding="4px 6px",u.style.whiteSpace="nowrap",l.appendChild(u)}i.appendChild(l)}return i}static positionTable(t,e,i){t.style.position="absolute";const s=8,n=i?i.y+"px":"0",a=i?i.x+"px":"0",d=i?i.y+i.height-s+"px":"0",h=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=n,t.style.left=a;break;case"top_center":t.style.top=n,t.style.left=p,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=g,t.style.left=a,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=h,t.style.transform="translate(-100%, -50%)";break;case"bottom_left":t.style.top=d,t.style.left=a,t.style.transform="translateY(-100%)";break;case"bottom_center":t.style.top=d,t.style.left=p,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"}}}class tt{static parseColor(t){if(!t||typeof t!="string"||t.length===0)return{color:"",opacity:0};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}}if(/^#[0-9a-fA-F]{8}$/.test(t)){const i=parseInt(t.slice(1,3),16),s=parseInt(t.slice(3,5),16),n=parseInt(t.slice(5,7),16),a=parseInt(t.slice(7,9),16)/255;return{color:`rgb(${i},${s},${n})`,opacity:a}}return{color:t,opacity:1}}static getSizePixels(t){if(typeof t=="number"&&t>0)return t;switch(t){case"auto":case"size.auto":return 11;case"tiny":case"size.tiny":return 8;case"small":case"size.small":return 10;case"normal":case"size.normal":return 12;case"large":case"size.large":return 16;case"huge":case"size.huge":return 24;default:return 12}}static mapHAlign(t){switch(t){case"left":case"text.align_left":return"left";case"right":case"text.align_right":return"right";default:return"center"}}static mapVAlign(t){switch(t){case"top":case"text.align_top":return"top";case"bottom":case"text.align_bottom":return"bottom";default:return"middle"}}static buildGraphicElements(t,e){if(!t||t.length===0)return[];const i=new Map;for(const n of t)n&&!n._deleted&&i.set(n.position,n);const s=[];return i.forEach(n=>{const a=n._paneIndex??0,d=e(a);if(!d)return;const h=tt.buildTableElements(n,d);s.push(...h)}),s}static buildTableElements(t,e){const i=t.rows||0,s=t.columns||0;if(i===0||s===0)return[];const n=t.border_width??0,a=t.frame_width??0,d=n>0&&!!t.border_color,h=a>0&&!!t.frame_color,p=new Map,g=new Set;if(t.merges)for(const m of t.merges){p.set(`${m.startCol},${m.startRow}`,{colspan:m.endCol-m.startCol+1,rowspan:m.endRow-m.startRow+1});for(let z=m.startRow;z<=m.endRow;z++)for(let w=m.startCol;w<=m.endCol;w++)z===m.startRow&&w===m.startCol||g.add(`${w},${z}`)}const c=4,r=2,l=1.25,o=[];for(let m=0;m<i;m++){o[m]=[];for(let z=0;z<s;z++){if(g.has(`${z},${m}`)){o[m][z]={text:"",lines:[],fontSize:12,fontFamily:"sans-serif",textColor:{color:"",opacity:0},bgColor:{color:"",opacity:0},halign:"center",valign:"middle",explicitWidth:0,explicitHeight:0,colspan:1,rowspan:1,skip:!0,padX:0,padY:0};continue}const w=t.cells?.[m]?.[z],H=p.get(`${z},${m}`),F=H?.colspan??1,W=H?.rowspan??1,O=w&&!w._merged&&w.text||"",Z=O?O.split(`
|
|
38
|
-
`):[],X=w?tt.getSizePixels(w.text_size):12,B=w?.text_font_family==="monospace"?"monospace":"sans-serif";let R=0,J=0;w?.width>0&&(R=Math.max(1,w.width*e.width/100)),w?.height>0&&(J=Math.max(1,w.height*e.height/100));const it=J>0&&J<4,wt=it?0:c,dt=it?0:r,E=w&&!w._merged&&w.bgcolor&&typeof w.bgcolor=="string"&&w.bgcolor.length>0?w.bgcolor:"",T=w?.text_color||"";o[m][z]={text:O,lines:Z,fontSize:X,fontFamily:B,textColor:T?tt.parseColor(T):{color:"#e0e0e0",opacity:1},bgColor:E?tt.parseColor(E):{color:"",opacity:0},halign:w?tt.mapHAlign(w.text_halign):"center",valign:w?tt.mapVAlign(w.text_valign):"middle",explicitWidth:R,explicitHeight:J,colspan:F,rowspan:W,skip:!1,padX:wt,padY:dt}}}const f=new Array(s).fill(0),u=new Array(i).fill(0);for(let m=0;m<i;m++)for(let z=0;z<s;z++){const w=o[m][z];if(w.skip||w.colspan>1||w.rowspan>1)continue;const H=tt.measureMultiLineWidth(w.lines,w.fontSize,w.fontFamily),F=Math.max(w.lines.length,1),W=w.explicitWidth>0?w.explicitWidth:H+w.padX*2,O=w.explicitHeight>0?w.explicitHeight:F*w.fontSize*l+w.padY*2;f[z]=Math.max(f[z],W),u[m]=Math.max(u[m],O)}for(let m=0;m<s;m++)f[m]===0&&(f[m]=20);for(let m=0;m<i;m++)u[m]===0&&(u[m]=4);for(let m=0;m<i;m++)for(let z=0;z<s;z++){const w=o[m][z];if(w.skip)continue;const H=Math.max(w.lines.length,1),F=w.explicitHeight>0?w.explicitHeight:H*w.fontSize*l+w.padY*2;if(w.colspan>1){const W=tt.sumRange(f,z,w.colspan),O=tt.measureMultiLineWidth(w.lines,w.fontSize,w.fontFamily),Z=w.explicitWidth>0?w.explicitWidth:O+w.padX*2;if(Z>W){const X=(Z-W)/w.colspan;for(let B=0;B<w.colspan;B++)f[z+B]+=X}w.rowspan===1&&(u[m]=Math.max(u[m],F))}if(w.rowspan>1){const W=tt.sumRange(u,m,w.rowspan);if(F>W){const O=(F-W)/w.rowspan;for(let Z=0;Z<w.rowspan;Z++)u[m+Z]+=O}}}for(let m=0;m<s;m++)f[m]=Math.round(f[m]);for(let m=0;m<i;m++)u[m]=Math.round(u[m]);const y=new Array(s+1).fill(0);for(let m=0;m<s;m++)y[m+1]=y[m]+f[m];const I=new Array(i+1).fill(0);for(let m=0;m<i;m++)I[m+1]=I[m]+u[m];const P=h?a:0,A=y[s]+P*2,k=I[i]+P*2,x=Math.min(A,e.width),v=Math.min(k,e.height),C=tt.computePosition(t.position,e,x,v),S=Math.round(C.x),_=Math.round(C.y),M=[],D=S+P,N=_+P;if(t.bgcolor){const{color:m,opacity:z}=tt.parseColor(t.bgcolor);z>0&&M.push({type:"rect",shape:{x:S,y:_,width:x,height:v},style:{fill:m,opacity:z},silent:!0,z:0,z2:0})}if(h){const{color:m}=tt.parseColor(t.frame_color),z=a/2;M.push({type:"rect",shape:{x:S+z,y:_+z,width:x-a,height:v-a},style:{fill:"none",stroke:m,lineWidth:a},silent:!0,z:0,z2:1})}const L=d?tt.parseColor(t.border_color).color:"";for(let m=0;m<i;m++)for(let z=0;z<s;z++){const w=o[m][z];if(w.skip)continue;const H=D+y[z],F=N+I[m],W=tt.sumRange(f,z,w.colspan),O=tt.sumRange(u,m,w.rowspan);if(H-S>=x||F-_>=v)continue;const Z=Math.min(W,x-(H-S)),X=Math.min(O,v-(F-_));if(w.bgColor.opacity>0&&M.push({type:"rect",shape:{x:H,y:F,width:Z,height:X},style:{fill:w.bgColor.color,opacity:w.bgColor.opacity},silent:!0,z:0,z2:2}),d&&M.push({type:"rect",shape:{x:H,y:F,width:Z,height:X},style:{fill:"none",stroke:L,lineWidth:n},silent:!0,z:0,z2:3}),w.text){let B,R;switch(w.halign){case"left":B=H+w.padX,R="left";break;case"right":B=H+Z-w.padX,R="right";break;default:B=H+Z/2,R="center";break}let J,it;switch(w.valign){case"top":J=F+w.padY,it="top";break;case"bottom":J=F+X-w.padY,it="bottom";break;default:J=F+X/2,it="middle";break}M.push({type:"text",x:B,y:J,style:{text:w.text,fill:w.textColor.color,opacity:w.textColor.opacity,font:`${w.fontSize}px ${w.fontFamily}`,textAlign:R,textVerticalAlign:it,lineHeight:Math.round(w.fontSize*l)},silent:!0,z:0,z2:4})}}return M}static computePosition(t,e,i,s){const n=e.x,a=e.y,d=e.width,h=e.height;switch(t){case"top_left":return{x:n+4,y:a+4};case"top_center":return{x:n+(d-i)/2,y:a+4};case"top_right":return{x:n+d-i-4,y:a+4};case"middle_left":return{x:n+4,y:a+(h-s)/2};case"middle_center":return{x:n+(d-i)/2,y:a+(h-s)/2};case"middle_right":return{x:n+d-i-4,y:a+(h-s)/2};case"bottom_left":return{x:n+4,y:a+h-s-4};case"bottom_center":return{x:n+(d-i)/2,y:a+h-s-4};case"bottom_right":return{x:n+d-i-4,y:a+h-s-4};default:return{x:n+d-i-4,y:a+4}}}static measureMultiLineWidth(t,e,i){if(!t||t.length===0)return 0;const s=i==="monospace"?.6:.55;let n=0;for(const a of t)n=Math.max(n,a.length*e*s);return n}static sumRange(t,e,i){let s=0;for(let n=e;n<e+i&&n<t.length;n++)s+=t[n];return s}}var ge=Object.defineProperty,ye=(b,t,e)=>t in b?ge(b,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):b[t]=e,$=(b,t,e)=>(ye(b,typeof t!="symbol"?t+"":t,e),e);class xe{constructor(t,e={}){$(this,"chart"),$(this,"options"),$(this,"marketData",[]),$(this,"indicators",new Map),$(this,"timeToIndex",new Map),$(this,"pluginManager"),$(this,"drawingEditor"),$(this,"events",new fe),$(this,"isMainCollapsed",!1),$(this,"maximizedPaneId",null),$(this,"countdownInterval",null),$(this,"selectedDrawingId",null),$(this,"drawings",[]),$(this,"coordinateConversion",{pixelToData:a=>{const d=this.chart.getOption();if(!d||!d.grid)return null;const h=d.grid.length;for(let p=0;p<h;p++)if(this.chart.containPixel({gridIndex:p},[a.x,a.y])){this.chart.convertFromPixel({seriesIndex:p},[a.x,a.y]);const g=this.chart.convertFromPixel({gridIndex:p},[a.x,a.y]);if(g)return{timeIndex:Math.round(g[0])-this.dataIndexOffset,value:g[1],paneIndex:p}}return null},dataToPixel:a=>{const d=a.paneIndex||0,h=this.chart.convertToPixel({gridIndex:d},[a.timeIndex+this.dataIndexOffset,a.value]);return h?{x:h[0],y:h[1]}:null}}),$(this,"upColor","#00da3c"),$(this,"downColor","#ec0000"),$(this,"defaultPadding",0),$(this,"padding"),$(this,"dataIndexOffset",0),$(this,"_paddingPoints",0),$(this,"LAZY_MIN_PADDING",5),$(this,"LAZY_MAX_PADDING",500),$(this,"LAZY_CHUNK_SIZE",50),$(this,"LAZY_EDGE_THRESHOLD",10),$(this,"_expandScheduled",!1),$(this,"rootContainer"),$(this,"layoutContainer"),$(this,"toolbarContainer"),$(this,"leftSidebar"),$(this,"rightSidebar"),$(this,"chartContainer"),$(this,"overlayContainer"),$(this,"_lastTables",[]),$(this,"_tableGraphicIds",[]),$(this,"_baseGraphics",[]),$(this,"_labelTooltipEl",null),$(this,"_lastLayout",null),$(this,"_mainHeightOverride",null),$(this,"_paneDragState",null),$(this,"_paneResizeRafId",null),$(this,"onKeyDown",a=>{(a.key==="Delete"||a.key==="Backspace")&&this.selectedDrawingId&&(this.removeDrawing(this.selectedDrawingId),this.selectedDrawingId=null,this.render())}),$(this,"onFullscreenChange",()=>{this.render()}),$(this,"isLocked",!1),$(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=q.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 re(this,this.toolbarContainer),this.drawingEditor=new ce(this),this.chart.on("dataZoom",a=>{this.events.emit("chart:dataZoom",a);const d=this.options.databox?.triggerOn,h=this.options.databox?.position;d==="click"&&h==="floating"&&this.chart.dispatchAction({type:"hideTip"}),this._checkEdgeAndExpand()}),this.chart.on("finished",a=>this.events.emit("chart:updated",a)),this.chart.getZr().on("mousedown",a=>{this._paneDragState||this.events.emit("mouse:down",a)}),this.chart.getZr().on("mousemove",a=>{this._paneDragState||this.events.emit("mouse:move",a)}),this.chart.getZr().on("mouseup",a=>this.events.emit("mouse:up",a)),this.chart.getZr().on("click",a=>{this._paneDragState||this.events.emit("mouse:click",a)});const i=this.chart.getZr(),s=i.setCursorStyle,n=this;i.setCursorStyle=function(a){if(n._paneDragState){s.call(this,"row-resize");return}a==="grab"&&(a="crosshair"),s.call(this,a)},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 n=this.chart.getHeight();if(n<=0)return null;for(const a of this._lastLayout.paneBoundaries){const d=a.yPercent/100*n;if(Math.abs(s-d)<=6){if(a.aboveId==="main"&&this.isMainCollapsed||this.indicators.get(a.belowId)?.collapsed||a.aboveId!=="main"&&this.indicators.get(a.aboveId)?.collapsed)continue;return a}}return null},i=s=>s==="main"?this._lastLayout?.mainPaneHeight??50:this.indicators.get(s)?.height??15;t.on("mousemove",s=>{if(this._paneDragState){const n=s.offsetY-this._paneDragState.startY,a=this.chart.getHeight();if(a<=0)return;const d=n/a*100,h=this._paneDragState.aboveId==="main"?10:5,p=5;let g=this._paneDragState.startAboveHeight+d,c=this._paneDragState.startBelowHeight-d;if(g<h&&(g=h,c=this._paneDragState.startAboveHeight+this._paneDragState.startBelowHeight-h),c<p&&(c=p,g=this._paneDragState.startAboveHeight+this._paneDragState.startBelowHeight-p),this._paneDragState.aboveId==="main")this._mainHeightOverride=g;else{const l=this.indicators.get(this._paneDragState.aboveId);l&&(l.height=g)}const r=this.indicators.get(this._paneDragState.belowId);r&&(r.height=c),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 n=e(s.offsetY);n&&(this._paneDragState={startY:s.offsetY,aboveId:n.aboveId,belowId:n.belowId,startAboveHeight:i(n.aboveId),startBelowHeight:i(n.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 n=parseInt(s[1]),a=this.drawings.filter(h=>(h.paneIndex||0)===n)[i.dataIndex];if(!a)return null;const d=i.event?.target?.name;return{drawing:a,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 a=s.drawing.id===this.selectedDrawingId;t&&(clearTimeout(t),t=null),a||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 a=s.targetName==="point-start"?0:1;this.events.emit("drawing:point:hover",{id:s.drawing.id,pointIndex:a}),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(a=>{a.name&&a.name.startsWith("point")&&a.attr("style",{opacity:0})})}},50),s.targetName==="line")this.events.emit("drawing:mouseout",{id:s.drawing.id});else if(s.targetName?.startsWith("point")){const a=s.targetName==="point-start"?0:1;this.events.emit("drawing:point:mouseout",{id:s.drawing.id,pointIndex:a})}this.chart.getZr().setCursorStyle("default")}}),this.chart.on("mousedown",i=>{const s=e(i);if(!s)return;const n=i.event?.event||i.event,a=n?.offsetX,d=n?.offsetY;if(s.targetName==="line")this.events.emit("drawing:mousedown",{id:s.drawing.id,x:a,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:a,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())}),this._labelTooltipEl=document.createElement("div"),this._labelTooltipEl.style.cssText="position:absolute;display:none;pointer-events:none;z-index:200;background:rgba(30,41,59,0.95);color:#fff;border:1px solid #475569;border-radius:4px;padding:6px 10px;font-size:12px;line-height:1.5;white-space:pre-wrap;max-width:350px;box-shadow:0 2px 8px rgba(0,0,0,0.3);font-family:"+(this.options.fontFamily||"sans-serif")+";",this.chartContainer.appendChild(this._labelTooltipEl),this.chart.on("mouseover",{seriesType:"scatter"},i=>{const s=i.data?._tooltipText;if(!s||!this._labelTooltipEl)return;this._labelTooltipEl.textContent=s,this._labelTooltipEl.style.display="block";const n=this.chartContainer.getBoundingClientRect(),a=i.event?.event;if(a){const d=a.clientX-n.left,h=a.clientY-n.top,p=this._labelTooltipEl.offsetWidth,g=Math.min(d-p/2,n.width-p-8);this._labelTooltipEl.style.left=Math.max(4,g)+"px",this._labelTooltipEl.style.top=h+18+"px"}}),this.chart.on("mouseout",{seriesType:"scatter"},()=>{this._labelTooltipEl&&(this._labelTooltipEl.style.display="none")})}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(u=>{e.set(u.time,u)}),t.forEach(u=>{e.has(u.time),e.set(u.time,u)}),this.marketData=Array.from(e.values()).sort((u,y)=>u.time-y.time),this.rebuildTimeIndex();const i=this.dataIndexOffset,s=mt.buildCandlestickSeries(this.marketData,this.options),n={value:[NaN,NaN,NaN,NaN],itemStyle:{opacity:0}},a=[...Array(i).fill(n),...s.data,...Array(i).fill(n)],d=[...Array(i).fill(""),...this.marketData.map(u=>new Date(u.time).toLocaleString()),...Array(i).fill("")],h=this.chart.getOption(),p=_t.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:c,barColors:r}=mt.buildIndicatorSeries(this.indicators,this.timeToIndex,p.paneLayout,d.length,i,g,p.overlayYAxisMap,p.separatePaneYAxisOffset),l=a.map((u,y)=>r[y]?{value:u.value||u,itemStyle:{color:r[y],color0:r[y]}}:u),o={xAxis:h.xAxis.map((u,y)=>({data:d})),series:[{data:l,markLine:s.markLine},...c]};this.chart.setOption(o,{notMerge:!1});const f=[];this.indicators.forEach(u=>{Object.values(u.plots).forEach(y=>{y.options?.style==="table"&&y.data?.forEach(I=>{(Array.isArray(I.value)?I.value:[I.value]).forEach(P=>{P&&!P._deleted&&(P._paneIndex=P.force_overlay?0:u.paneIndex,f.push(P))})})})}),this._lastTables=f,this._renderTableOverlays(),this.startCountdown()}startCountdown(){if(this.stopCountdown(),!this.options.lastPriceLine?.showCountdown||this.marketData.length===0)return;let t=this.options.interval;if(!t&&this.marketData.length>=2){const i=this.marketData[this.marketData.length-1],s=this.marketData[this.marketData.length-2];t=i.time-s.time}if(!t)return;const e=()=>{if(this.marketData.length===0)return;const i=this.marketData[this.marketData.length-1].time+t,s=Date.now(),n=i-s;if(n<=0)return;const a=Math.abs(n),d=Math.floor(a/36e5),h=Math.floor(a%36e5/6e4),p=Math.floor(a%6e4/1e3),g=`${d>0?d.toString().padStart(2,"0")+":":""}${h.toString().padStart(2,"0")}:${p.toString().padStart(2,"0")}`,c=this.chart.getOption();if(!c||!c.series)return;const r=c.series.findIndex(I=>I.type==="candlestick");if(r===-1)return;const l=c.series[r];if(!l.markLine||!l.markLine.data||!l.markLine.data[0])return;const o=l.markLine.data[0];o.label.formatter;const f=o.yAxis;let u="";if(this.options.yAxisLabelFormatter)u=this.options.yAxisLabelFormatter(f);else{const I=this.options.yAxisDecimalPlaces!==void 0?this.options.yAxisDecimalPlaces:V.autoDetectDecimals(this.marketData);u=V.formatValue(f,I)}const y=`${u}
|
|
39
|
-
${g}`;this.chart.setOption({series:[{name:this.options.title||"Market",markLine:{data:[{...o,label:{...o.label,formatter:y}}]}}]})};e(),this.countdownInterval=setInterval(e,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 a=new Tt(t,e,n,{height:i.height,collapsed:!1,titleColor:i.titleColor,controls:i.controls});return this.indicators.set(t,a),this.render(),a}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()}_buildTableGraphics(){const t=this.chart.getModel(),e=s=>t.getComponent("grid",s)?.coordinateSystem?.getRect(),i=tt.buildGraphicElements(this._lastTables,e);this._tableGraphicIds=[];for(let s=0;s<i.length;s++){const n=`__qf_table_${s}`;i[s].id=n,this._tableGraphicIds.push(n)}return i}_renderTableOverlays(){const t=this._buildTableGraphics(),e=[...this._baseGraphics,...t];this.chart.setOption({graphic:e},{replaceMerge:["graphic"]}),at.clearAll(this.overlayContainer)}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._paddingPoints=Math.max(this._paddingPoints,e,this.LAZY_MIN_PADDING),this.dataIndexOffset=this._paddingPoints}expandPadding(t){this._resizePadding(t)}_resizePadding(t){const e=Math.ceil(this.marketData.length*this.padding);if(t=Math.max(t,e,this.LAZY_MIN_PADDING),t=Math.min(t,this.LAZY_MAX_PADDING),t===this._paddingPoints)return;const i=this._paddingPoints,s=this.marketData.length+2*i,n=this.chart.getOption(),a=n?.dataZoom?.find(_=>_.type==="slider"||_.type==="inside"),d=a?a.start/100*s:0,h=a?a.end/100*s:s,p=t-i;this._paddingPoints=t,this.dataIndexOffset=this._paddingPoints;const g=this._paddingPoints,c={value:[NaN,NaN,NaN,NaN],itemStyle:{opacity:0}},r=mt.buildCandlestickSeries(this.marketData,this.options),l=[...Array(g).fill(c),...r.data,...Array(g).fill(c)],o=[...Array(g).fill(""),...this.marketData.map(_=>new Date(_.time).toLocaleString()),...Array(g).fill("")],f=[...Array(g).fill(null),...this.marketData,...Array(g).fill(null)],u=_t.calculate(this.chart.getHeight(),this.indicators,this.options,this.isMainCollapsed,this.maximizedPaneId,this.marketData,this._mainHeightOverride??void 0),{series:y,barColors:I}=mt.buildIndicatorSeries(this.indicators,this.timeToIndex,u.paneLayout,o.length,g,f,u.overlayYAxisMap,u.separatePaneYAxisOffset),P=l.map((_,M)=>I[M]?{value:_.value||_,itemStyle:{color:I[M],color0:I[M]}}:_),A=this.marketData.length+2*t,k=Math.max(0,(d+p)/A*100),x=Math.min(100,(h+p)/A*100),v=[],C=new Map;this.drawings.forEach(_=>{const M=_.paneIndex||0;C.has(M)||C.set(M,[]),C.get(M).push(_)}),C.forEach(_=>{v.push({data:_.map(M=>[M.points[0].timeIndex+this.dataIndexOffset,M.points[0].value,M.points[1].timeIndex+this.dataIndexOffset,M.points[1].value])})});const S={xAxis:n.xAxis.map(()=>({data:o})),dataZoom:[{start:k,end:x},{start:k,end:x}],series:[{data:P,markLine:r.markLine},...y.map(_=>{const M={data:_.data};return _.renderItem&&(M.renderItem=_.renderItem),M}),...v]};this.chart.setOption(S,{notMerge:!1})}_checkEdgeAndExpand(){if(this._expandScheduled)return;const t=this.chart.getOption()?.dataZoom?.find(f=>f.type==="slider"||f.type==="inside");if(!t)return;const e=this._paddingPoints,i=this.marketData.length,s=i+2*e,n=Math.round(t.start/100*s),a=Math.round(t.end/100*s),d=e,h=e+i-1,p=Math.max(0,Math.min(a,h)-Math.max(n,d)+1),g=n<this.LAZY_EDGE_THRESHOLD,c=a>s-this.LAZY_EDGE_THRESHOLD;if((g||c)&&e<this.LAZY_MAX_PADDING&&p>=3){this._expandScheduled=!0,requestAnimationFrame(()=>{this._expandScheduled=!1,this._resizePadding(e+this.LAZY_CHUNK_SIZE)});return}const r=Math.max(0,e-n),l=Math.max(0,a-(e+i-1)),o=Math.max(r+this.LAZY_CHUNK_SIZE,l+this.LAZY_CHUNK_SIZE);e>o+this.LAZY_CHUNK_SIZE&&(this._expandScheduled=!0,requestAnimationFrame(()=>{this._expandScheduled=!1,this._resizePadding(o)}))}render(){if(this.marketData.length===0)return;let t=null;try{const x=this.chart.getOption();if(x&&x.dataZoom&&x.dataZoom.length>0){const v=x.dataZoom.find(C=>C.type==="slider"||C.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",a=e==="right"?"block":"none";(i!==n||s!==a)&&(this.leftSidebar.style.display=n,this.rightSidebar.style.display=a,this.chart.resize());const d=this.dataIndexOffset,h=[...Array(d).fill(""),...this.marketData.map(x=>new Date(x.time).toLocaleString()),...Array(d).fill("")],p=_t.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 x=this.marketData.length,v=h.length,C=d/v,S=x/v;p.dataZoom.forEach(_=>{if(_.start!==void 0){const M=_.start/100,D=C+M*S;_.start=D*100}if(_.end!==void 0){const M=_.end/100,D=C+M*S;_.end=D*100}})}t&&p.dataZoom&&p.dataZoom.forEach(x=>{x.start=t.start,x.end=t.end}),p.xAxis.forEach(x=>{x.data=h,x.boundaryGap=!1});const g=mt.buildCandlestickSeries(this.marketData,this.options),c={value:[NaN,NaN,NaN,NaN],itemStyle:{opacity:0}};g.data=[...Array(d).fill(c),...g.data,...Array(d).fill(c)];const r=[...Array(d).fill(null),...this.marketData,...Array(d).fill(null)],{series:l,barColors:o}=mt.buildIndicatorSeries(this.indicators,this.timeToIndex,p.paneLayout,h.length,d,r,p.overlayYAxisMap,p.separatePaneYAxisOffset);g.data=g.data.map((x,v)=>o[v]?{value:x.value||x,itemStyle:{color:o[v],color0:o[v]}}:x);const f=[];this.indicators.forEach((x,v)=>{x.paneIndex===0&&f.push({id:v,titleColor:x.titleColor})});const u=se.build(p,this.options,this.toggleIndicator.bind(this),this.isMainCollapsed,this.maximizedPaneId,f),y=new Map;this.drawings.forEach(x=>{const v=x.paneIndex||0;y.has(v)||y.set(v,[]),y.get(v).push(x)});const I=[];y.forEach((x,v)=>{I.push({type:"custom",name:`drawings-pane-${v}`,xAxisIndex:v,yAxisIndex:v,clip:!0,renderItem:(C,S)=>{const _=x[C.dataIndex];if(!_)return;const M=_.points[0],D=_.points[1];if(!M||!D)return;const N=this.dataIndexOffset,L=S.coord([M.timeIndex+N,M.value]),m=S.coord([D.timeIndex+N,D.value]),z=_.id===this.selectedDrawingId;if(_.type==="line")return{type:"group",children:[{type:"line",name:"line",shape:{x1:L[0],y1:L[1],x2:m[0],y2:m[1]},style:{stroke:_.style?.color||"#3b82f6",lineWidth:_.style?.lineWidth||2}},{type:"circle",name:"point-start",shape:{cx:L[0],cy:L[1],r:4},style:{fill:"#fff",stroke:_.style?.color||"#3b82f6",lineWidth:1,opacity:z?1:0}},{type:"circle",name:"point-end",shape:{cx:m[0],cy:m[1],r:4},style:{fill:"#fff",stroke:_.style?.color||"#3b82f6",lineWidth:1,opacity:z?1:0}}]};if(_.type==="fibonacci"){const w=L[0],H=L[1],F=m[0],W=m[1],O=Math.min(w,F),Z=Math.max(w,F),X=Z-O,B=W-H,R=[0,.236,.382,.5,.618,.786,1],J=["#787b86","#f44336","#ff9800","#4caf50","#2196f3","#00bcd4","#787b86"],it=[];it.push({type:"line",name:"line",shape:{x1:w,y1:H,x2:F,y2:W},style:{stroke:"#999",lineWidth:1,lineDash:[4,4]}}),it.push({type:"circle",name:"point-start",shape:{cx:w,cy:H,r:4},style:{fill:"#fff",stroke:_.style?.color||"#3b82f6",lineWidth:1,opacity:z?1:0},z:100}),it.push({type:"circle",name:"point-end",shape:{cx:F,cy:W,r:4},style:{fill:"#fff",stroke:_.style?.color||"#3b82f6",lineWidth:1,opacity:z?1:0},z:100}),R.forEach((E,T)=>{const G=W-B*E,j=J[T%J.length];it.push({type:"line",name:"fib-line",shape:{x1:O,y1:G,x2:Z,y2:G},style:{stroke:j,lineWidth:1},silent:!0});const st=_.points[0].value,Y=_.points[1].value,ot=Y-st,ht=Y-ot*E;if(it.push({type:"text",style:{text:`${E} (${ht.toFixed(2)})`,x:O+5,y:G-10,fill:j,fontSize:10},silent:!0}),T<R.length-1){const U=R[T+1],K=W-B*U,pt=Math.abs(K-G),ut=Math.min(G,K);it.push({type:"rect",shape:{x:O,y:ut,width:X,height:pt},style:{fill:J[(T+1)%J.length],opacity:.1},silent:!0})}});const wt=[],dt=[];return R.forEach((E,T)=>{const G=W-B*E,j=J[T%J.length];dt.push({type:"line",shape:{x1:O,y1:G,x2:Z,y2:G},style:{stroke:j,lineWidth:1},silent:!0});const st=_.points[0].value,Y=_.points[1].value,ot=Y-st,ht=Y-ot*E;if(dt.push({type:"text",style:{text:`${E} (${ht.toFixed(2)})`,x:O+5,y:G-10,fill:j,fontSize:10},silent:!0}),T<R.length-1){const U=R[T+1],K=W-B*U,pt=Math.abs(K-G),ut=Math.min(G,K);wt.push({type:"rect",name:"line",shape:{x:O,y:ut,width:X,height:pt},style:{fill:J[(T+1)%J.length],opacity:.1}})}}),{type:"group",children:[...wt,...dt,{type:"line",name:"line",shape:{x1:w,y1:H,x2:F,y2:W},style:{stroke:"#999",lineWidth:1,lineDash:[4,4]}},{type:"circle",name:"point-start",shape:{cx:w,cy:H,r:4},style:{fill:"#fff",stroke:_.style?.color||"#3b82f6",lineWidth:1,opacity:z?1:0},z:100},{type:"circle",name:"point-end",shape:{cx:F,cy:W,r:4},style:{fill:"#fff",stroke:_.style?.color||"#3b82f6",lineWidth:1,opacity:z?1:0},z:100}]}}},data:x.map(C=>[C.points[0].timeIndex+this.dataIndexOffset,C.points[0].value,C.points[1].timeIndex+this.dataIndexOffset,C.points[1].value]),encode:{x:[0,2],y:[1,3]},z:100,silent:!1})});const P=x=>{const v=oe.format(x,this.options),C=this.options.databox?.position;return C==="left"?(this.leftSidebar.innerHTML=v,""):C==="right"?(this.rightSidebar.innerHTML=v,""):this.options.databox?`<div style="min-width: 200px;">${v}</div>`:""},A=[];this.indicators.forEach(x=>{Object.values(x.plots).forEach(v=>{v.options?.style==="table"&&v.data?.forEach(C=>{(Array.isArray(C.value)?C.value:[C.value]).forEach(S=>{S&&!S._deleted&&(S._paneIndex=S.force_overlay?0:x.paneIndex,A.push(S))})})})});const k={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:P,extraCssText:e!=="floating"&&e!==void 0?"display: none !important;":void 0,position:(x,v,C,S,_)=>{if(this.options.databox?.position==="floating"){const M={top:10};return M[["left","right"][+(x[0]<_.viewSize[0]/2)]]=30,M}return null}},axisPointer:{link:{xAxisIndex:"all"},label:{backgroundColor:"#475569"}},graphic:u,grid:p.grid,xAxis:p.xAxis,yAxis:p.yAxis,dataZoom:p.dataZoom,series:[g,...l,...I]};if(this.chart.setOption(k,!0),this._baseGraphics=u,this._lastTables=A,A.length>0){const x=this._buildTableGraphics();if(x.length>0){const v=[...u,...x];this.chart.setOption({graphic:v},{replaceMerge:["graphic"]})}}else this._tableGraphicIds=[];at.clearAll(this.overlayContainer)}}var me=Object.defineProperty,be=(b,t,e)=>t in b?me(b,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):b[t]=e,It=(b,t,e)=>(be(b,typeof t!="symbol"?t+"":t,e),e);class Ct{constructor(t){It(this,"id"),It(this,"name"),It(this,"icon"),It(this,"context"),It(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 we=Object.defineProperty,ve=(b,t,e)=>t in b?we(b,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):b[t]=e,et=(b,t,e)=>(ve(b,typeof t!="symbol"?t+"":t,e),e);class Ie extends Ct{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>'}),et(this,"zr"),et(this,"state","idle"),et(this,"startPoint",null),et(this,"endPoint",null),et(this,"group",null),et(this,"rect",null),et(this,"labelRect",null),et(this,"labelText",null),et(this,"lineV",null),et(this,"lineH",null),et(this,"arrowStart",null),et(this,"arrowEnd",null),et(this,"onMouseDown",()=>{this.state==="finished"&&this.removeGraphic()}),et(this,"onChartInteraction",()=>{this.group&&this.removeGraphic()}),et(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())}),et(this,"clearHandlers",{}),et(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 q.graphic.Group,this.rect=new q.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 q.graphic.Line({shape:{x1:0,y1:0,x2:0,y2:0},style:{stroke:"#fff",lineWidth:1,lineDash:[4,4]},z:101}),this.lineH=new q.graphic.Line({shape:{x1:0,y1:0,x2:0,y2:0},style:{stroke:"#fff",lineWidth:1,lineDash:[4,4]},z:101}),this.arrowStart=new q.graphic.Polygon({shape:{points:[[0,0],[-5,10],[5,10]]},style:{fill:"#fff"},z:102}),this.arrowEnd=new q.graphic.Polygon({shape:{points:[[0,0],[-5,-10],[5,-10]]},style:{fill:"#fff"},z:102}),this.labelRect=new q.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 q.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}),a=this.context.coordinateConversion.pixelToData({x:i,y:s});if(!n||!a)return;const d=Math.round(n.timeIndex),h=Math.round(a.timeIndex),p=n.value,g=a.value,c=h-d,r=g-p,l=r/p*100,o=r>=0,f=o?"rgba(33, 150, 243, 0.2)":"rgba(236, 0, 0, 0.2)",u=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:f});const y=(t+i)/2,I=(e+s)/2;this.lineV.setShape({x1:y,y1:e,x2:y,y2:s}),this.lineV.setStyle({stroke:u}),this.lineH.setShape({x1:t,y1:I,x2:i,y2:I}),this.lineH.setStyle({stroke:u});const P=Math.min(e,s),A=Math.max(e,s);this.arrowStart.setStyle({fill:"none"}),this.arrowEnd.setStyle({fill:"none"}),o?(this.arrowStart.setShape({points:[[y,P],[y-4,P+6],[y+4,P+6]]}),this.arrowStart.setStyle({fill:u})):(this.arrowEnd.setShape({points:[[y,A],[y-4,A-6],[y+4,A-6]]}),this.arrowEnd.setStyle({fill:u}));const k=[`${r.toFixed(2)} (${l.toFixed(2)}%)`,`${c} bars, ${(c*0).toFixed(0)}d`].join(`
|
|
40
|
-
`),x=140,v=40,C=Math.max(e,s),S=Math.min(e,s);let _=(t+i)/2-x/2,M=C+10;const D=this.chart.getHeight();M+v>D&&(M=S-v-10),this.labelRect.setShape({x:_,y:M,width:x,height:v}),this.labelRect.setStyle({fill:"#1e293b",stroke:u,lineWidth:1}),this.labelText.setStyle({x:_+x/2,y:M+v/2,text:k,fill:"#fff"})}}var Ae=Object.defineProperty,Ce=(b,t,e)=>t in b?Ae(b,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):b[t]=e,lt=(b,t,e)=>(Ce(b,typeof t!="symbol"?t+"":t,e),e);class _e extends Ct{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>'}),lt(this,"zr"),lt(this,"state","idle"),lt(this,"startPoint",null),lt(this,"endPoint",null),lt(this,"group",null),lt(this,"line",null),lt(this,"startCircle",null),lt(this,"endCircle",null),lt(this,"onMouseDown",()=>{}),lt(this,"onChartInteraction",()=>{}),lt(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()}}),lt(this,"clearHandlers",{}),lt(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 q.graphic.Group,this.line=new q.graphic.Line({shape:{x1:0,y1:0,x2:0,y2:0},style:{stroke:"#3b82f6",lineWidth:2},z:100}),this.startCircle=new q.graphic.Circle({shape:{cx:0,cy:0,r:4},style:{fill:"#fff",stroke:"#3b82f6",lineWidth:1},z:101}),this.endCircle=new q.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 Se=Object.defineProperty,ke=(b,t,e)=>t in b?Se(b,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):b[t]=e,gt=(b,t,e)=>(ke(b,typeof t!="symbol"?t+"":t,e),e);class Me extends Ct{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>'}),gt(this,"startPoint",null),gt(this,"endPoint",null),gt(this,"state","idle"),gt(this,"graphicGroup",null),gt(this,"levels",[0,.236,.382,.5,.618,.786,1]),gt(this,"colors",["#787b86","#f44336","#ff9800","#4caf50","#2196f3","#00bcd4","#787b86"]),gt(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())}),gt(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 q.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 q.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 a=Math.min(t,i),d=Math.max(t,i),h=d-a,p=s-e;this.levels.forEach((g,c)=>{const r=s-p*g,l=this.colors[c%this.colors.length],o=new q.graphic.Line({shape:{x1:a,y1:r,x2:d,y2:r},style:{stroke:l,lineWidth:1},silent:!0});if(this.graphicGroup.add(o),c<this.levels.length-1){const f=this.levels[c+1],u=s-p*f,y=Math.abs(u-r),I=Math.min(r,u),P=new q.graphic.Rect({shape:{x:a,y:I,width:h,height:y},style:{fill:this.colors[(c+1)%this.colors.length],opacity:.1},silent:!0});this.graphicGroup.add(P)}})}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}})}}}ct.AbstractPlugin=Ct,ct.FibonacciTool=Me,ct.LineTool=_e,ct.MeasureTool=Ie,ct.QFChart=xe});
|
|
35
|
+
<div>${g.marker} <span style="color: #cbd5e1;">${g.displayName}</span></div>
|
|
36
|
+
<div style="font-size: 10px; color: #fff;padding-left:10px;">${y}</div>
|
|
37
|
+
</div>`}),a+="</div>"})}return a}}var Ii=Object.defineProperty,Si=(l,t,e)=>t in l?Ii(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,St=(l,t,e)=>(Si(l,typeof t!="symbol"?t+"":t,e),e);class Ai{constructor(t,e){St(this,"plugins",new Map),St(this,"activePluginId",null),St(this,"context"),St(this,"toolbarContainer"),St(this,"tooltipElement",null),St(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(),r=i.top+(i.height-s.height)/2,n=i.right+10;this.tooltipElement.style.top=`${r}px`,this.tooltipElement.style.left=`${n}px`,requestAnimationFrame(()=>{this.tooltipElement&&(this.tooltipElement.style.opacity="1",this.tooltipElement.style.transform="translateX(0)")})}hideTooltip(){this.tooltipElement&&(this.tooltipElement.style.opacity="0",this.tooltipElement.style.transform="translateX(-5px)",this.hideTimeout&&clearTimeout(this.hideTimeout),this.hideTimeout=setTimeout(()=>{this.tooltipElement&&(this.tooltipElement.style.display="none"),this.hideTimeout=null},150))}register(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 Mi=Object.defineProperty,_i=(l,t,e)=>t in l?Mi(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,nt=(l,t,e)=>(_i(l,typeof t!="symbol"?t+"":t,e),e);class Gi{constructor(t){nt(this,"context"),nt(this,"isEditing",!1),nt(this,"currentDrawing",null),nt(this,"editingPointIndex",null),nt(this,"zr"),nt(this,"editGroup",null),nt(this,"editLines",[]),nt(this,"editPoints",[]),nt(this,"isMovingShape",!1),nt(this,"dragStart",null),nt(this,"initialPixelPoints",[]),nt(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 r=this.context.coordinateConversion.dataToPixel(s);return r?{x:r.x,y:r.y}:{x:0,y:0}}),this.context.lockChart(),this.createEditGraphic(),this.zr.on("mousemove",this.onMouseMove),this.zr.on("mouseup",this.onMouseUp),window.addEventListener("mouseup",this.onWindowMouseUp))}),nt(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.initialPixelPoints=i.points.map(s=>{const r=this.context.coordinateConversion.dataToPixel(s);return r?{x:r.x,y:r.y}:{x:0,y:0}}),this.context.lockChart(),this.createEditGraphic(),this.zr.on("mousemove",this.onMouseMove),this.zr.on("mouseup",this.onMouseUp),window.addEventListener("mouseup",this.onWindowMouseUp))}),nt(this,"onMouseMove",e=>{if(!this.isEditing||!this.currentDrawing)return;const i=e.offsetX,s=e.offsetY;if(this.isMovingShape&&this.dragStart){const r=i-this.dragStart.x,n=s-this.dragStart.y,h=this.initialPixelPoints.map(a=>({x:a.x+r,y:a.y+n}));for(let a=0;a<this.editLines.length;a++)this.editLines[a].setShape({x1:h[a].x,y1:h[a].y,x2:h[a+1].x,y2:h[a+1].y});for(let a=0;a<this.editPoints.length;a++)this.editPoints[a].setShape({cx:h[a].x,cy:h[a].y})}else if(this.editingPointIndex!==null){const r=this.initialPixelPoints.map(n=>({x:n.x,y:n.y}));r[this.editingPointIndex]={x:i,y:s};for(let n=0;n<this.editLines.length;n++)this.editLines[n].setShape({x1:r[n].x,y1:r[n].y,x2:r[n+1].x,y2:r[n+1].y});this.editPoints[this.editingPointIndex].setShape({cx:i,cy:s})}}),nt(this,"onMouseUp",e=>{this.isEditing&&this.finishEditing(e.offsetX,e.offsetY)}),nt(this,"onWindowMouseUp",e=>{if(!this.isEditing)return;const i=this.zr.dom;if(i){const s=i.getBoundingClientRect(),r=e.clientX-s.left,n=e.clientY-s.top;this.finishEditing(r,n)}else this.finishEditing(this.dragStart?.x??0,this.dragStart?.y??0)}),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 D.graphic.Group,this.editLines=[],this.editPoints=[];const t=this.currentDrawing.points.map(i=>{const s=this.context.coordinateConversion.dataToPixel(i);return s?{x:s.x,y:s.y}:null});if(t.some(i=>!i))return;const e=t;for(let i=0;i<e.length-1;i++){const s=new D.graphic.Line({shape:{x1:e[i].x,y1:e[i].y,x2:e[i+1].x,y2:e[i+1].y},style:{stroke:this.currentDrawing.style?.color||"#3b82f6",lineWidth:this.currentDrawing.style?.lineWidth||2,lineDash:[4,4]},silent:!0});this.editLines.push(s),this.editGroup.add(s)}for(let i=0;i<e.length;i++){const s=new D.graphic.Circle({shape:{cx:e[i].x,cy:e[i].y,r:5},style:{fill:"#fff",stroke:"#3b82f6",lineWidth:2},z:1e3});this.editPoints.push(s),this.editGroup.add(s)}this.zr.add(this.editGroup)}pixelToDataForPane(t,e,i){const s=this.context.coordinateConversion.pixelToData({x:t,y:e});if(s)return s;try{const r=this.context.getChart(),n=r.convertFromPixel({gridIndex:i},[t,e]);if(n){const h=r.getOption()?.xAxis?.[i]?.data,a=this.context.getMarketData(),o=h?Math.round((h.length-a.length)/2):0;return{timeIndex:Math.round(n[0])-o,value:n[1],paneIndex:i}}}catch{}return null}finishEditing(t,e){if(!this.currentDrawing){this.cleanup();return}const i=this.currentDrawing.paneIndex||0;if(this.isMovingShape&&this.dragStart){const s=t-this.dragStart.x,r=e-this.dragStart.y,n=this.initialPixelPoints.map(h=>this.pixelToDataForPane(h.x+s,h.y+r,i));if(n.every(h=>h!==null)){for(let h=0;h<n.length;h++)this.currentDrawing.points[h]=n[h];n[0]?.paneIndex!==void 0&&(this.currentDrawing.paneIndex=n[0].paneIndex),this.context.updateDrawing(this.currentDrawing)}}else if(this.editingPointIndex!==null){const s=this.pixelToDataForPane(t,e,i);s&&(this.currentDrawing.points[this.editingPointIndex]=s,this.editingPointIndex===0&&s.paneIndex!==void 0&&(this.currentDrawing.paneIndex=s.paneIndex),this.context.updateDrawing(this.currentDrawing))}this.cleanup()}cleanup(){this.isEditing=!1,this.isMovingShape=!1,this.dragStart=null,this.initialPixelPoints=[],this.currentDrawing=null,this.editingPointIndex=null,this.editLines=[],this.editPoints=[],this.editGroup&&(this.zr.remove(this.editGroup),this.editGroup=null),this.zr.off("mousemove",this.onMouseMove),this.zr.off("mouseup",this.onMouseUp),window.removeEventListener("mouseup",this.onWindowMouseUp),this.context.unlockChart()}}var $i=Object.defineProperty,zi=(l,t,e)=>t in l?$i(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,Ei=(l,t,e)=>(zi(l,typeof t!="symbol"?t+"":t,e),e);class ue{constructor(){Ei(this,"renderers",new Map)}register(t){this.renderers.set(t.type,t)}get(t){return this.renderers.get(t)}}var Li=Object.defineProperty,Ti=(l,t,e)=>t in l?Li(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,Wi=(l,t,e)=>(Ti(l,typeof t!="symbol"?t+"":t,e),e);class Zi{constructor(){Wi(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(r){console.error(`Error in EventBus handler for ${t}:`,r)}})}clear(){this.handlers.clear()}}class ot{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){ot.clearAll(t);const s=new Map;for(const r of e)r&&!r._deleted&&s.set(r.position,r);s.forEach(r=>{const n=r._paneIndex??0,h=i?i(n):void 0,a=ot.buildTable(r,h);ot.positionTable(a,r.position,h),t.appendChild(a)})}static clearAll(t){for(;t.firstChild;)t.removeChild(t.firstChild)}static buildTable(t,e){const i=document.createElement("table"),s=t.border_width??0,r=t.frame_width??0;if(s>0&&t.border_color||r>0&&t.frame_color?(i.style.borderCollapse="separate",i.style.borderSpacing="0"):i.style.borderCollapse="collapse",i.style.pointerEvents="none",i.style.fontSize="14px",i.style.lineHeight="1.4",i.style.fontFamily="sans-serif",i.style.margin="4px",e&&(i.style.maxHeight=e.height+"px",i.style.maxWidth=e.width+"px",i.style.overflow="hidden"),t.bgcolor){const{color:c,opacity:g}=ot.safeParseColor(t.bgcolor);i.style.backgroundColor=c,g<1&&(i.style.opacity=String(g))}if(r>0&&t.frame_color){const{color:c}=ot.safeParseColor(t.frame_color);i.style.border=`${r}px solid ${c}`}else i.style.border="none";const n=new Map,h=new Set;if(t.merges)for(const c of t.merges){const g=`${c.startCol},${c.startRow}`;n.set(g,{colspan:c.endCol-c.startCol+1,rowspan:c.endRow-c.startRow+1});for(let p=c.startRow;p<=c.endRow;p++)for(let y=c.startCol;y<=c.endCol;y++)p===c.startRow&&y===c.startCol||h.add(`${y},${p}`)}const a=s>0&&!!t.border_color,o=a?ot.safeParseColor(t.border_color).color:"",d=t.rows||0,u=t.columns||0;for(let c=0;c<d;c++){const g=document.createElement("tr");for(let p=0;p<u;p++){const y=`${p},${c}`;if(h.has(y))continue;const f=document.createElement("td"),x=n.get(y);x&&(x.colspan>1&&(f.colSpan=x.colspan),x.rowspan>1&&(f.rowSpan=x.rowspan)),a?f.style.border=`${s}px solid ${o}`:f.style.border="none";const m=t.cells?.[c]?.[p];if(m&&!m._merged){if(f.textContent=m.text||"",m.bgcolor&&typeof m.bgcolor=="string"&&m.bgcolor.length>0){const{color:v,opacity:I}=ot.safeParseColor(m.bgcolor);f.style.backgroundColor=v,I<1&&(f.style.backgroundColor=m.bgcolor)}if(m.text_color){const{color:v}=ot.safeParseColor(m.text_color);f.style.color=v}if(f.style.fontSize=ot.getSizePixels(m.text_size)+"px",f.style.textAlign=ot.mapHAlign(m.text_halign),f.style.verticalAlign=ot.mapVAlign(m.text_valign),m.text_font_family==="monospace"&&(f.style.fontFamily="monospace"),m.width>0)if(e){const v=Math.max(1,m.width*e.width/100);f.style.width=v+"px"}else f.style.width=m.width+"%";if(m.height>0)if(e){const v=Math.max(1,m.height*e.height/100);f.style.height=v+"px"}else f.style.height=m.height+"%";m.tooltip&&(f.title=m.tooltip)}const A=m?.height??0;A>0&&e&&A*e.height/100<4?f.style.padding="0":f.style.padding="4px 6px",f.style.whiteSpace="nowrap",g.appendChild(f)}i.appendChild(g)}return i}static positionTable(t,e,i){t.style.position="absolute";const s=8,r=i?i.y+"px":"0",n=i?i.x+"px":"0",h=i?i.y+i.height-s+"px":"0",a=i?i.x+i.width-s+"px":"0",o=i?i.x+i.width/2+"px":"50%",d=i?i.y+i.height/2+"px":"50%";switch(e){case"top_left":t.style.top=r,t.style.left=n;break;case"top_center":t.style.top=r,t.style.left=o,t.style.transform="translateX(-50%)";break;case"top_right":t.style.top=r,t.style.left=a,t.style.transform="translateX(-100%)";break;case"middle_left":t.style.top=d,t.style.left=n,t.style.transform="translateY(-50%)";break;case"middle_center":t.style.top=d,t.style.left=o,t.style.transform="translate(-50%, -50%)";break;case"middle_right":t.style.top=d,t.style.left=a,t.style.transform="translate(-100%, -50%)";break;case"bottom_left":t.style.top=h,t.style.left=n,t.style.transform="translateY(-100%)";break;case"bottom_center":t.style.top=h,t.style.left=o,t.style.transform="translate(-50%, -100%)";break;case"bottom_right":t.style.top=h,t.style.left=a,t.style.transform="translate(-100%, -100%)";break;default:t.style.top=r,t.style.left=a,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"}}}class et{static parseColor(t){if(!t||typeof t!="string"||t.length===0)return{color:"",opacity:0};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}}if(/^#[0-9a-fA-F]{8}$/.test(t)){const i=parseInt(t.slice(1,3),16),s=parseInt(t.slice(3,5),16),r=parseInt(t.slice(5,7),16),n=parseInt(t.slice(7,9),16)/255;return{color:`rgb(${i},${s},${r})`,opacity:n}}return{color:t,opacity:1}}static getSizePixels(t){if(typeof t=="number"&&t>0)return t;switch(t){case"auto":case"size.auto":return 11;case"tiny":case"size.tiny":return 8;case"small":case"size.small":return 10;case"normal":case"size.normal":return 12;case"large":case"size.large":return 16;case"huge":case"size.huge":return 24;default:return 12}}static mapHAlign(t){switch(t){case"left":case"text.align_left":return"left";case"right":case"text.align_right":return"right";default:return"center"}}static mapVAlign(t){switch(t){case"top":case"text.align_top":return"top";case"bottom":case"text.align_bottom":return"bottom";default:return"middle"}}static buildGraphicElements(t,e){if(!t||t.length===0)return[];const i=new Map;for(const r of t)r&&!r._deleted&&i.set(r.position,r);const s=[];return i.forEach(r=>{const n=r._paneIndex??0,h=e(n);if(!h)return;const a=et.buildTableElements(r,h);s.push(...a)}),s}static buildTableElements(t,e){const i=t.rows||0,s=t.columns||0;if(i===0||s===0)return[];const r=t.border_width??0,n=t.frame_width??0,h=r>0&&!!t.border_color,a=n>0&&!!t.frame_color,o=new Map,d=new Set;if(t.merges)for(const P of t.merges){o.set(`${P.startCol},${P.startRow}`,{colspan:P.endCol-P.startCol+1,rowspan:P.endRow-P.startRow+1});for(let $=P.startRow;$<=P.endRow;$++)for(let S=P.startCol;S<=P.endCol;S++)$===P.startRow&&S===P.startCol||d.add(`${S},${$}`)}const u=4,c=2,g=1.25,p=[];for(let P=0;P<i;P++){p[P]=[];for(let $=0;$<s;$++){if(d.has(`${$},${P}`)){p[P][$]={text:"",lines:[],fontSize:12,fontFamily:"sans-serif",textColor:{color:"",opacity:0},bgColor:{color:"",opacity:0},halign:"center",valign:"middle",explicitWidth:0,explicitHeight:0,colspan:1,rowspan:1,skip:!0,padX:0,padY:0};continue}const S=t.cells?.[P]?.[$],R=o.get(`${$},${P}`),Z=R?.colspan??1,q=R?.rowspan??1,O=S&&!S._merged&&S.text||"",j=O?O.split(`
|
|
38
|
+
`):[],Y=S?et.getSizePixels(S.text_size):12,B=S?.text_font_family==="monospace"?"monospace":"sans-serif";let rt=0,Q=0;S?.width>0&&(rt=Math.max(1,S.width*e.width/100)),S?.height>0&&(Q=Math.max(1,S.height*e.height/100));const ft=Q>0&&Q<4,qt=ft?0:u,ae=ft?0:c,kt=S&&!S._merged&&S.bgcolor&&typeof S.bgcolor=="string"&&S.bgcolor.length>0?S.bgcolor:"",Ut=S?.text_color||"";p[P][$]={text:O,lines:j,fontSize:Y,fontFamily:B,textColor:Ut?et.parseColor(Ut):{color:"#e0e0e0",opacity:1},bgColor:kt?et.parseColor(kt):{color:"",opacity:0},halign:S?et.mapHAlign(S.text_halign):"center",valign:S?et.mapVAlign(S.text_valign):"middle",explicitWidth:rt,explicitHeight:Q,colspan:Z,rowspan:q,skip:!1,padX:qt,padY:ae}}}const y=new Array(s).fill(0),f=new Array(i).fill(0);for(let P=0;P<i;P++)for(let $=0;$<s;$++){const S=p[P][$];if(S.skip||S.colspan>1||S.rowspan>1)continue;const R=et.measureMultiLineWidth(S.lines,S.fontSize,S.fontFamily),Z=Math.max(S.lines.length,1),q=S.explicitWidth>0?S.explicitWidth:R+S.padX*2,O=S.explicitHeight>0?S.explicitHeight:Z*S.fontSize*g+S.padY*2;y[$]=Math.max(y[$],q),f[P]=Math.max(f[P],O)}for(let P=0;P<s;P++)y[P]===0&&(y[P]=20);for(let P=0;P<i;P++)f[P]===0&&(f[P]=4);for(let P=0;P<i;P++)for(let $=0;$<s;$++){const S=p[P][$];if(S.skip)continue;const R=Math.max(S.lines.length,1),Z=S.explicitHeight>0?S.explicitHeight:R*S.fontSize*g+S.padY*2;if(S.colspan>1){const q=et.sumRange(y,$,S.colspan),O=et.measureMultiLineWidth(S.lines,S.fontSize,S.fontFamily),j=S.explicitWidth>0?S.explicitWidth:O+S.padX*2;if(j>q){const Y=(j-q)/S.colspan;for(let B=0;B<S.colspan;B++)y[$+B]+=Y}S.rowspan===1&&(f[P]=Math.max(f[P],Z))}if(S.rowspan>1){const q=et.sumRange(f,P,S.rowspan);if(Z>q){const O=(Z-q)/S.rowspan;for(let j=0;j<S.rowspan;j++)f[P+j]+=O}}}for(let P=0;P<s;P++)y[P]=Math.round(y[P]);for(let P=0;P<i;P++)f[P]=Math.round(f[P]);const x=new Array(s+1).fill(0);for(let P=0;P<s;P++)x[P+1]=x[P]+y[P];const m=new Array(i+1).fill(0);for(let P=0;P<i;P++)m[P+1]=m[P]+f[P];const A=a?n:0,v=x[s]+A*2,I=m[i]+A*2,b=Math.min(v,e.width),C=Math.min(I,e.height),w=et.computePosition(t.position,e,b,C),k=Math.round(w.x),M=Math.round(w.y),G=[],_=k+A,E=M+A;if(t.bgcolor){const{color:P,opacity:$}=et.parseColor(t.bgcolor);$>0&&G.push({type:"rect",shape:{x:k,y:M,width:b,height:C},style:{fill:P,opacity:$},silent:!0,z:0,z2:0})}if(a){const{color:P}=et.parseColor(t.frame_color),$=n/2;G.push({type:"rect",shape:{x:k+$,y:M+$,width:b-n,height:C-n},style:{fill:"none",stroke:P,lineWidth:n},silent:!0,z:0,z2:1})}const L=h?et.parseColor(t.border_color).color:"";for(let P=0;P<i;P++)for(let $=0;$<s;$++){const S=p[P][$];if(S.skip)continue;const R=_+x[$],Z=E+m[P],q=et.sumRange(y,$,S.colspan),O=et.sumRange(f,P,S.rowspan);if(R-k>=b||Z-M>=C)continue;const j=Math.min(q,b-(R-k)),Y=Math.min(O,C-(Z-M));if(S.bgColor.opacity>0&&G.push({type:"rect",shape:{x:R,y:Z,width:j,height:Y},style:{fill:S.bgColor.color,opacity:S.bgColor.opacity},silent:!0,z:0,z2:2}),h&&G.push({type:"rect",shape:{x:R,y:Z,width:j,height:Y},style:{fill:"none",stroke:L,lineWidth:r},silent:!0,z:0,z2:3}),S.text){let B,rt;switch(S.halign){case"left":B=R+S.padX,rt="left";break;case"right":B=R+j-S.padX,rt="right";break;default:B=R+j/2,rt="center";break}let Q,ft;switch(S.valign){case"top":Q=Z+S.padY,ft="top";break;case"bottom":Q=Z+Y-S.padY,ft="bottom";break;default:Q=Z+Y/2,ft="middle";break}G.push({type:"text",x:B,y:Q,style:{text:S.text,fill:S.textColor.color,opacity:S.textColor.opacity,font:`${S.fontSize}px ${S.fontFamily}`,textAlign:rt,textVerticalAlign:ft,lineHeight:Math.round(S.fontSize*g)},silent:!0,z:0,z2:4})}}return G}static computePosition(t,e,i,s){const r=e.x,n=e.y,h=e.width,a=e.height;switch(t){case"top_left":return{x:r+4,y:n+4};case"top_center":return{x:r+(h-i)/2,y:n+4};case"top_right":return{x:r+h-i-4,y:n+4};case"middle_left":return{x:r+4,y:n+(a-s)/2};case"middle_center":return{x:r+(h-i)/2,y:n+(a-s)/2};case"middle_right":return{x:r+h-i-4,y:n+(a-s)/2};case"bottom_left":return{x:r+4,y:n+a-s-4};case"bottom_center":return{x:r+(h-i)/2,y:n+a-s-4};case"bottom_right":return{x:r+h-i-4,y:n+a-s-4};default:return{x:r+h-i-4,y:n+4}}}static measureMultiLineWidth(t,e,i){if(!t||t.length===0)return 0;const s=i==="monospace"?.6:.55;let r=0;for(const n of t)r=Math.max(r,n.length*e*s);return r}static sumRange(t,e,i){let s=0;for(let r=e;r<e+i&&r<t.length;r++)s+=t[r];return s}}var Fi=Object.defineProperty,Ni=(l,t,e)=>t in l?Fi(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,W=(l,t,e)=>(Ni(l,typeof t!="symbol"?t+"":t,e),e);class Ri{constructor(t,e={}){W(this,"chart"),W(this,"options"),W(this,"marketData",[]),W(this,"indicators",new Map),W(this,"timeToIndex",new Map),W(this,"pluginManager"),W(this,"drawingEditor"),W(this,"events",new Zi),W(this,"isMainCollapsed",!1),W(this,"maximizedPaneId",null),W(this,"countdownInterval",null),W(this,"selectedDrawingId",null),W(this,"drawings",[]),W(this,"drawingRenderers",new ue),W(this,"coordinateConversion",{pixelToData:n=>{const h=this.chart.getOption();if(!h||!h.grid)return null;const a=h.grid.length;for(let o=0;o<a;o++)if(this.chart.containPixel({gridIndex:o},[n.x,n.y])){this.chart.convertFromPixel({seriesIndex:o},[n.x,n.y]);const d=this.chart.convertFromPixel({gridIndex:o},[n.x,n.y]);if(d)return{timeIndex:Math.round(d[0])-this.dataIndexOffset,value:d[1],paneIndex:o}}return null},dataToPixel:n=>{const h=n.paneIndex||0,a=this.chart.convertToPixel({gridIndex:h},[n.timeIndex+this.dataIndexOffset,n.value]);return a?{x:a[0],y:a[1]}:null}}),W(this,"upColor","#00da3c"),W(this,"downColor","#ec0000"),W(this,"defaultPadding",0),W(this,"padding"),W(this,"dataIndexOffset",0),W(this,"_paddingPoints",0),W(this,"LAZY_MIN_PADDING",5),W(this,"LAZY_MAX_PADDING",500),W(this,"LAZY_CHUNK_SIZE",50),W(this,"LAZY_EDGE_THRESHOLD",10),W(this,"_expandScheduled",!1),W(this,"rootContainer"),W(this,"layoutContainer"),W(this,"toolbarContainer"),W(this,"leftSidebar"),W(this,"rightSidebar"),W(this,"chartContainer"),W(this,"overlayContainer"),W(this,"_lastTables",[]),W(this,"_tableGraphicIds",[]),W(this,"_baseGraphics",[]),W(this,"_labelTooltipEl",null),W(this,"_lastLayout",null),W(this,"_mainHeightOverride",null),W(this,"_paneDragState",null),W(this,"_paneResizeRafId",null),W(this,"onKeyDown",n=>{(n.key==="Delete"||n.key==="Backspace")&&this.selectedDrawingId&&(this.removeDrawing(this.selectedDrawingId),this.selectedDrawingId=null,this.render())}),W(this,"onFullscreenChange",()=>{this.render()}),W(this,"isLocked",!1),W(this,"lockedState",null),this.rootContainer=t,this.options={title:void 0,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=D.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 Ai(this,this.toolbarContainer),this.drawingEditor=new Gi(this),this.chart.on("dataZoom",n=>{this.events.emit("chart:dataZoom",n);const h=this.options.databox?.triggerOn,a=this.options.databox?.position;h==="click"&&a==="floating"&&this.chart.dispatchAction({type:"hideTip"}),this._checkEdgeAndExpand()}),this.chart.on("finished",n=>this.events.emit("chart:updated",n)),this.chart.getZr().on("mousedown",n=>{this._paneDragState||this.events.emit("mouse:down",n)}),this.chart.getZr().on("mousemove",n=>{this._paneDragState||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._paneDragState||this.events.emit("mouse:click",n)});const i=this.chart.getZr(),s=i.setCursorStyle,r=this;i.setCursorStyle=function(n){if(r._paneDragState){s.call(this,"row-resize");return}n==="grab"&&(n="crosshair"),s.call(this,n)},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 r=this.chart.getHeight();if(r<=0)return null;for(const n of this._lastLayout.paneBoundaries){const h=n.yPercent/100*r;if(Math.abs(s-h)<=6){if(n.aboveId==="main"&&this.isMainCollapsed||this.indicators.get(n.belowId)?.collapsed||n.aboveId!=="main"&&this.indicators.get(n.aboveId)?.collapsed)continue;return n}}return null},i=s=>s==="main"?this._lastLayout?.mainPaneHeight??50:this.indicators.get(s)?.height??15;t.on("mousemove",s=>{if(this._paneDragState){const r=s.offsetY-this._paneDragState.startY,n=this.chart.getHeight();if(n<=0)return;const h=r/n*100,a=this._paneDragState.aboveId==="main"?10:5,o=5;let d=this._paneDragState.startAboveHeight+h,u=this._paneDragState.startBelowHeight-h;if(d<a&&(d=a,u=this._paneDragState.startAboveHeight+this._paneDragState.startBelowHeight-a),u<o&&(u=o,d=this._paneDragState.startAboveHeight+this._paneDragState.startBelowHeight-o),this._paneDragState.aboveId==="main")this._mainHeightOverride=d;else{const g=this.indicators.get(this._paneDragState.aboveId);g&&(g.height=d)}const c=this.indicators.get(this._paneDragState.belowId);c&&(c.height=u),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 r=e(s.offsetY);r&&(this._paneDragState={startY:s.offsetY,aboveId:r.aboveId,belowId:r.belowId,startAboveHeight:i(r.aboveId),startBelowHeight:i(r.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 r=parseInt(s[1]),n=this.drawings.filter(a=>(a.paneIndex||0)===r)[i.dataIndex];if(!n)return null;const h=i.event?.target?.name;return{drawing:n,targetName:h,paneIdx:r}};this.chart.on("mouseover",i=>{const s=e(i);if(!s)return;const r=i.event?.target?.parent;if(r){const n=s.drawing.id===this.selectedDrawingId;t&&(clearTimeout(t),t=null),n||r.children().forEach(h=>{h.name&&h.name.startsWith("point")&&h.attr("style",{opacity:1})})}if(s.targetName==="line")this.events.emit("drawing:hover",{id:s.drawing.id,type:s.drawing.type}),this.chart.getZr().setCursorStyle("move");else if(s.targetName?.startsWith("point-")){const n=parseInt(s.targetName.split("-")[1])||0;this.events.emit("drawing:point:hover",{id:s.drawing.id,pointIndex:n}),this.chart.getZr().setCursorStyle("pointer")}}),this.chart.on("mouseout",i=>{const s=e(i);if(!s)return;const r=i.event?.target?.parent;if(s.drawing.id!==this.selectedDrawingId){if(t=setTimeout(()=>{if(r){if(this.selectedDrawingId===s.drawing.id)return;r.children().forEach(n=>{n.name&&n.name.startsWith("point")&&n.attr("style",{opacity:0})})}},50),s.targetName==="line")this.events.emit("drawing:mouseout",{id:s.drawing.id});else if(s.targetName?.startsWith("point-")){const n=parseInt(s.targetName.split("-")[1])||0;this.events.emit("drawing:point:mouseout",{id:s.drawing.id,pointIndex:n})}this.chart.getZr().setCursorStyle("default")}}),this.chart.on("mousedown",i=>{const s=e(i);if(!s)return;const r=i.event?.event||i.event,n=r?.offsetX,h=r?.offsetY;if(s.targetName==="line")this.events.emit("drawing:mousedown",{id:s.drawing.id,x:n,y:h});else if(s.targetName?.startsWith("point-")){const a=parseInt(s.targetName.split("-")[1])||0;this.events.emit("drawing:point:mousedown",{id:s.drawing.id,pointIndex:a,x:n,y:h})}}),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 r=parseInt(s.targetName.split("-")[1])||0;this.events.emit("drawing:point:click",{id:s.drawing.id,pointIndex:r})}}}),this.chart.getZr().on("click",i=>{i.target||this.selectedDrawingId&&(this.events.emit("drawing:deselected",{id:this.selectedDrawingId}),this.selectedDrawingId=null,this.render())}),this._labelTooltipEl=document.createElement("div"),this._labelTooltipEl.style.cssText="position:absolute;display:none;pointer-events:none;z-index:200;background:rgba(30,41,59,0.95);color:#fff;border:1px solid #475569;border-radius:4px;padding:6px 10px;font-size:12px;line-height:1.5;white-space:pre-wrap;max-width:350px;box-shadow:0 2px 8px rgba(0,0,0,0.3);font-family:"+(this.options.fontFamily||"sans-serif")+";",this.chartContainer.appendChild(this._labelTooltipEl),this.chart.on("mouseover",{seriesType:"scatter"},i=>{const s=i.data?._tooltipText;if(!s||!this._labelTooltipEl)return;this._labelTooltipEl.textContent=s,this._labelTooltipEl.style.display="block";const r=this.chartContainer.getBoundingClientRect(),n=i.event?.event;if(n){const h=n.clientX-r.left,a=n.clientY-r.top,o=this._labelTooltipEl.offsetWidth,d=Math.min(h-o/2,r.width-o-8);this._labelTooltipEl.style.left=Math.max(4,d)+"px",this._labelTooltipEl.style.top=a+18+"px"}}),this.chart.on("mouseout",{seriesType:"scatter"},()=>{this._labelTooltipEl&&(this._labelTooltipEl.style.display="none")})}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)}registerDrawingRenderer(t){this.drawingRenderers.register(t)}snapToCandle(t){const e=this.coordinateConversion.pixelToData(t);if(!e)return t;const i=e.paneIndex||0;if(i!==0)return t;const s=Math.round(e.timeIndex);if(s<0||s>=this.marketData.length)return t;const r=this.marketData[s];if(!r)return t;const n=this.chart.convertToPixel({gridIndex:i},[s+this.dataIndexOffset,r.close]);if(!n)return t;const h=n[0],a=[r.open,r.high,r.low,r.close];let o=a[0],d=1/0;for(const c of a){const g=this.chart.convertToPixel({gridIndex:i},[s+this.dataIndexOffset,c]);if(g){const p=Math.abs(g[1]-t.y);p<d&&(d=p,o=c)}}const u=this.chart.convertToPixel({gridIndex:i},[s+this.dataIndexOffset,o]);return{x:h,y:u?u[1]:t.y}}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,x)=>f.time-x.time),this.rebuildTimeIndex();const i=this.dataIndexOffset,s=It.buildCandlestickSeries(this.marketData,this.options),r={value:[NaN,NaN,NaN,NaN],itemStyle:{opacity:0}},n=[...Array(i).fill(r),...s.data,...Array(i).fill(r)],h=[...Array(i).fill(""),...this.marketData.map(f=>new Date(f.time).toLocaleString()),...Array(i).fill("")],a=this.chart.getOption(),o=Kt.calculate(this.chart.getHeight(),this.indicators,this.options,this.isMainCollapsed,this.maximizedPaneId,this.marketData,this._mainHeightOverride??void 0);this._lastLayout=o;const d=[...Array(i).fill(null),...this.marketData,...Array(i).fill(null)],{series:u,barColors:c}=It.buildIndicatorSeries(this.indicators,this.timeToIndex,o.paneLayout,h.length,i,d,o.overlayYAxisMap,o.separatePaneYAxisOffset),g=n.map((f,x)=>c[x]?{value:f.value||f,itemStyle:{color:c[x],color0:c[x]}}:f),p={xAxis:a.xAxis.map((f,x)=>({data:h})),series:[{data:g,markLine:s.markLine},...u]};this.chart.setOption(p,{notMerge:!1});const y=[];this.indicators.forEach(f=>{Object.values(f.plots).forEach(x=>{x.options?.style==="table"&&x.data?.forEach(m=>{(Array.isArray(m.value)?m.value:[m.value]).forEach(A=>{A&&!A._deleted&&(A._paneIndex=A.force_overlay?0:f.paneIndex,y.push(A))})})})}),this._lastTables=y,this._renderTableOverlays(),this.startCountdown()}startCountdown(){if(this.stopCountdown(),!this.options.lastPriceLine?.showCountdown||this.marketData.length===0)return;let t=this.options.interval;if(!t&&this.marketData.length>=2){const i=this.marketData[this.marketData.length-1],s=this.marketData[this.marketData.length-2];t=i.time-s.time}if(!t)return;const e=()=>{if(this.marketData.length===0)return;const i=this.marketData[this.marketData.length-1].time+t,s=Date.now(),r=i-s;if(r<=0)return;const n=Math.abs(r),h=Math.floor(n/36e5),a=Math.floor(n%36e5/6e4),o=Math.floor(n%6e4/1e3),d=`${h>0?h.toString().padStart(2,"0")+":":""}${a.toString().padStart(2,"0")}:${o.toString().padStart(2,"0")}`,u=this.chart.getOption();if(!u||!u.series)return;const c=u.series.findIndex(m=>m.type==="candlestick");if(c===-1)return;const g=u.series[c];if(!g.markLine||!g.markLine.data||!g.markLine.data[0])return;const p=g.markLine.data[0];p.label.formatter;const y=p.yAxis;let f="";if(this.options.yAxisLabelFormatter)f=this.options.yAxisLabelFormatter(y);else{const m=this.options.yAxisDecimalPlaces!==void 0?this.options.yAxisDecimalPlaces:V.autoDetectDecimals(this.marketData);f=V.formatValue(y,m)}const x=`${f}
|
|
39
|
+
${d}`;this.chart.setOption({series:[{id:"__candlestick__",markLine:{data:[{...p,label:{...p.label,formatter:x}}]}}]})};e(),this.countdownInterval=setInterval(e,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 r=0;if(!s){let h=0;this.indicators.forEach(a=>{a.paneIndex>h&&(h=a.paneIndex)}),r=h+1}const n=new ni(t,e,r,{height:i.height,collapsed:!1,titleColor:i.titleColor,controls:i.controls});return this.indicators.set(t,n),this.render(),n}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()}_buildTableGraphics(){const t=this.chart.getModel(),e=s=>t.getComponent("grid",s)?.coordinateSystem?.getRect(),i=et.buildGraphicElements(this._lastTables,e);this._tableGraphicIds=[];for(let s=0;s<i.length;s++){const r=`__qf_table_${s}`;i[s].id=r,this._tableGraphicIds.push(r)}return i}_renderTableOverlays(){const t=this._buildTableGraphics(),e=[...this._baseGraphics,...t];this.chart.setOption({graphic:e},{replaceMerge:["graphic"]}),ot.clearAll(this.overlayContainer)}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._paddingPoints=Math.max(this._paddingPoints,e,this.LAZY_MIN_PADDING),this.dataIndexOffset=this._paddingPoints}expandPadding(t){this._resizePadding(t)}_resizePadding(t){const e=Math.ceil(this.marketData.length*this.padding);if(t=Math.max(t,e,this.LAZY_MIN_PADDING),t=Math.min(t,this.LAZY_MAX_PADDING),t===this._paddingPoints)return;const i=this._paddingPoints,s=this.marketData.length+2*i,r=this.chart.getOption(),n=r?.dataZoom?.find(M=>M.type==="slider"||M.type==="inside"),h=n?n.start/100*s:0,a=n?n.end/100*s:s,o=t-i;this._paddingPoints=t,this.dataIndexOffset=this._paddingPoints;const d=this._paddingPoints,u={value:[NaN,NaN,NaN,NaN],itemStyle:{opacity:0}},c=It.buildCandlestickSeries(this.marketData,this.options),g=[...Array(d).fill(u),...c.data,...Array(d).fill(u)],p=[...Array(d).fill(""),...this.marketData.map(M=>new Date(M.time).toLocaleString()),...Array(d).fill("")],y=[...Array(d).fill(null),...this.marketData,...Array(d).fill(null)],f=Kt.calculate(this.chart.getHeight(),this.indicators,this.options,this.isMainCollapsed,this.maximizedPaneId,this.marketData,this._mainHeightOverride??void 0),{series:x,barColors:m}=It.buildIndicatorSeries(this.indicators,this.timeToIndex,f.paneLayout,p.length,d,y,f.overlayYAxisMap,f.separatePaneYAxisOffset),A=g.map((M,G)=>m[G]?{value:M.value||M,itemStyle:{color:m[G],color0:m[G]}}:M),v=this.marketData.length+2*t,I=Math.max(0,(h+o)/v*100),b=Math.min(100,(a+o)/v*100),C=[],w=new Map;this.drawings.forEach(M=>{const G=M.paneIndex||0;w.has(G)||w.set(G,[]),w.get(G).push(M)}),w.forEach(M=>{C.push({data:M.map(G=>{const _=[];return G.points.forEach(E=>{_.push(E.timeIndex+this.dataIndexOffset,E.value)}),_})})});const k={xAxis:r.xAxis.map(()=>({data:p})),dataZoom:(r.dataZoom||[]).map(()=>({start:I,end:b})),series:[{data:A,markLine:c.markLine},...x.map(M=>{const G={data:M.data};return M.renderItem&&(G.renderItem=M.renderItem),G}),...C]};this.chart.setOption(k,{notMerge:!1})}_checkEdgeAndExpand(){if(this._expandScheduled)return;const t=this.chart.getOption()?.dataZoom?.find(y=>y.type==="slider"||y.type==="inside");if(!t)return;const e=this._paddingPoints,i=this.marketData.length,s=i+2*e,r=Math.round(t.start/100*s),n=Math.round(t.end/100*s),h=e,a=e+i-1,o=Math.max(0,Math.min(n,a)-Math.max(r,h)+1),d=r<this.LAZY_EDGE_THRESHOLD,u=n>s-this.LAZY_EDGE_THRESHOLD;if((d||u)&&e<this.LAZY_MAX_PADDING&&o>=3){this._expandScheduled=!0,requestAnimationFrame(()=>{this._expandScheduled=!1,this._resizePadding(e+this.LAZY_CHUNK_SIZE)});return}const c=Math.max(0,e-r),g=Math.max(0,n-(e+i-1)),p=Math.max(c+this.LAZY_CHUNK_SIZE,g+this.LAZY_CHUNK_SIZE);e>p+this.LAZY_CHUNK_SIZE&&(this._expandScheduled=!0,requestAnimationFrame(()=>{this._expandScheduled=!1,this._resizePadding(p)}))}render(){if(this.marketData.length===0)return;let t=null;try{const b=this.chart.getOption();if(b&&b.dataZoom&&b.dataZoom.length>0){const C=b.dataZoom.find(w=>w.type==="slider"||w.type==="inside");C&&(t={start:C.start,end:C.end})}}catch{}const e=this.options.databox?.position,i=this.leftSidebar.style.display,s=this.rightSidebar.style.display,r=e==="left"?"block":"none",n=e==="right"?"block":"none";(i!==r||s!==n)&&(this.leftSidebar.style.display=r,this.rightSidebar.style.display=n,this.chart.resize());const h=this.dataIndexOffset,a=[...Array(h).fill(""),...this.marketData.map(b=>new Date(b.time).toLocaleString()),...Array(h).fill("")],o=Kt.calculate(this.chart.getHeight(),this.indicators,this.options,this.isMainCollapsed,this.maximizedPaneId,this.marketData,this._mainHeightOverride??void 0);if(this._lastLayout=o,!t&&o.dataZoom&&this.marketData.length>0){const b=this.marketData.length,C=a.length,w=h/C,k=b/C;o.dataZoom.forEach(M=>{if(M.start!==void 0){const G=M.start/100,_=w+G*k;M.start=_*100}if(M.end!==void 0){const G=M.end/100,_=w+G*k;M.end=_*100}})}t&&o.dataZoom&&o.dataZoom.forEach(b=>{b.start=t.start,b.end=t.end}),o.xAxis.forEach(b=>{b.data=a,b.boundaryGap=!1});const d=It.buildCandlestickSeries(this.marketData,this.options),u={value:[NaN,NaN,NaN,NaN],itemStyle:{opacity:0}};d.data=[...Array(h).fill(u),...d.data,...Array(h).fill(u)];const c=[...Array(h).fill(null),...this.marketData,...Array(h).fill(null)],{series:g,barColors:p}=It.buildIndicatorSeries(this.indicators,this.timeToIndex,o.paneLayout,a.length,h,c,o.overlayYAxisMap,o.separatePaneYAxisOffset);d.data=d.data.map((b,C)=>p[C]?{value:b.value||b,itemStyle:{color:p[C],color0:p[C]}}:b);const y=[];this.indicators.forEach((b,C)=>{b.paneIndex===0&&y.push({id:C,titleColor:b.titleColor})});const f=ki.build(o,this.options,this.toggleIndicator.bind(this),this.isMainCollapsed,this.maximizedPaneId,y),x=new Map;this.drawings.forEach(b=>{const C=b.paneIndex||0;x.has(C)||x.set(C,[]),x.get(C).push(b)});const m=[];x.forEach((b,C)=>{m.push({type:"custom",name:`drawings-pane-${C}`,xAxisIndex:C,yAxisIndex:C,clip:!0,renderItem:(w,k)=>{const M=b[w.dataIndex];if(!M)return;const G=this.drawingRenderers.get(M.type);if(!G)return;const _=this.dataIndexOffset,E=M.points.map(L=>k.coord([L.timeIndex+_,L.value]));return G.render({drawing:M,pixelPoints:E,isSelected:M.id===this.selectedDrawingId,api:k,coordSys:w.coordSys})},data:b.map(w=>{const k=[];return w.points.forEach(M=>{k.push(M.timeIndex+this.dataIndexOffset,M.value)}),k}),encode:(()=>{const w=b.reduce((G,_)=>Math.max(G,_.points.length),0),k=Array.from({length:w},(G,_)=>_*2),M=Array.from({length:w},(G,_)=>_*2+1);return{x:k,y:M}})(),z:100,silent:!1})});const A=b=>{const C=Di.format(b,this.options),w=this.options.databox?.position;return w==="left"?(this.leftSidebar.innerHTML=C,""):w==="right"?(this.rightSidebar.innerHTML=C,""):this.options.databox?`<div style="min-width: 200px;">${C}</div>`:""},v=[];this.indicators.forEach(b=>{Object.values(b.plots).forEach(C=>{C.options?.style==="table"&&C.data?.forEach(w=>{(Array.isArray(w.value)?w.value:[w.value]).forEach(k=>{k&&!k._deleted&&(k._paneIndex=k.force_overlay?0:b.paneIndex,v.push(k))})})})});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:A,extraCssText:e!=="floating"&&e!==void 0?"display: none !important;":void 0,position:(b,C,w,k,M)=>{if(this.options.databox?.position==="floating"){const G={top:10};return G[["left","right"][+(b[0]<M.viewSize[0]/2)]]=30,G}return null}},axisPointer:{link:{xAxisIndex:"all"},label:{backgroundColor:"#475569"}},graphic:f,grid:o.grid,xAxis:o.xAxis,yAxis:o.yAxis,dataZoom:o.dataZoom,series:[d,...g,...m]};if(this.chart.setOption(I,!0),this._baseGraphics=f,this._lastTables=v,v.length>0){const b=this._buildTableGraphics();if(b.length>0){const C=[...f,...b];this.chart.setOption({graphic:C},{replaceMerge:["graphic"]})}}else this._tableGraphicIds=[];ot.clearAll(this.overlayContainer)}}var Oi=Object.defineProperty,Hi=(l,t,e)=>t in l?Oi(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,ct=(l,t,e)=>(Hi(l,typeof t!="symbol"?t+"":t,e),e);class X{constructor(t){ct(this,"id"),ct(this,"name"),ct(this,"icon"),ct(this,"context"),ct(this,"eventListeners",[]),ct(this,"_snapIndicator",null),ct(this,"_snapMoveHandler",null),ct(this,"_snapKeyDownHandler",null),ct(this,"_snapKeyUpHandler",null),ct(this,"_snapBlurHandler",null),ct(this,"_snapActive",!1),ct(this,"_lastMouseEvent",null),this.id=t.id,this.name=t.name,this.icon=t.icon}init(t){this.context=t,this.onInit()}onInit(){}activate(){this.onActivate(),this._bindSnapIndicator(),this.context.events.emit("plugin:activated",this.id)}onActivate(){}deactivate(){this._unbindSnapIndicator(),this.onDeactivate(),this.context.events.emit("plugin:deactivated",this.id)}onDeactivate(){}destroy(){this._unbindSnapIndicator(),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()}getPoint(t){const e=t.offsetX,i=t.offsetY,s=t.event;if(s?.ctrlKey||s?.metaKey){const r=this.context.snapToCandle({x:e,y:i});return[r.x,r.y]}return[e,i]}_bindSnapIndicator(){const t=this.context.getChart().getZr();this._snapMoveHandler=e=>{this._lastMouseEvent=e,e.event?.ctrlKey||e.event?.metaKey?this._showSnapAt(e.offsetX,e.offsetY):this._hideSnap()},this._snapKeyDownHandler=e=>{(e.key==="Control"||e.key==="Meta")&&this._lastMouseEvent&&this._showSnapAt(this._lastMouseEvent.offsetX,this._lastMouseEvent.offsetY)},this._snapKeyUpHandler=e=>{(e.key==="Control"||e.key==="Meta")&&this._hideSnap()},this._snapBlurHandler=()=>{this._hideSnap()},t.on("mousemove",this._snapMoveHandler),window.addEventListener("keydown",this._snapKeyDownHandler),window.addEventListener("keyup",this._snapKeyUpHandler),window.addEventListener("blur",this._snapBlurHandler)}_unbindSnapIndicator(){if(this._snapMoveHandler){try{this.context.getChart().getZr().off("mousemove",this._snapMoveHandler)}catch{}this._snapMoveHandler=null}this._snapKeyDownHandler&&(window.removeEventListener("keydown",this._snapKeyDownHandler),this._snapKeyDownHandler=null),this._snapKeyUpHandler&&(window.removeEventListener("keyup",this._snapKeyUpHandler),this._snapKeyUpHandler=null),this._snapBlurHandler&&(window.removeEventListener("blur",this._snapBlurHandler),this._snapBlurHandler=null),this._removeSnapGraphic(),this._lastMouseEvent=null}_removeSnapGraphic(){if(this._snapIndicator){try{this.context.getChart().getZr().remove(this._snapIndicator)}catch{}this._snapIndicator=null,this._snapActive=!1}}_showSnapAt(t,e){const i=this.context.snapToCandle({x:t,y:e}),s=this.context.getChart().getZr();this._snapIndicator||(this._snapIndicator=new D.graphic.Circle({shape:{cx:0,cy:0,r:5},style:{fill:"rgba(59, 130, 246, 0.3)",stroke:"#3b82f6",lineWidth:1.5},z:9999,silent:!0}),s.add(this._snapIndicator)),this._snapIndicator.setShape({cx:i.x,cy:i.y}),this._snapIndicator.show(),this._snapActive=!0}_hideSnap(){this._snapIndicator&&this._snapActive&&(this._snapIndicator.hide(),this._snapActive=!1)}}var Bi=Object.defineProperty,ji=(l,t,e)=>t in l?Bi(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,st=(l,t,e)=>(ji(l,typeof t!="symbol"?t+"":t,e),e);class Yi extends X{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>'}),st(this,"zr"),st(this,"state","idle"),st(this,"startPoint",null),st(this,"endPoint",null),st(this,"group",null),st(this,"rect",null),st(this,"labelRect",null),st(this,"labelText",null),st(this,"lineV",null),st(this,"lineH",null),st(this,"arrowStart",null),st(this,"arrowEnd",null),st(this,"onMouseDown",()=>{this.state==="finished"&&this.removeGraphic()}),st(this,"onChartInteraction",()=>{this.group&&this.removeGraphic()}),st(this,"onClick",e=>{this.state==="idle"?(this.state="drawing",this.startPoint=this.getPoint(e),this.endPoint=this.getPoint(e),this.initGraphic(),this.updateGraphic()):this.state==="drawing"&&(this.state="finished",this.endPoint=this.getPoint(e),this.updateGraphic(),this.context.disableTools(),this.enableClearListeners())}),st(this,"clearHandlers",{}),st(this,"onMouseMove",e=>{this.state==="drawing"&&(this.endPoint=this.getPoint(e),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 D.graphic.Group,this.rect=new D.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 D.graphic.Line({shape:{x1:0,y1:0,x2:0,y2:0},style:{stroke:"#fff",lineWidth:1,lineDash:[4,4]},z:101}),this.lineH=new D.graphic.Line({shape:{x1:0,y1:0,x2:0,y2:0},style:{stroke:"#fff",lineWidth:1,lineDash:[4,4]},z:101}),this.arrowStart=new D.graphic.Polygon({shape:{points:[[0,0],[-5,10],[5,10]]},style:{fill:"#fff"},z:102}),this.arrowEnd=new D.graphic.Polygon({shape:{points:[[0,0],[-5,-10],[5,-10]]},style:{fill:"#fff"},z:102}),this.labelRect=new D.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 D.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,r=this.context.coordinateConversion.pixelToData({x:t,y:e}),n=this.context.coordinateConversion.pixelToData({x:i,y:s});if(!r||!n)return;const h=Math.round(r.timeIndex),a=Math.round(n.timeIndex),o=r.value,d=n.value,u=a-h,c=d-o,g=c/o*100,p=c>=0,y=p?"rgba(33, 150, 243, 0.2)":"rgba(236, 0, 0, 0.2)",f=p?"#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:y});const x=(t+i)/2,m=(e+s)/2;this.lineV.setShape({x1:x,y1:e,x2:x,y2:s}),this.lineV.setStyle({stroke:f}),this.lineH.setShape({x1:t,y1:m,x2:i,y2:m}),this.lineH.setStyle({stroke:f});const A=Math.min(e,s),v=Math.max(e,s);this.arrowStart.setStyle({fill:"none"}),this.arrowEnd.setStyle({fill:"none"}),p?(this.arrowStart.setShape({points:[[x,A],[x-4,A+6],[x+4,A+6]]}),this.arrowStart.setStyle({fill:f})):(this.arrowEnd.setShape({points:[[x,v],[x-4,v-6],[x+4,v-6]]}),this.arrowEnd.setStyle({fill:f}));const I=[`${c.toFixed(2)} (${g.toFixed(2)}%)`,`${u} bars`].join(`
|
|
40
|
+
`),b=140,C=40,w=Math.max(e,s),k=Math.min(e,s);let M=(t+i)/2-b/2,G=w+10;const _=this.chart.getHeight();G+C>_&&(G=k-C-10),this.labelRect.setShape({x:M,y:G,width:b,height:C}),this.labelRect.setStyle({fill:"#1e293b",stroke:f,lineWidth:1}),this.labelText.setStyle({x:M+b/2,y:G+C/2,text:I,fill:"#fff"})}}var Vi=Object.defineProperty,Xi=(l,t,e)=>t in l?Vi(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,qi=(l,t,e)=>(Xi(l,typeof t!="symbol"?t+"":t,e),e);class ge{constructor(){qi(this,"type","line")}render(t){const{drawing:e,pixelPoints:i,isSelected:s}=t,[r,n]=i[0],[h,a]=i[1],o=e.style?.color||"#d1d4dc";return{type:"group",children:[{type:"line",name:"line",shape:{x1:r,y1:n,x2:h,y2:a},style:{stroke:o,lineWidth:e.style?.lineWidth||1}},{type:"circle",name:"point-0",shape:{cx:r,cy:n,r:4},style:{fill:"#fff",stroke:o,lineWidth:1,opacity:s?1:0}},{type:"circle",name:"point-1",shape:{cx:h,cy:a,r:4},style:{fill:"#fff",stroke:o,lineWidth:1,opacity:s?1:0}}]}}}var Ui=Object.defineProperty,Ki=(l,t,e)=>t in l?Ui(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,ut=(l,t,e)=>(Ki(l,typeof t!="symbol"?t+"":t,e),e);class Ji extends X{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>'}),ut(this,"zr"),ut(this,"state","idle"),ut(this,"startPoint",null),ut(this,"endPoint",null),ut(this,"group",null),ut(this,"line",null),ut(this,"startCircle",null),ut(this,"endCircle",null),ut(this,"onClick",e=>{if(this.state==="idle")this.state="drawing",this.startPoint=this.getPoint(e),this.endPoint=this.getPoint(e),this.initGraphic(),this.updateGraphic();else if(this.state==="drawing"){if(this.state="finished",this.endPoint=this.getPoint(e),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 r=i.paneIndex||0;this.context.addDrawing({id:`line-${Date.now()}`,type:"line",points:[i,s],paneIndex:r,style:{color:"#d1d4dc",lineWidth:1}})}}this.removeGraphic(),this.context.disableTools()}}),ut(this,"onMouseMove",e=>{this.state==="drawing"&&(this.endPoint=this.getPoint(e),this.updateGraphic())})}onInit(){this.zr=this.chart.getZr(),this.context.registerDrawingRenderer(new ge)}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.state==="drawing"&&this.removeGraphic()}onDestroy(){this.removeGraphic()}initGraphic(){this.group||(this.group=new D.graphic.Group,this.line=new D.graphic.Line({shape:{x1:0,y1:0,x2:0,y2:0},style:{stroke:"#d1d4dc",lineWidth:1},z:100}),this.startCircle=new D.graphic.Circle({shape:{cx:0,cy:0,r:4},style:{fill:"#fff",stroke:"#d1d4dc",lineWidth:1},z:101}),this.endCircle=new D.graphic.Circle({shape:{cx:0,cy:0,r:4},style:{fill:"#fff",stroke:"#d1d4dc",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)}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 Qi=Object.defineProperty,ts=(l,t,e)=>t in l?Qi(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,es=(l,t,e)=>(ts(l,typeof t!="symbol"?t+"":t,e),e);class ye{constructor(){es(this,"type","ray")}render(t){const{drawing:e,pixelPoints:i,isSelected:s,coordSys:r}=t,[n,h]=i[0],[a,o]=i[1],d=e.style?.color||"#d1d4dc",[u,c]=this.extendToEdge(n,h,a,o,r);return{type:"group",children:[{type:"line",name:"line",shape:{x1:n,y1:h,x2:u,y2:c},style:{stroke:d,lineWidth:e.style?.lineWidth||1}},{type:"circle",name:"point-0",shape:{cx:n,cy:h,r:4},style:{fill:"#fff",stroke:d,lineWidth:1,opacity:s?1:0}},{type:"circle",name:"point-1",shape:{cx:a,cy:o,r:4},style:{fill:"#fff",stroke:d,lineWidth:1,opacity:s?1:0}}]}}extendToEdge(t,e,i,s,r){const n=i-t,h=s-e;if(n===0&&h===0)return[i,s];const a=r.x,o=r.x+r.width,d=r.y,u=r.y+r.height;let c=1/0;if(n!==0){const g=n>0?(o-t)/n:(a-t)/n;g>0&&(c=Math.min(c,g))}if(h!==0){const g=h>0?(u-e)/h:(d-e)/h;g>0&&(c=Math.min(c,g))}return isFinite(c)||(c=1),[t+c*n,e+c*h]}}var is=Object.defineProperty,ss=(l,t,e)=>t in l?is(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,pt=(l,t,e)=>(ss(l,typeof t!="symbol"?t+"":t,e),e);const zt="#d1d4dc";class ns extends X{constructor(t={}){super({id:"ray-tool",name:t?.name||"Ray",icon:t?.icon||'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="3" y1="20" x2="21" y2="4"/><circle cx="21" cy="4" r="0" fill="currentColor"/><polyline points="16,4 21,4 21,9" stroke-width="1.5"/></svg>'}),pt(this,"zr"),pt(this,"state","idle"),pt(this,"startPoint",null),pt(this,"endPoint",null),pt(this,"group",null),pt(this,"line",null),pt(this,"dashLine",null),pt(this,"startCircle",null),pt(this,"endCircle",null),pt(this,"onClick",e=>{if(this.state==="idle")this.state="drawing",this.startPoint=this.getPoint(e),this.endPoint=this.getPoint(e),this.initGraphic(),this.updateGraphic();else if(this.state==="drawing"){if(this.state="finished",this.endPoint=this.getPoint(e),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]});i&&s&&this.context.addDrawing({id:`ray-${Date.now()}`,type:"ray",points:[i,s],paneIndex:i.paneIndex||0,style:{color:zt,lineWidth:1}})}this.removeGraphic(),this.context.disableTools()}}),pt(this,"onMouseMove",e=>{this.state==="drawing"&&(this.endPoint=this.getPoint(e),this.updateGraphic())})}onInit(){this.zr=this.chart.getZr(),this.context.registerDrawingRenderer(new ye)}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.removeGraphic()}onDestroy(){this.removeGraphic()}initGraphic(){this.group||(this.group=new D.graphic.Group,this.line=new D.graphic.Line({shape:{x1:0,y1:0,x2:0,y2:0},style:{stroke:zt,lineWidth:1},z:100}),this.dashLine=new D.graphic.Line({shape:{x1:0,y1:0,x2:0,y2:0},style:{stroke:zt,lineWidth:1,lineDash:[4,4],opacity:.5},z:99}),this.startCircle=new D.graphic.Circle({shape:{cx:0,cy:0,r:4},style:{fill:"#fff",stroke:zt,lineWidth:1},z:101}),this.endCircle=new D.graphic.Circle({shape:{cx:0,cy:0,r:4},style:{fill:"#fff",stroke:zt,lineWidth:1},z:101}),this.group.add(this.dashLine),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)}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});const[r,n]=this.extendToEdge(t,e,i,s);this.dashLine.setShape({x1:i,y1:s,x2:r,y2:n})}extendToEdge(t,e,i,s){const r=i-t,n=s-e;if(r===0&&n===0)return[i,s];const h=this.chart.getWidth(),a=this.chart.getHeight();let o=1/0;if(r!==0){const d=r>0?(h-t)/r:-t/r;d>0&&(o=Math.min(o,d))}if(n!==0){const d=n>0?(a-e)/n:-e/n;d>0&&(o=Math.min(o,d))}return isFinite(o)||(o=1),[t+o*r,e+o*n]}}var os=Object.defineProperty,rs=(l,t,e)=>t in l?os(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,as=(l,t,e)=>(rs(l,typeof t!="symbol"?t+"":t,e),e);class fe{constructor(){as(this,"type","info-line")}render(t){const{drawing:e,pixelPoints:i,isSelected:s}=t,[r,n]=i[0],[h,a]=i[1],o=e.style?.color||"#d1d4dc",d=e.points[0],u=e.points[1],c=u.value-d.value,g=d.value!==0?c/d.value*100:0,p=Math.abs(u.timeIndex-d.timeIndex),y=c>=0?"+":"",f=`${y}${c.toFixed(2)} (${y}${g.toFixed(2)}%) ${p} bars`,x=(r+h)/2,m=(n+a)/2,A=c>=0?"#26a69a":"#ef5350";return{type:"group",children:[{type:"line",name:"line",shape:{x1:r,y1:n,x2:h,y2:a},style:{stroke:o,lineWidth:e.style?.lineWidth||1}},{type:"rect",shape:{x:x-2,y:m-22,width:f.length*6.5+12,height:18,r:3},style:{fill:"#1e293b",stroke:"#475569",lineWidth:1,opacity:.9},z2:10},{type:"text",x:x+4,y:m-20,style:{text:f,fill:A,fontSize:11,fontFamily:"monospace"},z2:11},{type:"circle",name:"point-0",shape:{cx:r,cy:n,r:4},style:{fill:"#fff",stroke:o,lineWidth:1,opacity:s?1:0}},{type:"circle",name:"point-1",shape:{cx:h,cy:a,r:4},style:{fill:"#fff",stroke:o,lineWidth:1,opacity:s?1:0}}]}}}var ls=Object.defineProperty,hs=(l,t,e)=>t in l?ls(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,gt=(l,t,e)=>(hs(l,typeof t!="symbol"?t+"":t,e),e);class cs extends X{constructor(t={}){super({id:"info-line-tool",name:t?.name||"Info 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"/><rect x="12" y="8" width="8" height="5" rx="1" fill="none" stroke-width="1.5"/></svg>'}),gt(this,"zr"),gt(this,"state","idle"),gt(this,"startPoint",null),gt(this,"endPoint",null),gt(this,"group",null),gt(this,"line",null),gt(this,"startCircle",null),gt(this,"endCircle",null),gt(this,"onClick",e=>{if(this.state==="idle")this.state="drawing",this.startPoint=this.getPoint(e),this.endPoint=this.getPoint(e),this.initGraphic(),this.updateGraphic();else if(this.state==="drawing"){if(this.state="finished",this.endPoint=this.getPoint(e),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]});i&&s&&this.context.addDrawing({id:`info-line-${Date.now()}`,type:"info-line",points:[i,s],paneIndex:i.paneIndex||0,style:{color:"#d1d4dc",lineWidth:1}})}this.removeGraphic(),this.context.disableTools()}}),gt(this,"onMouseMove",e=>{this.state==="drawing"&&(this.endPoint=this.getPoint(e),this.updateGraphic())})}onInit(){this.zr=this.chart.getZr(),this.context.registerDrawingRenderer(new fe)}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.removeGraphic()}onDestroy(){this.removeGraphic()}initGraphic(){this.group||(this.group=new D.graphic.Group,this.line=new D.graphic.Line({shape:{x1:0,y1:0,x2:0,y2:0},style:{stroke:"#d1d4dc",lineWidth:1},z:100}),this.startCircle=new D.graphic.Circle({shape:{cx:0,cy:0,r:4},style:{fill:"#fff",stroke:"#d1d4dc",lineWidth:1},z:101}),this.endCircle=new D.graphic.Circle({shape:{cx:0,cy:0,r:4},style:{fill:"#fff",stroke:"#d1d4dc",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)}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 ds=Object.defineProperty,ps=(l,t,e)=>t in l?ds(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,us=(l,t,e)=>(ps(l,typeof t!="symbol"?t+"":t,e),e);class xe{constructor(){us(this,"type","extended-line")}render(t){const{drawing:e,pixelPoints:i,isSelected:s,coordSys:r}=t,[n,h]=i[0],[a,o]=i[1],d=e.style?.color||"#d1d4dc",u=a-n,c=o-h;let g=n,p=h,y=a,f=o;if(u!==0||c!==0){const x=r.x,m=r.x+r.width,A=r.y,v=r.y+r.height;[y,f]=this.extendToEdge(n,h,u,c,x,m,A,v),[g,p]=this.extendToEdge(a,o,-u,-c,x,m,A,v)}return{type:"group",children:[{type:"line",name:"line",shape:{x1:g,y1:p,x2:y,y2:f},style:{stroke:d,lineWidth:e.style?.lineWidth||1}},{type:"circle",name:"point-0",shape:{cx:n,cy:h,r:4},style:{fill:"#fff",stroke:d,lineWidth:1,opacity:s?1:0}},{type:"circle",name:"point-1",shape:{cx:a,cy:o,r:4},style:{fill:"#fff",stroke:d,lineWidth:1,opacity:s?1:0}}]}}extendToEdge(t,e,i,s,r,n,h,a){let o=1/0;if(i!==0){const d=i>0?(n-t)/i:(r-t)/i;d>0&&(o=Math.min(o,d))}if(s!==0){const d=s>0?(a-e)/s:(h-e)/s;d>0&&(o=Math.min(o,d))}return isFinite(o)||(o=1),[t+o*i,e+o*s]}}var gs=Object.defineProperty,ys=(l,t,e)=>t in l?gs(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,dt=(l,t,e)=>(ys(l,typeof t!="symbol"?t+"":t,e),e);const At="#d1d4dc";class fs extends X{constructor(t={}){super({id:"extended-line-tool",name:t?.name||"Extended Line",icon:t?.icon||'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="1" y1="23" x2="23" y2="1" stroke-dasharray="2,2" opacity="0.4"/><line x1="6" y1="18" x2="18" y2="6"/></svg>'}),dt(this,"zr"),dt(this,"state","idle"),dt(this,"startPoint",null),dt(this,"endPoint",null),dt(this,"group",null),dt(this,"line",null),dt(this,"dashLineForward",null),dt(this,"dashLineBackward",null),dt(this,"startCircle",null),dt(this,"endCircle",null),dt(this,"onClick",e=>{if(this.state==="idle")this.state="drawing",this.startPoint=this.getPoint(e),this.endPoint=this.getPoint(e),this.initGraphic(),this.updateGraphic();else if(this.state==="drawing"){if(this.state="finished",this.endPoint=this.getPoint(e),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]});i&&s&&this.context.addDrawing({id:`extended-line-${Date.now()}`,type:"extended-line",points:[i,s],paneIndex:i.paneIndex||0,style:{color:At,lineWidth:1}})}this.removeGraphic(),this.context.disableTools()}}),dt(this,"onMouseMove",e=>{this.state==="drawing"&&(this.endPoint=this.getPoint(e),this.updateGraphic())})}onInit(){this.zr=this.chart.getZr(),this.context.registerDrawingRenderer(new xe)}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.removeGraphic()}onDestroy(){this.removeGraphic()}initGraphic(){this.group||(this.group=new D.graphic.Group,this.line=new D.graphic.Line({shape:{x1:0,y1:0,x2:0,y2:0},style:{stroke:At,lineWidth:1},z:100}),this.dashLineForward=new D.graphic.Line({shape:{x1:0,y1:0,x2:0,y2:0},style:{stroke:At,lineWidth:1,lineDash:[4,4],opacity:.5},z:99}),this.dashLineBackward=new D.graphic.Line({shape:{x1:0,y1:0,x2:0,y2:0},style:{stroke:At,lineWidth:1,lineDash:[4,4],opacity:.5},z:99}),this.startCircle=new D.graphic.Circle({shape:{cx:0,cy:0,r:4},style:{fill:"#fff",stroke:At,lineWidth:1},z:101}),this.endCircle=new D.graphic.Circle({shape:{cx:0,cy:0,r:4},style:{fill:"#fff",stroke:At,lineWidth:1},z:101}),this.group.add(this.dashLineBackward),this.group.add(this.dashLineForward),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)}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});const r=i-t,n=s-e;if(r===0&&n===0)return;const[h,a]=this.extendToEdge(t,e,r,n);this.dashLineForward.setShape({x1:i,y1:s,x2:h,y2:a});const[o,d]=this.extendToEdge(i,s,-r,-n);this.dashLineBackward.setShape({x1:t,y1:e,x2:o,y2:d})}extendToEdge(t,e,i,s){const r=this.chart.getWidth(),n=this.chart.getHeight();let h=1/0;if(i!==0){const a=i>0?(r-t)/i:-t/i;a>0&&(h=Math.min(h,a))}if(s!==0){const a=s>0?(n-e)/s:-e/s;a>0&&(h=Math.min(h,a))}return isFinite(h)||(h=1),[t+h*i,e+h*s]}}var xs=Object.defineProperty,ms=(l,t,e)=>t in l?xs(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,bs=(l,t,e)=>(ms(l,typeof t!="symbol"?t+"":t,e),e);class me{constructor(){bs(this,"type","trend-angle")}render(t){const{drawing:e,pixelPoints:i,isSelected:s}=t,[r,n]=i[0],[h,a]=i[1],o=e.style?.color||"#d1d4dc",d=h-r,u=a-n,c=Math.atan2(-u,d),g=(c*(180/Math.PI)).toFixed(1),p=Math.min(30,Math.sqrt(d*d+u*u)*.3),y=r+Math.max(Math.abs(d),p+20),f=0,x=-c;return{type:"group",children:[{type:"line",name:"line",shape:{x1:r,y1:n,x2:h,y2:a},style:{stroke:o,lineWidth:e.style?.lineWidth||1}},{type:"line",shape:{x1:r,y1:n,x2:y,y2:n},style:{stroke:o,lineWidth:1,opacity:.4,lineDash:[4,4]}},{type:"arc",shape:{cx:r,cy:n,r:p,startAngle:Math.min(f,x),endAngle:Math.max(f,x)},style:{stroke:o,lineWidth:1.5,fill:"none"}},{type:"text",x:r+p+6,y:n+(u<0?-14:2),style:{text:`${g}\xB0`,fill:o,fontSize:11,fontFamily:"sans-serif"},z2:10},{type:"circle",name:"point-0",shape:{cx:r,cy:n,r:4},style:{fill:"#fff",stroke:o,lineWidth:1,opacity:s?1:0}},{type:"circle",name:"point-1",shape:{cx:h,cy:a,r:4},style:{fill:"#fff",stroke:o,lineWidth:1,opacity:s?1:0}}]}}}var vs=Object.defineProperty,ws=(l,t,e)=>t in l?vs(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,ht=(l,t,e)=>(ws(l,typeof t!="symbol"?t+"":t,e),e);const wt="#d1d4dc";class Cs extends X{constructor(t={}){super({id:"trend-angle-tool",name:t?.name||"Trend Angle",icon:t?.icon||'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="3" y1="20" x2="21" y2="6"/><line x1="3" y1="20" x2="14" y2="20" opacity="0.4"/><path d="M8 20 A5 5 0 0 1 7 16" stroke-width="1.5"/></svg>'}),ht(this,"zr"),ht(this,"state","idle"),ht(this,"startPoint",null),ht(this,"endPoint",null),ht(this,"group",null),ht(this,"line",null),ht(this,"hRefLine",null),ht(this,"arc",null),ht(this,"angleText",null),ht(this,"startCircle",null),ht(this,"endCircle",null),ht(this,"onClick",e=>{if(this.state==="idle")this.state="drawing",this.startPoint=this.getPoint(e),this.endPoint=this.getPoint(e),this.initGraphic(),this.updateGraphic();else if(this.state==="drawing"){if(this.state="finished",this.endPoint=this.getPoint(e),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]});i&&s&&this.context.addDrawing({id:`trend-angle-${Date.now()}`,type:"trend-angle",points:[i,s],paneIndex:i.paneIndex||0,style:{color:wt,lineWidth:1}})}this.removeGraphic(),this.context.disableTools()}}),ht(this,"onMouseMove",e=>{this.state==="drawing"&&(this.endPoint=this.getPoint(e),this.updateGraphic())})}onInit(){this.zr=this.chart.getZr(),this.context.registerDrawingRenderer(new me)}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.removeGraphic()}onDestroy(){this.removeGraphic()}initGraphic(){this.group||(this.group=new D.graphic.Group,this.line=new D.graphic.Line({shape:{x1:0,y1:0,x2:0,y2:0},style:{stroke:wt,lineWidth:1},z:100}),this.hRefLine=new D.graphic.Line({shape:{x1:0,y1:0,x2:0,y2:0},style:{stroke:wt,lineWidth:1,lineDash:[4,4],opacity:.4},z:99}),this.arc=new D.graphic.Arc({shape:{cx:0,cy:0,r:25,startAngle:0,endAngle:0},style:{stroke:wt,lineWidth:1,fill:"none"},z:99}),this.angleText=new D.graphic.Text({style:{text:"",fill:wt,fontSize:11,fontFamily:"sans-serif"},z:101}),this.startCircle=new D.graphic.Circle({shape:{cx:0,cy:0,r:4},style:{fill:"#fff",stroke:wt,lineWidth:1},z:101}),this.endCircle=new D.graphic.Circle({shape:{cx:0,cy:0,r:4},style:{fill:"#fff",stroke:wt,lineWidth:1},z:101}),this.group.add(this.hRefLine),this.group.add(this.arc),this.group.add(this.line),this.group.add(this.angleText),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)}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});const r=i-t,n=s-e,h=Math.max(Math.abs(r),40);this.hRefLine.setShape({x1:t,y1:e,x2:t+h,y2:e});const a=Math.atan2(-n,r)*(180/Math.PI),o=Math.min(25,Math.sqrt(r*r+n*n)*.3),d=Math.atan2(n,r),u=Math.min(0,d),c=Math.max(0,d);this.arc.setShape({cx:t,cy:e,r:o,startAngle:u,endAngle:c}),this.angleText.setStyle({text:`${a.toFixed(1)}\xB0`}),this.angleText.x=t+o+6,this.angleText.y=e+(n<0?-14:2),this.angleText.markRedraw()}}var Ps=Object.defineProperty,ks=(l,t,e)=>t in l?Ps(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,Ds=(l,t,e)=>(ks(l,typeof t!="symbol"?t+"":t,e),e);class be{constructor(){Ds(this,"type","horizontal-line")}render(t){const{drawing:e,pixelPoints:i,isSelected:s,coordSys:r}=t,[n,h]=i[0],a=e.style?.color||"#d1d4dc",o=r.x,d=r.x+r.width;return{type:"group",children:[{type:"line",name:"line",shape:{x1:o,y1:h,x2:d,y2:h},style:{stroke:a,lineWidth:e.style?.lineWidth||1}},{type:"rect",shape:{x:d-70,y:h-10,width:65,height:18,r:2},style:{fill:a,opacity:.9},z2:10},{type:"text",x:d-67,y:h-8,style:{text:e.points[0].value.toFixed(2),fill:"#fff",fontSize:10,fontFamily:"monospace"},z2:11},{type:"circle",name:"point-0",shape:{cx:n,cy:h,r:4},style:{fill:"#fff",stroke:a,lineWidth:1,opacity:s?1:0}}]}}}var Is=Object.defineProperty,Ss=(l,t,e)=>t in l?Is(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,ve=(l,t,e)=>(Ss(l,typeof t!="symbol"?t+"":t,e),e);class As extends X{constructor(t={}){super({id:"horizontal-line-tool",name:t?.name||"Horizontal Line",icon:t?.icon||'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="2" y1="12" x2="22" y2="12"/><circle cx="12" cy="12" r="2" fill="currentColor"/></svg>'}),ve(this,"zr"),ve(this,"onClick",e=>{const i=this.getPoint(e);if(!i)return;const s=this.context.coordinateConversion.pixelToData({x:i[0],y:i[1]});s&&this.context.addDrawing({id:`hline-${Date.now()}`,type:"horizontal-line",points:[s],paneIndex:s.paneIndex||0,style:{color:"#d1d4dc",lineWidth:1}}),this.context.disableTools()})}onInit(){this.zr=this.chart.getZr(),this.context.registerDrawingRenderer(new be)}onActivate(){this.chart.getZr().setCursorStyle("crosshair"),this.zr.on("click",this.onClick)}onDeactivate(){this.chart.getZr().setCursorStyle("default"),this.zr.off("click",this.onClick)}onDestroy(){}}var Ms=Object.defineProperty,_s=(l,t,e)=>t in l?Ms(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,Gs=(l,t,e)=>(_s(l,typeof t!="symbol"?t+"":t,e),e);class we{constructor(){Gs(this,"type","horizontal-ray")}render(t){const{drawing:e,pixelPoints:i,isSelected:s,coordSys:r}=t,[n,h]=i[0],a=e.style?.color||"#d1d4dc",o=r.x+r.width;return{type:"group",children:[{type:"line",name:"line",shape:{x1:n,y1:h,x2:o,y2:h},style:{stroke:a,lineWidth:e.style?.lineWidth||1}},{type:"circle",name:"point-0",shape:{cx:n,cy:h,r:4},style:{fill:"#fff",stroke:a,lineWidth:1,opacity:s?1:0}}]}}}var $s=Object.defineProperty,zs=(l,t,e)=>t in l?$s(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,Ce=(l,t,e)=>(zs(l,typeof t!="symbol"?t+"":t,e),e);class Es extends X{constructor(t={}){super({id:"horizontal-ray-tool",name:t?.name||"Horizontal Ray",icon:t?.icon||'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="4" y1="12" x2="22" y2="12"/><circle cx="4" cy="12" r="2" fill="currentColor"/></svg>'}),Ce(this,"zr"),Ce(this,"onClick",e=>{const i=this.getPoint(e);if(!i)return;const s=this.context.coordinateConversion.pixelToData({x:i[0],y:i[1]});s&&this.context.addDrawing({id:`hray-${Date.now()}`,type:"horizontal-ray",points:[s],paneIndex:s.paneIndex||0,style:{color:"#d1d4dc",lineWidth:1}}),this.context.disableTools()})}onInit(){this.zr=this.chart.getZr(),this.context.registerDrawingRenderer(new we)}onActivate(){this.chart.getZr().setCursorStyle("crosshair"),this.zr.on("click",this.onClick)}onDeactivate(){this.chart.getZr().setCursorStyle("default"),this.zr.off("click",this.onClick)}onDestroy(){}}var Ls=Object.defineProperty,Ts=(l,t,e)=>t in l?Ls(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,Ws=(l,t,e)=>(Ts(l,typeof t!="symbol"?t+"":t,e),e);class Pe{constructor(){Ws(this,"type","vertical-line")}render(t){const{drawing:e,pixelPoints:i,isSelected:s,coordSys:r}=t,[n,h]=i[0],a=e.style?.color||"#d1d4dc",o=r.y,d=r.y+r.height;return{type:"group",children:[{type:"line",name:"line",shape:{x1:n,y1:o,x2:n,y2:d},style:{stroke:a,lineWidth:e.style?.lineWidth||1}},{type:"circle",name:"point-0",shape:{cx:n,cy:h,r:4},style:{fill:"#fff",stroke:a,lineWidth:1,opacity:s?1:0}}]}}}var Zs=Object.defineProperty,Fs=(l,t,e)=>t in l?Zs(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,ke=(l,t,e)=>(Fs(l,typeof t!="symbol"?t+"":t,e),e);class Ns extends X{constructor(t={}){super({id:"vertical-line-tool",name:t?.name||"Vertical Line",icon:t?.icon||'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="12" y1="2" x2="12" y2="22"/><circle cx="12" cy="12" r="2" fill="currentColor"/></svg>'}),ke(this,"zr"),ke(this,"onClick",e=>{const i=this.getPoint(e);if(!i)return;const s=this.context.coordinateConversion.pixelToData({x:i[0],y:i[1]});s&&this.context.addDrawing({id:`vline-${Date.now()}`,type:"vertical-line",points:[s],paneIndex:s.paneIndex||0,style:{color:"#d1d4dc",lineWidth:1}}),this.context.disableTools()})}onInit(){this.zr=this.chart.getZr(),this.context.registerDrawingRenderer(new Pe)}onActivate(){this.chart.getZr().setCursorStyle("crosshair"),this.zr.on("click",this.onClick)}onDeactivate(){this.chart.getZr().setCursorStyle("default"),this.zr.off("click",this.onClick)}onDestroy(){}}var Rs=Object.defineProperty,Os=(l,t,e)=>t in l?Rs(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,Hs=(l,t,e)=>(Os(l,typeof t!="symbol"?t+"":t,e),e);class De{constructor(){Hs(this,"type","cross-line")}render(t){const{drawing:e,pixelPoints:i,isSelected:s,coordSys:r}=t,[n,h]=i[0],a=e.style?.color||"#d1d4dc",o=r.x,d=r.x+r.width,u=r.y,c=r.y+r.height;return{type:"group",children:[{type:"line",name:"line-h",shape:{x1:o,y1:h,x2:d,y2:h},style:{stroke:a,lineWidth:e.style?.lineWidth||1}},{type:"line",name:"line-v",shape:{x1:n,y1:u,x2:n,y2:c},style:{stroke:a,lineWidth:e.style?.lineWidth||1}},{type:"circle",name:"point-0",shape:{cx:n,cy:h,r:4},style:{fill:"#fff",stroke:a,lineWidth:1,opacity:s?1:0}}]}}}var Bs=Object.defineProperty,js=(l,t,e)=>t in l?Bs(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,Ie=(l,t,e)=>(js(l,typeof t!="symbol"?t+"":t,e),e);class Ys extends X{constructor(t={}){super({id:"cross-line-tool",name:t?.name||"Cross Line",icon:t?.icon||'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="12" y1="2" x2="12" y2="22"/><line x1="2" y1="12" x2="22" y2="12"/></svg>'}),Ie(this,"zr"),Ie(this,"onClick",e=>{const i=this.getPoint(e);if(!i)return;const s=this.context.coordinateConversion.pixelToData({x:i[0],y:i[1]});s&&this.context.addDrawing({id:`crossline-${Date.now()}`,type:"cross-line",points:[s],paneIndex:s.paneIndex||0,style:{color:"#d1d4dc",lineWidth:1}}),this.context.disableTools()})}onInit(){this.zr=this.chart.getZr(),this.context.registerDrawingRenderer(new De)}onActivate(){this.chart.getZr().setCursorStyle("crosshair"),this.zr.on("click",this.onClick)}onDeactivate(){this.chart.getZr().setCursorStyle("default"),this.zr.off("click",this.onClick)}onDestroy(){}}var Vs=Object.defineProperty,Xs=(l,t,e)=>t in l?Vs(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,qs=(l,t,e)=>(Xs(l,typeof t!="symbol"?t+"":t,e),e);const ee=[0,.236,.382,.5,.618,.786,1],Bt=["#787b86","#f44336","#ff9800","#4caf50","#2196f3","#00bcd4","#787b86"];class Se{constructor(){qs(this,"type","fibonacci")}render(t){const{drawing:e,pixelPoints:i,isSelected:s}=t,[r,n]=i[0],[h,a]=i[1],o=e.style?.color||"#3b82f6",d=Math.min(r,h),u=Math.max(r,h),c=u-d,g=a-n,p=e.points[0].value,y=e.points[1].value,f=y-p,x=[],m=[];return ee.forEach((A,v)=>{const I=a-g*A,b=Bt[v%Bt.length];m.push({type:"line",shape:{x1:d,y1:I,x2:u,y2:I},style:{stroke:b,lineWidth:1},silent:!0});const C=y-f*A;if(m.push({type:"text",style:{text:`${A} (${C.toFixed(2)})`,x:d+5,y:I-10,fill:b,fontSize:10},silent:!0}),v<ee.length-1){const w=ee[v+1],k=a-g*w,M=Math.abs(k-I),G=Math.min(I,k);x.push({type:"rect",name:"line",shape:{x:d,y:G,width:c,height:M},style:{fill:Bt[(v+1)%Bt.length],opacity:.1}})}}),{type:"group",children:[...x,...m,{type:"line",name:"line",shape:{x1:r,y1:n,x2:h,y2:a},style:{stroke:"#999",lineWidth:1,lineDash:[4,4]}},{type:"circle",name:"point-0",shape:{cx:r,cy:n,r:4},style:{fill:"#fff",stroke:o,lineWidth:1,opacity:s?1:0},z:100},{type:"circle",name:"point-1",shape:{cx:h,cy:a,r:4},style:{fill:"#fff",stroke:o,lineWidth:1,opacity:s?1:0},z:100}]}}}var Us=Object.defineProperty,Ks=(l,t,e)=>t in l?Us(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,mt=(l,t,e)=>(Ks(l,typeof t!="symbol"?t+"":t,e),e);class Js extends X{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>'}),mt(this,"startPoint",null),mt(this,"endPoint",null),mt(this,"state","idle"),mt(this,"graphicGroup",null),mt(this,"levels",[0,.236,.382,.5,.618,.786,1]),mt(this,"colors",["#787b86","#f44336","#ff9800","#4caf50","#2196f3","#00bcd4","#787b86"]),mt(this,"onClick",e=>{this.state==="idle"?(this.state="drawing",this.startPoint=this.getPoint(e),this.endPoint=this.getPoint(e),this.initGraphic(),this.updateGraphic()):this.state==="drawing"&&(this.state="finished",this.endPoint=this.getPoint(e),this.updateGraphic(),this.saveDrawing(),this.removeGraphic(),this.context.disableTools())}),mt(this,"onMouseMove",e=>{this.state==="drawing"&&(this.endPoint=this.getPoint(e),this.updateGraphic())})}onInit(){this.context.registerDrawingRenderer(new Se)}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 D.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],r=new D.graphic.Line({shape:{x1:t,y1:e,x2:i,y2:s},style:{stroke:"#999",lineWidth:1,lineDash:[4,4]},silent:!0});this.graphicGroup.add(r);const n=Math.min(t,i),h=Math.max(t,i),a=h-n,o=s-e;this.levels.forEach((d,u)=>{const c=s-o*d,g=this.colors[u%this.colors.length],p=new D.graphic.Line({shape:{x1:n,y1:c,x2:h,y2:c},style:{stroke:g,lineWidth:1},silent:!0});if(this.graphicGroup.add(p),u<this.levels.length-1){const y=this.levels[u+1],f=s-o*y,x=Math.abs(f-c),m=Math.min(c,f),A=new D.graphic.Rect({shape:{x:n,y:m,width:a,height:x},style:{fill:this.colors[(u+1)%this.colors.length],opacity:.1},silent:!0});this.graphicGroup.add(A)}})}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}})}}}var Qs=Object.defineProperty,tn=(l,t,e)=>t in l?Qs(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,en=(l,t,e)=>(tn(l,typeof t!="symbol"?t+"":t,e),e);const jt=[0,.236,.382,.5,.618,.786,1],Yt=["#787b86","#f44336","#ff9800","#4caf50","#2196f3","#00bcd4","#787b86"];class Ae{constructor(){en(this,"type","fibonacci_channel")}render(t){const{drawing:e,pixelPoints:i,isSelected:s}=t,[r,n]=i[0],[h,a]=i[1],[o,d]=i[2],u=e.style?.color||"#3b82f6",c=h-r,g=a-n,p=Math.sqrt(c*c+g*g);if(p===0)return;const y=-g/p,f=c/p,x=(o-r)*y+(d-n)*f,m=[],A=[];return jt.forEach((v,I)=>{const b=y*x*v,C=f*x*v,w=r+b,k=n+C,M=h+b,G=a+C;if(A.push({lx1:w,ly1:k,lx2:M,ly2:G}),I<jt.length-1){const _=jt[I+1],E=y*x*_,L=f*x*_;m.push({type:"polygon",name:"line",shape:{points:[[w,k],[M,G],[h+E,a+L],[r+E,n+L]]},style:{fill:Yt[(I+1)%Yt.length],opacity:.1}})}}),A.forEach((v,I)=>{const b=Yt[I%Yt.length];m.push({type:"line",shape:{x1:v.lx1,y1:v.ly1,x2:v.lx2,y2:v.ly2},style:{stroke:b,lineWidth:1},silent:!0}),m.push({type:"text",style:{text:`${jt[I]}`,x:v.lx2+5,y:v.ly2-5,fill:b,fontSize:10},silent:!0})}),m.push({type:"line",name:"line",shape:{x1:r,y1:n,x2:h,y2:a},style:{stroke:"#999",lineWidth:1,lineDash:[4,4]}}),m.push({type:"circle",name:"point-0",shape:{cx:r,cy:n,r:4},style:{fill:"#fff",stroke:u,lineWidth:1,opacity:s?1:0},z:100}),m.push({type:"circle",name:"point-1",shape:{cx:h,cy:a,r:4},style:{fill:"#fff",stroke:u,lineWidth:1,opacity:s?1:0},z:100}),m.push({type:"circle",name:"point-2",shape:{cx:o,cy:d,r:4},style:{fill:"#fff",stroke:u,lineWidth:1,opacity:s?1:0},z:100}),{type:"group",children:m}}}var sn=Object.defineProperty,nn=(l,t,e)=>t in l?sn(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,yt=(l,t,e)=>(nn(l,typeof t!="symbol"?t+"":t,e),e);class on extends X{constructor(t={}){super({id:"fibonacci-channel-tool",name:t.name||"Fibonacci Channel",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-200v-80l80-80H120v-80h160l120-120H120v-80h360l120-120H120v-80h720v80H520l-120 120h440v80H320L200-440h640v80H280l-80 80h640v80H120Z"/></svg>'}),yt(this,"startPoint",null),yt(this,"endPoint",null),yt(this,"widthPoint",null),yt(this,"state","idle"),yt(this,"graphicGroup",null),yt(this,"levels",[0,.236,.382,.5,.618,.786,1]),yt(this,"colors",["#787b86","#f44336","#ff9800","#4caf50","#2196f3","#00bcd4","#787b86"]),yt(this,"onClick",e=>{this.state==="idle"?(this.state="drawing-baseline",this.startPoint=this.getPoint(e),this.endPoint=this.getPoint(e),this.initGraphic(),this.updateGraphic()):this.state==="drawing-baseline"?(this.state="drawing-width",this.endPoint=this.getPoint(e),this.widthPoint=this.getPoint(e),this.updateGraphic()):this.state==="drawing-width"&&(this.state="finished",this.widthPoint=this.getPoint(e),this.updateGraphic(),this.saveDrawing(),this.removeGraphic(),this.context.disableTools())}),yt(this,"onMouseMove",e=>{this.state==="drawing-baseline"?(this.endPoint=this.getPoint(e),this.updateGraphic()):this.state==="drawing-width"&&(this.widthPoint=this.getPoint(e),this.updateGraphic())})}onInit(){this.context.registerDrawingRenderer(new Ae)}onActivate(){this.state="idle",this.startPoint=null,this.endPoint=null,this.widthPoint=null,this.context.getChart().getZr().setCursorStyle("crosshair"),this.bindEvents()}onDeactivate(){this.state="idle",this.startPoint=null,this.endPoint=null,this.widthPoint=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 D.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];if(this.graphicGroup.add(new D.graphic.Line({shape:{x1:t,y1:e,x2:i,y2:s},style:{stroke:"#787b86",lineWidth:2},silent:!0})),this.widthPoint&&this.state!=="drawing-baseline"){const r=this.widthPoint,n=i-t,h=s-e,a=Math.sqrt(n*n+h*h);if(a===0)return;const o=-h/a,d=n/a,u=(r[0]-t)*o+(r[1]-e)*d;this.levels.forEach((c,g)=>{const p=o*u*c,y=d*u*c,f=t+p,x=e+y,m=i+p,A=s+y,v=this.colors[g%this.colors.length];if(this.graphicGroup.add(new D.graphic.Line({shape:{x1:f,y1:x,x2:m,y2:A},style:{stroke:v,lineWidth:1},silent:!0})),g<this.levels.length-1){const I=this.levels[g+1],b=o*u*I,C=d*u*I,w=t+b,k=e+C,M=i+b,G=s+C;this.graphicGroup.add(new D.graphic.Polygon({shape:{points:[[f,x],[m,A],[M,G],[w,k]]},style:{fill:this.colors[(g+1)%this.colors.length],opacity:.1},silent:!0}))}})}}saveDrawing(){if(!this.startPoint||!this.endPoint||!this.widthPoint)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]}),i=this.context.coordinateConversion.pixelToData({x:this.widthPoint[0],y:this.widthPoint[1]});if(t&&e&&i){const s=t.paneIndex||0;this.context.addDrawing({id:`fib-channel-${Date.now()}`,type:"fibonacci_channel",points:[t,e,i],paneIndex:s,style:{color:"#3b82f6",lineWidth:1}})}}}var rn=Object.defineProperty,an=(l,t,e)=>t in l?rn(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,ln=(l,t,e)=>(an(l,typeof t!="symbol"?t+"":t,e),e);const ie=[0,.236,.382,.5,.618,.786,1],bt=["#787b86","#f44336","#ff9800","#4caf50","#2196f3","#00bcd4","#787b86"];class Me{constructor(){ln(this,"type","fib_speed_resistance_fan")}render(t){const{drawing:e,pixelPoints:i,isSelected:s}=t,[r,n]=i[0],[h,a]=i[1],o=e.style?.color||"#3b82f6",d=h-r,u=a-n,c=[],g=[],p=[];for(const y of ie)g.push([r+d,n+u*y]),p.push([r+d*y,n+u]);for(let y=0;y<g.length-1;y++)c.push({type:"polygon",name:"line",shape:{points:[[r,n],g[y],g[y+1]]},style:{fill:bt[(y+1)%bt.length],opacity:.06}});for(let y=0;y<p.length-1;y++)c.push({type:"polygon",name:"line",shape:{points:[[r,n],p[y],p[y+1]]},style:{fill:bt[(y+1)%bt.length],opacity:.06}});return ie.forEach((y,f)=>{const[x,m]=g[f],A=bt[f%bt.length];c.push({type:"line",shape:{x1:r,y1:n,x2:x,y2:m},style:{stroke:A,lineWidth:1},silent:!0}),c.push({type:"text",style:{text:`${y}`,x:x+3,y:m-2,fill:A,fontSize:9},silent:!0})}),ie.forEach((y,f)=>{const[x,m]=p[f],A=bt[f%bt.length];c.push({type:"line",shape:{x1:r,y1:n,x2:x,y2:m},style:{stroke:A,lineWidth:1},silent:!0}),c.push({type:"text",style:{text:`${y}`,x:x-2,y:m+8,fill:A,fontSize:9},silent:!0})}),c.push({type:"line",name:"line",shape:{x1:h,y1:n,x2:h,y2:a},style:{stroke:"#555",lineWidth:1,lineDash:[3,3]}}),c.push({type:"line",name:"line",shape:{x1:r,y1:a,x2:h,y2:a},style:{stroke:"#555",lineWidth:1,lineDash:[3,3]}}),c.push({type:"line",name:"line",shape:{x1:r,y1:n,x2:h,y2:a},style:{stroke:"#999",lineWidth:1,lineDash:[4,4]}}),c.push({type:"circle",name:"point-0",shape:{cx:r,cy:n,r:4},style:{fill:"#fff",stroke:o,lineWidth:1,opacity:s?1:0},z:100}),c.push({type:"circle",name:"point-1",shape:{cx:h,cy:a,r:4},style:{fill:"#fff",stroke:o,lineWidth:1,opacity:s?1:0},z:100}),{type:"group",children:c}}}var hn=Object.defineProperty,cn=(l,t,e)=>t in l?hn(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,Mt=(l,t,e)=>(cn(l,typeof t!="symbol"?t+"":t,e),e);const Ct=[0,.236,.382,.5,.618,.786,1],_t=["#787b86","#f44336","#ff9800","#4caf50","#2196f3","#00bcd4","#787b86"];class dn extends X{constructor(t={}){super({id:"fib-speed-resistance-fan-tool",name:t.name||"Fib Speed Resistance Fan",icon:t.icon||'<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#e3e3e3"><path d="M2 21L22 3M2 21l20-6M2 21l20-9M2 21l20-12M2 21l20-15M2 21l6-18M2 21l9-18M2 21l12-18M2 21l15-18" stroke="#e3e3e3" stroke-width="1" fill="none"/></svg>'}),Mt(this,"startPoint",null),Mt(this,"endPoint",null),Mt(this,"state","idle"),Mt(this,"graphicGroup",null),Mt(this,"onClick",e=>{this.state==="idle"?(this.state="drawing",this.startPoint=this.getPoint(e),this.endPoint=this.getPoint(e),this.initGraphic(),this.updateGraphic()):this.state==="drawing"&&(this.state="finished",this.endPoint=this.getPoint(e),this.updateGraphic(),this.saveDrawing(),this.removeGraphic(),this.context.disableTools())}),Mt(this,"onMouseMove",e=>{this.state==="drawing"&&(this.endPoint=this.getPoint(e),this.updateGraphic())})}onInit(){this.context.registerDrawingRenderer(new Me)}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 D.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],r=i-t,n=s-e;Ct.forEach((h,a)=>{const o=_t[a%_t.length];this.graphicGroup.add(new D.graphic.Line({shape:{x1:t,y1:e,x2:t+r,y2:e+n*h},style:{stroke:o,lineWidth:1},silent:!0})),this.graphicGroup.add(new D.graphic.Line({shape:{x1:t,y1:e,x2:t+r*h,y2:e+n},style:{stroke:o,lineWidth:1},silent:!0}))});for(let h=0;h<Ct.length-1;h++){const a=[t+r,e+n*Ct[h]],o=[t+r,e+n*Ct[h+1]];this.graphicGroup.add(new D.graphic.Polygon({shape:{points:[[t,e],a,o]},style:{fill:_t[(h+1)%_t.length],opacity:.06},silent:!0}))}for(let h=0;h<Ct.length-1;h++){const a=[t+r*Ct[h],e+n],o=[t+r*Ct[h+1],e+n];this.graphicGroup.add(new D.graphic.Polygon({shape:{points:[[t,e],a,o]},style:{fill:_t[(h+1)%_t.length],opacity:.06},silent:!0}))}this.graphicGroup.add(new D.graphic.Line({shape:{x1:i,y1:e,x2:i,y2:s},style:{stroke:"#555",lineWidth:1,lineDash:[3,3]},silent:!0})),this.graphicGroup.add(new D.graphic.Line({shape:{x1:t,y1:s,x2:i,y2:s},style:{stroke:"#555",lineWidth:1,lineDash:[3,3]},silent:!0})),this.graphicGroup.add(new D.graphic.Line({shape:{x1:t,y1:e,x2:i,y2:s},style:{stroke:"#999",lineWidth:1,lineDash:[4,4]},silent:!0}))}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]});t&&e&&this.context.addDrawing({id:`fib-fan-${Date.now()}`,type:"fib_speed_resistance_fan",points:[t,e],paneIndex:t.paneIndex||0,style:{color:"#3b82f6",lineWidth:1}})}}var pn=Object.defineProperty,un=(l,t,e)=>t in l?pn(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,gn=(l,t,e)=>(un(l,typeof t!="symbol"?t+"":t,e),e);const _e=[0,.236,.382,.5,.618,.786,1,1.272,1.618,2,2.618],Ge=["#787b86","#f44336","#ff9800","#4caf50","#2196f3","#00bcd4","#787b86","#e91e63","#9c27b0","#673ab7","#3f51b5"];class $e{constructor(){gn(this,"type","fib_trend_extension")}render(t){const{drawing:e,pixelPoints:i,isSelected:s,api:r}=t,n=e.style?.color||"#3b82f6";if(i.length<3)return;const[h,a]=i[0],[o,d]=i[1],[u,c]=i[2],g=e.points,p=g[1].value-g[0].value,y=Math.min(h,o,u),f=Math.max(h,o,u),x=(f-y)*.5,m=y,A=f+x,v=[],I=[];for(let w=0;w<_e.length;w++){const k=_e[w],M=g[2].value+p*k;r.coord([g[2].timeIndex+t.drawing.points[2].timeIndex-g[2].timeIndex,M]);const G=c+(d-a)*k;I.push({level:k,y:G,price:M,color:Ge[w%Ge.length]})}for(let w=0;w<I.length-1;w++){const k=I[w],M=I[w+1],G=Math.min(k.y,M.y),_=Math.abs(M.y-k.y);v.push({type:"rect",name:"line",shape:{x:m,y:G,width:A-m,height:_},style:{fill:M.color,opacity:.06}})}for(const w of I)v.push({type:"line",shape:{x1:m,y1:w.y,x2:A,y2:w.y},style:{stroke:w.color,lineWidth:1},silent:!0}),v.push({type:"text",style:{text:`${w.level} (${w.price.toFixed(2)})`,x:A+4,y:w.y-6,fill:w.color,fontSize:9},silent:!0});v.push({type:"line",name:"line",shape:{x1:h,y1:a,x2:o,y2:d},style:{stroke:"#2196f3",lineWidth:1.5,lineDash:[5,4]}}),v.push({type:"line",name:"line",shape:{x1:o,y1:d,x2:u,y2:c},style:{stroke:"#ff9800",lineWidth:1.5,lineDash:[5,4]}}),v.push({type:"circle",name:"point-0",shape:{cx:h,cy:a,r:4},style:{fill:"#fff",stroke:n,lineWidth:1,opacity:s?1:0},z:100}),v.push({type:"circle",name:"point-1",shape:{cx:o,cy:d,r:4},style:{fill:"#fff",stroke:n,lineWidth:1,opacity:s?1:0},z:100}),v.push({type:"circle",name:"point-2",shape:{cx:u,cy:c,r:4},style:{fill:"#fff",stroke:n,lineWidth:1,opacity:s?1:0},z:100});const b=["1","2","3"],C=[i[0],i[1],i[2]];for(let w=0;w<3;w++){const[k,M]=C[w],G=(w===0||M<=C[w-1][1])&&(w===2||M<=C[w+1]?.[1]);v.push({type:"text",style:{text:b[w],x:k,y:G?M-14:M+16,fill:"#e2e8f0",fontSize:12,fontWeight:"bold",align:"center",verticalAlign:"middle"},silent:!0})}return{type:"group",children:v}}}var yn=Object.defineProperty,fn=(l,t,e)=>t in l?yn(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,Et=(l,t,e)=>(fn(l,typeof t!="symbol"?t+"":t,e),e);const Vt=[0,.236,.382,.5,.618,.786,1,1.272,1.618,2,2.618],Xt=["#787b86","#f44336","#ff9800","#4caf50","#2196f3","#00bcd4","#787b86","#e91e63","#9c27b0","#673ab7","#3f51b5"];class xn extends X{constructor(t={}){super({id:"fib-trend-extension-tool",name:t.name||"Fib Trend Extension",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-160v-80h720v80H120Zm0-160v-80h720v80H120Zm0-160v-80h720v80H120Zm0-160v-80h720v80H120Zm0-160v-80h720v80H120Z"/></svg>'}),Et(this,"points",[]),Et(this,"state","idle"),Et(this,"graphicGroup",null),Et(this,"onClick",e=>{const i=this.getPoint(e);this.state==="idle"?(this.state="drawing-trend",this.points=[i,[...i]],this.initGraphic(),this.updateGraphic()):this.state==="drawing-trend"?(this.state="drawing-retracement",this.points[1]=i,this.points.push([...i]),this.updateGraphic()):this.state==="drawing-retracement"&&(this.state="finished",this.points[2]=i,this.updateGraphic(),this.saveDrawing(),this.removeGraphic(),this.context.disableTools())}),Et(this,"onMouseMove",e=>{this.state==="drawing-trend"?(this.points[1]=this.getPoint(e),this.updateGraphic()):this.state==="drawing-retracement"&&(this.points[2]=this.getPoint(e),this.updateGraphic())})}onInit(){this.context.registerDrawingRenderer(new $e)}onActivate(){this.state="idle",this.points=[],this.context.getChart().getZr().setCursorStyle("crosshair"),this.bindEvents()}onDeactivate(){this.state="idle",this.points=[],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 D.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)return;this.graphicGroup.removeAll();const[t,e]=this.points[0],[i,s]=this.points[1];if(this.graphicGroup.add(new D.graphic.Line({shape:{x1:t,y1:e,x2:i,y2:s},style:{stroke:"#2196f3",lineWidth:1.5,lineDash:[5,4]},silent:!0})),this.points.length>=3){const[r,n]=this.points[2];this.graphicGroup.add(new D.graphic.Line({shape:{x1:i,y1:s,x2:r,y2:n},style:{stroke:"#ff9800",lineWidth:1.5,lineDash:[5,4]},silent:!0}));const h=s-e,a=Math.min(t,i,r),o=Math.max(t,i,r),d=(o-a)*.5,u=a,c=o+d;for(let g=0;g<Vt.length;g++){const p=Vt[g],y=n+h*p,f=Xt[g%Xt.length];if(this.graphicGroup.add(new D.graphic.Line({shape:{x1:u,y1:y,x2:c,y2:y},style:{stroke:f,lineWidth:1},silent:!0})),this.graphicGroup.add(new D.graphic.Text({style:{text:`${p}`,x:c+4,y:y-6,fill:f,fontSize:9},silent:!0})),g<Vt.length-1){const x=n+h*Vt[g+1],m=Math.min(y,x),A=Math.abs(x-y);this.graphicGroup.add(new D.graphic.Rect({shape:{x:u,y:m,width:c-u,height:A},style:{fill:Xt[(g+1)%Xt.length],opacity:.06},silent:!0}))}}}for(const r of this.points)this.graphicGroup.add(new D.graphic.Circle({shape:{cx:r[0],cy:r[1],r:4},style:{fill:"#fff",stroke:"#3b82f6",lineWidth:1.5},z:101,silent:!0}))}saveDrawing(){const t=this.points.map(e=>this.context.coordinateConversion.pixelToData({x:e[0],y:e[1]}));t.every(e=>e!==null)&&this.context.addDrawing({id:`fib-ext-${Date.now()}`,type:"fib_trend_extension",points:t,paneIndex:t[0].paneIndex||0,style:{color:"#3b82f6",lineWidth:1}})}}var mn=Object.defineProperty,bn=(l,t,e)=>t in l?mn(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,vn=(l,t,e)=>(bn(l,typeof t!="symbol"?t+"":t,e),e);const ze=["X","A","B","C","D"],Ee=["#2196f3","#ff9800","#4caf50","#f44336"],wn="rgba(33, 150, 243, 0.08)",Cn="rgba(244, 67, 54, 0.08)";class Le{constructor(){vn(this,"type","xabcd_pattern")}render(t){const{drawing:e,pixelPoints:i,isSelected:s}=t,r=e.style?.color||"#3b82f6";if(i.length<2)return;const n=[];i.length>=3&&n.push({type:"polygon",name:"line",shape:{points:i.slice(0,3).map(([a,o])=>[a,o])},style:{fill:wn,opacity:1}}),i.length>=5&&n.push({type:"polygon",name:"line",shape:{points:i.slice(2,5).map(([a,o])=>[a,o])},style:{fill:Cn,opacity:1}});for(let a=0;a<i.length-1;a++){const[o,d]=i[a],[u,c]=i[a+1],g=Ee[a%Ee.length];n.push({type:"line",name:"line",shape:{x1:o,y1:d,x2:u,y2:c},style:{stroke:g,lineWidth:e.style?.lineWidth||2}})}const h=[[0,2],[1,3],[2,4]];for(const[a,o]of h)if(a<i.length&&o<i.length){const[d,u]=i[a],[c,g]=i[o];n.push({type:"line",shape:{x1:d,y1:u,x2:c,y2:g},style:{stroke:"#555",lineWidth:1,lineDash:[4,4]},silent:!0})}if(e.points.length>=3){const a=Math.abs(e.points[1].value-e.points[0].value),o=Math.abs(e.points[2].value-e.points[1].value);if(a!==0){const d=(o/a).toFixed(3),u=(i[1][0]+i[2][0])/2,c=(i[1][1]+i[2][1])/2;n.push({type:"text",style:{text:d,x:u+8,y:c,fill:"#ff9800",fontSize:10},silent:!0})}}if(e.points.length>=4){const a=Math.abs(e.points[2].value-e.points[1].value),o=Math.abs(e.points[3].value-e.points[2].value);if(a!==0){const d=(o/a).toFixed(3),u=(i[2][0]+i[3][0])/2,c=(i[2][1]+i[3][1])/2;n.push({type:"text",style:{text:d,x:u+8,y:c,fill:"#4caf50",fontSize:10},silent:!0})}}if(e.points.length>=5){const a=Math.abs(e.points[3].value-e.points[2].value),o=Math.abs(e.points[4].value-e.points[3].value);if(a!==0){const c=(o/a).toFixed(3),g=(i[3][0]+i[4][0])/2,p=(i[3][1]+i[4][1])/2;n.push({type:"text",style:{text:c,x:g+8,y:p,fill:"#f44336",fontSize:10},silent:!0})}const d=Math.abs(e.points[1].value-e.points[0].value),u=Math.abs(e.points[4].value-e.points[1].value);if(d!==0){const c=(u/d).toFixed(3),[g,p]=i[4];n.push({type:"text",style:{text:`AD/XA: ${c}`,x:g+10,y:p+14,fill:"#aaa",fontSize:9},silent:!0})}}for(let a=0;a<i.length&&a<ze.length;a++){const[o,d]=i[a],u=(a===0||d<=i[a-1][1])&&(a===i.length-1||d<=i[a+1]?.[1])?d-14:d+16;n.push({type:"text",style:{text:ze[a],x:o,y:u,fill:"#e2e8f0",fontSize:12,fontWeight:"bold",align:"center",verticalAlign:"middle"},silent:!0})}for(let a=0;a<i.length;a++){const[o,d]=i[a];n.push({type:"circle",name:`point-${a}`,shape:{cx:o,cy:d,r:4},style:{fill:"#fff",stroke:r,lineWidth:1,opacity:s?1:0},z:100})}return{type:"group",children:n}}}var Pn=Object.defineProperty,kn=(l,t,e)=>t in l?Pn(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,Lt=(l,t,e)=>(kn(l,typeof t!="symbol"?t+"":t,e),e);const Te=["X","A","B","C","D"],We=["#2196f3","#ff9800","#4caf50","#f44336"],Dn=5;class In extends X{constructor(t={}){super({id:"xabcd-pattern-tool",name:t.name||"XABCD Pattern",icon:t.icon||'<svg viewBox="0 0 24 24" width="24" height="24" fill="none" stroke="#e3e3e3" stroke-width="1.5"><polyline points="2,18 6,6 11,14 16,4 21,16"/><circle cx="2" cy="18" r="1.5" fill="#e3e3e3"/><circle cx="6" cy="6" r="1.5" fill="#e3e3e3"/><circle cx="11" cy="14" r="1.5" fill="#e3e3e3"/><circle cx="16" cy="4" r="1.5" fill="#e3e3e3"/><circle cx="21" cy="16" r="1.5" fill="#e3e3e3"/></svg>'}),Lt(this,"points",[]),Lt(this,"state","idle"),Lt(this,"graphicGroup",null),Lt(this,"onClick",e=>{const i=this.getPoint(e);this.state==="idle"?(this.state="drawing",this.points=[i,[...i]],this.initGraphic(),this.updateGraphic()):this.state==="drawing"&&(this.points[this.points.length-1]=i,this.points.length>=Dn?(this.state="finished",this.updateGraphic(),this.saveDrawing(),this.removeGraphic(),this.context.disableTools()):(this.points.push([...i]),this.updateGraphic()))}),Lt(this,"onMouseMove",e=>{this.state!=="drawing"||this.points.length<2||(this.points[this.points.length-1]=this.getPoint(e),this.updateGraphic())})}onInit(){this.context.registerDrawingRenderer(new Le)}onActivate(){this.state="idle",this.points=[],this.context.getChart().getZr().setCursorStyle("crosshair"),this.bindEvents()}onDeactivate(){this.state="idle",this.points=[],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 D.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)return;this.graphicGroup.removeAll();const t=this.points;t.length>=3&&this.graphicGroup.add(new D.graphic.Polygon({shape:{points:t.slice(0,3)},style:{fill:"rgba(33, 150, 243, 0.08)"},silent:!0})),t.length>=5&&this.graphicGroup.add(new D.graphic.Polygon({shape:{points:t.slice(2,5)},style:{fill:"rgba(244, 67, 54, 0.08)"},silent:!0}));for(let i=0;i<t.length-1;i++){const[s,r]=t[i],[n,h]=t[i+1];this.graphicGroup.add(new D.graphic.Line({shape:{x1:s,y1:r,x2:n,y2:h},style:{stroke:We[i%We.length],lineWidth:2},silent:!0}))}const e=[[0,2],[1,3],[2,4]];for(const[i,s]of e)if(i<t.length&&s<t.length){const[r,n]=t[i],[h,a]=t[s];this.graphicGroup.add(new D.graphic.Line({shape:{x1:r,y1:n,x2:h,y2:a},style:{stroke:"#555",lineWidth:1,lineDash:[4,4]},silent:!0}))}for(let i=0;i<t.length&&i<Te.length;i++){const[s,r]=t[i],n=(i===0||r<=t[i-1][1])&&(i===t.length-1||r<=t[i+1]?.[1])?r-14:r+16;this.graphicGroup.add(new D.graphic.Text({style:{text:Te[i],x:s,y:n,fill:"#e2e8f0",fontSize:12,fontWeight:"bold",align:"center",verticalAlign:"middle"},silent:!0}))}for(let i=0;i<t.length;i++){const[s,r]=t[i];this.graphicGroup.add(new D.graphic.Circle({shape:{cx:s,cy:r,r:4},style:{fill:"#fff",stroke:"#3b82f6",lineWidth:1.5},z:101,silent:!0}))}}saveDrawing(){const t=this.points.map(e=>this.context.coordinateConversion.pixelToData({x:e[0],y:e[1]}));t.every(e=>e!==null)&&this.context.addDrawing({id:`xabcd-${Date.now()}`,type:"xabcd_pattern",points:t,paneIndex:t[0].paneIndex||0,style:{color:"#3b82f6",lineWidth:2}})}}var Sn=Object.defineProperty,An=(l,t,e)=>t in l?Sn(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,Mn=(l,t,e)=>(An(l,typeof t!="symbol"?t+"":t,e),e);const Ze=["A","B","C","D"],Fe=["#2196f3","#ff9800","#4caf50"];class Ne{constructor(){Mn(this,"type","abcd_pattern")}render(t){const{drawing:e,pixelPoints:i,isSelected:s}=t,r=e.style?.color||"#3b82f6";if(i.length<2)return;const n=[];i.length>=3&&n.push({type:"polygon",name:"line",shape:{points:i.slice(0,3).map(([h,a])=>[h,a])},style:{fill:"rgba(33, 150, 243, 0.08)"}}),i.length>=4&&n.push({type:"polygon",name:"line",shape:{points:i.slice(1,4).map(([h,a])=>[h,a])},style:{fill:"rgba(244, 67, 54, 0.08)"}});for(let h=0;h<i.length-1;h++){const[a,o]=i[h],[d,u]=i[h+1];n.push({type:"line",name:"line",shape:{x1:a,y1:o,x2:d,y2:u},style:{stroke:Fe[h%Fe.length],lineWidth:e.style?.lineWidth||2}})}if(i.length>=3&&n.push({type:"line",shape:{x1:i[0][0],y1:i[0][1],x2:i[2][0],y2:i[2][1]},style:{stroke:"#555",lineWidth:1,lineDash:[4,4]},silent:!0}),i.length>=4&&n.push({type:"line",shape:{x1:i[1][0],y1:i[1][1],x2:i[3][0],y2:i[3][1]},style:{stroke:"#555",lineWidth:1,lineDash:[4,4]},silent:!0}),e.points.length>=3){const h=Math.abs(e.points[1].value-e.points[0].value),a=Math.abs(e.points[2].value-e.points[1].value);if(h!==0){const o=(a/h).toFixed(3),d=(i[1][0]+i[2][0])/2,u=(i[1][1]+i[2][1])/2;n.push({type:"text",style:{text:o,x:d+8,y:u,fill:"#ff9800",fontSize:10},silent:!0})}}if(e.points.length>=4){const h=Math.abs(e.points[2].value-e.points[1].value),a=Math.abs(e.points[3].value-e.points[2].value);if(h!==0){const o=(a/h).toFixed(3),d=(i[2][0]+i[3][0])/2,u=(i[2][1]+i[3][1])/2;n.push({type:"text",style:{text:o,x:d+8,y:u,fill:"#4caf50",fontSize:10},silent:!0})}}for(let h=0;h<i.length&&h<Ze.length;h++){const[a,o]=i[h],d=(h===0||o<=i[h-1][1])&&(h===i.length-1||o<=i[h+1]?.[1]);n.push({type:"text",style:{text:Ze[h],x:a,y:d?o-14:o+16,fill:"#e2e8f0",fontSize:12,fontWeight:"bold",align:"center",verticalAlign:"middle"},silent:!0})}for(let h=0;h<i.length;h++)n.push({type:"circle",name:`point-${h}`,shape:{cx:i[h][0],cy:i[h][1],r:4},style:{fill:"#fff",stroke:r,lineWidth:1,opacity:s?1:0},z:100});return{type:"group",children:n}}}var _n=Object.defineProperty,Gn=(l,t,e)=>t in l?_n(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,Tt=(l,t,e)=>(Gn(l,typeof t!="symbol"?t+"":t,e),e);const Re=["A","B","C","D"],Oe=["#2196f3","#ff9800","#4caf50"],$n=4;class zn extends X{constructor(t={}){super({id:"abcd-pattern-tool",name:t.name||"ABCD Pattern",icon:t.icon||'<svg viewBox="0 0 24 24" width="24" height="24" fill="none" stroke="#e3e3e3" stroke-width="1.5"><polyline points="3,18 8,5 15,15 21,3"/><circle cx="3" cy="18" r="1.5" fill="#e3e3e3"/><circle cx="8" cy="5" r="1.5" fill="#e3e3e3"/><circle cx="15" cy="15" r="1.5" fill="#e3e3e3"/><circle cx="21" cy="3" r="1.5" fill="#e3e3e3"/></svg>'}),Tt(this,"points",[]),Tt(this,"state","idle"),Tt(this,"graphicGroup",null),Tt(this,"onClick",e=>{const i=this.getPoint(e);this.state==="idle"?(this.state="drawing",this.points=[i,[...i]],this.initGraphic(),this.updateGraphic()):this.state==="drawing"&&(this.points[this.points.length-1]=i,this.points.length>=$n?(this.state="finished",this.updateGraphic(),this.saveDrawing(),this.removeGraphic(),this.context.disableTools()):(this.points.push([...i]),this.updateGraphic()))}),Tt(this,"onMouseMove",e=>{this.state!=="drawing"||this.points.length<2||(this.points[this.points.length-1]=this.getPoint(e),this.updateGraphic())})}onInit(){this.context.registerDrawingRenderer(new Ne)}onActivate(){this.state="idle",this.points=[],this.context.getChart().getZr().setCursorStyle("crosshair");const t=this.context.getChart().getZr();t.on("click",this.onClick),t.on("mousemove",this.onMouseMove)}onDeactivate(){this.state="idle",this.points=[],this.removeGraphic();const t=this.context.getChart().getZr();t.off("click",this.onClick),t.off("mousemove",this.onMouseMove),this.context.getChart().getZr().setCursorStyle("default")}initGraphic(){this.graphicGroup=new D.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)return;this.graphicGroup.removeAll();const t=this.points;t.length>=3&&this.graphicGroup.add(new D.graphic.Polygon({shape:{points:t.slice(0,3)},style:{fill:"rgba(33,150,243,0.08)"},silent:!0})),t.length>=4&&this.graphicGroup.add(new D.graphic.Polygon({shape:{points:t.slice(1,4)},style:{fill:"rgba(244,67,54,0.08)"},silent:!0}));for(let e=0;e<t.length-1;e++)this.graphicGroup.add(new D.graphic.Line({shape:{x1:t[e][0],y1:t[e][1],x2:t[e+1][0],y2:t[e+1][1]},style:{stroke:Oe[e%Oe.length],lineWidth:2},silent:!0}));t.length>=3&&this.graphicGroup.add(new D.graphic.Line({shape:{x1:t[0][0],y1:t[0][1],x2:t[2][0],y2:t[2][1]},style:{stroke:"#555",lineWidth:1,lineDash:[4,4]},silent:!0})),t.length>=4&&this.graphicGroup.add(new D.graphic.Line({shape:{x1:t[1][0],y1:t[1][1],x2:t[3][0],y2:t[3][1]},style:{stroke:"#555",lineWidth:1,lineDash:[4,4]},silent:!0}));for(let e=0;e<t.length&&e<Re.length;e++){const[i,s]=t[e],r=(e===0||s<=t[e-1][1])&&(e===t.length-1||s<=t[e+1]?.[1]);this.graphicGroup.add(new D.graphic.Text({style:{text:Re[e],x:i,y:r?s-14:s+16,fill:"#e2e8f0",fontSize:12,fontWeight:"bold",align:"center",verticalAlign:"middle"},silent:!0})),this.graphicGroup.add(new D.graphic.Circle({shape:{cx:i,cy:s,r:4},style:{fill:"#fff",stroke:"#3b82f6",lineWidth:1.5},z:101,silent:!0}))}}saveDrawing(){const t=this.points.map(e=>this.context.coordinateConversion.pixelToData({x:e[0],y:e[1]}));t.every(e=>e!==null)&&this.context.addDrawing({id:`abcd-${Date.now()}`,type:"abcd_pattern",points:t,paneIndex:t[0].paneIndex||0,style:{color:"#3b82f6",lineWidth:2}})}}var En=Object.defineProperty,Ln=(l,t,e)=>t in l?En(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,Tn=(l,t,e)=>(Ln(l,typeof t!="symbol"?t+"":t,e),e);const He=["X","A","B","C","D"],Be=["#00bcd4","#e91e63","#8bc34a","#ff5722"];class je{constructor(){Tn(this,"type","cypher_pattern")}render(t){const{drawing:e,pixelPoints:i,isSelected:s}=t,r=e.style?.color||"#3b82f6";if(i.length<2)return;const n=[];i.length>=3&&n.push({type:"polygon",name:"line",shape:{points:i.slice(0,3).map(([o,d])=>[o,d])},style:{fill:"rgba(0, 188, 212, 0.08)"}}),i.length>=5&&n.push({type:"polygon",name:"line",shape:{points:i.slice(2,5).map(([o,d])=>[o,d])},style:{fill:"rgba(233, 30, 99, 0.08)"}});for(let o=0;o<i.length-1;o++){const[d,u]=i[o],[c,g]=i[o+1];n.push({type:"line",name:"line",shape:{x1:d,y1:u,x2:c,y2:g},style:{stroke:Be[o%Be.length],lineWidth:e.style?.lineWidth||2}})}const h=[[0,2],[0,3],[1,4]];for(const[o,d]of h)o<i.length&&d<i.length&&n.push({type:"line",shape:{x1:i[o][0],y1:i[o][1],x2:i[d][0],y2:i[d][1]},style:{stroke:"#555",lineWidth:1,lineDash:[4,4]},silent:!0});const a=e.points;if(a.length>=3){const o=Math.abs(a[1].value-a[0].value),d=Math.abs(a[2].value-a[1].value);if(o!==0){const u=(d/o).toFixed(3);n.push({type:"text",style:{text:u,x:(i[1][0]+i[2][0])/2+8,y:(i[1][1]+i[2][1])/2,fill:"#e91e63",fontSize:10},silent:!0})}}if(a.length>=4){const o=Math.abs(a[1].value-a[0].value),d=Math.abs(a[3].value-a[0].value);if(o!==0){const u=(d/o).toFixed(3);n.push({type:"text",style:{text:`XC/XA: ${u}`,x:(i[0][0]+i[3][0])/2+8,y:(i[0][1]+i[3][1])/2,fill:"#8bc34a",fontSize:10},silent:!0})}}if(a.length>=5){const o=Math.abs(a[3].value-a[0].value),d=Math.abs(a[4].value-a[3].value);if(o!==0){const u=(d/o).toFixed(3);n.push({type:"text",style:{text:u,x:(i[3][0]+i[4][0])/2+8,y:(i[3][1]+i[4][1])/2,fill:"#ff5722",fontSize:10},silent:!0})}}for(let o=0;o<i.length&&o<He.length;o++){const[d,u]=i[o],c=(o===0||u<=i[o-1][1])&&(o===i.length-1||u<=i[o+1]?.[1]);n.push({type:"text",style:{text:He[o],x:d,y:c?u-14:u+16,fill:"#e2e8f0",fontSize:12,fontWeight:"bold",align:"center",verticalAlign:"middle"},silent:!0})}for(let o=0;o<i.length;o++)n.push({type:"circle",name:`point-${o}`,shape:{cx:i[o][0],cy:i[o][1],r:4},style:{fill:"#fff",stroke:r,lineWidth:1,opacity:s?1:0},z:100});return{type:"group",children:n}}}var Wn=Object.defineProperty,Zn=(l,t,e)=>t in l?Wn(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,Wt=(l,t,e)=>(Zn(l,typeof t!="symbol"?t+"":t,e),e);const Ye=["X","A","B","C","D"],Ve=["#00bcd4","#e91e63","#8bc34a","#ff5722"],Fn=5;class Nn extends X{constructor(t={}){super({id:"cypher-pattern-tool",name:t.name||"Cypher Pattern",icon:t.icon||'<svg viewBox="0 0 24 24" width="24" height="24" fill="none" stroke="#e3e3e3" stroke-width="1.5"><polyline points="2,16 7,4 11,12 17,2 22,14"/><circle cx="2" cy="16" r="1.5" fill="#e3e3e3"/><circle cx="7" cy="4" r="1.5" fill="#e3e3e3"/><circle cx="11" cy="12" r="1.5" fill="#e3e3e3"/><circle cx="17" cy="2" r="1.5" fill="#e3e3e3"/><circle cx="22" cy="14" r="1.5" fill="#e3e3e3"/></svg>'}),Wt(this,"points",[]),Wt(this,"state","idle"),Wt(this,"graphicGroup",null),Wt(this,"onClick",e=>{const i=this.getPoint(e);this.state==="idle"?(this.state="drawing",this.points=[i,[...i]],this.initGraphic(),this.updateGraphic()):this.state==="drawing"&&(this.points[this.points.length-1]=i,this.points.length>=Fn?(this.state="finished",this.updateGraphic(),this.saveDrawing(),this.removeGraphic(),this.context.disableTools()):(this.points.push([...i]),this.updateGraphic()))}),Wt(this,"onMouseMove",e=>{this.state!=="drawing"||this.points.length<2||(this.points[this.points.length-1]=this.getPoint(e),this.updateGraphic())})}onInit(){this.context.registerDrawingRenderer(new je)}onActivate(){this.state="idle",this.points=[],this.context.getChart().getZr().setCursorStyle("crosshair");const t=this.context.getChart().getZr();t.on("click",this.onClick),t.on("mousemove",this.onMouseMove)}onDeactivate(){this.state="idle",this.points=[],this.removeGraphic();const t=this.context.getChart().getZr();t.off("click",this.onClick),t.off("mousemove",this.onMouseMove),t.setCursorStyle("default")}initGraphic(){this.graphicGroup=new D.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)return;this.graphicGroup.removeAll();const t=this.points;t.length>=3&&this.graphicGroup.add(new D.graphic.Polygon({shape:{points:t.slice(0,3)},style:{fill:"rgba(0,188,212,0.08)"},silent:!0})),t.length>=5&&this.graphicGroup.add(new D.graphic.Polygon({shape:{points:t.slice(2,5)},style:{fill:"rgba(233,30,99,0.08)"},silent:!0}));for(let e=0;e<t.length-1;e++)this.graphicGroup.add(new D.graphic.Line({shape:{x1:t[e][0],y1:t[e][1],x2:t[e+1][0],y2:t[e+1][1]},style:{stroke:Ve[e%Ve.length],lineWidth:2},silent:!0}));for(let e=0;e<t.length&&e<Ye.length;e++){const[i,s]=t[e],r=(e===0||s<=t[e-1][1])&&(e===t.length-1||s<=t[e+1]?.[1]);this.graphicGroup.add(new D.graphic.Text({style:{text:Ye[e],x:i,y:r?s-14:s+16,fill:"#e2e8f0",fontSize:12,fontWeight:"bold",align:"center",verticalAlign:"middle"},silent:!0})),this.graphicGroup.add(new D.graphic.Circle({shape:{cx:i,cy:s,r:4},style:{fill:"#fff",stroke:"#3b82f6",lineWidth:1.5},z:101,silent:!0}))}}saveDrawing(){const t=this.points.map(e=>this.context.coordinateConversion.pixelToData({x:e[0],y:e[1]}));t.every(e=>e!==null)&&this.context.addDrawing({id:`cypher-${Date.now()}`,type:"cypher_pattern",points:t,paneIndex:t[0].paneIndex||0,style:{color:"#3b82f6",lineWidth:2}})}}var Rn=Object.defineProperty,On=(l,t,e)=>t in l?Rn(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,Hn=(l,t,e)=>(On(l,typeof t!="symbol"?t+"":t,e),e);const se=["","LS","","H","","RS",""];class Xe{constructor(){Hn(this,"type","head_and_shoulders")}render(t){const{drawing:e,pixelPoints:i,isSelected:s}=t,r=e.style?.color||"#3b82f6";if(i.length<2)return;const n=[];i.length>=3&&n.push({type:"polygon",name:"line",shape:{points:i.slice(0,3).map(([h,a])=>[h,a])},style:{fill:"rgba(33, 150, 243, 0.06)"}}),i.length>=5&&n.push({type:"polygon",name:"line",shape:{points:i.slice(2,5).map(([h,a])=>[h,a])},style:{fill:"rgba(244, 67, 54, 0.08)"}}),i.length>=7&&n.push({type:"polygon",name:"line",shape:{points:i.slice(4,7).map(([h,a])=>[h,a])},style:{fill:"rgba(33, 150, 243, 0.06)"}});for(let h=0;h<i.length-1;h++){const[a,o]=i[h],[d,u]=i[h+1];n.push({type:"line",name:"line",shape:{x1:a,y1:o,x2:d,y2:u},style:{stroke:"#2196f3",lineWidth:e.style?.lineWidth||2}})}if(i.length>=5){const[h,a]=i[2],[o,d]=i[4],u=o-h,c=d-a,g=.3,p=.3,y=h-u*g,f=a-c*g,x=o+u*p,m=d+c*p;n.push({type:"line",shape:{x1:y,y1:f,x2:x,y2:m},style:{stroke:"#ff9800",lineWidth:2,lineDash:[6,4]},silent:!0}),n.push({type:"text",style:{text:"Neckline",x:(h+o)/2,y:(a+d)/2+14,fill:"#ff9800",fontSize:10,align:"center"},silent:!0})}for(let h=0;h<i.length&&h<se.length;h++){if(!se[h])continue;const[a,o]=i[h],d=(h===0||o<=i[h-1][1])&&(h===i.length-1||o<=i[h+1]?.[1]);n.push({type:"text",style:{text:se[h],x:a,y:d?o-14:o+16,fill:"#e2e8f0",fontSize:12,fontWeight:"bold",align:"center",verticalAlign:"middle"},silent:!0})}for(let h=0;h<i.length;h++)n.push({type:"circle",name:`point-${h}`,shape:{cx:i[h][0],cy:i[h][1],r:4},style:{fill:"#fff",stroke:r,lineWidth:1,opacity:s?1:0},z:100});return{type:"group",children:n}}}var Bn=Object.defineProperty,jn=(l,t,e)=>t in l?Bn(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,Zt=(l,t,e)=>(jn(l,typeof t!="symbol"?t+"":t,e),e);const ne=["","LS","","H","","RS",""],Yn=7;class Vn extends X{constructor(t={}){super({id:"head-and-shoulders-tool",name:t.name||"Head & Shoulders",icon:t.icon||'<svg viewBox="0 0 24 24" width="24" height="24" fill="none" stroke="#e3e3e3" stroke-width="1.5"><polyline points="1,18 4,10 7,14 12,3 17,14 20,10 23,18"/></svg>'}),Zt(this,"points",[]),Zt(this,"state","idle"),Zt(this,"graphicGroup",null),Zt(this,"onClick",e=>{const i=this.getPoint(e);this.state==="idle"?(this.state="drawing",this.points=[i,[...i]],this.initGraphic(),this.updateGraphic()):this.state==="drawing"&&(this.points[this.points.length-1]=i,this.points.length>=Yn?(this.state="finished",this.updateGraphic(),this.saveDrawing(),this.removeGraphic(),this.context.disableTools()):(this.points.push([...i]),this.updateGraphic()))}),Zt(this,"onMouseMove",e=>{this.state!=="drawing"||this.points.length<2||(this.points[this.points.length-1]=this.getPoint(e),this.updateGraphic())})}onInit(){this.context.registerDrawingRenderer(new Xe)}onActivate(){this.state="idle",this.points=[],this.context.getChart().getZr().setCursorStyle("crosshair");const t=this.context.getChart().getZr();t.on("click",this.onClick),t.on("mousemove",this.onMouseMove)}onDeactivate(){this.state="idle",this.points=[],this.removeGraphic();const t=this.context.getChart().getZr();t.off("click",this.onClick),t.off("mousemove",this.onMouseMove),t.setCursorStyle("default")}initGraphic(){this.graphicGroup=new D.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)return;this.graphicGroup.removeAll();const t=this.points;t.length>=3&&this.graphicGroup.add(new D.graphic.Polygon({shape:{points:t.slice(0,3)},style:{fill:"rgba(33,150,243,0.06)"},silent:!0})),t.length>=5&&this.graphicGroup.add(new D.graphic.Polygon({shape:{points:t.slice(2,5)},style:{fill:"rgba(244,67,54,0.08)"},silent:!0})),t.length>=7&&this.graphicGroup.add(new D.graphic.Polygon({shape:{points:t.slice(4,7)},style:{fill:"rgba(33,150,243,0.06)"},silent:!0}));for(let e=0;e<t.length-1;e++)this.graphicGroup.add(new D.graphic.Line({shape:{x1:t[e][0],y1:t[e][1],x2:t[e+1][0],y2:t[e+1][1]},style:{stroke:"#2196f3",lineWidth:2},silent:!0}));if(t.length>=5){const[e,i]=t[2],[s,r]=t[4],n=s-e,h=r-i;this.graphicGroup.add(new D.graphic.Line({shape:{x1:e-n*.3,y1:i-h*.3,x2:s+n*.3,y2:r+h*.3},style:{stroke:"#ff9800",lineWidth:2,lineDash:[6,4]},silent:!0}))}for(let e=0;e<t.length&&e<ne.length;e++){const[i,s]=t[e],r=(e===0||s<=t[e-1][1])&&(e===t.length-1||s<=t[e+1]?.[1]);ne[e]&&this.graphicGroup.add(new D.graphic.Text({style:{text:ne[e],x:i,y:r?s-14:s+16,fill:"#e2e8f0",fontSize:12,fontWeight:"bold",align:"center",verticalAlign:"middle"},silent:!0})),this.graphicGroup.add(new D.graphic.Circle({shape:{cx:i,cy:s,r:4},style:{fill:"#fff",stroke:"#3b82f6",lineWidth:1.5},z:101,silent:!0}))}}saveDrawing(){const t=this.points.map(e=>this.context.coordinateConversion.pixelToData({x:e[0],y:e[1]}));t.every(e=>e!==null)&&this.context.addDrawing({id:`hs-${Date.now()}`,type:"head_and_shoulders",points:t,paneIndex:t[0].paneIndex||0,style:{color:"#3b82f6",lineWidth:2}})}}var Xn=Object.defineProperty,qn=(l,t,e)=>t in l?Xn(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,Un=(l,t,e)=>(qn(l,typeof t!="symbol"?t+"":t,e),e);const qe=["1","2","3","4","5"];class Ue{constructor(){Un(this,"type","triangle_pattern")}render(t){const{drawing:e,pixelPoints:i,isSelected:s}=t,r=e.style?.color||"#3b82f6";if(i.length<2)return;const n=[];i.length>=3&&n.push({type:"polygon",name:"line",shape:{points:i.map(([o,d])=>[o,d])},style:{fill:"rgba(156, 39, 176, 0.06)"}});const h=i.filter((o,d)=>d%2===0);if(h.length>=2){for(let o=0;o<h.length-1;o++)n.push({type:"line",name:"line",shape:{x1:h[o][0],y1:h[o][1],x2:h[o+1][0],y2:h[o+1][1]},style:{stroke:"#f44336",lineWidth:2}});if(h.length>=2){const o=h[h.length-1],d=h[h.length-2],u=o[0]-d[0],c=o[1]-d[1];if(u!==0){const g=o[0]+u*.5,p=o[1]+c*.5;n.push({type:"line",shape:{x1:o[0],y1:o[1],x2:g,y2:p},style:{stroke:"#f44336",lineWidth:1,lineDash:[4,4]},silent:!0})}}}const a=i.filter((o,d)=>d%2===1);if(a.length>=2){for(let o=0;o<a.length-1;o++)n.push({type:"line",name:"line",shape:{x1:a[o][0],y1:a[o][1],x2:a[o+1][0],y2:a[o+1][1]},style:{stroke:"#4caf50",lineWidth:2}});if(a.length>=2){const o=a[a.length-1],d=a[a.length-2],u=o[0]-d[0],c=o[1]-d[1];if(u!==0){const g=o[0]+u*.5,p=o[1]+c*.5;n.push({type:"line",shape:{x1:o[0],y1:o[1],x2:g,y2:p},style:{stroke:"#4caf50",lineWidth:1,lineDash:[4,4]},silent:!0})}}}for(let o=0;o<i.length-1;o++)n.push({type:"line",shape:{x1:i[o][0],y1:i[o][1],x2:i[o+1][0],y2:i[o+1][1]},style:{stroke:"#9c27b0",lineWidth:1,lineDash:[2,2]},silent:!0});for(let o=0;o<i.length&&o<qe.length;o++){const[d,u]=i[o],c=o%2===0;n.push({type:"text",style:{text:qe[o],x:d,y:c?u-14:u+16,fill:"#e2e8f0",fontSize:12,fontWeight:"bold",align:"center",verticalAlign:"middle"},silent:!0})}for(let o=0;o<i.length;o++)n.push({type:"circle",name:`point-${o}`,shape:{cx:i[o][0],cy:i[o][1],r:4},style:{fill:"#fff",stroke:r,lineWidth:1,opacity:s?1:0},z:100});return{type:"group",children:n}}}var Kn=Object.defineProperty,Jn=(l,t,e)=>t in l?Kn(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,Ft=(l,t,e)=>(Jn(l,typeof t!="symbol"?t+"":t,e),e);const Ke=["1","2","3","4","5"],Qn=5;class to extends X{constructor(t={}){super({id:"triangle-pattern-tool",name:t.name||"Triangle Pattern",icon:t.icon||'<svg viewBox="0 0 24 24" width="24" height="24" fill="none" stroke="#e3e3e3" stroke-width="1.5"><path d="M2,4 L22,4 L12,20 Z"/></svg>'}),Ft(this,"points",[]),Ft(this,"state","idle"),Ft(this,"graphicGroup",null),Ft(this,"onClick",e=>{const i=this.getPoint(e);this.state==="idle"?(this.state="drawing",this.points=[i,[...i]],this.initGraphic(),this.updateGraphic()):this.state==="drawing"&&(this.points[this.points.length-1]=i,this.points.length>=Qn?(this.state="finished",this.updateGraphic(),this.saveDrawing(),this.removeGraphic(),this.context.disableTools()):(this.points.push([...i]),this.updateGraphic()))}),Ft(this,"onMouseMove",e=>{this.state!=="drawing"||this.points.length<2||(this.points[this.points.length-1]=this.getPoint(e),this.updateGraphic())})}onInit(){this.context.registerDrawingRenderer(new Ue)}onActivate(){this.state="idle",this.points=[],this.context.getChart().getZr().setCursorStyle("crosshair");const t=this.context.getChart().getZr();t.on("click",this.onClick),t.on("mousemove",this.onMouseMove)}onDeactivate(){this.state="idle",this.points=[],this.removeGraphic();const t=this.context.getChart().getZr();t.off("click",this.onClick),t.off("mousemove",this.onMouseMove),t.setCursorStyle("default")}initGraphic(){this.graphicGroup=new D.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)return;this.graphicGroup.removeAll();const t=this.points;t.length>=3&&this.graphicGroup.add(new D.graphic.Polygon({shape:{points:t},style:{fill:"rgba(156,39,176,0.06)"},silent:!0}));for(let s=0;s<t.length-1;s++)this.graphicGroup.add(new D.graphic.Line({shape:{x1:t[s][0],y1:t[s][1],x2:t[s+1][0],y2:t[s+1][1]},style:{stroke:"#9c27b0",lineWidth:2},silent:!0}));const e=t.filter((s,r)=>r%2===0);if(e.length>=2)for(let s=0;s<e.length-1;s++)this.graphicGroup.add(new D.graphic.Line({shape:{x1:e[s][0],y1:e[s][1],x2:e[s+1][0],y2:e[s+1][1]},style:{stroke:"#f44336",lineWidth:1,lineDash:[4,4]},silent:!0}));const i=t.filter((s,r)=>r%2===1);if(i.length>=2)for(let s=0;s<i.length-1;s++)this.graphicGroup.add(new D.graphic.Line({shape:{x1:i[s][0],y1:i[s][1],x2:i[s+1][0],y2:i[s+1][1]},style:{stroke:"#4caf50",lineWidth:1,lineDash:[4,4]},silent:!0}));for(let s=0;s<t.length&&s<Ke.length;s++){const[r,n]=t[s],h=s%2===0;this.graphicGroup.add(new D.graphic.Text({style:{text:Ke[s],x:r,y:h?n-14:n+16,fill:"#e2e8f0",fontSize:12,fontWeight:"bold",align:"center",verticalAlign:"middle"},silent:!0})),this.graphicGroup.add(new D.graphic.Circle({shape:{cx:r,cy:n,r:4},style:{fill:"#fff",stroke:"#3b82f6",lineWidth:1.5},z:101,silent:!0}))}}saveDrawing(){const t=this.points.map(e=>this.context.coordinateConversion.pixelToData({x:e[0],y:e[1]}));t.every(e=>e!==null)&&this.context.addDrawing({id:`triangle-${Date.now()}`,type:"triangle_pattern",points:t,paneIndex:t[0].paneIndex||0,style:{color:"#3b82f6",lineWidth:2}})}}var eo=Object.defineProperty,io=(l,t,e)=>t in l?eo(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,so=(l,t,e)=>(io(l,typeof t!="symbol"?t+"":t,e),e);const oe=["0","D1","C1","D2","C2","D3",""],Je=["#2196f3","#ff9800","#4caf50","#f44336","#00bcd4","#e91e63"];class Qe{constructor(){so(this,"type","three_drives_pattern")}render(t){const{drawing:e,pixelPoints:i,isSelected:s}=t,r=e.style?.color||"#3b82f6";if(i.length<2)return;const n=[];i.length>=3&&n.push({type:"polygon",name:"line",shape:{points:i.slice(0,3).map(([o,d])=>[o,d])},style:{fill:"rgba(33, 150, 243, 0.06)"}}),i.length>=5&&n.push({type:"polygon",name:"line",shape:{points:i.slice(2,5).map(([o,d])=>[o,d])},style:{fill:"rgba(76, 175, 80, 0.06)"}}),i.length>=7&&n.push({type:"polygon",name:"line",shape:{points:i.slice(4,7).map(([o,d])=>[o,d])},style:{fill:"rgba(0, 188, 212, 0.06)"}});for(let o=0;o<i.length-1;o++){const[d,u]=i[o],[c,g]=i[o+1];n.push({type:"line",name:"line",shape:{x1:d,y1:u,x2:c,y2:g},style:{stroke:Je[o%Je.length],lineWidth:e.style?.lineWidth||2}})}const h=[[1,3],[3,5],[2,4]];for(const[o,d]of h)o<i.length&&d<i.length&&n.push({type:"line",shape:{x1:i[o][0],y1:i[o][1],x2:i[d][0],y2:i[d][1]},style:{stroke:"#555",lineWidth:1,lineDash:[4,4]},silent:!0});const a=e.points;if(a.length>=4){const o=Math.abs(a[1].value-a[0].value),d=Math.abs(a[3].value-a[2].value);if(o!==0){const u=(d/o).toFixed(3),c=(i[2][0]+i[3][0])/2,g=(i[2][1]+i[3][1])/2;n.push({type:"text",style:{text:`D2/D1: ${u}`,x:c+10,y:g,fill:"#4caf50",fontSize:9},silent:!0})}}if(a.length>=6){const o=Math.abs(a[3].value-a[2].value),d=Math.abs(a[5].value-a[4].value);if(o!==0){const u=(d/o).toFixed(3),c=(i[4][0]+i[5][0])/2,g=(i[4][1]+i[5][1])/2;n.push({type:"text",style:{text:`D3/D2: ${u}`,x:c+10,y:g,fill:"#00bcd4",fontSize:9},silent:!0})}}if(a.length>=3){const o=Math.abs(a[1].value-a[0].value),d=Math.abs(a[2].value-a[1].value);if(o!==0){const u=(d/o).toFixed(3),c=(i[1][0]+i[2][0])/2,g=(i[1][1]+i[2][1])/2;n.push({type:"text",style:{text:u,x:c+8,y:g,fill:"#ff9800",fontSize:10},silent:!0})}}for(let o=0;o<i.length&&o<oe.length;o++){if(!oe[o])continue;const[d,u]=i[o],c=(o===0||u<=i[o-1][1])&&(o===i.length-1||u<=i[o+1]?.[1]);n.push({type:"text",style:{text:oe[o],x:d,y:c?u-14:u+16,fill:"#e2e8f0",fontSize:11,fontWeight:"bold",align:"center",verticalAlign:"middle"},silent:!0})}for(let o=0;o<i.length;o++)n.push({type:"circle",name:`point-${o}`,shape:{cx:i[o][0],cy:i[o][1],r:4},style:{fill:"#fff",stroke:r,lineWidth:1,opacity:s?1:0},z:100});return{type:"group",children:n}}}var no=Object.defineProperty,oo=(l,t,e)=>t in l?no(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,Nt=(l,t,e)=>(oo(l,typeof t!="symbol"?t+"":t,e),e);const re=["0","D1","C1","D2","C2","D3",""],ti=["#2196f3","#ff9800","#4caf50","#f44336","#00bcd4","#e91e63"],ro=7;class ao extends X{constructor(t={}){super({id:"three-drives-pattern-tool",name:t.name||"Three Drives",icon:t.icon||'<svg viewBox="0 0 24 24" width="24" height="24" fill="none" stroke="#e3e3e3" stroke-width="1.5"><polyline points="1,20 4,8 7,14 11,5 15,12 19,2 23,10"/></svg>'}),Nt(this,"points",[]),Nt(this,"state","idle"),Nt(this,"graphicGroup",null),Nt(this,"onClick",e=>{const i=this.getPoint(e);this.state==="idle"?(this.state="drawing",this.points=[i,[...i]],this.initGraphic(),this.updateGraphic()):this.state==="drawing"&&(this.points[this.points.length-1]=i,this.points.length>=ro?(this.state="finished",this.updateGraphic(),this.saveDrawing(),this.removeGraphic(),this.context.disableTools()):(this.points.push([...i]),this.updateGraphic()))}),Nt(this,"onMouseMove",e=>{this.state!=="drawing"||this.points.length<2||(this.points[this.points.length-1]=this.getPoint(e),this.updateGraphic())})}onInit(){this.context.registerDrawingRenderer(new Qe)}onActivate(){this.state="idle",this.points=[],this.context.getChart().getZr().setCursorStyle("crosshair");const t=this.context.getChart().getZr();t.on("click",this.onClick),t.on("mousemove",this.onMouseMove)}onDeactivate(){this.state="idle",this.points=[],this.removeGraphic();const t=this.context.getChart().getZr();t.off("click",this.onClick),t.off("mousemove",this.onMouseMove),t.setCursorStyle("default")}initGraphic(){this.graphicGroup=new D.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)return;this.graphicGroup.removeAll();const t=this.points;t.length>=3&&this.graphicGroup.add(new D.graphic.Polygon({shape:{points:t.slice(0,3)},style:{fill:"rgba(33,150,243,0.06)"},silent:!0})),t.length>=5&&this.graphicGroup.add(new D.graphic.Polygon({shape:{points:t.slice(2,5)},style:{fill:"rgba(76,175,80,0.06)"},silent:!0})),t.length>=7&&this.graphicGroup.add(new D.graphic.Polygon({shape:{points:t.slice(4,7)},style:{fill:"rgba(0,188,212,0.06)"},silent:!0}));for(let i=0;i<t.length-1;i++)this.graphicGroup.add(new D.graphic.Line({shape:{x1:t[i][0],y1:t[i][1],x2:t[i+1][0],y2:t[i+1][1]},style:{stroke:ti[i%ti.length],lineWidth:2},silent:!0}));const e=[[1,3],[3,5],[2,4]];for(const[i,s]of e)i<t.length&&s<t.length&&this.graphicGroup.add(new D.graphic.Line({shape:{x1:t[i][0],y1:t[i][1],x2:t[s][0],y2:t[s][1]},style:{stroke:"#555",lineWidth:1,lineDash:[4,4]},silent:!0}));for(let i=0;i<t.length&&i<re.length;i++){const[s,r]=t[i],n=(i===0||r<=t[i-1][1])&&(i===t.length-1||r<=t[i+1]?.[1]);re[i]&&this.graphicGroup.add(new D.graphic.Text({style:{text:re[i],x:s,y:n?r-14:r+16,fill:"#e2e8f0",fontSize:11,fontWeight:"bold",align:"center",verticalAlign:"middle"},silent:!0})),this.graphicGroup.add(new D.graphic.Circle({shape:{cx:s,cy:r,r:4},style:{fill:"#fff",stroke:"#3b82f6",lineWidth:1.5},z:101,silent:!0}))}}saveDrawing(){const t=this.points.map(e=>this.context.coordinateConversion.pixelToData({x:e[0],y:e[1]}));t.every(e=>e!==null)&&this.context.addDrawing({id:`3drives-${Date.now()}`,type:"three_drives_pattern",points:t,paneIndex:t[0].paneIndex||0,style:{color:"#3b82f6",lineWidth:2}})}}var lo=Object.defineProperty,ho=(l,t,e)=>t in l?lo(l,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):l[t]=e,Pt=(l,t,e)=>(ho(l,typeof t!="symbol"?t+"":t,e),e);class co extends X{constructor(t){const e='<svg width="8" height="8" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="position: absolute; right: -4px; top: 50%; transform: translateY(-50%); opacity: 0.6;"><polyline points="9 18 15 12 9 6"></polyline></svg>';let i="";t.icon?i=`<div style="position: relative; width: 100%; height: 100%; display: flex; align-items: center; justify-content: center;">
|
|
41
|
+
<div style="width: 100%; height: 100%; display: flex; align-items: center; justify-content: center;">
|
|
42
|
+
${t.icon}
|
|
43
|
+
</div>
|
|
44
|
+
${e}
|
|
45
|
+
</div>`:i=`<div style="position: relative; width: 100%; height: 100%; display: flex; align-items: center; justify-content: center;">
|
|
46
|
+
<span>${t.name.substring(0,2).toUpperCase()}</span>
|
|
47
|
+
${e}
|
|
48
|
+
</div>`,super({id:t.id||`group-${t.name.toLowerCase().replace(/\s+/g,"-")}`,name:t.name,icon:i}),Pt(this,"plugins",[]),Pt(this,"activeSubPlugin",null),Pt(this,"menuElement",null),Pt(this,"buttonElement",null),Pt(this,"originalIcon",""),Pt(this,"arrowSvg",""),Pt(this,"handleOutsideClick",s=>{this.menuElement&&!this.menuElement.contains(s.target)&&(this.hideMenu(),this.activeSubPlugin||this.buttonElement?.click())}),this.originalIcon=i,this.arrowSvg=e}add(t){this.plugins.push(t)}onInit(){this.plugins.forEach(t=>t.init(this.context))}onActivate(){this.showMenu()}onDeactivate(){this.hideMenu(),this.activeSubPlugin&&(this.activeSubPlugin.deactivate?.(),this.activeSubPlugin=null),this.buttonElement&&(this.buttonElement.innerHTML=this.originalIcon)}onDestroy(){this.hideMenu(),this.plugins.forEach(t=>t.destroy?.())}showMenu(){if(this.buttonElement=document.getElementById(`qfchart-plugin-btn-${this.id}`),!this.buttonElement)return;this.menuElement&&this.hideMenu(),this.menuElement=document.createElement("div"),Object.assign(this.menuElement.style,{position:"fixed",backgroundColor:"#1e293b",border:"1px solid #334155",borderRadius:"6px",padding:"4px",display:"flex",flexDirection:"column",gap:"2px",zIndex:"10000",boxShadow:"0 4px 6px -1px rgba(0, 0, 0, 0.3)",minWidth:"150px"}),this.plugins.forEach(e=>{const i=document.createElement("div");if(Object.assign(i.style,{display:"flex",alignItems:"center",padding:"8px 12px",cursor:"pointer",color:"#cbd5e1",borderRadius:"4px",fontSize:"13px",fontFamily:this.context.getOptions().fontFamily||"sans-serif",transition:"background-color 0.2s"}),i.addEventListener("mouseenter",()=>{i.style.backgroundColor="rgba(255, 255, 255, 0.1)"}),i.addEventListener("mouseleave",()=>{i.style.backgroundColor="transparent"}),e.icon){const r=document.createElement("div");r.innerHTML=e.icon,Object.assign(r.style,{width:"20px",height:"20px",marginRight:"10px",display:"flex",alignItems:"center",justifyContent:"center"});const n=r.querySelector("svg");n&&(n.style.width="100%",n.style.height="100%"),i.appendChild(r)}const s=document.createElement("span");s.textContent=e.name||e.id,i.appendChild(s),i.addEventListener("click",r=>{r.stopPropagation(),this.activateSubPlugin(e)}),this.menuElement.appendChild(i)}),document.body.appendChild(this.menuElement);const t=this.buttonElement.getBoundingClientRect();this.menuElement.style.top=`${t.top}px`,this.menuElement.style.left=`${t.right+5}px`,setTimeout(()=>{document.addEventListener("click",this.handleOutsideClick)},0)}hideMenu(){this.menuElement&&this.menuElement.parentNode&&this.menuElement.parentNode.removeChild(this.menuElement),this.menuElement=null,document.removeEventListener("click",this.handleOutsideClick)}activateSubPlugin(t){if(this.hideMenu(),this.activeSubPlugin&&this.activeSubPlugin.deactivate?.(),this.activeSubPlugin=t,this.activeSubPlugin.activate?.(),this.buttonElement){let e="";t.icon?e=`<div style="position: relative; width: 100%; height: 100%; display: flex; align-items: center; justify-content: center;">
|
|
49
|
+
<div style="width: 100%; height: 100%; display: flex; align-items: center; justify-content: center;">
|
|
50
|
+
${t.icon}
|
|
51
|
+
</div>
|
|
52
|
+
${this.arrowSvg}
|
|
53
|
+
</div>`:e=`<div style="position: relative; width: 100%; height: 100%; display: flex; align-items: center; justify-content: center;">
|
|
54
|
+
<span>${(t.name||t.id).substring(0,2).toUpperCase()}</span>
|
|
55
|
+
${this.arrowSvg}
|
|
56
|
+
</div>`,this.buttonElement.innerHTML=e}}}T.ABCDPatternDrawingRenderer=Ne,T.ABCDPatternTool=zn,T.AbstractPlugin=X,T.CrossLineDrawingRenderer=De,T.CrossLineTool=Ys,T.CypherPatternDrawingRenderer=je,T.CypherPatternTool=Nn,T.DrawingRendererRegistry=ue,T.ExtendedLineDrawingRenderer=xe,T.ExtendedLineTool=fs,T.FibSpeedResistanceFanDrawingRenderer=Me,T.FibSpeedResistanceFanTool=dn,T.FibTrendExtensionDrawingRenderer=$e,T.FibTrendExtensionTool=xn,T.FibonacciChannelDrawingRenderer=Ae,T.FibonacciChannelTool=on,T.FibonacciDrawingRenderer=Se,T.FibonacciTool=Js,T.HeadAndShouldersDrawingRenderer=Xe,T.HeadAndShouldersTool=Vn,T.HorizontalLineDrawingRenderer=be,T.HorizontalLineTool=As,T.HorizontalRayDrawingRenderer=we,T.HorizontalRayTool=Es,T.InfoLineDrawingRenderer=fe,T.InfoLineTool=cs,T.LineDrawingRenderer=ge,T.LineTool=Ji,T.MeasureTool=Yi,T.QFChart=Ri,T.RayDrawingRenderer=ye,T.RayTool=ns,T.ThreeDrivesPatternDrawingRenderer=Qe,T.ThreeDrivesPatternTool=ao,T.ToolGroup=co,T.TrendAngleDrawingRenderer=me,T.TrendAngleTool=Cs,T.TrianglePatternDrawingRenderer=Ue,T.TrianglePatternTool=to,T.VerticalLineDrawingRenderer=Pe,T.VerticalLineTool=Ns,T.XABCDPatternDrawingRenderer=Le,T.XABCDPatternTool=In});
|