@liberfi.io/ui-tradingview 0.1.19 → 0.1.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -787,6 +787,7 @@ declare class ChartDataFeed {
787
787
  private bridge;
788
788
  private abortController;
789
789
  constructor(settings: ChartSettings, chartManager: ChartManager, bridge: ChartWidgetBridge);
790
+ toJSON(): null;
790
791
  onReady(callback: (data: any) => void): Promise<void>;
791
792
  destroy(): void;
792
793
  resolveSymbol(symbolName: string, onResolve: ResolveCallback, onError: ErrorCallback, extension?: SymbolResolveExtension): Promise<void>;
@@ -794,6 +795,23 @@ declare class ChartDataFeed {
794
795
  subscribeBars(symbolInfo: LibrarySymbolInfo, resolution: ResolutionString, onTick: SubscribeBarsCallback, listenerGuid: string, onResetCacheNeededCallback: () => void): void;
795
796
  unsubscribeBars(listenerGuid: string): void;
796
797
  getMarks(symbolInfo: LibrarySymbolInfo, from: number, to: number, onDataCallback: GetMarksCallback<Mark>, resolution: ResolutionString): Promise<void>;
798
+ /**
799
+ * TradingView calls getQuotes to populate the current-price display in the
800
+ * chart header. Without this method, TradingView's internal quote session
801
+ * (qs_*) is created but never resolved, triggering "Cannot read properties
802
+ * of undefined" errors. Returning an "ok" status with empty values tells
803
+ * TradingView that the datafeed supports the quotes API but has no quote data
804
+ * beyond what is already on the chart, which suppresses the internal errors.
805
+ */
806
+ getQuotes(symbols: string[], onDataCallback: (data: any[]) => void, _onErrorCallback: (reason: string) => void): void;
807
+ /**
808
+ * TradingView calls subscribeQuotes to receive real-time price ticks for the
809
+ * header display. We return a no-op here because the chart already receives
810
+ * real-time data via subscribeBars. Implementing this stub prevents the
811
+ * internal qs_* session from remaining in a pending/broken state.
812
+ */
813
+ subscribeQuotes(_symbols: string[], _fastSymbols: string[], _onRealtimeCallback: (data: any[]) => void, _listenerGuid: string): void;
814
+ unsubscribeQuotes(_listenerGuid: string): void;
797
815
  }
798
816
 
799
817
  /**
@@ -822,6 +840,7 @@ declare class ChartSaveLoadAdapter {
822
840
  constructor(settings: ChartSettings, chartManager: ChartManager, bridge: ChartWidgetBridge);
823
841
  get layoutId(): string;
824
842
  get shouldResetColorPalette(): boolean;
843
+ toJSON(): null;
825
844
  getAllCharts(): Promise<any[]>;
826
845
  removeChart(_index: number): void;
827
846
  saveChart(chart: any): Promise<string>;
package/dist/index.d.ts CHANGED
@@ -787,6 +787,7 @@ declare class ChartDataFeed {
787
787
  private bridge;
788
788
  private abortController;
789
789
  constructor(settings: ChartSettings, chartManager: ChartManager, bridge: ChartWidgetBridge);
790
+ toJSON(): null;
790
791
  onReady(callback: (data: any) => void): Promise<void>;
791
792
  destroy(): void;
792
793
  resolveSymbol(symbolName: string, onResolve: ResolveCallback, onError: ErrorCallback, extension?: SymbolResolveExtension): Promise<void>;
@@ -794,6 +795,23 @@ declare class ChartDataFeed {
794
795
  subscribeBars(symbolInfo: LibrarySymbolInfo, resolution: ResolutionString, onTick: SubscribeBarsCallback, listenerGuid: string, onResetCacheNeededCallback: () => void): void;
795
796
  unsubscribeBars(listenerGuid: string): void;
796
797
  getMarks(symbolInfo: LibrarySymbolInfo, from: number, to: number, onDataCallback: GetMarksCallback<Mark>, resolution: ResolutionString): Promise<void>;
798
+ /**
799
+ * TradingView calls getQuotes to populate the current-price display in the
800
+ * chart header. Without this method, TradingView's internal quote session
801
+ * (qs_*) is created but never resolved, triggering "Cannot read properties
802
+ * of undefined" errors. Returning an "ok" status with empty values tells
803
+ * TradingView that the datafeed supports the quotes API but has no quote data
804
+ * beyond what is already on the chart, which suppresses the internal errors.
805
+ */
806
+ getQuotes(symbols: string[], onDataCallback: (data: any[]) => void, _onErrorCallback: (reason: string) => void): void;
807
+ /**
808
+ * TradingView calls subscribeQuotes to receive real-time price ticks for the
809
+ * header display. We return a no-op here because the chart already receives
810
+ * real-time data via subscribeBars. Implementing this stub prevents the
811
+ * internal qs_* session from remaining in a pending/broken state.
812
+ */
813
+ subscribeQuotes(_symbols: string[], _fastSymbols: string[], _onRealtimeCallback: (data: any[]) => void, _listenerGuid: string): void;
814
+ unsubscribeQuotes(_listenerGuid: string): void;
797
815
  }
798
816
 
