@tradecanvas/chart 2.0.2 → 2.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../LayoutSession-CwpR5ScW.cjs`),t=require(`../widgetLocales-C_XTkni5.cjs`),n=require(`../monthView-B-CieFDJ.cjs`),r=require(`../widgetFeatures-BZ8OVPN2.cjs`),i=require(`../focusTrap-DrhhmG0V.cjs`),a=require(`../symbolCatalog-CXqRu23x.cjs`),o=require(`../settingsControls-Tn8_vJJv.cjs`),s=require(`../i18n-Q4mxL2mj.cjs`),c=require(`../indicatorInputWords-hVKLYuVB.cjs`),l=require(`../platformKeys-B82-j1Fs.cjs`);let u=require(`@tradecanvas/commons`),d=require(`@tradecanvas/core`);function f(e,t,n={}){return(0,u.resampleBars)(e,t,{weekStartsOn:n.weekStartsOn??1,timeZone:n.timeZone})}function p(e){if(e.length<2)return 0;let t=[];for(let n=1;n<e.length;n++){let r=e[n].time-e[n-1].time;r>0&&t.push(r)}return t.length===0?0:(t.sort((e,t)=>e-t),t[Math.floor(t.length/2)])}var m=6,h=8,g=120;function _(e,t,n=`left`){let r=e.style,i=t.getBoundingClientRect();r.position=`fixed`,r.margin=`0`,r.top=r.bottom=r.left=r.right=``;let a=window.innerHeight-i.bottom-m-h,o=i.top-m-h;e.scrollHeight<=a||a>=o?(r.top=`${i.bottom+m}px`,r.bottom=`auto`,r.maxHeight=`${Math.max(g,a)}px`):(r.top=`auto`,r.bottom=`${window.innerHeight-i.top+m}px`,r.maxHeight=`${Math.max(g,o)}px`);let s=getComputedStyle(t).direction===`rtl`,c=n===`right`!==s,l=e.offsetWidth,u=c?i.right-l:i.left;r.left=`${Math.max(h,Math.min(u,window.innerWidth-l-h))}px`}var v=700,y=class{select=null;panel=null;rows=[];active=-1;typed=``;typedAt=0;onOutside=e=>{let t=e.target;this.panel?.contains(t)||this.select?.contains(t)||this.close(!1)};onAway=()=>this.close(!1);onScroll=e=>{e.target instanceof Node&&this.panel?.contains(e.target)||this.close(!1)};watch=new MutationObserver(()=>{this.select&&!this.select.isConnected&&this.close(!1)});constructor(e){this.layer=e}isOpenFor(e){return this.select===e}owns(e){return e!==null&&(e===this.select||this.panel?.contains(e)===!0)}open(e){this.close(!1),this.select=e;let t=document.createElement(`div`);t.className=`tcw-dropdown tcw-select-menu`,t.setAttribute(`role`,`listbox`),t.id=`tcw-select-menu-${Math.random().toString(36).slice(2,9)}`;let n=e.getAttribute(`aria-label`)??e.labels?.[0]?.textContent??``;n&&t.setAttribute(`aria-label`,n.trim()),t.style.minWidth=`${e.getBoundingClientRect().width}px`,this.rows=[];for(let n of e.children)if(n instanceof HTMLOptGroupElement){let e=document.createElement(`div`);e.className=`tcw-select-group`,e.textContent=n.label,t.appendChild(e);for(let e of n.querySelectorAll(`option`))this.addRow(t,e,n.disabled)}else n instanceof HTMLOptionElement&&this.addRow(t,n,!1);t.addEventListener(`mousedown`,e=>e.preventDefault());let r=e=>this.rows.findIndex(t=>t.el.contains(e.target));t.addEventListener(`click`,e=>{let t=r(e);t>=0&&this.pick(t)}),t.addEventListener(`mousemove`,e=>{let t=r(e);t>=0&&t!==this.active&&this.enabled(t)&&this.setActive(t,!1)}),this.layer().appendChild(t),this.panel=t,_(t,e),e.setAttribute(`aria-expanded`,`true`),e.setAttribute(`aria-controls`,t.id),this.setActive(this.rows.findIndex(e=>e.option.selected)),document.addEventListener(`pointerdown`,this.onOutside,!0),window.addEventListener(`resize`,this.onAway),document.addEventListener(`scroll`,this.onScroll,{capture:!0,passive:!0}),this.watch.observe(document.documentElement,{childList:!0,subtree:!0})}close(e){let t=this.select;t&&(document.removeEventListener(`pointerdown`,this.onOutside,!0),window.removeEventListener(`resize`,this.onAway),document.removeEventListener(`scroll`,this.onScroll,{capture:!0}),this.watch.disconnect(),this.panel?.remove(),this.panel=null,this.rows=[],this.select=null,t.setAttribute(`aria-expanded`,`false`),t.removeAttribute(`aria-controls`),t.removeAttribute(`aria-activedescendant`),e&&t.isConnected&&t.focus())}key(e){if(!this.select)return!1;switch(e.key){case`ArrowDown`:return this.step(1),!0;case`ArrowUp`:return this.step(-1),!0;case`Home`:return this.setActive(this.nextEnabled(-1,1)),!0;case`End`:return this.setActive(this.nextEnabled(this.rows.length,-1)),!0;case`PageDown`:return this.step(8),!0;case`PageUp`:return this.step(-8),!0;case` `:return this.typed&&Date.now()-this.typedAt<=v?(this.typeahead(` `),!0):(this.active>=0?this.pick(this.active):this.close(!0),!0);case`Enter`:return this.active>=0?this.pick(this.active):this.close(!0),!0;case`Escape`:return this.close(!0),!0;case`Tab`:return this.close(!1),!1;default:return e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey?(this.typeahead(e.key),!0):!1}}destroy(){this.close(!1)}addRow(e,t,n){let r=document.createElement(`div`);r.className=`tcw-select-option`,r.id=`${e.id}-${this.rows.length}`,r.setAttribute(`role`,`option`),r.setAttribute(`aria-selected`,String(t.selected)),(t.disabled||n)&&r.setAttribute(`aria-disabled`,`true`);let i=document.createElement(`span`);i.className=`tcw-select-option-text`,i.textContent=t.label||t.textContent||``,t.dir&&(i.dir=t.dir);let a=document.createElement(`span`);a.className=`tcw-select-check`,a.setAttribute(`aria-hidden`,`true`),r.append(a,i),e.appendChild(r),this.rows.push({option:t,el:r})}enabled(e){return this.rows[e]?.el.getAttribute(`aria-disabled`)!==`true`}nextEnabled(e,t){for(let n=e+t;n>=0&&n<this.rows.length;n+=t)if(this.enabled(n))return n;return-1}step(e){let t=e>0?1:-1,n=this.active;for(let r=0;r<Math.abs(e);r++){let e=this.nextEnabled(n,t);if(e<0)break;n=e}n>=0&&this.setActive(n)}setActive(e,t=!0){this.rows[this.active]?.el.classList.remove(`tcw-active`),this.active=e;let n=this.rows[e];n&&(n.el.classList.add(`tcw-active`),this.select?.setAttribute(`aria-activedescendant`,n.el.id),t&&n.el.scrollIntoView?.({block:`nearest`}))}typeahead(e){let t=Date.now();this.typed=t-this.typedAt>v?e.toLowerCase():this.typed+e.toLowerCase(),this.typedAt=t;let n=e=>this.enabled(e)&&(this.rows[e].el.textContent??``).trim().toLowerCase().startsWith(this.typed),r=this.typed.length===1?this.active+1:Math.max(0,this.active);for(let e=0;e<this.rows.length;e++){let t=(r+e)%this.rows.length;if(n(t)){this.setActive(t);return}}}pick(e){let t=this.select,n=this.rows[e];if(!t||!n||!this.enabled(e))return;let r=!n.option.selected;n.option.selected=!0,this.close(!0),r&&(t.dispatchEvent(new Event(`input`,{bubbles:!0})),t.dispatchEvent(new Event(`change`,{bubbles:!0})))}},ee=class{input=null;view=null;onOutside=e=>{let t=e.target;this.view?.element.contains(t)||this.input?.contains(t)||this.close(!1)};onAway=()=>this.close(!1);onScroll=e=>{e.target instanceof Node&&this.view?.element.contains(e.target)||this.close(!1)};watch=new MutationObserver(()=>{this.input&&!this.input.isConnected&&this.close(!1)});constructor(e,t,n){this.layer=e,this.labels=t,this.locale=n}isOpenFor(e){return this.input===e}owns(e){return e!==null&&(e===this.input||this.view?.element.contains(e)===!0)}open(e){this.close(!1),this.input=e;let t=new n.t(this.labels(),this.locale(),e=>this.pick(e));t.show(e.value,{min:e.min||void 0,max:e.max||void 0});let r=t.element;r.setAttribute(`role`,`dialog`);let i=e.getAttribute(`aria-label`)??e.labels?.[0]?.textContent??``;i&&r.setAttribute(`aria-label`,i.trim()),r.addEventListener(`mousedown`,e=>{e.target.closest(`button`)||e.preventDefault()}),r.addEventListener(`keydown`,e=>{e.stopPropagation(),e.key===`Escape`&&(e.preventDefault(),this.close(!0))}),this.view=t,this.layer().appendChild(r),_(r,e),document.addEventListener(`pointerdown`,this.onOutside,!0),window.addEventListener(`resize`,this.onAway),document.addEventListener(`scroll`,this.onScroll,{capture:!0,passive:!0}),this.watch.observe(document.documentElement,{childList:!0,subtree:!0})}close(e){let t=this.input;t&&(document.removeEventListener(`pointerdown`,this.onOutside,!0),window.removeEventListener(`resize`,this.onAway),document.removeEventListener(`scroll`,this.onScroll,{capture:!0}),this.watch.disconnect(),this.view?.element.remove(),this.view=null,this.input=null,e&&t.isConnected&&t.focus())}focusGrid(){this.view?.focusGrid()}destroy(){this.close(!1)}pick(e){let t=this.input;if(!t)return;let n=t.value!==e;t.value=e,this.close(!0),n&&(t.dispatchEvent(new Event(`input`,{bubbles:!0})),t.dispatchEvent(new Event(`change`,{bubbles:!0})))}},te=()=>typeof matchMedia==`function`&&matchMedia(`(pointer: coarse)`).matches,ne=()=>typeof CSS>`u`||typeof CSS.supports!=`function`||CSS.supports(`selector(::-webkit-calendar-picker-indicator)`);function re(e){if(!(e instanceof Element))return null;let t=e.closest(`select`);return!t||t.matches(`:disabled`)||t.multiple||t.size>1?null:t}function ie(e){return!(e instanceof HTMLInputElement)||e.type!==`date`||e.dataset.tcwCalendar===`inline`||e.matches(`:disabled`)||e.readOnly?null:e}function ae(e,t){let n=new y(t.layer),r=new ee(t.layer,t.labels,t.locale),i=t.native??te,a=t.calendar??ne,o=new WeakSet,s=e=>o.has(e)?!1:(o.add(e),!0),c=e=>{if(e.button!==0||i()||!s(e))return;let t=re(e.target);if(t){if(e.preventDefault(),n.isOpenFor(t)){n.close(!0);return}t.focus(),n.open(t)}},l=e=>{if(i()||!a()||!s(e))return;let t=ie(e.target);t&&(e.preventDefault(),r.isOpenFor(t)||r.open(t))},u=e=>{if(i()||!s(e))return;let t=re(e.target);if(t){if(n.isOpenFor(t)){n.key(e)&&(e.preventDefault(),e.stopPropagation());return}(e.key===`Enter`||e.key===` `||e.altKey&&(e.key===`ArrowDown`||e.key===`ArrowUp`)||e.key===`F4`)&&(e.preventDefault(),e.stopPropagation(),n.open(t));return}let o=ie(e.target);!o||!a()||(e.key===`Escape`&&r.isOpenFor(o)?(e.preventDefault(),e.stopPropagation(),r.close(!0)):(e.altKey&&e.key===`ArrowDown`||e.key===`F4`)&&(e.preventDefault(),r.isOpenFor(o)||r.open(o),r.focusGrid()))},d=e=>{if(!s(e))return;let t=e.target instanceof Node?e.target:null,i=e.relatedTarget instanceof Node?e.relatedTarget:null;n.owns(t)&&!n.owns(i)&&n.close(!1),r.owns(t)&&!r.owns(i)&&r.close(!1)};for(let t of e)t.addEventListener(`mousedown`,c,!0),t.addEventListener(`click`,l,!0),t.addEventListener(`keydown`,u,!0),t.addEventListener(`focusout`,d,!0);return()=>{for(let t of e)t.removeEventListener(`mousedown`,c,!0),t.removeEventListener(`click`,l,!0),t.removeEventListener(`keydown`,u,!0),t.removeEventListener(`focusout`,d,!0);n.destroy(),r.destroy()}}var oe=`/* === TradeCanvas Widget — Premium Styles === */
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../LayoutSession-BIloMGUt.cjs`),t=require(`../widgetLocales-C_XTkni5.cjs`),n=require(`../monthView-B-CieFDJ.cjs`),r=require(`../widgetFeatures-BZ8OVPN2.cjs`),i=require(`../focusTrap-DrhhmG0V.cjs`),a=require(`../symbolCatalog-CXqRu23x.cjs`),o=require(`../settingsControls-Tn8_vJJv.cjs`),s=require(`../i18n-Q4mxL2mj.cjs`),c=require(`../indicatorInputWords-hVKLYuVB.cjs`),l=require(`../platformKeys-B82-j1Fs.cjs`);let u=require(`@tradecanvas/commons`),d=require(`@tradecanvas/core`);function f(e,t,n={}){return(0,u.resampleBars)(e,t,{weekStartsOn:n.weekStartsOn??1,timeZone:n.timeZone})}function p(e){if(e.length<2)return 0;let t=[];for(let n=1;n<e.length;n++){let r=e[n].time-e[n-1].time;r>0&&t.push(r)}return t.length===0?0:(t.sort((e,t)=>e-t),t[Math.floor(t.length/2)])}var m=6,h=8,g=120;function _(e,t,n=`left`){let r=e.style,i=t.getBoundingClientRect();r.position=`fixed`,r.margin=`0`,r.top=r.bottom=r.left=r.right=``;let a=window.innerHeight-i.bottom-m-h,o=i.top-m-h;e.scrollHeight<=a||a>=o?(r.top=`${i.bottom+m}px`,r.bottom=`auto`,r.maxHeight=`${Math.max(g,a)}px`):(r.top=`auto`,r.bottom=`${window.innerHeight-i.top+m}px`,r.maxHeight=`${Math.max(g,o)}px`);let s=getComputedStyle(t).direction===`rtl`,c=n===`right`!==s,l=e.offsetWidth,u=c?i.right-l:i.left;r.left=`${Math.max(h,Math.min(u,window.innerWidth-l-h))}px`}var v=700,y=class{select=null;panel=null;rows=[];active=-1;typed=``;typedAt=0;onOutside=e=>{let t=e.target;this.panel?.contains(t)||this.select?.contains(t)||this.close(!1)};onAway=()=>this.close(!1);onScroll=e=>{e.target instanceof Node&&this.panel?.contains(e.target)||this.close(!1)};watch=new MutationObserver(()=>{this.select&&!this.select.isConnected&&this.close(!1)});constructor(e){this.layer=e}isOpenFor(e){return this.select===e}owns(e){return e!==null&&(e===this.select||this.panel?.contains(e)===!0)}open(e){this.close(!1),this.select=e;let t=document.createElement(`div`);t.className=`tcw-dropdown tcw-select-menu`,t.setAttribute(`role`,`listbox`),t.id=`tcw-select-menu-${Math.random().toString(36).slice(2,9)}`;let n=e.getAttribute(`aria-label`)??e.labels?.[0]?.textContent??``;n&&t.setAttribute(`aria-label`,n.trim()),t.style.minWidth=`${e.getBoundingClientRect().width}px`,this.rows=[];for(let n of e.children)if(n instanceof HTMLOptGroupElement){let e=document.createElement(`div`);e.className=`tcw-select-group`,e.textContent=n.label,t.appendChild(e);for(let e of n.querySelectorAll(`option`))this.addRow(t,e,n.disabled)}else n instanceof HTMLOptionElement&&this.addRow(t,n,!1);t.addEventListener(`mousedown`,e=>e.preventDefault());let r=e=>this.rows.findIndex(t=>t.el.contains(e.target));t.addEventListener(`click`,e=>{let t=r(e);t>=0&&this.pick(t)}),t.addEventListener(`mousemove`,e=>{let t=r(e);t>=0&&t!==this.active&&this.enabled(t)&&this.setActive(t,!1)}),this.layer().appendChild(t),this.panel=t,_(t,e),e.setAttribute(`aria-expanded`,`true`),e.setAttribute(`aria-controls`,t.id),this.setActive(this.rows.findIndex(e=>e.option.selected)),document.addEventListener(`pointerdown`,this.onOutside,!0),window.addEventListener(`resize`,this.onAway),document.addEventListener(`scroll`,this.onScroll,{capture:!0,passive:!0}),this.watch.observe(document.documentElement,{childList:!0,subtree:!0})}close(e){let t=this.select;t&&(document.removeEventListener(`pointerdown`,this.onOutside,!0),window.removeEventListener(`resize`,this.onAway),document.removeEventListener(`scroll`,this.onScroll,{capture:!0}),this.watch.disconnect(),this.panel?.remove(),this.panel=null,this.rows=[],this.select=null,t.setAttribute(`aria-expanded`,`false`),t.removeAttribute(`aria-controls`),t.removeAttribute(`aria-activedescendant`),e&&t.isConnected&&t.focus())}key(e){if(!this.select)return!1;switch(e.key){case`ArrowDown`:return this.step(1),!0;case`ArrowUp`:return this.step(-1),!0;case`Home`:return this.setActive(this.nextEnabled(-1,1)),!0;case`End`:return this.setActive(this.nextEnabled(this.rows.length,-1)),!0;case`PageDown`:return this.step(8),!0;case`PageUp`:return this.step(-8),!0;case` `:return this.typed&&Date.now()-this.typedAt<=v?(this.typeahead(` `),!0):(this.active>=0?this.pick(this.active):this.close(!0),!0);case`Enter`:return this.active>=0?this.pick(this.active):this.close(!0),!0;case`Escape`:return this.close(!0),!0;case`Tab`:return this.close(!1),!1;default:return e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey?(this.typeahead(e.key),!0):!1}}destroy(){this.close(!1)}addRow(e,t,n){let r=document.createElement(`div`);r.className=`tcw-select-option`,r.id=`${e.id}-${this.rows.length}`,r.setAttribute(`role`,`option`),r.setAttribute(`aria-selected`,String(t.selected)),(t.disabled||n)&&r.setAttribute(`aria-disabled`,`true`);let i=document.createElement(`span`);i.className=`tcw-select-option-text`,i.textContent=t.label||t.textContent||``,t.dir&&(i.dir=t.dir);let a=document.createElement(`span`);a.className=`tcw-select-check`,a.setAttribute(`aria-hidden`,`true`),r.append(a,i),e.appendChild(r),this.rows.push({option:t,el:r})}enabled(e){return this.rows[e]?.el.getAttribute(`aria-disabled`)!==`true`}nextEnabled(e,t){for(let n=e+t;n>=0&&n<this.rows.length;n+=t)if(this.enabled(n))return n;return-1}step(e){let t=e>0?1:-1,n=this.active;for(let r=0;r<Math.abs(e);r++){let e=this.nextEnabled(n,t);if(e<0)break;n=e}n>=0&&this.setActive(n)}setActive(e,t=!0){this.rows[this.active]?.el.classList.remove(`tcw-active`),this.active=e;let n=this.rows[e];n&&(n.el.classList.add(`tcw-active`),this.select?.setAttribute(`aria-activedescendant`,n.el.id),t&&n.el.scrollIntoView?.({block:`nearest`}))}typeahead(e){let t=Date.now();this.typed=t-this.typedAt>v?e.toLowerCase():this.typed+e.toLowerCase(),this.typedAt=t;let n=e=>this.enabled(e)&&(this.rows[e].el.textContent??``).trim().toLowerCase().startsWith(this.typed),r=this.typed.length===1?this.active+1:Math.max(0,this.active);for(let e=0;e<this.rows.length;e++){let t=(r+e)%this.rows.length;if(n(t)){this.setActive(t);return}}}pick(e){let t=this.select,n=this.rows[e];if(!t||!n||!this.enabled(e))return;let r=!n.option.selected;n.option.selected=!0,this.close(!0),r&&(t.dispatchEvent(new Event(`input`,{bubbles:!0})),t.dispatchEvent(new Event(`change`,{bubbles:!0})))}},ee=class{input=null;view=null;onOutside=e=>{let t=e.target;this.view?.element.contains(t)||this.input?.contains(t)||this.close(!1)};onAway=()=>this.close(!1);onScroll=e=>{e.target instanceof Node&&this.view?.element.contains(e.target)||this.close(!1)};watch=new MutationObserver(()=>{this.input&&!this.input.isConnected&&this.close(!1)});constructor(e,t,n){this.layer=e,this.labels=t,this.locale=n}isOpenFor(e){return this.input===e}owns(e){return e!==null&&(e===this.input||this.view?.element.contains(e)===!0)}open(e){this.close(!1),this.input=e;let t=new n.t(this.labels(),this.locale(),e=>this.pick(e));t.show(e.value,{min:e.min||void 0,max:e.max||void 0});let r=t.element;r.setAttribute(`role`,`dialog`);let i=e.getAttribute(`aria-label`)??e.labels?.[0]?.textContent??``;i&&r.setAttribute(`aria-label`,i.trim()),r.addEventListener(`mousedown`,e=>{e.target.closest(`button`)||e.preventDefault()}),r.addEventListener(`keydown`,e=>{e.stopPropagation(),e.key===`Escape`&&(e.preventDefault(),this.close(!0))}),this.view=t,this.layer().appendChild(r),_(r,e),document.addEventListener(`pointerdown`,this.onOutside,!0),window.addEventListener(`resize`,this.onAway),document.addEventListener(`scroll`,this.onScroll,{capture:!0,passive:!0}),this.watch.observe(document.documentElement,{childList:!0,subtree:!0})}close(e){let t=this.input;t&&(document.removeEventListener(`pointerdown`,this.onOutside,!0),window.removeEventListener(`resize`,this.onAway),document.removeEventListener(`scroll`,this.onScroll,{capture:!0}),this.watch.disconnect(),this.view?.element.remove(),this.view=null,this.input=null,e&&t.isConnected&&t.focus())}focusGrid(){this.view?.focusGrid()}destroy(){this.close(!1)}pick(e){let t=this.input;if(!t)return;let n=t.value!==e;t.value=e,this.close(!0),n&&(t.dispatchEvent(new Event(`input`,{bubbles:!0})),t.dispatchEvent(new Event(`change`,{bubbles:!0})))}},te=()=>typeof matchMedia==`function`&&matchMedia(`(pointer: coarse)`).matches,ne=()=>typeof CSS>`u`||typeof CSS.supports!=`function`||CSS.supports(`selector(::-webkit-calendar-picker-indicator)`);function re(e){if(!(e instanceof Element))return null;let t=e.closest(`select`);return!t||t.matches(`:disabled`)||t.multiple||t.size>1?null:t}function ie(e){return!(e instanceof HTMLInputElement)||e.type!==`date`||e.dataset.tcwCalendar===`inline`||e.matches(`:disabled`)||e.readOnly?null:e}function ae(e,t){let n=new y(t.layer),r=new ee(t.layer,t.labels,t.locale),i=t.native??te,a=t.calendar??ne,o=new WeakSet,s=e=>o.has(e)?!1:(o.add(e),!0),c=e=>{if(e.button!==0||i()||!s(e))return;let t=re(e.target);if(t){if(e.preventDefault(),n.isOpenFor(t)){n.close(!0);return}t.focus(),n.open(t)}},l=e=>{if(i()||!a()||!s(e))return;let t=ie(e.target);t&&(e.preventDefault(),r.isOpenFor(t)||r.open(t))},u=e=>{if(i()||!s(e))return;let t=re(e.target);if(t){if(n.isOpenFor(t)){n.key(e)&&(e.preventDefault(),e.stopPropagation());return}(e.key===`Enter`||e.key===` `||e.altKey&&(e.key===`ArrowDown`||e.key===`ArrowUp`)||e.key===`F4`)&&(e.preventDefault(),e.stopPropagation(),n.open(t));return}let o=ie(e.target);!o||!a()||(e.key===`Escape`&&r.isOpenFor(o)?(e.preventDefault(),e.stopPropagation(),r.close(!0)):(e.altKey&&e.key===`ArrowDown`||e.key===`F4`)&&(e.preventDefault(),r.isOpenFor(o)||r.open(o),r.focusGrid()))},d=e=>{if(!s(e))return;let t=e.target instanceof Node?e.target:null,i=e.relatedTarget instanceof Node?e.relatedTarget:null;n.owns(t)&&!n.owns(i)&&n.close(!1),r.owns(t)&&!r.owns(i)&&r.close(!1)};for(let t of e)t.addEventListener(`mousedown`,c,!0),t.addEventListener(`click`,l,!0),t.addEventListener(`keydown`,u,!0),t.addEventListener(`focusout`,d,!0);return()=>{for(let t of e)t.removeEventListener(`mousedown`,c,!0),t.removeEventListener(`click`,l,!0),t.removeEventListener(`keydown`,u,!0),t.removeEventListener(`focusout`,d,!0);n.destroy(),r.destroy()}}var oe=`/* === TradeCanvas Widget — Premium Styles === */
2
2
 
