@tradecanvas/chart 1.1.0 → 1.2.0

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.
Files changed (49) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +79 -9
  3. package/dist/Chart.d.ts +28 -0
  4. package/dist/Chart.d.ts.map +1 -1
  5. package/dist/DataManager.d.ts.map +1 -1
  6. package/dist/{DragDropImporter-CLtRQjKD.js → DragDropImporter-BcTzFeRP.js} +312 -223
  7. package/dist/DragDropImporter-BcTzFeRP.js.map +1 -0
  8. package/dist/DragDropImporter-DZBrretS.cjs +2 -0
  9. package/dist/DragDropImporter-DZBrretS.cjs.map +1 -0
  10. package/dist/charts/IndicatorPriceRange.d.ts +7 -3
  11. package/dist/charts/IndicatorPriceRange.d.ts.map +1 -1
  12. package/dist/index.cjs +1 -1
  13. package/dist/index.cjs.map +1 -1
  14. package/dist/index.d.ts +1 -1
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +19 -19
  17. package/dist/index.js.map +1 -1
  18. package/dist/layout/LayoutManager.d.ts +3 -0
  19. package/dist/layout/LayoutManager.d.ts.map +1 -1
  20. package/dist/layout/priceAxisWidth.d.ts +22 -0
  21. package/dist/layout/priceAxisWidth.d.ts.map +1 -0
  22. package/dist/widget/ChartWidget.d.ts +24 -1
  23. package/dist/widget/ChartWidget.d.ts.map +1 -1
  24. package/dist/widget/WidgetDrawingSidebar.d.ts.map +1 -1
  25. package/dist/widget/WidgetHotkeySheet.d.ts +3 -1
  26. package/dist/widget/WidgetHotkeySheet.d.ts.map +1 -1
  27. package/dist/widget/WidgetLoadingOverlay.d.ts +41 -0
  28. package/dist/widget/WidgetLoadingOverlay.d.ts.map +1 -0
  29. package/dist/widget/WidgetObjectTree.d.ts.map +1 -1
  30. package/dist/widget/WidgetSettings.d.ts +3 -1
  31. package/dist/widget/WidgetSettings.d.ts.map +1 -1
  32. package/dist/widget/WidgetToolbar.d.ts +4 -1
  33. package/dist/widget/WidgetToolbar.d.ts.map +1 -1
  34. package/dist/widget/WidgetWatchlist.d.ts +4 -1
  35. package/dist/widget/WidgetWatchlist.d.ts.map +1 -1
  36. package/dist/widget/i18n.d.ts +70 -0
  37. package/dist/widget/i18n.d.ts.map +1 -0
  38. package/dist/widget/icons.d.ts.map +1 -1
  39. package/dist/widget/index.cjs +2458 -2380
  40. package/dist/widget/index.cjs.map +1 -1
  41. package/dist/widget/index.js +635 -237
  42. package/dist/widget/index.js.map +1 -1
  43. package/dist/widget/types.d.ts +10 -0
  44. package/dist/widget/types.d.ts.map +1 -1
  45. package/dist/widget/widgetConfig.d.ts.map +1 -1
  46. package/package.json +6 -3
  47. package/dist/DragDropImporter-CLtRQjKD.js.map +0 -1
  48. package/dist/DragDropImporter-pPS0fl5H.cjs +0 -2
  49. package/dist/DragDropImporter-pPS0fl5H.cjs.map +0 -1
