UNPKG

apexstock

Version:

An extension library for ApexCharts focusing on stock charts

2 lines 166 kB
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).ApexStock=e()}(this,(function(){"use strict";class t{static truncateNumber(t){return null===t?t:Number(t.toFixed(2))}static is(t,e){return Object.prototype.toString.call(e)==="[object "+t+"]"}static isObject(t){return t&&"object"==typeof t&&!Array.isArray(t)&&null!=t}static extend(t,e){"function"!=typeof Object.assign&&(Object.assign=function(t){if(null==t)throw new TypeError("Cannot convert undefined or null to object");let e=Object(t);for(let t=1;arguments.length>t;t++){let n=arguments[t];if(null!=n)for(let t in n)n.hasOwnProperty(t)&&(e[t]=n[t])}return e});let n=Object.assign({},t);return this.isObject(t)&&this.isObject(e)&&Object.keys(e).forEach((i=>{this.isObject(e[i])?i in t?n[i]=this.extend(t[i],e[i]):Object.assign(n,{[i]:e[i]}):Object.assign(n,{[i]:e[i]})})),n}static generateUniqueId(t){return`${t}-${"10000000-1000-4000-8000-100000000000".replace(/[018]/g,(t=>(t^crypto.getRandomValues(new Uint8Array(1))[0]&15>>t/4).toString(16)))}`}}class e{static calculateMovingAverage(e,n){const i=[];for(let o=0;e.length>o;o++)if(n-1>o)i.push(null);else{let s=0;for(let t=o-n+1;o>=t;t++)s+=e[t].y[3];i.push(t.truncateNumber(s/n))}return i}static calculateRSI(e,n){const i=[];let o=0,s=0;for(let r=0;e.length>r;r++){const a=e[r].y[3];if(0===r)i.push(null);else{const l=a-e[r-1].y[3];if(n>r)if(o+=l>0?l:0,s+=0>l?-l:0,r===n-1){const e=s/n;i.push(t.truncateNumber(0===e?100:100-100/(1+(0===e?0:o/n/e))))}else i.push(null);else{let o=0,s=0;for(let t=r-n+1;r>=t;t++){const n=e[t].y[3]-e[t-1].y[3];o+=n>0?n:0,s+=0>n?-n:0}const a=s/n;i.push(t.truncateNumber(0===a?100:100-100/(1+(0===a?0:o/n/a))))}}}return i}static calculateBollingerBands(n,i,o){const s=e.calculateMovingAverage(n,i),r=[],a=[];for(let e=0;n.length>e;e++)if(i-1>e)r.push(null),a.push(null);else{let l=0;for(let t=e-i+1;e>=t;t++){const i=n[t].y[3]-s[e];l+=i*i}const c=Math.sqrt(l/i);r.push(t.truncateNumber(s[e]+o*c)),a.push(t.truncateNumber(s[e]-o*c))}return{middle:s,upper:r,lower:a}}static calculateMACD(t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:26,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:9;const o=e.calculateEMA(t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:12),s=e.calculateEMA(t,n),r=[];for(let e=0;t.length>e;e++)r.push(n-1>e?null:o[e]-s[e]);const a=[];let l=0,c=0;for(let t=0;r.length>t;t++)if(n-1+i-1>t)a.push(null);else if(i>c)l+=r[t-(i-1)+c],c++,a.push(c===i?l/i:null);else{const e=2/(i+1);a.push(r[t]*e+a[t-1]*(1-e))}const h=[];for(let e=0;t.length>e;e++)h.push(n-1+i-1>e?null:r[e]-a[e]);return{macd:r,signal:a,histogram:h}}static calculateEMA(e,n){const i=[],o=2/(n+1);let s=0;for(let t=0;n>t;t++)s+=e[t].y[3];const r=s/n;for(let s=0;e.length>s;s++)i.push(n-1>s?null:t.truncateNumber(s===n-1?r:e[s].y[3]*o+i[s-1]*(1-o)));return i}static calculateFibonacciRetracements(t){const e=t.map((t=>t.y[1])),n=t.map((t=>t.y[2])),i=Math.max(...e),o=Math.min(...n),s=i-o;return[0,.236,.382,.5,.618,1].map((t=>o+t*s))}static calculateFibonacciRetracementsForRange(t,e,n){if(!t||0===t.length)return[];const i=t.slice(e=Math.max(0,e),(n=Math.min(t.length-1,n))+1),o=i.map((t=>t.y[1])),s=i.map((t=>t.y[2])),r=Math.max(...o),a=Math.min(...s),l=r-a;return[0,.236,.382,.5,.618,1].map((t=>a+t*l))}static calculatePVT(e){const n=[];let i=0;for(let o=0;e.length>o;o++)if(0===o)n.push({x:e[o].x,y:0});else{const s=e[o-1].y[3];i+=(e[o].y[3]-s)/s*(e[o].v||0),n.push({x:e[o].x,y:t.truncateNumber(i)})}return n}static calculateStochastic(e,n,i){const o=[];for(let i=0;e.length>i;i++)if(n-1>i)o.push({x:e[i].x,y:null});else{const s=e.slice(i-n+1,i+1);s.map((t=>t.y[3]));const r=s.map((t=>t.y[1])),a=s.map((t=>t.y[2])),l=Math.max(...r),c=Math.min(...a);o.push({x:e[i].x,y:t.truncateNumber((e[i].y[3]-c)/(l-c)*100)})}const s=[];for(let e=0;o.length>e;e++)if(i-1>e||null===o[e].y)s.push({x:o[e].x,y:null});else{let n=0;for(let t=e-i+1;e>=t;t++)n+=o[t].y;s.push({x:o[e].x,y:t.truncateNumber(n/i)})}return{k:o,d:s}}static calculateStdDevIndicator(e,n){const i=[];for(let o=0;e.length>o;o++)if(n-1>o)i.push({x:e[o].x,y:null});else{const s=e.slice(o-n+1,o+1).map((t=>t.y[3])),r=s.reduce(((t,e)=>t+e),0)/n;let a=0;s.forEach((t=>{a+=Math.pow(t-r,2)}));i.push({x:e[o].x,y:t.truncateNumber(Math.sqrt(a/n))})}return i}static calculateADX(e,n){if(!e||2*n>e.length)return e.map((t=>({x:t.x,y:null})));const i=e.map((t=>({x:t.x,y:null}))),o=[],s=[],r=[],a=[],l=[],c=[],h=[];for(let t=1;e.length>t;t++){const n=e[t].y,i=e[t-1].y,a=n[1],l=n[2],c=i[3];o.push(Math.max(Math.abs(a-l),Math.abs(a-c),Math.abs(l-c)));const h=a-i[1],d=i[2]-l;let p=0,u=0;h>d&&h>0&&(p=h),d>h&&d>0&&(u=d),s.push(p),r.push(u)}let d=0,p=0,u=0;for(let t=0;n>t;t++)d+=o[t],p+=s[t],u+=r[t];a.push(d),l.push(p),c.push(u);for(let t=1;o.length-n+1>t;t++){const e=a[t-1]-a[t-1]/n+o[t+n-1],i=l[t-1]-l[t-1]/n+s[t+n-1],d=c[t-1]-c[t-1]/n+r[t+n-1];a.push(e),l.push(i),c.push(d);const p=i/e*100,u=d/e*100;h.push(Math.abs(p-u)/(p+u)*100)}let m=0;for(let t=0;n>t;t++)h.length>t&&(m+=h[t]);let g=m/n;const x=2*n;e.length>x&&(i[x].y=t.truncateNumber(g));for(let o=n;h.length>o;o++){g=(g*(n-1)+h[o])/n;const s=o+n+1;e.length>s&&(i[s].y=t.truncateNumber(g))}return i}static calculateChaikinOsc(n,i,o){const s=[];let r=0;for(let t=0;n.length>t;t++){const e=n[t].y[1],i=n[t].y[2],o=n[t].y[3];r+=(e-o-(o-i))/(e-i||1)*(n[t].v||0),s.push(r)}const a=e.calculateEMAFromArray(s,i),l=e.calculateEMAFromArray(s,o),c=[];for(let e=0;s.length>e;e++)c.push(null===a[e]||null===l[e]?{x:n[e].x,y:null}:{x:n[e].x,y:t.truncateNumber(a[e]-l[e])});return c}static calculateEMAFromArray(e,n){const i=[],o=2/(n+1);let s=0;for(let r=0;e.length>r;r++)if(n>r)if(s+=null!==e[r]?e[r]:0,r===n-1){i.push(t.truncateNumber(s/n))}else i.push(null);else i.push(t.truncateNumber(e[r]*o+i[r-1]*(1-o)));return i}static calculateSMAFromArray(e,n){const i=[];for(let o=0;e.length>o;o++)if(n-1>o)i.push(null);else{let s=0;for(let t=o-n+1;o>=t;t++)s+=e[t];i.push(t.truncateNumber(s/n))}return i}static calculateBBPercent(e,n,i){const o=[];for(let s=0;e.length>s;s++){const r=e[s].y[3];if(null===n[s]||null===i[s])o.push({x:e[s].x,y:null});else{o.push({x:e[s].x,y:t.truncateNumber((r-n[s])/(i[s]-n[s]))})}}return o}static calculateBBWidth(e,n,i,o){const s=[];for(let r=0;e.length>r;r++)if(null===n[r]||null===i[r]||null===o[r])s.push({x:e[r].x,y:null});else{s.push({x:e[r].x,y:t.truncateNumber((i[r]-o[r])/n[r])})}return s}static calculateLinearRegression(e,n){const i=[];for(let o=0;e.length>o;o++)if(n-1>o)i.push({x:e[o].x,y:null});else{let s=0,r=0,a=0,l=0;for(let t=o-n+1;o>=t;t++){const n=e[t].y[3];s+=t,r+=n,a+=t*n,l+=t*t}const c=(n*a-s*r)/(n*l-s*s);i.push({x:e[o].x,y:t.truncateNumber(c*o+(r-c*s)/n)})}return i}static calculateIchimoku(e){const n=[],i=[],o=[],s=[],r=[];for(let a=0;e.length>a;a++){if(8>a)n.push({x:e[a].x,y:null});else{const i=e.slice(a-8,a+1),o=Math.max(...i.map((t=>t.y[1]))),s=Math.min(...i.map((t=>t.y[2])));n.push({x:e[a].x,y:t.truncateNumber((o+s)/2)})}if(25>a)i.push({x:e[a].x,y:null});else{const n=e.slice(a-25,a+1),o=Math.max(...n.map((t=>t.y[1]))),s=Math.min(...n.map((t=>t.y[2])));i.push({x:e[a].x,y:t.truncateNumber((o+s)/2)})}if(r.push(26>a?{x:e[a].x,y:null}:{x:e[a-26].x,y:e[a].y[3]}),51>a)s.push({x:e[a].x,y:null});else{const n=e.slice(a-51,a+1),i=Math.max(...n.map((t=>t.y[1]))),o=Math.min(...n.map((t=>t.y[2])));s.push({x:e[a].x,y:t.truncateNumber((i+o)/2)})}o.push(25>a||null===n[a].y||null===i[a].y?{x:e[a].x,y:null}:{x:e[a].x,y:t.truncateNumber((n[a].y+i[a].y)/2)})}return{tenkan:n,kijun:i,senkouA:o,senkouB:s,chikou:r}}static calculateCCI(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:20;const i=[];for(let o=0;e.length>o;o++)if(n-1>o)i.push({x:e[o].x,y:null});else{const s=e.slice(o-n+1,o+1).map((t=>(t.y[1]+t.y[2]+t.y[3])/3)),r=s.reduce(((t,e)=>t+e),0)/n;let a=0;s.forEach((t=>{a+=Math.abs(t-r)})),a/=n;i.push({x:e[o].x,y:t.truncateNumber(0===a?0:((e[o].y[1]+e[o].y[2]+e[o].y[3])/3-r)/(.015*a))})}return i}static calculateTSI(n){let i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:25,o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:13,s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:7;const r=[],a=[],l=[];for(let t=0;n.length>t;t++)if(0===t)a.push(0),l.push(0);else{const e=n[t].y[3]-n[t-1].y[3];a.push(e),l.push(Math.abs(e))}const c=e.calculateEMAFromArray(a,i),h=e.calculateEMAFromArray(c,o),d=e.calculateEMAFromArray(l,i),p=e.calculateEMAFromArray(d,o);for(let e=0;n.length>e;e++)if(null===h[e]||null===p[e]||0===p[e])r.push({x:n[e].x,y:null});else{r.push({x:n[e].x,y:t.truncateNumber(h[e]/p[e]*100)})}const u=r.map((t=>t.y)),m=e.calculateEMAFromArray(u,s),g=r.map(((t,e)=>({x:t.x,y:m[e]})));return{tsi:r,signal:g}}static calculateAcceleratorOsc(n){let i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:5;const o=e.calculateAwesomeOscillator(n),s=o.map((t=>t.y)),r=e.calculateSMAFromArray(s,i),a=[];for(let e=0;n.length>e;e++)a.push(null===o[e].y||null===r[e]?{x:n[e].x,y:null}:{x:n[e].x,y:t.truncateNumber(o[e].y-r[e])});return a}static calculateAwesomeOscillator(e){const n=[];for(let i=0;e.length>i;i++)if(33>i)n.push({x:e[i].x,y:null});else{const o=e.slice(i-5+1,i+1),s=e.slice(i-34+1,i+1),r=o.reduce(((t,e)=>t+(e.y[1]+e.y[2])/2),0)/5,a=s.reduce(((t,e)=>t+(e.y[1]+e.y[2])/2),0)/34;n.push({x:e[i].x,y:t.truncateNumber(r-a)})}return n}}class n{constructor(t,e,n,i,o,s,r,a,l,c){this.chart=t,this.chartDiv=e,this.svgOverlay=n,this.syncOverlayPosition=c,this.intervalId=null,this.boundMouseDown=i,this.boundMouseMove=o,this.boundMouseUp=s,this.boundResize=r,this.boundWheelEvent=a,this.redrawElements=l,this.initEventListeners(),this.listenForChartEvents()}initEventListeners(){this.svgOverlay.addEventListener("mousedown",this.boundMouseDown),window.addEventListener("mousemove",this.boundMouseMove),window.addEventListener("mouseup",this.boundMouseUp),window.addEventListener("resize",this.boundResize),this.chartDiv.addEventListener("wheel",this.boundWheelEvent),this.svgOverlay.addEventListener("wheel",this.boundWheelEvent)}listenForChartEvents(){new MutationObserver((()=>{"function"==typeof this.syncOverlayPosition&&this.syncOverlayPosition()})).observe(this.chartDiv,{attributes:!0,childList:!0,subtree:!0}),this.intervalId=setInterval((()=>{"function"==typeof this.syncOverlayPosition&&this.syncOverlayPosition()}),1e3);try{this.chart.addEventListener&&(this.chart.addEventListener("updated",(()=>{setTimeout((()=>{"function"==typeof this.syncOverlayPosition&&this.syncOverlayPosition(),this.redrawElements()}),300)})),this.chart.addEventListener("zoomed",(()=>{"function"==typeof this.coordinateConverter?.refreshBounds&&this.coordinateConverter.refreshBounds(),this.redrawElements()})),this.chart.addEventListener("scrolled",(()=>{"function"==typeof this.coordinateConverter?.refreshBounds&&this.coordinateConverter.refreshBounds(),this.redrawElements()})))}catch(t){console.error("Error setting up chart event listeners:",t)}}destroy(){this.svgOverlay.removeEventListener("mousedown",this.boundMouseDown),window.removeEventListener("mousemove",this.boundMouseMove),window.removeEventListener("mouseup",this.boundMouseUp),window.removeEventListener("resize",this.boundResize),this.chartDiv.removeEventListener("wheel",this.boundWheelEvent),this.svgOverlay.removeEventListener("wheel",this.boundWheelEvent),this.intervalId&&clearInterval(this.intervalId)}}class i{constructor(t){this.chartDiv=t,this.overlayWrapper=null,this.svgOverlay=null,this.defs=null,this.drawingGroup=null,this.setupSVGOverlay()}setupSVGOverlay(){this.overlayWrapper=document.createElement("div"),this.overlayWrapper.className="apexstock-drawing-overlay-wrapper",this.chartDiv.appendChild(this.overlayWrapper),this.svgOverlay=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svgOverlay.setAttribute("class","apexstock-drawing-overlay"),this.overlayWrapper.appendChild(this.svgOverlay),this.defs=document.createElementNS("http://www.w3.org/2000/svg","defs"),this.svgOverlay.appendChild(this.defs),this.drawingGroup=document.createElementNS("http://www.w3.org/2000/svg","g"),this.svgOverlay.appendChild(this.drawingGroup),setTimeout((()=>{this.syncOverlayPosition()}),100),window.addEventListener("resize",(()=>{this.syncOverlayPosition()}))}syncOverlayPosition(){if(this.chartDiv&&this.overlayWrapper)try{const t=this.chartDiv.getBoundingClientRect(),e=this.chartDiv.parentNode.getBoundingClientRect();this.overlayWrapper.style.width=t.width+"px",this.overlayWrapper.style.height=t.height+"px",this.overlayWrapper.style.left=t.left-e.left+"px"}catch(t){console.error("Error syncing overlay position:",t)}}}class o{constructor(t,e,n,i,o,s,r){this.ctx=t,this.chartDiv=e,this.drawingColor=n,this.drawingWidth=i,this.toolClickHandler=o,this.clearHandler=s,this.toolbarContainer=null,this.onColorChange=null,this.onWidthChange=null,this.availableTools=r||{},this.createDrawingToolbar()}createDrawingToolbar(){const t=document.createElement("div");t.className="apexstock-drawing-toolbar";const e=[{name:"line",icon:"╱",tooltip:"Line"},{name:"brush",icon:"∿",tooltip:"Brush"},{name:"highlighter",icon:"🖌️",tooltip:"Highlighter"},{name:"rectangle",icon:"▢",tooltip:"Rectangle"},{name:"circle",icon:"◯",tooltip:"Circle"},{name:"ellipse",icon:"⬭",tooltip:"Ellipse"},{name:"text",icon:"T",tooltip:"Text Annotation"},{name:"pin",icon:"📌",tooltip:"Pin Tooltips"},{name:"clear",icon:"🗑",tooltip:"Clear All"}].filter((t=>!this.availableTools||!1!==this.availableTools[t.name])),n=document.createElement("input");n.type="color",n.value=this.drawingColor,n.classList.add("apexstock-drawing-color-picker"),n.title="Color",n.addEventListener("input",(t=>{this.drawingColor=t.target.value,"function"==typeof this.onColorChange&&this.onColorChange(t.target.value)})),t.appendChild(n);const i=document.createElement("select");i.style.marginRight="5px",i.style.height="30px",i.title="Line Width",[1,2,3,5,8].forEach((t=>{const e=document.createElement("option");e.value=t,e.textContent=t+"px",t===this.drawingWidth&&(e.selected=!0),i.appendChild(e)})),i.addEventListener("change",(t=>{this.drawingWidth=parseInt(t.target.value),"function"==typeof this.onWidthChange&&this.onWidthChange(parseInt(t.target.value))})),t.appendChild(i),e.forEach((e=>{const n=document.createElement("button");n.className="apexstock-drawing-tool",n.dataset.tool=e.name,n.textContent=e.icon,n.title=e.tooltip,"select"===e.name&&(n.style.backgroundColor="#f0f0f0"),"pin"===e.name&&(n.classList.add("active"),n.style.marginRight="2px"),"clear"===e.name&&(n.style.marginLeft="2px"),n.addEventListener("click",(()=>{"clear"===e.name?"function"==typeof this.clearHandler&&this.clearHandler():"function"==typeof this.toolClickHandler&&this.toolClickHandler(e.name)})),t.appendChild(n)})),this.ctx.primaryToolbarLeft.appendChild(t),this.toolbarContainer=t}setActiveTool(t){this.toolbarContainer&&this.toolbarContainer.querySelectorAll(".apexstock-drawing-tool").forEach((e=>{e.dataset.tool===t?e.classList.add("active"):-1===["clear","pin"].indexOf(e.dataset.tool)&&e.classList.remove("active")}))}setColor(t){this.drawingColor=t;const e=this.toolbarContainer.querySelector(".apexstock-drawing-color-picker");e&&(e.value=t)}setWidth(t){this.drawingWidth=t;const e=this.toolbarContainer.querySelector("select");if(e)for(let n=0;e.options.length>n;n++)if(parseInt(e.options[n].value)===t){e.selectedIndex=n;break}}destroy(){this.toolbarContainer&&this.toolbarContainer.parentNode&&this.toolbarContainer.parentNode.removeChild(this.toolbarContainer)}}class s{constructor(t,e,n){this.startPoint=t,this.color=e,this.width=n,this.fillColor="#ffffff",this.fillOpacity=.5}setFillColor(t){return this.fillColor=t,this}setFillOpacity(t){return this.fillOpacity=t,this}createElement(t){switch(t){case"line":return this.createLine();case"brush":return this.createBrush();case"highlighter":return this.createHighlighter();case"rectangle":return this.createRectangle();case"circle":return this.createCircle();case"ellipse":return this.createEllipse();default:return null}}createLine(){const e=document.createElementNS("http://www.w3.org/2000/svg","line");e.setAttribute("x1",this.startPoint.x),e.setAttribute("y1",this.startPoint.y),e.setAttribute("x2",this.startPoint.x),e.setAttribute("y2",this.startPoint.y),e.setAttribute("stroke",this.color),e.setAttribute("stroke-width",this.width);const n=t.generateUniqueId("line");e.dataset.elementId=n;return{element:e,data:{id:n,type:"line",x1:this.startPoint.dataX,y1:this.startPoint.dataY,x2:this.startPoint.dataX,y2:this.startPoint.dataY,color:this.color,width:this.width}}}createBrush(){const e=document.createElementNS("http://www.w3.org/2000/svg","path");e.setAttribute("d",`M ${this.startPoint.x} ${this.startPoint.y}`),e.setAttribute("fill","none"),e.setAttribute("stroke",this.color),e.setAttribute("stroke-width",this.width),e.setAttribute("stroke-linecap","round"),e.setAttribute("stroke-linejoin","round");const n=t.generateUniqueId("brush");e.dataset.elementId=n;return{element:e,data:{id:n,type:"brush",points:[{x:this.startPoint.dataX,y:this.startPoint.dataY}],color:this.color,width:this.width}}}createHighlighter(){const e=document.createElementNS("http://www.w3.org/2000/svg","path");e.setAttribute("d",`M ${this.startPoint.x} ${this.startPoint.y}`),e.setAttribute("fill","none"),e.setAttribute("stroke",this.color),e.setAttribute("stroke-width",3*this.width),e.setAttribute("stroke-linecap","round"),e.setAttribute("stroke-linejoin","round"),e.setAttribute("stroke-opacity","0.3");const n=t.generateUniqueId("highlighter");e.dataset.elementId=n;return{element:e,data:{id:n,type:"highlighter",points:[{x:this.startPoint.dataX,y:this.startPoint.dataY}],color:this.color,width:3*this.width,opacity:.3}}}createRectangle(){const e=document.createElementNS("http://www.w3.org/2000/svg","rect");e.setAttribute("x",this.startPoint.x),e.setAttribute("y",this.startPoint.y),e.setAttribute("width","0"),e.setAttribute("height","0"),e.setAttribute("stroke",this.color),e.setAttribute("stroke-width",this.width),e.setAttribute("fill",this.fillColor),e.setAttribute("fill-opacity",this.fillOpacity);const n=t.generateUniqueId("rectangle");e.dataset.elementId=n;return{element:e,data:{id:n,type:"rectangle",x:this.startPoint.dataX,y:this.startPoint.dataY,width:0,height:0,color:this.color,strokeWidth:this.width,fill:this.fillColor,fillOpacity:this.fillOpacity}}}createCircle(){const e=document.createElementNS("http://www.w3.org/2000/svg","circle");e.setAttribute("cx",this.startPoint.x),e.setAttribute("cy",this.startPoint.y),e.setAttribute("r","0"),e.setAttribute("stroke",this.color),e.setAttribute("stroke-width",this.width),e.setAttribute("fill",this.fillColor),e.setAttribute("fill-opacity",this.fillOpacity);const n=t.generateUniqueId("circle");e.dataset.elementId=n;return{element:e,data:{id:n,type:"circle",cx:this.startPoint.dataX,cy:this.startPoint.dataY,r:0,color:this.color,strokeWidth:this.width,fill:this.fillColor,fillOpacity:this.fillOpacity}}}createEllipse(){const e=document.createElementNS("http://www.w3.org/2000/svg","ellipse");e.setAttribute("cx",this.startPoint.x),e.setAttribute("cy",this.startPoint.y),e.setAttribute("rx","0"),e.setAttribute("ry","0"),e.setAttribute("stroke",this.color),e.setAttribute("stroke-width",this.width),e.setAttribute("fill",this.fillColor),e.setAttribute("fill-opacity",this.fillOpacity);const n=t.generateUniqueId("ellipse");e.dataset.elementId=n;return{element:e,data:{id:n,type:"ellipse",cx:this.startPoint.dataX,cy:this.startPoint.dataY,rx:0,ry:0,color:this.color,strokeWidth:this.width,fill:this.fillColor,fillOpacity:this.fillOpacity}}}}class r{constructor(t,e){this.chart=t,this.chartDiv=e,this.cachedBounds=null,this.lastUpdateTime=0}getChartBounds(){let t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];const e=Date.now();if(!t&&this.cachedBounds&&100>e-this.lastUpdateTime)return this.cachedBounds;try{const t=this.chartDiv.getBoundingClientRect();let n,i,o,s,r,a,l,c;try{n=this.chart.w.globals.minX,i=this.chart.w.globals.maxX,o=this.chart.w.globals.minY,s=this.chart.w.globals.maxY}catch(n){return console.warn("Could not access chart axis values:",n),this.cachedBounds={xaxis:0,xaxisMax:100,yaxis:0,yaxisMax:100,leftMargin:0,translateY:0,gridWidth:t.width,gridHeight:t.height,chartRect:t},this.lastUpdateTime=e,this.cachedBounds}try{r=this.chart.w.globals.translateX,a=this.chart.w.globals.translateY,l=this.chart.w.globals.gridWidth,c=this.chart.w.globals.gridHeight}catch(e){console.warn("Could not access chart grid values:",e),r=0,a=0,l=t.width,c=t.height}return(void 0===r||isNaN(r))&&(r=60),(void 0===a||isNaN(a))&&(a=20),(void 0===l||isNaN(l))&&(l=t.width-r),(void 0===c||isNaN(c))&&(c=t.height-a),this.cachedBounds={xaxis:n,xaxisMax:i,yaxis:o,yaxisMax:s,leftMargin:r,translateY:a,gridWidth:l,gridHeight:c,chartRect:t},this.lastUpdateTime=e,this.cachedBounds}catch(t){return console.error("Error getting chart bounds:",t),{xaxis:0,xaxisMax:100,yaxis:0,yaxisMax:100,leftMargin:0,translateY:0,gridWidth:100,gridHeight:100,chartRect:{width:100,height:100}}}}screenToData(t,e){try{const n=this.getChartBounds(),i=n.xaxis+(n.xaxisMax-n.xaxis)*((t-n.leftMargin)/n.gridWidth),o=n.yaxisMax-(n.yaxisMax-n.yaxis)*((e-n.translateY)/n.gridHeight);return isNaN(i)||isNaN(o)?(console.warn("Invalid data coordinates calculated:",i,o),{x:t,y:e}):{x:i,y:o}}catch(n){return console.error("Error converting screen to data coordinates:",n),{x:t,y:e}}}dataToScreen(t,e){try{const n=this.getChartBounds(),i=n.leftMargin+n.gridWidth*((t-n.xaxis)/(n.xaxisMax-n.xaxis)),o=n.translateY+n.gridHeight*((n.yaxisMax-e)/(n.yaxisMax-n.yaxis));return isNaN(i)||isNaN(o)?(console.warn("Invalid screen coordinates calculated:",i,o),{x:t,y:e}):{x:i,y:o}}catch(n){return console.error("Error converting data to screen coordinates:",n),{x:t,y:e}}}screenDeltaToDataDelta(t,e){try{const n=this.getChartBounds();return{x:t*((n.xaxisMax-n.xaxis)/n.gridWidth),y:-e*((n.yaxisMax-n.yaxis)/n.gridHeight)}}catch(t){return console.error("Error converting screen delta to data delta:",t),{x:0,y:0}}}refreshBounds(){this.getChartBounds(!0)}getDataDistance(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}static getInstance(t,e){return r.instance&&r.instance.chart===t&&r.instance.chartDiv===e||(r.instance=new r(t,e)),r.instance}}class a{constructor(t,e,n,i){this.svgOverlay=e,this.chartDiv=t,this.coordinateConverter=n,this.onTextCreated=i,this.isEditing=!1,this.clickX=0,this.clickY=0,this.currentGroup=null,this.currentData=null,this.editor=null,this.toolbar=null,this.textStyle={fontSize:14,fontFamily:"Arial, sans-serif",fontWeight:"normal",fontStyle:"normal",textDecoration:"none",color:"#0077b6",backgroundColor:"#ffffff",backgroundOpacity:0},this.createToolbar(),this.handleOutsideClick=this.handleOutsideClick.bind(this)}createTextAnnotation(e,n,i,o){this.clickX=e,this.clickY=n;const s=document.createElementNS("http://www.w3.org/2000/svg","g");s.classList.add("apexstock-text-annotation");const r=t.generateUniqueId("text");return s.dataset.elementId=r,this.currentData={id:r,type:"text",x:i.x,y:i.y,clickX:e,clickY:n,text:"",color:o||this.textStyle.color,backgroundColor:this.textStyle.backgroundColor,backgroundOpacity:this.textStyle.backgroundOpacity,...this.textStyle},this.currentGroup=s,this.startEditing(),{element:s,data:this.currentData}}createToolbar(){const t=document.createElement("div");t.className="apexstock-text-toolbar";const e=document.createElement("button");e.innerHTML="<strong>B</strong>",e.addEventListener("click",(()=>{this.toggleStyle("fontWeight","bold","normal")}));const n=document.createElement("button");n.innerHTML="<em>I</em>",n.addEventListener("click",(()=>{this.toggleStyle("fontStyle","italic","normal")}));const i=document.createElement("button");i.innerHTML="<u>U</u>",i.addEventListener("click",(()=>{this.toggleStyle("textDecoration","underline","none")}));const o=document.createElement("div");o.className="color-wrapper";const s=document.createElement("label");s.textContent="Text";const r=document.createElement("input");r.type="color",r.value=this.textStyle.color,r.addEventListener("input",(t=>{this.setStyle("color",t.target.value)})),o.appendChild(s),o.appendChild(r);const a=document.createElement("div");a.className="color-wrapper";const l=document.createElement("label");l.textContent="Background";const c=document.createElement("input");c.type="color",c.value=this.textStyle.backgroundColor,c.addEventListener("input",(t=>{this.setStyle("backgroundColor",t.target.value)})),a.appendChild(l),a.appendChild(c);const h=document.createElement("div");h.className="opacity-wrapper";const d=document.createElement("label");d.textContent="Opacity";const p=document.createElement("input");p.type="range",p.min="0",p.max="100",p.value=100*this.textStyle.backgroundOpacity,p.addEventListener("input",(t=>{this.setStyle("backgroundOpacity",parseInt(t.target.value)/100)})),h.appendChild(d),h.appendChild(p);const u=document.createElement("select");[10,12,14,16,18,20,24].forEach((t=>{const e=document.createElement("option");e.value=t,e.text=t+"px",t===this.textStyle.fontSize&&(e.selected=!0),u.appendChild(e)})),u.addEventListener("change",(()=>{this.setStyle("fontSize",parseInt(u.value))}));const m=document.createElement("select");["Arial, sans-serif","Courier New, monospace","Helvetica, Arial, sans-serif","Verdana, Geneva, sans-serif","Tahoma, Geneva, sans-serif","Trebuchet MS, Helvetica, sans-serif","Segoe UI, Helvetica, sans-serif","Consolas, Monaco, monospace","Menlo, Consolas, monospace","Times New Roman, serif","Georgia, Times New Roman, serif","Cambria, Georgia, serif"].forEach((t=>{const e=document.createElement("option");e.value=t,e.text=t.split(",")[0],t===this.textStyle.fontFamily&&(e.selected=!0),m.appendChild(e)})),m.addEventListener("change",(()=>{this.setStyle("fontFamily",m.value)}));const g=document.createElement("button");g.textContent="✓",g.addEventListener("click",(()=>{this.finishEditing()}));const x=document.createElement("button");x.textContent="✕",x.addEventListener("click",(()=>{this.cancelEditing()}));const y=document.createElement("div");y.className="font-controls",y.appendChild(u),y.appendChild(m),y.appendChild(e),y.appendChild(n),y.appendChild(i);const b=document.createElement("div");b.className="color-controls",b.appendChild(o),b.appendChild(a),b.appendChild(h);const v=document.createElement("div");v.className="action-controls",v.appendChild(x),v.appendChild(g),t.appendChild(y),t.appendChild(b),t.appendChild(v),this.chartDiv.appendChild(t),this.toolbar=t}startEditing(){if(this.isEditing)return;this.isEditing=!0;const t=document.createElement("div");t.className="apexstock-text-editor",t.contentEditable=!0,t.style.left=this.clickX+"px",t.style.top=this.clickY+"px",t.style.minHeight=this.textStyle.fontSize+"px",t.style.background=this.currentData.backgroundColor||"#ffffff",t.style.opacity=this.currentData.backgroundOpacity||.7,t.style.fontFamily=this.currentData.fontFamily,t.style.fontSize=this.currentData.fontSize+"px",t.style.fontWeight=this.currentData.fontWeight,t.style.fontStyle=this.currentData.fontStyle,t.style.textDecoration=this.currentData.textDecoration,t.style.color=this.currentData.color,this.chartDiv.appendChild(t),this.editor=t,setTimeout((()=>{t.focus(),this.showToolbar(this.clickX,this.clickY-150)}),10),t.addEventListener("keydown",(t=>{"Escape"===t.key?(this.cancelEditing(),t.preventDefault()):"Enter"!==t.key||t.shiftKey||(this.finishEditing(),t.preventDefault())})),document.addEventListener("mousedown",this.handleOutsideClick)}showToolbar(t,e){if(!this.toolbar)return;const n=window.innerWidth;this.toolbar.style.display="flex";const i=this.toolbar.offsetWidth;let o=t;o+i>n&&(o=Math.max(5,n-i-5));let s=e;5>s&&(s=this.clickY+30),this.toolbar.style.left=o+"px",this.toolbar.style.top=s+"px"}handleOutsideClick(t){this.isEditing&&this.editor&&!this.editor.contains(t.target)&&this.toolbar&&!this.toolbar.contains(t.target)&&(t.preventDefault(),this.finishEditing())}finishEditing(){if(!this.isEditing||!this.editor)return;const t=this.editor.textContent.trim();t?(this.currentData.text=t,this.createSvgText(),this.cleanup()):this.cancelEditing()}createSvgText(){if(this.currentGroup)for(;this.currentGroup.firstChild;)this.currentGroup.removeChild(this.currentGroup.firstChild);else this.currentGroup=document.createElementNS("http://www.w3.org/2000/svg","g"),this.currentGroup.classList.add("apexstock-text-annotation"),this.currentData.id&&(this.currentGroup.dataset.elementId=this.currentData.id);this.currentGroup.parentNode||this.svgOverlay.appendChild(this.currentGroup);const t=document.createElementNS("http://www.w3.org/2000/svg","rect");t.setAttribute("fill",this.currentData.backgroundColor||"#ffffff"),t.setAttribute("fill-opacity",this.currentData.backgroundOpacity||.7),t.setAttribute("rx","3");const e=document.createElementNS("http://www.w3.org/2000/svg","text");e.setAttribute("x",this.clickX),e.setAttribute("y",this.clickY),e.setAttribute("font-family",this.currentData.fontFamily),e.setAttribute("font-size",this.currentData.fontSize+"px"),e.setAttribute("font-weight",this.currentData.fontWeight),e.setAttribute("font-style",this.currentData.fontStyle),e.setAttribute("text-decoration",this.currentData.textDecoration),e.setAttribute("fill",this.currentData.color),e.setAttribute("dominant-baseline","text-before-edge");this.currentData.text.split("\n").forEach(((t,n)=>{const i=document.createElementNS("http://www.w3.org/2000/svg","tspan");i.textContent=t,i.setAttribute("x",this.clickX),i.setAttribute("dy",0===n?"0":"1.2em"),e.appendChild(i)})),this.currentGroup.appendChild(e);try{const n=e.getBBox(),i=5;t.setAttribute("x",n.x-i),t.setAttribute("y",n.y-i),t.setAttribute("width",n.width+2*i),t.setAttribute("height",n.height+2*i),this.currentGroup.insertBefore(t,e)}catch(n){console.error("Error measuring text:",n),t.setAttribute("x",this.clickX-5),t.setAttribute("y",this.clickY-5),t.setAttribute("width",100),t.setAttribute("height",30),this.currentGroup.insertBefore(t,e)}this.onTextCreated&&this.onTextCreated(this.currentGroup,this.currentData)}cancelEditing(){this.isEditing&&(this.currentGroup&&this.currentGroup.parentNode&&this.currentGroup.parentNode.removeChild(this.currentGroup),this.cleanup())}cleanup(){this.editor&&this.editor.parentNode&&(this.editor.parentNode.removeChild(this.editor),this.editor=null),this.toolbar&&(this.toolbar.style.display="none"),document.removeEventListener("mousedown",this.handleOutsideClick),this.isEditing=!1}toggleStyle(t,e,n){if(!this.currentData||!this.editor)return;this.setStyle(t,this.currentData[t]===e?n:e)}setStyle(t,e){if(this.currentData&&this.editor)switch(this.currentData[t]=e,t){case"fontSize":this.editor.style.fontSize=e+"px";break;case"fontFamily":this.editor.style.fontFamily=e;break;case"fontWeight":this.editor.style.fontWeight=e;break;case"fontStyle":this.editor.style.fontStyle=e;break;case"textDecoration":this.editor.style.textDecoration=e;break;case"color":this.editor.style.color=e;break;case"backgroundColor":this.editor.style.backgroundColor=e;break;case"backgroundOpacity":this.editor.style.opacity=e}}redrawTextElement(e){const n=document.createElementNS("http://www.w3.org/2000/svg","g");if(n.classList.add("apexstock-text-annotation"),e.id)n.dataset.elementId=e.id;else{const i=t.generateUniqueId("text");n.dataset.elementId=i,e.id=i}let i,o;const s=this.coordinateConverter.dataToScreen(e.x,e.y);i=s.x,o=s.y,(isNaN(s.x)||isNaN(s.y))&&(i=e.clickX||0,o=e.clickY||0);const r=document.createElementNS("http://www.w3.org/2000/svg","text");r.setAttribute("x",i),r.setAttribute("y",o),r.setAttribute("font-family",e.fontFamily||this.textStyle.fontFamily),r.setAttribute("font-size",(e.fontSize||this.textStyle.fontSize)+"px"),r.setAttribute("font-weight",e.fontWeight||this.textStyle.fontWeight),r.setAttribute("font-style",e.fontStyle||this.textStyle.fontStyle),r.setAttribute("text-decoration",e.textDecoration||this.textStyle.textDecoration),r.setAttribute("fill",e.color||this.textStyle.color),r.setAttribute("dominant-baseline","text-before-edge");const a=document.createElementNS("http://www.w3.org/2000/svg","rect");a.setAttribute("fill",e.backgroundColor||this.textStyle.backgroundColor),a.setAttribute("fill-opacity",e.backgroundOpacity||this.textStyle.backgroundOpacity),a.setAttribute("rx","3");(e.text||"").split("\n").forEach(((t,e)=>{const n=document.createElementNS("http://www.w3.org/2000/svg","tspan");n.textContent=t,n.setAttribute("x",i),n.setAttribute("dy",0===e?"0":"1.2em"),r.appendChild(n)})),n.appendChild(r),this.svgOverlay.appendChild(n);try{const t=r.getBBox(),e=5;a.setAttribute("x",t.x-e),a.setAttribute("y",t.y-e),a.setAttribute("width",t.width+2*e),a.setAttribute("height",t.height+2*e)}catch(t){console.error("Error measuring text:",t),a.setAttribute("x",i-5),a.setAttribute("y",o-5),a.setAttribute("width",100),a.setAttribute("height",30)}return this.svgOverlay.removeChild(n),n.innerHTML="",n.appendChild(a),n.appendChild(r),e.clickX=i,e.clickY=o,n}destroy(){this.cleanup(),this.toolbar&&this.toolbar.parentNode&&(this.toolbar.parentNode.removeChild(this.toolbar),this.toolbar=null)}}class l{constructor(t,e,n,i){this.chartDiv=t,this.svgOverlay=e,this.coordinateConverter=n,this.onTooltipCreated=i,this.tooltipElements=new Map}createTooltipAnnotation(e,n,i,o){if(!e)return null;if((!o||isNaN(o.x)||isNaN(o.y))&&(!(o=this.coordinateConverter.screenToData(n,i))||isNaN(o.x)||isNaN(o.y)))return console.warn("Could not determine data coordinates for tooltip"),null;const s=document.createElementNS("http://www.w3.org/2000/svg","g");s.classList.add("apexstock-tooltip-annotation");const r=t.generateUniqueId("tooltip");s.dataset.tooltipId=r,s.dataset.elementId=r;const a={id:r,type:"tooltip",x:o.x,y:o.y,clickX:n,clickY:i,tooltipContent:e.innerHTML,tooltipWidth:e.offsetWidth+5,tooltipHeight:e.offsetHeight+5};return this.createSvgTooltip(s,a),this.tooltipElements.set(r,s),{element:s,data:a}}createSvgTooltip(t,e){const n=this.coordinateConverter.dataToScreen(e.x,e.y),i=n.x-e.tooltipWidth/2,o=n.y-e.tooltipHeight-10,s=this.chartDiv.classList.contains("apexstock-theme-dark")||this.chartDiv.parentNode.classList.contains("apexstock-theme-dark"),r=document.createElementNS("http://www.w3.org/2000/svg","rect");r.setAttribute("x",i),r.setAttribute("y",o),r.setAttribute("width",e.tooltipWidth),r.setAttribute("height",e.tooltipHeight),r.setAttribute("rx","3"),s?(r.setAttribute("fill","#343a40"),r.setAttribute("stroke","#495057")):(r.setAttribute("fill","white"),r.setAttribute("stroke","#e9ecef")),r.setAttribute("fill-opacity","0.75"),r.setAttribute("stroke-width","1");const a=document.createElementNS("http://www.w3.org/2000/svg","foreignObject");a.setAttribute("x",i),a.setAttribute("y",o),a.setAttribute("width",e.tooltipWidth),a.setAttribute("height",e.tooltipHeight);const l=document.createElement("div");l.style.width="100%",l.style.height="100%",l.style.padding="6px 8px",l.style.fontFamily="Helvetica, Arial, sans-serif",l.style.fontSize="12px",l.style.color=s?"#f8f9fa":"#373d3f",l.style.pointerEvents="none",l.innerHTML=e.tooltipContent,a.appendChild(l),t.appendChild(r),t.appendChild(a);const c=document.createElementNS("http://www.w3.org/2000/svg","line");c.setAttribute("x1",n.x),c.setAttribute("y1",o+e.tooltipHeight),c.setAttribute("x2",n.x),c.setAttribute("y2",n.y),c.setAttribute("stroke",s?"#6c757d":"#b0bec5"),c.setAttribute("stroke-width","1"),c.setAttribute("stroke-dasharray","2,2"),t.appendChild(c);const h=document.createElementNS("http://www.w3.org/2000/svg","circle");h.setAttribute("cx",n.x),h.setAttribute("cy",n.y),h.setAttribute("r","3"),h.setAttribute("fill",s?"#6c757d":"#b0bec5"),h.setAttribute("stroke",s?"#343a40":"white"),h.setAttribute("stroke-width","1"),t.appendChild(h),e.currentScreenX=n.x,e.currentScreenY=n.y}redrawTooltipElement(e){const n=document.createElementNS("http://www.w3.org/2000/svg","g");if(n.classList.add("apexstock-tooltip-annotation"),e.id)n.dataset.tooltipId=e.id,n.dataset.elementId=e.id;else{const i=t.generateUniqueId("tooltip");n.dataset.tooltipId=i,n.dataset.elementId=i,e.id=i}return this.coordinateConverter.refreshBounds(),this.createSvgTooltip(n,e),this.tooltipElements.set(e.id,n),n}updateTooltipPosition(t){const e=this.tooltipElements.get(t);if(!e)return!1;const n=this.getTooltipDataFromElement(e);if(!n)return!1;const i=this.redrawTooltipElement(n);return!!e.parentNode&&(e.parentNode.replaceChild(i,e),!0)}getTooltipDataFromElement(t){if(!t)return null;const e=t.dataset.tooltipId||t.dataset.elementId;if(!e)return null;for(const t of this.tooltipElements.values())if(t.dataset&&(t.dataset.tooltipId===e||t.dataset.elementId===e)){const n=t.querySelector("foreignObject"),i=t.querySelector("rect"),o=t.querySelector("circle");if(!n||!i||!o)continue;const s=parseFloat(o.getAttribute("cx")),r=parseFloat(o.getAttribute("cy")),a=this.coordinateConverter.screenToData(s,r);return{id:e,type:"tooltip",x:a.x,y:a.y,clickX:s,clickY:r,tooltipContent:n.querySelector("div").innerHTML,tooltipWidth:parseFloat(i.getAttribute("width")),tooltipHeight:parseFloat(i.getAttribute("height"))}}return null}removeTooltip(t,e){if(!t)return;const n=t.dataset.tooltipId||t.dataset.elementId;if(e&&n!==e){console.warn(`Tooltip ID mismatch! Expected: ${e}, Found: ${n}`);const t=document.querySelector(`.apexstock-tooltip-annotation[data-tooltip-id="${e}"], .apexstock-tooltip-annotation[data-element-id="${e}"]`);if(t&&t.parentNode)return t.parentNode.removeChild(t),void this.tooltipElements.delete(e)}t&&t.parentNode&&t.parentNode.removeChild(t),n&&this.tooltipElements.delete(n)}removeTooltipById(t){if(!t)return!1;const e=document.querySelector(`.apexstock-tooltip-annotation[data-tooltip-id="${t}"], .apexstock-tooltip-annotation[data-element-id="${t}"]`);return!(!e||!e.parentNode)&&(e.parentNode.removeChild(e),this.tooltipElements.delete(t),!0)}cleanup(){this.tooltipElements.forEach(((t,e)=>{t&&t.parentNode&&t.parentNode.removeChild(t)})),this.tooltipElements.clear()}destroy(){this.cleanup()}}class c{constructor(t,e,n){this.chartDiv=t,this.deleteCallback=e,this.styleChangeCallback=n,this.popupElement=null,this.currentElement=null,this.currentElementData=null,this.strokeColorPicker=null,this.fillColorPicker=null,this.fillOpacitySlider=null,this.isDarkTheme=!1,this.createPopup()}createPopup(){this.popupElement=document.createElement("div"),this.popupElement.className="apexstock-element-popup",this.isDarkTheme=document.body.classList.contains("dark-mode")||null!==document.querySelector(".apexstock-theme-dark"),this.isDarkTheme&&this.popupElement.classList.add("apexstock-theme-dark");const t=document.createElement("div");t.className="apexstock-style-toolbar";const e=document.createElement("div");e.className="apexstock-color-container";const n=document.createElement("label");n.textContent="Outline",e.appendChild(n),this.strokeColorPicker=document.createElement("input"),this.strokeColorPicker.type="color",this.strokeColorPicker.className="apexstock-stroke-color-picker",this.strokeColorPicker.value="#000000",this.strokeColorPicker.addEventListener("input",(t=>{const e=this.currentElementData;e&&this.styleChangeCallback&&this.styleChangeCallback(this.currentElement,e,{stroke:t.target.value}),t.stopPropagation()})),e.appendChild(this.strokeColorPicker);const i=document.createElement("div");i.className="apexstock-color-container";const o=document.createElement("label");o.textContent="Fill",i.appendChild(o),this.fillColorPicker=document.createElement("input"),this.fillColorPicker.type="color",this.fillColorPicker.className="apexstock-fill-color-picker",this.fillColorPicker.value="#ffffff",this.fillColorPicker.addEventListener("input",(t=>{const e=this.currentElementData;e&&this.styleChangeCallback&&this.styleChangeCallback(this.currentElement,e,{fill:t.target.value}),t.stopPropagation()})),i.appendChild(this.fillColorPicker);const s=document.createElement("div");s.className="apexstock-opacity-container";const r=document.createElement("label");r.textContent="Opacity",s.appendChild(r);const a=document.createElement("div");this.fillOpacitySlider=document.createElement("input"),this.fillOpacitySlider.type="range",this.fillOpacitySlider.min="0",this.fillOpacitySlider.max="100",this.fillOpacitySlider.value="50",this.fillOpacitySlider.className="apexstock-opacity-slider",this.fillOpacitySlider.addEventListener("input",(t=>{const e=this.currentElementData;if(e&&this.styleChangeCallback){this.styleChangeCallback(this.currentElement,e,{fillOpacity:parseInt(t.target.value)/100})}t.stopPropagation()})),a.appendChild(this.fillOpacitySlider),s.appendChild(a),t.appendChild(e),t.appendChild(i),t.appendChild(s);const l=document.createElement("div");l.className="apexstock-divider";const c=document.createElement("button");c.className="apexstock-element-delete-btn",c.innerHTML="🗑 Delete",c.addEventListener("click",(t=>{"function"==typeof this.deleteCallback&&this.deleteCallback(),this.hide(),t.stopPropagation()})),this.popupElement.appendChild(t),this.popupElement.appendChild(l),this.popupElement.appendChild(c),this.chartDiv.appendChild(this.popupElement),document.addEventListener("mousedown",(t=>{this.popupElement&&"block"===this.popupElement.style.display&&!this.popupElement.contains(t.target)&&this.hide()})),this.popupElement.addEventListener("click",(t=>{t.stopPropagation()}))}configureForElement(t){if(t)switch(this.currentElementData=t,t.type){case"line":case"brush":case"highlighter":this.strokeColorPicker.value=t.color||"#000000",this.strokeColorPicker.parentElement.style.display="flex",this.fillColorPicker.parentElement.style.display="none",this.fillOpacitySlider.parentElement.parentElement.style.display="none";break;case"rectangle":case"circle":case"ellipse":this.strokeColorPicker.value=t.color||"#000000",this.fillColorPicker.value=t.fill||"#ffffff",this.fillOpacitySlider.value=Math.round(100*(t.fillOpacity||.5)),this.strokeColorPicker.parentElement.style.display="flex",this.fillColorPicker.parentElement.style.display="flex",this.fillOpacitySlider.parentElement.parentElement.style.display="flex";break;case"text":this.strokeColorPicker.value=t.color||"#000000",this.fillColorPicker.value=t.backgroundColor||"#ffffff",this.fillOpacitySlider.value=Math.round(100*(t.backgroundOpacity||.7)),this.strokeColorPicker.parentElement.style.display="flex",this.fillColorPicker.parentElement.style.display="flex",this.fillOpacitySlider.parentElement.parentElement.style.display="flex",this.strokeColorPicker.parentElement.querySelector("label").textContent="Text",this.fillColorPicker.parentElement.querySelector("label").textContent="Background";break;case"tooltip":this.strokeColorPicker.parentElement.style.display="none",this.fillColorPicker.parentElement.style.display="none",this.fillOpacitySlider.parentElement.parentElement.style.display="none"}}show(t,e,n,i){const o=this.chartDiv.getBoundingClientRect(),s=t-o.left,r=e-o.top;this.currentElement=n,this.currentElementData=i,this.configureForElement(i),this.popupElement.style.left=s+"px",this.popupElement.style.top=r+"px",this.popupElement.style.display="block";const a=this.popupElement.getBoundingClientRect();a.right>o.right&&(this.popupElement.style.left=s-a.width+"px"),a.bottom>o.bottom&&(this.popupElement.style.top=r-a.height+"px")}hide(){this.popupElement&&(this.popupElement.style.display="none",this.currentElement=null,this.currentElementData=null)}destroy(){this.popupElement&&this.popupElement.parentNode&&this.popupElement.parentNode.removeChild(this.popupElement)}}class h{constructor(t,e,n,i,o,s){this.chartEl=t,this.svgOverlay=e,this.drawingGroup=n,this.elements=i,this.redrawElements=o,this.coordinateConverter=s,this.hoveredElement=null,this.hoveredElementId=null,this.selectedElement=null,this.selectedElementId=null,this.isMoving=!1,this.moveStartX=0,this.moveStartY=0,this.elementStartX=0,this.elementStartY=0,this.activeElementForDrag=null,this.hoverOutline=null,this.selectionOutline=null,this.elementPopup=null,this.handleElementMouseOver=this.handleElementMouseOver.bind(this),this.handleElementMouseOut=this.handleElementMouseOut.bind(this),this.handleElementClick=this.handleElementClick.bind(this),this.handleElementMouseDown=this.handleElementMouseDown.bind(this),this.handleMouseDown=this.handleMouseDown.bind(this),this.handleMouseMove=this.handleMouseMove.bind(this),this.handleMouseUp=this.handleMouseUp.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this),this.deleteSelectedElement=this.deleteSelectedElement.bind(this),this.createVisualElements(),this.elementPopup=new c(this.chartEl,this.deleteSelectedElement.bind(this),((t,e,n)=>{if(this.context&&"function"==typeof this.context.handleStyleChange)this.context.handleStyleChange(t,e,n);else{const t=this.elements.findIndex((t=>t.data&&t.data.id===e.id));-1!==t&&(n.stroke&&(this.elements[t].data.color=n.stroke,this.elements[t].element.setAttribute("stroke",n.stroke)),n.fill&&(this.elements[t].data.fill=n.fill,this.elements[t].element.setAttribute("fill",n.fill)),void 0!==n.fillOpacity&&(this.elements[t].data.fillOpacity=n.fillOpacity,this.elements[t].element.setAttribute("fill-opacity",n.fillOpacity)))}})),this.attachEventListeners(),this.activateInteraction(),this.ensureElementIds()}ensureElementIds(){this.elements.forEach((e=>{e.data.id||(e.data.id=t.generateUniqueId(e.data.type||"element"),e.element&&(e.element.dataset.elementId=e.data.id))}))}getElementById(t){return t?this.elements.find((e=>e.data&&e.data.id===t)):null}getElementIndexById(t){return t?this.elements.findIndex((e=>e.data&&e.data.id===t)):-1}createVisualElements(){this.hoverOutline=document.createElementNS("http://www.w3.org/2000/svg","rect"),this.hoverOutline.setAttribute("fill","none"),this.hoverOutline.setAttribute("stroke","#1E90FF"),this.hoverOutline.setAttribute("stroke-width","1"),this.hoverOutline.setAttribute("stroke-dasharray","2,2"),this.hoverOutline.setAttribute("pointer-events","none"),this.hoverOutline.style.display="none",this.drawingGroup.appendChild(this.hoverOutline),this.selectionOutline=document.createElementNS("http://www.w3.org/2000/svg","rect"),this.selectionOutline.setAttribute("fill","none"),this.selectionOutline.setAttribute("stroke","#FF4500"),this.selectionOutline.setAttribute("stroke-width","2"),this.selectionOutline.setAttribute("pointer-events","none"),this.selectionOutline.style.display="none",this.drawingGroup.appendChild(this.selectionOutline)}attachEventListeners(){document.addEventListener("keydown",this.handleKeyDown),window.addEventListener("mousemove",this.handleMouseMove),window.addEventListener("mouseup",this.handleMouseUp)}activateInteraction(){this.ensureElementIds(),window.addEventListener("mousemove",this.handleMouseMove),window.addEventListener("mouseup",this.handleMouseUp);for(const t of this.elements)t.element&&(t.data&&t.data.id&&(t.element.dataset.elementId=t.data.id),t.element.addEventListener("mouseover",this.handleElementMouseOver),t.element.addEventListener("mouseout",this.handleElementMouseOut),t.element.addEventListener("click",this.handleElementClick),t.element.addEventListener("mousedown",this.handleElementMouseDown),t.element.style.pointerEvents="all",t.element.style.cursor="move")}deactivateInteraction(){this.clearHover(),this.clearSelection(),this.elementPopup&&this.elementPopup.hide();for(const t of this.elements)t.element&&(t.element.removeEventListener("mouseover",this.handleElementMouseOver),t.element.removeEventListener("mouseout",this.handleElementMouseOut),t.element.removeEventListener("click",this.handleElementClick),t.element.removeEventListener("mousedown",this.handleElementMouseDown),t.element.style.pointerEvents="none",t.element.style.cursor="")}handleElementMouseOver(t){if(this.isMoving)return;const e=t.currentTarget,n=e.dataset.elementId;n!==this.selectedElementId&&(this.hoveredElement=e,this.hoveredElementId=n,this.updateHoverOutline())}handleElementMouseOut(){this.clearHover()}updateHoverOutline(){if(this.hoveredElement)try{const t=this.hoveredElement.getBBox();this.hoverOutline.setAttribute("x",t.x-2),this.hoverOutline.setAttribute("y",t.y-2),this.hoverOutline.setAttribute("width",t.width+4),this.hoverOutline.setAttribute("height",t.height+4),this.hoverOutline.style.display="block"}catch(t){console.error("Error updating hover outline:",t)}}clearHover(){this.hoveredElement=null,this.hoveredElementId=null,this.hoverOutline.style.display="none"}handleElementMouseDown(t){const e=t.currentTarget,n=e.dataset.elementId;if(!n)return void console.warn("Clicked element has no ID:",e);if(n===this.selectedElementId)return void this.handleMouseDown(t);this.elementPopup&&this.elementPopup.hide(),this.activeElementForDrag=e;const i=this.svgOverlay.getBoundingClientRect();this.moveStartX=t.clientX-i.left,this.moveStartY=t.clientY-i.top;const o=this.getElementById(n);o&&o.data?(this.storeElementStartPosition(o.data),this.isMoving=!0,t.stopPropagation(),t.preventDefault()):console.warn("Could not find element data for ID:",n)}handleElementClick(t){if(this.isMoving)return void t.stopPropagation();const e=t.currentTarget,n=e.dataset.elementId;if(n){if(n!==this.selectedElementId){if(this.selectedElement&&this.clearSelection(),this.selectedElement=e,this.selectedElementId=n,this.updateSelectionOutline(),this.elementPopup){const e=this.getElementById(n)?.data;this.elementPopup.show(t.clientX+10,t.clientY-10,this.selectedElement,e)}t.stopPropagation()}}else console.warn("Clicked element has no ID:",e)}updateSelectionOutline(){if(this.selectedElement)try{const t=this.selectedElement.getBBox();this.selectionOutline.setAttribute("x",t.x-2),this.selectionOutline.setAttribute("y",t.y-2),this.selectionOutline.setAttribute("width",t.width+4),this.selectionOutline.setAttribute("height",t.height+4),this.selectionOutline.style.display="block"}catch(t){console.error("Error updating selection outline:",t)}}clearSelection(){this.selectedElement=null,this.selectedElementId=null,this.selectionOutline.style.display="none",this.elementPopup&&this.elementPopup.hide()}handleMouseDown(t){if(!this.selectedElement||!this.selectedElementId)return;const e=this.svgOverlay.getBoundingClientRect();this.moveStartX=t.clientX-e.left,this.moveStartY=t.clientY-e.top;const n=this.getElementById(this.selectedElementId);n&&n.data?(this.storeElementStartPosition(n.data),this.isMoving=!0,this.elementPopup&&this.elementPopup.hide(),t.stopPropagation()):console.warn("Could not find element data for ID:",this.selectedElementId)}storeElementStartPosition(t){if(t)switch(t.type){case"line":this.elementStartX=t.x1,this.elementStartY=t.y1,this.elementStartX2=t.x2,this.elementStartY2=t.y2;break;case"rectangle":this.elementStartX=t.x,this.elementStartY=t.y;break;case"circle":case"ellipse":this.elementStartX=t.cx,this.elementStartY=t.cy;break;case"text":case"tooltip":this.elementStartX=t.clickX,this.elementStartY=t.clickY,this.elementStartDataX=t.x,this.elementStartDataY=t.y;break;case"brush":case"highlighter":this.elementStartPoints=t.points.map((t=>({x:t.x,y:t.y})))}}handleMouseMove(t){if(!this.isMoving)return;const e=this.selectedElementId||(this.activeElementForDrag?this.activeElementForDrag.dataset.elementId:null);if(!e)return;const n=this.svgOverlay.getBoundingClientRect(),i=t.clientX-n.left-this.moveStartX,o=t.clientY-n.top-this.moveStartY,s=this.coordinateConverter.screenDeltaToDataDelta(i,o),r=this.getElementById(e);r&&r.data?(this.moveElement(r.data,s.x,s.y,i,o),this.redrawElements(),this.selectedElement&&e===this.selectedElementId&&this.updateSelectionOutline(),t.stopPropagation(),t.preventDefault()):console.warn("Could not find element data for ID:",e)}moveElement(t,e,n,i,o){if(t)switch(t.type){case"line":t.x1=this.elementStartX+e,t.y1=this.elementStartY+n,t.x2=this.elementStartX2+e,t.y2=this.elementStartY2+n;break;case"rectangle":t.x=this.elementStartX+e,t.y=this.elementStartY+n;break;case"circle":case"ellipse":t.cx=this.elementStartX+e,t.cy=this.elementStartY+n;break;case"text":case"tooltip":t.clickX=this.elementStartX+i,t.clickY=this.elementStartY+o,t.x=this.elementStartDataX+e,t.y=this.elementStartDataY+n;break;case"brush":case"highlighter":t.points=this.elementStartPoints.map((t=>({x:t.x+e,y:t.y+n})))}}handleMouseUp(t){this.isMoving&&(this.isMoving=!1,this.activeElementForDrag?this.activeElementForDrag=null:this.selectedElement&&this.elementPopup&&this.elementPopup.show(t.clientX+10,t.clientY-10),t&&t.stopPropagation&&t.stopPropagation())}handleKeyDown(t){"Delete"!==t.key&&"Backspace"!==t.key||!this.selectedElementId||(this.deleteSelectedElement(),t.preventDefault())}deleteSelectedElement(){if(!this.selectedElementId)return;const t=this.getElementIndexById(this.selectedElementId);if(-1===t)return void console.warn("Element to delete not found with ID:",this.selectedElementId);const e=this.elements[t];if(e&&e.data&&"tooltip"===e.data.type){[`.apexstock-tooltip-annotation[data-element-id="${this.selectedElementId}"]`,`.apexstock-tooltip-annotation[data-tooltip-id="${this.selectedElementId}"]`].forEach((t=>{document.querySelectorAll(t).forEach((t=>{t&&t.parentNode&&t.parentNode.removeChild(t)}))})),this.context&&this.context.tooltipAnnotationManager&&this.context.tooltipAnnotationManager.tooltipElements.delete(this.selectedElementId)}else e&&e.element&&e.element.parentNode&&e.element.parentNode.removeChild(e.element);this.elements.splice(t,1),this.clearSelection(),this.redrawElements(),this.updateElementEventListeners()}updateElementEventListeners(){this.deactivateInteraction(),this.activateInteraction()}destroy(){this.deactivateInteraction(),document.removeEventListener("keydown",this.handleKeyDown),window.removeEventListener("mousemove",this.handleMouseMove),window.removeEventListener("mouseup",this.handleMouseUp),this.hoverOutline&&this.hoverOutline.parentNode&&this.hoverOutline.parentNode.removeChild(this.hoverOutline),this.selectionOutline&&this.selectionOutline.parentNode&&this.selectionOutline.parentNode.removeChild(this.selectionOutline),this.elementPopup&&(this.elementPopup.destroy(),this.elementPopup=null)}}class d{constructor(t){this.chart=t.chart,this.chartEl=t.chartEl,this.isDrawing=!1,this.currentTool=null,this.elements=[],this.currentElement=null,this.startPoint=null,this.drawingColor="#008FFB",this.drawingWidth=2,this.currentElementData=null,this.tooltipPinningEnabled=!0,this.drawingColor="#008FFB",this.drawingWidth=2,this.fillColor="#ffffff",this.fillOpacity=.5,this.ctx=t,this.drawingToolsConfig=t.chartOptions.drawingTools||{},this.availableTools={line:!0,brush:!0,highlighter:!0,rectangle:!0,circle:!0,ellipse:!0,text:!0,pin:!0,clear:!0},this.drawingToolsConfig&&Object.keys(this.availableTools).forEach((t=>{void 0!==this.drawingToolsConfig[t]&&(this.availableTools[t]=!!this.drawingToolsConfig[t])})),this.coordinateConverter=r.getInstance(this.chart,this.chartEl),this.overlayManager=new i(this.chartEl),this.svgOverlay=this.overlayManager.svgOverlay,this.drawingGroup=this.overlayManager.drawingGroup,this.overlayWrapper=this.overlayManager.overlayWrapper,this.textAnnotationManager=new a(this.chartEl,this.svgOverlay,this.coordinateConverter,this.handleTextCreated.bind(this)),this.tooltipAnnotationManager=new l(this.chartEl,this.svgOverlay,this.coordinateConverter,this.handleTooltipCreated.bind(this)),this.toolbarManager=new o(t,this.chartEl,this.drawingColor,this.drawingWidth,this.handleToolClick.bind(this),this.clearAllDrawings.bind(this),this.availableTools),this.toolbarContainer=this.toolbarManager.toolbarContainer,this.eventManager=new n(this.chart,this.chartEl,this.svgOverlay,this.handleMouseDown.bind(this),this.handleMouseMove.bind(this),this.handleMouseUp.bind(this),this.handleResize.bind(this),this.handleWheelEvent.bind(this),this.redrawElements.bind(this),this.overlayManager.syncOverlayPosition.bind(this.overlayManager)),this.toolbarManager.onColorChange=t=>{this.drawingColor=t},this.toolbarManager.onWidthChange=t=>{this.drawingWidth=t},this.elementInteractionManager=new h(this.chartEl,this.svgOverlay,this.drawingGroup,this.elements,this.redrawElements.bind(this),this.coordinateConverter),this.setupTooltipPinningHandler()}setupTooltipPinningHandler(){const t=document.getElementById(this.chart.w.globals.chartID);t&&t.addEventListener("dblclick",this.handleTooltipPinning.bind(this))}handleTooltipPinning(t){if(!this.tooltipPinningEnabled)return;const e=document.querySelector(".apexcharts-tooltip:not(.apexcharts-tooltip-hidden)");if(!e)return;const n=this.overlayWrapper.getBoundingClientRect(),i=t.clientX-n.left,o=t.clientY-n.top,s=this.coordinateConverter.screenToData(i,o);if(!s)return;const r=this.tooltipAnnotationManager.createTooltipAnnotation(e,i,o,{x:s.x,y:s.y});r&&r.element&&(this.drawingGroup.appendChild(r.element),this.elements.push({element:r.element,data:r.data}),this.elementInteractionManager&&this.elementInteractionManager.updateElementEventListeners())}handleWheelEvent(t){this.currentTool&&this.deactivateAllTools()}handleMouseDown(t){if(!this.currentTool||"true"!==this.svgOverlay.dataset.drawingMode)return;if(t.target!==this.svgOverlay)for(const e of this.elements)if(e.element===t.target||e.element.contains(t.target))return;const e=this.overlayWrapper.getBoundingClientRect(),n=t.clientX-e.left,i=t.clientY-e.top,o=this.coordinateConverter.screenToData(n,i);if(o?(this.isDrawing=!0,this.startPoint={x:n,y:i,dataX:o.x,dataY:o.y}):(this.isDrawing=!0,this.startPoint={x:n,y:i,dataX:n,dataY:i}),"text"===this.currentTool){const t=this.textAnnotationManager.createTextAnnotation(n,i,{x:this.startPoint.dataX,y:this.startPoint.dataY},this.drawingColor);this.currentElement=t.element,this.currentElementData=t.data,this.drawingGroup.appendChild(this.currentElement)}else this.createNewElement();t.preventDefault(),"line"!==this.currentTool&&"rectangle"!==this.currentTool&&"circle"!==this.currentTool&&"ellipse"!==this.currentTool&&t.stopPropagation()}createNewElement(){const t=new s(this.startPoint,this.drawingColor,this.drawingWidth).setFillColor(this.fillColor).setFillOpacity(this.fillOpacity).createElement(this.currentTool);t&&(this.currentElement=t.element,this.currentElementData=t.data,this.drawingGroup.appendChild(this.currentElement))}handleMouseMove(t){if(!this.isDrawing||!this.currentTool||!this.currentElement)return;if("text"===this.currentTool)return;const e=this.overlayWrapper.getBoundingClientRect(),n=t.clientX-e.left,i=t.clientY-e.top,o=this.coordinateConverter.screenToData(n,i);this.updateElement(n,i,o||{x:n,y:i}),t.preventDefault(),"brush"!==this.currentTool&&"highlighter"!==this.currentTool||t.stopPropagation()}updateElement(t,e,n){if(this.currentElement&&this.currentElementData&&"text"!==this.currentElementData.type)switch(this.currentElementData.type){case"line":this.currentElement.setAttribute("x2",t),this.currentElement.setAttribute("y2",e),this.currentElementData.x2=n.x,this.currentElementData.y2=n.y;break;case"brush":case"highlighter":const i=this.currentElement.getAttribute("d");this.currentElement.setAttribute("d",`${i} L ${t} ${e}`),this.currentElementData.points.push({x:n.x,y:n.y});break;case"rectangle":const o=t-this.startPoint.x,s=e-this.startPoint.y,r=0>s?e:this.startPoint.y;this.currentElement.setAttribute("x",0>o?t:this.startPoint.x),this.currentElement.setAttribute("y",r),this.currentElement.setAttribute("width",Math.abs(o)),this.currentElement.setAttribute("height",Math.abs(s));const a=this.coordinateConverter.screenToData(this.startPoint.x,this.startPoint.y);this.currentElementData.x=Math.min(a.x,n.x),this.currentElementData.y=Math.min(a.y,n.y),this.currentElementData.width=Math.abs(n.x-a.x),this.currentElementData.height=Math.abs(n.y-a.y);break;case"circle":const l=t-this.startPoint.x,c=e-this.startPoint.y;this.currentElement.setAttribute("r",Math.sqrt(l*l+c*c));const h=this.coordinateConverter.getDataDistance({x:this.startPoint.dataX,y:this.startPoint.dataY},n);this.currentElementData.r=h;break;case"ellipse":const d=Math.abs(t-this.startPoint.x),p=Math.abs(e-this.startPoint.y);this.currentElement.setAttribute("rx",d),this.currentElement.setAttribute("ry",p);const u=this.coordinateConverter.screenToData(this.startPoint.x,this.startPoint.y),m=Math.abs(n.x-u.x),g=Math.abs(n.y-u.y);this.currentElementData.rx=m,this.currentElementData.ry=g}}handleMouseUp(){if(this.isDrawing&&(this.isDrawing=!1,this.currentElement&&"text"!==this.currentTool)){if(this.currentElementData&&!this.currentElementData.id){const e=t.generateUniqueId(this.currentElementData.type||"element");this.currentElementData.id=e,this.currentElement&&(this.currentElement.dataset.elementId=e)}this.elements.push({element:this.currentElement,data:this.currentElementData}),this.currentElement=null,this.currentElementData=null,this.elementInteractionManager&&this.elementInteractionManager.updateElementEventListeners()}}handleTextCreated(t,e){if(t&&e){const n=this.elements.findIndex((t=>t.data&&t.data.id===e.id));0>n?this.elements.push({element:t,data:e}):(this.elements[n].element=t,this.elements[n].data=e),this.elementInteractionManager&&this.elementInteractionManager.updateElementEventListeners()}}handleTooltipCreated(t,e){if(t&&e){const n=this.elements.findIndex((t=>t.data&&t.data.id===e.id));0>n?this.elements.push({element:t,data:e}):(this.elements[n].element=t,this.elements[n].data=e),this.elementInteractionManager&&this.elementInteractionManager.updateElementEventListeners()}}handleResize(){this.coordinateConverter.refreshBounds(),this.redrawElements()}redrawElements(){for(;this.drawingGroup.firstChild;)this.drawingGroup.removeChild(this.drawingGroup.firstChild);this.elements.forEach((t=>{const e=t.data;let n;switch(e.type){case"line":n=document.createElementNS("http://www.w3.org/2000/svg","line");const t=this.coordinateConverter.dataToScreen(e.x1,e.y1),i=this.coordinateConverter.dataToScreen(e.x2,e.y2);n.setAttribute("x1",t.x),n.setAttribute("y1",t.y),n.setAttribute("x2",i.x),n.setAttribute("y2",i.y),n.setAttribute("stroke",e.color),n.setAttribute("stroke-width",e.width);break;case"brush":case"highlighter":n=document.createElementNS("http://www.w3.org/2000/svg","path");let o="";e.points.forEach(((t,e)=>{const n=this.coordinateConverter.dataToScreen(t.x,t.y);o+=0===e?`M ${n.x} ${n.y}`:` L ${n.x} ${n.y}`})),n.setAttribute("d",o),n.setAttribute("fill","none"),n.setAttribute("stroke",e.color),n.setAttribute("stroke-width",e.width),n.setAttribute("stroke-linecap","round"),n.setAttribute("stroke-linejoin","round"),"highlighter"===e.type&&n.setAttribute("stroke-opacity",e.opacity);break;case"rectangle":n=document.createElementNS("http://www.w3.org/2000/svg","rect");const s=this.coordinateConverter.dataToScreen(e.x,e.y),r=this.coordinateConverter.dataToScreen(e.x+e.width,e.y+e.height),a=Math.abs(r.x-s.x),l=Math.abs(r.y-s.y),c=Math.min(s.x,r.x),h=Math.min(s.y,r.y);n.setAttribute("x",c),n.setAttribute("y",h),n.setAttribute("width",a),n.setAttribute("height",l),n.setAttribute("stroke",e.color),n.setAttribute("stroke-width",e.strokeWidth),n.setAttribute("fill",e.fill||this.fillColor),n.setAttribute("fill-opacity",e.fillOpacity||this.fillOpacity);break;case"circle":n=document.createElementNS("http://www.w3.org/2000/svg","circle");const d=this.coordinateConverter.dataToScreen(e.cx,e.cy),p=this.coordinateConverter.dataToScreen(e.cx+e.r,e.cy),u=Math.abs(p.x-d.x);n.setAttribute("cx",d.x),n.setAttribute("cy",d.y),n.setAttribute("r",u),n.setAttribute("stroke",e.color),n.setAttribute("stroke-width",e.strokeWidth),n.setAttribute("fill",e.fill||this.fillColor),n.setAttribute("fill-opacity",e.fillOpacity||this.fillOpacity);break;case"ellipse":n=document.createElementNS("http://www.w3.org/2000/svg","ellipse");const m=this.coordinateConverter.dataToScreen(e.cx,e.cy),g=this.coordinateConverter.dataToScreen(e.cx+e.rx,e.cy),x=this.coordinateConverter.dataToScreen(e.cx,e.cy+e.ry),y=Math.abs(g.x-m.x),b=Math.abs(x.y-m.y);n.setAttribute("cx",m.x),n.setAttribute("cy",m.y),n.setAttribute("rx",y),n.setAttribute("ry",b),n.setAttribute("stroke",e.color),n.setAttribute("stroke-width",e.strokeWidth),n.setAttribute("fill",e.fill||this.fillColor),n.setAttribute("fill-opacity",e.fillOpacity||this.fillOpacity);break;case"text":n=this.textAnnotationManager.redrawTextElement(e);break;case"tooltip":n=this.tooltipAnnotationManager.redrawTooltipElement(e)}n&&(e.id&&(n.dataset.elementId=e.id),this.drawingGroup.appendChild(n),t.element=n)})),this.elementInteractionManager&&(this.elementInteractionManager.createVisualElements(),this.elementInteractionManager.updateElementEventListeners())}handleToolClick(t){if("clear"!==t)return"pin"===t?(this.tooltipPinningEnabled=!this.tooltipPinningEnabled,void this.toolbarContainer.querySelectorAll(".apexstock-drawing-tool").forEach((t=>{"pin"===t.dataset.tool&&(this.tooltipPinningEnabled?t.classList.add("active"):t.classList.remove("active"))}))):void(this.currentTool!==t?(this.toolbarContainer.querySelectorAll(".apexstock-drawing-tool").forEach((e=>{e.dataset.tool===t?e.classList.add("active"):-1===["clear","pin"].indexOf(e.dataset.tool)&&e.classList.remove("active")})),this.currentTool=t,this.svgOverlay.classList.add("active-drawing"),this.svgOverlay.style.pointerEvents="all",this.overlayWrapper.style.pointerEvents="all",this.svgOverlay.dataset.drawingMode="true"):this.deactivateAllTools());this.clearAllDrawings()}deactivateAllTools(){this.toolbarContainer.querySelectorAll(".apexstock-drawing-tool").forEach((t=>{"pin"!==t.dataset.tool&&t.classList.remove("active")})),this.currentTool=null,this.svgOverlay.classList.remove("active-drawing"),this.svgOverlay.style.pointerEvents="none",this.overlayWrapper.style.pointerEvents="none",this.svgOverlay.dataset.drawingMode="false"}clearAllDrawings(){const t=this.elements.filter((t=>t.data&&"tooltip"===t.data.type&&t.data.id)).map((t=>t.data.id));for(this.elements=[];this.drawingGroup.firstChild;)this.drawingGroup.removeChild(this.drawingGroup.firstChild);t.forEach((t=>{this.tooltipAnnotationManager&&this.tooltipAnnotationManager.removeTooltipById(t)})),this.tooltipAnnotationManager&&this.tooltipAnnotationManager.cleanup(),this.elementInteractionManager&&(this.elementInteractionManager.destroy(),this.elementInteractionManager=new h(this.chartEl,this.svgOverlay,this.drawingGroup,this.elements,this.redrawElements.bind(this),this.coordinateConverter)),this.currentTool||(this.svgOverlay.style.pointerEvents="none",this.overlayWrapper.style.pointerEvents="none")}handleStyleChange(t,e,n){const i=this.elements.findIndex((t=>t.data&&t.data.id===e.id));-1!==i&&(n.stroke&&(this.elements[i].data.color=n.stroke),n.fill&&(this.elements[i].data.fill=n.fill),void 0!==n.fillOpacity&&(this.elements[i].data.fillOpacity=n.fillOpacity),this.redrawElements())}toggleTooltipPinning(t){this.tooltipPinningEnabled=t}destroy(){this.eventManager.destroy(),this.textAnnotationManager.destroy(),this.elementInteractionManager&&this.elementInteractionManager.destroy();const t=document.getElementById(this.chart.w.globals.chartID);t&&t.removeEventListener("dblclick",this.handleTooltipPinning.bind(this)),this.overlayWrapper&&this.overlayWrapper.parentNode&&this.overlayWrapper.parentNode.removeChild(this.overlayWrapper),this.toolbarContainer&&this.toolbarContainer.parentNode&&this.toolbarContainer.parentNode.removeChild(this.toolbarContainer)}}const p='/* ==============================\n * 1. Common & Variables\n * ============================== */\n:root {\n  /* Light Theme Colors */\n  --light-bg: #ffffff;\n  --light-border: #ced4da;\n  --light-hover: #f5f5f5;\n  --light-text: #333333;\n  --light-selected: #e6f7ff;\n  --light-divider: #dddddd;\n  --light-shadow: rgba(0, 0, 0, 0.15);\n\n  /* Dark Theme Colors */\n  --dark-bg: #343A3F;\n  --dark-bg-alpha: rgba(1, 1, 1, 0.65);\n  --dark-border: #495057;\n  --dark-hover: #555555;\n  --dark-text: #e9ecef;\n  --dark-selected: #495057;\n  --dark-divider: #444444;\n  --dark-shadow: rgba(0, 0, 0, 0.3);\n\n  /* Accent Colors */\n  --blue: #007bff;\n  --danger: #dc3545;\n  --danger-light: #f8d7da;\n  --success: #28a745;\n\n  /* Common Sizing */\n  --button-size: 30px;\n  --border-radius-sm: 3px;\n  --border-radius-md: 4px;\n  --border-radius-lg: 8px;\n  --font-size-sm: 10px;\n  --gap-sm: 5px;\n  --gap-md: 8px;\n  --gap-lg: 10px;\n}\n\n[class^=apexstock-] * {\n  box-sizing: border-box;\n  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;\n}\n\n/* ==============================\n * 2. Toolbar Layout\n * ============================== */\n.apexstock-toolbar {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  justify-content: space-between;\n  padding: 5px 0;\n  width: 100%;\n  position: relative;\n  margin-bottom: 5px;\n  border-bottom: 2px solid #000;\n  z-index: 1000;\n}\n\n.apexstock-toolbar-left {\n  display: flex;\n  align-items: center;\n  flex-wrap: wrap;\n  gap: var(--gap-lg);\n}\n\n.apexstock-toolbar-right {\n  display: flex;\n  align-items: center;\n}\n\n/* ==============================\n * 3. Chart Type Dropdown\n * ============================== */\n.apexstock-chart-type-wrapper {\n  position: relative;\n  display: inline-block;\n  z-index: 100;\n  margin-right: var(--gap-lg);\n  background: var(--light-bg);\n  border: 1px solid var(--light-border);\n  border-radius: var(--border-radius-sm);\n}\n\n.apexstock-chart-type-trigger {\n  background: transparent;\n  border: none;\n  border-radius: var(--border-radius-sm);\n  cursor: pointer;\n  padding: 5px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  height: var(--button-size);\n  width: var(--button-size);\n}\n\n.apexstock-chart-type-trigger:hover {\n  background-color: var(--light-hover);\n}\n\n.apexstock-chart-type-dropdown {\n  position: absolute;\n  background-color: var(--light-bg);\n  border: 1px solid var(--light-border);\n  border-radius: var(--border-radius-md);\n  box-shadow: 0 2px 8px var(--light-shadow);\n  z-index: 1000;\n  width: 150px;\n  left: 0;\n  top: 100%;\n  display: none;\n  margin-top: 2px;\n}\n\n.apexstock-chart-type-option {\n  display: flex;\n  align-items: center;\n  gap: var(--gap-md);\n  padding: 8px 12px;\n  cursor: pointer;\n  transition: background-color 0.2s;\n}\n\n.apexstock-chart-type-option .chart-icon {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: 24px;\n  /* Fixed width for all icons */\n}\n\n.apexstock-chart-type-option .chart-text {\n  font-size: 16px;\n  line-height: 24px;\n}\n\n.apexstock-chart-type-option:hover {\n  background-color: var(--light-hover);\n}\n\n.apexstock-chart-type-option.active {\n  background-color: var(--light-hover);\n  font-weight: bold;\n}\n\n/* ==============================\n * 4. Indicator Dropdown\n * ============================== */\n.apexstock-custom-select-wrapper {\n  position: relative;\n  width: 200px;\n  user-select: none;\n  font-size: 14px;\n}\n\n.apexstock-custom-select-trigger {\n  position: relative;\n  display: block;\n  width: 100%;\n  padding: 7px;\n  background: var(--light-bg);\n  border: 1px solid var(--light-border);\n  border-radius: var(--border-radius-sm);\n  cursor: pointer;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  height: var(--button-size);\n}\n\n.apexstock-custom-select-trigger:after {\n  content: "▼";\n  position: absolute;\n  right: 10px;\n  top: 50%;\n  transform: translateY(-50%);\n  font-size: 12px;\n  color: #999;\n}\n\n.apexstock-custom-options {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  right: 0;\n  background: var(--light-bg);\n  border: 1px solid var(--light-bg);\n  border-top: none;\n  z-index: 999;\n  max-height: 200px;\n  overflow-y: auto;\n  display: none;\n  margin-top: 2px;\n}\n\n.apexstock-custom-option {\n  padding: 10px;\n  cursor: pointer;\n}\n\n.apexstock-custom-option:hover {\n  background: var(--light-hover);\n}\n\n.apexstock-custom-option.selected {\n  background: var(--light-selected);\n}\n\n.apexstock-custom-option.selected:before {\n  content: "✔";\n  margin-right: 5px;\n  color: var(--blue);\n}\n\n/* ==============================\n * 5. Drawing Tools\n * ============================== */\n.apexstock-drawing-toolbar {\n  display: flex;\n  align-items: center;\n  z-index: 11;\n  margin-left: 20px;\n}\n\n.apexstock-drawing-tool {\n  width: var(--button-size);\n  height: var(--button-size);\n  margin: 0 2px;\n  cursor: pointer;\n  background: var(--light-bg);\n  border: 1px solid var(--light-border);\n  border-radius: var(--border-radius-sm);\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  font-size: 16px;\n}\n\n.apexstock-drawing-tool[data-tool="brush"] {\n  font-size: 30px;\n  align-items: self-end;\n  line-height: 34px;\n}\n\n.apexstock-drawing-tool[data-tool="pin"] {\n  font-size: 18px;\n  line-height: 26px;\n}\n\n.apexstock-drawing-tool.active {\n  background: var(--light-hover);\n  box-shadow: inset 0 0 3px rgba(0, 0, 0, 0.2);\n}\n\n.apexstock-drawing-color-picker {\n  width: var(--button-size);\n  height: var(--button-size);\n  border: none;\n  padding: 0;\n  margin-right: 5px;\n  cursor: pointer;\n}\n\n.apexstock-drawing-toolbar select {\n  border: 1px solid var(--light-border);\n}\n\n/* Drawing overlay wrapper should not block chart interactions */\n.apexstock-drawing-overlay-wrapper,\n.apexstock-drawing-overlay {\n  pointer-events: none;\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  z-index: 9;\n}\n\n/* When a drawing tool is active, we need to capture events on the drawing area */\n.apexstock-drawing-overlay.active-drawing {\n  pointer-events: all;\n}\n\n/* ==============================\n * 6. Export Button\n * ============================== */\n.apexstock-export-btn-container {\n  z-index: 100;\n  position: relative;\n}\n\n.apexstock-export-btn {\n  background-color: var(--light-bg);\n  border: 1px solid var(--light-border);\n  border-radius: var(--border-radius-sm);\n  padding: 5px;\n  cursor: pointer;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  transition: background-color 0.2s;\n  width: var(--button-size);\n  height: var(--button-size);\n}\n\n.apexstock-export-btn:hover {\n  background-color: var(--light-hover);\n}\n\n/* ==============================\n * 7. X-Axis Styling\n * ============================== */\n.apexstock-xaxis-tooltip {\n  position: absolute;\n  display: none;\n  padding: 6px;\n  border-radius: var(--border-radius-md);\n  font-size: 11px;\n  pointer-events: none;\n  z-index: 1000;\n  white-space: nowrap;\n  transform: translateX(-50%) translateY(1px);\n  background-color: #eceff1;\n  border: 1px solid #90a4ae;\n}\n\n/* ==============================\n * 8. Element Interactions\n * ============================== */\n.apexstock-drawing-overlay path,\n.apexstock-drawing-overlay line,\n.apexstock-drawing-overlay rect,\n.apexstock-drawing-overlay circle,\n.apexstock-drawing-overlay ellipse,\n.apexstock-drawing-overlay .apexstock-text-annotation {\n  pointer-events: all;\n  cursor: pointer;\n}\n\n/* ==============================\n * 9. Element Popup\n * ============================== */\n.apexstock-element-popup {\n  box-shadow: 0 2px 8px var(--light-shadow);\n  border-radius: var(--border-radius-lg);\n  background-color: var(--light-bg);\n  min-width: 220px;\n  padding: 12px;\n  position: absolute;\n  z-index: 1010;\n  /* Above tooltips */\n  pointer-events: auto;\n  display: none;\n  border: 1px solid var(--light-border);\n}\n\n.apexstock-style-toolbar {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--gap-md);\n  margin-bottom: var(--gap-md);\n  padding: 4px;\n}\n\n.apexstock-color-container {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n}\n\n.apexstock-color-container label,\n.apexstock-opacity-container label {\n  font-size: var(--font-size-sm);\n  margin-bottom: 2px;\n  color: #666;\n}\n\n.apexstock-stroke-color-picker,\n.apexstock-fill-color-picker {\n  width: 24px;\n  height: 24px;\n  padding: 0;\n  border: 1px solid var(--light-border);\n  border-radius: 2px;\n  cursor: pointer;\n  transition: transform 0.1s ease;\n}\n\n.apexstock-stroke-color-picker:hover,\n.apexstock-fill-color-picker:hover {\n  transform: scale(1.1);\n}\n\n.apexstock-opacity-container {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n}\n\n.apexstock-opacity-container>div {\n  display: flex;\n  align-items: center;\n}\n\n.apexstock-opacity-slider {\n  width: 60px;\n  height: 8px;\n  margin: 0;\n  cursor: pointer;\n}\n\n.apexstock-divider {\n  width: 100%;\n  height: 1px;\n  margin: 4px 0;\n  background-color: var(--light-divider);\n}\n\n.apexstock-element-delete-btn {\n  display: flex;\n  align-items: center;\n  padding: 6px 12px;\n  width: 100%;\n  background: none;\n  border: none;\n  text-align: left;\n  cursor: pointer;\n  border-radius: var(--border-radius-sm);\n  color: var(--light-text);\n  transition: all 0.2s;\n  margin-top: 4px;\n}\n\n.apexstock-element-delete-btn:hover {\n  background-color: var(--danger-light);\n  color: var(--danger);\n}\n\n/* ==============================\n * 10. Text Annotations\n * ============================== */\n.apexstock-text-toolbar {\n  display: flex;\n  flex-direction: column;\n  gap: var(--gap-md);\n  background-color: var(--light-bg);\n  border: 1px solid var(--light-border);\n  border-radius: var(--border-radius-lg);\n  box-shadow: 0 2px 8px var(--light-shadow);\n  padding: 12px;\n  min-width: 300px;\n  z-index: 1001;\n  position: absolute;\n  display: none;\n}\n\n.apexstock-text-toolbar .font-controls,\n.apexstock-text-toolbar .color-controls,\n.apexstock-text-toolbar .action-controls {\n  display: flex;\n  gap: 5px;\n  margin-bottom: 8px;\n}\n\n.apexstock-text-toolbar .action-controls {\n  justify-content: flex-end;\n}\n\n.apexstock-text-toolbar button {\n  width: 28px;\n  height: 28px;\n  margin: 0 2px;\n  background: var(--light-bg);\n  border: 1px solid var(--light-border);\n  border-radius: var(--border-radius-md);\n  cursor: pointer;\n  transition: all 0.2s;\n}\n\n.apexstock-text-toolbar button:hover {\n  background-color: var(--light-hover);\n  border-color: #adb5bd;\n}\n\n.apexstock-text-toolbar select {\n  height: 28px;\n  margin: 0 2px;\n  background: var(--light-bg);\n  border: 1px solid var(--light-border);\n  border-radius: var(--border-radius-md);\n  cursor: pointer;\n}\n\n.apexstock-text-toolbar .color-wrapper {\n  display: inline-block;\n  position: relative;\n}\n\n.apexstock-text-toolbar .color-wrapper+.color-wrapper,\n.apexstock-text-toolbar .opacity-wrapper {\n  margin-left: 5px;\n}\n\n.apexstock-text-toolbar .color-wrapper label,\n.apexstock-text-toolbar .opacity-wrapper label {\n  font-size: 10px;\n  display: block;\n  text-align: center;\n}\n\n.apexstock-text-toolbar .color-wrapper input[type="color"] {\n  width: 24px;\n  height: 24px;\n  padding: 0;\n  border: 1px solid #ccc;\n  border-radius: 2px;\n}\n\n.apexstock-text-toolbar .opacity-wrapper input[type="range"] {\n  width: 60px;\n  height: 8px;\n  margin-top: 8px;\n}\n\n.apexstock-text-editor {\n  min-width: 100px;\n  min-height: 14px;\n  padding: 5px;\n  border: 1px solid var(--blue);\n  border-radius: var(--border-radius-sm);\n  box-shadow: 0 2px 5px var(--light-shadow);\n  outline: none;\n  position: absolute;\n  z-index: 1000;\n}\n\n/* ==============================\n * 11. Tooltip Annotations\n * ============================== */\n.apexstock-tooltip-annotation {\n  pointer-events: all;\n  cursor: pointer;\n  z-index: 2;\n}\n\n.apexstock-tooltip-annotation rect {\n  box-shadow: 0 2px 5px var(--light-shadow);\n}\n\n/* Make sure tooltip content is visible */\n.apexstock-tooltip-annotation foreignObject {\n  overflow: visible;\n}\n\n/* Hover effect for pinned tooltips */\n.apexstock-tooltip-annotation:hover rect {\n  filter: brightness(0.95);\n}\n\n/* ==============================\n * 12. Dark Theme Overrides\n * ============================== */\n.apexstock-theme-dark .apexstock-chart-type-wrapper,\n.apexstock-theme-dark .apexstock-export-btn-container button,\n.apexstock-theme-dark .apexstock-chart-type-wrapper:hover button {\n  background-color: var(--dark-bg-alpha) !important;\n}\n\n.apexstock-theme-dark .apexstock-chart-type-wrapper svg,\n.apexstock-theme-dark .apexstock-export-btn-container svg {\n  stroke: var(--dark-text);\n}\n\n.apexstock-theme-dark .apexstock-chart-type-option {\n  background-color: var(--dark-bg);\n}\n\n.apexstock-theme-dark .apexstock-chart-type-option:hover {\n  background-color: var(--dark-hover);\n}\n\n.apexstock-theme-dark .apexstock-chart-type-option.active {\n  background-color: var(--dark-hover);\n}\n\n.apexstock-theme-dark select,\n.apexstock-theme-dark input,\n.apexstock-theme-dark .apexstock-drawing-tool {\n  background-color: var(--dark-bg-alpha);\n  color: var(--dark-text);\n  border: 1px solid var(--light-border);\n  border-radius: var(--border-radius-sm);\n}\n\n.apexstock-theme-dark .apexstock-text-toolbar select,\n.apexstock-theme-dark .apexstock-text-toolbar input {\n  color: #222;\n}\n\n.apexstock-theme-dark .apexstock-drawing-tool.active {\n  background: var(--dark-bg) !important;\n}\n\n.apexstock-theme-dark .apexstock-xaxis-tooltip {\n  background: rgba(0, 0, 0, .8);\n  border: 1px solid rgba(0, 0, 0, .5);\n  color: var(--dark-text);\n}\n\n.apexstock-theme-dark .apexstock-tooltip-annotation:hover rect {\n  filter: brightness(1.1);\n}\n\n.apexstock-theme-dark .apexstock-element-popup {\n  background-color: var(--dark-bg);\n  border: 1px solid var(--dark-border);\n  color: var(--dark-text);\n}\n\n.apexstock-theme-dark .apexstock-color-container label,\n.apexstock-theme-dark .apexstock-opacity-container label {\n  color: #adb5bd;\n}\n\n.apexstock-theme-dark .apexstock-stroke-color-picker,\n.apexstock-theme-dark .apexstock-fill-color-picker {\n  border-color: var(--dark-border);\n}\n\n.apexstock-theme-dark .apexstock-element-delete-btn {\n  color: var(--dark-text);\n}\n\n.apexstock-theme-dark .apexstock-element-delete-btn:hover {\n  background-color: rgba(220, 53, 69, 0.2);\n  color: var(--danger-light);\n}\n\n.apexstock-theme-dark .apexstock-text-toolbar {\n  background-color: var(--dark-bg);\n  border-color: var(--dark-border);\n}\n\n.apexstock-theme-dark .apexstock-text-toolbar button,\n.apexstock-theme-dark .apexstock-text-toolbar select {\n  background-color: var(--dark-border);\n  border-color: #6c757d;\n  color: var(--dark-text);\n}\n\n.apexstock-theme-dark .apexstock-text-toolbar button:hover {\n  background-color: #5a6268;\n}\n\n.apexstock-theme-dark .apexstock-text-editor {\n  background-color: var(--dark-bg);\n  border-color: var(--blue);\n  color: var(--dark-text);\n}\n\n/* ==============================\n * 13. Zoom Controls\n * ============================== */\n.apexstock-zoom-controls {\n  display: flex;\n  gap: 4px;\n  position: absolute;\n  bottom: 40px;\n  left: 50%;\n  transform: translateX(-50%);\n  z-index: 10;\n}\n\n.apexstock-zoom-in,\n.apexstock-zoom-out {\n  width: 29px;\n  height: 22px;\n  border-radius: 4px;\n  background-color: rgba(255, 255, 255, 0.7);\n  color: #333;\n  font-size: 18px;\n  border: none;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  cursor: pointer;\n  transition: background-color 0.2s ease;\n  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n.apexstock-zoom-in:hover,\n.apexstock-zoom-out:hover {\n  background-color: rgba(255, 255, 255, 1);\n}\n\n.apexstock-theme-dark .apexstock-zoom-in,\n.apexstock-theme-dark .apexstock-zoom-out {\n  background-color: rgba(70, 70, 70, 0.7);\n  color: #f1f1f1;\n}\n\n.apexstock-theme-dark .apexstock-zoom-in:hover,\n.apexstock-theme-dark .apexstock-zoom-out:hover {\n  background-color: rgba(70, 70, 70, 1);\n}\n\n/* ==============================\n * Settings Control Component Styles\n * ============================== */\n\n/* Base settings control styles */\n.apexstock-settings-control {\n  position: absolute;\n  border: 1px dashed var(--light-border);\n  padding: 10px;\n  z-index: 900;\n  min-width: 200px;\n  font-size: 12px;\n  display: none;\n}\n\n/* Positioning variations */\n.apexstock-settings-control.position-top-left {\n  top: 10px;\n  left: 10px;\n}\n\n/* Header styles */\n.apexstock-settings-header {\n  font-weight: bold;\n  margin-bottom: 8px;\n  padding-bottom: 8px;\n  border-bottom: 1px solid var(--light-divider);\n  color: var(--light-text);\n}\n\n/* Control group and form elements */\n.apexstock-settings-control-group label {\n  font-size: 11px;\n  color: #666;\n  font-weight: 500;\n}\n\n.apexstock-settings-control-group input[type="number"],\n.apexstock-settings-control-group input[type="text"],\n.apexstock-settings-control-group select {\n  padding: 4px 8px;\n  border: 1px solid var(--light-border);\n  border-radius: var(--border-radius-sm);\n  background: var(--light-bg);\n  color: var(--light-text);\n  font-size: 11px;\n  margin: 0 5px;\n}\n\n/* Range input container */\n.apexstock-settings-range-container {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n}\n\n.apexstock-settings-range-container input[type="range"] {\n  flex: 1;\n  height: 4px;\n  -webkit-appearance: none;\n  appearance: none;\n  background: var(--light-border);\n  border-radius: 2px;\n  outline: none;\n}\n\n/* Range input thumb styles */\n.apexstock-settings-range-container input[type="range"]::-webkit-slider-thumb {\n  -webkit-appearance: none;\n  appearance: none;\n  width: 14px;\n  height: 14px;\n  border-radius: 50%;\n  background: var(--blue);\n  cursor: pointer;\n  transition: background 0.2s;\n}\n\n.apexstock-settings-range-container input[type="range"]::-webkit-slider-thumb:hover {\n  background: #0056b3;\n}\n\n.apexstock-settings-range-container input[type="range"]::-moz-range-thumb {\n  width: 14px;\n  height: 14px;\n  border-radius: 50%;\n  background: var(--blue);\n  cursor: pointer;\n  border: none;\n  transition: background 0.2s;\n}\n\n.apexstock-settings-range-container input[type="range"]::-moz-range-thumb:hover {\n  background: #0056b3;\n}\n\n/* Range value display */\n.apexstock-settings-range-value {\n  min-width: 35px;\n  text-align: right;\n  font-weight: 500;\n  color: var(--blue);\n}\n\n/* Toggle switch styles */\n.apexstock-settings-toggle {\n  position: relative;\n  display: inline-block;\n  width: 34px;\n  height: 18px;\n}\n\n.apexstock-settings-toggle input {\n  opacity: 0;\n  width: 0;\n  height: 0;\n}\n\n.apexstock-settings-toggle-slider {\n  position: absolute;\n  cursor: pointer;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  background-color: #ccc;\n  transition: .2s;\n  border-radius: 18px;\n}\n\n.apexstock-settings-toggle-slider:before {\n  position: absolute;\n  content: "";\n  height: 14px;\n  width: 14px;\n  left: 2px;\n  bottom: 2px;\n  background-color: white;\n  transition: .2s;\n  border-radius: 50%;\n}\n\n.apexstock-settings-toggle input:checked+.apexstock-settings-toggle-slider {\n  background-color: var(--blue);\n}\n\n.apexstock-settings-toggle input:checked+.apexstock-settings-toggle-slider:before {\n  transform: translateX(16px);\n}\n\n/* ==============================\n * Dark Theme Support\n * ============================== */\n.apexstock-settings-control.apexstock-theme-dark {\n  border-color: var(--dark-border);\n}\n\n.apexstock-settings-control.apexstock-theme-dark .apexstock-settings-header {\n  color: var(--dark-text);\n  border-color: var(--dark-divider);\n}\n\n.apexstock-settings-control.apexstock-theme-dark label {\n  color: #adb5bd;\n}\n\n.apexstock-settings-control.apexstock-theme-dark input[type="number"],\n.apexstock-settings-control.apexstock-theme-dark input[type="text"],\n.apexstock-settings-control.apexstock-theme-dark select {\n  background: var(--dark-bg-alpha);\n  border-color: var(--dark-border);\n  color: var(--dark-text);\n}\n\n.apexstock-settings-control.apexstock-theme-dark .apexstock-settings-range-container input[type="range"] {\n  background: var(--dark-border);\n}\n\n.apexstock-settings-control.apexstock-theme-dark .apexstock-settings-range-value {\n  color: #64b5f6;\n}\n\n.apexstock-settings-control.apexstock-theme-dark .apexstock-settings-toggle-slider {\n  background-color: #6c757d;\n}\n\n.apexstock-settings-control.apexstock-theme-dark .apexstock-settings-toggle input:checked+.apexstock-settings-toggle-slider {\n  background-color: #64b5f6;\n}\n\n/* ==============================\n * Oscillator Settings Styles\n * ============================== */\n.apexstock-oscillator-settings-container {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 0;\n  /* Important: zero height to not affect layout */\n  pointer-events: none;\n  /* Let clicks pass through to charts by default */\n  z-index: 110;\n  /* Above charts but below tooltips */\n}\n\n/* Minimal settings style */\n.apexstock-settings-minimal {\n  border: none !important;\n  padding: 6px 8px !important;\n  transition: opacity 0.2s ease, transform 0.15s ease !important;\n  border-radius: 4px;\n  pointer-events: auto;\n  backdrop-filter: blur(2px);\n  -webkit-backdrop-filter: blur(2px);\n}\n\n/* Layout for controls inside minimal settings */\n.apexstock-settings-minimal .apexstock-settings-content {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: 8px;\n}\n\n.apexstock-settings-minimal .apexstock-settings-control-group {\n  display: inline-flex;\n  align-items: center;\n  margin: 0;\n  padding: 0;\n}\n\n.apexstock-settings-minimal label {\n  margin-right: 5px;\n  margin-bottom: 0;\n  font-size: 10px;\n  min-width: auto;\n  white-space: nowrap;\n}\n\n.apexstock-settings-minimal input[type="number"] {\n  width: 45px;\n  margin: 0;\n  padding: 1px 3px;\n  font-size: 10px;\n  height: 18px;\n  border-radius: 2px;\n}\n\n\n/* ==============================\n * 14. Responsive Adjustments\n * ============================== */\n@media (max-width: 768px) {\n  .apexstock-toolbar {\n    flex-direction: column;\n    align-items: flex-start;\n  }\n\n  .apexstock-toolbar-left {\n    margin-bottom: 10px;\n    width: 100%;\n  }\n\n  .apexstock-toolbar-right {\n    align-self: flex-end;\n  }\n}';!function(){if("undefined"!=typeof document){const t=document.createElement("style");t.textContent=p,document.head.appendChild(t)}}();class u{constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.ctx=t,this.chartEl=t.chartEl,this.options={filename:"apexstock-chart",quality:1,scale:1,...e},this.init()}init(){this.createExportButton(),this.addButtonEventListener()}createExportButton(){const t=document.createElement("div");t.className="apexstock-export-btn-container";const e=document.createElement("button");e.className="apexstock-export-btn",e.title="Download Chart as PNG",e.innerHTML='\n      <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">\n        <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path>\n        <polyline points="7 10 12 15 17 10"></polyline>\n        <line x1="12" y1="15" x2="12" y2="3"></line>\n      </svg>\n    ',t.appendChild(e),this.ctx.primaryToolbarRight.appendChild(t),this.exportButton=e,this.buttonContainer=t}addButtonEventListener(){this.exportButton.addEventListener("click",(t=>{t.preventDefault(),this.exportButton.disabled=!0,this.exportButton.innerHTML='\n        <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">\n          <path d="M12 2v4M12 18v4M4.93 4.93l2.83 2.83M16.24 16.24l2.83 2.83M2 12h4M18 12h4M4.93 19.07l2.83-2.83M16.24 7.76l2.83-2.83" stroke-dasharray="30" stroke-dashoffset="0">\n            <animateTransform attributeName="transform" type="rotate" from="0 12 12" to="360 12 12" dur="1s" repeatCount="indefinite"/>\n          </svg>\n      ',this.buttonContainer.style.display="none",setTimeout((()=>{this.getSvgString(this.options.scale).then((t=>this.svgToPng(t))).then((t=>{this.buttonContainer.style.display="block";const e=document.createElement("a");e.href=t,e.download=this.options.filename.replace(/\.png$/i,".svg"),document.body.appendChild(e),e.click(),document.body.removeChild(e),URL.revokeObjectURL(t),this.exportButton.disabled=!1,this.exportButton.innerHTML='\n              <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">\n                <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path>\n                <polyline points="7 10 12 15 17 10"></polyline>\n                <line x1="12" y1="15" x2="12" y2="3"></line>\n              </svg>\n            '})).catch((t=>{console.error("Error capturing chart:",t),this.buttonContainer.style.display="block",this.exportButton.disabled=!1,this.exportButton.innerHTML='\n              <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">\n                <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path>\n                <polyline points="7 10 12 15 17 10"></polyline>\n                <line x1="12" y1="15" x2="12" y2="3"></line>\n              </svg>\n            ',this.showNotification("Failed to capture chart. Please try again.","error")}))}),100)}))}getSvgString(t){return new Promise((e=>{const n=this.chartEl.getBoundingClientRect(),i=n.width,o=n.height,s=t||this.options.scale||1,r=i*s,a=o*s,l=this.chartEl.cloneNode(!0);l.style.width=r+"px",l.style.height=a+"px";const c=(new XMLSerializer).serializeToString(l);let h=`\n        <svg xmlns="http://www.w3.org/2000/svg" \n          version="1.1" \n          xmlns:xlink="http://www.w3.org/1999/xlink" \n          class="apexstock-svg" \n          xmlns:data="ApexStockNS" \n          transform="translate(0, 0)" \n          width="${i}px" height="${o+this.ctx.xAxisHeight}px">\n          <foreignObject width="100%" height="100%">\n            <div xmlns="http://www.w3.org/1999/xhtml" style="width:${r}px; height:${a}px;">\n              <style type="text/css">\n                ${`\n        .apexcharts-tooltip, .apexcharts-toolbar, .apexcharts-xaxistooltip, .apexcharts-yaxistooltip, .apexcharts-xcrosshairs, .apexcharts-ycrosshairs, .apexcharts-zoom-rect, .apexcharts-selection-rect, .apexstock-text-toolbar, .apexstock-zoom-controls, .apexstock-settings-control {\n          display: none !important;\n        }\n        .apexcharts-custom-tooltip, .apexcharts-tooltip-box {\n          padding: 4px 8px;\n        }\n        .apexcharts-tooltip-box>div {\n          margin: 4px 0;\n        }\n        .apexcharts-tooltip-box span.value {\n          font-weight: 700;\n        }\n        .apexstock-drawing-overlay-wrapper {\n            position: absolute;\n            top: 0;\n        }\n        .apexstock-drawing-overlay {\n          overflow: auto;\n          width: 100%;\n          height: 100%;\n        }\n        [class^=apexstock-] * {\n          font-family: ${this.ctx.chartOptions.chart.fontFamily||"Helvetica, Arial, sans-serif"}\n        }\n      `}\n              </style>\n              ${c}\n            </div>\n          </foreignObject>\n        </svg>\n      `;const d=this.svgStringToNode(h);1!==s&&this.scaleSvgNode(d,s),this.convertImagesToBase64(d).then((()=>{h=(new XMLSerializer).serializeToString(d),e(h.replace(/&nbsp;/g,"&#160;"))}))}))}svgStringToNode(t){return(new DOMParser).parseFromString(t,"image/svg+xml").documentElement}scaleSvgNode(t,e){const n=parseFloat(t.getAttribute("width")),i=parseFloat(t.getAttribute("height"));t.setAttribute("width",n*e+"px"),t.setAttribute("height",i*e+"px");const o=t.getAttribute("viewBox");if(o){const n=o.split(" ").map(parseFloat);t.setAttribute("viewBox",[n[0],n[1],n[2]*e,n[3]*e].join(" "))}}convertImagesToBase64(t){const e=t.getElementsByTagName("image"),n=Array.from(e).map((t=>{const e=t.getAttributeNS("http://www.w3.org/1999/xlink","href");return e&&!e.startsWith("data:")?this.getBase64FromUrl(e).then((e=>{t.setAttributeNS("http://www.w3.org/1999/xlink","href",e)})).catch((t=>{console.error("Error converting image to base64:",t)})):Promise.resolve()}));return Promise.all(n)}getBase64FromUrl(t){return new Promise(((e,n)=>{const i=new Image;i.crossOrigin="Anonymous",i.onload=()=>{const t=document.createElement("canvas");t.width=i.width,t.height=i.height;t.getContext("2d").drawImage(i,0,0),e(t.toDataURL())},i.onerror=n,i.src=t}))}svgToPng(t,e){return new Promise(((e,n)=>{try{const n=new Blob([t],{type:"image/svg+xml;charset=utf-8"}),i=URL.createObjectURL(n);this.options.filename.replace(/\.png$/i,".svg");e(i)}catch(t){n(t)}}))}showNotification(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"info";const n=document.createElement("div");n.className="apex-notification apex-notification-"+e,n.textContent=t,n.style.cssText=`\n      position: fixed;\n      bottom: 20px;\n      right: 20px;\n      padding: 10px 15px;\n      background-color: ${"error"===e?"#f44336":"#4CAF50"};\n      color: white;\n      border-radius: 3px;\n      box-shadow: 0 2px 5px rgba(0,0,0,0.2);\n      z-index: 1000;\n      opacity: 0;\n      transition: opacity 0.3s;\n    `,document.body.appendChild(n),setTimeout((()=>{n.style.opacity="1"}),10),setTimeout((()=>{n.style.opacity="0",setTimeout((()=>{document.body.removeChild(n)}),300)}),3e3)}}class m{constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.container=t,this.options={controls:e.controls||[],onChange:e.onChange||(()=>{}),position:e.position||"top-left",theme:e.theme||"light"},this.element=null,this.isVisible=!1,this.controlElements={},this.focusedInputId=null,this.create()}create(){this.element=document.createElement("div"),this.element.className="apexstock-settings-control",this.element.classList.add("position-"+this.options.position),"dark"===this.options.theme&&this.element.classList.add("apexstock-theme-dark"),this.element.classList.add("apexstock-settings-minimal");const t=document.createElement("div");t.className="apexstock-settings-content",this.options.controls.forEach((e=>{const n=this.createControl(e);t.appendChild(n)})),this.element.appendChild(t),this.container.appendChild(this.element),this.hide()}createControl(t){const e=document.createElement("div");e.className="apexstock-settings-control-group";const n=document.createElement("label");let i;switch(n.textContent=t.label,n.htmlFor=t.id,e.appendChild(n),t.type){case"range":i=this.createRangeControl(t);break;case"select":i=this.createSelectControl(t);break;case"number":i=this.createNumberControl(t);break;case"color":i=this.createColorControl(t);break;case"toggle":i=this.createToggleControl(t);break;default:i=this.createTextControl(t)}return e.appendChild(i),this.controlElements[t.id]=i,e}createRangeControl(t){const e=document.createElement("div");e.className="apexstock-settings-range-container";const n=document.createElement("input");n.type="range",n.id=t.id,n.min=t.min||0,n.max=t.max||100,n.step=t.step||1,n.value=t.value||t.defaultValue||0;const i=document.createElement("span");return i.className="apexstock-settings-range-value",i.textContent=n.value,n.addEventListener("input",(e=>{i.textContent=e.target.value,this.onChange(t.id,parseFloat(e.target.value))})),e.appendChild(n),e.appendChild(i),e}createSelectControl(t){const e=document.createElement("select");return e.id=t.id,t.options.forEach((t=>{const n=document.createElement("option");n.value=t.value,n.textContent=t.label,t.selected&&(n.selected=!0),e.appendChild(n)})),e.addEventListener("change",(e=>{this.onChange(t.id,e.target.value)})),e}createNumberControl(t){const e=document.createElement("input");return e.type="number",e.id=t.id,e.min=t.min,e.max=t.max,e.step=t.step||.01,e.value=t.value||t.defaultValue||0,e.addEventListener("change",(e=>{this.onChange(t.id,parseFloat(e.target.value))})),e.addEventListener("focus",(()=>{this.focusedInputId=t.id})),e.addEventListener("blur",(()=>{this.focusedInputId===t.id&&setTimeout((()=>{document.activeElement!==e&&(this.focusedInputId=null)}),100)})),e}createColorControl(t){const e=document.createElement("input");return e.type="color",e.id=t.id,e.value=t.value||t.defaultValue||"#000000",e.addEventListener("change",(e=>{this.onChange(t.id,e.target.value)})),e}createToggleControl(t){const e=document.createElement("label");e.className="apexstock-settings-toggle";const n=document.createElement("input");n.type="checkbox",n.id=t.id,n.checked=t.value||t.defaultValue||!1;const i=document.createElement("span");return i.className="apexstock-settings-toggle-slider",n.addEventListener("change",(e=>{this.onChange(t.id,e.target.checked)})),e.appendChild(n),e.appendChild(i),e}createTextControl(t){const e=document.createElement("input");return e.type="text",e.id=t.id,e.value=t.value||t.defaultValue||"",e.addEventListener("change",(e=>{this.onChange(t.id,e.target.value)})),e}onChange(t,e){this.options.onChange(t,e)}restoreFocus(){if(this.focusedInputId&&this.controlElements[this.focusedInputId]){const t=this.controlElements[this.focusedInputId];"DIV"===t.tagName&&t.querySelector("input")?t.querySelector("input").focus():t.focus(),"number"===t.type&&t.select()}}show(){this.isVisible=!0,this.element.style.display="block"}hide(){this.isVisible=!1,this.element.style.display="none"}updateControl(t,e){const n=this.controlElements[t];n&&("checkbox"===n.type?n.checked=e:n.value=e,n.nextElementSibling?.classList.contains("apexstock-settings-range-value")&&(n.nextElementSibling.textContent=e))}getValue(t){const e=this.controlElements[t];return e?"checkbox"===e.type?e.checked:"number"===e.type||"range"===e.type?parseFloat(e.value):e.value:null}updateTheme(t){this.options.theme=t,"dark"===t?this.element.classList.add("apexstock-theme-dark"):this.element.classList.remove("apexstock-theme-dark")}destroy(){this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class g{constructor(t){this.ctx=t,this.chart=t.chart,this.chartEl=t.chartEl,this.series=t.series,this.chartTypes=[{id:"candlestick",name:"Candlestick",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">\n          <line x1="6" y1="5" x2="6" y2="19" />\n          <rect x="4" y="7" width="4" height="6" fill="currentColor" />\n          <line x1="12" y1="5" x2="12" y2="19" />\n          <rect x="10" y="12" width="4" height="4" fill="currentColor" />\n          <line x1="18" y1="5" x2="18" y2="19" />\n          <rect x="16" y="9" width="4" height="5" fill="currentColor" />\n        </svg>'},{id:"heikinashi",name:"Heikin-Ashi",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">\n          <line x1="5" y1="6" x2="5" y2="13" />\n          <rect x="10" y="7" width="4" height="5" fill="currentColor" />\n          <line x1="12" y1="8" x2="12" y2="15" />\n          <rect x="3" y="9" width="4" height="5" fill="currentColor" />\n          <line x1="19" y1="10" x2="19" y2="17" />\n          <rect x="17" y="11" width="4" height="5" fill="currentColor" />\n        </svg>'},{id:"renko",name:"Renko",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">\n          <rect x="3" y="5" width="4" height="4" fill="currentColor" />\n          <rect x="7" y="8" width="4" height="4" fill="currentColor" />\n          <rect x="11" y="11" width="4" height="4" fill="currentColor" />\n          <rect x="15" y="14" width="4" height="4" fill="currentColor" />\n        </svg>'},{id:"ohlc",name:"OHLC",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">\n          <line x1="6" y1="5" x2="6" y2="19" />\n          <line x1="4" y1="7" x2="6" y2="7" />\n          <line x1="6" y1="13" x2="8" y2="13" />\n          <line x1="12" y1="5" x2="12" y2="19" />\n          <line x1="10" y1="10" x2="12" y2="10" />\n          <line x1="12" y1="16" x2="14" y2="16" />\n          <line x1="18" y1="5" x2="18" y2="19" />\n          <line x1="16" y1="8" x2="18" y2="8" />\n          <line x1="18" y1="14" x2="20" y2="14" />\n        </svg>'},{id:"stepline",name:"Step Line",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">\n          <path d="M3 13h4v-4h4v-4h4v8h6" />\n        </svg>'},{id:"line",name:"Line",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">\n          <path d="M3 17l6-6 4 4 8-8"/>\n        </svg>'},{id:"area",name:"Area",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">\n          <path d="M3 17l6-6 4 4 8-8v10H3z" fill="currentColor" fill-opacity="0.2"/>\n          <path d="M3 17l6-6 4 4 8-8"/>\n        </svg>'},{id:"bar",name:"Column",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">\n          <rect x="4" y="8" width="4" height="8" fill="currentColor" stroke="none"/>\n          <rect x="10" y="7" width="4" height="9" fill="currentColor" stroke="none"/>\n          <rect x="16" y="11" width="4" height="5" fill="currentColor" stroke="none"/>\n        </svg>'}],this.currentType="candlestick",this.originalSeries=[...this.series],this.renkoBrickSize=.3,this.renkoSettingsControl=null,this.init()}initializeRenkoSettings(){this.renkoSettingsControl||(this.renkoSettingsControl=new m(this.ctx.chartEl,{position:"top-left",theme:this.ctx.theme,controls:[{id:"brick-size",type:"number",label:"Brick Size (%)",value:this.renkoBrickSize,defaultValue:.3,min:.01,max:10,step:.01,helpText:"Size of each brick as percentage of price"}],onChange:(t,e)=>{if("brick-size"===t&&(this.renkoBrickSize=e,"renko"===this.currentType)){const t=this.currentType;this.currentType=null,this.changeChartType(t)}}}))}_convertToHeikinAshi(t){if(!t||0===t.length)return[];const e=[];let n=null;for(let i=0;t.length>i;i++){const o=t[i],s=o.x,[r,a,l,c]=o.y;let h,d,p,u;null===n?(h=(r+c)/2,d=(r+a+l+c)/4,p=Math.max(a,h,d),u=Math.min(l,h,d)):(h=(n.open+n.close)/2,d=(r+a+l+c)/4,p=Math.max(a,h,d),u=Math.min(l,h,d));const m={x:s,y:[h,p,u,d],open:h,close:d};e.push(m),n=m}return e}_convertToRenko(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;if(!t||0===t.length)return[];const n=Array(t.length).fill(null),i=t[0].y[3],o=e/100*i;let s=i,r=i,a=0;n[0]={x:t[0].x,y:[s,s,r,r],open:s,close:r};const l=new Set([t[0].x]);for(let e=1;t.length>e;e++){const i=t[e],c=i.x,h=i.y[3]-r;if(Math.abs(h)>=o){const i=Math.floor(Math.abs(h)/o),c=h>0?1:-1;let d=e;if(0===a||c===a)for(let e=0;i>e;e++){for(s=r,r=s+c*o;t.length>d&&l.has(t[d].x);)d++;t.length>d&&(n[d]={x:t[d].x,y:[s,Math.max(s,r),Math.min(s,r),r],open:s,close:r},l.add(t[d].x))}else if(i>=2){for(s=r,r=s+c*o;t.length>d&&l.has(t[d].x);)d++;t.length>d&&(n[d]={x:t[d].x,y:[s,Math.max(s,r),Math.min(s,r),r],open:s,close:r},l.add(t[d].x));for(let e=1;i>e;e++){for(s=r,r=s+c*o,d++;t.length>d&&l.has(t[d].x);)d++;t.length>d&&(n[d]={x:t[d].x,y:[s,Math.max(s,r),Math.min(s,r),r],open:s,close:r},l.add(t[d].x))}}a=c}l.has(c)||(n[e]={x:c,y:null,open:null,close:null},l.add(c))}for(let e=0;n.length>e;e++)null===n[e]&&(n[e]={x:t[e].x,y:null,open:null,close:null});return n}_getBoxTooltip(t,e,n,i,o){const s=t.globals.seriesCandleO[e][n],r=t.globals.seriesCandleH[e][n],a=t.globals.seriesCandleM?t.globals.seriesCandleM[e][n]:null,l=t.globals.seriesCandleL[e][n],c=t.globals.seriesCandleC[e][n];return null==s||null===r||null===l||null===c?"":t.config.series[e].type&&t.config.series[e].type!==o?`<div class="apexcharts-custom-tooltip">\n        ${t.config.series[e].name?t.config.series[e].name:"series-"+(e+1)}: <strong>${t.globals.series[e][n]}</strong>\n      </div>`:`<div class="apexcharts-tooltip-box apexcharts-tooltip-${t.config.chart.type}"><div>${i[0]}: <span class="value">`+s.toFixed(2)+"</span></div>"+`<div>${i[1]}: <span class="value">`+r.toFixed(2)+"</span></div>"+(a?`<div>${i[2]}: <span class="value">`+a.toFixed(2)+"</span></div>":"")+`<div>${i[3]}: <span class="value">`+l.toFixed(2)+"</span></div>"+`<div>${i[4]}: <span class="value">`+c.toFixed(2)+"</span></div></div>"}init(){const t=document.createElement("div");t.classList.add("apexstock-chart-type-wrapper");const e=document.createElement("button");e.classList.add("apexstock-chart-type-trigger"),e.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" width="30" height="30" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="20" x2="18" y2="10"></line><line x1="12" y1="20" x2="12" y2="4"></line><line x1="6" y1="20" x2="6" y2="14"></line></svg>',e.title="Change Chart Type",t.appendChild(e);const n=document.createElement("div");n.classList.add("apexstock-chart-type-dropdown"),this.chartTypes.forEach((t=>{const e=document.createElement("div");e.classList.add("apexstock-chart-type-option"),e.dataset.type=t.id,e.innerHTML=`<span class="chart-icon">${t.icon}</span><span class="chart-text">${t.name}</span>`,t.id===this.currentType&&e.classList.add("active"),e.addEventListener("click",(()=>{this.changeChartType(t.id),n.style.display="none",document.querySelectorAll(".apexstock-chart-type-option").forEach((t=>{t.classList.remove("active")})),e.classList.add("active")})),n.appendChild(e)})),t.appendChild(n),e.addEventListener("click",(()=>{n.style.display="block"===n.style.display?"none":"block"})),document.addEventListener("click",(e=>{t.contains(e.target)||(n.style.display="none")}));const i=this.ctx.primaryToolbarLeft;i&&i.insertBefore(t,i.firstChild)}updateTheme(t){this.renkoSettingsControl&&this.renkoSettingsControl.updateTheme(t)}changeChartType(t){if(t===this.currentType)return;this.originalSeries=[...this.ctx.series];const e=this.ctx.getCurrentZoomState();this.currentType=t,"renko"===t?(this.initializeRenkoSettings(),this.renkoSettingsControl.show()):this.renkoSettingsControl&&this.renkoSettingsControl.hide();let n=[];if("candlestick"===t||"ohlc"===t)n=[{name:"Price",type:"candlestick",data:this.originalSeries}];else if("heikinashi"===t){n=[{name:"Heikin-Ashi",type:"candlestick",data:this._convertToHeikinAshi(this.originalSeries)}]}else if("renko"===t){n=[{name:"Renko",type:"candlestick",data:this._convertToRenko(this.originalSeries,this.renkoBrickSize)}]}else"line"===t||"stepline"===t?n=[{name:"Price",type:"line",data:this.originalSeries.map((t=>({x:t.x,y:t.y[3]})))}]:"area"===t?n=[{name:"Price",type:"area",data:this.originalSeries.map((t=>({x:t.x,y:t.y[3]})))}]:"bar"===t&&(n=[{name:"Price",type:"bar",data:this.originalSeries.map((t=>({x:t.x,y:t.y[3]})))}]);const i=this.chart.w.config.series.filter((t=>"Price"!==t.name&&"Heikin-Ashi"!==t.name&&"Renko"!==t.name&&void 0!==t.name));let o;o="heikinashi"===t?["HA-Open","HA-High","","HA-Low","HA-Close"]:"renko"===t?["Renko-Open","Renko-High","","Renko-Low","Renko-Close"]:["Open","High","","Low","Close"];const s={series:[...n,...i],chart:{type:["candlestick","heikinashi","renko","ohlc"].includes(t)?"candlestick":["line","stepline"].includes(t)?"line":t},tooltip:{custom:e=>{let{seriesIndex:n,dataPointIndex:i,w:s}=e;return"renko"!==t||s.globals.seriesCandleO[n][i]&&null!==s.globals.seriesCandleO[n][i]?"candlestick"===t||"heikinashi"===t||"renko"===t||"ohlc"===t?this._getBoxTooltip(s,n,i,o,"candlestick"):`<div class="apexcharts-custom-tooltip">\n          ${s.config.series[n].name?s.config.series[n].name:"series-"+(n+1)}: <strong>${s.globals.series[n][i]}</strong>\n          </div>`:""}},plotOptions:{candlestick:{type:t,colors:{upward:"#34D399",downward:"#F87171"}}},stroke:{curve:"stepline"===t?"stepline":"monotoneCubic"},fill:{opacity:"area"===t?.3:1}};"renko"===t&&(s.plotOptions.candlestick.renkoBrickSize=this.renkoBrickSize,s.plotOptions.candlestick.handleNulls=!0,s.tooltip.x={format:"dd MMM yyyy",formatter:function(t,e){return new Date(t).toLocaleString()}}),this.chart.updateOptions(s,!0,!1,!1).then((()=>{this.ctx.applyZoomToAllCharts(e)}))}destroy(){this.renkoSettingsControl&&(this.renkoSettingsControl.destroy(),this.renkoSettingsControl=null)}}class x{static updateIndicator(e,n){if(!e)return;if(e=e.toLowerCase(),n.indicatorChartMap[e])return void n.removeIndicator(e);const i={chart:{toolbar:{show:!1},parentHeightOffset:0,animations:{enabled:!1},group:n.groupID,background:"transparent",events:{zoomed:n.handleZoom.bind(n),scrolled:n.handleScroll.bind(n),beforeResetZoom:n.handleBeforeResetZoom.bind(n)},toolbar:{show:!1,autoSelected:"pan"},zoom:{enabled:!0,type:"x",autoScaleYaxis:!0,allowMouseWheelZoom:!0},theme:{mode:n.theme}},xaxis:{labels:{show:!1},axisTicks:{show:!1},tooltip:{enabled:!1}},yaxis:n.mainChartOptions.yaxis[0],stroke:{width:1},legend:{show:!1},dataLabels:{enabled:!1},grid:{...n.mainChartOptions.grid,borderColor:n.isDarkTheme?"#404040":"#e9ecef"},theme:n.mainChartOptions.theme,tooltip:{x:{show:!1},marker:{show:!1},theme:n.theme,cssClass:"",style:{fontSize:"11px"}}},o=n.oscillatorSettings?n.oscillatorSettings.getIndicatorParams(e):{};let s={};if("bollinger bands"===e){const t=o.period||20,i=o.stdDev||2,{upper:s,lower:r}=n.calculateBollingerBands(n.series,t,i);let a={name:"Bollinger Bands",type:"rangeArea",data:s.map(((t,e)=>({x:n.series[e].x,y:[r[e],t]}))),color:n.colors.indicators.bollingerBands};n.indicators["bollinger bands"]?.chartOptions&&(a=Object.assign({},a,n.indicators["bollinger bands"].chartOptions));const l=n.chart.w.config.series.filter((t=>"Bollinger Bands"!==t.name));return n.chart.updateSeries([...l,a]),void(n.indicatorChartMap[e]=!0)}if("moving average"===e){const t={name:"Moving Average",type:"line",data:n.calculateMovingAverage(n.series,o.period||10).map(((t,e)=>({x:n.series[e].x,y:t}))),color:n.colors.indicators.movingAverage},i=n.chart.w.config.series.filter((t=>"Moving Average"!==t.name));return n.chart.updateSeries([...i,t]),void(n.indicatorChartMap[e]=!0)}if("exponential moving average"===e){const t={name:"EMA",type:"line",data:n.calculateEMA(n.series,o.period||10).map(((t,e)=>({x:n.series[e].x,y:t}))),color:n.colors.indicators.ema},i=n.chart.w.config.series.filter((t=>"EMA"!==t.name));return n.chart.updateSeries([...i,t]),void(n.indicatorChartMap[e]=!0)}if("fibonacci retracements"===e){const i=n.getCurrentZoomState();let o=0,s=n.series.length-1;i&&void 0!==i.minX&&void 0!==i.maxX&&(o=Math.max(0,Math.floor(i.minX)),s=Math.min(n.series.length-1,Math.ceil(i.maxX)));const r=n.calculateFibonacciRetracementsForRange(n.series,o,s).map(((e,i)=>({id:"fib-anno-"+(""+n.FIBLEVELS[i]).replace(/\./g,""),y:e,borderColor:n.colors.indicators.fibonacci[i],strokeDashArray:0,label:{text:t.truncateNumber(100*n.FIBLEVELS[i])+"%",textAnchor:"start",position:"left",style:{background:n.colors.indicators.fibonacci[i],color:"#fff",fontSize:"10px"}}}))),a=n.chart.w.config.annotations||{},l=(a.yaxis||[]).filter((t=>!t.id||!t.id.startsWith("fib-anno-"))),c={...a,yaxis:[...l,...r]};return n.chart.updateOptions({annotations:c}),void(n.indicatorChartMap[e]={update:function(){const e=n.getCurrentZoomState();let i=0,o=n.series.length-1;e&&void 0!==e.minX&&void 0!==e.maxX&&(i=Math.max(0,Math.floor(e.minX)),o=Math.min(n.series.length-1,Math.ceil(e.maxX)));const s=n.calculateFibonacciRetracementsForRange(n.series,i,o);n.FIBLEVELS.forEach((t=>{n.chart.removeAnnotation("fib-anno-"+(""+t).replace(/\./g,""))})),s.forEach(((e,i)=>{n.chart.addYaxisAnnotation({id:"fib-anno-"+(""+n.FIBLEVELS[i]).replace(/\./g,""),y:e,borderColor:n.colors.indicators.fibonacci[i],strokeDashArray:0,label:{text:t.truncateNumber(100*n.FIBLEVELS[i])+"%",textAnchor:"start",position:"left",style:{background:n.colors.indicators.fibonacci[i],color:"#fff",fontSize:"10px"}}})}))}})}if("linear regression"===e){const t={name:"Linear Regression",type:"line",data:n.calculateLinearRegression(n.series,o.period||14),color:n.colors.indicators.linearRegression},i=n.chart.w.config.series.filter((t=>"Linear Regression"!==t.name));return n.chart.updateSeries([...i,t]),void(n.indicatorChartMap[e]=!0)}if("ichimoku cloud indicator"===e){const t=n.calculateIchimoku(n.series),i={name:"Tenkan-sen",type:"line",data:t.tenkan.map(((t,e)=>({x:n.series[e].x,y:t.y}))),color:n.colors.indicators.tenkanSen},o={name:"Kijun-sen",type:"line",data:t.kijun.map(((t,e)=>({x:n.series[e].x,y:t}))),color:n.colors.indicators.kijunSen},s=n.chart.w.config.series.filter((t=>"Tenkan-sen"!==t.name&&"Kijun-sen"!==t.name));return n.chart.updateSeries([...s,i,o]),void(n.indicatorChartMap[e]=!0)}if("volumes"===e){if(!n.volumesData||0===n.volumesData.length)return void console.warn("No volumes data available.");const t=[{name:"Volumes",data:n.volumesData,color:n.colors.indicators.volume}];s={...i,chart:{...i.chart,type:"area",id:"volume"+n.groupID},series:t,stroke:{...i.stroke,curve:"linestep",colors:[n.colors.indicators.volume]},fill:{type:"solid",opacity:.2}},n.indicators.volumes?.chartOptions&&(s=Object.assign({},s,n.indicators.volumes.chartOptions),s.series||(s.series=t))}else if("rsi"===e){const t=[{name:"RSI",data:n.calculateRSI(n.series,o.period||14).map(((t,e)=>({x:n.series[e].x,y:t}))),color:n.colors.indicators.rsi}];s={...i,chart:{...i.chart,type:"line",id:"rsi"+n.groupID},series:t,yaxis:{...i.yaxis,min:0,max:100},stroke:{...i.stroke,colors:[n.colors.indicators.rsi]}},n.indicators.rsi?.chartOptions&&(s=Object.assign({},s,n.indicators.rsi.chartOptions),s.series||(s.series=t))}else if("macd"===e){const t=o.fastPeriod||12,e=o.slowPeriod||26,r=o.signalPeriod||9,{macd:a,signal:l,histogram:c}=n.calculateMACD(n.series,t,e,r),h=[{name:"MACD",type:"line",data:a.map(((t,e)=>({x:n.series[e].x,y:n.Utils.truncateNumber(t)}))),color:n.colors.indicators.macd},{name:"Signal",type:"line",data:l.map(((t,e)=>({x:n.series[e].x,y:n.Utils.truncateNumber(t)}))),color:n.colors.indicators.signal},{name:"Histogram",type:"bar",data:c.map(((t,e)=>({x:n.series[e].x,y:n.Utils.truncateNumber(t)})))}];s={...i,chart:{...i.chart,type:"line",id:"macd"+n.groupID},series:h,stroke:{...i.stroke,width:[1,1,0],colors:[n.colors.indicators.macd,n.colors.indicators.signal]},plotOptions:{bar:{colors:{ranges:[{from:.1,to:100,color:n.colors.indicators.histogramPositive},{from:-100,to:0,color:n.colors.indicators.histogramNegative}]}}}},n.indicators.macd?.chartOptions&&(s=Object.assign({},s,n.indicators.macd.chartOptions),s.series||(s.series=h))}else if("price volume trend"===e){const t=[{name:"PVT",data:n.calculatePVT(n.series),color:n.colors.indicators.pvt}];s={...i,chart:{...i.chart,type:"line",id:"pvt"+n.groupID},series:t,stroke:{...i.stroke,colors:[n.colors.indicators.pvt]}}}else if("stochastic oscillator"===e){const t=o.period||14,e=o.smoothPeriod||3,{k:r,d:a}=n.calculateStochastic(n.series,t,e),l=[{name:"Stochastic %K",data:r,color:n.colors.indicators.stochasticK},{name:"Stochastic %D",data:a,color:n.colors.indicators.stochasticD}];s={...i,chart:{...i.chart,type:"line",id:"stochastic"+n.groupID},series:l,stroke:{...i.stroke,colors:[n.colors.indicators.stochasticK,n.colors.indicators.stochasticD]}}}else if("standard deviation indicator"===e){const t=[{name:"Std Dev",data:n.calculateStdDevIndicator(n.series,o.period||14),color:n.colors.indicators.stdDev}];s={...i,chart:{...i.chart,type:"line",id:"stddev"+n.groupID},series:t,stroke:{...i.stroke,colors:[n.colors.indicators.stdDev]}}}else if("average directional index"===e){const t=[{name:"ADX",data:n.calculateADX(n.series,o.period||14),color:n.colors.indicators.adx}];s={...i,chart:{...i.chart,type:"line",id:"adx"+n.groupID},series:t,stroke:{...i.stroke,colors:[n.colors.indicators.adx]}}}else if("chaikin oscillator"===e){const t=[{name:"Chaikin Osc",data:n.calculateChaikinOsc(n.series,o.shortPeriod||3,o.longPeriod||10),color:n.colors.indicators.chaikin}];s={...i,chart:{...i.chart,type:"line",id:"chaikin"+n.groupID},series:t,stroke:{...i.stroke,colors:[n.colors.indicators.chaikin]}}}else if("commodity channel index"===e){const t=[{name:"CCI",data:n.calculateCCI(n.series,o.period||20),color:n.colors.indicators.cci}];s={...i,chart:{...i.chart,type:"line",id:"cci"+n.groupID},series:t,stroke:{...i.stroke,colors:[n.colors.indicators.cci]}}}else if("trend strength index"===e){const t=[{name:"TSI",data:n.calculateTSI(n.series,o.longPeriod||25,o.shortPeriod||13,o.signalPeriod||7).tsi,color:n.colors.indicators.tsi}];s={...i,chart:{...i.chart,type:"line",id:"tsi"+n.groupID},series:t,stroke:{...i.stroke,colors:[n.colors.indicators.tsi]}}}else if("accelerator oscillator"===e){const t=[{name:"AC",data:n.calculateAcceleratorOsc(n.series,o.period||5),color:n.colors.indicators.ac}];s={...i,chart:{...i.chart,type:"line",id:"ac"+n.groupID},series:t,stroke:{...i.stroke,colors:[n.colors.indicators.ac]}}}else if("bollinger bands %b"===e){const t=n.calculateBollingerBands(n.series,o.period||20,o.stdDev||2),e=[{name:"Bollinger %B",data:n.calculateBBPercent(n.series,t.lower,t.upper),color:n.colors.indicators.bPercent}];s={...i,chart:{...i.chart,type:"line",id:"bbb"+n.groupID},series:e,stroke:{...i.stroke,colors:[n.colors.indicators.bPercent]}}}else if("bollinger bands width"===e){const t=n.calculateBollingerBands(n.series,o.period||20,o.stdDev||2),e=[{name:"Bollinger Width",data:n.calculateBBWidth(n.series,t.middle,t.upper,t.lower),color:n.colors.indicators.bWidth}];s={...i,chart:{...i.chart,type:"line",id:"bbw"+n.groupID},series:e,stroke:{...i.stroke,colors:[n.colors.indicators.bWidth]}}}if(s&&(s.tooltip={...s.tooltip,theme:n.theme},n.isDarkTheme&&(s.grid={...s.grid,borderColor:"#404040",strokeDashArray:3})),!n.isOverlay(e)){const t=document.createElement("div");t.dataset.indicator=e,t.style.width="100%",n.indicatorContainer.appendChild(t),n.updateAllChartHeights(),s.chart||(s.chart={});const{indicatorHeight:i}=n.computeHeights(1);s.chart.height=i;const o=new ApexCharts(t,s);if(o.render(),n.indicatorChartMap[e]=o,n.oscillatorSettings){const t=n.oscillatorSettings.createSettingsControl(e,n.indicatorContainer);t&&t.show()}}n.xaxis&&n.xaxis.ensureXAxisIsLast()}static removeIndicator(t,e){if("bollinger bands"===(t=t.toLowerCase())){const n=e.chart.w.config.series.filter((t=>"Bollinger Bands"!==t.name));e.chart.updateSeries(n),delete e.indicatorChartMap[t]}else if("fibonacci retracements"===t)e.FIBLEVELS.forEach((t=>{e.chart.removeAnnotation("fib-anno-"+(""+t).replace(/\./g,""))})),delete e.indicatorChartMap[t];else if("moving average"===t){const n=e.chart.w.config.series.filter((t=>"Moving Average"!==t.name));e.chart.updateSeries(n),delete e.indicatorChartMap[t]}else if("exponential moving average"===t){const n=e.chart.w.config.series.filter((t=>"EMA"!==t.name));e.chart.updateSeries(n),delete e.indicatorChartMap[t]}else if("linear regression"===t){const n=e.chart.w.config.series.filter((t=>"Linear Regression"!==t.name));e.chart.updateSeries(n),delete e.indicatorChartMap[t]}else if("ichimoku cloud indicator"===t){const n=e.chart.w.config.series.filter((t=>"Tenkan-sen"!==t.name&&"Kijun-sen"!==t.name));e.chart.updateSeries(n),delete e.indicatorChartMap[t]}else{const n=e.indicatorChartMap[t];if(n&&"boolean"!=typeof n){n.destroy();Array.from(e.indicatorContainer.children).forEach((n=>{n.dataset.indicator===t&&e.indicatorContainer.removeChild(n)})),delete e.indicatorChartMap[t],e.activeOscillator===t&&(e.activeOscillator=null),e.oscillatorSettings&&e.oscillatorSettings.hideSettings(t),e.updateAllChartHeights()}}e.xaxis&&e.xaxis.ensureXAxisIsLast()}}class y{constructor(t){this.context=t,this.axisElement=null,this.ticksContainer=null,this.tooltipElement=null,this.resizeObserver=null,this.mouseTracker=null,this.isPanning=!1,this.createAxisElement(),this.render(),this.setupResizeListener(),this.setupMouseTracking()}setupResizeListener(){const t=(t,e)=>{let n;return function(){for(var i=arguments.length,o=Array(i),s=0;i>s;s++)o[s]=arguments[s];n&&clearTimeout(n),n=setTimeout((()=>{t.apply(this,o)}),e)}};window.addEventListener("resize",t((()=>{this.updatePosition()}),100)),"undefined"!=typeof ResizeObserver&&this.context.chartEl&&(this.resizeObserver=new ResizeObserver(t((()=>{this.updatePosition()}),100)),this.resizeObserver.observe(this.context.chartEl))}setupMouseTracking(){if(!this.context.chartEl)return;document.getElementById(this.context.mainChartId)&&(this.tooltipElement=document.createElement("div"),this.tooltipElement.classList.add("apexstock-xaxis-tooltip"),this.axisElement.appendChild(this.tooltipElement),this.handleMouseMove=this.handleMouseMove.bind(this),this.handleMouseLeave=this.handleMouseLeave.bind(this),this.handleMouseDown=this.handleMouseDown.bind(this),this.handleMouseUp=this.handleMouseUp.bind(this),this.updateEventListeners())}updateEventListeners(){this.removeAllEventListeners();const t=document.getElementById(this.context.mainChartId);t&&(t.addEventListener("mousemove",this.handleMouseMove),t.addEventListener("mousedown",this.handleMouseDown),t.addEventListener("mouseup",this.handleMouseUp),t.addEventListener("mouseleave",this.handleMouseLeave)),this.context.indicatorChartMap&&Object.keys(this.context.indicatorChartMap).length&&Object.keys(this.context.indicatorChartMap).forEach((t=>{const e=this.context.indicatorChartMap[t];if(e&&e.opts&&e.opts.chart&&e.opts.chart.id){const t=document.getElementById("apexcharts"+e.opts.chart.id);t&&(t.addEventListener("mousemove",this.handleMouseMove),t.addEventListener("mouseleave",this.handleMouseLeave),t.addEventListener("mousedown",this.handleMouseDown),t.addEventListener("mouseup",this.handleMouseUp))}}))}removeAllEventListeners(){const t=document.getElementById(this.context.mainChartId);t&&(t.removeEventListener("mousemove",this.handleMouseMove),t.removeEventListener("mouseleave",this.handleMouseLeave),t.removeEventListener("mousedown",this.handleMouseDown),t.removeEventListener("mouseup",this.handleMouseUp));document.querySelectorAll('[id^="apexcharts"]').forEach((t=>{t.id!==this.context.mainChartId&&(t.removeEventListener("mousemove",this.handleMouseMove),t.removeEventListener("mouseleave",this.handleMouseLeave),t.removeEventListener("mousedown",this.handleMouseDown),t.removeEventListener("mouseup",this.handleMouseUp))}))}handleMouseMove(t){if(!this.context.xaxisRange)return;const e=document.getElementById(this.context.mainChartId);if(!e)return;const n=e.querySelector(".apexcharts-xcrosshairs");if(!n)return void(this.tooltipElement.style.display="none");if("none"===window.getComputedStyle(n).display||this.isPanning)return void(this.tooltipElement.style.display="none");const i=parseFloat(n.getAttribute("x1")),o=e.querySelector(".apexcharts-inner.apexcharts-graphical");if(!o)return;const s=o.getBoundingClientRect();let r,a,l=this.findNearestDataPointIndex((t.clientX-s.left)/s.width);if(null===l)return void this.handleMouseLeave();if(r=this.getDataPointTimestamp(l),r){const t=new Date(r);a=isNaN(t.getTime())?"Invalid date":this.formatDate(t,"MMM DD, YYYY HH:mm")}else a="No data";this.tooltipElement.textContent=a,this.tooltipElement.style.display="block";const c=this.tooltipElement.offsetWidth/2,h=o.getBoundingClientRect().width-c;let d=i;c>d&&(d=c),d>h&&(d=h),this.tooltipElement.style.left=d+"px"}handleMouseDown(t){this.isPanning=!0}handleMouseUp(t){this.isPanning=!1}handleMouseLeave(){this.tooltipElement.style.display="none"}findNearestDataPointIndex(t){try{if(this.context.chart&&this.context.chart.w&&void 0!==this.context.chart.w.globals.capturedDataPointIndex){const t=this.context.chart.w.globals.capturedDataPointIndex;if(null!==t&&t>=0)return t}if(!this.context.series||!this.context.series.length)return null;const e=this.context.series[0];if(!e||!e.data||!e.data.length)return null;const n=e.data[0],i=e.data[e.data.length-1];if(!n||!i)return null;const o=n.x instanceof Date?n.x.getTime():n.x,s=i.x instanceof Date?i.x.getTime():i.x;if(isNaN(o)||isNaN(s))return null;const r=o+(s-o)*t;let a=0,l=Number.MAX_VALUE;for(let t=0;e.data.length>t;t++){const n=e.data[t];if(!n)continue;const i=n.x instanceof Date?n.x.getTime():n.x;if(isNaN(i))continue;const o=Math.abs(i-r);l>o&&(l=o,a=t)}return a}catch(t){return console.warn("Error finding nearest data point:",t),null}}getDataPointTimestamp(t){try{if(!this.context.series||!this.context.series.length)return this.context.xaxisRange.min;const e=this.context.series;if(!e[t])return this.context.xaxisRange.min;const n=e[t];if(!n)return this.context.xaxisRange.min;if(void 0!==n.x)return new Date(n.x).getTime()}catch(t){return console.warn("Error getting data point timestamp:",t),this.context.xaxisRange.min}}createAxisElement(){this.axisElement=document.createElement("div"),this.axisElement.classList.add("apexstock-xaxis"),this.axisElement.style.width="100%",this.axisElement.style.height="30px",this.axisElement.style.overflow="hidden",this.axisElement.style.borderTop="1px solid #eee",this.axisElement.style.boxSizing="border-box",this.axisElement.style.backgroundColor=this.context.colors.toolbar.background,this.axisElement.style.zIndex="999",this.ticksContainer=document.createElement("div"),this.ticksContainer.style.position="absolute",this.ticksContainer.style.height="100%",this.ticksContainer.style.width="100%",this.ticksContainer.style.overflow="hidden",this.ticksContainer.style.boxSizing="border-box",this.axisElement.appendChild(this.ticksContainer)}updatePosition(){if(!this.context.mainChartId)return;const t=document.getElementById(this.context.mainChartId);if(!t)return;const e=t.querySelector(".apexcharts-inner.apexcharts-graphical");if(!e)return void setTimeout((()=>this.updatePosition()),50);const n=e.getBoundingClientRect(),i=this.axisElement.getBoundingClientRect(),o=i.right-n.right;this.axisElement.style.paddingLeft=Math.max(0,n.left-i.left)+"px",this.axisElement.style.paddingRight=Math.max(0,o)+"px";const s=t.querySelector(".apexcharts-xaxis");if(s){const t=window.getComputedStyle(s).transform;this.ticksContainer.style.transform=t&&"none"!==t?t:""}}ensureXAxisIsLast(){this.context.chartEl&&this.axisElement&&this.axisElement.parentNode&&this.context.chartEl.lastChild!==this.axisElement&&(this.axisElement.parentNode.removeChild(this.axisElement),this.context.chartEl.appendChild(this.axisElement))}getTickInterval(){const t=this.context.xaxisRange,e=(t.max-t.min)/6e4,n=e/60,i=n/24;if(e>120){if(n>24){if(n>72)return i>28?i>90?i>365?i/30/12>3?{interval:31536e6,format:"YYYY",label:"year"}:{interval:7776e6,format:"MMM YYYY",label:"quarter"}:{interval:2592e6,format:"MMM YYYY",label:"month"}:{interval:6048e5,format:"MMM DD",label:"date"}:{interval:864e5,format:"MMM DD",label:"date"};return{interval:60*(n>48?6:4)*60*1e3,format:"MMM DD HH:mm",label:"datetime"}}{let t=1;return n>12&&(t=2),{interval:60*t*60*1e3,format:"HH:mm",label:"time"}}}{let t=1;return e>20&&(t=5),e>60&&(t=10),{interval:60*t*1e3,format:"HH:mm",label:"time"}}}formatDate(t,e){const n=t=>(t+"").padStart(2,"0"),i=t.getFullYear(),o=t.getMonth(),s=t.getDate(),r=t.getHours(),a=t.getMinutes();return e.replace("YYYY",i).replace("MMM",["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"][o]).replace("MM",n(o+1)).replace("DD",n(s)).replace("HH",n(r)).replace("mm",n(a))}calculateTicks(){const t=this.context.xaxisRange;if(!t||isNaN(t.min)||isNaN(t.max))return console.warn("Invalid range for calculating ticks:",t),[];let{interval:e,format:n}=this.getTickInterval();if(!e||0>=e)return console.warn("Invalid interval for calculating ticks:",e),[];let i=this.generateTicksWithInterval(t.min,t.max,e,n);if(5>i.length){if(e=Math.floor((t.max-t.min)/5),i=this.generateTicksWithInterval(t.min,t.max,e,n),5>i.length)return this.generateEvenlySpacedTicks(t.min,t.max,5,n)}if(i.length>10){const t=Math.ceil(i.length/8);return i.filter(((e,n)=>n%t==0))}return i}generateTicksWithInterval(t,e,n,i){const o=[];let s=Math.floor(t/n)*n;for(;e>=s;){if(s>=t){const r=(s-t)/(e-t)*100,a=new Date(s);if(isNaN(a.getTime())){s+=n;continue}o.push({position:r,label:this.formatDate(a,i),timestamp:s})}s+=n}return o}generateEvenlySpacedTicks(t,e,n,i){const o=[],s=e-t;o.push({position:0,label:this.formatDate(new Date(t),i),timestamp:t});for(let e=1;n-1>e;e++){const r=t+s*e/(n-1);o.push({position:e/(n-1)*100,label:this.formatDate(new Date(r),i),timestamp:r})}return o.push({position:100,label:this.formatDate(new Date(e),i),timestamp:e}),o}render(){if(!this.ticksContainer||!this.context.xaxisRange)return;if(isNaN(this.context.xaxisRange.min)||isNaN(this.context.xaxisRange.max))return void console.warn("Invalid xaxisRange values:",this.context.xaxisRange);this.updatePosition();const t=this.ticksContainer.offsetWidth;if(!t)return;this.ticksContainer.innerHTML="";const e=this.calculateTicks();if(!e.length)return;const n=new Set;let i=-60;if(e.forEach((e=>{if(0>e.position||e.position>100)return;const o=e.position/100*t;if(30>o||o>t-30)return;if(30>o-i)return;if(n.has(e.label))return;n.add(e.label),i=o;const s=document.createElement("div");s.style.position="absolute",s.style.transform="translateX(-50%)",s.style.textAlign="center",s.style.whiteSpace="nowrap",s.style.top="0",s.style.left=e.position+"%";const r=document.createElement("div");r.style.width="1px",r.style.height="6px",r.style.margin="0 auto 4px",r.style.backgroundColor="#888";const a=document.createElement("div");a.style.fontSize="11px",a.style.color=this.context.colors.toolbar.text,a.style.padding="0 4px",a.textContent=e.label,s.appendChild(r),s.appendChild(a),this.ticksContainer.appendChild(s)})),!this.ticksContainer.children.length&&e.length){const t=e[Math.floor(e.length/2)],n=document.createElement("div");n.style.position="absolute",n.style.transform="translateX(-50%)",n.style.textAlign="center",n.style.whiteSpace="nowrap",n.style.top="0",n.style.left="50%";const i=document.createElement("div");i.style.width="1px",i.style.height="6px",i.style.margin="0 auto 4px",i.style.backgroundColor="#888";const o=document.createElement("div");o.style.fontSize="11px",o.style.color="#666",o.style.padding="0 4px",o.textContent=t.label,n.appendChild(i),n.appendChild(o),this.ticksContainer.appendChild(n)}}updateHeight(){this.context.chartEl&&(this.axisElement.parentNode&&this.axisElement.parentNode.removeChild(this.axisElement),this.axisElement.style.position="relative",this.axisElement.style.marginTop="-15px",this.context.chartEl.appendChild(this.axisElement),this.axisElement.style.display="block",this.updatePosition(),this.render())}destroy(){this.resizeObserver&&this.context.chartEl&&(this.resizeObserver.unobserve(this.context.chartEl),this.resizeObserver=null),this.removeAllEventListeners(),this.axisElement&&this.axisElement.parentNode&&this.axisElement.parentNode.removeChild(this.axisElement),this.tooltipElement&&this.tooltipElement.parentNode&&this.tooltipElement.parentNode.removeChild(this.tooltipElement),this.axisElement=null,this.ticksContainer=null,this.tooltipElement=null}}class b{constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"light";this.ctx=t,this.themeStylesApplied=!1,this.initColorSchemes(),this.setTheme(e||"light")}setTheme(t){"light"!==t&&"dark"!==t&&(console.warn('Invalid theme. Using "light" theme as default.'),t="light"),this.theme=t,this.isDarkTheme="dark"===t}getTheme(){return this.theme}isDark(){return this.isDarkTheme}getColors(){return this.colorSchemes[this.theme]}initColorSchemes(){this.colorSchemes={light:{toolbar:{background:"#ffffff",text:"#333",border:"#e9ecef"},dropdown:{background:"#ffffff",hover:"#f1f3f5",text:"#333",border:"#ced4da",selectedBackground:"#e9ecef"},indicators:{movingAverage:"#7D57C2",ema:"#FF9900",bollingerBands:"rgba(0, 114, 255, 0.08)",fibonacci:["#7E7E7E","#B5515E","#CDA163","#8AAB8C","#4F9183","#A4D6D4","#7E7E7E"],linearRegression:"#0099FF",tenkanSen:"#FF6600",kijunSen:"#0066FF",volume:"#6c757d",rsi:"#7D57C2",macd:"#008FFB",signal:"#FF4560",histogramPositive:"#00E396",histogramNegative:"#FF4560",pvt:"#0099CC",stochasticK:"#33CC33",stochasticD:"#FF9933",stdDev:"#CC33FF",adx:"#9900CC",chaikin:"#CC3333",cci:"#FF6600",tsi:"#0066CC",ac:"#009900",bPercent:"#6600CC",bWidth:"#CC0066"}},dark:{toolbar:{background:"#343A3F",text:"#f8f9fa",border:"#343a40"},dropdown:{background:"#343a40",hover:"#495057",text:"#f8f9fa",border:"#495057",selectedBackground:"#495057"},indicators:{movingAverage:"#bb86fc",ema:"#ffb74d",bollingerBands:"rgba(255, 232, 242, 0.12)",fibonacci:["#7E7E7E","#B5515E","#CDA163","#8AAB8C","#4F9183","#A4D6D4","#7E7E7E"],linearRegression:"#64b5f6",tenkanSen:"#ff9e80",kijunSen:"#82b1ff",volume:"#b0bec5",rsi:"#bb86fc",macd:"#64b5f6",signal:"#f48fb1",histogramPositive:"#81c784",histogramNegative:"#e57373",pvt:"#4fc3f7",stochasticK:"#81c784",stochasticD:"#ffb74d",stdDev:"#ce93d8",adx:"#ba68c8",chaikin:"#ef5350",cci:"#ff9e80",tsi:"#64b5f6",ac:"#66bb6a",bPercent:"#9575cd",bWidth:"#ec407a"}}}}applyThemeStyles(t,e){if(!t)return;t.classList.remove("apexstock-theme-light","apexstock-theme-dark"),t.classList.add("apexstock-theme-"+this.theme);const n=this.getColors();e&&(e.style.backgroundColor=n.toolbar.background,e.style.color=n.toolbar.text,e.style.borderColor=n.toolbar.border),this.injectThemeStyles()}injectThemeStyles(){const t=this.getColors();let e=document.getElementById("apexstock-theme-styles");e||(e=document.createElement("style"),e.id="apexstock-theme-styles",document.head.appendChild(e));e.textContent=`\n      [class^=apexstock-] * {\n        font-family: ${this.ctx.chartOptions?.chart?.fontFamily||"Helvetica, Arial, sans-serif"}\n      }\n\n      .apexstock-theme-${this.theme} .apexstock-toolbar {\n        background-color: ${t.toolbar.background};\n        color: ${t.toolbar.text};\n        border-color: ${t.toolbar.border};\n      }\n      \n      .apexstock-theme-${this.theme} .apexstock-custom-select-trigger,\n      .apexstock-theme-${this.theme} .apexstock-custom-options {\n        background-color: ${t.dropdown.background};\n        color: ${t.dropdown.text};\n        border-color: ${t.dropdown.border};\n      }\n      \n      .apexstock-theme-${this.theme} .apexstock-custom-option {\n        color: ${t.dropdown.text};\n      }\n      \n      .apexstock-theme-${this.theme} .apexstock-custom-option:hover {\n        background-color: ${t.dropdown.hover};\n      }\n      \n      .apexstock-theme-${this.theme} .apexstock-custom-option.selected {\n        background-color: ${t.dropdown.selectedBackground};\n      }\n      \n      .apexstock-theme-${this.theme} .apexchart-tooltip {\n        background-color: ${this.isDarkTheme?"#212529":"#ffffff"};\n        color: ${this.isDarkTheme?"#f8f9fa":"#333"};\n        border-color: ${this.isDarkTheme?"#343a40":"#e9ecef"};\n      }\n      \n      .apexstock-theme-${this.theme} .apexstock-toolbar-button {\n        background-color: ${t.dropdown.background};\n        color: ${t.dropdown.text};\n        border-color: ${t.dropdown.border};\n      }\n      \n      .apexstock-theme-${this.theme} .apexstock-toolbar-button:hover {\n        background-color: ${t.dropdown.hover};\n      }\n    `,this.themeStylesApplied=!0}applyElementStyle(t,e){if(!t)return;const n=this.getColors();switch(e){case"dropdown":t.style.backgroundColor=n.dropdown.background,t.style.color=n.dropdown.text,t.style.borderColor=n.dropdown.border;break;case"option":t.style.color=n.dropdown.text;break;case"toolbar":t.style.backgroundColor=n.toolbar.background,t.style.color=n.toolbar.text,t.style.borderColor=n.toolbar.border;break;case"optionSelected":t.style.backgroundColor=n.dropdown.selectedBackground}}getChartConfig(){return{chart:{theme:{mode:this.theme}},tooltip:{theme:this.theme},grid:{borderColor:this.isDarkTheme?"#505D66":"#e9ecef",strokeDashArray:3},yaxis:{labels:{style:{colors:this.isDarkTheme?"#e0e0e0":"#333"}}},plotOptions:{candlestick:{colors:{upward:this.isDarkTheme?"#26A69A":"#00B746",downward:this.isDarkTheme?"#EF5350":"#EF403C"}}}}}}class v{constructor(t){this.context=t,this.chartEl=t.chartEl,this.chart=t.chart,this.controlsContainer=null,this.zoomInButton=null,this.zoomOutButton=null,this.init()}init(){this.createContainer(),this.createButtons(),this.addEventListeners()}createContainer(){this.controlsContainer=document.createElement("div"),this.controlsContainer.className="apexstock-zoom-controls",this.chartEl.appendChild(this.controlsContainer)}createButtons(){this.zoomInButton=document.createElement("button"),this.zoomInButton.className="apexstock-zoom-in",this.zoomInButton.innerHTML="+",this.zoomOutButton=document.createElement("button"),this.zoomOutButton.className="apexstock-zoom-out",this.zoomOutButton.innerHTML="−",this.controlsContainer.appendChild(this.zoomInButton),this.controlsContainer.appendChild(this.zoomOutButton)}addEventListeners(){this.zoomInButton.addEventListener("click",(()=>{this.zoomIn()})),this.zoomOutButton.addEventListener("click",(()=>{this.zoomOut()}))}zoomIn(){if(this.chart)try{const t=this.context.getCurrentZoomState();if(!t)return;const{minX:e,maxX:n}=t,i=n-e,o=(i-i*(1-.25))/2,s=Math.max(0,e+o),r=Math.min(this.chart.w.globals.dataPoints-1,n-o);this.chart.zoomX(s,r),this.context.applyZoomToAllCharts({minX:s,maxX:r})}catch(t){console.error("Error during zoom in:",t)}}zoomOut(){if(this.chart)try{const t=this.context.getCurrentZoomState();if(!t)return;const{minX:e,maxX:n}=t,i=n-e,o=(i*(1+.25)-i)/2,s=Math.max(0,e-o),r=Math.min(this.chart.w.globals.dataPoints-1,n+o);this.chart.zoomX(s,r),this.context.applyZoomToAllCharts({minX:s,maxX:r})}catch(t){console.error("Error during zoom out:",t)}}destroy(){this.controlsContainer&&this.controlsContainer.parentNode&&this.controlsContainer.parentNode.removeChild(this.controlsContainer),this.controlsContainer=null,this.zoomInButton=null,this.zoomOutButton=null}}class f{constructor(t){this.ctx=t,this.settingsControls={},this.defaultParams=this.getDefaultParams(),this.indicatorParams={},this.createSettingsContainer(),Object.keys(this.defaultParams).forEach((t=>{this.indicatorParams[t]={...this.defaultParams[t]}}))}createSettingsContainer(){this.settingsContainer=document.createElement("div"),this.settingsContainer.classList.add("apexstock-oscillator-settings-container"),this.settingsContainer.style.position="absolute",this.settingsContainer.style.top="0",this.settingsContainer.style.left="0",this.settingsContainer.style.width="100%",this.settingsContainer.style.pointerEvents="none",this.settingsContainer.style.zIndex="100",this.ctx.chartEl.appendChild(this.settingsContainer)}getDefaultParams(){return{rsi:{period:14},macd:{fastPeriod:12,slowPeriod:26,signalPeriod:9},volumes:{},"price volume trend":{},"stochastic oscillator":{period:14,smoothPeriod:3},"standard deviation indicator":{period:14},"average directional index":{period:14},"chaikin oscillator":{shortPeriod:3,longPeriod:10},"commodity channel index":{period:20},"trend strength index":{longPeriod:25,shortPeriod:13,signalPeriod:7},"accelerator oscillator":{period:5},"bollinger bands %b":{period:20,stdDev:2},"bollinger bands width":{period:20,stdDev:2}}}createSettingsControl(t,e){if(this.settingsControls[t])return this.settingsControls[t];const n=this.defaultParams[t]||{};if(0===Object.keys(n).length)return null;const i=Array.from(e.children).find((e=>e.dataset.indicator===t));if(!i)return null;const o=[];Object.keys(n).forEach((t=>{o.push({id:t,type:"number",label:this.formatParamLabel(t),value:n[t],defaultValue:n[t],min:1,max:t.includes("Period")||t.includes("period")?100:14,step:"stdDev"===t?.1:1})}));const s=new this.ctx.SettingsControl(this.settingsContainer,{controls:o,position:"top-left",theme:this.ctx.theme,onChange:(e,n)=>{this.indicatorParams[t]||(this.indicatorParams[t]={}),this.indicatorParams[t][e]=n,this.updateIndicator(t)}});return this.positionSettingsControl(s,i),this.applyMinimalStyling(s),this.settingsControls[t]={control:s,indicatorDiv:i},s}positionSettingsControl(t,e){if(!t||!t.element||!e)return;const n=e.getBoundingClientRect(),i=this.ctx.chartEl.getBoundingClientRect(),o=n.top-i.top+10,s=n.left-i.left+10;t.element.style.position="absolute",t.element.style.top=o+"px",t.element.style.left=s+"px",t.element.style.pointerEvents="auto"}updatePositions(){Object.keys(this.settingsControls).forEach((t=>{const{control:e,indicatorDiv:n}=this.settingsControls[t];e&&n&&this.positionSettingsControl(e,n)}))}formatParamLabel(t){return t.replace(/([A-Z])/g," $1").replace(/^./,(t=>t.toUpperCase()))}applyMinimalStyling(t){if(!t||!t.element)return;const e=t.element;e.style.opacity="0.8",e.style.transition="opacity 0.2s ease",e.style.padding="6px 8px",e.style.borderRadius="4px",e.style.width="auto",e.style.maxWidth="100%",e.style.fontSize="11px",e.style.backdropFilter="blur(2px)",e.addEventListener("mouseenter",(()=>{e.style.opacity="1"})),e.addEventListener("mouseleave",(()=>{e.style.opacity="0.8"}));e.querySelectorAll(".apexstock-settings-control-group").forEach((t=>{t.style.display="inline-flex",t.style.alignItems="center",t.style.marginRight="10px"}));e.querySelectorAll("label").forEach((t=>{t.style.marginRight="5px",t.style.marginBottom="0",t.style.minWidth="auto"}));e.querySelectorAll('input[type="number"]').forEach((t=>{t.style.width="50px",t.style.margin="0 0 0 5px",t.style.padding="2px 4px"}))}updateIndicator(t){const e=this.getIndicatorParams(t),n=this.ctx.indicatorChartMap[t];if(!n||"object"!=typeof n||"function"!=typeof n.updateOptions)return n&&"function"==typeof n.update?void n.update():(this.ctx.removeIndicator(t),void setTimeout((()=>{this.ctx.updateIndicator(t)}),50));let i=[];switch(t){case"rsi":i=[{name:"RSI",data:this.ctx.calculateRSI(this.ctx.series,e.period||14).map(((t,e)=>({x:this.ctx.series[e].x,y:t})))}];break;case"macd":const{macd:n,signal:o,histogram:s}=this.ctx.calculateMACD(this.ctx.series,e.fastPeriod||12,e.slowPeriod||26,e.signalPeriod||9);i=[{name:"MACD",type:"line",data:n.map(((t,e)=>({x:this.ctx.series[e].x,y:t})))},{name:"Signal",type:"line",data:o.map(((t,e)=>({x:this.ctx.series[e].x,y:t})))},{name:"Histogram",type:"bar",data:s.map(((t,e)=>({x:this.ctx.series[e].x,y:t})))}];break;case"stochastic oscillator":const{k:r,d:a}=this.ctx.calculateStochastic(this.ctx.series,e.period||14,e.smoothPeriod||3);i=[{name:"Stochastic %K",data:r},{name:"Stochastic %D",data:a}];break;case"standard deviation indicator":i=[{name:"Std Dev",data:this.ctx.calculateStdDevIndicator(this.ctx.series,e.period||14)}];break;case"average directional index":i=[{name:"ADX",data:this.ctx.calculateADX(this.ctx.series,e.period||14)}];break;case"commodity channel index":i=[{name:"CCI",data:this.ctx.calculateCCI(this.ctx.series,e.period||20)}];break;case"trend strength index":i=[{name:"TSI",data:this.ctx.calculateTSI(this.ctx.series,e.longPeriod||25,e.shortPeriod||13,e.signalPeriod||7).tsi}];break;case"accelerator oscillator":i=[{name:"AC",data:this.ctx.calculateAcceleratorOsc(this.ctx.series,e.period||5)}];break;case"bollinger bands %b":const l=this.ctx.calculateBollingerBands(this.ctx.series,e.period||20,e.stdDev||2);i=[{name:"Bollinger %B",data:this.ctx.calculateBBPercent(this.ctx.series,l.lower,l.upper)}];break;case"bollinger bands width":const c=this.ctx.calculateBollingerBands(this.ctx.series,e.period||20,e.stdDev||2);i=[{name:"Bollinger Width",data:this.ctx.calculateBBWidth(this.ctx.series,c.middle,c.upper,c.lower)}];break;case"chaikin oscillator":i=[{name:"Chaikin Osc",data:this.ctx.calculateChaikinOsc(this.ctx.series,e.shortPeriod||3,e.longPeriod||10)}];break;case"price volume trend":i=[{name:"PVT",data:this.ctx.calculatePVT(this.ctx.series)}];break;case"volumes":this.ctx.volumesData&&this.ctx.volumesData.length>0&&(i=[{name:"Volumes",data:this.ctx.volumesData}]);break;default:return this.ctx.removeIndicator(t),void setTimeout((()=>{this.ctx.updateIndicator(t)}),50)}i.length>0&&(i.forEach((e=>{if(!e.color&&this.ctx.colors&&this.ctx.colors.indicators){const n=t.replace(/\s+/g,"");this.ctx.colors.indicators[n]&&(e.color=this.ctx.colors.indicators[n])}})),n.updateSeries(i,!1),this.settingsControls[t]&&this.settingsControls[t].control&&"function"==typeof this.settingsControls[t].control.restoreFocus&&this.settingsControls[t].control.restoreFocus())}getIndicatorParams(t){return this.indicatorParams[t]||this.defaultParams[t]||{}}updateTheme(t){Object.keys(this.settingsControls).forEach((e=>{const{control:n}=this.settingsControls[e];n&&"function"==typeof n.updateTheme&&n.updateTheme(t)}))}showSettings(t){this.settingsControls[t]&&this.settingsControls[t].control&&this.settingsControls[t].control.show()}hideSettings(t){this.settingsControls[t]&&this.settingsControls[t].control&&this.settingsControls[t].control.hide()}hideAllSettings(){Object.keys(this.settingsControls).forEach((t=>{this.hideSettings(t)}))}removeSettingsElement(t){this.settingsControls[t]&&this.settingsControls[t].control&&(this.settingsControls[t].control.destroy(),delete this.settingsControls[t])}destroy(){Object.keys(this.settingsControls).forEach((t=>{this.settingsControls[t].control&&"function"==typeof this.settingsControls[t].control.destroy&&this.settingsControls[t].control.destroy()})),this.settingsControls={},this.settingsContainer&&this.settingsContainer.parentNode&&this.settingsContainer.parentNode.removeChild(this.settingsContainer)}}return class{constructor(e,n){this.chartEl=e,this.chartOptions=n,this.totalHeight=n.chart.height||350,this.Utils=t,this.xAxisHeight=30,n.chart.id=this.randomId(),this.groupID="group"+this.randomId(),this.mainChartId=n.chart.id,this.chartEl.innerHTML="",this.mainChartDiv=document.createElement("div"),this.mainChartDiv.id=this.mainChartId,this.mainChartDiv.classList.add("apexstock-main-chart");const i=this.totalHeight-this.xAxisHeight;this.mainChartDiv.style.height=i+"px",this.indicatorContainer=document.createElement("div"),this.indicatorContainer.classList.add("apexstock-indicator-container"),this.indicatorContainer.style.height="0px",this.chartEl.appendChild(this.mainChartDiv),this.chartEl.appendChild(this.indicatorContainer),this.primaryToolbar=document.createElement("div"),this.primaryToolbar.classList.add("apexstock-toolbar"),this.primaryToolbarLeft=document.createElement("div"),this.primaryToolbarLeft.classList.add("apexstock-toolbar-left"),this.primaryToolbarRight=document.createElement("div"),this.primaryToolbarRight.classList.add("apexstock-toolbar-right"),this.primaryToolbar.appendChild(this.primaryToolbarLeft),this.primaryToolbar.appendChild(this.primaryToolbarRight),this.indicatorChartMap={},this.FIBLEVELS=[0,.236,.382,.5,.618,1],this.activeOscillator=null;this.themeManager=new b(this,n.theme&&n.theme.mode||"light"),this.theme=this.themeManager.getTheme(),this.isDarkTheme="dark"===this.theme,this.colors=this.themeManager.getColors(),this.chartEl.parentNode.classList.add("apexstock-theme-"+this.theme),this.chartEl.parentNode.style.backgroundColor=this.colors.toolbar.background,this.chartEl.style.backgroundColor=this.colors.toolbar.background;const o=n.plotOptions&&n.plotOptions.stockChart||{};this.series=n.series[0].data||[],this.initializeXAxisRange(),this.SettingsControl=m,this.overlays={"moving average":{enabled:!0},"bollinger bands":{enabled:!0},"exponential moving average":{enabled:!0},"fibonacci retracements":{enabled:!0},"linear regression":{enabled:!0},"ichimoku cloud indicator":{enabled:!0}},this.oscillators={rsi:{enabled:!0},macd:{enabled:!0},volumes:{enabled:!0},"price volume trend":{enabled:!0},"stochastic oscillator":{enabled:!0},"standard deviation indicator":{enabled:!0},"average directional index":{enabled:!0},"chaikin oscillator":{enabled:!0},"commodity channel index":{enabled:!0},"trend strength index":{enabled:!0},"accelerator oscillator":{enabled:!0},"bollinger bands %b":{enabled:!0},"bollinger bands width":{enabled:!0}},this.indicators={...this.overlays,...this.oscillators},"object"!=typeof o.indicators||Array.isArray(o.indicators)?Array.isArray(o.indicators)&&(this.indicators={},o.indicators.forEach((t=>{this.indicators[t.toLowerCase()]={enabled:!0},this.overlays[t.toLowerCase()]?this.overlays[t.toLowerCase()]={enabled:!0}:this.oscillators[t.toLowerCase()]&&(this.oscillators[t.toLowerCase()]={enabled:!0})}))):(this.indicators=o.indicators,Object.keys(this.indicators).forEach((t=>{this.overlays[t]?this.overlays[t]=this.indicators[t]:this.oscillators[t]&&(this.oscillators[t]=this.indicators[t])}))),this.volumesData=this.series.map((t=>t.v?{x:t.x,y:t.v}:null)).filter((t=>null!==t));const s=t.extend(this.themeManager.getChartConfig(),n);this.mainChartOptions=t.extend({chart:{type:"candlestick",height:i,id:this.mainChartId,group:this.groupID,parentHeightOffset:0,background:"transparent",toolbar:{show:!1,autoSelected:"pan"},zoom:{enabled:!0,type:"x",autoScaleYaxis:!0,allowMouseWheelZoom:!0},animations:{enabled:!1},events:{zoomed:this.handleZoom.bind(this),scrolled:this.handleScroll.bind(this),beforeResetZoom:this.handleBeforeResetZoom.bind(this)},theme:{mode:this.theme}},series:[{name:"Price",data:this.series}],grid:{padding:{left:0,right:0},borderColor:this.isDarkTheme?"#404040":"#e9ecef",strokeDashArray:3},tooltip:{theme:this.theme},yaxis:{opposite:!0,floating:!0,tooltip:{enabled:!0,offsetX:-5},labels:{align:"right",offsetX:10,offsetY:-8,style:{colors:this.isDarkTheme?"#e0e0e0":"#333"},formatter:t=>Number(t).toFixed(2)},crosshairs:{stroke:{dashArray:3,color:this.isDarkTheme?"#6c757d":"#90A4AE"}}},xaxis:{show:!1,tickAmount:5,labels:{rotate:0,show:!1},axisTicks:{show:!1},tooltip:{enabled:!1}},plotOptions:{candlestick:{colors:{upward:this.isDarkTheme?"#26A69A":"#00B746",downward:this.isDarkTheme?"#EF5350":"#EF403C"}}},legend:{show:!1}},s),this.chart=new ApexCharts(this.mainChartDiv,this.mainChartOptions),this.oscillatorSettings=new f(this)}initializeXAxisRange(){if(arguments.length>0&&void 0!==arguments[0]&&arguments[0]){if(this.getCurrentZoomState()&&this.xaxisRange)return}if(!this.series||0===this.series.length)return void(this.xaxisRange={min:0,max:0});const t=this.series.map((t=>"number"==typeof t.x?t.x:t.x instanceof Date?t.x.getTime():new Date(t.x).getTime()));this.xaxisRange={min:Math.min(...t),max:Math.max(...t)}}handleBeforeResetZoom(t,e){setTimeout((()=>{this.initializeXAxisRange(),this.xaxis&&this.xaxis.render()}),0)}handleZoom(t,e){e&&e.xaxis&&(this.xaxisRange.min=new Date(t.w.config.series[0].data[Math.round(e.xaxis.min-1)]?.x).getTime(),this.xaxisRange.max=new Date(t.w.config.series[0].data[Math.round(e.xaxis.max-1)]?.x).getTime(),this.xaxis&&this.xaxis.render(),this.indicatorChartMap["fibonacci retracements"]&&"function"==typeof this.indicatorChartMap["fibonacci retracements"].update&&this.indicatorChartMap["fibonacci retracements"].update())}handleScroll(t,e){e&&e.xaxis&&(this.xaxisRange.min=new Date(t.w.config.series[0].data[Math.round(e.xaxis.min-1)]?.x).getTime(),this.xaxisRange.max=new Date(t.w.config.series[0].data[Math.round(e.xaxis.max-1)]?.x).getTime(),this.xaxis&&this.xaxis.render(),this.indicatorChartMap["fibonacci retracements"]&&"function"==typeof this.indicatorChartMap["fibonacci retracements"].update&&this.indicatorChartMap["fibonacci retracements"].update())}render(){let e=this.chartEl.getRootNode&&this.chartEl.getRootNode(),n=t.is("ShadowRoot",e),i=this.chartEl.ownerDocument,o=n?e.getElementById("apexstock-css"):i.getElementById("apexstock-css");o||(o=document.createElement("style"),o.id="apexstock-css",o.textContent=p,n?e.prepend(o):i.head.appendChild(o)),this.themeManager.applyThemeStyles(this.chartEl,this.primaryToolbar),this.chart.render(),this.addCustomIndicatorDropdowns(),this.chartSwitch=new g(this),new d(this),new u(this,{filename:"my-stock-chart.png"}),this.xaxis=new y(this),this.zoomControls=new v(this),this.updateAllChartHeights()}update(e){const n=Object.keys(this.indicatorChartMap),i=this.activeOscillator;let o=this.getCurrentZoomState(),s=this.themeManager.getChartConfig();e.theme&&e.theme.mode&&e.theme.mode!==this.theme&&(this.chartSwitch&&this.chartSwitch.updateTheme(e.theme.mode),this.themeManager.setTheme(e.theme.mode),this.theme=this.themeManager.getTheme(),this.isDarkTheme="dark"===this.theme,this.colors=this.themeManager.getColors(),s=this.themeManager.getChartConfig(),this.chartEl.parentNode.classList.remove("apexstock-theme-dark","apexstock-theme-light"),this.chartEl.parentNode.classList.add("apexstock-theme-"+this.theme),this.chartEl.parentNode.style.backgroundColor=this.colors.toolbar.background,this.chartEl.style.backgroundColor=this.colors.toolbar.background,this.themeManager.applyThemeStyles(this.chartEl,this.primaryToolbar)),e.series&&e.series[0]&&e.series[0].data&&(this.series=e.series[0].data,this.volumesData=this.series.map((t=>t.v?{x:t.x,y:t.v}:null)).filter((t=>null!==t))),e.yaxis||(e.yaxis=this.chart.w.config.yaxis.map((t=>({...t,labels:{...t.labels,style:{...t.labels?.style,colors:s.yaxis.labels.style.colors}}}))));const r=t.extend(this.themeManager.getChartConfig(),e);if(e.plotOptions&&e.plotOptions.candlestick&&e.plotOptions.candlestick.colors||(r.plotOptions||(r.plotOptions={}),r.plotOptions.candlestick||(r.plotOptions.candlestick={}),r.plotOptions.candlestick.colors={upward:this.isDarkTheme?"#26A69A":"#00B746",downward:this.isDarkTheme?"#EF5350":"#EF403C"}),this.chart.updateOptions(r,!0,!0,!0),this.initializeXAxisRange(),n.forEach((t=>{this.removeIndicator(t)})),n.forEach((t=>{this.updateIndicator(t)})),this.activeOscillator=i,o&&void 0!==o.minX&&void 0!==o.maxX){const t=this.series.length;if(t>o.maxX)this.applyZoomToAllCharts(o);else{this.applyZoomToAllCharts({minX:Math.min(o.minX,t-1),maxX:Math.min(o.maxX,t-1)})}}if(this.xaxis){if(e.theme&&e.theme.mode){const t=this.xaxis;this.xaxis=new y(this),t&&"function"==typeof t.destroy&&t.destroy()}this.xaxis.render()}if(this.updateAllChartHeights(),this.chartSwitch&&"candlestick"!==this.chartSwitch.currentType){const t=this.chartSwitch.currentType;this.chartSwitch.currentType=null,this.chartSwitch.changeChartType(t)}}destroy(){this.chartSwitch&&"function"==typeof this.chartSwitch.destroy&&this.chartSwitch.destroy(),this.oscillatorSettings&&"function"==typeof this.oscillatorSettings.destroy&&this.oscillatorSettings.destroy()}randomId(){return(Math.random()+1).toString(36).substring(4)}addCustomIndicatorDropdowns(){this.createIndicatorDropdown("Indicators",{...this.overlays,...this.oscillators}),this.chartEl.parentNode.insertBefore(this.primaryToolbar,this.chartEl)}createIndicatorDropdown(t,e){const n=document.createElement("div");n.classList.add("apexstock-custom-select-wrapper");const i=document.createElement("div");i.classList.add("apexstock-custom-select-trigger"),i.innerText="Select "+t,n.appendChild(i);const o=document.createElement("div");o.classList.add("apexstock-custom-options"),Object.keys(e).forEach((e=>{const n="rsi"===e||"macd"===e?e.toUpperCase():e.replace(/([A-Z])/g," $1").replace(/^./,(t=>t.toUpperCase())),s=document.createElement("div");s.classList.add("apexstock-custom-option"),s.dataset.value=e;const r=Object.keys(this.oscillators).includes(e);s.dataset.type=r?"oscillator":"overlay",s.innerText=n,o.appendChild(s),s.addEventListener("click",(e=>{const n=e.currentTarget.dataset.value;if("oscillator"===e.currentTarget.dataset.type)if(e.currentTarget.classList.contains("selected"))e.currentTarget.classList.remove("selected"),this.removeIndicator(n),this.activeOscillator=null;else{o.querySelectorAll('.apexstock-custom-option[data-type="oscillator"]').forEach((t=>{t.classList.contains("selected")&&(t.classList.remove("selected"),this.removeIndicator(t.dataset.value))})),e.currentTarget.classList.add("selected"),this.activeOscillator=n,this.updateIndicator(n)}else e.currentTarget.classList.contains("selected")?(e.currentTarget.classList.remove("selected"),this.removeIndicator(n)):(e.currentTarget.classList.add("selected"),this.updateIndicator(n));const s=o.querySelectorAll(".apexstock-custom-option.selected");i.innerText=s.length>0?`${t}: ${Array.from(s).map((t=>t.innerText)).join(", ")}`:"Select "+t}))})),n.appendChild(o),i.addEventListener("click",(()=>{o.style.display="block"===o.style.display?"none":"block"}));let s=null;const r=()=>{o.style.display="none"};return n.addEventListener("mouseleave",(()=>{s&&clearTimeout(s),"block"===o.style.display&&(s=setTimeout(r,1200))})),n.addEventListener("mouseenter",(()=>{s&&(clearTimeout(s),s=null)})),document.addEventListener("click",(t=>{n.contains(t.target)||(r(),s&&(clearTimeout(s),s=null))})),this.primaryToolbarLeft.appendChild(n),n}computeHeights(t){const e=this.totalHeight-this.xAxisHeight,n=Math.floor(.6*e),i=Math.floor(.4*e);return{newMainHeight:n,indicatorContainerHeight:i,indicatorHeight:t>0?Math.floor(i/t):0}}updateAllChartHeights(){const t=this.indicatorContainer.children.length;if(0===t){const t=this.totalHeight-this.xAxisHeight;return this.mainChartDiv.style.height=t+"px",this.indicatorContainer.style.height="0px",this.chart.updateOptions({chart:{height:t}},!1,!1,!1),void(this.xaxis&&(this.xaxis.updateHeight(),this.xaxis.ensureXAxisIsLast()))}const{newMainHeight:e,indicatorContainerHeight:n,indicatorHeight:i}=this.computeHeights(t);this.mainChartDiv.style.height=e+36+"px",this.indicatorContainer.style.height=n+"px",this.chart.updateOptions({chart:{height:e+36}},!1,!1,!1);for(let e=0;t>e;e++){const t=this.indicatorContainer.children[e];t.style.height=i+"px",t.style.top="18px",t.style.marginTop="-36px",t.style.position="relative";const n=t.dataset.indicator;this.indicatorChartMap[n]&&"function"==typeof this.indicatorChartMap[n].updateOptions&&this.indicatorChartMap[n].updateOptions({chart:{height:i}},!1,!1,!1)}this.xaxis&&(this.xaxis.updateHeight(),this.xaxis.ensureXAxisIsLast()),this.updateOscillatorSettings()}isOverlay(t){return Object.keys(this.overlays).includes(t.toLowerCase())}getCurrentZoomState(){if(!this.chart||!this.chart.w)return null;const t=this.chart.w;let e=0,n=t.globals.dataPoints-1;return t.globals.isRangeBar||t.globals.isTimelineBar||"rangeBar"===t.config.chart.type||"candlestick"===t.config.chart.type?(e=t.globals.minX,n=t.globals.maxX):t.globals.dataPoints>0&&t.globals.selectedDataPoints&&t.globals.selectedDataPoints[0]&&t.globals.selectedDataPoints[0].length?(e=Math.min(...t.globals.selectedDataPoints[0]),n=Math.max(...t.globals.selectedDataPoints[0])):t.globals.minX!==1/0&&t.globals.maxX!==-1/0&&(e=t.globals.minX,n=t.globals.maxX),{minX:e,maxX:n}}updateIndicator(t){const e=this.getCurrentZoomState();x.updateIndicator(t,this),e&&this.applyZoomToAllCharts(e),this.xaxis&&"function"==typeof this.xaxis.updateEventListeners&&this.xaxis.updateEventListeners()}removeIndicator(t){const e=this.getCurrentZoomState();x.removeIndicator(t,this),e&&this.applyZoomToAllCharts(e),this.xaxis&&"function"==typeof this.xaxis.updateEventListeners&&this.xaxis.updateEventListeners(),this.oscillatorSettings&&this.oscillatorSettings.removeSettingsElement(t)}applyZoomToAllCharts(t){this.chart&&t&&this.chart.zoomX(t.minX,t.maxX),Object.values(this.indicatorChartMap).forEach((e=>{e&&"function"==typeof e.zoomX&&e.zoomX(t.minX,t.maxX)}))}updateTheme(e){if("light"!==e&&"dark"!==e)return void console.warn('Invalid theme. Use "light" or "dark".');if(this.theme===e)return;this.themeManager.setTheme(e),this.theme=this.themeManager.getTheme(),this.isDarkTheme="dark"===this.theme,this.colors=this.themeManager.getColors(),this.themeManager.applyThemeStyles(this.chartEl,this.primaryToolbar);const n=this.themeManager.getChartConfig();this.chart.updateOptions(t.extend(n,this.mainChartOptions),!1,!1,!1);const i=Object.keys(this.indicatorChartMap),o=this.activeOscillator;i.forEach((t=>{this.removeIndicator(t)})),i.forEach((t=>{this.updateIndicator(t)})),this.activeOscillator=o;const s=this.getCurrentZoomState();s&&this.applyZoomToAllCharts(s),this.zoomControls&&this.zoomControls.updateTheme(e),this.chartSwitch&&"function"==typeof this.chartSwitch.updateTheme&&this.chartSwitch.updateTheme(e),this.oscillatorSettings&&this.oscillatorSettings.updateTheme(e)}getTheme(){return this.themeManager.getTheme()}updateOscillatorSettings(){this.oscillatorSettings&&"function"==typeof this.oscillatorSettings.updatePositions&&setTimeout((()=>{this.oscillatorSettings.updatePositions()}),150)}updateChartOptions(t){t.theme&&t.theme.mode!==this.theme&&this.updateTheme(t.theme.mode),this.chart.updateOptions(t,!1,!1,!1),t.chart&&t.chart.height&&(this.totalHeight=t.chart.height,this.updateAllChartHeights())}calculateMovingAverage(t,n){return e.calculateMovingAverage(t,n)}calculateRSI(t,n){return e.calculateRSI(t,n)}calculateBollingerBands(t,n,i){return e.calculateBollingerBands(t,n,i)}calculateMACD(t,n,i,o){return e.calculateMACD(t,n,i,o)}calculateEMA(t,n){return e.calculateEMA(t,n)}calculateFibonacciRetracements(t){return e.calculateFibonacciRetracements(t)}calculatePVT(t){return e.calculatePVT(t)}calculateFibonacciRetracementsForRange(t,n,i){return e.calculateFibonacciRetracementsForRange(t,n,i)}calculateStochastic(t,n,i){return e.calculateStochastic(t,n,i)}calculateStdDevIndicator(t,n){return e.calculateStdDevIndicator(t,n)}calculateADX(t,n){return e.calculateADX(t,n)}calculateChaikinOsc(t,n,i){return e.calculateChaikinOsc(t,n,i)}calculateEMAFromArray(t,n){return e.calculateEMAFromArray(t,n)}calculateSMAFromArray(t,n){return e.calculateSMAFromArray(t,n)}calculateBBPercent(t,n,i){return e.calculateBBPercent(t,n,i)}calculateBBWidth(t,n,i,o){return e.calculateBBWidth(t,n,i,o)}calculateLinearRegression(t,n){return e.calculateLinearRegression(t,n)}calculateIchimoku(t){return e.calculateIchimoku(t)}calculateAcceleratorOsc(t,n){return e.calculateAcceleratorOsc(t,n)}calculateCCI(t,n){return e.calculateCCI(t,n)}calculateTSI(t,n,i){return e.calculateTSI(t,n,i)}}}));