@tradecanvas/chart 1.72.0 → 1.72.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/dist/{LayoutSession-r7Rgc5Sw.cjs → LayoutSession-BrXo314m.cjs} +2 -2
  2. package/dist/{LayoutSession-r7Rgc5Sw.cjs.map → LayoutSession-BrXo314m.cjs.map} +1 -1
  3. package/dist/{LayoutSession-DjHF7tmL.js → LayoutSession-BrazGVET.js} +2 -2
  4. package/dist/{LayoutSession-DjHF7tmL.js.map → LayoutSession-BrazGVET.js.map} +1 -1
  5. package/dist/WidgetCommandPalette-CeCLHPy1.js +177 -0
  6. package/dist/WidgetCommandPalette-CeCLHPy1.js.map +1 -0
  7. package/dist/WidgetCommandPalette-ZZNbWwCZ.cjs +2 -0
  8. package/dist/WidgetCommandPalette-ZZNbWwCZ.cjs.map +1 -0
  9. package/dist/{WidgetDrawingSettings-MSpeHFhV.js → WidgetDrawingSettings-BeW8fX7r.js} +5 -5
  10. package/dist/{WidgetDrawingSettings-MSpeHFhV.js.map → WidgetDrawingSettings-BeW8fX7r.js.map} +1 -1
  11. package/dist/{WidgetDrawingSettings-B3KAH9Ag.cjs → WidgetDrawingSettings-Cyl2u_u8.cjs} +2 -2
  12. package/dist/{WidgetDrawingSettings-B3KAH9Ag.cjs.map → WidgetDrawingSettings-Cyl2u_u8.cjs.map} +1 -1
  13. package/dist/WidgetGoToDate-BNdngHlg.cjs +2 -0
  14. package/dist/{WidgetGoToDate-CPzfStIm.cjs.map → WidgetGoToDate-BNdngHlg.cjs.map} +1 -1
  15. package/dist/{WidgetGoToDate-R2teTLpJ.js → WidgetGoToDate-hcDtezRm.js} +6 -5
  16. package/dist/{WidgetGoToDate-R2teTLpJ.js.map → WidgetGoToDate-hcDtezRm.js.map} +1 -1
  17. package/dist/{WidgetHotkeySheet-BE0glkVA.js → WidgetHotkeySheet-1lRFSdvt.js} +3 -3
  18. package/dist/{WidgetHotkeySheet-BE0glkVA.js.map → WidgetHotkeySheet-1lRFSdvt.js.map} +1 -1
  19. package/dist/{WidgetHotkeySheet-pnsXreK6.cjs → WidgetHotkeySheet-y5LWKSG6.cjs} +2 -2
  20. package/dist/{WidgetHotkeySheet-pnsXreK6.cjs.map → WidgetHotkeySheet-y5LWKSG6.cjs.map} +1 -1
  21. package/dist/WidgetIndicatorPicker-CGvZ5kYd.js +245 -0
  22. package/dist/WidgetIndicatorPicker-CGvZ5kYd.js.map +1 -0
  23. package/dist/WidgetIndicatorPicker-DuKJFPRC.cjs +2 -0
  24. package/dist/WidgetIndicatorPicker-DuKJFPRC.cjs.map +1 -0
  25. package/dist/{WidgetIndicatorSettings-BJUjACzj.cjs → WidgetIndicatorSettings-C7vpco6e.cjs} +2 -2
  26. package/dist/{WidgetIndicatorSettings-BJUjACzj.cjs.map → WidgetIndicatorSettings-C7vpco6e.cjs.map} +1 -1
  27. package/dist/{WidgetIndicatorSettings-DgbsZk0h.js → WidgetIndicatorSettings-dDkqzzYo.js} +6 -6
  28. package/dist/{WidgetIndicatorSettings-DgbsZk0h.js.map → WidgetIndicatorSettings-dDkqzzYo.js.map} +1 -1
  29. package/dist/{WidgetSettings-D35fHGXL.js → WidgetSettings--XzDx515.js} +24 -11
  30. package/dist/WidgetSettings--XzDx515.js.map +1 -0
  31. package/dist/WidgetSettings-C0fnWGdY.cjs +2 -0
  32. package/dist/WidgetSettings-C0fnWGdY.cjs.map +1 -0
  33. package/dist/WidgetSymbolSearch-C4OR42nZ.cjs +2 -0
  34. package/dist/WidgetSymbolSearch-C4OR42nZ.cjs.map +1 -0
  35. package/dist/WidgetSymbolSearch-CvPpjIwa.js +580 -0
  36. package/dist/WidgetSymbolSearch-CvPpjIwa.js.map +1 -0
  37. package/dist/{focusTrap-Hm7AUTBw.js → focusTrap-Br9Zfje0.js} +1 -1
  38. package/dist/{focusTrap-Hm7AUTBw.js.map → focusTrap-Br9Zfje0.js.map} +1 -1
  39. package/dist/{focusTrap-B8OoGwHb.cjs → focusTrap-DrhhmG0V.cjs} +1 -1
  40. package/dist/{focusTrap-B8OoGwHb.cjs.map → focusTrap-DrhhmG0V.cjs.map} +1 -1
  41. package/dist/{i18n-DFR1Oukq.cjs → i18n-C2nQBZTY.cjs} +1 -1
  42. package/dist/{i18n-DFR1Oukq.cjs.map → i18n-C2nQBZTY.cjs.map} +1 -1
  43. package/dist/{i18n-CvnQcfor.js → i18n-C5v6Tzp1.js} +1 -1
  44. package/dist/{i18n-CvnQcfor.js.map → i18n-C5v6Tzp1.js.map} +1 -1
  45. package/dist/index.cjs +1 -1
  46. package/dist/index.js +1 -1
  47. package/dist/{indicatorInputWords-D19kY9NO.js → indicatorInputWords-Bd9Pt6qp.js} +2 -2
  48. package/dist/{indicatorInputWords-D19kY9NO.js.map → indicatorInputWords-Bd9Pt6qp.js.map} +1 -1
  49. package/dist/{indicatorInputWords-DzrKBU2I.cjs → indicatorInputWords-CTA4IcJR.cjs} +2 -2
  50. package/dist/{indicatorInputWords-DzrKBU2I.cjs.map → indicatorInputWords-CTA4IcJR.cjs.map} +1 -1
  51. package/dist/{indicatorSettingsTabs-BLEULMJJ.cjs → indicatorSettingsTabs-B0liE3ST.cjs} +2 -2
  52. package/dist/{indicatorSettingsTabs-BLEULMJJ.cjs.map → indicatorSettingsTabs-B0liE3ST.cjs.map} +1 -1
  53. package/dist/{indicatorSettingsTabs-Wxx2v_y4.js → indicatorSettingsTabs-XcgMdbLp.js} +3 -3
  54. package/dist/{indicatorSettingsTabs-Wxx2v_y4.js.map → indicatorSettingsTabs-XcgMdbLp.js.map} +1 -1
  55. package/dist/monthView-B-CieFDJ.cjs +2 -0
  56. package/dist/monthView-B-CieFDJ.cjs.map +1 -0
  57. package/dist/monthView-N8yDaTqZ.js +198 -0
  58. package/dist/monthView-N8yDaTqZ.js.map +1 -0
  59. package/dist/{platformKeys-BAPueZ1I.cjs → platformKeys-B82-j1Fs.cjs} +1 -1
  60. package/dist/{platformKeys-BAPueZ1I.cjs.map → platformKeys-B82-j1Fs.cjs.map} +1 -1
  61. package/dist/{platformKeys-D_x_6ZrV.js → platformKeys-Dd1qOCjF.js} +1 -1
  62. package/dist/{platformKeys-D_x_6ZrV.js.map → platformKeys-Dd1qOCjF.js.map} +1 -1
  63. package/dist/{settingsControls-ef4j_clQ.js → settingsControls-DIjzCFHI.js} +2 -2
  64. package/dist/{settingsControls-ef4j_clQ.js.map → settingsControls-DIjzCFHI.js.map} +1 -1
  65. package/dist/{settingsControls-jNn0If4b.cjs → settingsControls-Tn8_vJJv.cjs} +2 -2
  66. package/dist/{settingsControls-jNn0If4b.cjs.map → settingsControls-Tn8_vJJv.cjs.map} +1 -1
  67. package/dist/symbolCatalog-CA1fpz3s.js +90 -0
  68. package/dist/symbolCatalog-CA1fpz3s.js.map +1 -0
  69. package/dist/symbolCatalog-Dx1YnZgm.cjs +2 -0
  70. package/dist/symbolCatalog-Dx1YnZgm.cjs.map +1 -0
  71. package/dist/widget/ChartWidget.d.ts +102 -580
  72. package/dist/widget/ChartWidget.d.ts.map +1 -1
  73. package/dist/widget/WidgetAlerts.d.ts +35 -0
  74. package/dist/widget/WidgetAlerts.d.ts.map +1 -0
  75. package/dist/widget/WidgetChartSettings.d.ts +211 -0
  76. package/dist/widget/WidgetChartSettings.d.ts.map +1 -0
  77. package/dist/widget/WidgetCommands.d.ts +54 -0
  78. package/dist/widget/WidgetCommands.d.ts.map +1 -0
  79. package/dist/widget/WidgetCompares.d.ts +140 -0
  80. package/dist/widget/WidgetCompares.d.ts.map +1 -0
  81. package/dist/widget/WidgetDockArea.d.ts +90 -0
  82. package/dist/widget/WidgetDockArea.d.ts.map +1 -0
  83. package/dist/widget/WidgetDrawingEdit.d.ts +73 -0
  84. package/dist/widget/WidgetDrawingEdit.d.ts.map +1 -0
  85. package/dist/widget/WidgetIntervals.d.ts +66 -0
  86. package/dist/widget/WidgetIntervals.d.ts.map +1 -0
  87. package/dist/widget/WidgetLayouts.d.ts +85 -0
  88. package/dist/widget/WidgetLayouts.d.ts.map +1 -0
  89. package/dist/widget/WidgetLegendView.d.ts +54 -0
  90. package/dist/widget/WidgetLegendView.d.ts.map +1 -0
  91. package/dist/widget/WidgetMenus.d.ts +79 -0
  92. package/dist/widget/WidgetMenus.d.ts.map +1 -0
  93. package/dist/widget/WidgetReplay.d.ts +199 -0
  94. package/dist/widget/WidgetReplay.d.ts.map +1 -0
  95. package/dist/widget/WidgetSettings.d.ts +2 -0
  96. package/dist/widget/WidgetSettings.d.ts.map +1 -1
  97. package/dist/widget/WidgetTrading.d.ts +48 -0
  98. package/dist/widget/WidgetTrading.d.ts.map +1 -0
  99. package/dist/widget/WidgetWatchlists.d.ts +77 -0
  100. package/dist/widget/WidgetWatchlists.d.ts.map +1 -0
  101. package/dist/widget/index.cjs +43 -29
  102. package/dist/widget/index.cjs.map +1 -1
  103. package/dist/widget/index.js +9628 -9812
  104. package/dist/widget/index.js.map +1 -1
  105. package/dist/widget/keyTarget.d.ts +4 -0
  106. package/dist/widget/keyTarget.d.ts.map +1 -1
  107. package/dist/widget/locales/index.cjs +1 -1
  108. package/dist/widget/locales/index.js +1 -1
  109. package/dist/widget/pageEnv.d.ts +5 -0
  110. package/dist/widget/pageEnv.d.ts.map +1 -0
  111. package/dist/widget/widgetDialogs.d.ts +3 -0
  112. package/dist/widget/widgetDialogs.d.ts.map +1 -1
  113. package/dist/widgetFeatures-BM6u0u74.js +186 -0
  114. package/dist/widgetFeatures-BM6u0u74.js.map +1 -0
  115. package/dist/widgetFeatures-BZ8OVPN2.cjs +3 -0
  116. package/dist/widgetFeatures-BZ8OVPN2.cjs.map +1 -0
  117. package/package.json +3 -3
  118. package/dist/WidgetGoToDate-CPzfStIm.cjs +0 -2
  119. package/dist/WidgetSettings-D35fHGXL.js.map +0 -1
  120. package/dist/WidgetSettings-Pgt3p6vv.cjs +0 -2
  121. package/dist/WidgetSettings-Pgt3p6vv.cjs.map +0 -1
  122. package/dist/widgetFeatures-BvkTbsQn.js +0 -378
  123. package/dist/widgetFeatures-BvkTbsQn.js.map +0 -1
  124. package/dist/widgetFeatures-Cy0fs3Nl.cjs +0 -3
  125. package/dist/widgetFeatures-Cy0fs3Nl.cjs.map +0 -1