@@ -0,0 +1,2 @@
1
+ let e=require(`@tradecanvas/commons`),t=require(`@tradecanvas/core`);function n(e){switch(e){case`candlestick`:case`heikinAshi`:case`lineBreak`:case`rangeBars`:return new t.CandlestickRenderer;case`line`:return new t.LineRenderer;case`area`:return new t.AreaRenderer;case`bar`:return new t.BarRenderer;case`hollowCandle`:return new t.HollowCandleRenderer;case`baseline`:return new t.BaselineRenderer;case`renko`:return new t.RenkoRenderer;case`kagi`:return new t.KagiRenderer;case`pointAndFigure`:return new t.PointAndFigureRenderer;case`volumeCandles`:return new t.VolumeCandleRenderer;case`equivolume`:return new t.EquivolumeRenderer;case`hlcArea`:return new t.HLCAreaRenderer;case`stepLine`:return new t.StepLineRenderer;case`lineWithMarkers`:return new t.LineWithMarkersRenderer;default:return new t.CandlestickRenderer}}function r(e,n){if(n.length===0)return n;switch(e){case`heikinAshi`:return(0,t.toHeikinAshi)(n);case`renko`:return(0,t.toRenko)(n,{brickSize:0,useATR:!0,atrPeriod:14});case`lineBreak`:return(0,t.toLineBreak)(n,3);case`kagi`:return(0,t.toKagi)(n,4);case`pointAndFigure`:return(0,t.toPointAndFigure)(n,i(n)*.01,3);case`rangeBars`:return(0,t.toRangeBars)(n,{rangeSize:i(n)*.005});default:return n}}function i(e){let t=0;for(let n of e)t+=n.close;return t/e.length}function a(e,t){let r=t?.(e);return r?r.createRenderer():n(e)}function o(e,t,n){if(t.length===0)return t;let i=n?.(e);return i?.transform?i.transform(t):r(e,t)}var s={min:0,max:100},c=.1;function l(e,t,n){if(!e)return{...s};let r=1/0,i=-1/0;if(e.series){let a=Math.min(n,e.series.length-1);for(let n=Math.max(0,t);n<=a;n++){let t=e.series[n];if(t)for(let e in t){let n=t[e];n!==void 0&&Number.isFinite(n)&&(n<r&&(r=n),n>i&&(i=n))}}}else{let a=0;for(let[,o]of e.values){if(a>=t&&a<=n)for(let e in o){let t=o[e];t!==void 0&&Number.isFinite(t)&&(t<r&&(r=t),t>i&&(i=t))}a++}}if(r===1/0)return{...s};let a=i-r||1;return{min:r-a*c,max:i+a*c}}var u=class{timer=null;delayMs=0;key=null;constructor(e){this.save=e}enable(e,t){this.key=e,this.delayMs=t}disable(){this.key=null,this.delayMs=0,this.cancel()}schedule(){this.delayMs<=0||!this.key||(this.timer&&clearTimeout(this.timer),this.timer=setTimeout(()=>{this.timer=null,this.key&&this.save(this.key)},this.delayMs))}cancel(){this.timer&&=(clearTimeout(this.timer),null)}isEnabled(){return this.delayMs>0&&this.key!==null}hasPending(){return this.timer!==null}};function d(e){if(!e||typeof e.time!=`number`)return!1;let{open:t,high:n,low:r,close:i}=e;return!(!isFinite(t)||!isFinite(n)||!isFinite(r)||!isFinite(i)||t<0||n<0||r<0||i<0||n<r||e.volume!==void 0&&(!isFinite(e.volume)||e.volume<0))}function f(e){return e.volume!==void 0&&e.high>=e.open&&e.high>=e.close&&e.low<=e.open&&e.low<=e.close}function p(e){return{...e,high:Math.max(e.open,e.high,e.low,e.close),low:Math.min(e.open,e.high,e.low,e.close),volume:e.volume===void 0?0:Math.max(0,e.volume)}}var m=class{data=[];getData(){return this.data}setData(e){let t=[];for(let n=0;n<e.length;n++){let r=e[n];d(r)&&t.push(f(r)?r:p(r))}this.data=t}appendBar(e){d(e)&&this.data.push(p(e))}updateLastBar(e){if(!d(e))return;let t=p(e);if(this.data.length===0){this.data.push(t);return}this.data[this.data.length-1]=t}updateLastBarFromTick(t){this.data.length!==0&&(!isFinite(t.price)||t.price<0||t.volume!==void 0&&(!isFinite(t.volume)||t.volume<0)||(this.data[this.data.length-1]=(0,e.mergeBar)(this.data[this.data.length-1],t)))}getLength(){return this.data.length}clear(){this.data=[]}},h=class{theme;constructor(t){!t||t===`dark`?this.theme={...e.DARK_THEME}:t===`light`?this.theme={...e.LIGHT_THEME}:this.theme={...t}}getTheme(){return this.theme}setTheme(t){t===`dark`?this.theme={...e.DARK_THEME}:t===`light`?this.theme={...e.LIGHT_THEME}:this.theme={...t}}},g=200,_=80,v=class{panels=[];containerWidth=0;containerHeight=0;priceAxisWidth=e.PRICE_AXIS_WIDTH;resize(e,t){this.containerWidth=e,this.containerHeight=t}addPanel(t,n=`bottom`,r){let i=n===`left`||n===`right`;this.panels.push({id:t,position:n,size:r??(i?g:e.DEFAULT_PANEL_HEIGHT),minSize:i?_:e.MIN_PANEL_HEIGHT,content:{type:`indicator`,indicatorInstanceId:t}})}removePanel(e){this.panels=this.panels.filter(t=>t.id!==e)}setPanelPosition(t,n){let r=this.panels.find(e=>e.id===t);if(r){let t=r.position===`left`||r.position===`right`,i=n===`left`||n===`right`;r.position=n,t!==i&&(r.size=i?g:e.DEFAULT_PANEL_HEIGHT,r.minSize=i?_:e.MIN_PANEL_HEIGHT)}}setPanelSize(e,t){let n=this.panels.find(t=>t.id===e);n&&(n.size=Math.max(n.minSize,t))}setPriceAxisWidth(e){this.priceAxisWidth=e}getPanels(){return this.panels}resolve(){let t=this.panels.filter(e=>e.position===`left`),n=this.panels.filter(e=>e.position===`right`),r=this.panels.filter(e=>e.position===`top`),i=this.panels.filter(e=>e.position===`bottom`),a=t.reduce((e,t)=>e+t.size,0),o=n.reduce((e,t)=>e+t.size,0),s=r.reduce((e,t)=>e+t.size,0),c=i.reduce((e,t)=>e+t.size,0),l={x:a,y:s,width:Math.max(0,this.containerWidth-a-o-this.priceAxisWidth),height:Math.max(0,this.containerHeight-s-c-e.TIME_AXIS_HEIGHT)},u=[],d=[],f=0;for(let n of t)u.push({config:n,rect:{x:f,y:0,width:n.size,height:this.containerHeight-e.TIME_AXIS_HEIGHT}}),d.push({panelId:n.id,rect:{x:f+n.size-2,y:0,width:4,height:this.containerHeight},orientation:`vertical`}),f+=n.size;let p=0;for(let e of r)u.push({config:e,rect:{x:a,y:p,width:l.width,height:e.size}}),d.push({panelId:e.id,rect:{x:a,y:p+e.size-2,width:l.width,height:4},orientation:`horizontal`}),p+=e.size;p=l.y+l.height;for(let e of i)u.push({config:e,rect:{x:a,y:p,width:l.width,height:e.size}}),d.push({panelId:e.id,rect:{x:a,y:p-2,width:l.width,height:4},orientation:`horizontal`}),p+=e.size;f=a+l.width+this.priceAxisWidth;for(let t of n)u.push({config:t,rect:{x:f,y:0,width:t.size,height:this.containerHeight-e.TIME_AXIS_HEIGHT}}),d.push({panelId:t.id,rect:{x:f-2,y:0,width:4,height:this.containerHeight},orientation:`vertical`}),f+=t.size;return{mainChartRect:l,panels:u,dividers:d}}getMainChartRect(){return this.resolve().mainChartRect}},y=14,ee=14,b=22,x=4;function S(t){let{min:n,max:r,lastPrice:i,locale:a,fontFamily:o,fontSizeSmall:s,measure:c}=t,l=(0,e.autoPricePrecision)(n,r),u=t.tagPrecision??l,d=i===null?[n,r]:[n,r,i],f=e.PRICE_AXIS_WIDTH;for(let t of d){if(!Number.isFinite(t))continue;let n=(0,e.formatPrice)(t,l,a),r=(0,e.formatPrice)(t,u,a);f=Math.max(f,c(n,`500 ${s}px ${o}`)+y,c(r,`bold 11px ${o}`)+ee,c(r,`600 ${s}px ${o}`)+b)}return f<=e.PRICE_AXIS_WIDTH?e.PRICE_AXIS_WIDTH:Math.ceil(f/x)*x}function C(e,t){return t>e||t<=e-12?t:e}var w=1;function T(e,t){return e.filter(e=>(e.descriptor.layer??`overlay`)===t)}function E(e){switch(e.kind){case`indicator`:return`indicator:${e.plugin.descriptor.id}`;case`drawing`:return`drawing:${e.plugin.descriptor.type}`;case`chartType`:return`chartType:${e.plugin.descriptor.type}`;case`overlay`:return`overlay:${e.plugin.descriptor.id}`}}var D=new Map;function O(e){D.set(E(e),e)}function k(e){return D.delete(e)}function A(){return[...D.values()]}function j(){D.clear()}var M=class{plugins=new Map;constructor(e,t={}){if(this.indicatorEngine=e,t.inheritGlobal!==!1)for(let e of A())this.add(e);for(let e of t.plugins??[])this.add(e)}register(e){this.add(e)}unregister(e){return this.plugins.delete(e)}list(){return[...this.plugins.values()]}registerIndicator(e){this.add({kind:`indicator`,plugin:e})}getChartType(e){let t=this.plugins.get(`chartType:${e}`);return t?.kind===`chartType`?t.plugin:void 0}getOverlays(){let e=[];for(let t of this.plugins.values())t.kind===`overlay`&&e.push(t.plugin);return e}add(e){this.plugins.set(E(e),e),e.kind===`indicator`&&this.indicatorEngine.register(e.plugin)}},N={orderPlace:(e,t)=>e.placeOrder(t),orderModify:(e,t)=>e.modifyOrder(t),orderCancel:(e,t)=>e.cancelOrder(t),positionModify:(e,t)=>e.modifyPosition(t),positionClose:(e,t)=>e.closePosition(t)};function P(e,t){let n=[],r=e=>t.setOrders(e.data??[]),i=e=>t.setPositions(e.data??[]),a=e=>t.onError(e.data??{message:`Execution error`});e.on(`orders`,r),e.on(`positions`,i),e.on(`error`,a),n.push(()=>e.off(`orders`,r),()=>e.off(`positions`,i),()=>e.off(`error`,a));for(let r of Object.keys(N)){let i=N[r],a=t.onIntent(r,n=>{Promise.resolve(i(e,n)).catch(e=>t.onError({message:`Execution command failed: ${r}`,cause:e}))});n.push(a)}return()=>{for(let e of n)e()}}var F=6,te=class{static version=`1.2.0`;engine;viewport;dataManager;themeManager;layoutManager;pluginManager;indicatorEngine;drawingManager;drawingRenderer;tradingManager;tradingRenderer;eventBus;streamManager=null;executionAdapter=null;execTeardown=null;autoScrollOnNewBar=!0;displayDataCache=null;resolvedLayoutCache=null;panelInfoCache=null;renderScheduled=!1;priceAxisWidth=e.PRICE_AXIS_WIDTH;measureCtx;containerSizeCache=null;containerSizeCacheTime=0;lastEmittedRange=null;lastEmittedPriceRange=null;lastEmittedBarWidth=null;chartLegend;watermark;barCountdown;sessionBreaks;sessionShading;compareRenderer;countdownInterval=null;volumeRenderer;volumeProfile;marketProfile;depthHeatmap;periodLevels;pivotMarkers;alertManager;signalMarkerManager;tradeZoneManager;measureOverlay;replayManager;replayBarUnsub=null;undoRedoManager;autoSaveScheduler=new u(e=>this.saveState(e));animator;crosshairTooltip;pinnedTooltip;interactionManager;crosshairHandler;chartRenderer;gridRenderer;priceAxis;timeAxis;options;features;marketConfig=null;container;currentPriceLine;numberLocale;defaultAutoScale;keyboardHandler=null;onWindowKeyDown=null;currentSymbol=``;constructor(n,r){this.container=n,this.options=r,this.numberLocale=r.numberLocale??`en-US`,this.defaultAutoScale=r.autoScale!==!1;let i=r.features??{};this.features={drawings:i.drawings??!0,drawingTools:i.drawingTools??[],drawingMagnet:i.drawingMagnet??!0,drawingUndoRedo:i.drawingUndoRedo??!0,trading:i.trading??!0,tradingContextMenu:i.tradingContextMenu??!0,indicators:i.indicators??!0,indicatorIds:i.indicatorIds??[],panning:i.panning??!0,zooming:i.zooming??!0,crosshair:i.crosshair??!0,crosshairTooltip:i.crosshairTooltip??!0,keyboard:i.keyboard??!0,priceAxis:i.priceAxis??!0,timeAxis:i.timeAxis??!0,grid:i.grid??r.grid?.visible??!0,legend:i.legend??!0,volume:i.volume??!0,watermark:i.watermark??!0,saveLoad:i.saveLoad??!0,screenshot:i.screenshot??!0,alerts:i.alerts??!0,replay:i.replay??!0,sessionBreaks:i.sessionBreaks??!0,barCountdown:i.barCountdown??!0,compareSymbols:i.compareSymbols??!0,dataExport:i.dataExport??!0,logScale:i.logScale??!0,timeframes:i.timeframes??[],defaultTimeframeFavorites:i.defaultTimeframeFavorites??[]},n.style.position=`relative`,n.style.overflow=`hidden`,n.tabIndex=0,n.style.outline=`none`,this.dataManager=new m,this.themeManager=new h(r.theme),this.layoutManager=new v,this.indicatorEngine=new t.IndicatorEngine,this.pluginManager=new M(this.indicatorEngine,{plugins:r.plugins}),this.eventBus=new t.EventBus,(0,t.registerBuiltInIndicators)(this.indicatorEngine),this.drawingManager=new t.DrawingManager,(0,t.registerBuiltInDrawingTools)(this.drawingManager),this.drawingRenderer=new t.DrawingRenderer(this.drawingManager),this.drawingManager.setRequestRender(()=>{this.syncRenderContext(),this.engine.requestRender(e.LayerType.Overlay),this.scheduleAutoSave()}),this.drawingManager.setEventCallback((e,t)=>{this.eventBus.emit(e,t)}),this.undoRedoManager=new t.UndoRedoManager,this.drawingManager.setUndoRedoManager(this.undoRedoManager),this.drawingManager.setDataGetter(()=>this.dataManager.getData()),this.drawingManager.setDisplayDataGetter(()=>this.getDisplayData()),r.crosshair?.mode===`magnet`&&this.drawingManager.setMagnetMode(`magnet`),this.tradingManager=new t.TradingManager({enabled:this.features.trading,contextMenu:{enabled:this.features.tradingContextMenu}}),this.tradingRenderer=new t.TradingRenderer(this.tradingManager),this.tradingManager.setContainer(n),this.tradingManager.setRequestRender(()=>this.engine.requestRender(e.LayerType.Overlay)),this.tradingManager.setEventCallback((e,t)=>{this.eventBus.emit(e,t)}),this.engine=new t.RenderEngine(n);let a=this.engine.dprManager.getContainerSize();if(this.viewport=new t.Viewport(a.width,a.height,r.minBarSpacing??2,r.maxBarSpacing??30,r.rightMargin??5),this.layoutManager.resize(a.width,a.height),this.engine.onContainerResize=e=>{if(e.width<=0||e.height<=0)return;let t=this.viewport.isAtEnd();this.viewport.resize(e.width,e.height),this.layoutManager.resize(e.width,e.height),this.updateViewportAndRender(t)},this.chartRenderer=this.createChartRenderer(r.chartType),this.gridRenderer=new t.GridRenderer,r.grid?.visible===!1&&this.gridRenderer.setVisible(!1),this.priceAxis=new t.PriceAxis,this.priceAxis.setLocale(this.numberLocale),this.timeAxis=new t.TimeAxis,this.crosshairHandler=new t.CrosshairHandler,this.crosshairHandler.setLocale(this.numberLocale),r.crosshair?.mode&&this.crosshairHandler.setMode(r.crosshair.mode),this.crosshairHandler.setCallback((e,t)=>{if(e!==null&&t){let n=this.dataManager.getData(),r=e<n.length?n[e]:void 0;this.chartLegend.setHoverBar(r??null),r&&this.features.crosshairTooltip&&this.crosshairTooltip.show(t,r,this.themeManager.getTheme(),this.cachedContainerSize()),this.pinnedTooltip.isPinned()&&this.pinnedTooltip.reposition(this.viewport.getState(),r??null,e,this.themeManager.getTheme()),this.eventBus.emit(`crosshairMove`,{point:t,bar:r,barIndex:e})}else this.crosshairTooltip.hide(),this.chartLegend.setHoverBar(null)}),this.chartLegend=new t.ChartLegend,this.chartLegend.setChartType(r.chartType),this.chartLegend.setLocale(this.numberLocale),this.watermark=new t.Watermark,r.watermark&&this.watermark.setConfig(r.watermark),this.volumeRenderer=new t.VolumeRenderer,this.volumeProfile=new t.VolumeProfileRenderer,this.marketProfile=new t.MarketProfileRenderer,this.depthHeatmap=new t.DepthHeatmapRenderer,this.periodLevels=new t.PeriodLevelsRenderer,this.pivotMarkers=new t.PivotMarkersRenderer,this.barCountdown=new t.BarCountdown,this.sessionBreaks=new t.SessionBreaks,this.sessionBreaks.setLocale(this.numberLocale),this.sessionShading=new t.SessionShading,this.compareRenderer=new t.CompareRenderer,r.sessionBreaks?this.sessionBreaks.setConfig({visible:r.sessionBreaks.visible??!0,color:r.sessionBreaks.color,lineStyle:r.sessionBreaks.lineStyle,lineWidth:r.sessionBreaks.lineWidth}):r.features?.sessionBreaks!==!1&&this.sessionBreaks.setVisible(!0),r.logScale&&this.viewport.setLogScale(!0),this.animator=new t.Animator,this.crosshairTooltip=new t.CrosshairTooltip,this.crosshairTooltip.create(n),this.pinnedTooltip=new t.PinnedTooltip,this.pinnedTooltip.create(n),this.keyboardHandler=new t.KeyboardHandler({scrollBars:e=>{let t=this.viewport.getState().barWidth+this.viewport.getState().barSpacing;this.viewport.scrollBy(e*t),this.updateViewportAndRender()},zoom:e=>{let t=this.viewport.getState().chartRect.width;this.viewport.zoom(e,t/2),this.updateViewportAndRender()},goToStart:()=>{this.viewport.scrollBy(-1/0),this.updateViewportAndRender()},goToEnd:()=>{this.viewport.scrollToEnd(),this.updateViewportAndRender()},fitContent:()=>this.fitContent()}),this.keyboardHandler.setEnabled(this.features.keyboard),this.onWindowKeyDown=e=>{if(!this.keyboardHandler)return;let t=document.activeElement;t&&t!==this.container&&!this.container.contains(t)||t&&(t.tagName===`INPUT`||t.tagName===`TEXTAREA`||t.isContentEditable)||this.keyboardHandler.handleKey(e)&&e.preventDefault()},window.addEventListener(`keydown`,this.onWindowKeyDown),this.currentPriceLine=new t.CurrentPriceLine,this.currentPriceLine.setLocale(this.numberLocale),this.alertManager=new t.AlertManager,this.alertManager.setRequestRender(()=>this.engine.requestRender(e.LayerType.Overlay)),this.alertManager.on(`triggered`,e=>{let t={id:e.id,price:e.price,condition:e.condition,message:e.message,triggered:e.triggered};this.eventBus.emit(`alertTriggered`,t),this.eventBus.emit(`dataUpdate`,{alert:`triggered`,alertId:e.id,price:e.price,message:e.message})}),this.alertManager.on(`added`,e=>{this.eventBus.emit(`alertAdd`,{id:e.id,price:e.price,condition:e.condition,message:e.message,triggered:e.triggered})}),this.alertManager.on(`removed`,e=>{this.eventBus.emit(`alertRemove`,{id:e})}),this.alertManager.on(`updated`,e=>{this.eventBus.emit(`alertUpdate`,{id:e.id,price:e.price,condition:e.condition,message:e.message,triggered:e.triggered})}),this.signalMarkerManager=new t.SignalMarkerManager,this.signalMarkerManager.setRequestRender(()=>this.engine.requestRender(e.LayerType.Overlay)),this.signalMarkerManager.setDataGetter(()=>this.dataManager.getData()),this.signalMarkerManager.on(`added`,e=>{this.eventBus.emit(`signalMarkerAdd`,{id:e.id,source:e.source,direction:e.direction})}),this.signalMarkerManager.on(`removed`,e=>{this.eventBus.emit(`signalMarkerRemove`,{id:e})}),this.tradeZoneManager=new t.TradeZoneManager,this.tradeZoneManager.setRequestRender(()=>this.engine.requestRender(e.LayerType.Overlay)),this.tradeZoneManager.setDataGetter(()=>this.dataManager.getData()),this.tradeZoneManager.on(`added`,e=>{this.eventBus.emit(`tradeZoneAdd`,{id:e.id,direction:e.direction})}),this.tradeZoneManager.on(`removed`,e=>{this.eventBus.emit(`tradeZoneRemove`,{id:e})}),this.replayManager=new t.ReplayManager,this.measureOverlay=new t.MeasureOverlay,this.interactionManager=new t.InteractionManager(n),this.features.panning){let e=0;this.interactionManager.setPanHandler(new t.PanHandler((t,n)=>{t&&this.viewport.scrollBy(t),n&&(e+=n,(this.options.autoScale===!1||Math.abs(e)>F)&&(this.options.autoScale=!1,this.viewport.panPriceRange(n))),this.updateViewportAndRender()},()=>{e=0}))}if(this.features.zooming){this.interactionManager.setZoomHandler(new t.ZoomHandler((e,t)=>{this.viewport.zoom(e,t),this.updateViewportAndRender()}));let e=new t.AxisDragHandler(e=>{this.options.autoScale=!1,this.viewport.scalePriceRange(e),this.syncRenderContext(),this.engine.requestRender(),this.emitViewportEvents()},e=>{let t=this.viewport.getState().chartRect.width;this.viewport.zoom(1/e-1,t/2),this.updateViewportAndRender()});this.interactionManager.setAxisDragHandler(e,()=>this.viewport.getState(),e=>{e===`price`?(this.options.autoScale=!0,this.updateViewportAndRender()):this.fitContent()})}if(this.features.crosshair&&this.interactionManager.setCrosshairHandler(this.crosshairHandler),this.features.drawings&&this.interactionManager.setDrawingManager(this.drawingManager,()=>({...this.viewport.getState(),data:this.getDisplayData()})),this.features.trading&&this.interactionManager.setTradingManager(this.tradingManager,()=>({...this.viewport.getState(),data:this.getDisplayData()})),this.features.alerts){let e=new t.AlertDragHandler(this.alertManager,()=>this.viewport.getState());this.interactionManager.setAlertDragHandler(e)}let o=new t.PaneResizeHandler;o.configure(()=>this.getResolvedLayout(),(e,t)=>this.setPanelSize(e,t)),this.interactionManager.setPaneResizeHandler(o),this.interactionManager.setAltClickHandler(t=>{let n=this.getDisplayData();if(n.length===0)return;let r=this.viewport.getState(),i=r.barWidth+r.barSpacing,a=Math.round((r.offset+t.x)/i);a<0||a>=n.length||(this.pinnedTooltip.isPinned()&&this.pinnedTooltip.getPinnedIndex()===a?this.pinnedTooltip.unpin():this.pinnedTooltip.pin(n[a],a,this.themeManager.getTheme()),this.pinnedTooltip.reposition(this.viewport.getState(),this.dataManager.getData()[a]??null,a,this.themeManager.getTheme()),this.engine.requestRender(e.LayerType.Overlay))}),this.interactionManager.setClickHandler(e=>{let n=this.getDisplayData();if(this.eventBus.emit(`click`,{x:e.x,y:e.y}),n.length===0)return;let r=(0,t.xToBarIndex)(e.x,this.viewport.getState());r<0||r>=n.length||this.eventBus.emit(`barClick`,{bar:n[r],barIndex:r,point:e})}),this.interactionManager.setEscapeHandler(()=>{if(this.features.trading&&this.tradingManager.isBracketActive()){this.tradingManager.cancelBracket(),this.eventBus.emit(`dataUpdate`,{bracket:`cancelled`});return}this.pinnedTooltip.isPinned()&&(this.pinnedTooltip.unpin(),this.engine.requestRender(e.LayerType.Overlay))}),this.interactionManager.setConfirmHandler(()=>this.features.trading&&this.tradingManager.isBracketActive()?(this.tradingManager.confirmBracket(),!0):!1),this.interactionManager.setMeasureHandlers({begin:e=>{this.measureOverlay.begin(e,this.viewport.getState(),this.getDisplayData())},move:e=>{this.measureOverlay.update(e,this.viewport.getState(),this.getDisplayData())},end:()=>{this.measureOverlay.end()}}),this.interactionManager.setOverlayDirtyCallback(()=>{this.engine.requestRender(e.LayerType.Overlay),this.engine.requestRender(e.LayerType.UI)}),this.interactionManager.attach(),this.syncRenderContext(),this.engine.start()}setData(e){this.dataManager.setData(e),this.crosshairHandler.setData(this.dataManager.getData()),this.displayDataCache=null,this.sessionBreaks.invalidateCache(),this.options.autoScale=this.defaultAutoScale,this.alertManager.clearLastValues(),this.indicatorEngine.recalculateAll(this.dataManager.getData()),e.length>0&&this.currentPriceLine.setPrice(e[e.length-1].close),this.updateViewportAndRender(!0),this.eventBus.emit(`dataUpdate`,{length:e.length})}appendBar(e){let t=this.autoScrollOnNewBar&&this.viewport.isAtEnd();this.dataManager.appendBar(e);let n=this.dataManager.getData();this.crosshairHandler.setData(n),this.displayDataCache=null,this.indicatorEngine.recalculateFrom(n,n.length-2),this.updateViewportAndRender(t)}appendBars(e){if(e.length===0)return;let t=this.viewport.isAtEnd(),n=this.dataManager.getLength()-1;for(let t of e)this.dataManager.appendBar(t);this.displayDataCache=null,this.indicatorEngine.recalculateFrom(this.dataManager.getData(),n),this.crosshairHandler.setData(this.dataManager.getData()),this.updateViewportAndRender(t)}updateLastBar(e){this.dataManager.updateLastBar(e),this.currentPriceLine.setPrice(e.close),this.options.chartType!==`candlestick`&&this.options.chartType!==`line`&&this.options.chartType!==`area`&&this.options.chartType!==`bar`&&this.options.chartType!==`hollowCandle`&&(this.displayDataCache=null);let t=this.dataManager.getData();this.indicatorEngine.recalculateFrom(t,t.length-1),this.scheduleRender()}updateLastBarFromTick(e){this.dataManager.updateLastBarFromTick(e),this.currentPriceLine.setPrice(e.price),this.options.chartType!==`candlestick`&&this.options.chartType!==`line`&&this.options.chartType!==`area`&&this.options.chartType!==`bar`&&this.options.chartType!==`hollowCandle`&&(this.displayDataCache=null);let t=this.dataManager.getData();this.indicatorEngine.recalculateFrom(t,t.length-1),this.scheduleRender()}setChartType(e){this.options.chartType=e,this.chartRenderer=this.createChartRenderer(e),this.chartLegend.setChartType(e),this.displayDataCache=null,this.updateViewportAndRender(!0)}addIndicator(e,t={},n=`bottom`){if(!this.features.indicators||this.features.indicatorIds.length>0&&!this.features.indicatorIds.includes(e))return null;let r=this.indicatorEngine.addIndicator(e,t,this.dataManager.getData());return this.indicatorEngine.getAvailableIndicators().find(t=>t.id===e)?.placement===`panel`?(this.layoutManager.addPanel(r,n),this.updateViewportAndRender()):this.engine.requestRender(),this.eventBus.emit(`indicatorAdd`,{instanceId:r,id:e}),r}updateIndicator(e,t){this.indicatorEngine.updateIndicator(e,t,this.dataManager.getData()),this.engine.requestRender()}removeIndicator(e){let t=this.layoutManager.getPanels().some(t=>t.id===e);this.indicatorEngine.removeIndicator(e),this.layoutManager.removePanel(e),this.eventBus.emit(`indicatorRemove`,{instanceId:e}),t?this.updateViewportAndRender():this.engine.requestRender()}getIndicatorOutput(e){return this.indicatorEngine.getOutput(e)}registerIndicator(e){this.pluginManager.registerIndicator(e)}get plugins(){return this.pluginManager}static indicators(){let e=new t.IndicatorEngine;return(0,t.registerBuiltInIndicators)(e),e.getAvailableIndicators()}setPanelPosition(e,t){this.layoutManager.setPanelPosition(e,t),this.engine.requestRender()}setPanelSize(e,t){this.layoutManager.setPanelSize(e,t),this.updateViewportAndRender()}setDrawingTool(e){this.features.drawings&&(e&&this.features.drawingTools.length>0&&!this.features.drawingTools.includes(e)||this.drawingManager.setActiveTool(e))}getDrawingTool(){return this.drawingManager.getActiveTool()}setDrawingStyle(e){this.drawingManager.setStyle(e)}getDrawingStyle(){return this.drawingManager.getActiveStyle()}getSelectedDrawingId(){return this.drawingManager.getSelectedDrawingId()}setSelectedDrawingStyle(e,t){return this.drawingManager.setSelectedDrawingStyle(e,t)}getDrawings(){return this.drawingManager.getDrawings()}setDrawings(e){this.drawingManager.setDrawings(e)}addDrawing(e){if(!this.features.drawings)return null;let t=this.drawingManager.addDrawing(e);return this.scheduleAutoSave(),t}autoFib(){if(!this.features.drawings)return null;let e=this.getDisplayData(),n=this.viewport.getState(),r=(0,t.findDominantSwing)(e,n.visibleRange.from,n.visibleRange.to);return r?this.addDrawing({type:`fibRetracement`,anchors:[r[0],r[1]]}):null}removeDrawing(e){this.drawingManager.removeDrawing(e)}setDrawingVisible(e,t){this.drawingManager.setDrawingVisible(e,t)}setDrawingLocked(e,t){this.drawingManager.setDrawingLocked(e,t)}clearDrawings(){this.drawingManager.clearDrawings()}registerDrawingTool(e){this.drawingManager.register(e)}undo(){return this.features.drawingUndoRedo?this.drawingManager.undo():!1}redo(){return this.features.drawingUndoRedo?this.drawingManager.redo():!1}getUndoRedoState(){return this.undoRedoManager.getState()}setDrawingMagnet(e){this.drawingManager.setMagnetMode(e?`magnet`:`none`)}getDrawingMagnet(){return this.drawingManager.getMagnetMode()===`magnet`}lockAllDrawings(){this.drawingManager.lockAllDrawings()}unlockAllDrawings(){this.drawingManager.unlockAllDrawings()}hideAllDrawings(){this.drawingManager.hideAllDrawings()}showAllDrawings(){this.drawingManager.showAllDrawings()}duplicateDrawing(e){let t=e??this.drawingManager.getSelectedDrawingId();return t?this.drawingManager.duplicateDrawing(t):null}exportVisibleData(e=`csv`,n){let r=this.viewport.getState(),i=this.dataManager.getData(),a=Math.max(0,r.visibleRange.from),o=Math.min(i.length-1,r.visibleRange.to),s=i.slice(a,o+1);if(e===`json`){let e=t.DataExporter.toJSON(s);t.DataExporter.download(e,n??`chart-data.json`,`application/json`)}else{let e=t.DataExporter.toCSV(s);t.DataExporter.download(e,n??`chart-data.csv`,`text/csv`)}}exportAllData(e=`csv`,n){let r=this.dataManager.getData();if(e===`json`){let e=t.DataExporter.toJSON(r);t.DataExporter.download(e,n??`chart-data.json`,`application/json`)}else{let e=t.DataExporter.toCSV(r);t.DataExporter.download(e,n??`chart-data.csv`,`text/csv`)}}setAutoSave(e,t=5e3){this.autoSaveScheduler.enable(e,t)}disableAutoSave(){this.autoSaveScheduler.disable()}scheduleAutoSave(){this.autoSaveScheduler.schedule()}getAvailableIndicators(){return this.indicatorEngine.getAvailableIndicators()}getIndicatorInputs(e){let t=this.indicatorEngine.getAvailableIndicators().find(t=>t.id===e);return t?{id:t.id,params:t.defaultConfig}:null}getActiveIndicators(){return this.indicatorEngine.getActiveIndicators()}setIndicatorVisible(e,t){this.indicatorEngine.setVisible(e,t)!==null&&this.updateViewportAndRender()}getIndicatorConfig(e){let t=this.indicatorEngine.getIndicatorConfig(e);return t?{id:t.id,params:{...t.params}}:null}updateIndicatorStyle(e,t){this.indicatorEngine.updateIndicatorStyle(e,t),this.engine.requestRender()}setOrders(e){this.features.trading&&this.tradingManager.setOrders(e)}startBracket(e,t){if(!this.features.trading)return!1;let n=this.dataManager.getData(),r=t??(n.length>0?n[n.length-1].close:null);return r===null?!1:(this.tradingManager.startBracket(e,r),!0)}cancelBracket(){this.features.trading&&this.tradingManager.cancelBracket()}confirmBracket(){return this.features.trading?this.tradingManager.confirmBracket():!1}isBracketActive(){return this.features.trading&&this.tradingManager.isBracketActive()}startOrderDraft(e,t){if(!this.features.trading)return!1;let n=this.dataManager.getData(),r=t??(n.length>0?n[n.length-1].close:null);return r===null?!1:(this.tradingManager.startOrderDraft(e,r),!0)}cancelOrderDraft(){this.features.trading&&this.tradingManager.cancelOrderDraft()}confirmOrderDraft(){return this.features.trading?this.tradingManager.confirmOrderDraft():!1}isOrderDraftActive(){return this.features.trading&&this.tradingManager.isOrderDraftActive()}placeOrderIntent(e){this.features.trading&&this.eventBus.emit(`orderPlace`,e)}setPositions(e){this.features.trading&&this.tradingManager.setPositions(e)}setDepthData(e){this.features.trading&&this.tradingManager.setDepthData(e)}setCurrentPrice(e,t){this.tradingManager.setCurrentPrice(e),this.currentPriceLine.setPrice(e),this.scheduleRender(),this.features.alerts&&(this.alertManager.checkPrice(e),this.feedIndicatorAlerts())}feedIndicatorAlerts(){let e=this.alertManager.getAlerts(),t=this.dataManager.getData();if(t.length===0)return;let n=t.length-1,r=new Set;for(let t of e){if(t.channel===`price`||r.has(t.channel))continue;r.add(t.channel);let e=t.channel.indexOf(`:`);if(e<0)continue;let i=t.channel.slice(0,e),a=t.channel.slice(e+1),o=this.indicatorEngine.getOutput(i)?.series?.[n]?.[a];typeof o==`number`&&Number.isFinite(o)&&this.alertManager.checkChannel(t.channel,o)}}setTradingConfig(e){this.features.trading&&this.tradingManager.setConfig(e)}async connect(n){this.disconnectStream(),this.streamManager=new t.StreamManager,this.streamManager.on(`snapshot`,e=>{this.setData(e)}),this.streamManager.on(`barClose`,e=>{let t=this.autoScrollOnNewBar&&this.viewport.isAtEnd();this.dataManager.appendBar(e);let n=this.dataManager.getData();this.crosshairHandler.setData(n),this.displayDataCache=null,this.indicatorEngine.recalculateFrom(n,n.length-2),this.updateViewportAndRender(t)}),this.streamManager.on(`barUpdate`,e=>{this.dataManager.updateLastBar(e),this.currentPriceLine.setPrice(e.close);let t=this.dataManager.getData();this.indicatorEngine.recalculateFrom(t,t.length-1),this.scheduleRender()}),this.streamManager.on(`priceChange`,({price:t,previousClose:n})=>{this.tradingManager.setCurrentPrice(t),this.currentPriceLine.setPrice(t,n??void 0),this.engine.requestRender(e.LayerType.Overlay),this.engine.requestRender(e.LayerType.UI)}),this.streamManager.on(`connectionChange`,e=>{this.eventBus.emit(`dataUpdate`,{connection:e})}),this.streamManager.on(`error`,e=>{this.eventBus.emit(`dataUpdate`,{error:e.message})}),this.autoScrollOnNewBar=n.autoScroll!==!1,this.currentSymbol=n.symbol;let r=this.streamManager;if(await r.connect(n),this.streamManager!==r)return;let i=(0,e.timeframeToMs)(n.timeframe);this.barCountdown.setTimeframeMs(i),this.countdownInterval&&clearInterval(this.countdownInterval),this.countdownInterval=setInterval(()=>{this.barCountdown.isVisible()&&this.engine.requestRender(e.LayerType.UI)},1e3)}async switchStream(t,n){this.streamManager&&(this.currentSymbol=t,this.barCountdown.setTimeframeMs((0,e.timeframeToMs)(n)),await this.streamManager.switchTo(t,n))}async setTimeframe(e){if(!this.streamManager)throw Error(`No active stream. Call connect() first.`);await this.switchStream(this.currentSymbol,e)}disconnectStream(){this.streamManager&&=(this.streamManager.dispose(),null)}connectExecution(e,t={}){if(!this.features.trading)throw Error(`connectExecution requires features.trading to be enabled`);this.disconnectExecution(),this.executionAdapter=e,this.execTeardown=P(e,{onIntent:(e,t)=>{let n=e=>t(e.payload);return this.eventBus.on(e,n),()=>this.eventBus.off(e,n)},setOrders:e=>this.setOrders(e),setPositions:e=>this.setPositions(e),onError:e=>this.eventBus.emit(`executionError`,e)}),Promise.resolve(e.connect(t)).catch(e=>this.eventBus.emit(`executionError`,{message:`Execution connect failed`,cause:e}))}disconnectExecution(){this.execTeardown&&=(this.execTeardown(),null),this.executionAdapter&&=(this.executionAdapter.disconnect(),null)}getExecutionAdapter(){return this.executionAdapter}setBarCountdownVisible(t){this.barCountdown.setVisible(t),this.engine.requestRender(e.LayerType.UI)}setSessionBreaksVisible(t){this.sessionBreaks.setVisible(t),this.engine.requestRender(e.LayerType.Background)}addCompareSymbol(t,n,r,i){this.compareRenderer.addSymbol({id:t,label:n,data:r,color:i,visible:!0}),this.engine.requestRender(e.LayerType.Main)}removeCompareSymbol(t){this.compareRenderer.removeSymbol(t),this.engine.requestRender(e.LayerType.Main)}updateCompareData(t,n){this.compareRenderer.setSymbolData(t,n),this.engine.requestRender(e.LayerType.Main)}setCompareMode(t){this.compareRenderer.setMode(t),this.engine.requestRender(e.LayerType.Main)}clearCompareSymbols(){this.compareRenderer.clear(),this.engine.requestRender(e.LayerType.Main)}setLogScale(e){this.viewport.setLogScale(e),this.updateViewportAndRender()}isLogScale(){return this.viewport.isLogScale()}setScaleMode(e){this.viewport.setScaleMode(e),this.updateViewportAndRender()}getScaleMode(){return this.viewport.getScaleMode()}setSessionBreaksConfig(t){this.sessionBreaks.setConfig(t),this.engine.requestRender(e.LayerType.Background)}getConnectionState(){return this.streamManager?.getConnectionState()??`disconnected`}getConnectionInfo(){return this.streamManager?.getConnectionInfo()??{state:`disconnected`}}setAutoScroll(e){this.autoScrollOnNewBar=e}scrollTo(e){let t=this.dataManager.getData();for(let n=0;n<t.length;n++)if(t[n].time>=e){let e=this.viewport.getState().barWidth+this.viewport.getState().barSpacing;this.viewport.scrollBy(n*e-this.viewport.getState().offset),this.updateViewportAndRender();return}}scrollToEnd(){this.viewport.scrollToEnd(),this.updateViewportAndRender()}setVisibleRange(e,t){let n=this.dataManager.getData(),r=0,i=n.length-1;for(let t=0;t<n.length;t++)if(n[t].time>=e){r=t;break}for(let e=n.length-1;e>=0;e--)if(n[e].time<=t){i=e;break}let a=i-r+1;if(a>0){let e=this.viewport.getState().chartRect.width,t=e/a,n=Math.max(2,t-this.viewport.getState().barSpacing);this.viewport.zoom((n-this.viewport.getState().barWidth)/this.viewport.getState().barWidth,e/2)}this.updateViewportAndRender()}zoomIn(){let e=this.viewport.getState().chartRect.width;this.viewport.zoom(.2,e/2),this.updateViewportAndRender()}zoomOut(){let e=this.viewport.getState().chartRect.width;this.viewport.zoom(-.2,e/2),this.updateViewportAndRender()}fitContent(){let e=this.dataManager.getData();e.length!==0&&this.setVisibleRange(e[0].time,e[e.length-1].time)}on(e,t){this.eventBus.on(e,t)}off(e,t){this.eventBus.off(e,t)}enableTauriBridge(e){this.eventBus.enableTauriBridge({enabled:!0,...e})}disableTauriBridge(){this.eventBus.disableTauriBridge()}setTheme(e){this.themeManager.setTheme(e),this.syncRenderContext(),this.container.style.backgroundColor=this.themeManager.getTheme().background,this.engine.requestRender(),this.eventBus.emit(`themeChange`,{theme:e})}getTheme(){return this.themeManager.getTheme()}setWatermark(t,n){this.watermark.setConfig({text:t,...n}),this.engine.requestRender(e.LayerType.Background)}setAutoScale(e){this.options.autoScale=e,this.defaultAutoScale=e,this.updateViewportAndRender()}isAutoScale(){return this.options.autoScale!==!1}setCrosshairMode(t){this.crosshairHandler.setMode(t),this.engine.requestRender(e.LayerType.Overlay)}getCrosshairMode(){return this.crosshairHandler.getMode()}setCrosshairPosition(t){t&&this.crosshairHandler.onPointerMove(t),this.engine.requestRender(e.LayerType.Overlay)}getData(){return this.dataManager.getData()}setGridVisible(t){this.gridRenderer.setVisible(t),this.engine.requestRender(e.LayerType.Background)}isGridVisible(){return this.gridRenderer.isVisible()}setVolumeVisible(t){this.volumeRenderer.setVisible(t),this.engine.requestRender(e.LayerType.Main)}setVolumeProfileVisible(t){this.volumeProfile.setVisible(t),this.engine.requestRender(e.LayerType.Main)}isVolumeProfileVisible(){return this.volumeProfile.isVisible()}setVolumeProfileConfig(t){t.buckets!==void 0&&this.volumeProfile.setBuckets(t.buckets),t.widthRatio!==void 0&&this.volumeProfile.setWidthRatio(t.widthRatio),t.opacity!==void 0&&this.volumeProfile.setOpacity(t.opacity),t.highlightPoC!==void 0&&this.volumeProfile.setHighlightPoC(t.highlightPoC),this.engine.requestRender(e.LayerType.Main)}setMarketProfileVisible(t){this.marketProfile.setVisible(t),this.engine.requestRender(e.LayerType.Main)}isMarketProfileVisible(){return this.marketProfile.isVisible()}setMarketProfileConfig(t){t.buckets!==void 0&&this.marketProfile.setBuckets(t.buckets),t.widthRatio!==void 0&&this.marketProfile.setWidthRatio(t.widthRatio),t.opacity!==void 0&&this.marketProfile.setOpacity(t.opacity),t.valueAreaPct!==void 0&&this.marketProfile.setValueAreaPct(t.valueAreaPct),t.highlightPoC!==void 0&&this.marketProfile.setHighlightPoC(t.highlightPoC),t.showStats!==void 0&&this.marketProfile.setShowStats(t.showStats),t.splitBySession!==void 0&&this.marketProfile.setSplitBySession(t.splitBySession),t.letters!==void 0&&this.marketProfile.setLetters(t.letters),this.engine.requestRender(e.LayerType.Main)}getMarketProfileStats(){return this.marketProfile.getStats()}setDepthHeatmapVisible(t){this.depthHeatmap.setVisible(t),this.engine.requestRender(e.LayerType.Main)}isDepthHeatmapVisible(){return this.depthHeatmap.isVisible()}setDepthHeatmapConfig(t){t.opacity!==void 0&&this.depthHeatmap.setOpacity(t.opacity),t.capacity!==void 0&&this.depthHeatmap.setCapacity(t.capacity),this.engine.requestRender(e.LayerType.Main)}pushDepthSnapshot(t){let n=this.dataManager.getData();n.length!==0&&(this.depthHeatmap.push(n[n.length-1].time,t),this.depthHeatmap.isVisible()&&this.engine.requestRender(e.LayerType.Main))}clearDepthHeatmap(){this.depthHeatmap.clear(),this.engine.requestRender(e.LayerType.Main)}setPeriodLevelsVisible(t){this.periodLevels.setVisible(t),this.engine.requestRender(e.LayerType.Main)}isPeriodLevelsVisible(){return this.periodLevels.isVisible()}setPeriodLevelsPeriod(t){this.periodLevels.setPeriod(t),this.engine.requestRender(e.LayerType.Main)}setTimezoneOffset(t){this.timeAxis.setTimezoneOffset(t),this.crosshairHandler.setTimezoneOffset(t),this.engine.requestRender(e.LayerType.UI),this.engine.requestRender(e.LayerType.Overlay)}setPivotMarkersVisible(t){this.pivotMarkers.setVisible(t),this.engine.requestRender(e.LayerType.Overlay)}isPivotMarkersVisible(){return this.pivotMarkers.isVisible()}setPivotMarkersConfig(t){(t.left!==void 0||t.right!==void 0)&&this.pivotMarkers.setStrength(t.left??5,t.right??t.left??5),t.showLabels!==void 0&&this.pivotMarkers.setShowLabels(t.showLabels),t.structureLabels!==void 0&&this.pivotMarkers.setStructureLabels(t.structureLabels),this.engine.requestRender(e.LayerType.Overlay)}setSessionShadingVisible(t){this.sessionShading.setVisible(t),this.engine.requestRender(e.LayerType.Background)}isSessionShadingVisible(){return this.sessionShading.isVisible()}setSessionShadingConfig(t){this.sessionShading.setConfig(t),this.engine.requestRender(e.LayerType.Background)}setTooltipVisible(e){e||this.crosshairTooltip.hide()}setLegend(t){this.chartLegend.setConfig(t),this.engine.requestRender(e.LayerType.UI)}setSymbolName(t){this.chartLegend.setSymbol(t),this.engine.requestRender(e.LayerType.UI)}setStatusText(t){this.chartLegend.setStatusText(t),this.engine.requestRender(e.LayerType.UI)}screenshot(e){this.features.screenshot&&t.Screenshot.download(this.container,e,this.themeManager.getTheme().background)}async copyScreenshot(){if(!this.features.screenshot)return!1;try{let e=await t.Screenshot.toBlob(this.container,this.themeManager.getTheme().background),n=globalThis.ClipboardItem;return!e||!navigator.clipboard?.write||!n?!1:(await navigator.clipboard.write([new n({"image/png":e})]),!0)}catch{return!1}}screenshotDataURL(){return this.features.screenshot?t.Screenshot.toDataURL(this.container,this.themeManager.getTheme().background):null}async screenshotBlob(){return this.features.screenshot?t.Screenshot.toBlob(this.container,this.themeManager.getTheme().background):null}addAlert(e,t=`crossing`,n,r=`price`,i){if(!this.features.alerts)return null;let a=this.alertManager.addAlert(e,t,n,!1,r,i);return this.scheduleAutoSave(),a}removeAlert(e){this.alertManager.removeAlert(e),this.scheduleAutoSave()}getAlerts(){return this.alertManager.getAlerts()}clearAlerts(){this.alertManager.clearAlerts(),this.scheduleAutoSave()}saveAlerts(e){this.alertManager.saveToStorage(e)}loadAlerts(t){this.alertManager.loadFromStorage(t),this.engine.requestRender(e.LayerType.Overlay)}addSignalMarker(e){return this.signalMarkerManager.addMarker(e)}removeSignalMarker(e){this.signalMarkerManager.removeMarker(e)}getSignalMarkers(){return this.signalMarkerManager.getMarkers()}setSignalMarkers(e){this.signalMarkerManager.setMarkers(e)}clearSignalMarkers(){this.signalMarkerManager.clearMarkers()}setSignalMarkerStyle(e){this.signalMarkerManager.setStyle(e)}addTradeZone(e){return this.tradeZoneManager.addZone(e)}updateTradeZone(e,t){this.tradeZoneManager.updateZone(e,t)}removeTradeZone(e){this.tradeZoneManager.removeZone(e)}getTradeZones(){return this.tradeZoneManager.getZones()}setTradeZones(e){this.tradeZoneManager.setZones(e)}clearTradeZones(){this.tradeZoneManager.clearZones()}setTradeZoneStyle(e){this.tradeZoneManager.setStyle(e)}replayStart(e){if(!this.features.replay)return;let t=this.dataManager.getData();this.replayManager.load(t);let n=-1;this.replayBarUnsub?.(),this.replayBarUnsub=this.replayManager.on(`bar`,({bar:e,index:r})=>{let i=r+1;if(n>0&&i>n&&this.dataManager.getLength()===n){for(let e=n;e<i;e++)this.dataManager.appendBar(t[e]);this.indicatorEngine.recalculateFrom(this.dataManager.getData(),n)}else this.dataManager.setData(t.slice(0,i)),this.indicatorEngine.recalculateAll(this.dataManager.getData());n=i,this.crosshairHandler.setData(this.dataManager.getData()),this.displayDataCache=null,this.updateViewportAndRender()}),this.replayManager.play(e)}replayPause(){this.replayManager.pause()}replayResume(){this.replayManager.resume()}replayStop(){this.replayManager.stop()}replaySeek(e){this.replayManager.seekTo(e)}setReplaySpeed(e){this.replayManager.setSpeed(e)}getReplayState(){return this.replayManager.getState()}getReplayProgress(){return this.replayManager.getProgress()}saveState(e){if(!this.features.saveLoad)return null;let n=t.ChartStateManager.capture({getDrawings:()=>this.getDrawings(),getTheme:()=>this.getTheme(),getAlerts:()=>this.getAlerts()},{chartType:this.options.chartType}),r=t.ChartStateManager.serialize(n);return e&&t.ChartStateManager.saveToStorage(e,n),r}loadState(e){if(!this.features.saveLoad)return;let n=t.ChartStateManager.deserialize(e);if(n.chartType&&this.setChartType(n.chartType),n.drawings&&this.setDrawings(n.drawings),n.theme&&this.setTheme(n.theme),n.alerts){this.clearAlerts();for(let e of n.alerts)this.addAlert(e.price,e.condition,e.message)}}loadStateFromStorage(e){if(!this.features.saveLoad)return!1;let n=t.ChartStateManager.loadFromStorage(e);return n?(this.loadState(t.ChartStateManager.serialize(n)),!0):!1}downloadState(e){if(!this.features.saveLoad)return;let n=t.ChartStateManager.capture({getDrawings:()=>this.getDrawings(),getTheme:()=>this.getTheme(),getAlerts:()=>this.getAlerts()},{chartType:this.options.chartType});t.ChartStateManager.downloadFile(n,e)}async loadStateFromFile(){if(!this.features.saveLoad)return;let e=await t.ChartStateManager.loadFromFile();this.loadState(t.ChartStateManager.serialize(e))}setLocale(t){(0,e.setLocale)(t),this.engine.requestRender()}setNumberLocale(e){this.numberLocale=e,this.priceAxis.setLocale(e),this.crosshairHandler.setLocale(e),this.chartLegend.setLocale(e),this.sessionBreaks.setLocale(e),this.currentPriceLine.setLocale(e),this.updateViewportAndRender()}getNumberLocale(){return this.numberLocale}setMarket(e){if(this.marketConfig=e,e.colorScheme){let t={...this.themeManager.getTheme(),candleUp:e.colorScheme.up,candleDown:e.colorScheme.down,candleUpWick:e.colorScheme.up,candleDownWick:e.colorScheme.down,volumeUp:e.colorScheme.up.replace(`)`,`, 0.3)`).replace(`rgb(`,`rgba(`)||`${e.colorScheme.up}4D`,volumeDown:e.colorScheme.down.replace(`)`,`, 0.3)`).replace(`rgb(`,`rgba(`)||`${e.colorScheme.down}4D`};this.themeManager.setTheme(t)}e.pricePrecision!==void 0&&(this.tradingManager.setConfig({pricePrecision:e.pricePrecision}),this.alertManager.setPricePrecision(e.pricePrecision),this.streamManager?.priceLine.setPricePrecision(e.pricePrecision),this.currentPriceLine.setPricePrecision(e.pricePrecision),this.crosshairHandler.setPricePrecision(e.pricePrecision),this.chartLegend.setPricePrecision(e.pricePrecision)),this.updateViewportAndRender()}getMarket(){return this.marketConfig}setPriceLimits(t){this.marketConfig&&((0,e.computePriceLimits)(t,this.marketConfig)&&(this.marketConfig.priceLimits={...this.marketConfig.priceLimits,referencePrice:t}),this.engine.requestRender())}getFeatures(){return this.features}setFeatures(t){Object.assign(this.features,t),(t.crosshair===!1||t.crosshairTooltip===!1)&&this.crosshairTooltip.hide(),t.grid!==void 0&&this.engine.requestRender(e.LayerType.Background),t.volume!==void 0&&(this.volumeRenderer.setVisible(t.volume),this.engine.requestRender(e.LayerType.Main)),t.drawings===!1&&this.drawingManager.setActiveTool(null),t.trading===!1&&(this.tradingManager.setOrders([]),this.tradingManager.setPositions([])),t.keyboard!==void 0&&this.keyboardHandler?.setEnabled(t.keyboard),this.engine.requestRender()}resize(){let e=this.engine.dprManager.readContainerSize();if(e.width<=0||e.height<=0)return;this.containerSizeCache=e,this.containerSizeCacheTime=Date.now();let t=this.engine.dprManager.getDpr();this.engine.layerManager.resize(e,t);let n=this.viewport.isAtEnd();this.viewport.resize(e.width,e.height),this.layoutManager.resize(e.width,e.height),this.updateViewportAndRender(n),this.eventBus.emit(`resize`,e)}destroy(){this.countdownInterval&&clearInterval(this.countdownInterval),this.disableAutoSave(),this.disconnectStream(),this.disconnectExecution(),this.onWindowKeyDown&&=(window.removeEventListener(`keydown`,this.onWindowKeyDown),null),this.keyboardHandler=null,this.interactionManager.detach(),this.tradingManager.destroy(),this.animator.dispose(),this.crosshairTooltip.destroy(),this.pinnedTooltip.destroy(),this.replayManager.dispose(),this.undoRedoManager.clear(),this.engine.destroy(),this.eventBus.destroy(),this.container.innerHTML=``}createChartRenderer(e){return a(e,e=>this.pluginManager.getChartType(e))}getDisplayData(){if(this.displayDataCache)return this.displayDataCache;let e=this.dataManager.getData();if(e.length===0)return e;let t=o(this.options.chartType,e,e=>this.pluginManager.getChartType(e));return this.displayDataCache=t,t}scheduleRender(){this.renderScheduled||(this.renderScheduled=!0,requestAnimationFrame(()=>{this.renderScheduled=!1,this.applyDataToViewport(),this.fitPriceAxisWidth()&&this.applyDataToViewport(),this.syncRenderContext(),this.engine.requestRender(),this.emitViewportEvents()}))}applyDataToViewport(e=!1){let t=this.getDisplayData(),n=this.options.autoScale!==!1;this.viewport.updateData(t,n&&!e),e&&(this.viewport.scrollToEnd(),n&&this.viewport.updateData(t,!0));let r=this.viewport.getState();if(t.length>0){let e=Math.max(0,Math.min(r.visibleRange.from,t.length-1));this.viewport.setScaleBaseline(t[e]?.close)}if(n){let e=this.indicatorEngine.getOverlayPriceRange(r.visibleRange.from,Math.min(r.visibleRange.to,t.length-1));if(e){let t=r.priceRange,n=Math.min(t.min,e.min),i=Math.max(t.max,e.max);if(n<t.min||i>t.max){let e=i-n||1;this.viewport.setPriceRange(n-e*.02,i+e*.02)}}}return t}updateViewportAndRender(e=!1){this.resolvedLayoutCache=null,this.panelInfoCache=null;let t=this.getResolvedLayout();this.viewport.setChartRect(t.mainChartRect),this.applyDataToViewport(e),this.fitPriceAxisWidth()&&this.applyDataToViewport(e),this.syncRenderContext(),this.engine.requestRender(),this.emitViewportEvents()}fitPriceAxisWidth(){if(!this.features.priceAxis)return!1;let{priceRange:e}=this.viewport.getState(),t=this.themeManager.getTheme(),n=S({min:e.min,max:e.max,lastPrice:this.currentPriceLine.getPrice(),tagPrecision:this.marketConfig?.pricePrecision??null,locale:this.numberLocale,fontFamily:t.font.family,fontSizeSmall:t.font.sizeSmall,measure:(e,t)=>this.measureText(e,t)}),r=C(this.priceAxisWidth,n);return r===this.priceAxisWidth?!1:(this.priceAxisWidth=r,this.layoutManager.setPriceAxisWidth(r),this.viewport.setPriceAxisWidth(r),this.resolvedLayoutCache=null,this.panelInfoCache=null,this.viewport.setChartRect(this.getResolvedLayout().mainChartRect),!0)}measureText(e,t){this.measureCtx===void 0&&(this.measureCtx=typeof document<`u`?document.createElement(`canvas`).getContext(`2d`):null);let n=this.measureCtx;return n?(n.font=t,n.measureText(e).width):e.length*7}emitViewportEvents(){let e=this.viewport.getState(),t=Math.max(0,Math.floor(e.visibleRange.from)),n=Math.max(t,Math.ceil(e.visibleRange.to));(!this.lastEmittedRange||this.lastEmittedRange.from!==t||this.lastEmittedRange.to!==n)&&(this.lastEmittedRange={from:t,to:n},this.eventBus.emit(`visibleRangeChange`,{from:t,to:n}));let{min:r,max:i}=e.priceRange;(!this.lastEmittedPriceRange||this.lastEmittedPriceRange.min!==r||this.lastEmittedPriceRange.max!==i)&&(this.lastEmittedPriceRange={min:r,max:i},this.eventBus.emit(`priceRangeChange`,{min:r,max:i})),this.lastEmittedBarWidth!==e.barWidth&&(this.lastEmittedBarWidth=e.barWidth,this.eventBus.emit(`zoomChange`,{barWidth:e.barWidth}))}getResolvedLayout(){return this.resolvedLayoutCache||=this.layoutManager.resolve(),this.resolvedLayoutCache}cachedContainerSize(){let e=Date.now();return(!this.containerSizeCache||e-this.containerSizeCacheTime>500)&&(this.containerSizeCache=this.engine.dprManager.getContainerSize(),this.containerSizeCacheTime=e),this.containerSizeCache}buildPanelRenderInfos(){if(this.panelInfoCache)return this.panelInfoCache;let e=this.getResolvedLayout(),t=this.viewport.getState(),{from:n,to:r}=t.visibleRange,i=e.panels.map(e=>{let i=l(this.indicatorEngine.getOutput(e.config.id),n,r),a={x:e.rect.x,y:e.rect.y+20,width:e.rect.width,height:Math.max(0,e.rect.height-20)};return{instanceId:e.config.id,rect:e.rect,viewport:{...t,chartRect:a,priceRange:i}}});return this.panelInfoCache=i,i}syncRenderContext(){this.pinnedTooltip.isPinned()&&this.pinnedTooltip.reposition(this.viewport.getState(),null,null,this.themeManager.getTheme());let e=this.getResolvedLayout(),t=this.features.indicators?this.buildPanelRenderInfos():[],n=e.panels.filter(e=>e.config.position===`bottom`).reduce((e,t)=>e+t.rect.height,0),r=e.mainChartRect.y+e.mainChartRect.height+n,i=this.getDisplayData();this.engine.setRenderContext({chartRenderer:this.chartRenderer,gridRenderer:this.features.grid?this.gridRenderer:null,priceAxis:this.features.priceAxis?this.priceAxis:null,timeAxis:this.features.timeAxis?this.timeAxis:null,crosshairHandler:this.features.crosshair?this.crosshairHandler:null,indicatorEngine:this.features.indicators?this.indicatorEngine:null,drawingRenderer:this.features.drawings?this.drawingRenderer:null,tradingRenderer:this.features.trading?this.tradingRenderer:null,currentPriceLine:this.currentPriceLine,chartLegend:this.features.legend?this.chartLegend:null,volumeRenderer:this.features.volume?this.volumeRenderer:null,volumeProfile:this.volumeProfile,marketProfile:this.marketProfile,depthHeatmap:this.depthHeatmap,periodLevels:this.periodLevels,pivotMarkers:this.pivotMarkers,watermark:this.features.watermark?this.watermark:null,barCountdown:this.barCountdown,sessionBreaks:this.sessionBreaks,sessionShading:this.sessionShading,compareRenderer:this.compareRenderer,alertManager:this.features.alerts?this.alertManager:null,measureOverlay:this.measureOverlay,signalMarkerManager:this.signalMarkerManager,tradeZoneManager:this.tradeZoneManager,panels:t,priceLimits:this.buildPriceLimits(),timeAxisY:r,viewport:{...this.viewport.getState(),data:i},theme:this.themeManager.getTheme(),data:i,numberLocale:this.numberLocale,renderOverlayPlugins:(e,t)=>this.drawOverlayPlugins(e,t)})}drawOverlayPlugins(e,t){let n=T(this.pluginManager.getOverlays(),t);if(n.length===0)return;let r={viewport:this.viewport.getState(),data:this.getDisplayData(),theme:this.themeManager.getTheme()};for(let t of n)t.render(e,r)}buildPriceLimits(){if(!this.marketConfig?.priceLimits?.enabled||!this.marketConfig.priceLimits.referencePrice)return null;let t=(0,e.computePriceLimits)(this.marketConfig.priceLimits.referencePrice,this.marketConfig);return t?{...t,colors:this.marketConfig.colorScheme?{ceiling:this.marketConfig.colorScheme.ceiling,floor:this.marketConfig.colorScheme.floor,reference:this.marketConfig.colorScheme.reference}:void 0}:null}},I=[`time`,`timestamp`,`date`,`datetime`,`t`],L=[`open`,`o`],R=[`high`,`h`],z=[`low`,`l`],B=[`close`,`c`],V=[`volume`,`vol`,`v`];function H(e){let t=e.trim();return t?t[0]===`[`||t[0]===`{`?U(t):W(t):{data:[],rowCount:0,skipped:0}}function U(e){let t;try{t=JSON.parse(e)}catch(e){throw Error(`Invalid JSON: ${e.message}`)}if(!Array.isArray(t))throw Error(`Expected a JSON array of OHLCV rows`);let n=[],r=0;for(let e of t){let t=Array.isArray(e)?Y(e):J(e);t?n.push(t):r++}return Q(n,t.length,r)}function W(e){let t=e.split(/\r?\n/).filter(e=>e.trim().length>0);if(t.length===0)return{data:[],rowCount:0,skipped:0};let n=G(t[0]),r=K(t[0],n).map(e=>e.trim().toLowerCase()),i=r.some(e=>isNaN(Number(e))&&e.length>0),a=i?q(r):{time:0,open:1,high:2,low:3,close:4,volume:5};if(a.time<0||a.open<0||a.high<0||a.low<0||a.close<0)throw Error(`CSV is missing required column(s): time, open, high, low, close`);let o=[],s=0;for(let e=+!!i;e<t.length;e++){let r=K(t[e],n),i=Z(r[a.time]),c=X(r[a.open]),l=X(r[a.high]),u=X(r[a.low]),d=X(r[a.close]),f=a.volume>=0?Number(r[a.volume]):0;if(i===null||![c,l,u,d].every(Number.isFinite)){s++;continue}o.push({time:i,open:c,high:l,low:u,close:d,volume:Number.isFinite(f)?f:0})}return Q(o,t.length-+!!i,s)}function G(e){let t={",":0,";":0," ":0,"|":0};for(let n of e)n in t&&t[n]++;let n=`,`,r=0;for(let[e,i]of Object.entries(t))i>r&&(n=e,r=i);return n}function K(e,t){let n=[],r=``,i=!1;for(let a=0;a<e.length;a++){let o=e[a];o===`"`?i&&e[a+1]===`"`?(r+=`"`,a++):i=!i:o===t&&!i?(n.push(r),r=``):r+=o}return n.push(r),n}function q(e){let t=t=>e.findIndex(e=>t.includes(e));return{time:t(I),open:t(L),high:t(R),low:t(z),close:t(B),volume:t(V)}}function J(e){let t=t=>{for(let n of t){if(e[n]!==void 0)return e[n];let t=n.toUpperCase();if(e[t]!==void 0)return e[t]}},n=Z(String(t(I)??``)),r=Number(t(L)),i=Number(t(R)),a=Number(t(z)),o=Number(t(B)),s=Number(t(V)??0);return n===null||![r,i,a,o].every(Number.isFinite)?null:{time:n,open:r,high:i,low:a,close:o,volume:Number.isFinite(s)?s:0}}function Y(e){if(e.length<5)return null;let t=Z(String(e[0])),n=Number(e[1]),r=Number(e[2]),i=Number(e[3]),a=Number(e[4]),o=e.length>=6?Number(e[5]):0;return t===null||![n,r,i,a].every(Number.isFinite)?null:{time:t,open:n,high:r,low:i,close:a,volume:Number.isFinite(o)?o:0}}function X(e){return e===void 0||e.trim()===``?NaN:Number(e)}function Z(e){let t=e.trim();if(!t)return null;let n=Number(t);if(Number.isFinite(n)&&n>0)return n<0xe8d4a51000?n*1e3:n;let r=Date.parse(t);return Number.isFinite(r)?r:null}function Q(e,t,n){e.sort((e,t)=>e.time-t.time);let r=[];for(let t of e)r.length>0&&r[r.length-1].time===t.time?r[r.length-1]=t:r.push(t);return{data:r,rowCount:t,skipped:n}}var ne=class{host;overlay=null;callbacks;bound;depth=0;constructor(e,t){this.host=e,this.callbacks=t,this.bound={dragenter:e=>this.onDragEnter(e),dragover:e=>this.onDragOver(e),dragleave:e=>this.onDragLeave(e),drop:e=>this.onDrop(e)}}attach(){this.host.addEventListener(`dragenter`,this.bound.dragenter),this.host.addEventListener(`dragover`,this.bound.dragover),this.host.addEventListener(`dragleave`,this.bound.dragleave),this.host.addEventListener(`drop`,this.bound.drop)}detach(){this.host.removeEventListener(`dragenter`,this.bound.dragenter),this.host.removeEventListener(`dragover`,this.bound.dragover),this.host.removeEventListener(`dragleave`,this.bound.dragleave),this.host.removeEventListener(`drop`,this.bound.drop),this.hideOverlay()}onDragEnter(e){$(e)&&(e.preventDefault(),this.depth++,this.showOverlay())}onDragOver(e){$(e)&&(e.preventDefault(),e.dataTransfer&&(e.dataTransfer.dropEffect=`copy`))}onDragLeave(e){$(e)&&(this.depth=Math.max(0,this.depth-1),this.depth===0&&this.hideOverlay())}async onDrop(e){e.preventDefault(),this.depth=0,this.hideOverlay();let t=e.dataTransfer?.files?.[0];if(t)try{let e=H(await t.text());if(e.data.length===0)throw Error(`No valid OHLCV rows found in "${t.name}"`);this.callbacks.onData(e.data,e,t)}catch(e){this.callbacks.onError?.(e,t)}}showOverlay(){this.overlay||(this.overlay=document.createElement(`div`),Object.assign(this.overlay.style,{position:`absolute`,inset:`8px`,zIndex:`90`,pointerEvents:`none`,borderRadius:`10px`,border:`2px dashed var(--tcw-accent, #4f88ff)`,background:`rgba(79, 136, 255, 0.06)`,display:`flex`,alignItems:`center`,justifyContent:`center`,color:`var(--tcw-accent, #4f88ff)`,fontSize:`14px`,fontWeight:`600`,letterSpacing:`-0.005em`,fontFamily:`inherit`,backdropFilter:`blur(2px)`}),this.overlay.textContent=`Drop CSV or JSON to load chart data`,getComputedStyle(this.host).position===`static`&&(this.host.style.position=`relative`),this.host.appendChild(this.overlay))}hideOverlay(){this.overlay?.remove(),this.overlay=null}};function $(e){return e.dataTransfer?.types?.includes(`Files`)??!1}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return H}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return te}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return ne}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return T}});
2
+ //# sourceMappingURL=DragDropImporter-DZBrretS.cjs.map