3
3
  /*
4
4
  * The HTML \`hidden\` attribute only sets \`display: none\` via the UA stylesheet,
@@ -7897,7 +7897,7 @@ img.tcw-ss-badge {
7897
7897
  ${se}
7898
7898
  ${ce}
7899
7899
  ${le}
7900
- ${r.f()}`,document.head.insertBefore(e,document.head.firstChild)}function pe(){if(ue--,ue>0)return;let e=document.getElementById(de);e&&e.remove()}var me=class{trigger;panel;_isOpen=!1;onOutsideClick;onEscapeKey;onTriggerClick;layer;align;onAway=()=>this.close();onScroll=e=>{e.target instanceof Node&&this.panel.contains(e.target)||this.close()};constructor(e,t={}){this.trigger=e,this.layer=t.layer??null,this.align=t.align??`left`,this.panel=document.createElement(`div`),this.panel.className=`tcw-dropdown`,this.panel.style.minWidth=t.width??`200px`,this.panel.style.display=`none`,this.layer?(this.layer().appendChild(this.panel),this.panel.addEventListener(`click`,()=>this.close())):(this.align===`right`?this.panel.style.insetInlineEnd=`0px`:this.panel.style.insetInlineStart=`0px`,e.style.position=`relative`,e.appendChild(this.panel)),this.onTriggerClick=()=>{this._isOpen?this.close():this.open()},this.onOutsideClick=e=>{let t=e.target;!this.trigger.contains(t)&&!this.panel.contains(t)&&this.close()},this.onEscapeKey=e=>{e.key===`Escape`&&this.close()},e.addEventListener(`click`,this.onTriggerClick)}setContent(e){this.panel.innerHTML=e}open(){if(!this._isOpen){if(this._isOpen=!0,this.layer){let e=this.layer();this.panel.parentElement!==e&&e.appendChild(this.panel)}this.panel.style.display=``,this.layer&&(this.place(),window.addEventListener(`resize`,this.onAway),document.addEventListener(`scroll`,this.onScroll,{capture:!0,passive:!0})),document.addEventListener(`pointerdown`,this.onOutsideClick),document.addEventListener(`keydown`,this.onEscapeKey)}}close(){this._isOpen&&(this._isOpen=!1,this.panel.style.display=`none`,document.removeEventListener(`pointerdown`,this.onOutsideClick),document.removeEventListener(`keydown`,this.onEscapeKey),window.removeEventListener(`resize`,this.onAway),document.removeEventListener(`scroll`,this.onScroll,{capture:!0}))}isOpen(){return this._isOpen}destroy(){this.close(),this.trigger.removeEventListener(`click`,this.onTriggerClick),this.panel.remove()}place(){_(this.panel,this.trigger,this.align)}},he=[`1m`,`3m`,`5m`,`15m`,`30m`,`1h`,`2h`,`4h`,`1d`,`1w`,`1M`],ge=[`1m`,`5m`,`15m`,`1h`,`4h`,`1d`],_e=6;function ve(e){let t=e.slice(-1);return t===`h`||t===`d`||t===`w`?e.slice(0,-1)+t.toUpperCase():e}var ye=e=>Number.isFinite((0,u.timeframeToMs)(e))||(0,u.tickBarCount)(e)!==null,be=(e,t)=>{let n=(0,u.tickBarCount)(e),r=(0,u.tickBarCount)(t);return n!==null||r!==null?n===null?1:r===null?-1:n-r:(0,u.timeframeToMs)(e)-(0,u.timeframeToMs)(t)};function xe(e,t){let n=t?.length?t:null,r=e?.length?e:n??he;return[...new Set(r)].filter(e=>ye(e)&&(!n||n.includes(e))).sort(be)}function Se(e,t,n=!1){if(t?.length)return e.filter(e=>t.includes(e));if(n)return[...e];let r=e.filter(e=>ge.includes(e));return r.length>0?r:e.slice(0,_e)}var Ce=9999,we={"":`m`,s:`s`,S:`s`,m:`m`,h:`h`,H:`h`,d:`d`,D:`d`,w:`w`,W:`w`,M:`M`},Te={s:[`m`,60],m:[`h`,60],h:[`d`,24]};function Ee(e){let t=/^(\d+)([a-zA-Z]?)$/.exec(e.trim());if(!t)return null;if(t[2]===`T`||t[2]===`t`){let e=`${Number(t[1])}T`;return Number(t[1])<=Ce&&(0,u.tickBarCount)(e)!==null?e:null}let n=Number(t[1]),r=we[t[2]];if(!r||!Number.isSafeInteger(n)||n<1)return null;for(let e=Te[r];e&&n%e[1]===0;e=Te[r])n/=e[1],r=e[0];if(n>Ce)return null;let i=`${n}${r}`;return(0,u.isTimeFrame)(i)?i:null}function De(e,t,n){let r=n?.length?n:null,i=t.filter(e=>ye(e)&&(!r||r.includes(e)));return[...new Set([...e,...i])].sort(be)}var Oe=[`T`,`s`,`m`,`h`,`d`,`w`,`M`];function ke(e){let t=e=>{let t=e.slice(-1);return Oe.includes(t)?t:`m`};return Oe.map(n=>({unit:n,timeframes:e.filter(e=>t(e.value)===n)})).filter(e=>e.timeframes.length>0)}var Ae=864e5,je=5/7;function Me(e){let t=(0,u.timeframeToMs)(e.current),n=(0,u.timeframeToMs)(e.chosen);if(!Number.isFinite(t)||!Number.isFinite(n)||!(e.width>0)||!(e.spanMs>0))return e.current;let r=n=>{if(n===t)return e.barsInSpan;if(n<Ae)return e.barsInSpan*t/n;let r=e.spanMs/n;return n===Ae?r*(e.dayShare??je):r},i=[...new Set([...e.available,e.current])].filter(e=>{let t=(0,u.timeframeToMs)(e);return Number.isFinite(t)&&t>=n}).sort(be);for(let t of i)if(r((0,u.timeframeToMs)(t))*2<=e.width)return t;return i[i.length-1]??e.current}var Ne={ticket:`receipt`,long:`trendingUp`,short:`trendingDown`,ladder:`ladder`,account:`layers`},Pe=[`ladder`,`account`];function Fe(e,t){let n=[];e.onOrderTicket&&n.push({id:`ticket`,label:t(`chartMenu.orderTicket`),parts:[`orderTicket`],run:e.onOrderTicket});let r=e.onBracket;return r&&(n.push({id:`long`,label:t(`toolbar.longBracket`),parts:[`bracketOrders`,`toolbar.bracketOrders`],run:()=>r(`buy`)}),n.push({id:`short`,label:t(`toolbar.shortBracket`),parts:[`bracketOrders`,`toolbar.bracketOrders`],run:()=>r(`sell`)})),e.onToggleLadder&&n.push({id:`ladder`,label:t(`toolbar.depthLadder`),parts:[`depthLadder`,`toolbar.depthLadder`],run:e.onToggleLadder}),e.onToggleAccount&&n.push({id:`account`,label:t(`toolbar.account`),parts:[`accountPanel`,`toolbar.accountPanel`],run:e.onToggleAccount}),n}var Ie=class e{button;menu=null;open=new Set;static create(t,n,r,i){let a=Fe(t,n);return a.length>0?new e(a,n,r,i):null}constructor(e,t,n,o){this.items=e,this.t=t,this.root=n;let s=document.createElement(`button`);s.type=`button`,s.className=`tcw-dropdown-trigger tcw-toolbar-overflow`,s.dataset.role=`trade`,s.dataset.icon=`trendingUp`,s.title=t(`toolbar.trade`),s.setAttribute(`aria-haspopup`,`menu`),s.setAttribute(`aria-expanded`,`false`),r.o(s,`toolbar.trade`),s.innerHTML=`${i.i(`trendingUp`,14)} <span class="tcw-trigger-label">${a.u(t(`toolbar.trade`))}</span> ${i.i(`chevronDown`,12)}`,s.addEventListener(`click`,()=>this.toggle(o(s))),this.button=s}tidy(){this.button.hidden=this.items.every(e=>this.isOff(e.parts))}setOpen(e,t){let n=Pe.find(t=>t===e);n&&(t?this.open.add(n):this.open.delete(n))}destroy(){this.menu?.destroy(),this.button.remove()}isOff(e){let t=new Set((this.root().getAttribute(`data-tcw-off`)??``).split(/\s+/).filter(Boolean));return e.some(e=>t.has(e))}toggle(e){if(this.menu?.isOpen()){this.menu.close();return}let t=this.items.filter(e=>!this.isOff(e.parts));if(t.length===0)return;let n=t.filter(e=>!Pe.includes(e.id)),r=t.filter(e=>Pe.includes(e.id)),i=[...n.map(e=>({id:e.id,label:e.label,icon:Ne[e.id]})),...n.length>0&&r.length>0?[`separator`]:[],...r.map(e=>({id:e.id,label:e.label,checked:this.open.has(e.id)}))],a=this.root();this.menu??=new o.f(a,this.t(`toolbar.trade`)),this.menu.openUnder(i,e,e=>{t.find(t=>t.id===e)?.run()})}},Le=0,b=`data-tcw-folded`,Re=1/64,ze=[`cut`],Be={T:`toolbar.timeframes.ticks`,s:`toolbar.timeframes.seconds`,m:`toolbar.timeframes.minutes`,h:`toolbar.timeframes.hours`,d:`toolbar.timeframes.days`,w:`toolbar.timeframes.weeks`,M:`toolbar.timeframes.months`};function Ve(e,t){let n=e.querySelector(`.tcw-host-btn-text`)?.textContent??``;n===t?e.removeAttribute(`aria-label`):e.setAttribute(`aria-label`,n?`${t}: ${n}`:t)}var He=class{config;callbacks;t;el;chartTypeDropdown=null;tfGroup=null;tfDropdown=null;tfFavorites=[];uid=(Le++).toString(36);tfRendered=``;themeBtn=null;fullscreenBtn=null;hostLeft=null;hostRight=null;moreMenu=null;tfCurrent=null;resizeObserver=null;hostObserver=null;moreBtn=null;fitFrame=0;destroyed=!1;undoBtn=null;redoBtn=null;trade=null;layoutShown=``;symbolShown=null;constructor(e,t,n,i,a){if(this.host=e,this.layer=a,this.config=t,this.callbacks=n,this.t=i,this.el=document.createElement(`div`),this.el.className=`tcw-toolbar`,r.o(this.el,`toolbar`),this.build(),e.appendChild(this.el),typeof ResizeObserver<`u`){this.resizeObserver=new ResizeObserver(()=>this.fit()),this.resizeObserver.observe(this.el),this.hostObserver=new ResizeObserver(()=>this.scheduleFit());for(let e of[this.hostLeft,this.hostRight])e&&this.hostObserver.observe(e)}document.fonts?.ready.then(()=>this.scheduleFit())}scheduleFit(){this.destroyed||this.fitFrame||typeof requestAnimationFrame>`u`||(this.fitFrame=requestAnimationFrame(()=>{this.fitFrame=0,this.destroyed||this.fit()}))}menuAnchor(e){return(e.hasAttribute(b)||this.el.closest(`[data-tcw-narrow]`)!==null)&&this.moreBtn?this.moreBtn:e}fit(){let e=this.toolbarFocus(),t=this.foldedState();this.refit(),this.foldedState()!==t&&this.closeStaleMenus(),e&&this.keepFocus(e)}refit(){let{el:e}=this,t=()=>this.fits(),n=[...e.querySelectorAll(`.tcw-toolbar-overflow`)];for(let e of n)e.removeAttribute(b);if(e.classList.remove(`tcw-toolbar--collapsed`,`tcw-toolbar--icons`),delete e.dataset.tcwSqueeze,!(e.clientWidth===0||t())){e.classList.add(`tcw-toolbar--collapsed`);for(let e=n.length-1;e>=0;e--)if(n[e].setAttribute(b,``),t())return;e.classList.add(`tcw-toolbar--icons`);for(let e of n)if(e.removeAttribute(b),!t()){e.setAttribute(b,``);break}for(let n of ze){if(t())return;e.dataset.tcwSqueeze=n}}}fits(){let{el:e}=this,t=e.getBoundingClientRect(),n=e.offsetWidth>0&&Math.abs(t.width-e.offsetWidth)>=1?t.width/e.offsetWidth:1,r=getComputedStyle(e),i=r.direction===`rtl`,a=e=>parseFloat(e)||0,o=t.width/n-(i?a(r.borderLeftWidth)+a(r.paddingLeft):a(r.borderRightWidth)+a(r.paddingRight)),s=0;for(let r of e.children){if(r.getClientRects().length===0)continue;let e=r.getBoundingClientRect();s=Math.max(s,(i?t.right-e.left:e.right-t.left)/n)}return s-o<=Re}foldedState(){let e=[...this.el.querySelectorAll(`.tcw-toolbar-overflow`)];return`${this.el.classList.contains(`tcw-toolbar--collapsed`)}:${e.map(e=>Number(e.hasAttribute(b))).join(``)}`}closeStaleMenus(){this.moreBtn&&o.f.closeAnchoredTo(this.moreBtn);for(let e of this.el.querySelectorAll(`[${b}], [${b}] button`))o.f.closeAnchoredTo(e)}toolbarFocus(){let e=o.f.focusedAnchor();if(e&&this.el.contains(e))return e;let t=document.activeElement;return t instanceof HTMLElement&&this.el.contains(t)?t:null}keepFocus(e){if(o.f.focusedAnchor())return;let t=e;this.shows(e)||(t=(this.moreBtn&&e!==this.moreBtn&&this.shows(this.moreBtn)?this.moreBtn:null)??this.overflowButtons().filter(e=>this.shows(e)).at(-1)),t&&document.activeElement!==t&&t.focus({preventScroll:!0})}overflowButtons(){return[...this.el.querySelectorAll(`button.tcw-toolbar-overflow, .tcw-toolbar-overflow button`)]}shows(e){if(e.closest(`[hidden]`)||e.closest(`[${b}]`)||this.isOff(e))return!1;let t=this.el.closest(`[data-tcw-narrow]`)!==null;return e===this.moreBtn?t||this.el.classList.contains(`tcw-toolbar--collapsed`):!(t&&e.closest(`.tcw-toolbar-overflow`))}isOff(e){let t=new Set((this.rootEl().getAttribute(`data-tcw-off`)??``).split(/\s+/).filter(Boolean));for(let n=e;n&&n!==this.el;n=n.parentElement)if((n.dataset.tcwPart??``).split(/\s+/).some(e=>t.has(e)))return!0;return!1}build(){let{config:e,callbacks:t,el:n}=this,o=document.createElement(`button`);if(o.className=`tcw-toolbar-symbol`,o.dataset.role=`symbol`,o.dir=`ltr`,r.o(o,`toolbar.symbol`),o.addEventListener(`click`,t.onSymbolClick),n.appendChild(o),t.onSymbolInfo){let e=this.iconBtn(`info`,this.t(`symbolInfo.title`),t.onSymbolInfo);e.classList.remove(`tcw-toolbar-overflow`),e.dataset.role=`symbolInfo`,r.o(e,`symbolInfo`,`toolbar.symbolInfo`),n.appendChild(e)}if(n.appendChild(this.sep()),this.tfFavorites=[...e.timeframeFavorites??e.timeframes.map(e=>e.value)],this.tfGroup=document.createElement(`div`),this.tfGroup.className=`tcw-toolbar-group tcw-tf-group`,r.o(this.tfGroup,`toolbar.timeframes`),n.appendChild(this.tfGroup),t.onToggleTimeframeFavorite&&e.timeframes.length>0){let e=document.createElement(`div`);e.style.position=`relative`,e.style.display=`inline-flex`,r.o(e,`toolbar.timeframeMenu`);let t=document.createElement(`button`);t.className=`tcw-btn tcw-tf-more`,t.dataset.role=`timeframes`,t.title=this.t(`toolbar.timeframes`),t.setAttribute(`aria-label`,this.t(`toolbar.timeframes`)),this.tfCurrent=document.createElement(`span`),this.tfCurrent.className=`tcw-tf-current`,t.appendChild(this.tfCurrent),t.insertAdjacentHTML(`beforeend`,i.i(`chevronDown`,12)),e.appendChild(t),n.appendChild(e),this.tfDropdown=new me(e,{width:`150px`,layer:this.layer}),n.classList.add(`tcw-toolbar--tf-menu`),this.buildTimeframeMenu()}n.appendChild(this.sep());let s=document.createElement(`div`);s.style.position=`relative`,s.style.display=`inline-flex`,r.o(s,`toolbar.chartType`);let c=document.createElement(`button`);c.className=`tcw-dropdown-trigger`,c.dataset.role=`charttype`,s.appendChild(c),n.appendChild(s),this.chartTypeDropdown=new me(s,{width:`160px`,layer:this.layer}),this.buildChartTypeMenu(),n.appendChild(this.sep());let l=document.createElement(`button`);if(l.type=`button`,l.className=`tcw-dropdown-trigger`,l.dataset.role=`indicators`,l.setAttribute(`aria-haspopup`,`dialog`),l.setAttribute(`aria-expanded`,`false`),r.o(l,`toolbar.indicators`),l.addEventListener(`click`,()=>t.onIndicators()),n.appendChild(l),t.onCompare){let e=document.createElement(`button`);e.type=`button`,e.className=`tcw-dropdown-trigger`,e.dataset.role=`compare`,r.o(e,`compare`,`toolbar.compare`);let o=this.t(`objects.compare`);e.setAttribute(`aria-label`,o),e.title=o,e.innerHTML=`${i.i(`plus`,14)} <span class="tcw-trigger-label">${a.u(o)}</span>`,e.addEventListener(`click`,t.onCompare),n.appendChild(e)}if(this.hostLeft=this.hostGroup(),n.appendChild(this.hostLeft),t.onUndo&&t.onRedo&&(n.appendChild(this.sep()),this.undoBtn=this.iconBtn(`undo`,this.t(`drawing.undo`),t.onUndo),this.undoBtn.dataset.role=`undo`,r.o(this.undoBtn,`toolbar.undo`,`sidebar.undo`),this.redoBtn=this.iconBtn(`redo`,this.t(`drawing.redo`),t.onRedo),this.redoBtn.dataset.role=`redo`,r.o(this.redoBtn,`toolbar.redo`,`sidebar.redo`),n.append(this.undoBtn,this.redoBtn),this.setHistory(!1,!1)),n.appendChild(this.spacer()),t.onLayouts){let e=t.onLayouts,i=document.createElement(`button`);i.type=`button`,i.className=`tcw-dropdown-trigger tcw-layouts-btn tcw-toolbar-overflow`,i.dataset.role=`layouts`,i.dataset.icon=`save`,r.o(i,`layouts`,`toolbar.layouts`),i.setAttribute(`aria-haspopup`,`menu`),i.addEventListener(`click`,()=>e(this.menuAnchor(i))),n.appendChild(i),this.setLayout(null,!1)}if(this.hostRight=this.hostGroup(),n.appendChild(this.hostRight),n.appendChild(this.sep()),t.onToggleReplay){let e=this.iconBtn(`play`,this.t(`toolbar.replay`),t.onToggleReplay);e.dataset.role=`replay`,r.o(e,`replay`,`toolbar.replay`),n.appendChild(e)}if(t.onToggleWatchlist){let e=this.iconBtn(`list`,this.t(`watchlist.title`),t.onToggleWatchlist);e.dataset.role=`watchlist`,e.setAttribute(`aria-pressed`,`false`),r.o(e,`dock.watchlist`),n.appendChild(e)}if(t.onToggleObjects){let e=this.iconBtn(`layers`,this.t(`toolbar.objects`),t.onToggleObjects);e.dataset.role=`objects`,e.setAttribute(`aria-pressed`,`false`),r.o(e,`objectTree`,`toolbar.objectTree`),n.appendChild(e)}if(t.onToggleAlerts){let e=this.iconBtn(`bell`,this.t(`toolbar.priceAlerts`),t.onToggleAlerts);e.dataset.role=`alerts`,e.setAttribute(`aria-pressed`,`false`),r.o(e,`alerts`,`toolbar.alerts`),n.appendChild(e)}this.trade=Ie.create(t,this.t,()=>this.rootEl(),e=>this.menuAnchor(e)),this.trade&&n.appendChild(this.trade.button),n.appendChild(this.sep());let u=this.iconBtn(`camera`,this.t(`toolbar.screenshot`),t.onScreenshot);r.o(u,`screenshot`,`toolbar.screenshot`),n.appendChild(u);let d=this.iconBtn(`settings`,this.t(`toolbar.settings`),t.onSettings);r.o(d,`settings`,`toolbar.settings`),n.appendChild(d),this.themeBtn=this.iconBtn(`moon`,this.t(`toolbar.toggleTheme`),t.onToggleTheme),this.themeBtn.dataset.role=`theme`,r.o(this.themeBtn,`themeToggle`,`toolbar.themeToggle`),n.appendChild(this.themeBtn),t.onToggleFullscreen&&(this.fullscreenBtn=this.iconBtn(`maximize`,this.t(`toolbar.fullscreen`),t.onToggleFullscreen),this.fullscreenBtn.dataset.role=`fullscreen`,r.o(this.fullscreenBtn,`fullscreen`,`toolbar.fullscreen`),this.fullscreenBtn.setAttribute(`aria-pressed`,`false`),n.appendChild(this.fullscreenBtn));let f=document.createElement(`button`);f.type=`button`,f.className=`tcw-btn-icon tcw-toolbar-more`,f.title=this.t(`toolbar.more`),f.setAttribute(`aria-haspopup`,`menu`),f.setAttribute(`aria-expanded`,`false`),f.innerHTML=i.i(`more`,16),f.addEventListener(`click`,()=>this.toggleMore(f)),n.appendChild(f),this.moreBtn=f}toggleMore(e){if(o.f.closeAnchoredTo(e))return;let t=this.rootEl(),n=this.el.closest(`[data-tcw-narrow]`)!==null,r=[];for(let e of this.el.querySelectorAll(`.tcw-toolbar-overflow`)){if(this.isOff(e)||!n&&!e.hasAttribute(b))continue;let t=e instanceof HTMLButtonElement?[e]:[...e.querySelectorAll(`button`)];r.push(...t.filter(e=>!e.hidden&&!e.disabled&&!this.isOff(e)))}if(r.length===0)return;let i=r.map((e,t)=>{let n=e.getAttribute(`aria-label`)||e.title||e.textContent?.trim()||``,r=e.getAttribute(`aria-pressed`);return r===null?{id:String(t),label:n,icon:e.dataset.icon}:{id:String(t),label:n,icon:e.dataset.icon,checked:r===`true`}});this.moreMenu??=new o.f(t,this.t(`toolbar.more`)),this.moreMenu.openUnder(i,e,e=>r[Number(e)]?.click(),`end`)}addHostButton(e){let t=document.createElement(`button`);t.type=`button`,t.className=`${e.text||!e.icon?`tcw-btn`:`tcw-btn-icon`} tcw-host-btn tcw-toolbar-overflow`,t.dataset.hostButton=e.id,typeof e.icon==`string`&&(t.dataset.icon=e.icon),t.title=e.label,e.toggle&&t.setAttribute(`aria-pressed`,`false`),typeof e.icon==`string`?t.innerHTML=i.i(e.icon,14):e.icon&&t.appendChild(e.icon);let n=e.text??(e.icon?``:e.label);if(n){let e=document.createElement(`span`);e.className=`tcw-host-btn-text`,e.textContent=n,t.appendChild(e)}return Ve(t,e.label),t.addEventListener(`click`,()=>e.onClick(t)),(e.side===`left`?this.hostLeft:this.hostRight)?.appendChild(t),this.scheduleFit(),t}hostSlot(e){return e===`left`?this.hostLeft:this.hostRight}hostGroup(){let e=document.createElement(`div`);return e.className=`tcw-toolbar-host`,e}setSymbolSearch(e){let t=this.el.querySelector(`[data-role="symbol"]`);t&&(e?t.removeAttribute(`aria-disabled`):t.setAttribute(`aria-disabled`,`true`))}tidy(){this.trade?.tidy(),r.d(this.el,`tcw-toolbar-sep`,`tcw-toolbar-spacer`),this.scheduleFit()}setHistory(e,t){this.undoBtn&&(this.undoBtn.disabled=!e),this.redoBtn&&(this.redoBtn.disabled=!t)}rootEl(){return this.el.closest(`.tcw-root`)??this.host}setActive(e,t){this.trade?.setOpen(e,t);let n=this.el.querySelector(`[data-role="${e}"]`);n&&(n.classList.toggle(`tcw-active`,t),n.setAttribute(`aria-pressed`,String(t)))}setRailed(e,t){let n=this.el.querySelector(`[data-role="${e}"]`);n&&(n.hidden=t)}setLayout(e,t){let n=this.el.querySelector(`[data-role="layouts"]`);if(!n)return;let r=e??this.t(`layouts.unnamed`);if(this.layoutShown===`${t}:${r}`)return;this.layoutShown=`${t}:${r}`;let o=`${this.t(`toolbar.layouts`)}: ${r}${t?` (${this.t(`layouts.unsavedChanges`)})`:``}`;n.innerHTML=`${i.i(`save`,14)}<span class="tcw-layouts-label">${a.u(r)}</span>`+(t?`<span class="tcw-layouts-dirty" aria-hidden="true"></span>`:``)+i.i(`chevronDown`,12),n.title=o,n.setAttribute(`aria-label`,o),this.scheduleFit()}setFullscreen(e){if(!this.fullscreenBtn)return;let t=this.t(e?`toolbar.exitFullscreen`:`toolbar.fullscreen`);this.fullscreenBtn.innerHTML=i.i(e?`minimize`:`maximize`,14),this.fullscreenBtn.title=t,this.fullscreenBtn.setAttribute(`aria-pressed`,String(e))}chartTypeLabel(e){return t.t(e,this.t)}buildChartTypeMenu(){if(!this.chartTypeDropdown)return;let e=this.config.chartTypes.map(e=>`<button class="tcw-dropdown-item tcw-dropdown-item--icon" data-ct="${a.u(e.value)}">${i.r(e.value,16)}<span>${a.u(this.chartTypeLabel(e))}</span></button>`).join(``);this.chartTypeDropdown.setContent(e),this.chartTypeDropdown.panel.querySelectorAll(`.tcw-dropdown-item`).forEach(e=>{e.addEventListener(`click`,e=>{let t=e.currentTarget.dataset.ct;this.callbacks.onChartType(t),this.chartTypeDropdown?.close()})})}setSymbolDescription(e){let t=this.el.querySelector(`[data-role="symbol"]`);t&&(e?t.title=e:t.removeAttribute(`title`))}setTimeframes(e,t){this.config={...this.config,timeframes:e},this.setTimeframeFavorites(t)}setTimeframeFavorites(e){this.tfFavorites=[...e],this.tfRendered=``,this.buildTimeframeMenu()}buildTimeframeMenu(){if(!this.tfDropdown)return;let e=a.u(this.t(`toolbar.timeframes.pin`)),t=a.u(this.t(`toolbar.timeframes.remove`)),n=``;for(let{unit:r,timeframes:o}of ke(this.config.timeframes)){n+=`<div class="tcw-tf-section" data-tf-section="${r}" role="group" aria-label="${a.u(this.t(Be[r]))}"><div class="tcw-dropdown-label">${a.u(this.t(Be[r]))}</div>`;for(let r of o){let o=this.tfFavorites.includes(r.value),[s,c]=[a.u(r.value),a.u(r.label)];n+=`<div class="tcw-tf-row"><button class="tcw-dropdown-item" data-tf-pick="${s}">${c}</button>`+(r.custom&&this.callbacks.onRemoveTimeframe?`<button class="tcw-tf-remove" data-tf-remove="${s}" title="${t}" aria-label="${t}: ${c}">${i.i(`x`,12)}</button>`:``)+`<button class="tcw-tf-star${o?` tcw-active`:``}" data-tf-star="${s}" aria-pressed="${o}" title="${e}" aria-label="${e}: ${c}">${i.i(`star`,12)}</button></div>`}n+=`</div>`}if(this.callbacks.onAddTimeframe){let e=a.u(this.t(`toolbar.timeframes.custom`)),t=a.u(this.t(`toolbar.timeframes.add`));n+=`<form class="tcw-tf-custom" ${r.c(`customTimeframes`)} novalidate><input class="tcw-tf-custom-input" type="text" autocomplete="off" spellcheck="false" maxlength="6" placeholder="7m, 90m, 2h…" aria-label="${e}" aria-describedby="tcw-tf-hint-${this.uid}"><button type="submit" class="tcw-tf-custom-add" title="${t}" aria-label="${t}">${i.i(`plus`,12)}</button><div class="tcw-tf-custom-hint" id="tcw-tf-hint-${this.uid}" role="status"></div></form>`}this.tfDropdown.setContent(n);let o=this.tfDropdown.panel;o.querySelectorAll(`[data-tf-pick]`).forEach(e=>{e.addEventListener(`click`,()=>this.callbacks.onTimeframe(e.dataset.tfPick))}),o.querySelectorAll(`[data-tf-star]`).forEach(e=>{e.addEventListener(`click`,t=>{t.stopPropagation(),this.callbacks.onToggleTimeframeFavorite?.(e.dataset.tfStar)})}),o.querySelectorAll(`[data-tf-remove]`).forEach(e=>{e.addEventListener(`click`,t=>{t.stopPropagation(),this.callbacks.onRemoveTimeframe?.(e.dataset.tfRemove)})});let s=o.querySelector(`.tcw-tf-custom`);s&&this.wireCustomTimeframe(s)}wireCustomTimeframe(e){let t=e.querySelector(`.tcw-tf-custom-input`),n=e.querySelector(`.tcw-tf-custom-hint`);e.addEventListener(`click`,e=>e.stopPropagation()),t.addEventListener(`input`,()=>{t.removeAttribute(`aria-invalid`),n.textContent=``}),e.addEventListener(`submit`,e=>{e.preventDefault(),e.stopPropagation(),this.callbacks.onAddTimeframe?.(t.value)?(t.value=``,n.textContent=``,this.tfDropdown?.close(),this.el.querySelector(`[data-role="timeframes"]`)?.focus()):(t.setAttribute(`aria-invalid`,`true`),n.textContent=this.t(`toolbar.timeframes.invalid`))})}renderTimeframes(e){if(!this.tfGroup)return;let t=this.config.timeframes.filter(t=>this.tfFavorites.includes(t.value)||t.value===e),n=`${t.map(e=>e.value).join(`,`)}|${e}`;n!==this.tfRendered&&(this.tfRendered=n,this.tfCurrent&&(this.tfCurrent.textContent=this.config.timeframes.find(t=>t.value===e)?.label??e),this.tfGroup.replaceChildren(...t.map(t=>{let n=document.createElement(`button`);return n.className=`tcw-btn`,n.textContent=t.label,n.dataset.tf=t.value,n.classList.toggle(`tcw-active`,t.value===e),n.addEventListener(`click`,()=>this.callbacks.onTimeframe(t.value)),n})),(this.tfDropdown?.panel)?.querySelectorAll(`[data-tf-pick]`).forEach(t=>{t.classList.toggle(`tcw-active`,t.dataset.tfPick===e)}))}setIndicatorsOpen(e){this.el.querySelector(`[data-role="indicators"]`)?.setAttribute(`aria-expanded`,String(e))}renderSymbol(e){let t=this.el.querySelector(`[data-role="symbol"]`);if(!t||this.symbolShown===e)return;this.symbolShown=e;let n=document.createElement(`span`);n.className=`tcw-toolbar-ticker`,n.textContent=a.c(e).ticker,t.replaceChildren(n),t.setAttribute(`aria-label`,e)}update(e){this.renderSymbol(e.symbol),this.renderTimeframes(e.timeframe);let t=this.el.querySelector(`[data-role="charttype"]`);if(t){let n=this.config.chartTypes.find(t=>t.value===e.chartType),r=n?this.chartTypeLabel(n):e.chartType;t.innerHTML=i.r(e.chartType,16),t.title=r,t.setAttribute(`aria-label`,r)}let n=this.el.querySelector(`[data-role="indicators"]`);if(n){let t=[...e.activeIndicators.values()].filter(e=>!d.SYMBOL_INDICATOR_IDS.has(e.id)).length,r=`${i.i(`trendingUp`,14)} <span class="tcw-trigger-label">${a.u(this.t(`toolbar.indicators`))}</span>`;n.setAttribute(`aria-label`,this.t(`toolbar.indicators`)),t>0&&(r+=` <span class="tcw-badge-count">${t}</span>`),n.innerHTML=r}if(this.themeBtn){let t=e.isDark?`moon`:`sun`;this.themeBtn.innerHTML=i.i(t,14),this.themeBtn.dataset.icon=t}this.scheduleFit()}sep(){let e=document.createElement(`span`);return e.className=`tcw-toolbar-sep`,e}spacer(){let e=document.createElement(`span`);return e.className=`tcw-toolbar-spacer`,e}iconBtn(e,t,n){let r=document.createElement(`button`);return r.className=`tcw-btn-icon tcw-toolbar-overflow`,r.dataset.icon=e,r.title=t,r.innerHTML=i.i(e,14),r.addEventListener(`click`,n),r}destroy(){this.destroyed=!0,this.resizeObserver?.disconnect(),this.hostObserver?.disconnect(),this.fitFrame&&cancelAnimationFrame(this.fitFrame),this.chartTypeDropdown?.destroy(),this.tfDropdown?.destroy(),this.moreMenu?.destroy(),this.trade?.destroy(),this.el.remove()}};function Ue(e,t,n){e.classList.toggle(`tcw-active`,t),n&&e.setAttribute(`aria-pressed`,String(t))}function We(e,t,n){let r=n==null?``:String(n),i=e.querySelector(`.tcw-host-btn-text`);return(i?.textContent??``)===r?!1:(i||(i=document.createElement(`span`),i.className=`tcw-host-btn-text`,e.appendChild(i)),i.textContent=r,Ve(e,t),!0)}var Ge=100,x=null,Ke=null,qe=0,Je=!1,S=new Set;function Ye(e){x&&(x.sources.set(e,e.version),e.subs.add(x))}function Xe(e){for(let t of[...e.subs])t.mark()}function Ze(e){for(let t of e.sources.keys())t.subs.delete(e),t instanceof tt&&t.subs.size===0&&t.release();e.sources.clear()}function Qe(e){for(let[t,n]of e.sources)if(t.refresh(),t.version!==n)return!0;return!1}function $e(e,t){Ze(e);let n=x;x=e;try{return t()}finally{x=n}}var et=class{version=0;subs=new Set;constructor(e){this.value=e}refresh(){}get(){return Ye(this),this.value}peek(){return this.value}set(e){Object.is(e,this.value)||(this.value=e,this.version++,ot(()=>Xe(this)))}update(e){this.set(e(this.value))}},tt=class{version=0;subs=new Set;sources=new Map;dirty=!0;value;computed=!1;constructor(e){this.fn=e}mark(){this.dirty||(this.dirty=!0,Xe(this))}refresh(){if(!this.dirty)return;if(this.computed&&!Qe(this)){this.dirty=!1;return}let e=$e(this,this.fn);this.dirty=!1,!(this.computed&&Object.is(e,this.value))&&(this.value=e,this.computed=!0,this.version++)}get(){return this.refresh(),Ye(this),this.value}peek(){return this.refresh(),this.value}release(){Ze(this),this.dirty=!0,this.computed=!1}},nt=class{sources=new Map;cleanup=void 0;disposed=!1;constructor(e){this.fn=e}mark(){this.disposed||S.add(this)}run(){let e=this.cleanup;this.cleanup=void 0,e?.(),this.cleanup=$e(this,this.fn)}runIfStale(){!this.disposed&&Qe(this)&&this.run()}dispose(){this.disposed||(this.disposed=!0,S.delete(this),Ze(this),this.cleanup?.(),this.cleanup=void 0)}};function rt(){if(Je)return;Je=!0;let e=0,t=null;try{for(;S.size>0;){if(++e>Ge)throw S.clear(),Error(`signals: an effect did not settle; it keeps changing what it reads`);let n=[...S];S.clear();for(let e of n)try{e.runIfStale()}catch(e){t??={error:e}}}}finally{Je=!1}if(t)throw t.error}function it(e){return new et(e)}function at(e){let t=new nt(e),n=()=>t.dispose();return Ke?.push(n),ot(()=>t.run()),n}function ot(e){qe++;try{return e()}finally{qe--,qe===0&&rt()}}function st(){let e=[];return{run(t){let n=Ke;Ke=e;try{return t()}finally{Ke=n}},dispose(){for(let t of e.splice(0))t()}}}var ct=`--tcw-tool-fit`;function lt({button:e,count:t,overflow:n,min:r}){return n<=0||t<=0||e<=r?null:Math.max(r,e-Math.ceil(n/t))}var ut=2;function dt(e){let t=parseFloat(getComputedStyle(e).getPropertyValue(`--tcw-icon`));return Number.isFinite(t)?t+2*ut:0}function ft(e){if(e.style.removeProperty(ct),e.clientHeight===0)return;let t=[...e.querySelectorAll(`.tcw-sidebar-btn`)].filter(e=>e.offsetHeight>0),n=lt({button:t[0]?.offsetHeight??0,count:t.length,overflow:e.scrollHeight-e.clientHeight,min:dt(e)});n!==null&&e.style.setProperty(ct,`${n}px`)}function pt(e){let t=0,n=null,r=()=>{t||typeof requestAnimationFrame>`u`||(t=requestAnimationFrame(()=>{t=0,!n&&o&&(n=e.closest(`.tcw-root`),n&&o.observe(n,{attributes:!0})),ft(e)}))},i=typeof ResizeObserver>`u`?null:new ResizeObserver(r);i?.observe(e);let a=typeof MutationObserver>`u`?null:new MutationObserver(r);a?.observe(e,{childList:!0,subtree:!0});let o=typeof MutationObserver>`u`?null:new MutationObserver(r),s=e.ownerDocument.defaultView;return s?.addEventListener(`resize`,r),r(),()=>{s?.removeEventListener(`resize`,r),t&&cancelAnimationFrame(t),i?.disconnect(),a?.disconnect(),o?.disconnect()}}var C=16,mt=150,ht=120,w=-2,gt=[{kind:`cross`,icon:`crosshairCursor`,label:`drawing.cursorCross`},{kind:`dot`,icon:`dotCursor`,label:`drawing.cursorDot`},{kind:`arrow`,icon:`cursor`,label:`drawing.cursorArrow`}],_t=4;function vt(e){let t=`sidebar.${e}`;return r.r.includes(t)?t:null}function yt(e,t){for(let n of e){let e=n.tools.find(e=>e.value===t);if(e)return e.label}return t}var bt=`--tcw-fab-plot-left`,xt=class{config;callbacks;el;groupWraps=[];groupButtons=[];groupIcons=[];groupTools=[];cursorBtn=null;cursorWrap=null;cursorKind=`cross`;magnetBtn=null;eraserBtn=null;zoomBtn=null;stayBtn=null;lockAllBtn=null;hideAllBtn=null;drawings={locked:!1,hidden:!1};flyoutEl=null;flyoutIdx=-1;flyoutHideTimer=null;flyoutSwitchTimer=null;flyoutByKey=!1;hostEl=null;favoritesEl=null;favoritesDivider=null;favorites=[];fab;fabShows=``;stopFit;onPressAway=e=>{let t=e.target;t&&(this.el.contains(t)||this.fab.contains(t)||this.flyoutEl?.contains(t))||this.setOpen(!1)};onEscape=e=>{e.key===`Escape`&&!this.flyoutEl&&this.setOpen(!1)};constructor(e,t,n,a=s.t){this.host=e,this.t=a,this.config=t,this.callbacks=n,this.el=document.createElement(`div`),this.el.className=`tcw-sidebar`,r.o(this.el,`sidebar`),this.build(),this.el.addEventListener(`scroll`,()=>this.hideFlyout(),{passive:!0}),e.appendChild(this.el),this.stopFit=pt(this.el),this.fab=document.createElement(`button`),this.fab.type=`button`,this.fab.className=`tcw-sidebar-fab`,this.fab.setAttribute(`aria-label`,this.t(`drawing.tools`)),this.fab.setAttribute(`aria-expanded`,`false`),this.fab.innerHTML=i.i(`penLine`,18),r.o(this.fab,`sidebar`),this.fab.addEventListener(`click`,()=>this.setOpen(!this.isOpen())),e.appendChild(this.fab)}setPlotLeft(e){let t=`${Math.max(0,Math.round(e))}px`;this.fab.style.getPropertyValue(bt)!==t&&this.fab.style.setProperty(bt,t)}isNarrow(){return this.el.closest(`[data-tcw-narrow]`)!==null}isOpen(){return this.el.classList.contains(`tcw-sidebar-open`)}setOpen(e){if(e!==this.isOpen())if(this.el.classList.toggle(`tcw-sidebar-open`,e),this.fab.setAttribute(`aria-expanded`,String(e)),e)document.addEventListener(`pointerdown`,this.onPressAway,!0),document.addEventListener(`keydown`,this.onEscape);else{let e=this.el.contains(document.activeElement)||!!this.flyoutEl?.contains(document.activeElement);this.hideFlyout(),document.removeEventListener(`pointerdown`,this.onPressAway,!0),document.removeEventListener(`keydown`,this.onEscape),e&&this.isNarrow()&&this.fab.focus({preventScroll:!0})}}closeOverlay(){this.setOpen(!1)}closeForChart(){this.isNarrow()&&this.setOpen(!1)}pick(e){this.callbacks.onDrawingTool(e),this.closeForChart()}build(){let{config:e,callbacks:t,el:n}=this;this.buildCursorButton(),n.appendChild(this.divider()),t.onToggleFavorite&&(this.favorites=[...e.favorites??[]],this.favoritesEl=document.createElement(`div`),this.favoritesEl.className=`tcw-sidebar-favorites`,r.o(this.favoritesEl,`sidebar.favorites`),n.appendChild(this.favoritesEl),this.favoritesDivider=this.divider(),r.o(this.favoritesDivider,`sidebar.favorites`),n.appendChild(this.favoritesDivider),this.renderFavorites());let a;e.drawingToolGroups.forEach((e,t)=>{if(!e.tools[0])return;e.section!==void 0&&a!==void 0&&e.section!==a&&this.appendDivider(),a=e.section;let o=document.createElement(`div`);o.className=`tcw-tool-group-wrap`;let s=vt(e.section);s&&r.o(o,s);let c=document.createElement(`button`);c.className=`tcw-sidebar-btn`;let l=e.tools[0].value;e.tools.length>1?c.setAttribute(`aria-label`,`${e.label}: ${e.tools[0].label}`):c.title=e.label;let u=document.createElement(`span`);if(u.className=`tcw-sidebar-icon`,u.innerHTML=i.a(l,C),c.appendChild(u),this.groupIcons.push(u),this.groupTools.push(l),e.tools.length>1){let e=document.createElement(`span`);e.className=`tcw-multi-dot`,c.appendChild(e)}c.addEventListener(`click`,()=>{if(this.isNarrow()&&e.tools.length>1){this.flyoutEl&&this.flyoutIdx===t?this.hideFlyout():this.showFlyout(t);return}this.pick(this.groupTools[t])}),o.appendChild(c),o.addEventListener(`mouseenter`,()=>{this.isNarrow()||this.aimFlyout(t,()=>this.showFlyout(t))}),o.addEventListener(`mouseleave`,()=>{this.isNarrow()||(this.cancelFlyoutSwitch(),this.scheduleHideFlyout())}),e.tools.length>1&&(c.setAttribute(`aria-haspopup`,`menu`),c.setAttribute(`aria-expanded`,`false`),c.addEventListener(`keydown`,e=>{e.key===`ArrowRight`||e.key===`ArrowDown`?(e.preventDefault(),this.showFlyout(t),this.flyoutByKey=!0,this.focusFlyoutItem(0)):e.key===`Escape`&&this.flyoutEl&&(e.stopPropagation(),this.hideFlyout())})),o.addEventListener(`focusout`,e=>{let t=e.relatedTarget;!o.contains(t)&&!this.flyoutEl?.contains(t)&&this.scheduleHideFlyout()}),n.appendChild(o),this.groupWraps.push(o),this.groupButtons.push(c)});let o=document.createElement(`div`);if(o.className=`tcw-sidebar-spacer`,n.appendChild(o),n.appendChild(this.divider()),t.onToggleStyle){let e=document.createElement(`button`);e.className=`tcw-sidebar-btn`,e.title=this.t(`drawing.style`),e.dataset.role=`style`,r.o(e,`sidebar.style`),e.innerHTML=i.i(`palette`,14);let a=t.onToggleStyle;e.addEventListener(`click`,()=>{a(),this.closeForChart()}),n.appendChild(e)}if(t.onToggleMagnet&&(this.magnetBtn=document.createElement(`button`),this.magnetBtn.className=`tcw-sidebar-btn`,this.magnetBtn.title=this.t(`drawing.magnet`),this.magnetBtn.innerHTML=i.i(`magnet`,14),this.magnetBtn.addEventListener(`click`,t.onToggleMagnet),r.o(this.magnetBtn,`sidebar.magnet`),n.appendChild(this.magnetBtn)),t.onToggleEraser){let e=t.onToggleEraser;this.eraserBtn=this.toggleButton(`eraser`,this.t(`drawing.eraser`),()=>{e(),this.closeForChart()}),r.o(this.eraserBtn,`sidebar.eraser`),n.appendChild(this.eraserBtn)}if(t.onToggleZoomArea){let e=t.onToggleZoomArea;this.zoomBtn=this.toggleButton(`zoomIn`,this.t(`drawing.zoomArea`),()=>{e(),this.closeForChart()}),r.o(this.zoomBtn,`sidebar.zoomArea`),n.appendChild(this.zoomBtn)}if(t.onToggleStayInDrawing&&(this.stayBtn=document.createElement(`button`),this.stayBtn.className=`tcw-sidebar-btn`,this.stayBtn.dataset.role=`stay`,this.stayBtn.title=this.t(`drawing.stay`),this.stayBtn.setAttribute(`aria-pressed`,`false`),this.stayBtn.innerHTML=i.i(`repeat`,14),this.stayBtn.addEventListener(`click`,t.onToggleStayInDrawing),r.o(this.stayBtn,`sidebar.stayInDrawing`),n.appendChild(this.stayBtn)),this.hostEl=document.createElement(`div`),this.hostEl.className=`tcw-sidebar-host`,n.appendChild(this.hostEl),this.appendDivider(),t.onLockAll){let e=t.onLockAll;this.lockAllBtn=this.toggleButton(`lock`,this.t(`drawing.lockAll`),()=>e(!this.drawings.locked)),this.lockAllBtn.dataset.role=`lockAll`,r.o(this.lockAllBtn,`sidebar.lockAll`),n.appendChild(this.lockAllBtn)}if(t.onHideAll){let e=t.onHideAll;this.hideAllBtn=this.toggleButton(`eyeOff`,this.t(`drawing.hideAll`),()=>e(!this.drawings.hidden)),this.hideAllBtn.dataset.role=`hideAll`,r.o(this.hideAllBtn,`sidebar.hideAll`),n.appendChild(this.hideAllBtn)}let s=document.createElement(`button`);s.className=`tcw-sidebar-btn tcw-danger`,s.title=this.t(`drawing.clearAll`),s.innerHTML=i.i(`trash`,14),s.setAttribute(`aria-haspopup`,`menu`),s.setAttribute(`aria-expanded`,`false`),s.addEventListener(`click`,()=>t.onClear(s)),r.o(s,`sidebar.clear`),n.appendChild(s)}setDrawingsState(e){if(!(e.locked===this.drawings.locked&&e.hidden===this.drawings.hidden)){this.drawings={...e};for(let[t,n]of[[this.lockAllBtn,e.locked],[this.hideAllBtn,e.hidden]])t?.setAttribute(`aria-pressed`,String(n)),t?.classList.toggle(`tcw-active`,n)}}setFavorites(e){this.favorites=[...e],this.renderFavorites();for(let e of this.flyoutEl?.querySelectorAll(`.tcw-flyout-row`)??[]){let t=this.favorites.includes(e.dataset.toolValue??``);e.classList.toggle(`tcw-flyout-faved`,t),e.querySelector(`[data-pin]`)?.setAttribute(`aria-pressed`,String(t))}}renderFavorites(){if(!this.favoritesEl)return;this.favoritesEl.replaceChildren();let e=this.favorites.length>0;this.favoritesEl.style.display=e?``:`none`,this.favoritesDivider&&(this.favoritesDivider.style.display=e?``:`none`);for(let e of this.favorites){let t=document.createElement(`button`);t.className=`tcw-sidebar-btn`,t.title=s.r(this.t(`sidebar.unpinHint`),{tool:yt(this.config.drawingToolGroups,e)}),t.dataset.toolValue=e,t.innerHTML=i.a(e,C),t.addEventListener(`click`,()=>this.pick(e)),t.addEventListener(`contextmenu`,t=>{t.preventDefault(),this.callbacks.onToggleFavorite?.(e)}),this.favoritesEl.appendChild(t)}}buildCursorButton(){let{callbacks:e}=this,t=document.createElement(`div`);t.className=`tcw-cursor-wrap`;let n=document.createElement(`button`);n.className=`tcw-sidebar-btn`,n.addEventListener(`click`,()=>{if(this.isNarrow()&&e.onCrosshairCursor){this.flyoutEl&&this.flyoutIdx===w?this.hideFlyout():this.showCursorFlyout();return}e.onCancelDrawing(),this.closeForChart()}),r.o(t,`sidebar.cursor`),t.appendChild(n),this.cursorBtn=n,this.cursorWrap=t,this.showCrosshairCursor(this.cursorKind),e.onCrosshairCursor&&(n.setAttribute(`aria-haspopup`,`menu`),n.setAttribute(`aria-expanded`,`false`),n.addEventListener(`keydown`,e=>{if(e.key===`Escape`&&this.flyoutEl){e.stopPropagation(),this.hideFlyout();return}e.key!==`ArrowRight`&&e.key!==`ArrowDown`||(e.preventDefault(),this.showCursorFlyout(),this.flyoutByKey=!0,this.focusFlyoutItem(0))}),t.addEventListener(`mouseenter`,()=>{this.isNarrow()||this.aimFlyout(w,()=>this.showCursorFlyout())}),t.addEventListener(`mouseleave`,()=>{this.isNarrow()||(this.cancelFlyoutSwitch(),this.scheduleHideFlyout())}),t.addEventListener(`focusout`,e=>{let n=e.relatedTarget;!t.contains(n)&&!this.flyoutEl?.contains(n)&&this.scheduleHideFlyout()})),this.el.appendChild(t)}showCrosshairCursor(e){this.cursorKind=e;let t=this.cursorBtn;if(!t)return;let n=gt.find(t=>t.kind===e)??gt[0];t.innerHTML=i.i(n.icon,14),this.callbacks.onCrosshairCursor?(t.removeAttribute(`title`),t.setAttribute(`aria-label`,`${this.t(`drawing.cursor`)}: ${this.t(n.label)}`)):t.title=this.t(`drawing.cursor`),this.flyoutEl?.querySelectorAll(`[data-cursor]`).forEach(t=>{let n=t.dataset.cursor===e;t.setAttribute(`aria-checked`,String(n)),t.classList.toggle(`tcw-active`,n)})}showCursorFlyout(){if(this.cancelHideFlyout(),this.flyoutEl&&this.flyoutIdx===w)return;this.hideFlyout();let e=document.createElement(`div`);e.className=`tcw-flyout`,e.setAttribute(`role`,`menu`),e.setAttribute(`aria-label`,this.t(`drawing.cursors`)),e.addEventListener(`keydown`,e=>this.onFlyoutKey(e,w));let t=document.createElement(`div`);t.className=`tcw-flyout-heading`,t.setAttribute(`role`,`presentation`),t.textContent=this.t(`drawing.cursors`),e.appendChild(t);for(let t of gt){let n=document.createElement(`div`);n.className=`tcw-flyout-row`,n.setAttribute(`role`,`none`);let r=document.createElement(`button`);r.className=`tcw-flyout-item`,r.setAttribute(`role`,`menuitemradio`),r.tabIndex=-1,r.dataset.cursor=t.kind,r.innerHTML=i.i(t.icon,C);let a=document.createElement(`span`);a.className=`tcw-flyout-name`,a.textContent=this.t(t.label),r.appendChild(a),r.addEventListener(`click`,()=>{this.hideFlyout(),this.callbacks.onCancelDrawing(),this.callbacks.onCrosshairCursor?.(t.kind),this.closeForChart()}),n.appendChild(r),e.appendChild(n)}this.openFlyout(e,w),this.showCrosshairCursor(this.cursorKind)}flyoutButton(e){return e===w?this.cursorBtn:this.groupButtons[e]??null}flyoutWrap(e){return e===w?this.cursorWrap:this.groupWraps[e]??null}aimFlyout(e,t){if(this.cancelFlyoutSwitch(),!this.flyoutEl||this.flyoutIdx===e){t();return}this.flyoutSwitchTimer=setTimeout(()=>{this.flyoutSwitchTimer=null,t()},ht)}cancelFlyoutSwitch(){this.flyoutSwitchTimer!==null&&(clearTimeout(this.flyoutSwitchTimer),this.flyoutSwitchTimer=null)}openFlyout(e,t){e.addEventListener(`mouseenter`,()=>{this.cancelHideFlyout(),this.cancelFlyoutSwitch()}),e.addEventListener(`mouseleave`,()=>this.scheduleHideFlyout()),e.addEventListener(`focusout`,n=>{let r=n.relatedTarget;!e.contains(r)&&!this.flyoutWrap(t)?.contains(r)&&this.scheduleHideFlyout()}),this.flyoutEl=e,this.flyoutIdx=t,this.flyoutByKey=!1,this.host.appendChild(e);let n=this.flyoutButton(t);n&&this.placeFlyout(e,n),n?.setAttribute(`aria-expanded`,`true`)}showFlyout(e){if(this.cancelHideFlyout(),this.flyoutEl&&this.flyoutIdx===e)return;let t=this.config.drawingToolGroups[e];if(!t||t.tools.length<=1){this.hideFlyout();return}this.hideFlyout();let n=document.createElement(`div`);if(n.className=`tcw-flyout`,n.setAttribute(`role`,`menu`),n.setAttribute(`aria-label`,t.label),n.addEventListener(`keydown`,t=>this.onFlyoutKey(t,e)),t.tools[0]?.heading===void 0){let e=document.createElement(`div`);e.className=`tcw-flyout-header`,e.textContent=t.label,n.appendChild(e)}let a=this.t(`drawing.pinFavorite`);for(let e of t.tools){if(e.heading!==void 0){let t=document.createElement(`div`);t.className=`tcw-flyout-heading`,t.setAttribute(`role`,`presentation`),t.textContent=e.heading,n.appendChild(t)}let t=document.createElement(`div`);t.className=`tcw-flyout-row`,t.setAttribute(`role`,`none`),t.dataset.toolValue=e.value;let o=document.createElement(`button`);o.className=`tcw-flyout-item`,o.setAttribute(`role`,`menuitem`),o.tabIndex=-1,o.innerHTML=i.a(e.value,C);let s=document.createElement(`span`);s.className=`tcw-flyout-name`,s.textContent=e.label,o.appendChild(s);let c=this.config.shortcuts?.[e.value];if(c){let e=document.createElement(`kbd`);e.className=`tcw-flyout-key`,e.textContent=c,r.o(e,`hotkeys`,`hotkeys.tools`),o.appendChild(e)}if(o.dataset.toolValue=e.value,o.addEventListener(`click`,()=>{this.hideFlyout(),this.pick(e.value)}),t.appendChild(o),this.callbacks.onToggleFavorite){let n=this.favorites.includes(e.value);t.classList.toggle(`tcw-flyout-faved`,n);let r=document.createElement(`button`);r.type=`button`,r.className=`tcw-flyout-pin`,r.dataset.pin=e.value,r.tabIndex=-1,r.title=a,r.setAttribute(`aria-label`,`${a}: ${e.label}`),r.setAttribute(`aria-pressed`,String(n)),r.innerHTML=i.i(`star`,12),r.addEventListener(`click`,t=>{t.stopPropagation(),this.callbacks.onToggleFavorite?.(e.value)}),t.appendChild(r),o.addEventListener(`contextmenu`,t=>{t.preventDefault(),this.callbacks.onToggleFavorite?.(e.value)})}n.appendChild(t)}this.openFlyout(n,e)}flyoutItems(){return this.flyoutEl?[...this.flyoutEl.querySelectorAll(`.tcw-flyout-item`)]:[]}focusFlyoutItem(e){let t=this.flyoutItems();t.length!==0&&t[(e+t.length)%t.length].focus()}onFlyoutKey(e,t){let n=this.flyoutItems(),r=n.indexOf(document.activeElement);switch(e.key){case`ArrowDown`:this.focusFlyoutItem(r+1);break;case`ArrowUp`:this.focusFlyoutItem(r-1);break;case`Home`:this.focusFlyoutItem(0);break;case`End`:this.focusFlyoutItem(n.length-1);break;case`Escape`:case`ArrowLeft`:e.stopPropagation(),this.hideFlyout(),this.flyoutButton(t)?.focus();break;case`Tab`:this.hideFlyout(),this.flyoutButton(t)?.focus();return;default:return}e.preventDefault()}placeFlyout(e,t){let n=this.host.getBoundingClientRect(),r=t.getBoundingClientRect(),i=this.el.getBoundingClientRect();e.style.maxHeight=`${Math.max(0,this.host.clientHeight-_t*2)}px`;let a=this.host.clientHeight-e.offsetHeight-_t;this.host.closest(`[dir]`)?.getAttribute(`dir`)===`rtl`?(e.style.left=``,e.style.right=`${n.right-i.left}px`):(e.style.right=``,e.style.left=`${i.right-n.left}px`),e.style.top=`${Math.max(0,Math.min(r.top-n.top,a))}px`}scheduleHideFlyout(){this.cancelHideFlyout(),this.flyoutHideTimer=setTimeout(()=>{this.flyoutHideTimer=null,this.hideFlyout()},mt)}cancelHideFlyout(){this.flyoutHideTimer!==null&&(clearTimeout(this.flyoutHideTimer),this.flyoutHideTimer=null)}hideFlyout(){this.cancelHideFlyout(),this.cancelFlyoutSwitch();let e=this.flyoutButton(this.flyoutIdx),t=this.flyoutByKey&&this.flyoutEl?.contains(document.activeElement)===!0;this.flyoutEl&&=(this.flyoutEl.remove(),null),e?.setAttribute(`aria-expanded`,`false`),this.flyoutIdx=-1,this.flyoutByKey=!1,t&&e?.focus()}update(e){this.cursorBtn&&this.cursorBtn.classList.toggle(`tcw-active`,e.activeTool===null);let t=e.activeTool??``;t!==this.fabShows&&(this.fabShows=t,this.fab.innerHTML=e.activeTool?i.a(e.activeTool,18):i.i(`penLine`,18)),this.fab.classList.toggle(`tcw-active`,e.activeTool!==null||e.eraser||e.zoomArea);let{drawingToolGroups:n}=this.config;for(let t=0;t<n.length;t++){let r=n[t].tools.some(t=>t.value===e.activeTool);this.groupButtons[t].classList.toggle(`tcw-active`,r),r&&e.activeTool&&e.activeTool!==this.groupTools[t]&&(this.groupTools[t]=e.activeTool,this.groupIcons[t].innerHTML=i.a(e.activeTool,C),n[t].tools.length>1&&this.groupButtons[t].setAttribute(`aria-label`,`${n[t].label}: ${yt(n,e.activeTool)}`))}if(this.flyoutEl&&this.flyoutEl.querySelectorAll(`.tcw-flyout-item`).forEach(t=>{let n=t;n.dataset.cursor||n.classList.toggle(`tcw-active`,n.dataset.toolValue===e.activeTool)}),this.magnetBtn){let t=e.magnetEnabled&&e.magnetStrong;this.magnetBtn.classList.toggle(`tcw-active`,e.magnetEnabled),this.magnetBtn.innerHTML=i.i(t?`magnetStrong`:`magnet`,14),this.magnetBtn.title=t?this.t(`drawing.magnetStrong`):e.magnetEnabled?this.t(`drawing.magnetOn`):this.t(`drawing.magnetOff`),this.magnetBtn.setAttribute(`aria-label`,this.magnetBtn.title)}for(let[t,n]of[[this.eraserBtn,e.eraser],[this.zoomBtn,e.zoomArea]])t&&(t.classList.toggle(`tcw-active`,n),t.setAttribute(`aria-pressed`,String(n)));this.stayBtn&&(this.stayBtn.classList.toggle(`tcw-active`,e.stayInDrawing),this.stayBtn.setAttribute(`aria-pressed`,String(e.stayInDrawing)))}addHostButton(e){let t=document.createElement(`button`);return t.type=`button`,t.className=`tcw-sidebar-btn tcw-host-btn`,t.dataset.hostButton=e.id,t.title=e.label,t.setAttribute(`aria-label`,e.label),e.toggle&&t.setAttribute(`aria-pressed`,`false`),typeof e.icon==`string`?t.innerHTML=i.i(e.icon,14):t.appendChild(e.icon),t.addEventListener(`click`,()=>e.onClick(t)),this.hostEl?.appendChild(t),this.tidy(),t}hostSlot(){return this.hostEl}tidy(){r.d(this.el,`tcw-sidebar-divider`,`tcw-sidebar-spacer`)}toggleButton(e,t,n){let r=document.createElement(`button`);return r.className=`tcw-sidebar-btn`,r.title=t,r.setAttribute(`aria-label`,t),r.setAttribute(`aria-pressed`,`false`),r.innerHTML=i.i(e,14),r.addEventListener(`click`,n),r}appendDivider(){this.el.lastElementChild?.classList.contains(`tcw-sidebar-divider`)||this.el.appendChild(this.divider())}divider(){let e=document.createElement(`div`);return e.className=`tcw-sidebar-divider`,e}destroy(){this.stopFit(),this.setOpen(!1),this.hideFlyout(),this.fab.remove(),this.el.remove()}},St=`data-tcw-folded`,Ct=`tcw-statusbar--folded`,wt=`tcw-statusbar--short-market`,Tt=1,Et=13,Dt=`goto`,Ot=`Alt+G`,kt=e=>e.goToKeys?e.goToKeys():Ot;function At(e,t){let n=document.createElement(`span`);return n.className=e,n.textContent=t,n}var jt=class{el;dotEl;messageEl;marketEl;hostLeft;hostRight;clockBtn=null;clockMenu=null;scaleBtns=null;scaleShown=``;marketShown=``;rightEl;rangeEl=null;presetBtns=[];moreBtn=null;goToBtn=null;rangeMenu=null;resizeObserver=null;fitFrame=0;destroyed=!1;constructor(e,t,n={}){this.host=e,this.extras=n,this.el=document.createElement(`div`),this.el.className=`tcw-statusbar`,r.o(this.el,`statusBar`),n.label&&(this.el.setAttribute(`role`,`group`),this.el.setAttribute(`aria-label`,n.label)),t&&this.el.appendChild(this.buildRange(t)),this.hostLeft=this.hostGroup(),this.el.appendChild(this.hostLeft);let i=document.createElement(`div`);i.className=`tcw-status-right`,this.rightEl=i,this.hostRight=this.hostGroup(),i.appendChild(this.hostRight);let a=document.createElement(`div`);a.className=`tcw-status-indicator`,r.o(a,`statusBar.connection`),this.dotEl=document.createElement(`span`),this.dotEl.className=`tcw-status-dot`,a.appendChild(this.dotEl),this.messageEl=document.createElement(`span`),a.appendChild(this.messageEl),this.marketEl=document.createElement(`span`),this.marketEl.className=`tcw-status-market`,this.marketEl.hidden=!0,r.o(this.marketEl,`statusBar.market`),i.appendChild(this.marketEl),i.appendChild(a),n.clock&&i.appendChild(this.buildClock(n.clock)),n.scale&&i.appendChild(this.buildScale(n.scale)),this.el.appendChild(i),e.appendChild(this.el),this.watchWidths(i)}watchWidths(e){if(typeof ResizeObserver<`u`){this.resizeObserver=new ResizeObserver(()=>this.scheduleFit());for(let t of[this.el,e,this.hostLeft])this.resizeObserver.observe(t)}document.fonts?.ready.then(()=>this.scheduleFit())}scheduleFit(){this.destroyed||this.fitFrame||typeof requestAnimationFrame>`u`||(this.fitFrame=requestAnimationFrame(()=>{this.fitFrame=0,this.destroyed||this.fit()}))}fit(){let e=this.foldedCount(),t=this.rangeFocus();this.refit(),this.foldedCount()!==e&&this.rangeMenu?.close(),this.keepFocus(t)}refit(){let e=this.foldSteps(),t=this.goToBtn?[...this.presetBtns,this.goToBtn]:this.presetBtns,n=n=>{let r=new Set(e.slice(0,n));for(let e of t)e.toggleAttribute(St,r.has(e));this.el.classList.toggle(Ct,n>0)};if(n(0),this.el.classList.remove(wt),this.el.clientWidth===0||this.fits())return;let r=0;for(;r<e.length;)if(n(++r),this.fits())return;if(!(this.marketEl.hidden||this.isOff(this.marketEl))){for(this.el.classList.add(wt);r>0;r--)if(n(r-1),!this.fits()){n(r);return}}}fits(){return this.rangeFits()&&this.rightFits()}rangeFits(){let e=this.rangeEl;return!e||e.scrollWidth<=e.clientWidth+Tt}rightFits(){if(this.rightEl.offsetParent!==this.el)return!0;let e=getComputedStyle(this.el),t=this.rightEl.offsetLeft;return(e.direction===`rtl`?(parseFloat(e.paddingLeft)||0)-t:t+this.rightEl.offsetWidth-(this.el.clientWidth-(parseFloat(e.paddingRight)||0)))<=Tt}foldedCount(){return this.rangeEl?.querySelectorAll(`[${St}]`).length??0}rangeFocus(){if(this.rangeMenu?.hasFocus())return this.moreBtn;let e=document.activeElement;return e instanceof HTMLElement&&this.rangeEl?.contains(e)?e:null}keepFocus(e){if(!e||this.rangeMenu?.isOpen())return;let t=this.focusAfterRefit(e);t===this.el?this.focusBar():document.activeElement!==t&&t.focus({preventScroll:!0})}focusAfterRefit(e){if(this.shows(e))return e;let t=this.presetBtns.filter(e=>this.shows(e)).at(-1);return[e===this.moreBtn?null:this.moreBtn,this.goToBtn,t].find(e=>e!=null&&this.shows(e))??this.firstOtherControl()??this.el}firstOtherControl(){return[...this.el.querySelectorAll(`button`)].filter(e=>!this.rangeEl?.contains(e)).find(e=>!e.disabled&&e.getClientRects().length>0)??null}focusBar(){if(document.activeElement===this.el)return;let e=()=>this.el.removeAttribute(`tabindex`);this.el.tabIndex=-1,this.el.addEventListener(`blur`,e,{once:!0}),this.el.focus({preventScroll:!0}),document.activeElement!==this.el&&(this.el.removeEventListener(`blur`,e),e())}shows(e){return e===this.moreBtn&&!this.el.classList.contains(Ct)?!1:!e.hasAttribute(St)&&!this.isOff(e)}foldSteps(){if(this.presetBtns.length===0||this.isOff(this.presetBtns[0]))return[];let e=[...this.presetBtns].reverse();return this.goToBtn&&e.push(this.goToBtn),e}isOff(e){let t=((this.el.closest(`.tcw-root`)??this.host).getAttribute(`data-tcw-off`)??``).split(/\s+/).filter(Boolean);return(e.dataset.tcwPart??``).split(/\s+/).some(e=>t.includes(e))}update(e){this.dotEl.className=`tcw-status-dot`,e.connectionState===`connected`?this.dotEl.classList.add(`tcw-connected`):e.connectionState===`error`&&this.dotEl.classList.add(`tcw-error`),this.messageEl.textContent=e.message}tick(){if(!this.clockBtn||!this.extras.clock)return;let{time:e,zone:t}=this.extras.clock.now(),n=`${e} ${t}`;this.clockBtn.textContent!==n&&(this.clockBtn.textContent=n)}setScale(e){let t=`${e.mode}|${e.auto}`;!this.scaleBtns||t===this.scaleShown||(this.scaleShown=t,this.scaleBtns.percent?.setAttribute(`aria-pressed`,String(e.mode===`percentage`)),this.scaleBtns.log?.setAttribute(`aria-pressed`,String(e.mode===`logarithmic`)),this.scaleBtns.auto?.setAttribute(`aria-pressed`,String(e.auto)))}setMarket(e,t,n=t){let r=`${e}|${t}|${n}`;if(r===this.marketShown)return;if(this.marketShown=r,this.marketEl.hidden=e===`always`,this.marketEl.dataset.state=e,e===`always`){this.marketEl.replaceChildren(),this.marketEl.removeAttribute(`title`);return}this.marketEl.title=t;let i=At(`tcw-status-market-short`,n);i.setAttribute(`aria-hidden`,`true`),this.marketEl.replaceChildren(At(`tcw-status-market-text`,t),i)}addHostItem(e){let t=e.onClick,n=t?document.createElement(`button`):document.createElement(`span`);return n.className=t?`tcw-status-host-item tcw-status-host-btn`:`tcw-status-host-item`,n.dataset.hostItem=e.id,n.dir=`auto`,n.textContent=e.text,e.label&&(n.title=e.label,t||n.setAttribute(`role`,`group`),e.label!==e.text&&n.setAttribute(`aria-label`,`${e.label}: ${e.text}`)),n instanceof HTMLButtonElement&&t&&(n.type=`button`,n.addEventListener(`click`,()=>t(n))),(e.side===`left`?this.hostLeft:this.hostRight).appendChild(n),n}hostSlot(e){return e===`left`?this.hostLeft:this.hostRight}destroy(){this.destroyed=!0,this.resizeObserver?.disconnect(),this.fitFrame&&cancelAnimationFrame(this.fitFrame),this.clockMenu?.destroy(),this.rangeMenu?.destroy(),this.el.remove()}buildClock(e){let t=document.createElement(`button`);return t.type=`button`,t.className=`tcw-status-clock`,t.dataset.role=`clock`,t.dir=`auto`,t.title=e.label,t.setAttribute(`aria-haspopup`,`menu`),r.o(t,`statusBar.clock`),t.addEventListener(`click`,()=>this.toggleZones(t,e)),this.clockBtn=t,this.tick(),t}toggleRangeMenu(e,t){if(this.rangeMenu?.isOpen()){this.rangeMenu.close();return}let n=e=>e.hasAttribute(St)&&!this.isOff(e),r=t.presets.filter((e,t)=>n(this.presetBtns[t])).map(e=>({id:e,label:t.presetLabels?.[e]??e}));if(this.goToBtn&&n(this.goToBtn)&&(r.length>0&&r.push(`separator`),r.push({id:Dt,label:t.goToLabel,icon:`calendar`,shortcut:kt(t)})),r.length===0)return;this.rangeMenu??=new o.f(this.host,t.groupLabel);let i=e.getBoundingClientRect(),a=this.host.getBoundingClientRect();this.rangeMenu.open(r,i.left-a.left,i.top-a.top,e=>e===Dt?t.onGoTo():t.onPreset(e),e,void 0,i.right-a.left)}toggleZones(e,t){if(this.clockMenu?.isOpen()){this.clockMenu.close();return}let{current:n,list:r}=t.options();this.clockMenu??=new o.f(this.host,t.label);let i=e.getBoundingClientRect(),a=this.host.getBoundingClientRect();this.clockMenu.open(r.map(e=>({id:e.value,label:e.label,checked:e.value===n})),i.left-a.left,i.top-a.top,e=>t.onPick(e),e,void 0,i.right-a.left)}buildScale(e){let t=document.createElement(`div`);t.className=`tcw-status-scale`,t.setAttribute(`role`,`group`),e.labels.group&&t.setAttribute(`aria-label`,e.labels.group),r.o(t,`statusBar.scale`);let n=(n,r,i)=>{let a=document.createElement(`button`);return a.type=`button`,a.className=`tcw-status-scale-btn`,a.dataset.scale=n,a.textContent=r,a.title=e.labels[n],a.setAttribute(`aria-label`,e.labels[n]),a.setAttribute(`aria-pressed`,`false`),a.addEventListener(`click`,i),t.appendChild(a),a};return this.scaleBtns={percent:n(`percent`,`%`,e.onPercent),...e.onLog?{log:n(`log`,e.texts?.log??`log`,e.onLog)}:{},auto:n(`auto`,e.texts?.auto??`auto`,e.onAuto)},t}hostGroup(){let e=document.createElement(`div`);return e.className=`tcw-status-host`,e}buildRange(e){let t=document.createElement(`div`);t.className=`tcw-range-bar`,t.setAttribute(`role`,`group`),t.setAttribute(`aria-label`,e.groupLabel);for(let n of e.presets){let i=document.createElement(`button`);i.type=`button`,i.className=`tcw-range-btn`,i.dataset.range=n,r.o(i,`statusBar.range`),i.textContent=e.presetLabels?.[n]??n,i.addEventListener(`click`,()=>e.onPreset(n)),t.appendChild(i),this.presetBtns.push(i)}let n=this.rangeIconBtn(`tcw-range-more`,`rangeMore`,`more`,e.moreLabel);r.o(n,`statusBar.range`),n.setAttribute(`aria-haspopup`,`menu`),n.setAttribute(`aria-expanded`,`false`),n.addEventListener(`click`,()=>this.toggleRangeMenu(n,e)),t.appendChild(n),this.moreBtn=n;let i=this.rangeIconBtn(`tcw-range-goto`,`goto`,`calendar`,e.goToLabel);r.o(i,`goToDate`,`statusBar.goToDate`);let a=()=>{let t=kt(e);i.title=t?`${e.goToLabel} (${t})`:e.goToLabel};return a(),i.addEventListener(`pointerover`,a),i.addEventListener(`focusin`,a),i.addEventListener(`click`,e.onGoTo),t.appendChild(i),this.goToBtn=i,this.rangeEl=t,t}rangeIconBtn(e,t,n,r){let a=document.createElement(`button`);return a.type=`button`,a.className=`tcw-range-btn ${e}`,a.dataset.role=t,a.title=r,a.setAttribute(`aria-label`,r),a.innerHTML=i.i(n,Et),a}},T=[],Mt=new Map,E=null,Nt=e=>{let t=e.target instanceof Node?e.target:null;t!==null&&T.some(e=>e.contains(t)||Mt.get(e)?.some(e=>e.contains(t)))||(E=null)};function Pt(e,t=[]){let n=()=>{E=e},r=[e,...t];for(let e of r)e.addEventListener(`pointerdown`,n,!0);return T.length===0&&document.addEventListener(`pointerdown`,Nt,!0),T.push(e),Mt.set(e,t),()=>{for(let e of r)e.removeEventListener(`pointerdown`,n,!0);let t=T.indexOf(e);t>=0&&T.splice(t,1),Mt.delete(e),T.length===0&&document.removeEventListener(`pointerdown`,Nt,!0),E===e&&(E=null)}}function D(e,t=!1){let n=E?.isConnected?E:null;if(!n){let e=document.activeElement;n=e?T.find(t=>t.contains(e))??null:null}return!n&&!t&&(n=T.find(e=>e.isConnected)??null),n!==null&&e.contains(n)}function O(){let e=document.activeElement;return!!e&&(e.tagName===`INPUT`||e.tagName===`TEXTAREA`||e.tagName===`SELECT`||e.isContentEditable)}function k(){let e=document.activeElement;return e instanceof Element&&e.closest(`[role="dialog"], [aria-modal="true"], [role="menu"]`)!==null}var Ft={selectHint:`Click a bar to start the replay`,random:`Random bar`,realtime:`Back to realtime`,play:`Play`,pause:`Pause`,stepBack:`Step back (Shift+←)`,stepForward:`Step forward (Shift+→)`,replay:`Replay`,position:`Replay position`,speed:`Speed`,step:`Step`,loading:`Loading chart...`,selectBar:`Select bar`,cancel:`Cancel`,rate:`{rate}×`,rateHint:`1× plays one bar a second`,playingAt:`Playing at {rate}`,pausedAt:`Paused at {time}`,endedAt:`Replay ended at {time}`},It=[.1,.2,.3,.5,1,2,3,5,10,20,30,50],Lt=[`full`,`compact`,`stack`],Rt=300,zt=2,Bt=[`random`,`stepBack`,`stepForward`,`seek`,`step`,`selectBar`],Vt=class{root=null;scrubber=null;timeLabel=null;playBtn=null;realtimeBtn=null;liveRegion=null;hintText=null;state=`stopped`;mode=`select`;ended=!1;pending=!1;total=0;rate=1;steps=[];step=`bar`;dir=`ltr`;formatRate;where=``;announceTimer=null;widths=new Map;labels;constructor(e,t={}){this.callbacks=e,this.labels={...Ft,...t},this.formatRate=e=>this.labels.rate.replace(`{rate}`,String(e))}mount(e,t){this.root||(this.total=Math.max(0,t.total),this.rate=t.rate??1,this.steps=t.steps??[],this.step=t.step??`bar`,this.dir=t.dir??`ltr`,t.formatRate&&(this.formatRate=t.formatRate),this.state=`paused`,this.mode=t.mode??`select`,this.root=document.createElement(`div`),this.root.className=`tcw-replay-bar`,r.o(this.root,`replay`),this.root.setAttribute(`role`,`group`),this.root.setAttribute(`aria-label`,this.labels.replay),this.root.dataset.fit=`full`,this.root.innerHTML=this.markup(),e.appendChild(this.root),this.wireEvents(),this.syncUi())}unmount(){this.announceTimer&&clearTimeout(this.announceTimer),this.announceTimer=null,this.root?.remove(),this.root=null,this.hintText=null,this.scrubber=null,this.timeLabel=null,this.playBtn=null,this.realtimeBtn=null,this.liveRegion=null,this.state=`stopped`,this.ended=!1,this.where=``}isMounted(){return this.root!==null}element(){return this.root}getMode(){return this.mode}setMode(e){let t=!!this.root?.contains(document.activeElement);this.mode=e,this.syncUi(),t&&(e===`replay`?(this.playBtn&&!this.playBtn.disabled?this.playBtn:this.realtimeBtn)?.focus():this.root?.querySelector(`[data-act="random"]`)?.focus())}setState(e){e!==this.state&&(this.state=e,this.syncUi(),this.mode===`replay`&&(e===`playing`?this.announce(this.labels.playingAt.replace(`{rate}`,this.formatRate(this.rate))):e===`paused`&&this.where&&this.announce(this.labels.pausedAt.replace(`{time}`,this.where))))}setEnded(e){this.ended!==e&&(this.ended=e,this.syncUi(),e&&this.where&&this.announce(this.labels.endedAt.replace(`{time}`,this.where)))}setPending(e){if(this.pending===e)return;this.pending=e;let t=document.activeElement;e&&t&&t!==this.playBtn&&this.root?.contains(t)&&Bt.includes(t.dataset.act??``)&&this.playBtn?.focus(),this.syncUi(),e&&this.mode===`replay`&&this.announce(this.labels.loading)}isPending(){return this.pending}setSteps(e,t){this.steps=e,this.step=t,this.widths.clear();let n=this.root?.querySelector(`[data-tcw="stepSlot"]`);n&&(n.innerHTML=this.stepMarkup(),this.wireStep(),this.syncUi())}setProgress(e,t,n){this.total=t;let r=n??`${Math.min(e+1,t)} / ${t}`,i=r!==this.where;if(this.where=r,this.scrubber){this.scrubber.max=String(Math.max(0,t-1)),this.scrubber.value=String(e),this.scrubber.setAttribute(`aria-valuetext`,r);let n=t>1?Math.min(e,t-1)/(t-1)*100:0;this.scrubber.style.setProperty(`--tcw-replay-done`,`${Number(n.toFixed(zt))}%`)}if(this.timeLabel){this.timeLabel.textContent=r;let e=Number.parseFloat(this.timeLabel.style.minInlineSize)||0;r.length>e&&(this.timeLabel.style.minInlineSize=`${r.length}ch`)}let a=this.scrubber!==null&&document.activeElement===this.scrubber;i&&this.mode===`replay`&&this.state!==`playing`&&!a&&this.announce(r)}setRoom(e){let t=this.root;if(t){for(let n of Lt)if(n===`stack`||this.widthIn(n)<=e){t.dataset.fit=n,this.orderFor(n);return}}}orderFor(e){let t=this.root,n=t?.querySelector(`.tcw-replay-timeline`),r=t?.querySelector(`.tcw-replay-transport`),i=this.realtimeBtn;if(!t||!n||!r||!i)return;let a=e===`stack`;if(a===(n.nextElementSibling===i))return;let o=document.activeElement;a?r.before(n,i):(r.nextElementSibling?.after(n),t.querySelector(`[data-act="cancel"]`)?.before(i)),o&&t.contains(o)&&document.activeElement!==o&&o.focus()}getFit(){return this.root?.dataset.fit??`full`}destroy(){this.unmount()}widthIn(e){let t=this.root,n=`${this.mode}|${this.steps.length}|${e}`,r=this.widths.get(n);if(r!==void 0)return r;let i=t.dataset.fit;t.dataset.fit=e,t.dataset.measure=``;let a=t.getBoundingClientRect().width;return delete t.dataset.measure,i&&(t.dataset.fit=i),a>0&&this.widths.set(n,a),a}markup(){let e=this.labels,t=`dir="${this.dir}"`,n=It.map(e=>`<option value="${e}"${e===this.rate?` selected`:``}>${a.u(this.formatRate(e))}</option>`).join(``),r=(e,t,n,r=`tcw-replay-btn`,i=``)=>`<button type="button" class="${r}" data-act="${e}" title="${a.u(t)}" aria-label="${a.u(t)}"${i}>${n}</button>`;return`
7900
+ ${r.f()}`,document.head.insertBefore(e,document.head.firstChild)}function pe(){if(ue--,ue>0)return;let e=document.getElementById(de);e&&e.remove()}var me=class{trigger;panel;_isOpen=!1;onOutsideClick;onEscapeKey;onTriggerClick;layer;align;onAway=()=>this.close();onScroll=e=>{e.target instanceof Node&&this.panel.contains(e.target)||this.close()};constructor(e,t={}){this.trigger=e,this.layer=t.layer??null,this.align=t.align??`left`,this.panel=document.createElement(`div`),this.panel.className=`tcw-dropdown`,this.panel.style.minWidth=t.width??`200px`,this.panel.style.display=`none`,this.layer?(this.layer().appendChild(this.panel),this.panel.addEventListener(`click`,()=>this.close())):(this.align===`right`?this.panel.style.insetInlineEnd=`0px`:this.panel.style.insetInlineStart=`0px`,e.style.position=`relative`,e.appendChild(this.panel)),this.onTriggerClick=()=>{this._isOpen?this.close():this.open()},this.onOutsideClick=e=>{let t=e.target;!this.trigger.contains(t)&&!this.panel.contains(t)&&this.close()},this.onEscapeKey=e=>{e.key===`Escape`&&this.close()},e.addEventListener(`click`,this.onTriggerClick)}setContent(e){this.panel.innerHTML=e}open(){if(!this._isOpen){if(this._isOpen=!0,this.layer){let e=this.layer();this.panel.parentElement!==e&&e.appendChild(this.panel)}this.panel.style.display=``,this.layer&&(this.place(),window.addEventListener(`resize`,this.onAway),document.addEventListener(`scroll`,this.onScroll,{capture:!0,passive:!0})),document.addEventListener(`pointerdown`,this.onOutsideClick),document.addEventListener(`keydown`,this.onEscapeKey)}}close(){this._isOpen&&(this._isOpen=!1,this.panel.style.display=`none`,document.removeEventListener(`pointerdown`,this.onOutsideClick),document.removeEventListener(`keydown`,this.onEscapeKey),window.removeEventListener(`resize`,this.onAway),document.removeEventListener(`scroll`,this.onScroll,{capture:!0}))}isOpen(){return this._isOpen}destroy(){this.close(),this.trigger.removeEventListener(`click`,this.onTriggerClick),this.panel.remove()}place(){_(this.panel,this.trigger,this.align)}},he=[`1m`,`3m`,`5m`,`15m`,`30m`,`1h`,`2h`,`4h`,`1d`,`1w`,`1M`],ge=[`1m`,`5m`,`15m`,`1h`,`4h`,`1d`],_e=6;function ve(e){let t=e.slice(-1);return t===`h`||t===`d`||t===`w`?e.slice(0,-1)+t.toUpperCase():e}var ye=e=>Number.isFinite((0,u.timeframeToMs)(e))||(0,u.tickBarCount)(e)!==null,be=(e,t)=>{let n=(0,u.tickBarCount)(e),r=(0,u.tickBarCount)(t);return n!==null||r!==null?n===null?1:r===null?-1:n-r:(0,u.timeframeToMs)(e)-(0,u.timeframeToMs)(t)};function xe(e,t){let n=t?.length?t:null,r=e?.length?e:n??he;return[...new Set(r)].filter(e=>ye(e)&&(!n||n.includes(e))).sort(be)}function Se(e,t,n=!1){if(t?.length)return e.filter(e=>t.includes(e));if(n)return[...e];let r=e.filter(e=>ge.includes(e));return r.length>0?r:e.slice(0,_e)}var Ce=9999,we={"":`m`,s:`s`,S:`s`,m:`m`,h:`h`,H:`h`,d:`d`,D:`d`,w:`w`,W:`w`,M:`M`},Te={s:[`m`,60],m:[`h`,60],h:[`d`,24]};function Ee(e){let t=/^(\d+)([a-zA-Z]?)$/.exec(e.trim());if(!t)return null;if(t[2]===`T`||t[2]===`t`){let e=`${Number(t[1])}T`;return Number(t[1])<=Ce&&(0,u.tickBarCount)(e)!==null?e:null}let n=Number(t[1]),r=we[t[2]];if(!r||!Number.isSafeInteger(n)||n<1)return null;for(let e=Te[r];e&&n%e[1]===0;e=Te[r])n/=e[1],r=e[0];if(n>Ce)return null;let i=`${n}${r}`;return(0,u.isTimeFrame)(i)?i:null}function De(e,t,n){let r=n?.length?n:null,i=t.filter(e=>ye(e)&&(!r||r.includes(e)));return[...new Set([...e,...i])].sort(be)}var Oe=[`T`,`s`,`m`,`h`,`d`,`w`,`M`];function ke(e){let t=e=>{let t=e.slice(-1);return Oe.includes(t)?t:`m`};return Oe.map(n=>({unit:n,timeframes:e.filter(e=>t(e.value)===n)})).filter(e=>e.timeframes.length>0)}var Ae=864e5,je=5/7;function Me(e){let t=(0,u.timeframeToMs)(e.current),n=(0,u.timeframeToMs)(e.chosen);if(!Number.isFinite(t)||!Number.isFinite(n)||!(e.width>0)||!(e.spanMs>0))return e.current;let r=n=>{if(n===t)return e.barsInSpan;if(n<Ae)return e.barsInSpan*t/n;let r=e.spanMs/n;return n===Ae?r*(e.dayShare??je):r},i=[...new Set([...e.available,e.current])].filter(e=>{let t=(0,u.timeframeToMs)(e);return Number.isFinite(t)&&t>=n}).sort(be);for(let t of i)if(r((0,u.timeframeToMs)(t))*2<=e.width)return t;return i[i.length-1]??e.current}var Ne={ticket:`receipt`,long:`trendingUp`,short:`trendingDown`,ladder:`ladder`,account:`layers`},Pe=[`ladder`,`account`];function Fe(e,t){let n=[];e.onOrderTicket&&n.push({id:`ticket`,label:t(`chartMenu.orderTicket`),parts:[`orderTicket`],run:e.onOrderTicket});let r=e.onBracket;return r&&(n.push({id:`long`,label:t(`toolbar.longBracket`),parts:[`bracketOrders`,`toolbar.bracketOrders`],run:()=>r(`buy`)}),n.push({id:`short`,label:t(`toolbar.shortBracket`),parts:[`bracketOrders`,`toolbar.bracketOrders`],run:()=>r(`sell`)})),e.onToggleLadder&&n.push({id:`ladder`,label:t(`toolbar.depthLadder`),parts:[`depthLadder`,`toolbar.depthLadder`],run:e.onToggleLadder}),e.onToggleAccount&&n.push({id:`account`,label:t(`toolbar.account`),parts:[`accountPanel`,`toolbar.accountPanel`],run:e.onToggleAccount}),n}var Ie=class e{button;menu=null;open=new Set;static create(t,n,r,i){let a=Fe(t,n);return a.length>0?new e(a,n,r,i):null}constructor(e,t,n,o){this.items=e,this.t=t,this.root=n;let s=document.createElement(`button`);s.type=`button`,s.className=`tcw-dropdown-trigger tcw-toolbar-overflow`,s.dataset.role=`trade`,s.dataset.icon=`trendingUp`,s.title=t(`toolbar.trade`),s.setAttribute(`aria-haspopup`,`menu`),s.setAttribute(`aria-expanded`,`false`),r.o(s,`toolbar.trade`),s.innerHTML=`${i.i(`trendingUp`,14)} <span class="tcw-trigger-label">${a.u(t(`toolbar.trade`))}</span> ${i.i(`chevronDown`,12)}`,s.addEventListener(`click`,()=>this.toggle(o(s))),this.button=s}tidy(){this.button.hidden=this.items.every(e=>this.isOff(e.parts))}setOpen(e,t){let n=Pe.find(t=>t===e);n&&(t?this.open.add(n):this.open.delete(n))}destroy(){this.menu?.destroy(),this.button.remove()}isOff(e){let t=new Set((this.root().getAttribute(`data-tcw-off`)??``).split(/\s+/).filter(Boolean));return e.some(e=>t.has(e))}toggle(e){if(this.menu?.isOpen()){this.menu.close();return}let t=this.items.filter(e=>!this.isOff(e.parts));if(t.length===0)return;let n=t.filter(e=>!Pe.includes(e.id)),r=t.filter(e=>Pe.includes(e.id)),i=[...n.map(e=>({id:e.id,label:e.label,icon:Ne[e.id]})),...n.length>0&&r.length>0?[`separator`]:[],...r.map(e=>({id:e.id,label:e.label,checked:this.open.has(e.id)}))],a=this.root();this.menu??=new o.f(a,this.t(`toolbar.trade`)),this.menu.openUnder(i,e,e=>{t.find(t=>t.id===e)?.run()})}},Le=0,b=`data-tcw-folded`,Re=1/64,ze=[`cut`],Be={T:`toolbar.timeframes.ticks`,s:`toolbar.timeframes.seconds`,m:`toolbar.timeframes.minutes`,h:`toolbar.timeframes.hours`,d:`toolbar.timeframes.days`,w:`toolbar.timeframes.weeks`,M:`toolbar.timeframes.months`};function Ve(e,t){let n=e.querySelector(`.tcw-host-btn-text`)?.textContent??``;n===t?e.removeAttribute(`aria-label`):e.setAttribute(`aria-label`,n?`${t}: ${n}`:t)}var He=class{config;callbacks;t;el;chartTypeDropdown=null;tfGroup=null;tfDropdown=null;tfFavorites=[];uid=(Le++).toString(36);tfRendered=``;themeBtn=null;fullscreenBtn=null;hostLeft=null;hostRight=null;moreMenu=null;tfCurrent=null;resizeObserver=null;hostObserver=null;moreBtn=null;fitFrame=0;destroyed=!1;undoBtn=null;redoBtn=null;trade=null;layoutShown=``;symbolShown=null;constructor(e,t,n,i,a){if(this.host=e,this.layer=a,this.config=t,this.callbacks=n,this.t=i,this.el=document.createElement(`div`),this.el.className=`tcw-toolbar`,r.o(this.el,`toolbar`),this.build(),e.appendChild(this.el),typeof ResizeObserver<`u`){this.resizeObserver=new ResizeObserver(()=>this.fit()),this.resizeObserver.observe(this.el),this.hostObserver=new ResizeObserver(()=>this.scheduleFit());for(let e of[this.hostLeft,this.hostRight])e&&this.hostObserver.observe(e)}document.fonts?.ready.then(()=>this.scheduleFit())}scheduleFit(){this.destroyed||this.fitFrame||typeof requestAnimationFrame>`u`||(this.fitFrame=requestAnimationFrame(()=>{this.fitFrame=0,this.destroyed||this.fit()}))}menuAnchor(e){return(e.hasAttribute(b)||this.el.closest(`[data-tcw-narrow]`)!==null)&&this.moreBtn?this.moreBtn:e}fit(){let e=this.toolbarFocus(),t=this.foldedState();this.refit(),this.foldedState()!==t&&this.closeStaleMenus(),e&&this.keepFocus(e)}refit(){let{el:e}=this,t=()=>this.fits(),n=[...e.querySelectorAll(`.tcw-toolbar-overflow`)];for(let e of n)e.removeAttribute(b);if(e.classList.remove(`tcw-toolbar--collapsed`,`tcw-toolbar--icons`),delete e.dataset.tcwSqueeze,!(e.clientWidth===0||t())){e.classList.add(`tcw-toolbar--collapsed`);for(let e=n.length-1;e>=0;e--)if(n[e].setAttribute(b,``),t())return;e.classList.add(`tcw-toolbar--icons`);for(let e of n)if(e.removeAttribute(b),!t()){e.setAttribute(b,``);break}for(let n of ze){if(t())return;e.dataset.tcwSqueeze=n}}}fits(){let{el:e}=this,t=e.getBoundingClientRect(),n=e.offsetWidth>0&&Math.abs(t.width-e.offsetWidth)>=1?t.width/e.offsetWidth:1,r=getComputedStyle(e),i=r.direction===`rtl`,a=e=>parseFloat(e)||0,o=t.width/n-(i?a(r.borderLeftWidth)+a(r.paddingLeft):a(r.borderRightWidth)+a(r.paddingRight)),s=0;for(let r of e.children){if(r.getClientRects().length===0)continue;let e=r.getBoundingClientRect();s=Math.max(s,(i?t.right-e.left:e.right-t.left)/n)}return s-o<=Re}foldedState(){let e=[...this.el.querySelectorAll(`.tcw-toolbar-overflow`)];return`${this.el.classList.contains(`tcw-toolbar--collapsed`)}:${e.map(e=>Number(e.hasAttribute(b))).join(``)}`}closeStaleMenus(){this.moreBtn&&o.f.closeAnchoredTo(this.moreBtn);for(let e of this.el.querySelectorAll(`[${b}], [${b}] button`))o.f.closeAnchoredTo(e)}toolbarFocus(){let e=o.f.focusedAnchor();if(e&&this.el.contains(e))return e;let t=document.activeElement;return t instanceof HTMLElement&&this.el.contains(t)?t:null}keepFocus(e){if(o.f.focusedAnchor())return;let t=e;this.shows(e)||(t=(this.moreBtn&&e!==this.moreBtn&&this.shows(this.moreBtn)?this.moreBtn:null)??this.overflowButtons().filter(e=>this.shows(e)).at(-1)),t&&document.activeElement!==t&&t.focus({preventScroll:!0})}overflowButtons(){return[...this.el.querySelectorAll(`button.tcw-toolbar-overflow, .tcw-toolbar-overflow button`)]}shows(e){if(e.closest(`[hidden]`)||e.closest(`[${b}]`)||this.isOff(e))return!1;let t=this.el.closest(`[data-tcw-narrow]`)!==null;return e===this.moreBtn?t||this.el.classList.contains(`tcw-toolbar--collapsed`):!(t&&e.closest(`.tcw-toolbar-overflow`))}isOff(e){let t=new Set((this.rootEl().getAttribute(`data-tcw-off`)??``).split(/\s+/).filter(Boolean));for(let n=e;n&&n!==this.el;n=n.parentElement)if((n.dataset.tcwPart??``).split(/\s+/).some(e=>t.has(e)))return!0;return!1}build(){let{config:e,callbacks:t,el:n}=this,o=document.createElement(`button`);if(o.className=`tcw-toolbar-symbol`,o.dataset.role=`symbol`,o.dir=`ltr`,r.o(o,`toolbar.symbol`),o.addEventListener(`click`,t.onSymbolClick),n.appendChild(o),t.onSymbolInfo){let e=this.iconBtn(`info`,this.t(`symbolInfo.title`),t.onSymbolInfo);e.classList.remove(`tcw-toolbar-overflow`),e.dataset.role=`symbolInfo`,r.o(e,`symbolInfo`,`toolbar.symbolInfo`),n.appendChild(e)}if(n.appendChild(this.sep()),this.tfFavorites=[...e.timeframeFavorites??e.timeframes.map(e=>e.value)],this.tfGroup=document.createElement(`div`),this.tfGroup.className=`tcw-toolbar-group tcw-tf-group`,r.o(this.tfGroup,`toolbar.timeframes`),n.appendChild(this.tfGroup),t.onToggleTimeframeFavorite&&e.timeframes.length>0){let e=document.createElement(`div`);e.style.position=`relative`,e.style.display=`inline-flex`,r.o(e,`toolbar.timeframeMenu`);let t=document.createElement(`button`);t.className=`tcw-btn tcw-tf-more`,t.dataset.role=`timeframes`,t.title=this.t(`toolbar.timeframes`),t.setAttribute(`aria-label`,this.t(`toolbar.timeframes`)),this.tfCurrent=document.createElement(`span`),this.tfCurrent.className=`tcw-tf-current`,t.appendChild(this.tfCurrent),t.insertAdjacentHTML(`beforeend`,i.i(`chevronDown`,12)),e.appendChild(t),n.appendChild(e),this.tfDropdown=new me(e,{width:`150px`,layer:this.layer}),n.classList.add(`tcw-toolbar--tf-menu`),this.buildTimeframeMenu()}n.appendChild(this.sep());let s=document.createElement(`div`);s.style.position=`relative`,s.style.display=`inline-flex`,r.o(s,`toolbar.chartType`);let c=document.createElement(`button`);c.className=`tcw-dropdown-trigger`,c.dataset.role=`charttype`,s.appendChild(c),n.appendChild(s),this.chartTypeDropdown=new me(s,{width:`160px`,layer:this.layer}),this.buildChartTypeMenu(),n.appendChild(this.sep());let l=document.createElement(`button`);if(l.type=`button`,l.className=`tcw-dropdown-trigger`,l.dataset.role=`indicators`,l.setAttribute(`aria-haspopup`,`dialog`),l.setAttribute(`aria-expanded`,`false`),r.o(l,`toolbar.indicators`),l.addEventListener(`click`,()=>t.onIndicators()),n.appendChild(l),t.onCompare){let e=document.createElement(`button`);e.type=`button`,e.className=`tcw-dropdown-trigger`,e.dataset.role=`compare`,r.o(e,`compare`,`toolbar.compare`);let o=this.t(`objects.compare`);e.setAttribute(`aria-label`,o),e.title=o,e.innerHTML=`${i.i(`plus`,14)} <span class="tcw-trigger-label">${a.u(o)}</span>`,e.addEventListener(`click`,t.onCompare),n.appendChild(e)}if(this.hostLeft=this.hostGroup(),n.appendChild(this.hostLeft),t.onUndo&&t.onRedo&&(n.appendChild(this.sep()),this.undoBtn=this.iconBtn(`undo`,this.t(`drawing.undo`),t.onUndo),this.undoBtn.dataset.role=`undo`,r.o(this.undoBtn,`toolbar.undo`,`sidebar.undo`),this.redoBtn=this.iconBtn(`redo`,this.t(`drawing.redo`),t.onRedo),this.redoBtn.dataset.role=`redo`,r.o(this.redoBtn,`toolbar.redo`,`sidebar.redo`),n.append(this.undoBtn,this.redoBtn),this.setHistory(!1,!1)),n.appendChild(this.spacer()),t.onLayouts){let e=t.onLayouts,i=document.createElement(`button`);i.type=`button`,i.className=`tcw-dropdown-trigger tcw-layouts-btn tcw-toolbar-overflow`,i.dataset.role=`layouts`,i.dataset.icon=`save`,r.o(i,`layouts`,`toolbar.layouts`),i.setAttribute(`aria-haspopup`,`menu`),i.addEventListener(`click`,()=>e(this.menuAnchor(i))),n.appendChild(i),this.setLayout(null,!1)}if(this.hostRight=this.hostGroup(),n.appendChild(this.hostRight),n.appendChild(this.sep()),t.onToggleReplay){let e=this.iconBtn(`play`,this.t(`toolbar.replay`),t.onToggleReplay);e.dataset.role=`replay`,r.o(e,`replay`,`toolbar.replay`),n.appendChild(e)}if(t.onToggleWatchlist){let e=this.iconBtn(`list`,this.t(`watchlist.title`),t.onToggleWatchlist);e.dataset.role=`watchlist`,e.setAttribute(`aria-pressed`,`false`),r.o(e,`dock.watchlist`),n.appendChild(e)}if(t.onToggleObjects){let e=this.iconBtn(`layers`,this.t(`toolbar.objects`),t.onToggleObjects);e.dataset.role=`objects`,e.setAttribute(`aria-pressed`,`false`),r.o(e,`objectTree`,`toolbar.objectTree`),n.appendChild(e)}if(t.onToggleAlerts){let e=this.iconBtn(`bell`,this.t(`toolbar.priceAlerts`),t.onToggleAlerts);e.dataset.role=`alerts`,e.setAttribute(`aria-pressed`,`false`),r.o(e,`alerts`,`toolbar.alerts`),n.appendChild(e)}this.trade=Ie.create(t,this.t,()=>this.rootEl(),e=>this.menuAnchor(e)),this.trade&&n.appendChild(this.trade.button),n.appendChild(this.sep());let u=this.iconBtn(`camera`,this.t(`toolbar.screenshot`),t.onScreenshot);r.o(u,`screenshot`,`toolbar.screenshot`),n.appendChild(u);let d=this.iconBtn(`settings`,this.t(`toolbar.settings`),t.onSettings);r.o(d,`settings`,`toolbar.settings`),n.appendChild(d),this.themeBtn=this.iconBtn(`moon`,this.t(`toolbar.toggleTheme`),t.onToggleTheme),this.themeBtn.dataset.role=`theme`,r.o(this.themeBtn,`themeToggle`,`toolbar.themeToggle`),n.appendChild(this.themeBtn),t.onToggleFullscreen&&(this.fullscreenBtn=this.iconBtn(`maximize`,this.t(`toolbar.fullscreen`),t.onToggleFullscreen),this.fullscreenBtn.dataset.role=`fullscreen`,r.o(this.fullscreenBtn,`fullscreen`,`toolbar.fullscreen`),this.fullscreenBtn.setAttribute(`aria-pressed`,`false`),n.appendChild(this.fullscreenBtn));let f=document.createElement(`button`);f.type=`button`,f.className=`tcw-btn-icon tcw-toolbar-more`,f.title=this.t(`toolbar.more`),f.setAttribute(`aria-haspopup`,`menu`),f.setAttribute(`aria-expanded`,`false`),f.innerHTML=i.i(`more`,16),f.addEventListener(`click`,()=>this.toggleMore(f)),n.appendChild(f),this.moreBtn=f}toggleMore(e){if(o.f.closeAnchoredTo(e))return;let t=this.rootEl(),n=this.el.closest(`[data-tcw-narrow]`)!==null,r=[];for(let e of this.el.querySelectorAll(`.tcw-toolbar-overflow`)){if(this.isOff(e)||!n&&!e.hasAttribute(b))continue;let t=e instanceof HTMLButtonElement?[e]:[...e.querySelectorAll(`button`)];r.push(...t.filter(e=>!e.hidden&&!e.disabled&&!this.isOff(e)))}if(r.length===0)return;let i=r.map((e,t)=>{let n=e.getAttribute(`aria-label`)||e.title||e.textContent?.trim()||``,r=e.getAttribute(`aria-pressed`);return r===null?{id:String(t),label:n,icon:e.dataset.icon}:{id:String(t),label:n,icon:e.dataset.icon,checked:r===`true`}});this.moreMenu??=new o.f(t,this.t(`toolbar.more`)),this.moreMenu.openUnder(i,e,e=>r[Number(e)]?.click(),`end`)}addHostButton(e){let t=document.createElement(`button`);t.type=`button`,t.className=`${e.text||!e.icon?`tcw-btn`:`tcw-btn-icon`} tcw-host-btn tcw-toolbar-overflow`,t.dataset.hostButton=e.id,typeof e.icon==`string`&&(t.dataset.icon=e.icon),t.title=e.label,e.toggle&&t.setAttribute(`aria-pressed`,`false`),typeof e.icon==`string`?t.innerHTML=i.i(e.icon,14):e.icon&&t.appendChild(e.icon);let n=e.text??(e.icon?``:e.label);if(n){let e=document.createElement(`span`);e.className=`tcw-host-btn-text`,e.textContent=n,t.appendChild(e)}return Ve(t,e.label),t.addEventListener(`click`,()=>e.onClick(t)),(e.side===`left`?this.hostLeft:this.hostRight)?.appendChild(t),this.scheduleFit(),t}hostSlot(e){return e===`left`?this.hostLeft:this.hostRight}hostGroup(){let e=document.createElement(`div`);return e.className=`tcw-toolbar-host`,e}setSymbolSearch(e){let t=this.el.querySelector(`[data-role="symbol"]`);t&&(e?t.removeAttribute(`aria-disabled`):t.setAttribute(`aria-disabled`,`true`))}tidy(){this.trade?.tidy(),r.d(this.el,`tcw-toolbar-sep`,`tcw-toolbar-spacer`),this.scheduleFit()}setHistory(e,t){this.undoBtn&&(this.undoBtn.disabled=!e),this.redoBtn&&(this.redoBtn.disabled=!t)}rootEl(){return this.el.closest(`.tcw-root`)??this.host}setActive(e,t){this.trade?.setOpen(e,t);let n=this.el.querySelector(`[data-role="${e}"]`);n&&(n.classList.toggle(`tcw-active`,t),n.setAttribute(`aria-pressed`,String(t)))}setRailed(e,t){let n=this.el.querySelector(`[data-role="${e}"]`);n&&(n.hidden=t)}setLayout(e,t){let n=this.el.querySelector(`[data-role="layouts"]`);if(!n)return;let r=e??this.t(`layouts.unnamed`);if(this.layoutShown===`${t}:${r}`)return;this.layoutShown=`${t}:${r}`;let o=`${this.t(`toolbar.layouts`)}: ${r}${t?` (${this.t(`layouts.unsavedChanges`)})`:``}`;n.innerHTML=`${i.i(`save`,14)}<span class="tcw-layouts-label">${a.u(r)}</span>`+(t?`<span class="tcw-layouts-dirty" aria-hidden="true"></span>`:``)+i.i(`chevronDown`,12),n.title=o,n.setAttribute(`aria-label`,o),this.scheduleFit()}setFullscreen(e){if(!this.fullscreenBtn)return;let t=this.t(e?`toolbar.exitFullscreen`:`toolbar.fullscreen`);this.fullscreenBtn.innerHTML=i.i(e?`minimize`:`maximize`,14),this.fullscreenBtn.title=t,this.fullscreenBtn.setAttribute(`aria-pressed`,String(e))}chartTypeLabel(e){return t.t(e,this.t)}buildChartTypeMenu(){if(!this.chartTypeDropdown)return;let e=this.config.chartTypes.map(e=>`<button class="tcw-dropdown-item tcw-dropdown-item--icon" data-ct="${a.u(e.value)}">${i.r(e.value,16)}<span>${a.u(this.chartTypeLabel(e))}</span></button>`).join(``);this.chartTypeDropdown.setContent(e),this.chartTypeDropdown.panel.querySelectorAll(`.tcw-dropdown-item`).forEach(e=>{e.addEventListener(`click`,e=>{let t=e.currentTarget.dataset.ct;this.callbacks.onChartType(t),this.chartTypeDropdown?.close()})})}setSymbolDescription(e){let t=this.el.querySelector(`[data-role="symbol"]`);t&&(e?t.title=e:t.removeAttribute(`title`))}setTimeframes(e,t){this.config={...this.config,timeframes:e},this.setTimeframeFavorites(t)}setTimeframeFavorites(e){this.tfFavorites=[...e],this.tfRendered=``,this.buildTimeframeMenu()}buildTimeframeMenu(){if(!this.tfDropdown)return;let e=a.u(this.t(`toolbar.timeframes.pin`)),t=a.u(this.t(`toolbar.timeframes.remove`)),n=``;for(let{unit:r,timeframes:o}of ke(this.config.timeframes)){n+=`<div class="tcw-tf-section" data-tf-section="${r}" role="group" aria-label="${a.u(this.t(Be[r]))}"><div class="tcw-dropdown-label">${a.u(this.t(Be[r]))}</div>`;for(let r of o){let o=this.tfFavorites.includes(r.value),[s,c]=[a.u(r.value),a.u(r.label)];n+=`<div class="tcw-tf-row"><button class="tcw-dropdown-item" data-tf-pick="${s}">${c}</button>`+(r.custom&&this.callbacks.onRemoveTimeframe?`<button class="tcw-tf-remove" data-tf-remove="${s}" title="${t}" aria-label="${t}: ${c}">${i.i(`x`,12)}</button>`:``)+`<button class="tcw-tf-star${o?` tcw-active`:``}" data-tf-star="${s}" aria-pressed="${o}" title="${e}" aria-label="${e}: ${c}">${i.i(`star`,12)}</button></div>`}n+=`</div>`}if(this.callbacks.onAddTimeframe){let e=a.u(this.t(`toolbar.timeframes.custom`)),t=a.u(this.t(`toolbar.timeframes.add`));n+=`<form class="tcw-tf-custom" ${r.c(`customTimeframes`)} novalidate><input class="tcw-tf-custom-input" type="text" autocomplete="off" spellcheck="false" maxlength="6" placeholder="7m, 90m, 2h…" aria-label="${e}" aria-describedby="tcw-tf-hint-${this.uid}"><button type="submit" class="tcw-tf-custom-add" title="${t}" aria-label="${t}">${i.i(`plus`,12)}</button><div class="tcw-tf-custom-hint" id="tcw-tf-hint-${this.uid}" role="status"></div></form>`}this.tfDropdown.setContent(n);let o=this.tfDropdown.panel;o.querySelectorAll(`[data-tf-pick]`).forEach(e=>{e.addEventListener(`click`,()=>this.callbacks.onTimeframe(e.dataset.tfPick))}),o.querySelectorAll(`[data-tf-star]`).forEach(e=>{e.addEventListener(`click`,t=>{t.stopPropagation(),this.callbacks.onToggleTimeframeFavorite?.(e.dataset.tfStar)})}),o.querySelectorAll(`[data-tf-remove]`).forEach(e=>{e.addEventListener(`click`,t=>{t.stopPropagation(),this.callbacks.onRemoveTimeframe?.(e.dataset.tfRemove)})});let s=o.querySelector(`.tcw-tf-custom`);s&&this.wireCustomTimeframe(s)}wireCustomTimeframe(e){let t=e.querySelector(`.tcw-tf-custom-input`),n=e.querySelector(`.tcw-tf-custom-hint`);e.addEventListener(`click`,e=>e.stopPropagation()),t.addEventListener(`input`,()=>{t.removeAttribute(`aria-invalid`),n.textContent=``}),e.addEventListener(`submit`,e=>{e.preventDefault(),e.stopPropagation(),this.callbacks.onAddTimeframe?.(t.value)?(t.value=``,n.textContent=``,this.tfDropdown?.close(),this.el.querySelector(`[data-role="timeframes"]`)?.focus()):(t.setAttribute(`aria-invalid`,`true`),n.textContent=this.t(`toolbar.timeframes.invalid`))})}renderTimeframes(e){if(!this.tfGroup)return;let t=this.config.timeframes.filter(t=>this.tfFavorites.includes(t.value)||t.value===e),n=`${t.map(e=>e.value).join(`,`)}|${e}`;n!==this.tfRendered&&(this.tfRendered=n,this.tfCurrent&&(this.tfCurrent.textContent=this.config.timeframes.find(t=>t.value===e)?.label??e),this.tfGroup.replaceChildren(...t.map(t=>{let n=document.createElement(`button`);return n.className=`tcw-btn`,n.textContent=t.label,n.dataset.tf=t.value,n.classList.toggle(`tcw-active`,t.value===e),n.addEventListener(`click`,()=>this.callbacks.onTimeframe(t.value)),n})),(this.tfDropdown?.panel)?.querySelectorAll(`[data-tf-pick]`).forEach(t=>{t.classList.toggle(`tcw-active`,t.dataset.tfPick===e)}))}setIndicatorsOpen(e){this.el.querySelector(`[data-role="indicators"]`)?.setAttribute(`aria-expanded`,String(e))}renderSymbol(e){let t=this.el.querySelector(`[data-role="symbol"]`);if(!t||this.symbolShown===e)return;this.symbolShown=e;let n=document.createElement(`span`);n.className=`tcw-toolbar-ticker`,n.textContent=a.c(e).ticker,t.replaceChildren(n),t.setAttribute(`aria-label`,e)}update(e){this.renderSymbol(e.symbol),this.renderTimeframes(e.timeframe);let t=this.el.querySelector(`[data-role="charttype"]`);if(t){let n=this.config.chartTypes.find(t=>t.value===e.chartType),r=n?this.chartTypeLabel(n):e.chartType;t.innerHTML=i.r(e.chartType,16),t.title=r,t.setAttribute(`aria-label`,r)}let n=this.el.querySelector(`[data-role="indicators"]`);if(n){let t=[...e.activeIndicators.values()].filter(e=>!d.SYMBOL_INDICATOR_IDS.has(e.id)).length,r=`${i.i(`trendingUp`,14)} <span class="tcw-trigger-label">${a.u(this.t(`toolbar.indicators`))}</span>`;n.setAttribute(`aria-label`,this.t(`toolbar.indicators`)),t>0&&(r+=` <span class="tcw-badge-count">${t}</span>`),n.innerHTML=r}if(this.themeBtn){let t=e.isDark?`moon`:`sun`;this.themeBtn.innerHTML=i.i(t,14),this.themeBtn.dataset.icon=t}this.scheduleFit()}sep(){let e=document.createElement(`span`);return e.className=`tcw-toolbar-sep`,e}spacer(){let e=document.createElement(`span`);return e.className=`tcw-toolbar-spacer`,e}iconBtn(e,t,n){let r=document.createElement(`button`);return r.className=`tcw-btn-icon tcw-toolbar-overflow`,r.dataset.icon=e,r.title=t,r.innerHTML=i.i(e,14),r.addEventListener(`click`,n),r}destroy(){this.destroyed=!0,this.resizeObserver?.disconnect(),this.hostObserver?.disconnect(),this.fitFrame&&cancelAnimationFrame(this.fitFrame),this.chartTypeDropdown?.destroy(),this.tfDropdown?.destroy(),this.moreMenu?.destroy(),this.trade?.destroy(),this.el.remove()}};function Ue(e,t,n){e.classList.toggle(`tcw-active`,t),n&&e.setAttribute(`aria-pressed`,String(t))}function We(e,t,n){let r=n==null?``:String(n),i=e.querySelector(`.tcw-host-btn-text`);return(i?.textContent??``)===r?!1:(i||(i=document.createElement(`span`),i.className=`tcw-host-btn-text`,e.appendChild(i)),i.textContent=r,Ve(e,t),!0)}var Ge=100,x=null,Ke=null,qe=0,Je=!1,S=new Set;function Ye(e){x&&(x.sources.set(e,e.version),e.subs.add(x))}function Xe(e){for(let t of[...e.subs])t.mark()}function Ze(e){for(let t of e.sources.keys())t.subs.delete(e),t instanceof tt&&t.subs.size===0&&t.release();e.sources.clear()}function Qe(e){for(let[t,n]of e.sources)if(t.refresh(),t.version!==n)return!0;return!1}function $e(e,t){Ze(e);let n=x;x=e;try{return t()}finally{x=n}}var et=class{version=0;subs=new Set;constructor(e){this.value=e}refresh(){}get(){return Ye(this),this.value}peek(){return this.value}set(e){Object.is(e,this.value)||(this.value=e,this.version++,ot(()=>Xe(this)))}update(e){this.set(e(this.value))}},tt=class{version=0;subs=new Set;sources=new Map;dirty=!0;value;computed=!1;constructor(e){this.fn=e}mark(){this.dirty||(this.dirty=!0,Xe(this))}refresh(){if(!this.dirty)return;if(this.computed&&!Qe(this)){this.dirty=!1;return}let e=$e(this,this.fn);this.dirty=!1,!(this.computed&&Object.is(e,this.value))&&(this.value=e,this.computed=!0,this.version++)}get(){return this.refresh(),Ye(this),this.value}peek(){return this.refresh(),this.value}release(){Ze(this),this.dirty=!0,this.computed=!1}},nt=class{sources=new Map;cleanup=void 0;disposed=!1;constructor(e){this.fn=e}mark(){this.disposed||S.add(this)}run(){let e=this.cleanup;this.cleanup=void 0,e?.(),this.cleanup=$e(this,this.fn)}runIfStale(){!this.disposed&&Qe(this)&&this.run()}dispose(){this.disposed||(this.disposed=!0,S.delete(this),Ze(this),this.cleanup?.(),this.cleanup=void 0)}};function rt(){if(Je)return;Je=!0;let e=0,t=null;try{for(;S.size>0;){if(++e>Ge)throw S.clear(),Error(`signals: an effect did not settle; it keeps changing what it reads`);let n=[...S];S.clear();for(let e of n)try{e.runIfStale()}catch(e){t??={error:e}}}}finally{Je=!1}if(t)throw t.error}function it(e){return new et(e)}function at(e){let t=new nt(e),n=()=>t.dispose();return Ke?.push(n),ot(()=>t.run()),n}function ot(e){qe++;try{return e()}finally{qe--,qe===0&&rt()}}function st(){let e=[];return{run(t){let n=Ke;Ke=e;try{return t()}finally{Ke=n}},dispose(){for(let t of e.splice(0))t()}}}var ct=`--tcw-tool-fit`;function lt({button:e,count:t,overflow:n,min:r}){return n<=0||t<=0||e<=r?null:Math.max(r,e-Math.ceil(n/t))}var ut=2;function dt(e){let t=parseFloat(getComputedStyle(e).getPropertyValue(`--tcw-icon`));return Number.isFinite(t)?t+2*ut:0}function ft(e){if(e.style.removeProperty(ct),e.clientHeight===0)return;let t=[...e.querySelectorAll(`.tcw-sidebar-btn`)].filter(e=>e.offsetHeight>0),n=lt({button:t[0]?.offsetHeight??0,count:t.length,overflow:e.scrollHeight-e.clientHeight,min:dt(e)});n!==null&&e.style.setProperty(ct,`${n}px`)}function pt(e){let t=0,n=null,r=()=>{t||typeof requestAnimationFrame>`u`||(t=requestAnimationFrame(()=>{t=0,!n&&o&&(n=e.closest(`.tcw-root`),n&&o.observe(n,{attributes:!0})),ft(e)}))},i=typeof ResizeObserver>`u`?null:new ResizeObserver(r);i?.observe(e);let a=typeof MutationObserver>`u`?null:new MutationObserver(r);a?.observe(e,{childList:!0,subtree:!0});let o=typeof MutationObserver>`u`?null:new MutationObserver(r),s=e.ownerDocument.defaultView;return s?.addEventListener(`resize`,r),r(),()=>{s?.removeEventListener(`resize`,r),t&&cancelAnimationFrame(t),i?.disconnect(),a?.disconnect(),o?.disconnect()}}var C=16,mt=150,ht=120,w=-2,gt=[{kind:`cross`,icon:`crosshairCursor`,label:`drawing.cursorCross`},{kind:`dot`,icon:`dotCursor`,label:`drawing.cursorDot`},{kind:`arrow`,icon:`cursor`,label:`drawing.cursorArrow`}],_t=4;function vt(e){let t=`sidebar.${e}`;return r.r.includes(t)?t:null}function yt(e,t){for(let n of e){let e=n.tools.find(e=>e.value===t);if(e)return e.label}return t}var bt=`--tcw-fab-plot-left`,xt=class{config;callbacks;el;groupWraps=[];groupButtons=[];groupIcons=[];groupTools=[];cursorBtn=null;cursorWrap=null;cursorKind=`cross`;magnetBtn=null;eraserBtn=null;zoomBtn=null;stayBtn=null;lockAllBtn=null;hideAllBtn=null;drawings={locked:!1,hidden:!1};flyoutEl=null;flyoutIdx=-1;flyoutHideTimer=null;flyoutSwitchTimer=null;flyoutSwitchOpen=null;flyoutByKey=!1;hostEl=null;favoritesEl=null;favoritesDivider=null;favorites=[];fab;fabShows=``;stopFit;onPressAway=e=>{let t=e.target;t&&(this.el.contains(t)||this.fab.contains(t)||this.flyoutEl?.contains(t))||this.setOpen(!1)};onEscape=e=>{e.key===`Escape`&&!this.flyoutEl&&this.setOpen(!1)};constructor(e,t,n,a=s.t){this.host=e,this.t=a,this.config=t,this.callbacks=n,this.el=document.createElement(`div`),this.el.className=`tcw-sidebar`,r.o(this.el,`sidebar`),this.build(),this.el.addEventListener(`scroll`,()=>this.hideFlyout(),{passive:!0}),e.appendChild(this.el),this.stopFit=pt(this.el),this.fab=document.createElement(`button`),this.fab.type=`button`,this.fab.className=`tcw-sidebar-fab`,this.fab.setAttribute(`aria-label`,this.t(`drawing.tools`)),this.fab.setAttribute(`aria-expanded`,`false`),this.fab.innerHTML=i.i(`penLine`,18),r.o(this.fab,`sidebar`),this.fab.addEventListener(`click`,()=>this.setOpen(!this.isOpen())),e.appendChild(this.fab)}setPlotLeft(e){let t=`${Math.max(0,Math.round(e))}px`;this.fab.style.getPropertyValue(bt)!==t&&this.fab.style.setProperty(bt,t)}isNarrow(){return this.el.closest(`[data-tcw-narrow]`)!==null}isOpen(){return this.el.classList.contains(`tcw-sidebar-open`)}setOpen(e){if(e!==this.isOpen())if(this.el.classList.toggle(`tcw-sidebar-open`,e),this.fab.setAttribute(`aria-expanded`,String(e)),e)document.addEventListener(`pointerdown`,this.onPressAway,!0),document.addEventListener(`keydown`,this.onEscape);else{let e=this.el.contains(document.activeElement)||!!this.flyoutEl?.contains(document.activeElement);this.hideFlyout(),document.removeEventListener(`pointerdown`,this.onPressAway,!0),document.removeEventListener(`keydown`,this.onEscape),e&&this.isNarrow()&&this.fab.focus({preventScroll:!0})}}closeOverlay(){this.setOpen(!1)}closeForChart(){this.isNarrow()&&this.setOpen(!1)}pick(e){this.callbacks.onDrawingTool(e),this.closeForChart()}build(){let{config:e,callbacks:t,el:n}=this;this.buildCursorButton(),n.appendChild(this.divider()),t.onToggleFavorite&&(this.favorites=[...e.favorites??[]],this.favoritesEl=document.createElement(`div`),this.favoritesEl.className=`tcw-sidebar-favorites`,r.o(this.favoritesEl,`sidebar.favorites`),n.appendChild(this.favoritesEl),this.favoritesDivider=this.divider(),r.o(this.favoritesDivider,`sidebar.favorites`),n.appendChild(this.favoritesDivider),this.renderFavorites());let a;e.drawingToolGroups.forEach((e,t)=>{if(!e.tools[0])return;e.section!==void 0&&a!==void 0&&e.section!==a&&this.appendDivider(),a=e.section;let o=document.createElement(`div`);o.className=`tcw-tool-group-wrap`;let s=vt(e.section);s&&r.o(o,s);let c=document.createElement(`button`);c.className=`tcw-sidebar-btn`;let l=e.tools[0].value;e.tools.length>1?c.setAttribute(`aria-label`,`${e.label}: ${e.tools[0].label}`):c.title=e.label;let u=document.createElement(`span`);if(u.className=`tcw-sidebar-icon`,u.innerHTML=i.a(l,C),c.appendChild(u),this.groupIcons.push(u),this.groupTools.push(l),e.tools.length>1){let e=document.createElement(`span`);e.className=`tcw-multi-dot`,c.appendChild(e)}c.addEventListener(`click`,()=>{if(this.isNarrow()&&e.tools.length>1){this.flyoutEl&&this.flyoutIdx===t?this.hideFlyout():this.showFlyout(t);return}this.pick(this.groupTools[t])}),o.appendChild(c),o.addEventListener(`mouseenter`,()=>{this.isNarrow()||this.aimFlyout(t,()=>this.showFlyout(t))}),o.addEventListener(`mouseleave`,()=>{this.isNarrow()||(this.cancelFlyoutSwitch(),this.scheduleHideFlyout())}),e.tools.length>1&&(c.setAttribute(`aria-haspopup`,`menu`),c.setAttribute(`aria-expanded`,`false`),c.addEventListener(`keydown`,e=>{e.key===`ArrowRight`||e.key===`ArrowDown`?(e.preventDefault(),this.showFlyout(t),this.flyoutByKey=!0,this.focusFlyoutItem(0)):e.key===`Escape`&&this.flyoutEl&&(e.stopPropagation(),this.hideFlyout())})),o.addEventListener(`focusout`,e=>{let t=e.relatedTarget;!o.contains(t)&&!this.flyoutEl?.contains(t)&&this.scheduleHideFlyout()}),n.appendChild(o),this.groupWraps.push(o),this.groupButtons.push(c)});let o=document.createElement(`div`);if(o.className=`tcw-sidebar-spacer`,n.appendChild(o),n.appendChild(this.divider()),t.onToggleStyle){let e=document.createElement(`button`);e.className=`tcw-sidebar-btn`,e.title=this.t(`drawing.style`),e.dataset.role=`style`,r.o(e,`sidebar.style`),e.innerHTML=i.i(`palette`,14);let a=t.onToggleStyle;e.addEventListener(`click`,()=>{a(),this.closeForChart()}),n.appendChild(e)}if(t.onToggleMagnet&&(this.magnetBtn=document.createElement(`button`),this.magnetBtn.className=`tcw-sidebar-btn`,this.magnetBtn.title=this.t(`drawing.magnet`),this.magnetBtn.innerHTML=i.i(`magnet`,14),this.magnetBtn.addEventListener(`click`,t.onToggleMagnet),r.o(this.magnetBtn,`sidebar.magnet`),n.appendChild(this.magnetBtn)),t.onToggleEraser){let e=t.onToggleEraser;this.eraserBtn=this.toggleButton(`eraser`,this.t(`drawing.eraser`),()=>{e(),this.closeForChart()}),r.o(this.eraserBtn,`sidebar.eraser`),n.appendChild(this.eraserBtn)}if(t.onToggleZoomArea){let e=t.onToggleZoomArea;this.zoomBtn=this.toggleButton(`zoomIn`,this.t(`drawing.zoomArea`),()=>{e(),this.closeForChart()}),r.o(this.zoomBtn,`sidebar.zoomArea`),n.appendChild(this.zoomBtn)}if(t.onToggleStayInDrawing&&(this.stayBtn=document.createElement(`button`),this.stayBtn.className=`tcw-sidebar-btn`,this.stayBtn.dataset.role=`stay`,this.stayBtn.title=this.t(`drawing.stay`),this.stayBtn.setAttribute(`aria-pressed`,`false`),this.stayBtn.innerHTML=i.i(`repeat`,14),this.stayBtn.addEventListener(`click`,t.onToggleStayInDrawing),r.o(this.stayBtn,`sidebar.stayInDrawing`),n.appendChild(this.stayBtn)),this.hostEl=document.createElement(`div`),this.hostEl.className=`tcw-sidebar-host`,n.appendChild(this.hostEl),this.appendDivider(),t.onLockAll){let e=t.onLockAll;this.lockAllBtn=this.toggleButton(`lock`,this.t(`drawing.lockAll`),()=>e(!this.drawings.locked)),this.lockAllBtn.dataset.role=`lockAll`,r.o(this.lockAllBtn,`sidebar.lockAll`),n.appendChild(this.lockAllBtn)}if(t.onHideAll){let e=t.onHideAll;this.hideAllBtn=this.toggleButton(`eyeOff`,this.t(`drawing.hideAll`),()=>e(!this.drawings.hidden)),this.hideAllBtn.dataset.role=`hideAll`,r.o(this.hideAllBtn,`sidebar.hideAll`),n.appendChild(this.hideAllBtn)}let s=document.createElement(`button`);s.className=`tcw-sidebar-btn tcw-danger`,s.title=this.t(`drawing.clearAll`),s.innerHTML=i.i(`trash`,14),s.setAttribute(`aria-haspopup`,`menu`),s.setAttribute(`aria-expanded`,`false`),s.addEventListener(`click`,()=>t.onClear(s)),r.o(s,`sidebar.clear`),n.appendChild(s)}setDrawingsState(e){if(!(e.locked===this.drawings.locked&&e.hidden===this.drawings.hidden)){this.drawings={...e};for(let[t,n]of[[this.lockAllBtn,e.locked],[this.hideAllBtn,e.hidden]])t?.setAttribute(`aria-pressed`,String(n)),t?.classList.toggle(`tcw-active`,n)}}setFavorites(e){this.favorites=[...e],this.renderFavorites();for(let e of this.flyoutEl?.querySelectorAll(`.tcw-flyout-row`)??[]){let t=this.favorites.includes(e.dataset.toolValue??``);e.classList.toggle(`tcw-flyout-faved`,t),e.querySelector(`[data-pin]`)?.setAttribute(`aria-pressed`,String(t))}}renderFavorites(){if(!this.favoritesEl)return;this.favoritesEl.replaceChildren();let e=this.favorites.length>0;this.favoritesEl.style.display=e?``:`none`,this.favoritesDivider&&(this.favoritesDivider.style.display=e?``:`none`);for(let e of this.favorites){let t=document.createElement(`button`);t.className=`tcw-sidebar-btn`,t.title=s.r(this.t(`sidebar.unpinHint`),{tool:yt(this.config.drawingToolGroups,e)}),t.dataset.toolValue=e,t.innerHTML=i.a(e,C),t.addEventListener(`click`,()=>this.pick(e)),t.addEventListener(`contextmenu`,t=>{t.preventDefault(),this.callbacks.onToggleFavorite?.(e)}),this.favoritesEl.appendChild(t)}}buildCursorButton(){let{callbacks:e}=this,t=document.createElement(`div`);t.className=`tcw-cursor-wrap`;let n=document.createElement(`button`);n.className=`tcw-sidebar-btn`,n.addEventListener(`click`,()=>{if(this.isNarrow()&&e.onCrosshairCursor){this.flyoutEl&&this.flyoutIdx===w?this.hideFlyout():this.showCursorFlyout();return}e.onCancelDrawing(),this.closeForChart()}),r.o(t,`sidebar.cursor`),t.appendChild(n),this.cursorBtn=n,this.cursorWrap=t,this.showCrosshairCursor(this.cursorKind),e.onCrosshairCursor&&(n.setAttribute(`aria-haspopup`,`menu`),n.setAttribute(`aria-expanded`,`false`),n.addEventListener(`keydown`,e=>{if(e.key===`Escape`&&this.flyoutEl){e.stopPropagation(),this.hideFlyout();return}e.key!==`ArrowRight`&&e.key!==`ArrowDown`||(e.preventDefault(),this.showCursorFlyout(),this.flyoutByKey=!0,this.focusFlyoutItem(0))}),t.addEventListener(`mouseenter`,()=>{this.isNarrow()||this.aimFlyout(w,()=>this.showCursorFlyout())}),t.addEventListener(`mouseleave`,()=>{this.isNarrow()||(this.cancelFlyoutSwitch(),this.scheduleHideFlyout())}),t.addEventListener(`focusout`,e=>{let n=e.relatedTarget;!t.contains(n)&&!this.flyoutEl?.contains(n)&&this.scheduleHideFlyout()})),this.el.appendChild(t)}showCrosshairCursor(e){this.cursorKind=e;let t=this.cursorBtn;if(!t)return;let n=gt.find(t=>t.kind===e)??gt[0];t.innerHTML=i.i(n.icon,14),this.callbacks.onCrosshairCursor?(t.removeAttribute(`title`),t.setAttribute(`aria-label`,`${this.t(`drawing.cursor`)}: ${this.t(n.label)}`)):t.title=this.t(`drawing.cursor`),this.flyoutEl?.querySelectorAll(`[data-cursor]`).forEach(t=>{let n=t.dataset.cursor===e;t.setAttribute(`aria-checked`,String(n)),t.classList.toggle(`tcw-active`,n)})}showCursorFlyout(){if(this.cancelHideFlyout(),this.flyoutEl&&this.flyoutIdx===w)return;this.hideFlyout();let e=document.createElement(`div`);e.className=`tcw-flyout`,e.setAttribute(`role`,`menu`),e.setAttribute(`aria-label`,this.t(`drawing.cursors`)),e.addEventListener(`keydown`,e=>this.onFlyoutKey(e,w));let t=document.createElement(`div`);t.className=`tcw-flyout-heading`,t.setAttribute(`role`,`presentation`),t.textContent=this.t(`drawing.cursors`),e.appendChild(t);for(let t of gt){let n=document.createElement(`div`);n.className=`tcw-flyout-row`,n.setAttribute(`role`,`none`);let r=document.createElement(`button`);r.className=`tcw-flyout-item`,r.setAttribute(`role`,`menuitemradio`),r.tabIndex=-1,r.dataset.cursor=t.kind,r.innerHTML=i.i(t.icon,C);let a=document.createElement(`span`);a.className=`tcw-flyout-name`,a.textContent=this.t(t.label),r.appendChild(a),r.addEventListener(`click`,()=>{this.hideFlyout(),this.callbacks.onCancelDrawing(),this.callbacks.onCrosshairCursor?.(t.kind),this.closeForChart()}),n.appendChild(r),e.appendChild(n)}this.openFlyout(e,w),this.showCrosshairCursor(this.cursorKind)}flyoutButton(e){return e===w?this.cursorBtn:this.groupButtons[e]??null}flyoutWrap(e){return e===w?this.cursorWrap:this.groupWraps[e]??null}aimFlyout(e,t){if(this.cancelFlyoutSwitch(),!this.flyoutEl||this.flyoutIdx===e){t();return}this.flyoutSwitchOpen=t,this.flyoutSwitchTimer=setTimeout(()=>{this.flyoutSwitchTimer=null,this.flyoutSwitchOpen=null,t()},ht)}cancelFlyoutSwitch(){this.flyoutSwitchTimer!==null&&(clearTimeout(this.flyoutSwitchTimer),this.flyoutSwitchTimer=null,this.flyoutSwitchOpen=null)}openFlyout(e,t){e.addEventListener(`mouseenter`,()=>{this.cancelHideFlyout(),this.cancelFlyoutSwitch()}),e.addEventListener(`mouseleave`,()=>this.scheduleHideFlyout()),e.addEventListener(`focusout`,n=>{let r=n.relatedTarget;!e.contains(r)&&!this.flyoutWrap(t)?.contains(r)&&this.scheduleHideFlyout()}),this.flyoutEl=e,this.flyoutIdx=t,this.flyoutByKey=!1,this.host.appendChild(e);let n=this.flyoutButton(t);n&&this.placeFlyout(e,n),n?.setAttribute(`aria-expanded`,`true`)}showFlyout(e){if(this.cancelHideFlyout(),this.flyoutEl&&this.flyoutIdx===e)return;let t=this.config.drawingToolGroups[e];if(!t||t.tools.length<=1){this.hideFlyout();return}this.hideFlyout();let n=document.createElement(`div`);if(n.className=`tcw-flyout`,n.setAttribute(`role`,`menu`),n.setAttribute(`aria-label`,t.label),n.addEventListener(`keydown`,t=>this.onFlyoutKey(t,e)),t.tools[0]?.heading===void 0){let e=document.createElement(`div`);e.className=`tcw-flyout-header`,e.textContent=t.label,n.appendChild(e)}let a=this.t(`drawing.pinFavorite`);for(let e of t.tools){if(e.heading!==void 0){let t=document.createElement(`div`);t.className=`tcw-flyout-heading`,t.setAttribute(`role`,`presentation`),t.textContent=e.heading,n.appendChild(t)}let t=document.createElement(`div`);t.className=`tcw-flyout-row`,t.setAttribute(`role`,`none`),t.dataset.toolValue=e.value;let o=document.createElement(`button`);o.className=`tcw-flyout-item`,o.setAttribute(`role`,`menuitem`),o.tabIndex=-1,o.innerHTML=i.a(e.value,C);let s=document.createElement(`span`);s.className=`tcw-flyout-name`,s.textContent=e.label,o.appendChild(s);let c=this.config.shortcuts?.[e.value];if(c){let e=document.createElement(`kbd`);e.className=`tcw-flyout-key`,e.textContent=c,r.o(e,`hotkeys`,`hotkeys.tools`),o.appendChild(e)}if(o.dataset.toolValue=e.value,o.addEventListener(`click`,()=>{this.hideFlyout(),this.pick(e.value)}),t.appendChild(o),this.callbacks.onToggleFavorite){let n=this.favorites.includes(e.value);t.classList.toggle(`tcw-flyout-faved`,n);let r=document.createElement(`button`);r.type=`button`,r.className=`tcw-flyout-pin`,r.dataset.pin=e.value,r.tabIndex=-1,r.title=a,r.setAttribute(`aria-label`,`${a}: ${e.label}`),r.setAttribute(`aria-pressed`,String(n)),r.innerHTML=i.i(`star`,12),r.addEventListener(`click`,t=>{t.stopPropagation(),this.callbacks.onToggleFavorite?.(e.value)}),t.appendChild(r),o.addEventListener(`contextmenu`,t=>{t.preventDefault(),this.callbacks.onToggleFavorite?.(e.value)})}n.appendChild(t)}this.openFlyout(n,e)}flyoutItems(){return this.flyoutEl?[...this.flyoutEl.querySelectorAll(`.tcw-flyout-item`)]:[]}focusFlyoutItem(e){let t=this.flyoutItems();t.length!==0&&t[(e+t.length)%t.length].focus()}onFlyoutKey(e,t){let n=this.flyoutItems(),r=n.indexOf(document.activeElement);switch(e.key){case`ArrowDown`:this.focusFlyoutItem(r+1);break;case`ArrowUp`:this.focusFlyoutItem(r-1);break;case`Home`:this.focusFlyoutItem(0);break;case`End`:this.focusFlyoutItem(n.length-1);break;case`Escape`:case`ArrowLeft`:e.stopPropagation(),this.hideFlyout(),this.flyoutButton(t)?.focus();break;case`Tab`:this.hideFlyout(),this.flyoutButton(t)?.focus();return;default:return}e.preventDefault()}placeFlyout(e,t){let n=this.host.getBoundingClientRect(),r=t.getBoundingClientRect(),i=this.el.getBoundingClientRect();e.style.maxHeight=`${Math.max(0,this.host.clientHeight-_t*2)}px`;let a=this.host.clientHeight-e.offsetHeight-_t;this.host.closest(`[dir]`)?.getAttribute(`dir`)===`rtl`?(e.style.left=``,e.style.right=`${n.right-i.left}px`):(e.style.right=``,e.style.left=`${i.right-n.left}px`),e.style.top=`${Math.max(0,Math.min(r.top-n.top,a))}px`}scheduleHideFlyout(){this.cancelHideFlyout(),this.flyoutHideTimer=setTimeout(()=>{this.flyoutHideTimer=null;let e=this.flyoutSwitchOpen;this.hideFlyout(),e?.()},mt)}cancelHideFlyout(){this.flyoutHideTimer!==null&&(clearTimeout(this.flyoutHideTimer),this.flyoutHideTimer=null)}hideFlyout(){this.cancelHideFlyout(),this.cancelFlyoutSwitch();let e=this.flyoutButton(this.flyoutIdx),t=this.flyoutByKey&&this.flyoutEl?.contains(document.activeElement)===!0;this.flyoutEl&&=(this.flyoutEl.remove(),null),e?.setAttribute(`aria-expanded`,`false`),this.flyoutIdx=-1,this.flyoutByKey=!1,t&&e?.focus()}update(e){this.cursorBtn&&this.cursorBtn.classList.toggle(`tcw-active`,e.activeTool===null);let t=e.activeTool??``;t!==this.fabShows&&(this.fabShows=t,this.fab.innerHTML=e.activeTool?i.a(e.activeTool,18):i.i(`penLine`,18)),this.fab.classList.toggle(`tcw-active`,e.activeTool!==null||e.eraser||e.zoomArea);let{drawingToolGroups:n}=this.config;for(let t=0;t<n.length;t++){let r=n[t].tools.some(t=>t.value===e.activeTool);this.groupButtons[t].classList.toggle(`tcw-active`,r),r&&e.activeTool&&e.activeTool!==this.groupTools[t]&&(this.groupTools[t]=e.activeTool,this.groupIcons[t].innerHTML=i.a(e.activeTool,C),n[t].tools.length>1&&this.groupButtons[t].setAttribute(`aria-label`,`${n[t].label}: ${yt(n,e.activeTool)}`))}if(this.flyoutEl&&this.flyoutEl.querySelectorAll(`.tcw-flyout-item`).forEach(t=>{let n=t;n.dataset.cursor||n.classList.toggle(`tcw-active`,n.dataset.toolValue===e.activeTool)}),this.magnetBtn){let t=e.magnetEnabled&&e.magnetStrong;this.magnetBtn.classList.toggle(`tcw-active`,e.magnetEnabled),this.magnetBtn.innerHTML=i.i(t?`magnetStrong`:`magnet`,14),this.magnetBtn.title=t?this.t(`drawing.magnetStrong`):e.magnetEnabled?this.t(`drawing.magnetOn`):this.t(`drawing.magnetOff`),this.magnetBtn.setAttribute(`aria-label`,this.magnetBtn.title)}for(let[t,n]of[[this.eraserBtn,e.eraser],[this.zoomBtn,e.zoomArea]])t&&(t.classList.toggle(`tcw-active`,n),t.setAttribute(`aria-pressed`,String(n)));this.stayBtn&&(this.stayBtn.classList.toggle(`tcw-active`,e.stayInDrawing),this.stayBtn.setAttribute(`aria-pressed`,String(e.stayInDrawing)))}addHostButton(e){let t=document.createElement(`button`);return t.type=`button`,t.className=`tcw-sidebar-btn tcw-host-btn`,t.dataset.hostButton=e.id,t.title=e.label,t.setAttribute(`aria-label`,e.label),e.toggle&&t.setAttribute(`aria-pressed`,`false`),typeof e.icon==`string`?t.innerHTML=i.i(e.icon,14):t.appendChild(e.icon),t.addEventListener(`click`,()=>e.onClick(t)),this.hostEl?.appendChild(t),this.tidy(),t}hostSlot(){return this.hostEl}tidy(){r.d(this.el,`tcw-sidebar-divider`,`tcw-sidebar-spacer`)}toggleButton(e,t,n){let r=document.createElement(`button`);return r.className=`tcw-sidebar-btn`,r.title=t,r.setAttribute(`aria-label`,t),r.setAttribute(`aria-pressed`,`false`),r.innerHTML=i.i(e,14),r.addEventListener(`click`,n),r}appendDivider(){this.el.lastElementChild?.classList.contains(`tcw-sidebar-divider`)||this.el.appendChild(this.divider())}divider(){let e=document.createElement(`div`);return e.className=`tcw-sidebar-divider`,e}destroy(){this.stopFit(),this.setOpen(!1),this.hideFlyout(),this.fab.remove(),this.el.remove()}},St=`data-tcw-folded`,Ct=`tcw-statusbar--folded`,wt=`tcw-statusbar--short-market`,Tt=1,Et=13,Dt=`goto`,Ot=`Alt+G`,kt=e=>e.goToKeys?e.goToKeys():Ot;function At(e,t){let n=document.createElement(`span`);return n.className=e,n.textContent=t,n}var jt=class{el;dotEl;messageEl;marketEl;hostLeft;hostRight;clockBtn=null;clockMenu=null;scaleBtns=null;scaleShown=``;marketShown=``;rightEl;rangeEl=null;presetBtns=[];moreBtn=null;goToBtn=null;rangeMenu=null;resizeObserver=null;fitFrame=0;destroyed=!1;constructor(e,t,n={}){this.host=e,this.extras=n,this.el=document.createElement(`div`),this.el.className=`tcw-statusbar`,r.o(this.el,`statusBar`),n.label&&(this.el.setAttribute(`role`,`group`),this.el.setAttribute(`aria-label`,n.label)),t&&this.el.appendChild(this.buildRange(t)),this.hostLeft=this.hostGroup(),this.el.appendChild(this.hostLeft);let i=document.createElement(`div`);i.className=`tcw-status-right`,this.rightEl=i,this.hostRight=this.hostGroup(),i.appendChild(this.hostRight);let a=document.createElement(`div`);a.className=`tcw-status-indicator`,r.o(a,`statusBar.connection`),this.dotEl=document.createElement(`span`),this.dotEl.className=`tcw-status-dot`,a.appendChild(this.dotEl),this.messageEl=document.createElement(`span`),a.appendChild(this.messageEl),this.marketEl=document.createElement(`span`),this.marketEl.className=`tcw-status-market`,this.marketEl.hidden=!0,r.o(this.marketEl,`statusBar.market`),i.appendChild(this.marketEl),i.appendChild(a),n.clock&&i.appendChild(this.buildClock(n.clock)),n.scale&&i.appendChild(this.buildScale(n.scale)),this.el.appendChild(i),e.appendChild(this.el),this.watchWidths(i)}watchWidths(e){if(typeof ResizeObserver<`u`){this.resizeObserver=new ResizeObserver(()=>this.scheduleFit());for(let t of[this.el,e,this.hostLeft])this.resizeObserver.observe(t)}document.fonts?.ready.then(()=>this.scheduleFit())}scheduleFit(){this.destroyed||this.fitFrame||typeof requestAnimationFrame>`u`||(this.fitFrame=requestAnimationFrame(()=>{this.fitFrame=0,this.destroyed||this.fit()}))}fit(){let e=this.foldedCount(),t=this.rangeFocus();this.refit(),this.foldedCount()!==e&&this.rangeMenu?.close(),this.keepFocus(t)}refit(){let e=this.foldSteps(),t=this.goToBtn?[...this.presetBtns,this.goToBtn]:this.presetBtns,n=n=>{let r=new Set(e.slice(0,n));for(let e of t)e.toggleAttribute(St,r.has(e));this.el.classList.toggle(Ct,n>0)};if(n(0),this.el.classList.remove(wt),this.el.clientWidth===0||this.fits())return;let r=0;for(;r<e.length;)if(n(++r),this.fits())return;if(!(this.marketEl.hidden||this.isOff(this.marketEl))){for(this.el.classList.add(wt);r>0;r--)if(n(r-1),!this.fits()){n(r);return}}}fits(){return this.rangeFits()&&this.rightFits()}rangeFits(){let e=this.rangeEl;return!e||e.scrollWidth<=e.clientWidth+Tt}rightFits(){if(this.rightEl.offsetParent!==this.el)return!0;let e=getComputedStyle(this.el),t=this.rightEl.offsetLeft;return(e.direction===`rtl`?(parseFloat(e.paddingLeft)||0)-t:t+this.rightEl.offsetWidth-(this.el.clientWidth-(parseFloat(e.paddingRight)||0)))<=Tt}foldedCount(){return this.rangeEl?.querySelectorAll(`[${St}]`).length??0}rangeFocus(){if(this.rangeMenu?.hasFocus())return this.moreBtn;let e=document.activeElement;return e instanceof HTMLElement&&this.rangeEl?.contains(e)?e:null}keepFocus(e){if(!e||this.rangeMenu?.isOpen())return;let t=this.focusAfterRefit(e);t===this.el?this.focusBar():document.activeElement!==t&&t.focus({preventScroll:!0})}focusAfterRefit(e){if(this.shows(e))return e;let t=this.presetBtns.filter(e=>this.shows(e)).at(-1);return[e===this.moreBtn?null:this.moreBtn,this.goToBtn,t].find(e=>e!=null&&this.shows(e))??this.firstOtherControl()??this.el}firstOtherControl(){return[...this.el.querySelectorAll(`button`)].filter(e=>!this.rangeEl?.contains(e)).find(e=>!e.disabled&&e.getClientRects().length>0)??null}focusBar(){if(document.activeElement===this.el)return;let e=()=>this.el.removeAttribute(`tabindex`);this.el.tabIndex=-1,this.el.addEventListener(`blur`,e,{once:!0}),this.el.focus({preventScroll:!0}),document.activeElement!==this.el&&(this.el.removeEventListener(`blur`,e),e())}shows(e){return e===this.moreBtn&&!this.el.classList.contains(Ct)?!1:!e.hasAttribute(St)&&!this.isOff(e)}foldSteps(){if(this.presetBtns.length===0||this.isOff(this.presetBtns[0]))return[];let e=[...this.presetBtns].reverse();return this.goToBtn&&e.push(this.goToBtn),e}isOff(e){let t=((this.el.closest(`.tcw-root`)??this.host).getAttribute(`data-tcw-off`)??``).split(/\s+/).filter(Boolean);return(e.dataset.tcwPart??``).split(/\s+/).some(e=>t.includes(e))}update(e){this.dotEl.className=`tcw-status-dot`,e.connectionState===`connected`?this.dotEl.classList.add(`tcw-connected`):e.connectionState===`error`&&this.dotEl.classList.add(`tcw-error`),this.messageEl.textContent=e.message}tick(){if(!this.clockBtn||!this.extras.clock)return;let{time:e,zone:t}=this.extras.clock.now(),n=`${e} ${t}`;this.clockBtn.textContent!==n&&(this.clockBtn.textContent=n)}setScale(e){let t=`${e.mode}|${e.auto}`;!this.scaleBtns||t===this.scaleShown||(this.scaleShown=t,this.scaleBtns.percent?.setAttribute(`aria-pressed`,String(e.mode===`percentage`)),this.scaleBtns.log?.setAttribute(`aria-pressed`,String(e.mode===`logarithmic`)),this.scaleBtns.auto?.setAttribute(`aria-pressed`,String(e.auto)))}setMarket(e,t,n=t){let r=`${e}|${t}|${n}`;if(r===this.marketShown)return;if(this.marketShown=r,this.marketEl.hidden=e===`always`,this.marketEl.dataset.state=e,e===`always`){this.marketEl.replaceChildren(),this.marketEl.removeAttribute(`title`);return}this.marketEl.title=t;let i=At(`tcw-status-market-short`,n);i.setAttribute(`aria-hidden`,`true`),this.marketEl.replaceChildren(At(`tcw-status-market-text`,t),i)}addHostItem(e){let t=e.onClick,n=t?document.createElement(`button`):document.createElement(`span`);return n.className=t?`tcw-status-host-item tcw-status-host-btn`:`tcw-status-host-item`,n.dataset.hostItem=e.id,n.dir=`auto`,n.textContent=e.text,e.label&&(n.title=e.label,t||n.setAttribute(`role`,`group`),e.label!==e.text&&n.setAttribute(`aria-label`,`${e.label}: ${e.text}`)),n instanceof HTMLButtonElement&&t&&(n.type=`button`,n.addEventListener(`click`,()=>t(n))),(e.side===`left`?this.hostLeft:this.hostRight).appendChild(n),n}hostSlot(e){return e===`left`?this.hostLeft:this.hostRight}destroy(){this.destroyed=!0,this.resizeObserver?.disconnect(),this.fitFrame&&cancelAnimationFrame(this.fitFrame),this.clockMenu?.destroy(),this.rangeMenu?.destroy(),this.el.remove()}buildClock(e){let t=document.createElement(`button`);return t.type=`button`,t.className=`tcw-status-clock`,t.dataset.role=`clock`,t.dir=`auto`,t.title=e.label,t.setAttribute(`aria-haspopup`,`menu`),r.o(t,`statusBar.clock`),t.addEventListener(`click`,()=>this.toggleZones(t,e)),this.clockBtn=t,this.tick(),t}toggleRangeMenu(e,t){if(this.rangeMenu?.isOpen()){this.rangeMenu.close();return}let n=e=>e.hasAttribute(St)&&!this.isOff(e),r=t.presets.filter((e,t)=>n(this.presetBtns[t])).map(e=>({id:e,label:t.presetLabels?.[e]??e}));if(this.goToBtn&&n(this.goToBtn)&&(r.length>0&&r.push(`separator`),r.push({id:Dt,label:t.goToLabel,icon:`calendar`,shortcut:kt(t)})),r.length===0)return;this.rangeMenu??=new o.f(this.host,t.groupLabel);let i=e.getBoundingClientRect(),a=this.host.getBoundingClientRect();this.rangeMenu.open(r,i.left-a.left,i.top-a.top,e=>e===Dt?t.onGoTo():t.onPreset(e),e,void 0,i.right-a.left)}toggleZones(e,t){if(this.clockMenu?.isOpen()){this.clockMenu.close();return}let{current:n,list:r}=t.options();this.clockMenu??=new o.f(this.host,t.label);let i=e.getBoundingClientRect(),a=this.host.getBoundingClientRect();this.clockMenu.open(r.map(e=>({id:e.value,label:e.label,checked:e.value===n})),i.left-a.left,i.top-a.top,e=>t.onPick(e),e,void 0,i.right-a.left)}buildScale(e){let t=document.createElement(`div`);t.className=`tcw-status-scale`,t.setAttribute(`role`,`group`),e.labels.group&&t.setAttribute(`aria-label`,e.labels.group),r.o(t,`statusBar.scale`);let n=(n,r,i)=>{let a=document.createElement(`button`);return a.type=`button`,a.className=`tcw-status-scale-btn`,a.dataset.scale=n,a.textContent=r,a.title=e.labels[n],a.setAttribute(`aria-label`,e.labels[n]),a.setAttribute(`aria-pressed`,`false`),a.addEventListener(`click`,i),t.appendChild(a),a};return this.scaleBtns={percent:n(`percent`,`%`,e.onPercent),...e.onLog?{log:n(`log`,e.texts?.log??`log`,e.onLog)}:{},auto:n(`auto`,e.texts?.auto??`auto`,e.onAuto)},t}hostGroup(){let e=document.createElement(`div`);return e.className=`tcw-status-host`,e}buildRange(e){let t=document.createElement(`div`);t.className=`tcw-range-bar`,t.setAttribute(`role`,`group`),t.setAttribute(`aria-label`,e.groupLabel);for(let n of e.presets){let i=document.createElement(`button`);i.type=`button`,i.className=`tcw-range-btn`,i.dataset.range=n,r.o(i,`statusBar.range`),i.textContent=e.presetLabels?.[n]??n,i.addEventListener(`click`,()=>e.onPreset(n)),t.appendChild(i),this.presetBtns.push(i)}let n=this.rangeIconBtn(`tcw-range-more`,`rangeMore`,`more`,e.moreLabel);r.o(n,`statusBar.range`),n.setAttribute(`aria-haspopup`,`menu`),n.setAttribute(`aria-expanded`,`false`),n.addEventListener(`click`,()=>this.toggleRangeMenu(n,e)),t.appendChild(n),this.moreBtn=n;let i=this.rangeIconBtn(`tcw-range-goto`,`goto`,`calendar`,e.goToLabel);r.o(i,`goToDate`,`statusBar.goToDate`);let a=()=>{let t=kt(e);i.title=t?`${e.goToLabel} (${t})`:e.goToLabel};return a(),i.addEventListener(`pointerover`,a),i.addEventListener(`focusin`,a),i.addEventListener(`click`,e.onGoTo),t.appendChild(i),this.goToBtn=i,this.rangeEl=t,t}rangeIconBtn(e,t,n,r){let a=document.createElement(`button`);return a.type=`button`,a.className=`tcw-range-btn ${e}`,a.dataset.role=t,a.title=r,a.setAttribute(`aria-label`,r),a.innerHTML=i.i(n,Et),a}},T=[],Mt=new Map,E=null,Nt=e=>{let t=e.target instanceof Node?e.target:null;t!==null&&T.some(e=>e.contains(t)||Mt.get(e)?.some(e=>e.contains(t)))||(E=null)};function Pt(e,t=[]){let n=()=>{E=e},r=[e,...t];for(let e of r)e.addEventListener(`pointerdown`,n,!0);return T.length===0&&document.addEventListener(`pointerdown`,Nt,!0),T.push(e),Mt.set(e,t),()=>{for(let e of r)e.removeEventListener(`pointerdown`,n,!0);let t=T.indexOf(e);t>=0&&T.splice(t,1),Mt.delete(e),T.length===0&&document.removeEventListener(`pointerdown`,Nt,!0),E===e&&(E=null)}}function D(e,t=!1){let n=E?.isConnected?E:null;if(!n){let e=document.activeElement;n=e?T.find(t=>t.contains(e))??null:null}return!n&&!t&&(n=T.find(e=>e.isConnected)??null),n!==null&&e.contains(n)}function O(){let e=document.activeElement;return!!e&&(e.tagName===`INPUT`||e.tagName===`TEXTAREA`||e.tagName===`SELECT`||e.isContentEditable)}function k(){let e=document.activeElement;return e instanceof Element&&e.closest(`[role="dialog"], [aria-modal="true"], [role="menu"]`)!==null}var Ft={selectHint:`Click a bar to start the replay`,random:`Random bar`,realtime:`Back to realtime`,play:`Play`,pause:`Pause`,stepBack:`Step back (Shift+←)`,stepForward:`Step forward (Shift+→)`,replay:`Replay`,position:`Replay position`,speed:`Speed`,step:`Step`,loading:`Loading chart...`,selectBar:`Select bar`,cancel:`Cancel`,rate:`{rate}×`,rateHint:`1× plays one bar a second`,playingAt:`Playing at {rate}`,pausedAt:`Paused at {time}`,endedAt:`Replay ended at {time}`},It=[.1,.2,.3,.5,1,2,3,5,10,20,30,50],Lt=[`full`,`compact`,`stack`],Rt=300,zt=2,Bt=[`random`,`stepBack`,`stepForward`,`seek`,`step`,`selectBar`],Vt=class{root=null;scrubber=null;timeLabel=null;playBtn=null;realtimeBtn=null;liveRegion=null;hintText=null;state=`stopped`;mode=`select`;ended=!1;pending=!1;total=0;rate=1;steps=[];step=`bar`;dir=`ltr`;formatRate;where=``;announceTimer=null;widths=new Map;labels;constructor(e,t={}){this.callbacks=e,this.labels={...Ft,...t},this.formatRate=e=>this.labels.rate.replace(`{rate}`,String(e))}mount(e,t){this.root||(this.total=Math.max(0,t.total),this.rate=t.rate??1,this.steps=t.steps??[],this.step=t.step??`bar`,this.dir=t.dir??`ltr`,t.formatRate&&(this.formatRate=t.formatRate),this.state=`paused`,this.mode=t.mode??`select`,this.root=document.createElement(`div`),this.root.className=`tcw-replay-bar`,r.o(this.root,`replay`),this.root.setAttribute(`role`,`group`),this.root.setAttribute(`aria-label`,this.labels.replay),this.root.dataset.fit=`full`,this.root.innerHTML=this.markup(),e.appendChild(this.root),this.wireEvents(),this.syncUi())}unmount(){this.announceTimer&&clearTimeout(this.announceTimer),this.announceTimer=null,this.root?.remove(),this.root=null,this.hintText=null,this.scrubber=null,this.timeLabel=null,this.playBtn=null,this.realtimeBtn=null,this.liveRegion=null,this.state=`stopped`,this.ended=!1,this.where=``}isMounted(){return this.root!==null}element(){return this.root}getMode(){return this.mode}setMode(e){let t=!!this.root?.contains(document.activeElement);this.mode=e,this.syncUi(),t&&(e===`replay`?(this.playBtn&&!this.playBtn.disabled?this.playBtn:this.realtimeBtn)?.focus():this.root?.querySelector(`[data-act="random"]`)?.focus())}setState(e){e!==this.state&&(this.state=e,this.syncUi(),this.mode===`replay`&&(e===`playing`?this.announce(this.labels.playingAt.replace(`{rate}`,this.formatRate(this.rate))):e===`paused`&&this.where&&this.announce(this.labels.pausedAt.replace(`{time}`,this.where))))}setEnded(e){this.ended!==e&&(this.ended=e,this.syncUi(),e&&this.where&&this.announce(this.labels.endedAt.replace(`{time}`,this.where)))}setPending(e){if(this.pending===e)return;this.pending=e;let t=document.activeElement;e&&t&&t!==this.playBtn&&this.root?.contains(t)&&Bt.includes(t.dataset.act??``)&&this.playBtn?.focus(),this.syncUi(),e&&this.mode===`replay`&&this.announce(this.labels.loading)}isPending(){return this.pending}setSteps(e,t){this.steps=e,this.step=t,this.widths.clear();let n=this.root?.querySelector(`[data-tcw="stepSlot"]`);n&&(n.innerHTML=this.stepMarkup(),this.wireStep(),this.syncUi())}setProgress(e,t,n){this.total=t;let r=n??`${Math.min(e+1,t)} / ${t}`,i=r!==this.where;if(this.where=r,this.scrubber){this.scrubber.max=String(Math.max(0,t-1)),this.scrubber.value=String(e),this.scrubber.setAttribute(`aria-valuetext`,r);let n=t>1?Math.min(e,t-1)/(t-1)*100:0;this.scrubber.style.setProperty(`--tcw-replay-done`,`${Number(n.toFixed(zt))}%`)}if(this.timeLabel){this.timeLabel.textContent=r;let e=Number.parseFloat(this.timeLabel.style.minInlineSize)||0;r.length>e&&(this.timeLabel.style.minInlineSize=`${r.length}ch`)}let a=this.scrubber!==null&&document.activeElement===this.scrubber;i&&this.mode===`replay`&&this.state!==`playing`&&!a&&this.announce(r)}setRoom(e){let t=this.root;if(t){for(let n of Lt)if(n===`stack`||this.widthIn(n)<=e){t.dataset.fit=n,this.orderFor(n);return}}}orderFor(e){let t=this.root,n=t?.querySelector(`.tcw-replay-timeline`),r=t?.querySelector(`.tcw-replay-transport`),i=this.realtimeBtn;if(!t||!n||!r||!i)return;let a=e===`stack`;if(a===(n.nextElementSibling===i))return;let o=document.activeElement;a?r.before(n,i):(r.nextElementSibling?.after(n),t.querySelector(`[data-act="cancel"]`)?.before(i)),o&&t.contains(o)&&document.activeElement!==o&&o.focus()}getFit(){return this.root?.dataset.fit??`full`}destroy(){this.unmount()}widthIn(e){let t=this.root,n=`${this.mode}|${this.steps.length}|${e}`,r=this.widths.get(n);if(r!==void 0)return r;let i=t.dataset.fit;t.dataset.fit=e,t.dataset.measure=``;let a=t.getBoundingClientRect().width;return delete t.dataset.measure,i&&(t.dataset.fit=i),a>0&&this.widths.set(n,a),a}markup(){let e=this.labels,t=`dir="${this.dir}"`,n=It.map(e=>`<option value="${e}"${e===this.rate?` selected`:``}>${a.u(this.formatRate(e))}</option>`).join(``),r=(e,t,n,r=`tcw-replay-btn`,i=``)=>`<button type="button" class="${r}" data-act="${e}" title="${a.u(t)}" aria-label="${a.u(t)}"${i}>${n}</button>`;return`
7901
7901
  <span class="tcw-replay-group tcw-replay-picking" data-mode="select">
7902
7902
  <span class="tcw-replay-hint" ${t}>${i.i(`cursor`,14)}<span data-tcw="hint">${a.u(e.selectHint)}</span></span>
7903
7903
  <button type="button" class="tcw-replay-text-btn tcw-replay-ghost" data-act="random" ${t}>${a.u(e.random)}</button>