@@ -1,3 +0,0 @@
1
- var e=42,t=7,n=new Set([`US`,`CA`,`MX`,`BR`,`JP`,`KR`,`TW`,`HK`,`IL`,`PH`,`IN`,`ZA`,`AU`,`TH`,`SA`,`PE`,`CO`]);function r(e){try{let t=new Intl.Locale(e),r=t.getWeekInfo?.()??t.weekInfo;return r?r.firstDay===7?0:1:+!n.has(t.maximize().region??``)}catch{return 1}}function i(n,r,i){let a=(new Date(Date.UTC(n,r,1)).getUTCDay()-i+t)%t,o=[];for(let t=0;t<e;t++){let e=new Date(Date.UTC(n,r,1-a+t));o.push({year:e.getUTCFullYear(),month:e.getUTCMonth(),day:e.getUTCDate()})}return o}var a=e=>String(e).padStart(2,`0`),o=e=>`${String(e.year).padStart(4,`0`)}-${a(e.month+1)}-${a(e.day)}`;function s(e){let t=/^(\d{4})-(\d{2})-(\d{2})$/.exec(e??``);return t?{year:Number(t[1]),month:Number(t[2])-1,day:Number(t[3])}:null}function c(){let e=new Date;return{year:e.getFullYear(),month:e.getMonth(),day:e.getDate()}}function l(e,t){let n=new Date(Date.UTC(e.year,e.month,e.day+t));return{year:n.getUTCFullYear(),month:n.getUTCMonth(),day:n.getUTCDate()}}var u=class{element;grid;titleEl;chosen=``;limits={};today=o(c());view={year:0,month:0};focusDay=c();constructor(e,n,i){this.locale=n,this.onPick=i;let a=document.createElement(`div`);a.className=`tcw-calendar`;let o=document.createElement(`div`);o.className=`tcw-calendar-head`;let s=document.createElement(`div`);s.className=`tcw-calendar-title`,s.setAttribute(`aria-live`,`polite`),o.append(this.navButton(e.prevMonth,-1),s,this.navButton(e.nextMonth,1));let c=document.createElement(`div`);c.className=`tcw-calendar-weekdays`,c.setAttribute(`aria-hidden`,`true`);let l=r(n),u=new Intl.DateTimeFormat(n,{weekday:`narrow`,timeZone:`UTC`});for(let e=0;e<t;e++){let n=document.createElement(`span`);n.className=`tcw-calendar-weekday`,n.textContent=u.format(new Date(Date.UTC(2023,0,1+(l+e)%t))),c.appendChild(n)}let d=document.createElement(`div`);d.className=`tcw-calendar-grid`,d.setAttribute(`role`,`grid`),d.addEventListener(`keydown`,e=>this.onKey(e)),d.addEventListener(`click`,e=>{let t=e.target.closest(`.tcw-calendar-day`);t&&!t.disabled&&t.dataset.date&&this.pick(t.dataset.date)});let f=document.createElement(`div`);f.className=`tcw-calendar-foot`;let p=document.createElement(`button`);p.type=`button`,p.className=`tcw-calendar-today`,p.textContent=e.today,p.addEventListener(`click`,()=>this.pick(this.today)),f.appendChild(p),a.append(o,c,d,f),this.element=a,this.grid=d,this.titleEl=s}show(e,t={}){this.chosen=e,this.limits=t,this.today=s(t.today)?t.today:o(c());let n=this.clamp(s(e)??s(this.today));this.focusDay=n,this.view={year:n.year,month:n.month},this.render()}focusGrid(){this.grid.querySelector(`[tabindex="0"]`)?.focus()}navButton(e,t){let n=document.createElement(`button`);return n.type=`button`,n.className=`tcw-calendar-nav`,n.setAttribute(`aria-label`,e),n.innerHTML=t<0?`<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M10 3.5L5.5 8l4.5 4.5"/></svg>`:`<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M6 3.5L10.5 8 6 12.5"/></svg>`,n.addEventListener(`click`,()=>this.turn(t)),n}turn(e){let t=new Date(Date.UTC(this.view.year,this.view.month+e,1));this.view={year:t.getUTCFullYear(),month:t.getUTCMonth()};let n=new Date(Date.UTC(this.view.year,this.view.month+1,0)).getUTCDate();this.focusDay=this.clamp({...this.view,day:Math.min(this.focusDay.day,n)}),this.view={year:this.focusDay.year,month:this.focusDay.month},this.render()}clamp(e){let t=o(e),n=s(this.limits.min),r=s(this.limits.max);return n&&t<o(n)?n:r&&t>o(r)?r:e}allowed(e){let{min:t,max:n}=this.limits;return!(t&&e<t)&&!(n&&e>n)}render(){let e=this.locale;this.titleEl.textContent=new Intl.DateTimeFormat(e,{month:`long`,year:`numeric`,timeZone:`UTC`}).format(new Date(Date.UTC(this.view.year,this.view.month,1)));let n=this.today,a=o(this.focusDay),s=new Intl.DateTimeFormat(e,{dateStyle:`full`,timeZone:`UTC`});this.grid.textContent=``;let c=null;for(let[l,u]of i(this.view.year,this.view.month,r(e)).entries()){l%t===0&&(c=document.createElement(`div`),c.className=`tcw-calendar-week`,c.setAttribute(`role`,`row`),this.grid.appendChild(c));let e=o(u),r=document.createElement(`button`);r.type=`button`,r.className=`tcw-calendar-day`,r.dataset.date=e,r.setAttribute(`role`,`gridcell`),r.textContent=String(u.day),r.setAttribute(`aria-label`,s.format(new Date(Date.UTC(u.year,u.month,u.day)))),r.setAttribute(`aria-selected`,String(e===this.chosen)),r.tabIndex=e===a?0:-1,u.month!==this.view.month&&r.classList.add(`tcw-outside`),e===n&&r.classList.add(`tcw-today`),this.allowed(e)||(r.disabled=!0),c?.appendChild(r)}}onKey(e){let n={ArrowLeft:-1,ArrowRight:1,ArrowUp:-t,ArrowDown:t},r=this.element.isConnected&&getComputedStyle(this.element).direction===`rtl`;if(e.key in n){let t=r&&(e.key===`ArrowLeft`||e.key===`ArrowRight`)?-n[e.key]:n[e.key];this.moveFocus(l(this.focusDay,t))}else if(e.key===`PageUp`||e.key===`PageDown`)this.turn(e.key===`PageUp`?-1:1),this.focusGrid();else if(e.key===`Home`||e.key===`End`){let t=new Date(Date.UTC(this.view.year,this.view.month+1,0)).getUTCDate();this.moveFocus({...this.view,day:e.key===`Home`?1:t})}else if(e.key===`Enter`||e.key===` `)this.pick(o(this.focusDay));else return;e.preventDefault()}moveFocus(e){let t=this.clamp(e);this.focusDay=t,(t.year!==this.view.year||t.month!==this.view.month)&&(this.view={year:t.year,month:t.month}),this.render(),this.focusGrid()}pick(e){this.allowed(e)&&this.onPick(e)}},d=`toolbar,sidebar,statusBar,dock,alerts,objectTree,symbolInfo,symbolSearch,settings,indicatorSettings,drawingSettings,dataWindow,commandPalette,hotkeySheet,goToDate,replay,screenshot,copyImage,shareView,autoFib,themeToggle,fullscreen,accountPanel,orderTicket,bracketOrders,depthLadder,layouts,indicatorTemplates,compare,indicatorLegend,navigation,customTimeframes,intervalTyping,symbolTyping,dragDropImport,hotkeys,toasts,toolbar.symbol,toolbar.symbolInfo,toolbar.timeframes,toolbar.timeframeMenu,toolbar.chartType,toolbar.indicators,toolbar.layouts,toolbar.replay,toolbar.bracketOrders,toolbar.depthLadder,toolbar.accountPanel,toolbar.objectTree,toolbar.alerts,toolbar.screenshot,toolbar.settings,toolbar.themeToggle,toolbar.fullscreen,toolbar.compare,toolbar.undo,toolbar.redo,toolbar.trade,sidebar.cursor,sidebar.favorites,sidebar.lines,sidebar.fibonacci,sidebar.patterns,sidebar.forecasting,sidebar.annotation,sidebar.style,sidebar.magnet,sidebar.eraser,sidebar.zoomArea,sidebar.stayInDrawing,sidebar.undo,sidebar.redo,sidebar.clear,sidebar.lockAll,sidebar.hideAll,dock.watchlist,dock.alerts,dock.objectTree,dock.dataWindow,dock.symbolInfo,dock.depthLadder,statusBar.range,statusBar.goToDate,statusBar.market,statusBar.connection,statusBar.symbol,statusBar.clock,statusBar.scale,statusBar.rangeTimeframe,indicatorLegend.values,indicatorLegend.visibility,indicatorLegend.settings,indicatorLegend.remove,indicatorLegend.more,pane.move,pane.collapse,pane.maximize,navigation.zoom,navigation.scroll,navigation.reset,menu.chart,menu.chart.alert,menu.chart.order,menu.chart.orderTicket,menu.chart.horizontalLine,menu.chart.resetView,menu.chart.drawings,menu.chart.exportData,menu.chart.settings,menu.chart.scale,menu.chart.goToDate,menu.chart.paneScale,menu.priceAxisAdd,menu.chart.indicators,menu.chart.timezone,menu.drawing,menu.drawing.settings,menu.drawing.alert,menu.drawing.order,menu.drawing.group,menu.drawing.lock,menu.drawing.hide,menu.drawing.duplicate,menu.drawing.delete,selectionToolbar,hotkeys.commandPalette,hotkeys.symbolSearch,hotkeys.save,hotkeys.tools,hotkeys.invertScale,hotkeys.goToDate,hotkeys.help,hotkeys.resetView`.split(`,`),f=new Set(d),p={toolbar:[`toolbar`],drawingTools:[`sidebar`,`drawingSettings`,`hotkeys.tools`,`menu.chart.horizontalLine`],settings:[`settings`],statusBar:[`statusBar`,`goToDate`],rangeBar:[`statusBar.range`,`statusBar.rangeTimeframe`,`goToDate`],indicatorLegend:[`indicatorLegend`],fullscreen:[`fullscreen`],alerts:[`alerts`],objectTree:[`objectTree`],accountPanel:[`accountPanel`,`orderTicket`],indicatorTemplates:[`indicatorTemplates`],intervalTyping:[`intervalTyping`],symbolInfo:[`symbolInfo`],navigation:[`navigation`],dragDropImport:[`dragDropImport`],customTimeframes:[`customTimeframes`]},m={alert:[`alerts`,`menu.chart.alert`],buyLimit:[`menu.chart.order`],buyStop:[`menu.chart.order`],sellLimit:[`menu.chart.order`],sellStop:[`menu.chart.order`],orderTicket:[`orderTicket`,`menu.chart.orderTicket`],horizontalLine:[`menu.chart.horizontalLine`],resetView:[`menu.chart.resetView`],paste:[`menu.chart.drawings`],hideDrawings:[`menu.chart.drawings`],showDrawings:[`menu.chart.drawings`],removeDrawings:[`menu.chart.drawings`],removeIndicators:[`menu.chart.indicators`],settings:[`settings`,`menu.chart.settings`],exportData:[`menu.chart.exportData`],resetPriceScale:[`menu.chart.scale`],autoScale:[`menu.chart.scale`],invertScale:[`menu.chart.scale`],leftScale:[`menu.chart.scale`],regularScale:[`menu.chart.scale`],logScale:[`menu.chart.scale`],percentScale:[`menu.chart.scale`],indexedScale:[`menu.chart.scale`],labels:[`menu.chart.scale`],indicatorValueLabels:[`menu.chart.scale`],alignAxisLabels:[`menu.chart.scale`],barCountdown:[`menu.chart.scale`],lines:[`menu.chart.scale`],highLowLines:[`menu.chart.scale`],lastPriceLine:[`menu.chart.scale`],goToDate:[`goToDate`,`menu.chart.goToDate`],timezone:[`menu.chart.timezone`],paneLog:[`menu.chart.paneScale`],paneInvert:[`menu.chart.paneScale`],panePercent:[`menu.chart.paneScale`]},h={settings:[`drawingSettings`,`menu.drawing.settings`],alert:[`alerts`,`menu.drawing.alert`],front:[`menu.drawing.order`],forward:[`menu.drawing.order`],backward:[`menu.drawing.order`],back:[`menu.drawing.order`],group:[`menu.drawing.group`],ungroup:[`menu.drawing.group`],lock:[`menu.drawing.lock`],unlock:[`menu.drawing.lock`],hide:[`menu.drawing.hide`],duplicate:[`menu.drawing.duplicate`],delete:[`menu.drawing.delete`]},g={symbolSearch:`symbolSearch`,compare:`compare`,goToDate:`goToDate`,saveLayout:`layouts`,alerts:`alerts`,objectTree:`objectTree`,hotkeys:`hotkeySheet`,screenshot:`screenshot`,copyImage:`copyImage`,toggleTheme:`themeToggle`,settings:`settings`,shareView:`shareView`,autoFib:`autoFib`,dataWindow:`dataWindow`,symbolInfo:`symbolInfo`};function _(e){if(typeof e!=`object`||!e||Array.isArray(e))return{};let t={},n=[];for(let[r,i]of Object.entries(e))f.has(r)&&typeof i==`boolean`?t[r]=i:n.push(r);return n.length>0&&console.warn(`[ChartWidget] Unknown or non-boolean feature switches left out: ${n.join(`, `)}.`),t}function v(e){let t=Object.fromEntries(d.map(e=>[e,!0]));for(let[n,r]of Object.entries(p))if(e[n]===!1)for(let e of r)t[e]=!1;return{...t,..._(e.features)}}function y(e){return d.filter(t=>!e[t]).join(` `)}var b=`tcw-divider-off`,x=[{names:[`navigation.zoom`,`navigation.scroll`,`navigation.reset`],selector:`.tcw-nav`},{names:[`pane.move`,`pane.collapse`,`pane.maximize`],selector:`.tcw-pane-controls`},{names:[`indicatorLegend.visibility`,`indicatorLegend.settings`,`indicatorLegend.more`,`indicatorLegend.remove`],selector:`.tcw-ind-legend-actions`}];function S(){return[...d.map(e=>`.tcw-root[data-tcw-off~="${e}"] [data-tcw-part~="${e}"]{display:none!important}`),...x.map(({names:e,selector:t})=>`.tcw-root${e.map(e=>`[data-tcw-off~="${e}"]`).join(``)} ${t}{display:none!important}`),`.${b}{display:none!important}`].join(`
2
- `)}function C(e,...t){e.dataset.tcwPart=t.join(` `)}function w(...e){return`data-tcw-part="${e.join(` `)}"`}function T(e){return Object.prototype.hasOwnProperty.call(g,e)?g[e]:void 0}function E(e,t,n){let r=[...e.children],i=e=>e.classList.contains(t);for(let e of r)i(e)&&e.classList.remove(b);let a=e=>!e.hidden&&getComputedStyle(e).display!==`none`,o=e=>a(e)&&(e instanceof HTMLButtonElement||e.childElementCount>0||e.textContent!==``),s=!1,c=null;for(let e of r)if(n!==void 0&&e.classList.contains(n))c?.classList.add(b),c=null,s=!1;else if(i(e)){if(!a(e))continue;s?(c=e,s=!1):e.classList.add(b)}else o(e)&&(s=!0,c=null);c?.classList.add(b)}function D(e,t,n){let r=e.flatMap(e=>{if(e===`separator`)return[e];if(!(t[e.id]??[]).every(e=>n[e]))return[];if(!e.submenu)return[e];let r=D(e.submenu,t,n);return r.length>0?[{...e,submenu:r}]:[]});return r.filter((e,t)=>{if(e!==`separator`)return!0;let n=r.slice(0,t).some(e=>e!==`separator`),i=r[t+1];return n&&i!==void 0&&i!==`separator`})}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return v}});
3
- //# sourceMappingURL=widgetFeatures-Cy0fs3Nl.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"widgetFeatures-Cy0fs3Nl.cjs","names":[],"sources":["../src/widget/monthView.ts","../src/widget/widgetFeatures.ts"],"sourcesContent":["export interface CalendarLabels {\n prevMonth: string;\n nextMonth: string;\n today: string;\n}\n\nexport interface CalendarDay {\n year: number;\n /** 0–11. */\n month: number;\n day: number;\n}\n\n/** The first and last day that can be picked, and today, YYYY-MM-DD; each may be left out. */\nexport interface DayLimits {\n min?: string;\n max?: string;\n /** Today where the dates are read (the chart's time zone); the browser's when left out. */\n today?: string;\n}\n\nconst DAYS_SHOWN = 42;\nconst DAYS_IN_WEEK = 7;\n\n/** Regions whose weeks start on Sunday, for engines without week data. */\nconst SUNDAY_REGIONS = new Set(['US', 'CA', 'MX', 'BR', 'JP', 'KR', 'TW', 'HK', 'IL', 'PH', 'IN', 'ZA', 'AU', 'TH', 'SA', 'PE', 'CO']);\n\n/** The first day of the week where `locale` is spoken: 0 Sunday, 1 Monday. */\nexport function weekStart(locale: string): 0 | 1 {\n try {\n const loc = new Intl.Locale(locale) as Intl.Locale & {\n getWeekInfo?: () => { firstDay: number };\n weekInfo?: { firstDay: number };\n };\n const info = loc.getWeekInfo?.() ?? loc.weekInfo;\n if (info) return info.firstDay === 7 ? 0 : 1;\n return SUNDAY_REGIONS.has(loc.maximize().region ?? '') ? 0 : 1;\n } catch {\n return 1;\n }\n}\n\n/** Six whole weeks around month `month` of `year`, from `firstDay` (0 Sunday, 1 Monday). */\nexport function monthGrid(year: number, month: number, firstDay: 0 | 1): CalendarDay[] {\n const first = new Date(Date.UTC(year, month, 1));\n const lead = (first.getUTCDay() - firstDay + DAYS_IN_WEEK) % DAYS_IN_WEEK;\n const days: CalendarDay[] = [];\n for (let i = 0; i < DAYS_SHOWN; i++) {\n const d = new Date(Date.UTC(year, month, 1 - lead + i));\n days.push({ year: d.getUTCFullYear(), month: d.getUTCMonth(), day: d.getUTCDate() });\n }\n return days;\n}\n\nconst pad = (n: number) => String(n).padStart(2, '0');\nconst iso = (d: CalendarDay) => `${String(d.year).padStart(4, '0')}-${pad(d.month + 1)}-${pad(d.day)}`;\n\nfunction parseIso(value: string | undefined): CalendarDay | null {\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(value ?? '');\n if (!m) return null;\n return { year: Number(m[1]), month: Number(m[2]) - 1, day: Number(m[3]) };\n}\n\nfunction todayDay(): CalendarDay {\n const now = new Date();\n return { year: now.getFullYear(), month: now.getMonth(), day: now.getDate() };\n}\n\n/** `d` moved by `days` (any sign), across months and years. */\nfunction addDays(d: CalendarDay, days: number): CalendarDay {\n const t = new Date(Date.UTC(d.year, d.month, d.day + days));\n return { year: t.getUTCFullYear(), month: t.getUTCMonth(), day: t.getUTCDate() };\n}\n\n/**\n * A month of days drawn by the widget: arrows to turn it, today marked, the\n * chosen day marked, a button for today, and the keys a date grid takes. It\n * only tells which day was picked; what that day goes into is its owner's\n * business (a date field's calendar, the Go to dialog).\n */\nexport class MonthView {\n readonly element: HTMLDivElement;\n private readonly grid: HTMLDivElement;\n private readonly titleEl: HTMLDivElement;\n private chosen = '';\n private limits: DayLimits = {};\n private today = iso(todayDay());\n /** The month shown and the day the keys are on. */\n private view = { year: 0, month: 0 };\n private focusDay: CalendarDay = todayDay();\n\n constructor(\n labels: CalendarLabels,\n private readonly locale: string,\n private readonly onPick: (value: string) => void,\n ) {\n const element = document.createElement('div');\n element.className = 'tcw-calendar';\n\n const head = document.createElement('div');\n head.className = 'tcw-calendar-head';\n const title = document.createElement('div');\n title.className = 'tcw-calendar-title';\n title.setAttribute('aria-live', 'polite');\n head.append(this.navButton(labels.prevMonth, -1), title, this.navButton(labels.nextMonth, 1));\n\n const weekdays = document.createElement('div');\n weekdays.className = 'tcw-calendar-weekdays';\n weekdays.setAttribute('aria-hidden', 'true');\n const firstDay = weekStart(locale);\n const dayName = new Intl.DateTimeFormat(locale, { weekday: 'narrow', timeZone: 'UTC' });\n for (let i = 0; i < DAYS_IN_WEEK; i++) {\n // 2023-01-01 was a Sunday.\n const cell = document.createElement('span');\n cell.className = 'tcw-calendar-weekday';\n cell.textContent = dayName.format(new Date(Date.UTC(2023, 0, 1 + ((firstDay + i) % DAYS_IN_WEEK))));\n weekdays.appendChild(cell);\n }\n\n const grid = document.createElement('div');\n grid.className = 'tcw-calendar-grid';\n grid.setAttribute('role', 'grid');\n grid.addEventListener('keydown', (e) => this.onKey(e));\n grid.addEventListener('click', (e) => {\n const day = (e.target as Element).closest<HTMLButtonElement>('.tcw-calendar-day');\n if (day && !day.disabled && day.dataset.date) this.pick(day.dataset.date);\n });\n\n const foot = document.createElement('div');\n foot.className = 'tcw-calendar-foot';\n const today = document.createElement('button');\n today.type = 'button';\n today.className = 'tcw-calendar-today';\n today.textContent = labels.today;\n today.addEventListener('click', () => this.pick(this.today));\n foot.appendChild(today);\n\n element.append(head, weekdays, grid, foot);\n this.element = element;\n this.grid = grid;\n this.titleEl = title;\n }\n\n /** Show the month of `value` (today's when it is no date), that day marked, days outside `limits` greyed. */\n show(value: string, limits: DayLimits = {}): void {\n this.chosen = value;\n this.limits = limits;\n this.today = parseIso(limits.today) ? limits.today! : iso(todayDay());\n const start = this.clamp(parseIso(value) ?? parseIso(this.today)!);\n this.focusDay = start;\n this.view = { year: start.year, month: start.month };\n this.render();\n }\n\n /** Moves keyboard focus onto the days. */\n focusGrid(): void {\n this.grid.querySelector<HTMLButtonElement>('[tabindex=\"0\"]')?.focus();\n }\n\n private navButton(label: string, by: -1 | 1): HTMLButtonElement {\n const b = document.createElement('button');\n b.type = 'button';\n b.className = 'tcw-calendar-nav';\n b.setAttribute('aria-label', label);\n b.innerHTML = by < 0\n ? '<svg viewBox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"M10 3.5L5.5 8l4.5 4.5\"/></svg>'\n : '<svg viewBox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"M6 3.5L10.5 8 6 12.5\"/></svg>';\n b.addEventListener('click', () => this.turn(by));\n return b;\n }\n\n private turn(by: number): void {\n const t = new Date(Date.UTC(this.view.year, this.view.month + by, 1));\n this.view = { year: t.getUTCFullYear(), month: t.getUTCMonth() };\n // The keys' day follows into the new month, on the same date where it has one.\n const last = new Date(Date.UTC(this.view.year, this.view.month + 1, 0)).getUTCDate();\n this.focusDay = this.clamp({ ...this.view, day: Math.min(this.focusDay.day, last) });\n this.view = { year: this.focusDay.year, month: this.focusDay.month };\n this.render();\n }\n\n /** `day` moved inside the limits, so the keys never rest on a greyed day. */\n private clamp(day: CalendarDay): CalendarDay {\n const value = iso(day);\n const min = parseIso(this.limits.min);\n const max = parseIso(this.limits.max);\n if (min && value < iso(min)) return min;\n if (max && value > iso(max)) return max;\n return day;\n }\n\n private allowed(value: string): boolean {\n const { min, max } = this.limits;\n return !(min && value < min) && !(max && value > max);\n }\n\n private render(): void {\n const locale = this.locale;\n this.titleEl.textContent = new Intl.DateTimeFormat(locale, { month: 'long', year: 'numeric', timeZone: 'UTC' })\n .format(new Date(Date.UTC(this.view.year, this.view.month, 1)));\n const today = this.today;\n const focus = iso(this.focusDay);\n const fullDate = new Intl.DateTimeFormat(locale, { dateStyle: 'full', timeZone: 'UTC' });\n this.grid.textContent = '';\n let row: HTMLElement | null = null;\n for (const [i, day] of monthGrid(this.view.year, this.view.month, weekStart(locale)).entries()) {\n if (i % DAYS_IN_WEEK === 0) {\n row = document.createElement('div');\n row.className = 'tcw-calendar-week';\n row.setAttribute('role', 'row');\n this.grid.appendChild(row);\n }\n const value = iso(day);\n const b = document.createElement('button');\n b.type = 'button';\n b.className = 'tcw-calendar-day';\n b.dataset.date = value;\n b.setAttribute('role', 'gridcell');\n b.textContent = String(day.day);\n b.setAttribute('aria-label', fullDate.format(new Date(Date.UTC(day.year, day.month, day.day))));\n b.setAttribute('aria-selected', String(value === this.chosen));\n b.tabIndex = value === focus ? 0 : -1;\n if (day.month !== this.view.month) b.classList.add('tcw-outside');\n if (value === today) b.classList.add('tcw-today');\n if (!this.allowed(value)) b.disabled = true;\n row?.appendChild(b);\n }\n }\n\n private onKey(e: KeyboardEvent): void {\n const moves: Record<string, number> = { ArrowLeft: -1, ArrowRight: 1, ArrowUp: -DAYS_IN_WEEK, ArrowDown: DAYS_IN_WEEK };\n const rtl = this.element.isConnected && getComputedStyle(this.element).direction === 'rtl';\n if (e.key in moves) {\n const by = rtl && (e.key === 'ArrowLeft' || e.key === 'ArrowRight') ? -moves[e.key] : moves[e.key];\n this.moveFocus(addDays(this.focusDay, by));\n } else if (e.key === 'PageUp' || e.key === 'PageDown') {\n this.turn(e.key === 'PageUp' ? -1 : 1);\n this.focusGrid();\n } else if (e.key === 'Home' || e.key === 'End') {\n const last = new Date(Date.UTC(this.view.year, this.view.month + 1, 0)).getUTCDate();\n this.moveFocus({ ...this.view, day: e.key === 'Home' ? 1 : last });\n } else if (e.key === 'Enter' || e.key === ' ') {\n this.pick(iso(this.focusDay));\n } else {\n return;\n }\n e.preventDefault();\n }\n\n private moveFocus(target: CalendarDay): void {\n const day = this.clamp(target);\n this.focusDay = day;\n if (day.year !== this.view.year || day.month !== this.view.month) {\n this.view = { year: day.year, month: day.month };\n }\n this.render();\n this.focusGrid();\n }\n\n private pick(value: string): void {\n if (this.allowed(value)) this.onPick(value);\n }\n}\n","import type { ContextMenuEntry } from './WidgetContextMenu.js';\nimport type { ChartMenuAction } from './chartMenu.js';\nimport type { DrawingMenuAction } from './drawingMenu.js';\n\n/**\n * The widget's switches, by name; every one is on until turned off. A name\n * without a dot is a whole capability, off wherever it shows (its button,\n * its menu entries, its command, its keys); a dotted name is one place.\n * A switch hides; it never adds a part that is off until its option asks\n * for it (`depthLadder: true`, `watchlist: true`).\n * The names are a contract: new ones are added, none is renamed.\n */\nexport const WIDGET_FEATURES = [\n // The bars.\n 'toolbar', 'sidebar', 'statusBar', 'dock',\n // Capabilities, wherever they show.\n 'alerts', 'objectTree', 'symbolInfo', 'symbolSearch', 'settings', 'indicatorSettings', 'drawingSettings',\n 'dataWindow', 'commandPalette', 'hotkeySheet', 'goToDate', 'replay', 'screenshot', 'copyImage', 'shareView',\n 'autoFib', 'themeToggle', 'fullscreen', 'accountPanel', 'orderTicket', 'bracketOrders', 'depthLadder',\n 'layouts', 'indicatorTemplates', 'compare', 'indicatorLegend', 'navigation', 'customTimeframes',\n 'intervalTyping', 'symbolTyping', 'dragDropImport', 'hotkeys', 'toasts',\n // The toolbar's buttons.\n 'toolbar.symbol', 'toolbar.symbolInfo', 'toolbar.timeframes', 'toolbar.timeframeMenu', 'toolbar.chartType',\n 'toolbar.indicators', 'toolbar.layouts', 'toolbar.replay', 'toolbar.bracketOrders', 'toolbar.depthLadder',\n 'toolbar.accountPanel', 'toolbar.objectTree', 'toolbar.alerts', 'toolbar.screenshot', 'toolbar.settings',\n 'toolbar.themeToggle', 'toolbar.fullscreen', 'toolbar.compare', 'toolbar.undo', 'toolbar.redo', 'toolbar.trade',\n // The drawing sidebar: its tools by section, then its buttons.\n 'sidebar.cursor', 'sidebar.favorites', 'sidebar.lines', 'sidebar.fibonacci', 'sidebar.patterns',\n 'sidebar.forecasting', 'sidebar.annotation', 'sidebar.style', 'sidebar.magnet', 'sidebar.eraser',\n 'sidebar.zoomArea', 'sidebar.stayInDrawing', 'sidebar.undo', 'sidebar.redo', 'sidebar.clear',\n 'sidebar.lockAll', 'sidebar.hideAll',\n // The dock's rail: a button for each panel.\n 'dock.watchlist', 'dock.alerts', 'dock.objectTree', 'dock.dataWindow', 'dock.symbolInfo', 'dock.depthLadder',\n // The status bar.\n 'statusBar.range', 'statusBar.goToDate', 'statusBar.market', 'statusBar.connection', 'statusBar.symbol',\n 'statusBar.clock', 'statusBar.scale',\n // A long range on the range bar switches to weeks or months, a short one back.\n 'statusBar.rangeTimeframe',\n // On the chart: the indicators' rows, the panes' buttons, the navigation.\n 'indicatorLegend.values', 'indicatorLegend.visibility', 'indicatorLegend.settings', 'indicatorLegend.remove',\n 'indicatorLegend.more', 'pane.move', 'pane.collapse', 'pane.maximize',\n 'navigation.zoom', 'navigation.scroll', 'navigation.reset',\n // Menus: a right-click on the chart (and the \"+\" by the price axis), and on a drawing.\n 'menu.chart', 'menu.chart.alert', 'menu.chart.order', 'menu.chart.orderTicket', 'menu.chart.horizontalLine',\n 'menu.chart.resetView', 'menu.chart.drawings', 'menu.chart.exportData', 'menu.chart.settings',\n 'menu.chart.scale', 'menu.chart.goToDate', 'menu.chart.paneScale', 'menu.priceAxisAdd',\n 'menu.chart.indicators', 'menu.chart.timezone',\n 'menu.drawing', 'menu.drawing.settings', 'menu.drawing.alert', 'menu.drawing.order', 'menu.drawing.group',\n 'menu.drawing.lock', 'menu.drawing.hide', 'menu.drawing.duplicate', 'menu.drawing.delete',\n // The toolbar that appears over a selected drawing.\n 'selectionToolbar',\n // Keys.\n 'hotkeys.commandPalette', 'hotkeys.symbolSearch', 'hotkeys.save', 'hotkeys.tools', 'hotkeys.invertScale',\n 'hotkeys.goToDate', 'hotkeys.help', 'hotkeys.resetView',\n] as const;\n\nexport type WidgetFeature = (typeof WIDGET_FEATURES)[number];\n/** Switches to turn on (`true`) or off (`false`), by name. */\nexport type WidgetFeatures = Partial<Record<WidgetFeature, boolean>>;\n/** Every switch, on or off. */\nexport type WidgetFeatureState = Readonly<Record<WidgetFeature, boolean>>;\n\nconst KNOWN: ReadonlySet<string> = new Set(WIDGET_FEATURES);\n\n/** The widget's older on/off options, each the switches it stands for. */\nexport const LEGACY_FEATURE_OPTIONS = {\n toolbar: ['toolbar'],\n drawingTools: ['sidebar', 'drawingSettings', 'hotkeys.tools', 'menu.chart.horizontalLine'],\n settings: ['settings'],\n statusBar: ['statusBar', 'goToDate'],\n rangeBar: ['statusBar.range', 'statusBar.rangeTimeframe', 'goToDate'],\n indicatorLegend: ['indicatorLegend'],\n fullscreen: ['fullscreen'],\n alerts: ['alerts'],\n objectTree: ['objectTree'],\n accountPanel: ['accountPanel', 'orderTicket'],\n indicatorTemplates: ['indicatorTemplates'],\n intervalTyping: ['intervalTyping'],\n symbolInfo: ['symbolInfo'],\n navigation: ['navigation'],\n dragDropImport: ['dragDropImport'],\n customTimeframes: ['customTimeframes'],\n} as const satisfies Record<string, readonly WidgetFeature[]>;\n\ntype LegacyOptions = { readonly [K in keyof typeof LEGACY_FEATURE_OPTIONS]?: unknown };\n\n/** The switches each chart menu entry needs on (the right-click menu and the \"+\" by the price axis). */\nexport const CHART_MENU_FEATURES: Readonly<Record<ChartMenuAction, readonly WidgetFeature[]>> = {\n alert: ['alerts', 'menu.chart.alert'],\n buyLimit: ['menu.chart.order'],\n buyStop: ['menu.chart.order'],\n sellLimit: ['menu.chart.order'],\n sellStop: ['menu.chart.order'],\n orderTicket: ['orderTicket', 'menu.chart.orderTicket'],\n horizontalLine: ['menu.chart.horizontalLine'],\n resetView: ['menu.chart.resetView'],\n paste: ['menu.chart.drawings'],\n hideDrawings: ['menu.chart.drawings'],\n showDrawings: ['menu.chart.drawings'],\n removeDrawings: ['menu.chart.drawings'],\n removeIndicators: ['menu.chart.indicators'],\n settings: ['settings', 'menu.chart.settings'],\n exportData: ['menu.chart.exportData'],\n resetPriceScale: ['menu.chart.scale'],\n autoScale: ['menu.chart.scale'],\n invertScale: ['menu.chart.scale'],\n leftScale: ['menu.chart.scale'],\n regularScale: ['menu.chart.scale'],\n logScale: ['menu.chart.scale'],\n percentScale: ['menu.chart.scale'],\n indexedScale: ['menu.chart.scale'],\n labels: ['menu.chart.scale'],\n indicatorValueLabels: ['menu.chart.scale'],\n alignAxisLabels: ['menu.chart.scale'],\n barCountdown: ['menu.chart.scale'],\n lines: ['menu.chart.scale'],\n highLowLines: ['menu.chart.scale'],\n lastPriceLine: ['menu.chart.scale'],\n goToDate: ['goToDate', 'menu.chart.goToDate'],\n timezone: ['menu.chart.timezone'],\n paneLog: ['menu.chart.paneScale'],\n paneInvert: ['menu.chart.paneScale'],\n panePercent: ['menu.chart.paneScale'],\n};\n\n/** The switches each entry of a drawing's menu needs on. */\nexport const DRAWING_MENU_FEATURES: Readonly<Record<DrawingMenuAction, readonly WidgetFeature[]>> = {\n settings: ['drawingSettings', 'menu.drawing.settings'],\n alert: ['alerts', 'menu.drawing.alert'],\n front: ['menu.drawing.order'],\n forward: ['menu.drawing.order'],\n backward: ['menu.drawing.order'],\n back: ['menu.drawing.order'],\n group: ['menu.drawing.group'],\n ungroup: ['menu.drawing.group'],\n lock: ['menu.drawing.lock'],\n unlock: ['menu.drawing.lock'],\n hide: ['menu.drawing.hide'],\n duplicate: ['menu.drawing.duplicate'],\n delete: ['menu.drawing.delete'],\n};\n\n/** The switch each command of the command palette needs on (by its action id). */\nexport const COMMAND_FEATURES: Readonly<Record<string, WidgetFeature>> = {\n symbolSearch: 'symbolSearch',\n compare: 'compare',\n goToDate: 'goToDate',\n saveLayout: 'layouts',\n alerts: 'alerts',\n objectTree: 'objectTree',\n hotkeys: 'hotkeySheet',\n screenshot: 'screenshot',\n copyImage: 'copyImage',\n toggleTheme: 'themeToggle',\n settings: 'settings',\n shareView: 'shareView',\n autoFib: 'autoFib',\n dataWindow: 'dataWindow',\n symbolInfo: 'symbolInfo',\n};\n\n/**\n * Switches as given (an option, a `setFeatures` call): known names set to\n * `true` or `false`. Anything else is dropped, with a warning.\n */\nexport function readWidgetFeatures(value: unknown): WidgetFeatures {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return {};\n const out: WidgetFeatures = {};\n const dropped: string[] = [];\n for (const [name, on] of Object.entries(value)) {\n if (KNOWN.has(name) && typeof on === 'boolean') out[name as WidgetFeature] = on;\n else dropped.push(name);\n }\n if (dropped.length > 0) {\n console.warn(`[ChartWidget] Unknown or non-boolean feature switches left out: ${dropped.join(', ')}.`);\n }\n return out;\n}\n\n/** Every switch at the start: on, then off where an older option says `false`, then as `features` says. */\nexport function resolveWidgetFeatures(options: LegacyOptions & { readonly features?: unknown }): WidgetFeatureState {\n const state = Object.fromEntries(WIDGET_FEATURES.map((name) => [name, true])) as Record<WidgetFeature, boolean>;\n for (const [option, names] of Object.entries(LEGACY_FEATURE_OPTIONS)) {\n if (options[option as keyof LegacyOptions] !== false) continue;\n for (const name of names) state[name] = false;\n }\n return { ...state, ...readWidgetFeatures(options.features) };\n}\n\n/** The switches that are off, space apart (the root's `data-tcw-off`). */\nexport function offFeatures(state: WidgetFeatureState): string {\n return WIDGET_FEATURES.filter((name) => !state[name]).join(' ');\n}\n\n/** A divider with nothing shown on one side of it. */\nconst DIVIDER_OFF = 'tcw-divider-off';\n\n/** Holders whose every part can be switched off: they go too, rather than show empty. */\nconst GROUPED_PARTS: readonly { names: readonly WidgetFeature[]; selector: string }[] = [\n { names: ['navigation.zoom', 'navigation.scroll', 'navigation.reset'], selector: '.tcw-nav' },\n { names: ['pane.move', 'pane.collapse', 'pane.maximize'], selector: '.tcw-pane-controls' },\n {\n names: ['indicatorLegend.visibility', 'indicatorLegend.settings', 'indicatorLegend.more', 'indicatorLegend.remove'],\n selector: '.tcw-ind-legend-actions',\n },\n];\n\n/** Hides every part (`data-tcw-part`) whose switch is off on its widget, and the dividers left with nothing to divide. */\nexport function widgetFeatureCss(): string {\n return [\n ...WIDGET_FEATURES.map((name) => `.tcw-root[data-tcw-off~=\"${name}\"] [data-tcw-part~=\"${name}\"]{display:none!important}`),\n ...GROUPED_PARTS.map(({ names, selector }) =>\n `.tcw-root${names.map((name) => `[data-tcw-off~=\"${name}\"]`).join('')} ${selector}{display:none!important}`),\n `.${DIVIDER_OFF}{display:none!important}`,\n ].join('\\n');\n}\n\n/** Marks an element as a part of the switches named: it is hidden while any of them is off. */\nexport function markPart(el: HTMLElement, ...names: WidgetFeature[]): void {\n el.dataset.tcwPart = names.join(' ');\n}\n\n/** The same mark as an attribute, for markup built as text. */\nexport function partAttr(...names: WidgetFeature[]): string {\n return `data-tcw-part=\"${names.join(' ')}\"`;\n}\n\n/** The switch a command of the command palette needs on, if it has one. */\nexport function commandFeature(id: string): WidgetFeature | undefined {\n return Object.prototype.hasOwnProperty.call(COMMAND_FEATURES, id) ? COMMAND_FEATURES[id] : undefined;\n}\n\n/**\n * Hides each divider among `container`'s children with nothing shown between\n * it and the edge, a boundary (a spacer) or the divider before it.\n */\nexport function tidyDividers(container: HTMLElement, dividerClass: string, boundaryClass?: string): void {\n const children = [...container.children] as HTMLElement[];\n const isDivider = (el: HTMLElement) => el.classList.contains(dividerClass);\n for (const el of children) if (isDivider(el)) el.classList.remove(DIVIDER_OFF);\n const shown = (el: HTMLElement) => !el.hidden && getComputedStyle(el).display !== 'none';\n // An empty holder (for a host's buttons, say) shows nothing.\n const isItem = (el: HTMLElement) => shown(el) && (el instanceof HTMLButtonElement || el.childElementCount > 0 || el.textContent !== '');\n let itemSince = false;\n let pending: HTMLElement | null = null;\n for (const el of children) {\n if (boundaryClass !== undefined && el.classList.contains(boundaryClass)) {\n pending?.classList.add(DIVIDER_OFF);\n pending = null;\n itemSince = false;\n } else if (isDivider(el)) {\n if (!shown(el)) continue;\n if (!itemSince) {\n el.classList.add(DIVIDER_OFF);\n } else {\n pending = el;\n itemSince = false;\n }\n } else if (isItem(el)) {\n itemSince = true;\n pending = null;\n }\n }\n pending?.classList.add(DIVIDER_OFF);\n}\n\n/**\n * A menu's entries with those whose switches are off left out, in its\n * submenus too (a submenu with nothing left goes), and no separator at\n * either end or next to another.\n */\nexport function filterMenuEntries<Id extends string>(\n entries: readonly ContextMenuEntry[],\n featuresOf: Readonly<Record<Id, readonly WidgetFeature[]>>,\n state: WidgetFeatureState,\n): ContextMenuEntry[] {\n const kept = entries.flatMap((entry): ContextMenuEntry[] => {\n if (entry === 'separator') return [entry];\n const names = (featuresOf as Readonly<Record<string, readonly WidgetFeature[]>>)[entry.id] ?? [];\n if (!names.every((name) => state[name])) return [];\n if (!entry.submenu) return [entry];\n const submenu = filterMenuEntries(entry.submenu, featuresOf, state);\n return submenu.length > 0 ? [{ ...entry, submenu }] : [];\n });\n return kept.filter((entry, i) => {\n if (entry !== 'separator') return true;\n const before = kept.slice(0, i).some((e) => e !== 'separator');\n const next = kept[i + 1];\n return before && next !== undefined && next !== 'separator';\n });\n}\n"],"mappings":"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"}