799
817
  /**
@@ -822,6 +840,7 @@ declare class ChartSaveLoadAdapter {
822
840
  constructor(settings: ChartSettings, chartManager: ChartManager, bridge: ChartWidgetBridge);
823
841
  get layoutId(): string;
824
842
  get shouldResetColorPalette(): boolean;
843
+ toJSON(): null;
825
844
  getAllCharts(): Promise<any[]>;
826
845
  removeChart(_index: number): void;
827
846
  saveChart(chart: any): Promise<string>;
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var react=require('react'),jotai=require('jotai'),utils=require('jotai/utils'),lodashEs=require('lodash-es'),jsxRuntime=require('react/jsx-runtime');var j=(e=>(e.TradingView="TradingView",e.Original="Original",e))(j||{}),Dt=(e=>(e.Price="price",e.MarketCap="market_cap",e))(Dt||{}),Wt=(o=>(o.USD="USD",o.SOL="SOL",o.ETH="ETH",o.TRX="TRX",o.BNB="BNB",o))(Wt||{}),tt=(d=>(d[d.Bars=0]="Bars",d[d.Candles=1]="Candles",d[d.Line=2]="Line",d[d.Area=3]="Area",d[d.HeikenAshi=8]="HeikenAshi",d[d.HollowCandles=9]="HollowCandles",d[d.Baseline=10]="Baseline",d[d.HiLo=12]="HiLo",d[d.Column=13]="Column",d[d.LineWithMarkers=14]="LineWithMarkers",d[d.Stepline=15]="Stepline",d[d.HLCArea=16]="HLCArea",d[d.VolCandle=19]="VolCandle",d[d.Renko=4]="Renko",d[d.Kagi=5]="Kagi",d[d.PointAndFigure=6]="PointAndFigure",d[d.LineBreak=7]="LineBreak",d))(tt||{}),Bt=(e=>(e.Light="light",e.Dark="dark",e))(Bt||{}),et=(y=>(y.HeaderWidget="header_widget",y.HeaderCandleStyleMenu="header_candle_style_menu",y.HeaderFullscreenButton="header_fullscreen_button",y.MultiCharts="multi_charts",y.CreateVolumeIndicatorByDefault="create_volume_indicator_by_default",y.VolumeForceOverlay="volume_force_overlay",y.HideDrawingToolsByDefault="hide_drawing_tools_by_default",y.LegendSeriesTitle="legend_series_title",y.LegendVolume="legend_volume",y.TimeframesToolbar="timeframes_toolbar",y.SaveDrawingToServer="save_drawing_to_server",y))(et||{}),R=(g=>(g.Layout1A="1A",g.Layout2A="2A",g.Layout2B="2B",g.Layout3A="3A",g.Layout3B="3B",g.Layout3C="3C",g.Layout3D="3D",g.Layout3E="3E",g.Layout3F="3F",g.Layout4A="4A",g.Layout4B="4B",g.Layout4C="4C",g.Layout4D="4D",g.Layout4E="4E",g.Layout4F="4F",g.Layout5A="5A",g.Layout5B="5B",g.Layout5C="5C",g.Layout5D="5D",g.Layout6A="6A",g.Layout6B="6B",g.Layout6C="6C",g.Layout7A="7A",g.Layout8A="8A",g.Layout8B="8B",g.Layout8C="8C",g))(R||{}),Ot=(r=>(r[r.None=0]="None",r[r.ResetData=1]="ResetData",r[r.ResetChart=2]="ResetChart",r))(Ot||{});var ct=["header_widget","header_candle_style_menu","header_fullscreen_button","multi_charts","volume_force_overlay","legend_series_title","timeframes_toolbar","save_drawing_to_server"],S=["1s","30s","1m","1h","4h","1d"],T=["1s","15s","30s","1m","5m","15m","1h","4h","12h","1d"],ut=["1A","2A","2B","3A","3B","3C","3D","3E","3F","4A","4B","4C","4D","4E","4F","5A","5B","5C","5D","6A","6B","6C","7A","8A","8B","8C"],Nt=["click","keydown","mousedown","mouseup","contextmenu"],C={decrease:"#F04866",increase:"#1DB954",chartBg:"#1A1A1A",card:"#242424"},Ht={card:"#242424"};var _=utils.atomFamily(a=>jotai.atom(true)),I=utils.atomFamily(a=>jotai.atom(false)),f=utils.atomFamily(a=>jotai.atom(0)),x=utils.atomFamily(a=>jotai.atom([...S])),c=utils.atomFamily(a=>jotai.atom([])),w=utils.atomFamily(a=>jotai.atom(false)),M=utils.atomFamily(a=>jotai.atom("1A")),A=utils.atomFamily(a=>jotai.atom("TradingView")),D=utils.atomFamily(a=>jotai.atom("dark")),rt=utils.atomFamily(a=>jotai.atom("en")),at=utils.atomFamily(a=>jotai.atom("Etc/UTC")),it=utils.atomFamily(a=>jotai.atom("")),W=utils.atomFamily(a=>jotai.atom("kline")),ot=utils.atomFamily(a=>jotai.atom(false)),st=utils.atomFamily(a=>jotai.atom(null)),P=utils.atomFamily(a=>jotai.atom([])),F=utils.atomFamily(a=>jotai.atom([])),B=utils.atomFamily(a=>jotai.atom(false)),O=utils.atomFamily(a=>jotai.atom(t=>{let e=t(M(a)),r=t(A(a)),i=t(f(a)),o=t(x(a)),s=t(w(a)),n=t(c(a));return {layout:e,chartType:r,selectedIndex:i,pinnedResolutions:o,showDrawingToolbar:s,areaContents:n}}),lodashEs.isEqual);var V=class{settings;chartManager;chartIndex;store;prefix;pendingTickerSymbol=null;pendingResolution=null;constructor(t,e,r,i,o,s){this.settings=t,this.chartManager=e,this.chartIndex=r,this.store=i,this.prefix=o;let l={...{resolution:"1m",chartStyle:1,symbol:"",tickerSymbol:"",rightOffset:10,barSpacing:6,dataReady:false},...s};this.patchArea(l);}get state(){return this.store.get(c(this.prefix))[this.chartIndex]??{resolution:"1m",chartStyle:1,symbol:"",tickerSymbol:"",rightOffset:10,barSpacing:6,dataReady:false}}patchArea(t){let e=[...this.store.get(c(this.prefix))],r=e[this.chartIndex]??{resolution:"1m",chartStyle:1,symbol:"",tickerSymbol:"",rightOffset:10,barSpacing:6,dataReady:false};e[this.chartIndex]={...r,...t},this.store.set(c(this.prefix),e);}setState(t,e){e!=null&&this.patchArea({[t]:e});}get tickerSymbol(){return this.state.tickerSymbol}get symbol(){return this.state.symbol}get resolution(){return this.state.resolution}get chartStyle(){return this.state.chartStyle}get rightOffset(){return this.state.rightOffset}get barSpacing(){return this.state.barSpacing}get dataReady(){return this.state.dataReady}get internalChartWidget(){return this.chartManager.internalWidget?.chartByIndex(this.chartIndex)}setChartStyle(t){this.setState("chartStyle",t),this.internalChartWidget?.setChartStyle(t);}async setSymbol(t){if(this.state.tickerSymbol!==t){this.setState("tickerSymbol",t),this.setState("dataReady",false),this.pendingTickerSymbol=t;try{let e=[this.internalChartWidget?.handleSymbolChange(t,this.tickerSymbol),this.chartManager.symbolResolver?.resolveSymbolInfo(t).then(r=>{r&&this.setState("symbol",r.name);})];for(let r of await Promise.allSettled(e))if(r.status==="rejected")throw r.reason}catch(e){console.error(e);}finally{this.pendingTickerSymbol===t&&(this.pendingTickerSymbol=null);}this.tickerSymbol===t&&this.setState("dataReady",true);}}async setResolution(t){if(this.resolution!==t){this.setState("resolution",t),this.setState("dataReady",false),this.pendingResolution=t;try{await this.internalChartWidget?.handleResolutionChange(t,this.resolution);}finally{this.pendingResolution===t&&(this.pendingResolution=null);}}}toJSON(){return {...this.state}}widgetReady(){this.internalChartWidget?.dataReady()?.then(()=>this.handleChartReady())?.catch(()=>{});}get active(){return this.chartIndex<this.chartManager.chartCount}get selected(){return this.chartManager.selectedIndex===this.chartIndex}get symbolInfo(){return this.chartManager.symbolResolver?.getSymbolInfo(this.tickerSymbol)??null}destroy(){}async handleChartReady(){this.internalChartWidget&&(this.setState("dataReady",true),this.selected&&this.internalChartWidget.setBarSpacing(this.barSpacing));}};var N=class{prefix;settings;store;initialized=false;focused=false;reloadId=0;internalWidget=null;datafeed=null;symbolResolver=null;unsubAutoSave=null;constructor(t,e,r){this.prefix=t,this.store=e,this.settings=r;}get loading(){return this.store.get(_(this.prefix))}get fullscreen(){return this.store.get(I(this.prefix))}set fullscreen(t){this.store.set(I(this.prefix),t),t?document.body.classList.add("fullScreen"):document.body.classList.remove("fullScreen");}get selectedIndex(){return this.store.get(f(this.prefix))}set selectedIndex(t){this.store.set(f(this.prefix),t);}get pinnedResolutions(){return this.store.get(x(this.prefix))}set pinnedResolutions(t){this.store.set(x(this.prefix),t);}get showDrawingToolbar(){return this.store.get(w(this.prefix))}get chartCount(){return parseInt(this.settings.layout,10)||1}get areas(){let t=this.store.get(c(this.prefix));return this._areaManagers.slice(0,t.length)}_areaManagers=[];areaByIndex(t){return this.initialized&&this.updateChartContents(),this._areaManagers[t]??null}get activeArea(){return this.areaByIndex(this.selectedIndex)}async init(){if(this.initialized)return;let t=this.settings.saveLoadAdapter.getSettings();if(t?.selectedIndex!=null&&(this.selectedIndex=t.selectedIndex),t?.pinnedResolutions){let r=t.pinnedResolutions;r.length===S.length&&r.every(i=>S.includes(i))?this.pinnedResolutions=[...S]:this.pinnedResolutions=r;}if(t?.areaContents&&t.areaContents.forEach((r,i)=>{let o=new V(this.settings,this,i,this.store,this.prefix,r);this._areaManagers[i]=o;}),t?.showDrawingToolbar!=null&&this.store.set(w(this.prefix),t.showDrawingToolbar),this.settings.updateValue("layout",t?.layout),this.settings.updateValue("chartType",t?.chartType),this.settings.enableMultiCharts||this.settings.updateValue("layout","1A"),this.settings.enableHideDrawingToolsByDefault&&this.store.set(w(this.prefix),false),this.updateChartContents(),this.settings.tickerSymbol&&this.activeArea)try{await this.activeArea.setSymbol(this.settings.tickerSymbol);}catch(r){console.warn("ChartManager init failed to set symbol",r);}this.initialized=true;let e=lodashEs.debounce(()=>{let r=this.store.get(O(this.prefix));this.settings.saveLoadAdapter.saveSettings(r).catch(console.error);},1e3);this.unsubAutoSave=this.store.sub(O(this.prefix),e);}destroy(){this.unsubAutoSave?.(),this._areaManagers.forEach(t=>t.destroy()),this._areaManagers=[];}setLoading(t){this.store.set(_(this.prefix),t);}setLocale(t){this.settings.updateValue("locale",t);}setTimezone(t){this.settings.updateValue("timezone",t);}setFocused(t){this.focused=t;}setShowDrawingToolbar(t){this.store.set(w(this.prefix),t);}setInternalWidget(t){this.internalWidget=t,this.store.set(B(this.prefix),false);}onInternalWidgetReady(){this.store.set(B(this.prefix),true),this.areas.forEach((t,e)=>{e<this.chartCount&&t.widgetReady();});}setChartType(t){this.settings.updateValue("chartType",t);}setTheme(t){this.settings.theme!==t&&(this.settings.updateValue("theme",t),this.internalWidget?.onThemeChange?.(t,this.settings.reverseColor));}setReverseColor(t){this.settings.reverseColor!==t&&(this.settings.updateValue("reverseColor",t),this.internalWidget?.onThemeChange?.(this.settings.theme,t));}setLayout(t){let e=this.settings.enableMultiCharts?t:"1A";if(this.settings.layout!==e){this.settings.updateValue("layout",e),this.updateChartContents(),this.internalWidget?.onLayoutChange?.(e);let r=this.chartCount;setTimeout(()=>{if(this.store.get(B(this.prefix)))for(let i=r;i<this.chartCount;i++)this.areaByIndex(i)?.widgetReady();});}}reloadChart(){this.reloadId+=1;}updateChartContents(){if(this.chartCount>this._areaManagers.length)for(let t=this._areaManagers.length;t<this.chartCount;t++){let e=this._areaManagers[this.selectedIndex],r=e?.toJSON(),i=new V(this.settings,this,t,this.store,this.prefix,r);this._areaManagers[t]=i,this.selectedIndex!==t&&!e&&i.setSymbol(this.settings.tickerSymbol).catch(()=>{});}this.selectedIndex>=this.chartCount&&(this.selectedIndex=this.chartCount-1);}get settingsData(){return this.store.get(O(this.prefix))}getAllCharts(){return this.updateChartContents(),this._areaManagers.slice(0,this.chartCount)}};var H=class{storageId;constructor(t){this.storageId=t;}get settingsKey(){return `${this.storageId}.TvChart.Settings`}get shapesKey(){return `${this.storageId}.TvChart.Shapes`}getSettings(){let t=this.getLocalSettingsData(),e=this.getChartStoreData();return {layout:e?.layout,selectedIndex:e?.currentAreaIndex,chartType:e?.chartType,pinnedResolutions:e?.pinnedResolutions,areaContents:e?.areas?.map(i=>({resolution:i.resolution||i.period||"1m",chartStyle:i.chartStyle,symbol:i.symbol,tickerSymbol:i.tickerSymbol,rightOffset:i.rightOffset,barSpacing:i.barSpacing})),showDrawingToolbar:e?.drawing?.toolbarSwitch,drawing:t?.drawing?{...t.drawing,defaultStates:lodashEs.omit(t,["drawing","DrawingToolGroupLastUsedTool","riskRewardAvailableChanged","riskRewardRiskSizeChanged","drawingShapeTemplate"]),lastUsedTools:t.DrawingToolGroupLastUsedTool,riskRewardAvailableChanged:t.riskRewardAvailableChanged,riskRewardRiskSizeChanged:t.riskRewardRiskSizeChanged,drawingShapeTemplate:t.drawingShapeTemplate}:void 0}}getChartStoreData(){return this.getLocalData(this.storageId)}setChartStoreData(t){this.setLocalData(this.storageId,t);}async saveSettings(t){let e=this.getChartStoreData(),r={...e,layout:t.layout,currentAreaIndex:t.selectedIndex,chartType:t.chartType,pinnedResolutions:t.pinnedResolutions,areas:t.areaContents?.map((i,o)=>({...e?.areas?.[o],...i})),drawing:{...e?.drawing,toolbarSwitch:t.showDrawingToolbar}};this.setChartStoreData(r);}async getShapes(t){let e=this.getLocalShapesData();return !e||!e[t]?[]:Object.values(e[t])}async saveShapes(t,e){let r=this.getLocalShapesData()||{};r[t]={...r[t],...e},Object.keys(r[t]).forEach(i=>{r[t][i]||delete r[t][i];}),this.setLocalShapesData(r);}getLocalData(t){try{let e=localStorage.getItem(t);return e?JSON.parse(e):null}catch{return null}}setLocalData(t,e){localStorage.setItem(t,JSON.stringify(e));}getLocalSettingsData(){return this.getLocalData(this.settingsKey)}getLocalShapesData(){return this.getLocalData(this.shapesKey)}setLocalShapesData(t){this.setLocalData(this.shapesKey,t);}};function nt(a){let[t,e,r,i]=a.split("/");return {address:e,chain:t,quote:r,priceType:i}}function ue(a){return !a.quote||!a.priceType?`${a.chain}/${a.address}`:`${a.chain}/${a.address}/${a.quote}/${a.priceType}`}function lt(a){return `${a.chain}/${a.address}`}var me={dark:"Dark",light:"Light"};function E(a){return me[a.toLowerCase()]??"Dark"}var Ut={"1s":"1S","5s":"5S","15s":"15S","30s":"30S","1m":"1","5m":"5","15m":"15","30m":"30","1h":"60","4h":"240","12h":"720","1d":"1D"};function v(a="1m"){return Ut[a]??Ut["1m"]}var pe={"1S":"1s","5S":"5s","15S":"15s","30S":"30s",1:"1m",5:"5m",15:"15m",30:"30m",60:"1h",240:"4h",720:"12h","1D":"1d"};function mt(a){return pe[a]??"1s"}var ye={en:"en","zh-CN":"zh","zh-TW":"zh"};function fe(a){return ye[a]??a}var zt={"1A":"s","2A":"2h","2B":"2v","3A":"3s","3B":"3h","3C":"3v","3D":"2-1","3E":"1-2","3F":"3r","4A":"4","4B":"4h","4C":"4v","4D":"4s","4E":"1-3","4F":"2-2","5A":"1-4","5B":"5s","5C":"2-3","5D":"5h","6A":"6","6B":"6c","6C":"6h","7A":"7h","8A":"8","8B":"8c","8C":"8h"};function U(a){return zt[a]??"s"}var Ce=Object.fromEntries(Object.entries(zt).map(([a,t])=>[t,a]));function pt(a){return Ce[a]??"1A"}var be={"1s":1e3,"5s":5e3,"15s":15e3,"30s":3e4,"1m":6e4,"5m":3e5,"15m":9e5,"30m":18e5,"1h":36e5,"4h":144e5,"12h":432e5,"1d":864e5};function ve(a){let t=be[a];if(!t)throw new Error(`Invalid interval: ${a}`);return t}function Se(a,t){let e=a.toString().length>10?a:1e3*a;return Math.floor(e/t)*t}var z=class{prefix;store;supportedResolutions=T.map(v);supportedLayouts=ut;supportedChartTypes=["TradingView"];chartNames={};priceFormatterFactory=null;saveLoadAdapter;constructor(t,e){this.prefix=t,this.store=e,this.saveLoadAdapter=new H(t),this.store.set(W(t),t);}get layout(){return this.store.get(M(this.prefix))}get chartType(){return this.store.get(A(this.prefix))}get theme(){return this.store.get(D(this.prefix))}get reverseColor(){return this.store.get(ot(this.prefix))}get locale(){return this.store.get(rt(this.prefix))}get timezone(){return this.store.get(at(this.prefix))}get tickerSymbol(){return this.store.get(it(this.prefix))}get storageId(){return this.store.get(W(this.prefix))}get backgroundColor(){return this.store.get(st(this.prefix))}get enabledFeatures(){return this.store.get(P(this.prefix))}get disabledFeatures(){return this.store.get(F(this.prefix))}updateValue(t,e){if(e==null)return;let i={layout:()=>this.store.set(M(this.prefix),e),chartType:()=>this.store.set(A(this.prefix),e),theme:()=>this.store.set(D(this.prefix),e),reverseColor:()=>this.store.set(ot(this.prefix),e),locale:()=>this.store.set(rt(this.prefix),e),timezone:()=>this.store.set(at(this.prefix),e),tickerSymbol:()=>this.store.set(it(this.prefix),e),storageId:()=>this.store.set(W(this.prefix),e),backgroundColor:()=>this.store.set(st(this.prefix),e),enabledFeatures:()=>this.store.set(P(this.prefix),e),disabledFeatures:()=>this.store.set(F(this.prefix),e)}[t];i&&i();}isFeatureEnabled(t){return !this.disabledFeatures.includes(t)&&this.enabledFeatures.includes(t)||ct.includes(t)}setFeature(t,e){this.resetFeature(t),e?this.store.set(P(this.prefix),[...this.enabledFeatures,t]):this.store.set(F(this.prefix),[...this.disabledFeatures,t]);}resetFeature(t){this.store.set(P(this.prefix),this.enabledFeatures.filter(e=>e!==t)),this.store.set(F(this.prefix),this.disabledFeatures.filter(e=>e!==t));}get enableMultiCharts(){return this.isFeatureEnabled("multi_charts")}get enableCreateVolumeIndicatorByDefault(){return this.isFeatureEnabled("create_volume_indicator_by_default")}get enableHideDrawingToolsByDefault(){return this.isFeatureEnabled("hide_drawing_tools_by_default")}get enableLegendSeriesTitle(){return this.isFeatureEnabled("legend_series_title")}get enableLegendVolume(){return this.isFeatureEnabled("legend_volume")}get enableTimeframesToolbar(){return this.isFeatureEnabled("timeframes_toolbar")}get enableVolumeForceOverlay(){return this.isFeatureEnabled("volume_force_overlay")}sub(t,e){let i={layout:M(this.prefix),chartType:A(this.prefix),theme:D(this.prefix)}[t];return i?this.store.sub(i,e):()=>{}}};var $=class{datafeed;cache=new Map;pendingRequests=new Map;constructor(t){this.datafeed=t;}async resolveSymbolInfo(t){return this.datafeed.resolveSymbol(t)}async resolveSymbolInfos(t){return t.filter(r=>!this.cache.has(r)&&!this.pendingRequests.has(r)).forEach(r=>{let i=this.resolveSymbolInfo(r);i.then(o=>{o&&this.cache.set(r,o);}).finally(()=>this.pendingRequests.delete(r)),this.pendingRequests.set(r,i);}),await Promise.all(t.filter(r=>this.pendingRequests.has(r)).map(r=>this.pendingRequests.get(r))),t.map(r=>this.cache.get(r)??null).filter(r=>r!==null)}getSymbolInfo(t){return this.resolveSymbolInfo(t).catch(e=>{console.error("ChartSymbolResolver.getSymbolInfo",e);}),this.cache.get(t)??null}};var yt=({initConfig:a,children:t})=>{let{chartManager:e,chartSettings:r}=h(),[i,o]=react.useState(false);return react.useEffect(()=>{e.initialized||(r.updateValue("tickerSymbol",a.tickerSymbol),r.updateValue("theme",a.theme),r.updateValue("reverseColor",a.reverseColor),r.updateValue("layout",a.layout),r.updateValue("chartType",a.chartType),r.updateValue("timezone",a.timezone),r.updateValue("locale",a.locale),r.updateValue("backgroundColor",a.backgroundColor),r.updateValue("storageId",a.storageId),r.updateValue("enabledFeatures",a.enabledFeatures),r.updateValue("disabledFeatures",a.disabledFeatures),a.chartNames&&(r.chartNames=a.chartNames),a.priceFormatterFactory&&(r.priceFormatterFactory=a.priceFormatterFactory),a.supportedResolutions&&(r.supportedResolutions=a.supportedResolutions),a.supportedLayouts&&(r.supportedLayouts=a.supportedLayouts),a.supportedChartTypes&&(r.supportedChartTypes=a.supportedChartTypes),e.datafeed=a.datafeed,e.symbolResolver=new $(a.datafeed));},[e,r,a]),react.useEffect(()=>(e.init().then(()=>o(true)).catch(s=>{console.error("TradingViewConfig chartManager init error",s);}),()=>{e.destroy();}),[e]),e.initialized?jsxRuntime.jsx(jsxRuntime.Fragment,{children:t}):null};var qt=react.createContext(null);function h(){let a=react.useContext(qt);if(!a)throw new Error("useTvChartContext must be used within TradingViewProvider");return a}function Ae(){return h().chartManager}function Pe(){return h().prefix}var ht=class{setting;chartManager;constructor(t,e){this.setting=t,this.chartManager=e;}get internalWidget(){return this.chartManager.internalWidget}chartCount(){return this.chartManager.chartCount}setActiveChart(t){t<this.chartCount()&&(this.chartManager.selectedIndex=t);}layout(){return this.setting.layout}setLayout(t){this.chartManager.setLayout(t);}theme(){return this.setting.theme}setTheme(t){this.chartManager.setTheme(t);}setChartType(t){this.chartManager.setChartType(t);}getSetting(){return this.setting}getChartManager(){return this.chartManager}},ft=react.forwardRef(({children:a,initConfig:t,widgetConstructor:e,libraryPath:r,customCssUrl:i},o)=>{let s=jotai.useStore(),n=t.storageId,l=react.useMemo(()=>new z(n,s),[n,s]),u=react.useMemo(()=>new N(n,s,l),[n,s,l]),b=react.useMemo(()=>new ht(l,u),[l,u]);react.useImperativeHandle(o,()=>b,[b]);let y=react.useMemo(()=>({prefix:n,chartSettings:l,chartManager:u,widgetConstructor:e,libraryPath:r,customCssUrl:i}),[n,l,u,e,r,i]);return jsxRuntime.jsx(qt.Provider,{value:y,children:jsxRuntime.jsx(yt,{initConfig:t,children:a})})});var Ct=react.memo(()=>{let{prefix:a,chartManager:t}=h(),e=jotai.useAtomValue(I(a)),r=react.useCallback(()=>{t.fullscreen=!t.fullscreen;},[t]);return jsxRuntime.jsx("button",{type:"button",onClick:r,className:"text-xs text-muted-foreground hover:text-foreground px-1.5 py-0.5 rounded hover:bg-muted cursor-pointer transition-colors",title:e?"Exit fullscreen":"Fullscreen",children:e?"Exit":"Fullscreen"})});var Yt=react.createContext(null);function J(){let a=react.useContext(Yt);if(!a)throw new Error("useTvChartToolbarContext must be used within TradingViewToolbarProvider");return a}var vt=({children:a})=>{let{prefix:t,chartManager:e}=h(),r=jotai.useAtomValue(f(t)),i=jotai.useAtomValue(c(t)),o=react.useMemo(()=>i.length?e.areaByIndex(r):null,[e,r,i]),s=react.useMemo(()=>o?.symbolInfo??null,[o]),n=react.useMemo(()=>({activeAreaManager:o,symbolInfo:s}),[o,s]);return jsxRuntime.jsx(Yt.Provider,{value:n,children:a})};var Xt={0:"Bars",1:"Candles",2:"Line",3:"Area",8:"Heiken Ashi",9:"Hollow",10:"Baseline"},He=[1,0,2,3,9,8,10],St=react.memo(()=>{let {prefix:a}=h(),{activeAreaManager:t}=J(),e=jotai.useAtomValue(c(a)),r=jotai.useAtomValue(f(a)),i=e[r]?.chartStyle??1,s=react.useCallback(n=>{let l=parseInt(n.target.value,10);t?.setChartStyle(l);},[t]);return jsxRuntime.jsx("select",{value:i,onChange:s,className:"text-xs bg-transparent text-muted-foreground hover:text-foreground cursor-pointer border-none outline-none px-1 py-0.5",title:"K-line style",children:He.map(n=>jsxRuntime.jsx("option",{value:n,children:Xt[n]??n},n))})});var Tt=react.memo(()=>{let{chartManager:a}=h(),t=react.useCallback(()=>{a.internalWidget?.openIndicatorSettingsDialog();},[a]);return jsxRuntime.jsx("button",{type:"button",onClick:t,className:"text-xs text-muted-foreground hover:text-foreground px-1.5 py-0.5 rounded hover:bg-muted cursor-pointer transition-colors",title:"Indicators",children:"Indicators"})});var xt=react.memo(()=>{let{chartManager:a}=h(),t=react.useCallback(()=>{a.internalWidget?.openSettingsDialog();},[a]);return jsxRuntime.jsx("button",{type:"button",onClick:t,className:"text-xs text-muted-foreground hover:text-foreground px-1.5 py-0.5 rounded hover:bg-muted cursor-pointer transition-colors",title:"Chart settings",children:"Settings"})});var Lt=react.memo(()=>{let{prefix:a,chartManager:t}=h(),{activeAreaManager:e}=J(),r=jotai.useAtomValue(x(a)),i=jotai.useAtomValue(c(a)),o=jotai.useAtomValue(f(a)),s=i[o]?.resolution,n=react.useCallback(l=>{e?.setResolution(l);},[e]);return jsxRuntime.jsx("div",{className:"flex items-center gap-0.5",children:r.map(l=>jsxRuntime.jsx("button",{type:"button",onClick:()=>n(l),className:`px-2 py-0.5 text-xs rounded cursor-pointer transition-colors ${s===l?"bg-primary text-primary-foreground":"text-muted-foreground hover:text-foreground hover:bg-muted"}`,children:l},l))})});var Rt=react.memo(()=>{let{chartManager:a}=h(),t=react.useCallback(async()=>{try{let e=await a.internalWidget?.takeClientScreenshot();if(!e)return;let r=document.createElement("a");r.download=`chart-${Date.now()}.png`,r.href=e.toDataURL("image/png"),r.click();}catch(e){console.error("TradingViewSnapshot",e);}},[a]);return jsxRuntime.jsx("button",{type:"button",onClick:t,className:"text-xs text-muted-foreground hover:text-foreground px-1.5 py-0.5 rounded hover:bg-muted cursor-pointer transition-colors",title:"Take snapshot",children:"Snapshot"})});var It=react.memo(({children:a,prefix:t,suffix:e,showResolutions:r=true,showKlineStyleSelect:i=true,showOpenIndicator:o=true,showOpenSettings:s=true,showFullscreen:n=true,showSnapshot:l=true})=>jsxRuntime.jsx(vt,{children:jsxRuntime.jsxs("div",{className:"flex items-center gap-1 px-2 py-1 border-b border-border min-h-[36px] flex-shrink-0",children:[t,a??jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[r&&jsxRuntime.jsx(Lt,{}),jsxRuntime.jsxs("div",{className:"flex items-center gap-0.5 ml-auto",children:[i&&jsxRuntime.jsx(St,{}),o&&jsxRuntime.jsx(Tt,{}),s&&jsxRuntime.jsx(xt,{}),l&&jsxRuntime.jsx(Rt,{}),n&&jsxRuntime.jsx(Ct,{})]})]}),e]})}));var q=class{settings;chartManager;bridge;chartIndex;constructor(t,e,r,i){this.settings=t,this.chartManager=e,this.bridge=r,this.chartIndex=i;}get chartAreaManager(){return this.chartManager.areaByIndex(this.chartIndex)}get widget(){return this.bridge.getWidget()}get chartWidget(){return this.widget?.chart(this.chartIndex)??null}setChartStyle(t){this.chartWidget?.setChartType(t);}getChartStyle(){return this.chartWidget?.chartType()??1}handleSymbolChange(t,e){return this.bridge.asyncWidgetMethodContext((r,i)=>{r.chart(this.chartIndex).setSymbol(t,{dataReady:()=>i(),doNotActivateChart:false});})}handleResolutionChange(t,e){return this.bridge.asyncWidgetMethodContext((r,i)=>{let o=r.chart(this.chartIndex);o.dataReady(()=>{o.setResolution(v(t),{dataReady:i,doNotActivateChart:true}).catch(()=>{});});})}setPrecision(t){this.widget?.applyOverrides({"mainSeriesProperties.minTick":t===null?"default":`${Math.pow(10,t)},1,false`});}async dataReady(){if(await this.bridge.onReady(),!this.chartWidget)throw Error("ChartWidget: chartWidget is null");return new Promise(t=>{this.chartWidget?.dataReady(()=>setTimeout(t));})}timeScaleWidth(){return this.chartWidget?.getTimeScale()?.width()??NaN}rightOffset(){return this.chartWidget?.getTimeScale()?.rightOffset()??NaN}setRightOffset(t){this.chartWidget?.getTimeScale()?.setRightOffset(t);}barSpacing(){return this.chartWidget?.getTimeScale()?.barSpacing()??NaN}setBarSpacing(t){this.chartWidget?.getTimeScale()?.setBarSpacing(t);}};var G=class{settings;chartManager;bridge;constructor(t,e,r){this.settings=t,this.chartManager=e,this.bridge=r;}get widget(){return this.bridge.getWidget()}chartByIndex(t){return new q(this.settings,this.chartManager,this.bridge,t)}activeChart(){let t=this.widget?.activeChartIndex();return t===void 0?void 0:this.chartByIndex(t)}openIndicatorSettingsDialog(){this.widget?.activeChart().executeActionById("insertIndicator");}openSettingsDialog(){this.widget?.activeChart().executeActionById("chartProperties");}takeClientScreenshot(){return this.widget?.takeClientScreenshot()}onLayoutChange(t){this.widget?.setLayout(U(t));}async onThemeChange(t,e){let r=E(t);await this.widget?.changeTheme(r,{disableUndo:true}),this.bridge.applyColorPaletteOverrides();}};var Y=class{listeners=new Map;on(t,e){return this.listeners.has(t)||this.listeners.set(t,new Set),this.listeners.get(t).add(e),()=>{this.listeners.get(t)?.delete(e);}}emit(t,e){this.listeners.get(t)?.forEach(r=>r(e));}off(t,e){this.listeners.get(t)?.delete(e);}clear(){this.listeners.clear();}};var K=class{settings;chartManager;bridge;abortController=new AbortController;constructor(t,e,r){this.settings=t,this.chartManager=e,this.bridge=r;}async onReady(t){setTimeout(()=>{t({supported_resolutions:T.map(v),supports_marks:true,exchanges:[]});}),await this.chartManager.datafeed?.onReady({setting:this.settings,chartManager:this.chartManager,instance:this.bridge});}destroy(){this.abortController.abort();}async resolveSymbol(t,e,r,i){try{let o=await this.chartManager.datafeed?.resolveSymbol(t,i);o&&e(o);}catch(o){console.error("ChartDataFeed.resolveSymbol",o),r(o);}}async getBars(t,e,r,i,o){try{let s=await this.chartManager.datafeed?.getBars(t,e,r);s&&i(s,{noData:s.length===0});}catch(s){console.error("ChartDataFeed.getBars",s),o(s);}}subscribeBars(t,e,r,i,o){this.chartManager.datafeed?.subscribeBars(t,e,r,i,o);}unsubscribeBars(t){this.chartManager.datafeed?.unsubscribeBars(t);}async getMarks(t,e,r,i,o){this.chartManager.datafeed?.getMarks?.(t,e,r,i,o);}};var X=class{settings;chartManager;bridge;data;drawings;constructor(t,e,r){this.settings=t,this.chartManager=e,this.bridge=r,this.data=null,this.drawings=null,this.loadDataFromLocalStorage();}get layoutId(){return this.settings.storageId}get shouldResetColorPalette(){let t=this.data?.theme,e=this.data?.reverseColor;return t!==this.settings.theme||e!==this.settings.reverseColor}getAllCharts(){return new Promise(t=>{let e=[];this.data&&e.push({id:this.data.id,name:this.data.name,symbol:this.data.symbol,resolution:this.data.resolution,timestamp:this.data.timestamp}),t(e);})}removeChart(t){throw Error("Method not implemented.")}async saveChart(t){return this.data={...t,theme:this.settings.theme,reverseColor:this.settings.reverseColor,id:this.layoutId,timestamp:0},this.saveDataToLocalStorage(),this.data.id}getChartContent(t){return new Promise(e=>{let r=JSON.parse(this.data.content),i=JSON.parse(r.charts_symbols),o=JSON.parse(r.content);e(JSON.stringify({...r,chart_symbols:JSON.stringify(i),content:JSON.stringify(o)}));})}async saveLineToolsAndGroups(t,e,r){this.drawings=this.drawings||{data:{},timestamp:0},this.drawings.data=this.drawings.data||{},this.drawings.data[e]=this.drawings.data[e]||{};try{if(!r.sources)return;for(let[i,o]of r.sources)if(!o||!o.symbol||!o.state||Object.keys(o.state).length===0||i.includes("/"))o===null&&delete this.drawings.data[e][i];else {let{address:s,chain:n}=nt(o.symbol),l=lt({address:s,chain:n}),u={...o,symbol:l,id:o.id.indexOf("/")>0?o.id.split("/")[0]:o.id};this.drawings.data[e][i]=u;}this.saveDataToLocalStorage();}catch(i){console.error("saveLineToolsAndGroups",i);}}async loadLineToolsAndGroups(t,e,r,i){if(!i?.symbol||!this.drawings?.data?.[e])return null;let o=i.symbol,{address:s,chain:n}=nt(o),l=lt({address:s,chain:n}),u=lodashEs.uniqBy(Object.values(lodashEs.cloneDeep(this.drawings.data[e])).filter(b=>b.symbol===l),"id");try{return {sources:new Map(u.map(b=>{let y=lodashEs.cloneDeep({...b,symbol:o});return [y.id,y]}))}}catch(b){return console.error("ChartSaveLoadAdapter.loadLineToolsAndGroups",b),null}}getLayoutKey(t){return `charts.tradingview.data.${t}`}getDrawingKey(t){return `charts.tradingview.drawing.${t}`}loadDataFromLocalStorage(){let t=this.getLayoutKey(this.layoutId),e=this.getDrawingKey(this.layoutId),r=localStorage.getItem(t),i=localStorage.getItem(e);if(r)try{let o=JSON.parse(r),s=JSON.parse(o.content);o.content=JSON.stringify(s),this.data=o;}catch(o){console.error("ChartSaveLoadAdapter loadDataFromLocalStorage parse layout error",o);}if(i)try{this.drawings=JSON.parse(i);}catch(o){console.error("ChartSaveLoadAdapter loadDataFromLocalStorage parse drawing error",o);}}saveDataToLocalStorage(){let t=this.getLayoutKey(this.layoutId),e=this.getDrawingKey(this.layoutId),r=Math.round(Date.now()/1e3);this.data&&(this.data.timestamp=r,localStorage.setItem(t,JSON.stringify(this.data))),this.drawings&&(this.drawings.timestamp=r,localStorage.setItem(e,JSON.stringify(this.drawings)));}};var Mt="trading.chart.proterty",Z=class{storagePrefix;initialSettings;constructor(t,e,r){this.storagePrefix=`tradingview.${t.storageId}.`,this.initialSettings={};for(let o=0;o<localStorage.length;o++){let s=localStorage.key(o);if(s&&s.startsWith(this.storagePrefix)){let n=s.slice(this.storagePrefix.length);this.initialSettings[n]=localStorage.getItem(s);}}let i={noConfirmEnabled:1};if(this.initialSettings[Mt])try{let o=JSON.parse(this.initialSettings[Mt]);Object.assign(i,o),Object.assign(i,{noConfirmEnabled:!0});}catch(o){console.error("ChartSettingsAdapter: failed to parse chart settings",o);}this.initialSettings[Mt]=JSON.stringify(i);}toJSON(){return null}removeValue(t){delete this.initialSettings[t],localStorage.removeItem(`${this.storagePrefix}${t}`);}setValue(t,e){this.initialSettings[t]=e,localStorage.setItem(`${this.storagePrefix}${t}`,e);}};var Q=class{settings;chartManager;WidgetCtor;moduleInstances=new Map;symbolIntervalSubs=new Map;abortController=new AbortController;widgetReadyPromise=null;readyPromise=null;widget=null;container=null;ready=false;layoutReady=true;events=new Y;libraryPath;customCssUrl;constructor(t,e,r,i){this.settings=t,this.chartManager=e,this.WidgetCtor=r,this.libraryPath=i?.libraryPath??"/static/charting_library/",this.customCssUrl=i?.customCssUrl??"/static/charting_library/custom-styles.css",this.initModules();}getWidget(){return this.widget}async init(t){if(this.widgetReadyPromise)throw new Error("ChartWidgetBridge already initialized.");let e=this.getWidgetOptions();this.container=t,this.widget=new this.WidgetCtor({...e,container:t});let r=new Promise(i=>{this.widget?.onChartReady(()=>i());});this.widgetReadyPromise=r,this.readyPromise=r.then(()=>{this.ready=true,this.handleChartReady();}),this.moduleInstances.forEach((i,o)=>{try{i.init?.call(i);}catch(s){console.warn(`ChartWidgetBridge init module ${o}`,s);}}),await Promise.race([this.readyPromise,new Promise((i,o)=>setTimeout(o,6e4,new Error("ChartWidgetBridge init timeout")))]);}async destroy(){this.moduleInstances.forEach(t=>t.destroy?.call(t)),this.symbolIntervalSubs.forEach(t=>t()),this.symbolIntervalSubs.clear(),this.events.clear(),this.abortController.abort(),this.ready=false,this.widgetReadyPromise=null,this.readyPromise=null,this.widget?.remove(),this.widget=null;}async onReady(){return new Promise((t,e)=>{this.widget?this.widget.onChartReady(()=>this.readyPromise?.then(t).catch(e)):e(Error("cannot call `onReady` before `init`"));})}async asyncWidgetMethodContext(t){return new Promise((e,r)=>{if(!this.widgetReadyPromise){r(new Error("ChartWidgetBridge: widget not ready"));return}let i=this.widgetReadyPromise.then(()=>this.waitForLayout()),o=this.abortController.signal,s=()=>r(o.reason);o.addEventListener("abort",s),i.then(()=>t(this.widget,e)).catch(r).finally(()=>o.removeEventListener("abort",s));})}getModule(t){return this.moduleInstances.get(t)}applyColorPaletteOverrides(){this.widget?.applyOverrides(this.getColorPaletteOverrides()),this.widget?.applyStudiesOverrides(this.getColorPaletteStudiesOverrides());}getWidgetOptions(){let t=["header_widget","legend_inplace_edit","display_market_status","save_shortcut","show_interval_dialog_on_key_press","symbol_info","symbol_search_hot_key","uppercase_instrument_names","show_symbol_logo_in_legend","show_symbol_logo_for_compare_studies","drawing_templates"],e=["determine_first_data_request_size_using_visible_range","request_only_visible_range_on_reset","show_exchange_logos","show_symbol_logos","dont_show_boolean_study_arguments","hide_last_na_study_output","hide_right_toolbar","seconds_resolution","saveload_separate_drawings_storage","volume_force_overlay","create_volume_indicator_by_default","two_character_bar_marks_labels"];return this.settings.enableHideDrawingToolsByDefault&&e.push("hide_left_toolbar_by_default"),this.settings.enableTimeframesToolbar||t.push("timeframes_toolbar"),this.settings.enableCreateVolumeIndicatorByDefault||t.push("create_volume_indicator_by_default"),this.settings.enableVolumeForceOverlay||t.push("volume_force_overlay"),{container:"",autosize:true,debug:false,load_last_chart:true,auto_save_delay:1,timezone:this.localTimezone,library_path:this.libraryPath,custom_css_url:this.customCssUrl,theme:E(this.settings.theme),custom_font_family:window.getComputedStyle(document.body).fontFamily,symbol:this.chartManager.activeArea?.tickerSymbol,interval:v(this.chartManager.activeArea?.resolution),locale:this.settings.locale,datafeed:this.getModule("datafeed"),save_load_adapter:this.getModule("saveLoadAdapter"),settings_adapter:this.getModule("settingsAdapter"),custom_formatters:{priceFormatterFactory:this.settings.priceFormatterFactory?(r,i)=>this.settings.priceFormatterFactory(r,i):()=>({})},overrides:{...this.getSettingsOverrides(),...this.getColorPaletteOverrides()},studies_overrides:this.getColorPaletteStudiesOverrides(),disabled_features:t,enabled_features:e,supported_resolutions:T.map(v)}}async handleChartReady(){let t=U(this.settings.layout);t!==this.widget?.layout()&&await this.waitForLayout(t),this.widget?.setActiveChart(this.chartManager.selectedIndex),this.getModule("saveLoadAdapter")?.shouldResetColorPalette&&(await this.widget?.changeTheme(E(this.settings.theme),{disableUndo:true}),this.applyColorPaletteOverrides()),this.widget?.subscribe("onAutoSaveNeeded",this.onAutoSaveNeeded.bind(this)),this.widget?.subscribe("activeChartChanged",this.activeChartChanged.bind(this)),this.widget?.subscribe("layout_about_to_be_changed",this.layoutWillChange.bind(this)),this.widget?.subscribe("layout_changed",this.layoutChanged.bind(this)),this.syncChartsChanges(),this.subscribeChartsChanges(),this.installEventHooks(),this.resetTimezone();}onAutoSaveNeeded(){try{this.widget?.saveChartToServer(void 0,void 0,{defaultChartName:"DEFAULT"});}catch(t){console.warn("ChartWidgetBridge.onAutoSaveNeeded",t);}}activeChartChanged(t){this.chartManager.selectedIndex=t,this.chartManager.settings.saveLoadAdapter.saveSettings(this.chartManager.settingsData);}layoutWillChange(t){this.layoutReady=false,this.chartManager.setLayout(pt(t));}layoutChanged(){this.layoutReady=true,this.syncChartsChanges(),this.subscribeChartsChanges(),this.widget?.unloadUnusedCharts(),this.widget?.saveChartToServer();}syncChartsChanges(){this.widget?.symbolSync()?.setValue(false),this.widget?.intervalSync()?.setValue(false);let t=this.widget?.chartsCount()??0;for(let e=0;e<t;e++){let r=this.chartManager.areaByIndex(e),i=this.widget.chart(e);i.setSymbol(r?.tickerSymbol??"",{doNotActivateChart:true}),i.setResolution(v(r?.resolution),{doNotActivateChart:true});}}subscribeChartsChanges(){let t=this.widget?.chartsCount()??0;this.symbolIntervalSubs.forEach((e,r)=>{parseInt(r)>=t&&(e(),this.symbolIntervalSubs.delete(r));});for(let e=0;e<t;e++){if(this.symbolIntervalSubs.has(`${e}`))continue;let r=this.chartManager.areaByIndex(e),i=this.widget.chart(e);i.getPanes().forEach(u=>u.getMainSourcePriceScale()?.setAutoScale(true));let o=i.onSymbolChanged(),s=i.onIntervalChanged(),n=()=>{this.events.emit("symbolChanged",[e,i.symbol()]),r?.setSymbol(i.symbol()).catch(()=>{}),this.onAutoSaveNeeded();},l=u=>{let b=mt(u);this.events.emit("resolutionChanged",[e,b]),r?.setResolution(b).catch(()=>{});};o.subscribe(r,n),s.subscribe(r,l),this.symbolIntervalSubs.set(`${e}`,()=>{o.unsubscribe(r,n),s.unsubscribe(r,l);});}}installEventHooks(){let t=this.container?.lastElementChild,e=t?.contentWindow?.document;if(e&&(e.addEventListener("click",()=>t?.click()),e.defaultView?.MutationObserver)){let r=new WeakSet,i=e.querySelector(".layout__area--center");if(i){let o=()=>{i.querySelectorAll(".chart-container").forEach((s,n)=>{r.has(s)||(r.add(s),Nt.forEach(l=>{s.addEventListener(l,u=>this.events.emit("domEvent",[n,l,u]),{passive:true});}));});};new e.defaultView.MutationObserver(o).observe(i,{childList:true}),o();}}}resetTimezone(){try{let t=this.widget?.chartsCount()??0;for(let e=0;e<t;e++)this.widget?.chart(e)?.getTimezoneApi()?.setTimezone(this.localTimezone);}catch(t){console.error("ChartWidgetBridge: Reset timezone",t);}}get localTimezone(){return Intl.DateTimeFormat().resolvedOptions().timeZone}async waitForLayout(t){if(!this.widget||this.layoutReady&&!t)return;let e;return new Promise(i=>{e=i,this.widget.subscribe("layout_changed",i),t&&this.widget.setLayout(t);}).finally(()=>{this.widget.unsubscribe("layout_changed",e);})}getSettingsOverrides(){return {"mainSeriesProperties.minTick":"default","paneProperties.legendProperties.showSeriesTitle":this.settings.enableLegendSeriesTitle}}getColorPaletteOverrides(){let t=this.settings.theme==="dark"?C.card:Ht.card;return {"paneProperties.background":C.chartBg,"paneProperties.backgroundType":"solid",volumePaneSize:"medium","mainSeriesProperties.candleStyle.upColor":C.increase,"mainSeriesProperties.barStyle.upColor":C.increase,"mainSeriesProperties.columnStyle.upColor":C.increase,"mainSeriesProperties.candleStyle.downColor":C.decrease,"mainSeriesProperties.barStyle.downColor":C.decrease,"mainSeriesProperties.columnStyle.downColor":C.decrease,"mainSeriesProperties.candleStyle.borderUpColor":C.increase,"mainSeriesProperties.candleStyle.borderDownColor":C.decrease,"mainSeriesProperties.candleStyle.wickUpColor":C.increase,"mainSeriesProperties.candleStyle.wickDownColor":C.decrease,"linetoolorder.bodyBackgroundColor":t,"linetoolorder.bodyBackgroundTransparency":0}}getColorPaletteStudiesOverrides(){return {"volume.volume.color.0":C.decrease,"volume.volume.color.1":C.increase,"volume.volume.transparency":80}}initModules(){Object.entries({datafeed:K,saveLoadAdapter:X,settingsAdapter:Z}).forEach(([e,r])=>{this.moduleInstances.set(e,new r(this.settings,this.chartManager,this));});}};var At=react.memo(()=>null);var Ft=react.forwardRef(({onReady:a},t)=>{let{chartManager:e,chartSettings:r,widgetConstructor:i,libraryPath:o,customCssUrl:s}=h(),n=react.useRef(a),[l,u]=react.useState(),[b,y]=react.useState(null),[Et,kt]=react.useState(false);return react.useEffect(()=>{Et&&n.current&&setTimeout(n.current);},[Et]),react.useImperativeHandle(t,()=>l,[l]),react.useEffect(()=>{if(!b)return;let gt=new Q(r,e,i,{libraryPath:o,customCssUrl:s}),le=new G(r,e,gt);return u(le),gt.init(b).then(()=>kt(true)).catch(de=>{console.error("TradingViewWidgetContainer: failed to init bridge",de);}),()=>{gt.destroy().then(()=>{u(void 0),kt(false);}).catch(()=>{console.error("TradingViewWidgetContainer: failed to destroy bridge");});}},[b,r,e,i,o,s]),jsxRuntime.jsxs("div",{className:"w-full h-full",children:[jsxRuntime.jsx(At,{}),jsxRuntime.jsx("div",{id:"tv_chart_container",className:"w-full h-full",ref:y})]})});var Vt=react.memo(({onReady:a})=>{let{chartManager:t,chartSettings:e}=h(),r=react.useMemo(()=>`${e.timezone}_${t.reloadId}`,[e.timezone,t.reloadId]);react.useLayoutEffect(()=>{t.setLoading(true);},[t,e.chartType,r]);let i=react.useCallback(()=>{a?.(),t.onInternalWidgetReady(),t.setLoading(false);},[t,a]);return jsxRuntime.jsx("div",{className:"flex-1 w-full overflow-hidden",children:jsxRuntime.jsx(Ft,{onReady:i,ref:o=>t.setInternalWidget(o??null)})})});var mr=react.memo(({toolbar:a,loadingOverlay:t,onReady:e,children:r})=>{let{prefix:i}=h(),o=jotai.useAtomValue(_(i));return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[a!==false&&jsxRuntime.jsx(It,{...a||{}}),jsxRuntime.jsxs("div",{className:"relative flex-1 w-full overflow-hidden",children:[o&&t&&jsxRuntime.jsx("div",{className:"absolute inset-0 z-10 flex items-center justify-center bg-background/80",children:t}),jsxRuntime.jsx(Vt,{onReady:e})]}),r]})}),pr=react.forwardRef(({initConfig:a,widgetConstructor:t,libraryPath:e,customCssUrl:r,toolbar:i,loadingOverlay:o,onReady:s,children:n,className:l},u)=>jsxRuntime.jsx("div",{className:`flex flex-col w-full h-full ${l??""}`,children:jsxRuntime.jsx(ft,{ref:u,initConfig:a,widgetConstructor:t,libraryPath:e,customCssUrl:r,children:jsxRuntime.jsx(mr,{toolbar:i,loadingOverlay:o,onReady:s,children:n})})}));var Cr=react.memo(({index:a})=>{let{prefix:t}=h(),e=jotai.useAtomValue(c(t)),r=jotai.useAtomValue(f(t)),o=e[a??r];return o?jsxRuntime.jsxs("div",{className:"flex items-center gap-1 text-xs text-muted-foreground",children:[jsxRuntime.jsx("span",{className:"font-medium text-foreground",children:o.tickerSymbol||o.symbol}),jsxRuntime.jsx("span",{children:o.resolution})]}):null});function vr(){return h().chartManager}function Tr(){let{prefix:a,chartManager:t}=h(),e=jotai.useAtomValue(f(a)),r=jotai.useAtomValue(c(a));return react.useMemo(()=>r.length?t.areaByIndex(e):null,[t,e,r])}function wr(){let{prefix:a,chartManager:t}=h(),e=jotai.useAtomValue(f(a)),i=jotai.useAtomValue(c(a))[e];return react.useMemo(()=>i?.tickerSymbol?t.symbolResolver?.getSymbolInfo(i.tickerSymbol)??null:null,[t,i?.tickerSymbol])}exports.ALL_TV_CHART_RESOLUTIONS=T;exports.ChartAreaManager=V;exports.ChartDataFeed=K;exports.ChartLibraryWidget=G;exports.ChartManager=N;exports.ChartSaveLoadAdapter=X;exports.ChartSettings=z;exports.ChartSettingsAdapter=Z;exports.ChartSettingsStore=H;exports.ChartSymbolResolver=$;exports.ChartWidget=q;exports.ChartWidgetBridge=Q;exports.DEFAULT_TV_CHART_RESOLUTIONS=S;exports.ENABLED_TV_CHART_FEATURES=ct;exports.EventEmitter=Y;exports.SUPPORTED_TV_CHART_LAYOUTS=ut;exports.TV_CHART_THEME_COLORS=C;exports.TradingView=pr;exports.TradingViewAreaTitle=Cr;exports.TradingViewConfig=yt;exports.TradingViewFullscreen=Ct;exports.TradingViewKlineStyleSelect=St;exports.TradingViewLayout=At;exports.TradingViewOpenIndicator=Tt;exports.TradingViewOpenSettings=xt;exports.TradingViewProvider=ft;exports.TradingViewResolutions=Lt;exports.TradingViewSnapshot=Rt;exports.TradingViewToolbar=It;exports.TradingViewToolbarProvider=vt;exports.TradingViewWidgetContainer=Ft;exports.TradingViewWidgetProvider=Vt;exports.TvChartErrorResetType=Ot;exports.TvChartFeature=et;exports.TvChartHandle=ht;exports.TvChartKlineStyle=tt;exports.TvChartLayout=R;exports.TvChartPriceType=Dt;exports.TvChartQuoteType=Wt;exports.TvChartTheme=Bt;exports.TvChartType=j;exports.chartAreasFamily=c;exports.chartFullscreenFamily=I;exports.chartLoadingFamily=_;exports.chartPinnedResolutionsFamily=x;exports.chartSelectedIndexFamily=f;exports.chartShowDrawingToolbarFamily=w;exports.getTvChartLayoutReverse=pt;exports.getTvChartLibraryLayout=U;exports.getTvChartLibraryLocale=fe;exports.getTvChartLibraryResolution=v;exports.getTvChartLibraryTheme=E;exports.getTvChartResolutionFrame=ve;exports.getTvChartResolutionReverse=mt;exports.getTvChartTickTimestamp=Se;exports.parseSymbol=nt;exports.settingsBackgroundColorFamily=st;exports.settingsChartTypeFamily=A;exports.settingsDataFamily=O;exports.settingsDisabledFeaturesFamily=F;exports.settingsEnabledFeaturesFamily=P;exports.settingsLayoutFamily=M;exports.settingsLocaleFamily=rt;exports.settingsReverseColorFamily=ot;exports.settingsStorageIdFamily=W;exports.settingsThemeFamily=D;exports.settingsTickerSymbolFamily=it;exports.settingsTimezoneFamily=at;exports.stringifySymbol=ue;exports.stringifySymbolShort=lt;exports.useActiveAreaManager=Tr;exports.useChartManager=vr;exports.useSymbolInfo=wr;exports.useTvChartContext=h;exports.useTvChartManager=Ae;exports.useTvChartPrefix=Pe;exports.useTvChartToolbarContext=J;exports.widgetReadyFamily=B;//# sourceMappingURL=index.js.map
1
+ 'use strict';var react=require('react'),jotai=require('jotai'),utils=require('jotai/utils'),lodashEs=require('lodash-es'),jsxRuntime=require('react/jsx-runtime');var j=(e=>(e.TradingView="TradingView",e.Original="Original",e))(j||{}),Dt=(e=>(e.Price="price",e.MarketCap="market_cap",e))(Dt||{}),Wt=(o=>(o.USD="USD",o.SOL="SOL",o.ETH="ETH",o.TRX="TRX",o.BNB="BNB",o))(Wt||{}),tt=(d=>(d[d.Bars=0]="Bars",d[d.Candles=1]="Candles",d[d.Line=2]="Line",d[d.Area=3]="Area",d[d.HeikenAshi=8]="HeikenAshi",d[d.HollowCandles=9]="HollowCandles",d[d.Baseline=10]="Baseline",d[d.HiLo=12]="HiLo",d[d.Column=13]="Column",d[d.LineWithMarkers=14]="LineWithMarkers",d[d.Stepline=15]="Stepline",d[d.HLCArea=16]="HLCArea",d[d.VolCandle=19]="VolCandle",d[d.Renko=4]="Renko",d[d.Kagi=5]="Kagi",d[d.PointAndFigure=6]="PointAndFigure",d[d.LineBreak=7]="LineBreak",d))(tt||{}),Ot=(e=>(e.Light="light",e.Dark="dark",e))(Ot||{}),et=(y=>(y.HeaderWidget="header_widget",y.HeaderCandleStyleMenu="header_candle_style_menu",y.HeaderFullscreenButton="header_fullscreen_button",y.MultiCharts="multi_charts",y.CreateVolumeIndicatorByDefault="create_volume_indicator_by_default",y.VolumeForceOverlay="volume_force_overlay",y.HideDrawingToolsByDefault="hide_drawing_tools_by_default",y.LegendSeriesTitle="legend_series_title",y.LegendVolume="legend_volume",y.TimeframesToolbar="timeframes_toolbar",y.SaveDrawingToServer="save_drawing_to_server",y))(et||{}),R=(g=>(g.Layout1A="1A",g.Layout2A="2A",g.Layout2B="2B",g.Layout3A="3A",g.Layout3B="3B",g.Layout3C="3C",g.Layout3D="3D",g.Layout3E="3E",g.Layout3F="3F",g.Layout4A="4A",g.Layout4B="4B",g.Layout4C="4C",g.Layout4D="4D",g.Layout4E="4E",g.Layout4F="4F",g.Layout5A="5A",g.Layout5B="5B",g.Layout5C="5C",g.Layout5D="5D",g.Layout6A="6A",g.Layout6B="6B",g.Layout6C="6C",g.Layout7A="7A",g.Layout8A="8A",g.Layout8B="8B",g.Layout8C="8C",g))(R||{}),Bt=(r=>(r[r.None=0]="None",r[r.ResetData=1]="ResetData",r[r.ResetChart=2]="ResetChart",r))(Bt||{});var ut=["header_widget","header_candle_style_menu","header_fullscreen_button","multi_charts","volume_force_overlay","legend_series_title","timeframes_toolbar","save_drawing_to_server"],S=["1s","30s","1m","1h","4h","1d"],T=["1s","15s","30s","1m","5m","15m","1h","4h","12h","1d"],ct=["1A","2A","2B","3A","3B","3C","3D","3E","3F","4A","4B","4C","4D","4E","4F","5A","5B","5C","5D","6A","6B","6C","7A","8A","8B","8C"],Nt=["click","keydown","mousedown","mouseup","contextmenu"],C={decrease:"#F04866",increase:"#1DB954",chartBg:"#1A1A1A",card:"#242424"},Ht={card:"#242424"};var _=utils.atomFamily(a=>jotai.atom(true)),I=utils.atomFamily(a=>jotai.atom(false)),f=utils.atomFamily(a=>jotai.atom(0)),x=utils.atomFamily(a=>jotai.atom([...S])),u=utils.atomFamily(a=>jotai.atom([])),w=utils.atomFamily(a=>jotai.atom(false)),M=utils.atomFamily(a=>jotai.atom("1A")),A=utils.atomFamily(a=>jotai.atom("TradingView")),D=utils.atomFamily(a=>jotai.atom("dark")),rt=utils.atomFamily(a=>jotai.atom("en")),at=utils.atomFamily(a=>jotai.atom("Etc/UTC")),it=utils.atomFamily(a=>jotai.atom("")),W=utils.atomFamily(a=>jotai.atom("kline")),ot=utils.atomFamily(a=>jotai.atom(false)),st=utils.atomFamily(a=>jotai.atom(null)),P=utils.atomFamily(a=>jotai.atom([])),F=utils.atomFamily(a=>jotai.atom([])),O=utils.atomFamily(a=>jotai.atom(false)),B=utils.atomFamily(a=>jotai.atom(t=>{let e=t(M(a)),r=t(A(a)),i=t(f(a)),o=t(x(a)),s=t(w(a)),n=t(u(a));return {layout:e,chartType:r,selectedIndex:i,pinnedResolutions:o,showDrawingToolbar:s,areaContents:n}}),lodashEs.isEqual);var V=class{settings;chartManager;chartIndex;store;prefix;pendingTickerSymbol=null;pendingResolution=null;constructor(t,e,r,i,o,s){this.settings=t,this.chartManager=e,this.chartIndex=r,this.store=i,this.prefix=o;let l={...{resolution:"1m",chartStyle:1,symbol:"",tickerSymbol:"",rightOffset:10,barSpacing:6,dataReady:false},...s};this.patchArea(l);}get state(){return this.store.get(u(this.prefix))[this.chartIndex]??{resolution:"1m",chartStyle:1,symbol:"",tickerSymbol:"",rightOffset:10,barSpacing:6,dataReady:false}}patchArea(t){let e=[...this.store.get(u(this.prefix))],r=e[this.chartIndex]??{resolution:"1m",chartStyle:1,symbol:"",tickerSymbol:"",rightOffset:10,barSpacing:6,dataReady:false};e[this.chartIndex]={...r,...t},this.store.set(u(this.prefix),e);}setState(t,e){e!=null&&this.patchArea({[t]:e});}get tickerSymbol(){return this.state.tickerSymbol}get symbol(){return this.state.symbol}get resolution(){return this.state.resolution}get chartStyle(){return this.state.chartStyle}get rightOffset(){return this.state.rightOffset}get barSpacing(){return this.state.barSpacing}get dataReady(){return this.state.dataReady}get internalChartWidget(){return this.chartManager.internalWidget?.chartByIndex(this.chartIndex)}setChartStyle(t){this.setState("chartStyle",t),this.internalChartWidget?.setChartStyle(t);}async setSymbol(t){if(this.state.tickerSymbol!==t){this.setState("tickerSymbol",t),this.setState("dataReady",false),this.pendingTickerSymbol=t;try{let e=[this.internalChartWidget?.handleSymbolChange(t,this.tickerSymbol),this.chartManager.symbolResolver?.resolveSymbolInfo(t).then(r=>{r&&this.setState("symbol",r.name);})];for(let r of await Promise.allSettled(e))if(r.status==="rejected")throw r.reason}catch(e){console.error(e);}finally{this.pendingTickerSymbol===t&&(this.pendingTickerSymbol=null);}this.tickerSymbol===t&&this.setState("dataReady",true);}}async setResolution(t){if(this.resolution!==t){this.setState("resolution",t),this.setState("dataReady",false),this.pendingResolution=t;try{await this.internalChartWidget?.handleResolutionChange(t,this.resolution);}finally{this.pendingResolution===t&&(this.pendingResolution=null);}}}toJSON(){return {...this.state}}widgetReady(){this.internalChartWidget?.dataReady()?.then(()=>this.handleChartReady())?.catch(()=>{});}get active(){return this.chartIndex<this.chartManager.chartCount}get selected(){return this.chartManager.selectedIndex===this.chartIndex}get symbolInfo(){return this.chartManager.symbolResolver?.getSymbolInfo(this.tickerSymbol)??null}destroy(){}async handleChartReady(){this.internalChartWidget&&(this.setState("dataReady",true),this.selected&&this.internalChartWidget.setBarSpacing(this.barSpacing));}};var N=class{prefix;settings;store;initialized=false;focused=false;reloadId=0;internalWidget=null;datafeed=null;symbolResolver=null;unsubAutoSave=null;constructor(t,e,r){this.prefix=t,this.store=e,this.settings=r;}get loading(){return this.store.get(_(this.prefix))}get fullscreen(){return this.store.get(I(this.prefix))}set fullscreen(t){this.store.set(I(this.prefix),t),t?document.body.classList.add("fullScreen"):document.body.classList.remove("fullScreen");}get selectedIndex(){return this.store.get(f(this.prefix))}set selectedIndex(t){this.store.set(f(this.prefix),t);}get pinnedResolutions(){return this.store.get(x(this.prefix))}set pinnedResolutions(t){this.store.set(x(this.prefix),t);}get showDrawingToolbar(){return this.store.get(w(this.prefix))}get chartCount(){return parseInt(this.settings.layout,10)||1}get areas(){let t=this.store.get(u(this.prefix));return this._areaManagers.slice(0,t.length)}_areaManagers=[];areaByIndex(t){return this.initialized&&this.updateChartContents(),this._areaManagers[t]??null}get activeArea(){return this.areaByIndex(this.selectedIndex)}async init(){if(this.initialized)return;let t=this.settings.saveLoadAdapter.getSettings();if(t?.selectedIndex!=null&&(this.selectedIndex=t.selectedIndex),t?.pinnedResolutions){let r=t.pinnedResolutions;r.length===S.length&&r.every(i=>S.includes(i))?this.pinnedResolutions=[...S]:this.pinnedResolutions=r;}if(t?.areaContents&&t.areaContents.forEach((r,i)=>{let o=new V(this.settings,this,i,this.store,this.prefix,r);this._areaManagers[i]=o;}),t?.showDrawingToolbar!=null&&this.store.set(w(this.prefix),t.showDrawingToolbar),this.settings.updateValue("layout",t?.layout),this.settings.updateValue("chartType",t?.chartType),this.settings.enableMultiCharts||this.settings.updateValue("layout","1A"),this.settings.enableHideDrawingToolsByDefault&&this.store.set(w(this.prefix),false),this.updateChartContents(),this.settings.tickerSymbol&&this.activeArea)try{await this.activeArea.setSymbol(this.settings.tickerSymbol);}catch(r){console.warn("ChartManager init failed to set symbol",r);}this.initialized=true;let e=lodashEs.debounce(()=>{let r=this.store.get(B(this.prefix));this.settings.saveLoadAdapter.saveSettings(r).catch(console.error);},1e3);this.unsubAutoSave=this.store.sub(B(this.prefix),e);}destroy(){this.unsubAutoSave?.(),this._areaManagers.forEach(t=>t.destroy()),this._areaManagers=[];}setLoading(t){this.store.set(_(this.prefix),t);}setLocale(t){this.settings.updateValue("locale",t);}setTimezone(t){this.settings.updateValue("timezone",t);}setFocused(t){this.focused=t;}setShowDrawingToolbar(t){this.store.set(w(this.prefix),t);}setInternalWidget(t){this.internalWidget=t,this.store.set(O(this.prefix),false);}onInternalWidgetReady(){this.store.set(O(this.prefix),true),this.areas.forEach((t,e)=>{e<this.chartCount&&t.widgetReady();});}setChartType(t){this.settings.updateValue("chartType",t);}setTheme(t){this.settings.theme!==t&&(this.settings.updateValue("theme",t),this.internalWidget?.onThemeChange?.(t,this.settings.reverseColor));}setReverseColor(t){this.settings.reverseColor!==t&&(this.settings.updateValue("reverseColor",t),this.internalWidget?.onThemeChange?.(this.settings.theme,t));}setLayout(t){let e=this.settings.enableMultiCharts?t:"1A";if(this.settings.layout!==e){this.settings.updateValue("layout",e),this.updateChartContents(),this.internalWidget?.onLayoutChange?.(e);let r=this.chartCount;setTimeout(()=>{if(this.store.get(O(this.prefix)))for(let i=r;i<this.chartCount;i++)this.areaByIndex(i)?.widgetReady();});}}reloadChart(){this.reloadId+=1;}updateChartContents(){if(this.chartCount>this._areaManagers.length)for(let t=this._areaManagers.length;t<this.chartCount;t++){let e=this._areaManagers[this.selectedIndex],r=e?.toJSON(),i=new V(this.settings,this,t,this.store,this.prefix,r);this._areaManagers[t]=i,this.selectedIndex!==t&&!e&&i.setSymbol(this.settings.tickerSymbol).catch(()=>{});}this.selectedIndex>=this.chartCount&&(this.selectedIndex=this.chartCount-1);}get settingsData(){return this.store.get(B(this.prefix))}getAllCharts(){return this.updateChartContents(),this._areaManagers.slice(0,this.chartCount)}};var H=class{storageId;constructor(t){this.storageId=t;}get settingsKey(){return `${this.storageId}.TvChart.Settings`}get shapesKey(){return `${this.storageId}.TvChart.Shapes`}getSettings(){let t=this.getLocalSettingsData(),e=this.getChartStoreData();return {layout:e?.layout,selectedIndex:e?.currentAreaIndex,chartType:e?.chartType,pinnedResolutions:e?.pinnedResolutions,areaContents:e?.areas?.map(i=>({resolution:i.resolution||i.period||"1m",chartStyle:i.chartStyle,symbol:i.symbol,tickerSymbol:i.tickerSymbol,rightOffset:i.rightOffset,barSpacing:i.barSpacing})),showDrawingToolbar:e?.drawing?.toolbarSwitch,drawing:t?.drawing?{...t.drawing,defaultStates:lodashEs.omit(t,["drawing","DrawingToolGroupLastUsedTool","riskRewardAvailableChanged","riskRewardRiskSizeChanged","drawingShapeTemplate"]),lastUsedTools:t.DrawingToolGroupLastUsedTool,riskRewardAvailableChanged:t.riskRewardAvailableChanged,riskRewardRiskSizeChanged:t.riskRewardRiskSizeChanged,drawingShapeTemplate:t.drawingShapeTemplate}:void 0}}getChartStoreData(){return this.getLocalData(this.storageId)}setChartStoreData(t){this.setLocalData(this.storageId,t);}async saveSettings(t){let e=this.getChartStoreData(),r={...e,layout:t.layout,currentAreaIndex:t.selectedIndex,chartType:t.chartType,pinnedResolutions:t.pinnedResolutions,areas:t.areaContents?.map((i,o)=>({...e?.areas?.[o],...i})),drawing:{...e?.drawing,toolbarSwitch:t.showDrawingToolbar}};this.setChartStoreData(r);}async getShapes(t){let e=this.getLocalShapesData();return !e||!e[t]?[]:Object.values(e[t])}async saveShapes(t,e){let r=this.getLocalShapesData()||{};r[t]={...r[t],...e},Object.keys(r[t]).forEach(i=>{r[t][i]||delete r[t][i];}),this.setLocalShapesData(r);}getLocalData(t){try{let e=localStorage.getItem(t);return e?JSON.parse(e):null}catch{return null}}setLocalData(t,e){localStorage.setItem(t,JSON.stringify(e));}getLocalSettingsData(){return this.getLocalData(this.settingsKey)}getLocalShapesData(){return this.getLocalData(this.shapesKey)}setLocalShapesData(t){this.setLocalData(this.shapesKey,t);}};function nt(a){let[t,e,r,i]=a.split("/");return {address:e,chain:t,quote:r,priceType:i}}function ce(a){return !a.quote||!a.priceType?`${a.chain}/${a.address}`:`${a.chain}/${a.address}/${a.quote}/${a.priceType}`}function lt(a){return `${a.chain}/${a.address}`}var me={dark:"Dark",light:"Light"};function E(a){return me[a.toLowerCase()]??"Dark"}var Ut={"1s":"1S","5s":"5S","15s":"15S","30s":"30S","1m":"1","5m":"5","15m":"15","30m":"30","1h":"60","4h":"240","12h":"720","1d":"1D"};function v(a="1m"){return Ut[a]??Ut["1m"]}var pe={"1S":"1s","5S":"5s","15S":"15s","30S":"30s",1:"1m",5:"5m",15:"15m",30:"30m",60:"1h",240:"4h",720:"12h","1D":"1d"};function mt(a){return pe[a]??"1s"}var ye={en:"en","zh-CN":"zh","zh-TW":"zh"};function fe(a){return ye[a]??a}var zt={"1A":"s","2A":"2h","2B":"2v","3A":"3s","3B":"3h","3C":"3v","3D":"2-1","3E":"1-2","3F":"3r","4A":"4","4B":"4h","4C":"4v","4D":"4s","4E":"1-3","4F":"2-2","5A":"1-4","5B":"5s","5C":"2-3","5D":"5h","6A":"6","6B":"6c","6C":"6h","7A":"7h","8A":"8","8B":"8c","8C":"8h"};function U(a){return zt[a]??"s"}var Ce=Object.fromEntries(Object.entries(zt).map(([a,t])=>[t,a]));function pt(a){return Ce[a]??"1A"}var be={"1s":1e3,"5s":5e3,"15s":15e3,"30s":3e4,"1m":6e4,"5m":3e5,"15m":9e5,"30m":18e5,"1h":36e5,"4h":144e5,"12h":432e5,"1d":864e5};function ve(a){let t=be[a];if(!t)throw new Error(`Invalid interval: ${a}`);return t}function Se(a,t){let e=a.toString().length>10?a:1e3*a;return Math.floor(e/t)*t}var z=class{prefix;store;supportedResolutions=T.map(v);supportedLayouts=ct;supportedChartTypes=["TradingView"];chartNames={};priceFormatterFactory=null;saveLoadAdapter;constructor(t,e){this.prefix=t,this.store=e,this.saveLoadAdapter=new H(t),this.store.set(W(t),t);}get layout(){return this.store.get(M(this.prefix))}get chartType(){return this.store.get(A(this.prefix))}get theme(){return this.store.get(D(this.prefix))}get reverseColor(){return this.store.get(ot(this.prefix))}get locale(){return this.store.get(rt(this.prefix))}get timezone(){return this.store.get(at(this.prefix))}get tickerSymbol(){return this.store.get(it(this.prefix))}get storageId(){return this.store.get(W(this.prefix))}get backgroundColor(){return this.store.get(st(this.prefix))}get enabledFeatures(){return this.store.get(P(this.prefix))}get disabledFeatures(){return this.store.get(F(this.prefix))}updateValue(t,e){if(e==null)return;let i={layout:()=>this.store.set(M(this.prefix),e),chartType:()=>this.store.set(A(this.prefix),e),theme:()=>this.store.set(D(this.prefix),e),reverseColor:()=>this.store.set(ot(this.prefix),e),locale:()=>this.store.set(rt(this.prefix),e),timezone:()=>this.store.set(at(this.prefix),e),tickerSymbol:()=>this.store.set(it(this.prefix),e),storageId:()=>this.store.set(W(this.prefix),e),backgroundColor:()=>this.store.set(st(this.prefix),e),enabledFeatures:()=>this.store.set(P(this.prefix),e),disabledFeatures:()=>this.store.set(F(this.prefix),e)}[t];i&&i();}isFeatureEnabled(t){return !this.disabledFeatures.includes(t)&&this.enabledFeatures.includes(t)||ut.includes(t)}setFeature(t,e){this.resetFeature(t),e?this.store.set(P(this.prefix),[...this.enabledFeatures,t]):this.store.set(F(this.prefix),[...this.disabledFeatures,t]);}resetFeature(t){this.store.set(P(this.prefix),this.enabledFeatures.filter(e=>e!==t)),this.store.set(F(this.prefix),this.disabledFeatures.filter(e=>e!==t));}get enableMultiCharts(){return this.isFeatureEnabled("multi_charts")}get enableCreateVolumeIndicatorByDefault(){return this.isFeatureEnabled("create_volume_indicator_by_default")}get enableHideDrawingToolsByDefault(){return this.isFeatureEnabled("hide_drawing_tools_by_default")}get enableLegendSeriesTitle(){return this.isFeatureEnabled("legend_series_title")}get enableLegendVolume(){return this.isFeatureEnabled("legend_volume")}get enableTimeframesToolbar(){return this.isFeatureEnabled("timeframes_toolbar")}get enableVolumeForceOverlay(){return this.isFeatureEnabled("volume_force_overlay")}sub(t,e){let i={layout:M(this.prefix),chartType:A(this.prefix),theme:D(this.prefix)}[t];return i?this.store.sub(i,e):()=>{}}};var $=class{datafeed;cache=new Map;pendingRequests=new Map;constructor(t){this.datafeed=t;}async resolveSymbolInfo(t){return this.datafeed.resolveSymbol(t)}async resolveSymbolInfos(t){return t.filter(r=>!this.cache.has(r)&&!this.pendingRequests.has(r)).forEach(r=>{let i=this.resolveSymbolInfo(r);i.then(o=>{o&&this.cache.set(r,o);}).finally(()=>this.pendingRequests.delete(r)),this.pendingRequests.set(r,i);}),await Promise.all(t.filter(r=>this.pendingRequests.has(r)).map(r=>this.pendingRequests.get(r))),t.map(r=>this.cache.get(r)??null).filter(r=>r!==null)}getSymbolInfo(t){return this.resolveSymbolInfo(t).catch(e=>{console.error("ChartSymbolResolver.getSymbolInfo",e);}),this.cache.get(t)??null}};var yt=({initConfig:a,children:t})=>{let{chartManager:e,chartSettings:r}=h(),[i,o]=react.useState(false);return react.useEffect(()=>{e.initialized||(r.updateValue("tickerSymbol",a.tickerSymbol),r.updateValue("theme",a.theme),r.updateValue("reverseColor",a.reverseColor),r.updateValue("layout",a.layout),r.updateValue("chartType",a.chartType),r.updateValue("timezone",a.timezone),r.updateValue("locale",a.locale),r.updateValue("backgroundColor",a.backgroundColor),r.updateValue("storageId",a.storageId),r.updateValue("enabledFeatures",a.enabledFeatures),r.updateValue("disabledFeatures",a.disabledFeatures),a.chartNames&&(r.chartNames=a.chartNames),a.priceFormatterFactory&&(r.priceFormatterFactory=a.priceFormatterFactory),a.supportedResolutions&&(r.supportedResolutions=a.supportedResolutions),a.supportedLayouts&&(r.supportedLayouts=a.supportedLayouts),a.supportedChartTypes&&(r.supportedChartTypes=a.supportedChartTypes),e.datafeed=a.datafeed,e.symbolResolver=new $(a.datafeed));},[e,r,a]),react.useEffect(()=>(e.init().then(()=>o(true)).catch(s=>{console.error("TradingViewConfig chartManager init error",s);}),()=>{e.destroy();}),[e]),e.initialized?jsxRuntime.jsx(jsxRuntime.Fragment,{children:t}):null};var qt=react.createContext(null);function h(){let a=react.useContext(qt);if(!a)throw new Error("useTvChartContext must be used within TradingViewProvider");return a}function Ae(){return h().chartManager}function Pe(){return h().prefix}var ht=class{setting;chartManager;constructor(t,e){this.setting=t,this.chartManager=e;}get internalWidget(){return this.chartManager.internalWidget}chartCount(){return this.chartManager.chartCount}setActiveChart(t){t<this.chartCount()&&(this.chartManager.selectedIndex=t);}layout(){return this.setting.layout}setLayout(t){this.chartManager.setLayout(t);}theme(){return this.setting.theme}setTheme(t){this.chartManager.setTheme(t);}setChartType(t){this.chartManager.setChartType(t);}getSetting(){return this.setting}getChartManager(){return this.chartManager}},ft=react.forwardRef(({children:a,initConfig:t,widgetConstructor:e,libraryPath:r,customCssUrl:i},o)=>{let s=jotai.useStore(),n=t.storageId,l=react.useMemo(()=>new z(n,s),[n,s]),c=react.useMemo(()=>new N(n,s,l),[n,s,l]),b=react.useMemo(()=>new ht(l,c),[l,c]);react.useImperativeHandle(o,()=>b,[b]);let y=react.useMemo(()=>({prefix:n,chartSettings:l,chartManager:c,widgetConstructor:e,libraryPath:r,customCssUrl:i}),[n,l,c,e,r,i]);return jsxRuntime.jsx(qt.Provider,{value:y,children:jsxRuntime.jsx(yt,{initConfig:t,children:a})})});var Ct=react.memo(()=>{let{prefix:a,chartManager:t}=h(),e=jotai.useAtomValue(I(a)),r=react.useCallback(()=>{t.fullscreen=!t.fullscreen;},[t]);return jsxRuntime.jsx("button",{type:"button",onClick:r,className:"text-xs text-muted-foreground hover:text-foreground px-1.5 py-0.5 rounded hover:bg-muted cursor-pointer transition-colors",title:e?"Exit fullscreen":"Fullscreen",children:e?"Exit":"Fullscreen"})});var Yt=react.createContext(null);function J(){let a=react.useContext(Yt);if(!a)throw new Error("useTvChartToolbarContext must be used within TradingViewToolbarProvider");return a}var vt=({children:a})=>{let{prefix:t,chartManager:e}=h(),r=jotai.useAtomValue(f(t)),i=jotai.useAtomValue(u(t)),o=react.useMemo(()=>i.length?e.areaByIndex(r):null,[e,r,i]),s=react.useMemo(()=>o?.symbolInfo??null,[o]),n=react.useMemo(()=>({activeAreaManager:o,symbolInfo:s}),[o,s]);return jsxRuntime.jsx(Yt.Provider,{value:n,children:a})};var Qt={0:"Bars",1:"Candles",2:"Line",3:"Area",8:"Heiken Ashi",9:"Hollow",10:"Baseline"},He=[1,0,2,3,9,8,10],St=react.memo(()=>{let {prefix:a}=h(),{activeAreaManager:t}=J(),e=jotai.useAtomValue(u(a)),r=jotai.useAtomValue(f(a)),i=e[r]?.chartStyle??1,s=react.useCallback(n=>{let l=parseInt(n.target.value,10);t?.setChartStyle(l);},[t]);return jsxRuntime.jsx("select",{value:i,onChange:s,className:"text-xs bg-transparent text-muted-foreground hover:text-foreground cursor-pointer border-none outline-none px-1 py-0.5",title:"K-line style",children:He.map(n=>jsxRuntime.jsx("option",{value:n,children:Qt[n]??n},n))})});var Tt=react.memo(()=>{let{chartManager:a}=h(),t=react.useCallback(()=>{a.internalWidget?.openIndicatorSettingsDialog();},[a]);return jsxRuntime.jsx("button",{type:"button",onClick:t,className:"text-xs text-muted-foreground hover:text-foreground px-1.5 py-0.5 rounded hover:bg-muted cursor-pointer transition-colors",title:"Indicators",children:"Indicators"})});var xt=react.memo(()=>{let{chartManager:a}=h(),t=react.useCallback(()=>{a.internalWidget?.openSettingsDialog();},[a]);return jsxRuntime.jsx("button",{type:"button",onClick:t,className:"text-xs text-muted-foreground hover:text-foreground px-1.5 py-0.5 rounded hover:bg-muted cursor-pointer transition-colors",title:"Chart settings",children:"Settings"})});var Lt=react.memo(()=>{let{prefix:a,chartManager:t}=h(),{activeAreaManager:e}=J(),r=jotai.useAtomValue(x(a)),i=jotai.useAtomValue(u(a)),o=jotai.useAtomValue(f(a)),s=i[o]?.resolution,n=react.useCallback(l=>{e?.setResolution(l);},[e]);return jsxRuntime.jsx("div",{className:"flex items-center gap-0.5",children:r.map(l=>jsxRuntime.jsx("button",{type:"button",onClick:()=>n(l),className:`px-2 py-0.5 text-xs rounded cursor-pointer transition-colors ${s===l?"bg-primary text-primary-foreground":"text-muted-foreground hover:text-foreground hover:bg-muted"}`,children:l},l))})});var Rt=react.memo(()=>{let{chartManager:a}=h(),t=react.useCallback(async()=>{try{let e=await a.internalWidget?.takeClientScreenshot();if(!e)return;let r=document.createElement("a");r.download=`chart-${Date.now()}.png`,r.href=e.toDataURL("image/png"),r.click();}catch(e){console.error("TradingViewSnapshot",e);}},[a]);return jsxRuntime.jsx("button",{type:"button",onClick:t,className:"text-xs text-muted-foreground hover:text-foreground px-1.5 py-0.5 rounded hover:bg-muted cursor-pointer transition-colors",title:"Take snapshot",children:"Snapshot"})});var It=react.memo(({children:a,prefix:t,suffix:e,showResolutions:r=true,showKlineStyleSelect:i=true,showOpenIndicator:o=true,showOpenSettings:s=true,showFullscreen:n=true,showSnapshot:l=true})=>jsxRuntime.jsx(vt,{children:jsxRuntime.jsxs("div",{className:"flex items-center gap-1 px-2 py-1 border-b border-border min-h-[36px] flex-shrink-0",children:[t,a??jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[r&&jsxRuntime.jsx(Lt,{}),jsxRuntime.jsxs("div",{className:"flex items-center gap-0.5 ml-auto",children:[i&&jsxRuntime.jsx(St,{}),o&&jsxRuntime.jsx(Tt,{}),s&&jsxRuntime.jsx(xt,{}),l&&jsxRuntime.jsx(Rt,{}),n&&jsxRuntime.jsx(Ct,{})]})]}),e]})}));var q=class{settings;chartManager;bridge;chartIndex;constructor(t,e,r,i){this.settings=t,this.chartManager=e,this.bridge=r,this.chartIndex=i;}get chartAreaManager(){return this.chartManager.areaByIndex(this.chartIndex)}get widget(){return this.bridge.getWidget()}get chartWidget(){return this.widget?.chart(this.chartIndex)??null}setChartStyle(t){this.chartWidget?.setChartType(t);}getChartStyle(){return this.chartWidget?.chartType()??1}handleSymbolChange(t,e){return this.bridge.asyncWidgetMethodContext((r,i)=>{r.chart(this.chartIndex).setSymbol(t,{dataReady:()=>i(),doNotActivateChart:false});})}handleResolutionChange(t,e){return this.bridge.asyncWidgetMethodContext((r,i)=>{let o=r.chart(this.chartIndex);o.dataReady(()=>{o.setResolution(v(t),{dataReady:i,doNotActivateChart:true}).catch(()=>{});});})}setPrecision(t){this.widget?.applyOverrides({"mainSeriesProperties.minTick":t===null?"default":`${Math.pow(10,t)},1,false`});}async dataReady(){if(await this.bridge.onReady(),!this.chartWidget)throw Error("ChartWidget: chartWidget is null");return new Promise(t=>{this.chartWidget?.dataReady(()=>setTimeout(t));})}timeScaleWidth(){return this.chartWidget?.getTimeScale()?.width()??NaN}rightOffset(){return this.chartWidget?.getTimeScale()?.rightOffset()??NaN}setRightOffset(t){this.chartWidget?.getTimeScale()?.setRightOffset(t);}barSpacing(){return this.chartWidget?.getTimeScale()?.barSpacing()??NaN}setBarSpacing(t){this.chartWidget?.getTimeScale()?.setBarSpacing(t);}};var G=class{settings;chartManager;bridge;constructor(t,e,r){this.settings=t,this.chartManager=e,this.bridge=r;}get widget(){return this.bridge.getWidget()}chartByIndex(t){return new q(this.settings,this.chartManager,this.bridge,t)}activeChart(){let t=this.widget?.activeChartIndex();return t===void 0?void 0:this.chartByIndex(t)}openIndicatorSettingsDialog(){this.widget?.activeChart().executeActionById("insertIndicator");}openSettingsDialog(){this.widget?.activeChart().executeActionById("chartProperties");}takeClientScreenshot(){return this.widget?.takeClientScreenshot()}onLayoutChange(t){this.widget?.setLayout(U(t));}async onThemeChange(t,e){let r=E(t);await this.widget?.changeTheme(r,{disableUndo:true}),this.bridge.applyColorPaletteOverrides();}};var Y=class{listeners=new Map;on(t,e){return this.listeners.has(t)||this.listeners.set(t,new Set),this.listeners.get(t).add(e),()=>{this.listeners.get(t)?.delete(e);}}emit(t,e){this.listeners.get(t)?.forEach(r=>r(e));}off(t,e){this.listeners.get(t)?.delete(e);}clear(){this.listeners.clear();}};var K=class{settings;chartManager;bridge;abortController=new AbortController;constructor(t,e,r){this.settings=t,this.chartManager=e,this.bridge=r;}toJSON(){return null}async onReady(t){setTimeout(()=>{t({supported_resolutions:T.map(v),supports_marks:true,exchanges:[]});}),await this.chartManager.datafeed?.onReady({setting:this.settings,chartManager:this.chartManager,instance:this.bridge});}destroy(){this.abortController.abort();}async resolveSymbol(t,e,r,i){try{let o=await this.chartManager.datafeed?.resolveSymbol(t,i);o&&e(o);}catch(o){console.error("ChartDataFeed.resolveSymbol",o),r(o);}}async getBars(t,e,r,i,o){try{let s=await this.chartManager.datafeed?.getBars(t,e,r);s&&i(s,{noData:s.length===0});}catch(s){console.error("ChartDataFeed.getBars",s),o(s);}}subscribeBars(t,e,r,i,o){this.chartManager.datafeed?.subscribeBars(t,e,r,i,o);}unsubscribeBars(t){this.chartManager.datafeed?.unsubscribeBars(t);}async getMarks(t,e,r,i,o){this.chartManager.datafeed?.getMarks?.(t,e,r,i,o);}getQuotes(t,e,r){e(t.map(i=>({s:"ok",n:i,v:{}})));}subscribeQuotes(t,e,r,i){}unsubscribeQuotes(t){}};var Q=class{settings;chartManager;bridge;data;drawings;constructor(t,e,r){this.settings=t,this.chartManager=e,this.bridge=r,this.data=null,this.drawings=null,this.loadDataFromLocalStorage();}get layoutId(){return this.settings.storageId}get shouldResetColorPalette(){let t=this.data?.theme,e=this.data?.reverseColor;return t!==this.settings.theme||e!==this.settings.reverseColor}toJSON(){return null}getAllCharts(){return new Promise(t=>{let e=[];this.data&&e.push({id:this.data.id,name:this.data.name,symbol:this.data.symbol,resolution:this.data.resolution,timestamp:this.data.timestamp}),t(e);})}removeChart(t){throw Error("Method not implemented.")}async saveChart(t){return this.data={...t,theme:this.settings.theme,reverseColor:this.settings.reverseColor,id:this.layoutId,timestamp:0},this.saveDataToLocalStorage(),this.data.id}getChartContent(t){return new Promise(e=>{let r=JSON.parse(this.data.content),i=JSON.parse(r.charts_symbols),o=JSON.parse(r.content);e(JSON.stringify({...r,chart_symbols:JSON.stringify(i),content:JSON.stringify(o)}));})}async saveLineToolsAndGroups(t,e,r){this.drawings=this.drawings||{data:{},timestamp:0},this.drawings.data=this.drawings.data||{},this.drawings.data[e]=this.drawings.data[e]||{};try{if(!r.sources)return;for(let[i,o]of r.sources)if(!o||!o.symbol||!o.state||Object.keys(o.state).length===0||i.includes("/"))o===null&&delete this.drawings.data[e][i];else {let{address:s,chain:n}=nt(o.symbol),l=lt({address:s,chain:n}),c={...o,symbol:l,id:o.id.indexOf("/")>0?o.id.split("/")[0]:o.id};this.drawings.data[e][i]=c;}this.saveDataToLocalStorage();}catch(i){console.error("saveLineToolsAndGroups",i);}}async loadLineToolsAndGroups(t,e,r,i){if(!i?.symbol||!this.drawings?.data?.[e])return null;let o=i.symbol,{address:s,chain:n}=nt(o),l=lt({address:s,chain:n}),c=lodashEs.uniqBy(Object.values(lodashEs.cloneDeep(this.drawings.data[e])).filter(b=>b.symbol===l),"id");try{return {sources:new Map(c.map(b=>{let y=lodashEs.cloneDeep({...b,symbol:o});return [y.id,y]}))}}catch(b){return console.error("ChartSaveLoadAdapter.loadLineToolsAndGroups",b),null}}getLayoutKey(t){return `charts.tradingview.data.${t}`}getDrawingKey(t){return `charts.tradingview.drawing.${t}`}loadDataFromLocalStorage(){let t=this.getLayoutKey(this.layoutId),e=this.getDrawingKey(this.layoutId),r=localStorage.getItem(t),i=localStorage.getItem(e);if(r)try{let o=JSON.parse(r),s=JSON.parse(o.content);o.content=JSON.stringify(s),this.data=o;}catch(o){console.error("ChartSaveLoadAdapter loadDataFromLocalStorage parse layout error",o);}if(i)try{this.drawings=JSON.parse(i);}catch(o){console.error("ChartSaveLoadAdapter loadDataFromLocalStorage parse drawing error",o);}}saveDataToLocalStorage(){let t=this.getLayoutKey(this.layoutId),e=this.getDrawingKey(this.layoutId),r=Math.round(Date.now()/1e3);this.data&&(this.data.timestamp=r,localStorage.setItem(t,JSON.stringify(this.data))),this.drawings&&(this.drawings.timestamp=r,localStorage.setItem(e,JSON.stringify(this.drawings)));}};var Mt="trading.chart.proterty",X=class{storagePrefix;initialSettings;constructor(t,e,r){this.storagePrefix=`tradingview.${t.storageId}.`,this.initialSettings={};for(let o=0;o<localStorage.length;o++){let s=localStorage.key(o);if(s&&s.startsWith(this.storagePrefix)){let n=s.slice(this.storagePrefix.length);this.initialSettings[n]=localStorage.getItem(s);}}let i={noConfirmEnabled:1};if(this.initialSettings[Mt])try{let o=JSON.parse(this.initialSettings[Mt]);Object.assign(i,o),Object.assign(i,{noConfirmEnabled:!0});}catch(o){console.error("ChartSettingsAdapter: failed to parse chart settings",o);}this.initialSettings[Mt]=JSON.stringify(i);}toJSON(){return null}removeValue(t){delete this.initialSettings[t],localStorage.removeItem(`${this.storagePrefix}${t}`);}setValue(t,e){this.initialSettings[t]=e,localStorage.setItem(`${this.storagePrefix}${t}`,e);}};var Z=class{settings;chartManager;WidgetCtor;moduleInstances=new Map;symbolIntervalSubs=new Map;abortController=new AbortController;widgetReadyPromise=null;readyPromise=null;widget=null;container=null;ready=false;layoutReady=true;events=new Y;libraryPath;customCssUrl;constructor(t,e,r,i){this.settings=t,this.chartManager=e,this.WidgetCtor=r,this.libraryPath=i?.libraryPath??"static/charting_library/",this.customCssUrl=i?.customCssUrl??"custom-styles.css",this.initModules();}getWidget(){return this.widget}async init(t){if(this.widgetReadyPromise)throw new Error("ChartWidgetBridge already initialized.");let e=this.getWidgetOptions();this.container=t,this.widget=new this.WidgetCtor({...e,container:t});let r=new Promise(i=>{this.widget?.onChartReady(()=>i());});this.widgetReadyPromise=r,this.readyPromise=r.then(()=>{this.ready=true,this.handleChartReady();}),this.moduleInstances.forEach((i,o)=>{try{i.init?.call(i);}catch(s){console.warn(`ChartWidgetBridge init module ${o}`,s);}}),await Promise.race([this.readyPromise,new Promise((i,o)=>setTimeout(o,6e4,new Error("ChartWidgetBridge init timeout")))]);}async destroy(){this.moduleInstances.forEach(t=>t.destroy?.call(t)),this.symbolIntervalSubs.forEach(t=>t()),this.symbolIntervalSubs.clear(),this.events.clear(),this.abortController.abort(),this.ready=false,this.widgetReadyPromise=null,this.readyPromise=null,this.widget?.remove(),this.widget=null;}async onReady(){return new Promise((t,e)=>{this.widget?this.widget.onChartReady(()=>this.readyPromise?.then(t).catch(e)):e(Error("cannot call `onReady` before `init`"));})}async asyncWidgetMethodContext(t){return new Promise((e,r)=>{if(!this.widgetReadyPromise){r(new Error("ChartWidgetBridge: widget not ready"));return}let i=this.widgetReadyPromise.then(()=>this.waitForLayout()),o=this.abortController.signal,s=()=>r(o.reason);o.addEventListener("abort",s),i.then(()=>t(this.widget,e)).catch(r).finally(()=>o.removeEventListener("abort",s));})}getModule(t){return this.moduleInstances.get(t)}applyColorPaletteOverrides(){this.widget?.applyOverrides(this.getColorPaletteOverrides()),this.widget?.applyStudiesOverrides(this.getColorPaletteStudiesOverrides());}getWidgetOptions(){let t=["header_widget","legend_inplace_edit","display_market_status","save_shortcut","show_interval_dialog_on_key_press","symbol_info","symbol_search_hot_key","uppercase_instrument_names","show_symbol_logo_in_legend","show_symbol_logo_for_compare_studies","drawing_templates"],e=["determine_first_data_request_size_using_visible_range","request_only_visible_range_on_reset","show_exchange_logos","show_symbol_logos","dont_show_boolean_study_arguments","hide_last_na_study_output","hide_right_toolbar","seconds_resolution","saveload_separate_drawings_storage","volume_force_overlay","create_volume_indicator_by_default","two_character_bar_marks_labels"];return this.settings.enableHideDrawingToolsByDefault&&e.push("hide_left_toolbar_by_default"),this.settings.enableTimeframesToolbar||t.push("timeframes_toolbar"),this.settings.enableCreateVolumeIndicatorByDefault||t.push("create_volume_indicator_by_default"),this.settings.enableVolumeForceOverlay||t.push("volume_force_overlay"),{container:"",autosize:true,debug:false,load_last_chart:true,auto_save_delay:1,timezone:this.localTimezone,library_path:this.libraryPath,custom_css_url:this.customCssUrl,theme:E(this.settings.theme),custom_font_family:window.getComputedStyle(document.body).fontFamily,symbol:this.chartManager.activeArea?.tickerSymbol,interval:v(this.chartManager.activeArea?.resolution),locale:this.settings.locale,datafeed:this.getModule("datafeed"),save_load_adapter:this.getModule("saveLoadAdapter"),settings_adapter:this.getModule("settingsAdapter"),custom_formatters:{priceFormatterFactory:this.settings.priceFormatterFactory?(r,i)=>this.settings.priceFormatterFactory(r,i):()=>null},overrides:{...this.getSettingsOverrides(),...this.getColorPaletteOverrides()},studies_overrides:this.getColorPaletteStudiesOverrides(),disabled_features:t,enabled_features:e,supported_resolutions:T.map(v)}}async handleChartReady(){let t=U(this.settings.layout);t!==this.widget?.layout()&&await this.waitForLayout(t),this.widget?.setActiveChart(this.chartManager.selectedIndex),this.getModule("saveLoadAdapter")?.shouldResetColorPalette&&(await this.widget?.changeTheme(E(this.settings.theme),{disableUndo:true}),this.applyColorPaletteOverrides()),this.widget?.subscribe("onAutoSaveNeeded",this.onAutoSaveNeeded.bind(this)),this.widget?.subscribe("activeChartChanged",this.activeChartChanged.bind(this)),this.widget?.subscribe("layout_about_to_be_changed",this.layoutWillChange.bind(this)),this.widget?.subscribe("layout_changed",this.layoutChanged.bind(this)),this.syncChartsChanges(),this.subscribeChartsChanges(),this.installEventHooks(),this.resetTimezone();}onAutoSaveNeeded(){try{this.widget?.saveChartToServer(void 0,void 0,{defaultChartName:"DEFAULT"});}catch(t){console.warn("ChartWidgetBridge.onAutoSaveNeeded",t);}}activeChartChanged(t){this.chartManager.selectedIndex=t,this.chartManager.settings.saveLoadAdapter.saveSettings(this.chartManager.settingsData);}layoutWillChange(t){this.layoutReady=false,this.chartManager.setLayout(pt(t));}layoutChanged(){this.layoutReady=true,this.syncChartsChanges(),this.subscribeChartsChanges(),this.widget?.unloadUnusedCharts(),this.widget?.saveChartToServer();}syncChartsChanges(){this.widget?.symbolSync()?.setValue(false),this.widget?.intervalSync()?.setValue(false);let t=this.widget?.chartsCount()??0;for(let e=0;e<t;e++){let r=this.chartManager.areaByIndex(e),i=this.widget.chart(e);i.setSymbol(r?.tickerSymbol??"",{doNotActivateChart:true}),i.setResolution(v(r?.resolution),{doNotActivateChart:true});}}subscribeChartsChanges(){let t=this.widget?.chartsCount()??0;this.symbolIntervalSubs.forEach((e,r)=>{parseInt(r)>=t&&(e(),this.symbolIntervalSubs.delete(r));});for(let e=0;e<t;e++){if(this.symbolIntervalSubs.has(`${e}`))continue;let r=this.chartManager.areaByIndex(e),i=this.widget.chart(e);i.getPanes().forEach(c=>c.getMainSourcePriceScale()?.setAutoScale(true));let o=i.onSymbolChanged(),s=i.onIntervalChanged(),n=()=>{this.events.emit("symbolChanged",[e,i.symbol()]),r?.setSymbol(i.symbol()).catch(()=>{}),this.onAutoSaveNeeded();},l=c=>{let b=mt(c);this.events.emit("resolutionChanged",[e,b]),r?.setResolution(b).catch(()=>{});};o.subscribe(r,n),s.subscribe(r,l),this.symbolIntervalSubs.set(`${e}`,()=>{o.unsubscribe(r,n),s.unsubscribe(r,l);});}}installEventHooks(){let t=this.container?.lastElementChild,e=t?.contentWindow?.document;if(e&&(e.addEventListener("click",()=>t?.click()),e.defaultView?.MutationObserver)){let r=new WeakSet,i=e.querySelector(".layout__area--center");if(i){let o=()=>{i.querySelectorAll(".chart-container").forEach((s,n)=>{r.has(s)||(r.add(s),Nt.forEach(l=>{s.addEventListener(l,c=>this.events.emit("domEvent",[n,l,c]),{passive:true});}));});};new e.defaultView.MutationObserver(o).observe(i,{childList:true}),o();}}}resetTimezone(){try{let t=this.widget?.chartsCount()??0;for(let e=0;e<t;e++)this.widget?.chart(e)?.getTimezoneApi()?.setTimezone(this.localTimezone);}catch(t){console.error("ChartWidgetBridge: Reset timezone",t);}}get localTimezone(){return Intl.DateTimeFormat().resolvedOptions().timeZone}async waitForLayout(t){if(!this.widget||this.layoutReady&&!t)return;let e;return new Promise(i=>{e=i,this.widget.subscribe("layout_changed",i),t&&this.widget.setLayout(t);}).finally(()=>{this.widget.unsubscribe("layout_changed",e);})}getSettingsOverrides(){return {"mainSeriesProperties.minTick":"default","paneProperties.legendProperties.showSeriesTitle":this.settings.enableLegendSeriesTitle}}getColorPaletteOverrides(){let t=this.settings.theme==="dark"?C.card:Ht.card;return {"paneProperties.background":C.chartBg,"paneProperties.backgroundType":"solid",volumePaneSize:"medium","mainSeriesProperties.candleStyle.upColor":C.increase,"mainSeriesProperties.barStyle.upColor":C.increase,"mainSeriesProperties.columnStyle.upColor":C.increase,"mainSeriesProperties.candleStyle.downColor":C.decrease,"mainSeriesProperties.barStyle.downColor":C.decrease,"mainSeriesProperties.columnStyle.downColor":C.decrease,"mainSeriesProperties.candleStyle.borderUpColor":C.increase,"mainSeriesProperties.candleStyle.borderDownColor":C.decrease,"mainSeriesProperties.candleStyle.wickUpColor":C.increase,"mainSeriesProperties.candleStyle.wickDownColor":C.decrease,"linetoolorder.bodyBackgroundColor":t,"linetoolorder.bodyBackgroundTransparency":0}}getColorPaletteStudiesOverrides(){return {"volume.volume.color.0":C.decrease,"volume.volume.color.1":C.increase,"volume.volume.transparency":80}}initModules(){Object.entries({datafeed:K,saveLoadAdapter:Q,settingsAdapter:X}).forEach(([e,r])=>{this.moduleInstances.set(e,new r(this.settings,this.chartManager,this));});}};var At=react.memo(()=>null);var Ft=react.forwardRef(({onReady:a},t)=>{let{chartManager:e,chartSettings:r,widgetConstructor:i,libraryPath:o,customCssUrl:s}=h(),n=react.useRef(a),[l,c]=react.useState(),[b,y]=react.useState(null),[Et,kt]=react.useState(false);return react.useEffect(()=>{Et&&n.current&&setTimeout(n.current);},[Et]),react.useImperativeHandle(t,()=>l,[l]),react.useEffect(()=>{if(!b)return;let gt=new Z(r,e,i,{libraryPath:o,customCssUrl:s}),le=new G(r,e,gt);return c(le),gt.init(b).then(()=>kt(true)).catch(de=>{console.error("TradingViewWidgetContainer: failed to init bridge",de);}),()=>{gt.destroy().then(()=>{c(void 0),kt(false);}).catch(()=>{console.error("TradingViewWidgetContainer: failed to destroy bridge");});}},[b,r,e,i,o,s]),jsxRuntime.jsxs("div",{className:"w-full h-full",children:[jsxRuntime.jsx(At,{}),jsxRuntime.jsx("div",{id:"tv_chart_container",className:"w-full h-full",ref:y})]})});var Vt=react.memo(({onReady:a})=>{let{chartManager:t,chartSettings:e}=h(),r=react.useMemo(()=>`${e.timezone}_${t.reloadId}`,[e.timezone,t.reloadId]);react.useLayoutEffect(()=>{t.setLoading(true);},[t,e.chartType,r]);let i=react.useCallback(()=>{a?.(),t.onInternalWidgetReady(),t.setLoading(false);},[t,a]);return jsxRuntime.jsx("div",{className:"flex-1 w-full overflow-hidden",children:jsxRuntime.jsx(Ft,{onReady:i,ref:o=>t.setInternalWidget(o??null)})})});var mr=react.memo(({toolbar:a,loadingOverlay:t,onReady:e,children:r})=>{let{prefix:i}=h(),o=jotai.useAtomValue(_(i));return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[a!==false&&jsxRuntime.jsx(It,{...a||{}}),jsxRuntime.jsxs("div",{className:"relative flex-1 w-full overflow-hidden",children:[o&&t&&jsxRuntime.jsx("div",{className:"absolute inset-0 z-10 flex items-center justify-center bg-background/80",children:t}),jsxRuntime.jsx(Vt,{onReady:e})]}),r]})}),pr=react.forwardRef(({initConfig:a,widgetConstructor:t,libraryPath:e,customCssUrl:r,toolbar:i,loadingOverlay:o,onReady:s,children:n,className:l},c)=>jsxRuntime.jsx("div",{className:`flex flex-col w-full h-full ${l??""}`,children:jsxRuntime.jsx(ft,{ref:c,initConfig:a,widgetConstructor:t,libraryPath:e,customCssUrl:r,children:jsxRuntime.jsx(mr,{toolbar:i,loadingOverlay:o,onReady:s,children:n})})}));var Cr=react.memo(({index:a})=>{let{prefix:t}=h(),e=jotai.useAtomValue(u(t)),r=jotai.useAtomValue(f(t)),o=e[a??r];return o?jsxRuntime.jsxs("div",{className:"flex items-center gap-1 text-xs text-muted-foreground",children:[jsxRuntime.jsx("span",{className:"font-medium text-foreground",children:o.tickerSymbol||o.symbol}),jsxRuntime.jsx("span",{children:o.resolution})]}):null});function vr(){return h().chartManager}function Tr(){let{prefix:a,chartManager:t}=h(),e=jotai.useAtomValue(f(a)),r=jotai.useAtomValue(u(a));return react.useMemo(()=>r.length?t.areaByIndex(e):null,[t,e,r])}function wr(){let{prefix:a,chartManager:t}=h(),e=jotai.useAtomValue(f(a)),i=jotai.useAtomValue(u(a))[e];return react.useMemo(()=>i?.tickerSymbol?t.symbolResolver?.getSymbolInfo(i.tickerSymbol)??null:null,[t,i?.tickerSymbol])}exports.ALL_TV_CHART_RESOLUTIONS=T;exports.ChartAreaManager=V;exports.ChartDataFeed=K;exports.ChartLibraryWidget=G;exports.ChartManager=N;exports.ChartSaveLoadAdapter=Q;exports.ChartSettings=z;exports.ChartSettingsAdapter=X;exports.ChartSettingsStore=H;exports.ChartSymbolResolver=$;exports.ChartWidget=q;exports.ChartWidgetBridge=Z;exports.DEFAULT_TV_CHART_RESOLUTIONS=S;exports.ENABLED_TV_CHART_FEATURES=ut;exports.EventEmitter=Y;exports.SUPPORTED_TV_CHART_LAYOUTS=ct;exports.TV_CHART_THEME_COLORS=C;exports.TradingView=pr;exports.TradingViewAreaTitle=Cr;exports.TradingViewConfig=yt;exports.TradingViewFullscreen=Ct;exports.TradingViewKlineStyleSelect=St;exports.TradingViewLayout=At;exports.TradingViewOpenIndicator=Tt;exports.TradingViewOpenSettings=xt;exports.TradingViewProvider=ft;exports.TradingViewResolutions=Lt;exports.TradingViewSnapshot=Rt;exports.TradingViewToolbar=It;exports.TradingViewToolbarProvider=vt;exports.TradingViewWidgetContainer=Ft;exports.TradingViewWidgetProvider=Vt;exports.TvChartErrorResetType=Bt;exports.TvChartFeature=et;exports.TvChartHandle=ht;exports.TvChartKlineStyle=tt;exports.TvChartLayout=R;exports.TvChartPriceType=Dt;exports.TvChartQuoteType=Wt;exports.TvChartTheme=Ot;exports.TvChartType=j;exports.chartAreasFamily=u;exports.chartFullscreenFamily=I;exports.chartLoadingFamily=_;exports.chartPinnedResolutionsFamily=x;exports.chartSelectedIndexFamily=f;exports.chartShowDrawingToolbarFamily=w;exports.getTvChartLayoutReverse=pt;exports.getTvChartLibraryLayout=U;exports.getTvChartLibraryLocale=fe;exports.getTvChartLibraryResolution=v;exports.getTvChartLibraryTheme=E;exports.getTvChartResolutionFrame=ve;exports.getTvChartResolutionReverse=mt;exports.getTvChartTickTimestamp=Se;exports.parseSymbol=nt;exports.settingsBackgroundColorFamily=st;exports.settingsChartTypeFamily=A;exports.settingsDataFamily=B;exports.settingsDisabledFeaturesFamily=F;exports.settingsEnabledFeaturesFamily=P;exports.settingsLayoutFamily=M;exports.settingsLocaleFamily=rt;exports.settingsReverseColorFamily=ot;exports.settingsStorageIdFamily=W;exports.settingsThemeFamily=D;exports.settingsTickerSymbolFamily=it;exports.settingsTimezoneFamily=at;exports.stringifySymbol=ce;exports.stringifySymbolShort=lt;exports.useActiveAreaManager=Tr;exports.useChartManager=vr;exports.useSymbolInfo=wr;exports.useTvChartContext=h;exports.useTvChartManager=Ae;exports.useTvChartPrefix=Pe;exports.useTvChartToolbarContext=J;exports.widgetReadyFamily=O;//# sourceMappingURL=index.js.map
2
2
  //# sourceMappingURL=index.js.map