@tradecanvas/chart 1.4.0 → 1.7.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 (195) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +910 -858
  3. package/dist/Chart.d.ts +606 -23
  4. package/dist/Chart.d.ts.map +1 -1
  5. package/dist/DataManager.d.ts +5 -0
  6. package/dist/DataManager.d.ts.map +1 -1
  7. package/dist/HistoryPager.d.ts +58 -0
  8. package/dist/HistoryPager.d.ts.map +1 -0
  9. package/dist/LayoutSession-CTZB90NX.cjs +2 -0
  10. package/dist/LayoutSession-CTZB90NX.cjs.map +1 -0
  11. package/dist/LayoutSession-CWn3sdbs.js +3967 -0
  12. package/dist/LayoutSession-CWn3sdbs.js.map +1 -0
  13. package/dist/ThemeManager.d.ts +5 -1
  14. package/dist/ThemeManager.d.ts.map +1 -1
  15. package/dist/chartA11y.d.ts +59 -0
  16. package/dist/chartA11y.d.ts.map +1 -0
  17. package/dist/charts/ChartTypeStrategy.d.ts +5 -4
  18. package/dist/charts/ChartTypeStrategy.d.ts.map +1 -1
  19. package/dist/grid/ChartGrid.d.ts +6 -1
  20. package/dist/grid/ChartGrid.d.ts.map +1 -1
  21. package/dist/i18n-CiQ8EDVs.js +1469 -0
  22. package/dist/i18n-CiQ8EDVs.js.map +1 -0
  23. package/dist/i18n-WsLA9SmD.cjs +2 -0
  24. package/dist/i18n-WsLA9SmD.cjs.map +1 -0
  25. package/dist/index.cjs +1 -1
  26. package/dist/index.cjs.map +1 -1
  27. package/dist/index.d.ts +22 -3
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +31 -31
  30. package/dist/index.js.map +1 -1
  31. package/dist/indicatorLabel.d.ts +7 -0
  32. package/dist/indicatorLabel.d.ts.map +1 -0
  33. package/dist/layout/LayoutManager.d.ts +50 -0
  34. package/dist/layout/LayoutManager.d.ts.map +1 -1
  35. package/dist/layout/priceAxisWidth.d.ts +2 -0
  36. package/dist/layout/priceAxisWidth.d.ts.map +1 -1
  37. package/dist/regularHours.d.ts +10 -0
  38. package/dist/regularHours.d.ts.map +1 -0
  39. package/dist/state/LayoutSession.d.ts +101 -0
  40. package/dist/state/LayoutSession.d.ts.map +1 -0
  41. package/dist/state/layoutStorage.d.ts +46 -0
  42. package/dist/state/layoutStorage.d.ts.map +1 -0
  43. package/dist/trading/wireExecution.d.ts +7 -3
  44. package/dist/trading/wireExecution.d.ts.map +1 -1
  45. package/dist/widget/ChartWidget.d.ts +219 -10
  46. package/dist/widget/ChartWidget.d.ts.map +1 -1
  47. package/dist/widget/ChartWidgetGrid.d.ts +166 -0
  48. package/dist/widget/ChartWidgetGrid.d.ts.map +1 -0
  49. package/dist/widget/DrawingTemplateStore.d.ts +29 -8
  50. package/dist/widget/DrawingTemplateStore.d.ts.map +1 -1
  51. package/dist/widget/WatchlistStore.d.ts +65 -0
  52. package/dist/widget/WatchlistStore.d.ts.map +1 -0
  53. package/dist/widget/WidgetAccountPanel.d.ts +72 -0
  54. package/dist/widget/WidgetAccountPanel.d.ts.map +1 -0
  55. package/dist/widget/WidgetAlertsPanel.d.ts +50 -3
  56. package/dist/widget/WidgetAlertsPanel.d.ts.map +1 -1
  57. package/dist/widget/WidgetBracketBar.d.ts +3 -1
  58. package/dist/widget/WidgetBracketBar.d.ts.map +1 -1
  59. package/dist/widget/WidgetChartNav.d.ts +36 -0
  60. package/dist/widget/WidgetChartNav.d.ts.map +1 -0
  61. package/dist/widget/WidgetCommandPalette.d.ts +3 -1
  62. package/dist/widget/WidgetCommandPalette.d.ts.map +1 -1
  63. package/dist/widget/WidgetContextMenu.d.ts +40 -0
  64. package/dist/widget/WidgetContextMenu.d.ts.map +1 -0
  65. package/dist/widget/WidgetDataWindow.d.ts +3 -1
  66. package/dist/widget/WidgetDataWindow.d.ts.map +1 -1
  67. package/dist/widget/WidgetDepthLadder.d.ts +3 -1
  68. package/dist/widget/WidgetDepthLadder.d.ts.map +1 -1
  69. package/dist/widget/WidgetDrawingSettings.d.ts +108 -0
  70. package/dist/widget/WidgetDrawingSettings.d.ts.map +1 -0
  71. package/dist/widget/WidgetDrawingSidebar.d.ts +14 -1
  72. package/dist/widget/WidgetDrawingSidebar.d.ts.map +1 -1
  73. package/dist/widget/WidgetDrawingStyle.d.ts +3 -1
  74. package/dist/widget/WidgetDrawingStyle.d.ts.map +1 -1
  75. package/dist/widget/WidgetDropdown.d.ts.map +1 -1
  76. package/dist/widget/WidgetGoToDate.d.ts +5 -4
  77. package/dist/widget/WidgetGoToDate.d.ts.map +1 -1
  78. package/dist/widget/WidgetHistoryPill.d.ts +23 -0
  79. package/dist/widget/WidgetHistoryPill.d.ts.map +1 -0
  80. package/dist/widget/WidgetHotkeySheet.d.ts.map +1 -1
  81. package/dist/widget/WidgetIndicatorLegend.d.ts +31 -1
  82. package/dist/widget/WidgetIndicatorLegend.d.ts.map +1 -1
  83. package/dist/widget/WidgetIndicatorSettings.d.ts +62 -7
  84. package/dist/widget/WidgetIndicatorSettings.d.ts.map +1 -1
  85. package/dist/widget/WidgetIntervalInput.d.ts +34 -0
  86. package/dist/widget/WidgetIntervalInput.d.ts.map +1 -0
  87. package/dist/widget/WidgetLayoutsDialog.d.ts +39 -0
  88. package/dist/widget/WidgetLayoutsDialog.d.ts.map +1 -0
  89. package/dist/widget/WidgetLayoutsUI.d.ts +37 -0
  90. package/dist/widget/WidgetLayoutsUI.d.ts.map +1 -0
  91. package/dist/widget/WidgetNamePrompt.d.ts +31 -0
  92. package/dist/widget/WidgetNamePrompt.d.ts.map +1 -0
  93. package/dist/widget/WidgetObjectTree.d.ts +21 -3
  94. package/dist/widget/WidgetObjectTree.d.ts.map +1 -1
  95. package/dist/widget/WidgetOrderTicket.d.ts +49 -0
  96. package/dist/widget/WidgetOrderTicket.d.ts.map +1 -0
  97. package/dist/widget/WidgetReplayBar.d.ts +15 -0
  98. package/dist/widget/WidgetReplayBar.d.ts.map +1 -1
  99. package/dist/widget/WidgetSettings.d.ts +13 -1
  100. package/dist/widget/WidgetSettings.d.ts.map +1 -1
  101. package/dist/widget/WidgetStatusBar.d.ts +3 -0
  102. package/dist/widget/WidgetStatusBar.d.ts.map +1 -1
  103. package/dist/widget/WidgetStyles.d.ts +3 -1
  104. package/dist/widget/WidgetStyles.d.ts.map +1 -1
  105. package/dist/widget/WidgetSymbolInfo.d.ts +64 -0
  106. package/dist/widget/WidgetSymbolInfo.d.ts.map +1 -0
  107. package/dist/widget/WidgetSymbolSearch.d.ts +26 -5
  108. package/dist/widget/WidgetSymbolSearch.d.ts.map +1 -1
  109. package/dist/widget/WidgetToolbar.d.ts +30 -1
  110. package/dist/widget/WidgetToolbar.d.ts.map +1 -1
  111. package/dist/widget/WidgetWatchlist.d.ts +53 -13
  112. package/dist/widget/WidgetWatchlist.d.ts.map +1 -1
  113. package/dist/widget/chartMenu.d.ts +40 -0
  114. package/dist/widget/chartMenu.d.ts.map +1 -0
  115. package/dist/widget/drawingMenu.d.ts +21 -0
  116. package/dist/widget/drawingMenu.d.ts.map +1 -0
  117. package/dist/widget/focusTrap.d.ts +8 -0
  118. package/dist/widget/focusTrap.d.ts.map +1 -0
  119. package/dist/widget/i18n.d.ts +20 -89
  120. package/dist/widget/i18n.d.ts.map +1 -1
  121. package/dist/widget/iconSet.d.ts.map +1 -1
  122. package/dist/widget/index.cjs +4294 -3028
  123. package/dist/widget/index.cjs.map +1 -1
  124. package/dist/widget/index.d.ts +15 -1
  125. package/dist/widget/index.d.ts.map +1 -1
  126. package/dist/widget/index.js +6326 -1185
  127. package/dist/widget/index.js.map +1 -1
  128. package/dist/widget/indicatorTemplates.d.ts +24 -0
  129. package/dist/widget/indicatorTemplates.d.ts.map +1 -0
  130. package/dist/widget/keyTarget.d.ts +11 -0
  131. package/dist/widget/keyTarget.d.ts.map +1 -0
  132. package/dist/widget/legendValues.d.ts +11 -6
  133. package/dist/widget/legendValues.d.ts.map +1 -1
  134. package/dist/widget/locales/ar.d.ts +4 -0
  135. package/dist/widget/locales/ar.d.ts.map +1 -0
  136. package/dist/widget/locales/de.d.ts +4 -0
  137. package/dist/widget/locales/de.d.ts.map +1 -0
  138. package/dist/widget/locales/en.d.ts +722 -0
  139. package/dist/widget/locales/en.d.ts.map +1 -0
  140. package/dist/widget/locales/es.d.ts +4 -0
  141. package/dist/widget/locales/es.d.ts.map +1 -0
  142. package/dist/widget/locales/fr.d.ts +4 -0
  143. package/dist/widget/locales/fr.d.ts.map +1 -0
  144. package/dist/widget/locales/he.d.ts +4 -0
  145. package/dist/widget/locales/he.d.ts.map +1 -0
  146. package/dist/widget/locales/id.d.ts +4 -0
  147. package/dist/widget/locales/id.d.ts.map +1 -0
  148. package/dist/widget/locales/index.cjs +2 -0
  149. package/dist/widget/locales/index.cjs.map +1 -0
  150. package/dist/widget/locales/index.d.ts +33 -0
  151. package/dist/widget/locales/index.d.ts.map +1 -0
  152. package/dist/widget/locales/index.js +10089 -0
  153. package/dist/widget/locales/index.js.map +1 -0
  154. package/dist/widget/locales/ja.d.ts +4 -0
  155. package/dist/widget/locales/ja.d.ts.map +1 -0
  156. package/dist/widget/locales/ko.d.ts +4 -0
  157. package/dist/widget/locales/ko.d.ts.map +1 -0
  158. package/dist/widget/locales/pt.d.ts +4 -0
  159. package/dist/widget/locales/pt.d.ts.map +1 -0
  160. package/dist/widget/locales/ru.d.ts +4 -0
  161. package/dist/widget/locales/ru.d.ts.map +1 -0
  162. package/dist/widget/locales/th.d.ts +4 -0
  163. package/dist/widget/locales/th.d.ts.map +1 -0
  164. package/dist/widget/locales/tr.d.ts +4 -0
  165. package/dist/widget/locales/tr.d.ts.map +1 -0
  166. package/dist/widget/locales/vi.d.ts +4 -0
  167. package/dist/widget/locales/vi.d.ts.map +1 -0
  168. package/dist/widget/locales/zh.d.ts +4 -0
  169. package/dist/widget/locales/zh.d.ts.map +1 -0
  170. package/dist/widget/locales/zhHant.d.ts +4 -0
  171. package/dist/widget/locales/zhHant.d.ts.map +1 -0
  172. package/dist/widget/orderTicket.d.ts +27 -0
  173. package/dist/widget/orderTicket.d.ts.map +1 -0
  174. package/dist/widget/settingsControls.d.ts +24 -0
  175. package/dist/widget/settingsControls.d.ts.map +1 -0
  176. package/dist/widget/types.d.ts +182 -6
  177. package/dist/widget/types.d.ts.map +1 -1
  178. package/dist/widget/widgetConfig.d.ts.map +1 -1
  179. package/dist/widget/widgetLayout.d.ts +22 -0
  180. package/dist/widget/widgetLayout.d.ts.map +1 -0
  181. package/dist/widget/widgetLocales.d.ts +17 -0
  182. package/dist/widget/widgetLocales.d.ts.map +1 -0
  183. package/dist/widget/widgetTimeframes.d.ts +8 -0
  184. package/dist/widget/widgetTimeframes.d.ts.map +1 -1
  185. package/dist/widget/widgetTimezones.d.ts +32 -0
  186. package/dist/widget/widgetTimezones.d.ts.map +1 -0
  187. package/dist/widget/widgetUI.d.ts +126 -0
  188. package/dist/widget/widgetUI.d.ts.map +1 -0
  189. package/package.json +8 -3
  190. package/dist/DragDropImporter-C5kgfbET.cjs +0 -2
  191. package/dist/DragDropImporter-C5kgfbET.cjs.map +0 -1
  192. package/dist/DragDropImporter-Dd9Mud5J.js +0 -2099
  193. package/dist/DragDropImporter-Dd9Mud5J.js.map +0 -1
  194. package/dist/charts/IndicatorPriceRange.d.ts +0 -20
  195. package/dist/charts/IndicatorPriceRange.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../src/grid/ChartGrid.ts","../src/finance/SparklineChart.ts","../src/finance/DepthChart.ts","../src/finance/EquityCurveChart.ts","../src/finance/HeatmapChart.ts","../src/finance/WaterfallChart.ts","../src/finance/GaugeChart.ts","../src/finance/performanceData.ts","../src/finance/PerformanceDashboard.ts"],"sourcesContent":["import type { ChartOptions, Theme, TimeFrame, DataSeries, DataAdapter, StreamConfig } from '@tradecanvas/commons';\nimport { Chart } from '../Chart.js';\n\nexport type GridLayout = '1x1' | '1x2' | '2x1' | '2x2' | '1x3' | '3x1' | '2x3' | '3x2';\n\nexport interface GridCellConfig {\n symbol?: string;\n timeframe?: TimeFrame;\n chartOptions?: Partial<ChartOptions>;\n}\n\nexport interface ChartGridOptions {\n layout?: GridLayout;\n theme?: ChartOptions['theme'];\n syncCrosshair?: boolean;\n syncTimeAxis?: boolean;\n gap?: number;\n cells?: GridCellConfig[];\n chartOptions?: Partial<ChartOptions>;\n}\n\ninterface GridCell {\n container: HTMLDivElement;\n chart: Chart;\n symbol: string;\n timeframe: TimeFrame;\n}\n\nconst LAYOUT_MAP: Record<GridLayout, { cols: number; rows: number }> = {\n '1x1': { cols: 1, rows: 1 },\n '1x2': { cols: 2, rows: 1 },\n '2x1': { cols: 1, rows: 2 },\n '2x2': { cols: 2, rows: 2 },\n '1x3': { cols: 3, rows: 1 },\n '3x1': { cols: 1, rows: 3 },\n '2x3': { cols: 3, rows: 2 },\n '3x2': { cols: 2, rows: 3 },\n};\n\nexport class ChartGrid {\n private root: HTMLDivElement;\n private cells: GridCell[] = [];\n private layout: GridLayout;\n private options: ChartGridOptions;\n private destroyed = false;\n private syncing = false;\n\n constructor(container: HTMLElement, options: ChartGridOptions = {}) {\n this.options = options;\n this.layout = options.layout ?? '2x2';\n\n this.root = document.createElement('div');\n this.root.style.cssText = 'display:grid;width:100%;height:100%;overflow:hidden;';\n container.appendChild(this.root);\n\n this.applyLayout();\n this.createCells();\n }\n\n private applyLayout(): void {\n const { cols, rows } = LAYOUT_MAP[this.layout];\n const gap = this.options.gap ?? 1;\n this.root.style.gridTemplateColumns = `repeat(${cols}, 1fr)`;\n this.root.style.gridTemplateRows = `repeat(${rows}, 1fr)`;\n this.root.style.gap = `${gap}px`;\n }\n\n private createCells(): void {\n const { cols, rows } = LAYOUT_MAP[this.layout];\n const count = cols * rows;\n for (let i = 0; i < count; i++) this.cells.push(this.createCell(i));\n }\n\n private createCell(i: number): GridCell {\n const cellConfig = this.options.cells?.[i] ?? {};\n\n const cellEl = document.createElement('div');\n cellEl.style.cssText = 'position:relative;overflow:hidden;min-width:0;min-height:0;';\n this.root.appendChild(cellEl);\n\n const chartOpts: ChartOptions = {\n chartType: 'candlestick',\n autoScale: true,\n features: {\n crosshair: true,\n keyboard: true,\n volume: true,\n legend: true,\n priceAxis: true,\n timeAxis: true,\n grid: true,\n },\n ...this.options.chartOptions,\n ...cellConfig.chartOptions,\n theme: this.options.theme,\n };\n\n const chart = new Chart(cellEl, chartOpts);\n\n const cell: GridCell = {\n container: cellEl,\n chart,\n symbol: cellConfig.symbol ?? `Chart ${i + 1}`,\n timeframe: cellConfig.timeframe ?? '5m',\n };\n\n // Charts can differ in symbol and timeframe, so the crosshair is linked by\n // time: the others show a vertical line on the bar containing that time.\n if (this.options.syncCrosshair !== false) {\n chart.on('crosshairMove', (e) => {\n const time = e.payload.bar?.time;\n if (time === undefined) return;\n for (const other of this.cells) {\n if (other.chart !== chart) other.chart.setCrosshairTime(time);\n }\n });\n chart.on('crosshairLeave', () => {\n for (const other of this.cells) {\n if (other.chart !== chart) other.chart.setCrosshairTime(null);\n }\n });\n }\n\n if (this.options.syncTimeAxis !== false) {\n chart.on('visibleRangeChange', (e) => {\n if (this.syncing) return;\n this.syncing = true;\n const { from, to } = e.payload;\n const srcData = chart.getData();\n if (srcData.length > 0 && from >= 0 && to < srcData.length) {\n const fromTime = srcData[from]?.time;\n const toTime = srcData[to]?.time;\n if (fromTime && toTime) {\n for (const other of this.cells) {\n if (other.chart !== chart) {\n other.chart.setVisibleRange(fromTime, toTime);\n }\n }\n }\n }\n this.syncing = false;\n });\n }\n\n return cell;\n }\n\n setLayout(layout: GridLayout): void {\n if (layout === this.layout) return;\n const oldCount = this.cells.length;\n const { cols, rows } = LAYOUT_MAP[layout];\n const newCount = cols * rows;\n\n if (newCount < oldCount) {\n for (let i = oldCount - 1; i >= newCount; i--) {\n const cell = this.cells[i];\n cell.chart.destroy();\n cell.container.remove();\n this.cells.pop();\n }\n }\n\n this.layout = layout;\n this.applyLayout();\n\n // New cells get the same options and linking as the first ones.\n for (let i = oldCount; i < newCount; i++) this.cells.push(this.createCell(i));\n }\n\n getChart(index: number): Chart | null {\n return this.cells[index]?.chart ?? null;\n }\n\n getCharts(): Chart[] {\n return this.cells.map(c => c.chart);\n }\n\n getCellCount(): number {\n return this.cells.length;\n }\n\n setData(index: number, data: DataSeries): void {\n this.cells[index]?.chart.setData(data);\n }\n\n setAllData(data: DataSeries): void {\n for (const cell of this.cells) {\n cell.chart.setData(data);\n }\n }\n\n async connectCell(index: number, config: StreamConfig): Promise<void> {\n const cell = this.cells[index];\n if (!cell) return;\n cell.symbol = config.symbol;\n cell.timeframe = config.timeframe;\n await cell.chart.connect(config);\n }\n\n async connectAll(adapter: DataAdapter, symbols: string[], timeframe: TimeFrame, historyLimit = 500): Promise<void> {\n const promises: Promise<void>[] = [];\n for (let i = 0; i < this.cells.length && i < symbols.length; i++) {\n promises.push(this.connectCell(i, {\n adapter,\n symbol: symbols[i],\n timeframe,\n historyLimit,\n }));\n }\n await Promise.all(promises);\n }\n\n setTheme(theme: Theme): void {\n for (const cell of this.cells) {\n cell.chart.setTheme(theme);\n }\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n for (const cell of this.cells) {\n cell.chart.destroy();\n cell.container.remove();\n }\n this.cells = [];\n this.root.remove();\n }\n}\n","import type { SparklineOptions, Theme } from '@tradecanvas/commons';\nimport { BaseFinanceChart, renderSparkline } from '@tradecanvas/core';\n\nexport class SparklineChart extends BaseFinanceChart {\n private options: SparklineOptions;\n\n constructor(container: HTMLElement, options: SparklineOptions) {\n super(container, options.theme);\n this.options = options;\n this.requestRender();\n }\n\n protected renderChart(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n theme: Theme,\n ): void {\n renderSparkline(ctx, width, height, this.options, theme);\n }\n\n update(data: number[]): void {\n this.options = { ...this.options, data };\n this.requestRender();\n }\n\n setOptions(opts: Partial<SparklineOptions>): void {\n this.options = { ...this.options, ...opts };\n this.requestRender();\n }\n}\n","import type { DepthChartOptions, DepthData, Theme } from '@tradecanvas/commons';\nimport { BaseFinanceChart, FinanceCrosshair, renderDepthChart } from '@tradecanvas/core';\n\nexport class DepthChart extends BaseFinanceChart {\n private options: DepthChartOptions;\n private crosshair: FinanceCrosshair | null = null;\n\n constructor(container: HTMLElement, options: DepthChartOptions) {\n super(container, options.theme);\n this.options = options;\n\n if (options.crosshair !== false) {\n this.crosshair = new FinanceCrosshair(this.canvas, () => this.requestRender());\n }\n\n this.requestRender();\n }\n\n protected renderChart(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n theme: Theme,\n ): void {\n const pos = this.crosshair?.getPosition() ?? null;\n renderDepthChart(ctx, width, height, this.options, theme, pos);\n }\n\n update(data: DepthData): void {\n this.options = { ...this.options, data };\n this.requestRender();\n }\n\n setOptions(opts: Partial<DepthChartOptions>): void {\n this.options = { ...this.options, ...opts };\n this.requestRender();\n }\n\n destroy(): void {\n this.crosshair?.destroy();\n super.destroy();\n }\n}\n","import type { EquityCurveOptions, EquityPoint, Theme } from '@tradecanvas/commons';\nimport { BaseFinanceChart, FinanceCrosshair, renderEquityCurve } from '@tradecanvas/core';\n\nexport class EquityCurveChart extends BaseFinanceChart {\n private options: EquityCurveOptions;\n private crosshair: FinanceCrosshair | null = null;\n\n constructor(container: HTMLElement, options: EquityCurveOptions) {\n super(container, options.theme);\n this.options = options;\n\n if (options.crosshair !== false) {\n this.crosshair = new FinanceCrosshair(this.canvas, () => this.requestRender());\n }\n\n this.requestRender();\n }\n\n protected renderChart(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n theme: Theme,\n ): void {\n const pos = this.crosshair?.getPosition() ?? null;\n renderEquityCurve(ctx, width, height, this.options, theme, pos);\n }\n\n update(data: EquityPoint[], benchmark?: EquityPoint[]): void {\n this.options = { ...this.options, data };\n if (benchmark !== undefined) {\n this.options = { ...this.options, benchmark };\n }\n this.requestRender();\n }\n\n setOptions(opts: Partial<EquityCurveOptions>): void {\n this.options = { ...this.options, ...opts };\n this.requestRender();\n }\n\n destroy(): void {\n this.crosshair?.destroy();\n super.destroy();\n }\n}\n","import type { HeatmapCell, HeatmapOptions, Theme } from '@tradecanvas/commons';\nimport {\n BaseFinanceChart,\n FinanceCrosshair,\n layoutUniformGrid,\n layoutSquarifiedTreemap,\n renderHeatmap,\n} from '@tradecanvas/core';\nimport type { LayoutRect } from '@tradecanvas/core';\n\nexport class HeatmapChart extends BaseFinanceChart {\n private options: HeatmapOptions;\n private crosshair: FinanceCrosshair | null = null;\n private cachedRects: LayoutRect[] = [];\n private currentData: HeatmapCell[] = [];\n private lastLayoutWidth = 0;\n private lastLayoutHeight = 0;\n private handleClick: ((e: MouseEvent) => void) | null = null;\n\n constructor(container: HTMLElement, options: HeatmapOptions) {\n super(container, options.theme);\n this.options = options;\n this.currentData = options.data ?? [];\n\n if (options.crosshair !== false) {\n this.crosshair = new FinanceCrosshair(this.canvas, () => this.requestRender());\n }\n\n if (options.onCellClick) {\n this.handleClick = (e: MouseEvent) => {\n const rect = this.canvas.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n this.onCanvasClick(x, y);\n };\n this.canvas.addEventListener('click', this.handleClick);\n }\n\n this.recomputeLayout();\n this.requestRender();\n }\n\n private recomputeLayout(): void {\n const bounds = { x: 0, y: 0, width: this.width, height: this.height };\n const padding = this.options.cellPadding ?? 2;\n this.lastLayoutWidth = this.width;\n this.lastLayoutHeight = this.height;\n\n if (this.options.weighted) {\n const weighted = this.currentData.map(c => ({\n id: c.id,\n weight: c.weight ?? (Math.abs(c.value) || 1),\n }));\n this.cachedRects = layoutSquarifiedTreemap(weighted, bounds, padding);\n } else {\n this.cachedRects = layoutUniformGrid(\n this.currentData.map(c => ({ id: c.id })),\n bounds,\n padding,\n );\n }\n }\n\n private onCanvasClick(x: number, y: number): void {\n if (!this.options.onCellClick) return;\n\n for (const lr of this.cachedRects) {\n const r = lr.rect;\n if (x >= r.x && x <= r.x + r.width && y >= r.y && y <= r.y + r.height) {\n const cell = this.currentData.find(c => c.id === lr.id);\n if (cell) this.options.onCellClick(cell);\n return;\n }\n }\n }\n\n protected renderChart(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n theme: Theme,\n ): void {\n if (width !== this.lastLayoutWidth || height !== this.lastLayoutHeight) {\n this.recomputeLayout();\n }\n\n const pos = this.crosshair?.getPosition() ?? null;\n renderHeatmap(ctx, width, height, this.currentData, this.cachedRects, this.options, theme, pos);\n }\n\n update(data: HeatmapCell[]): void {\n this.currentData = data;\n this.options = { ...this.options, data };\n this.recomputeLayout();\n this.requestRender();\n }\n\n setOptions(opts: Partial<HeatmapOptions>): void {\n this.options = { ...this.options, ...opts };\n if (opts.data) {\n this.currentData = opts.data;\n }\n this.recomputeLayout();\n this.requestRender();\n }\n\n destroy(): void {\n this.crosshair?.destroy();\n if (this.handleClick) {\n this.canvas.removeEventListener('click', this.handleClick);\n }\n super.destroy();\n }\n}\n","import type { Theme, WaterfallBar, WaterfallOptions } from '@tradecanvas/commons';\nimport { BaseFinanceChart, FinanceCrosshair, renderWaterfall } from '@tradecanvas/core';\n\nexport class WaterfallChart extends BaseFinanceChart {\n private options: WaterfallOptions;\n private crosshair: FinanceCrosshair | null = null;\n\n constructor(container: HTMLElement, options: WaterfallOptions) {\n super(container, options.theme);\n this.options = options;\n\n if (options.crosshair !== false) {\n this.crosshair = new FinanceCrosshair(this.canvas, () => this.requestRender());\n }\n\n this.requestRender();\n }\n\n protected renderChart(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n theme: Theme,\n ): void {\n const pos = this.crosshair?.getPosition() ?? null;\n renderWaterfall(ctx, width, height, this.options, theme, pos);\n }\n\n update(data: WaterfallBar[]): void {\n this.options = { ...this.options, data };\n this.requestRender();\n }\n\n setOptions(opts: Partial<WaterfallOptions>): void {\n this.options = { ...this.options, ...opts };\n this.requestRender();\n }\n\n destroy(): void {\n this.crosshair?.destroy();\n super.destroy();\n }\n}\n","import type { GaugeOptions, Theme } from '@tradecanvas/commons';\nimport { BaseFinanceChart, renderGauge } from '@tradecanvas/core';\n\nconst DEFAULT_ANIMATION_MS = 500;\n\nfunction easeOutCubic(t: number): number {\n const inv = 1 - t;\n return 1 - inv * inv * inv;\n}\n\nexport class GaugeChart extends BaseFinanceChart {\n private options: GaugeOptions;\n private currentValue: number;\n private targetValue: number;\n private animationStart: number | null = null;\n private animationFrom = 0;\n private animationFrameId: number | null = null;\n\n constructor(container: HTMLElement, options: GaugeOptions) {\n super(container, options.theme);\n this.options = options;\n this.currentValue = options.value;\n this.targetValue = options.value;\n this.requestRender();\n }\n\n protected renderChart(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n theme: Theme,\n ): void {\n renderGauge(ctx, width, height, this.options, theme, this.currentValue);\n }\n\n setValue(value: number): void {\n const animate = this.options.animate !== false;\n if (!animate) {\n this.cancelAnimation();\n this.currentValue = value;\n this.targetValue = value;\n this.options = { ...this.options, value };\n this.requestRender();\n return;\n }\n\n this.targetValue = value;\n this.animationFrom = this.currentValue;\n this.animationStart = performance.now();\n this.options = { ...this.options, value };\n this.startAnimationLoop();\n }\n\n setOptions(opts: Partial<GaugeOptions>): void {\n const next = { ...this.options, ...opts };\n // If `value` is part of the partial, route through animation path\n if (opts.value !== undefined && opts.value !== this.targetValue) {\n this.options = next;\n this.setValue(opts.value);\n return;\n }\n this.options = next;\n this.requestRender();\n }\n\n private startAnimationLoop(): void {\n if (this.animationFrameId !== null) return;\n const step = (): void => {\n this.animationFrameId = null;\n if (this.animationStart === null) return;\n\n const duration = this.options.animationDuration ?? DEFAULT_ANIMATION_MS;\n const elapsed = performance.now() - this.animationStart;\n const t = Math.min(1, elapsed / Math.max(1, duration));\n const eased = easeOutCubic(t);\n this.currentValue = this.animationFrom + (this.targetValue - this.animationFrom) * eased;\n\n this.requestRender();\n\n if (t < 1) {\n this.animationFrameId = requestAnimationFrame(step);\n } else {\n this.currentValue = this.targetValue;\n this.animationStart = null;\n }\n };\n this.animationFrameId = requestAnimationFrame(step);\n }\n\n private cancelAnimation(): void {\n if (this.animationFrameId !== null) {\n cancelAnimationFrame(this.animationFrameId);\n this.animationFrameId = null;\n }\n this.animationStart = null;\n }\n\n destroy(): void {\n this.cancelAnimation();\n super.destroy();\n }\n}\n","import type { EquityPoint, HeatmapCell } from '@tradecanvas/commons';\nimport { timeframeBucketStart } from '@tradecanvas/commons';\n\n/** Minimal equity sample shape — structurally satisfied by analytics' EquityPoint. */\nexport interface EquitySample {\n time: number;\n equity: number;\n}\n\n/** Subset of analytics RiskMetrics needed to render the stats strip. */\nexport interface RiskMetricsLike {\n totalReturnPct: number;\n cagr: number;\n sharpe: number;\n sortino: number;\n maxDrawdownPct: number;\n winRate: number;\n profitFactor: number;\n trades: number;\n}\n\nexport interface DashboardStat {\n label: string;\n value: string;\n tone: 'positive' | 'negative' | 'neutral';\n}\n\nconst MONTH_LABELS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n/** Map an analytics equity curve to the finance EquityCurveChart point shape. */\nexport function toEquityPoints(curve: ReadonlyArray<EquitySample>): EquityPoint[] {\n return curve.map((p) => ({ time: p.time, value: p.equity }));\n}\n\n/**\n * Underwater drawdown curve as a percentage (<= 0). Each point is the equity's\n * shortfall from the running peak: `equity / peak - 1`, expressed in percent.\n */\nexport function computeDrawdownCurve(curve: ReadonlyArray<EquitySample>): EquityPoint[] {\n let peak = -Infinity;\n return curve.map((p) => {\n if (p.equity > peak) peak = p.equity;\n const dd = peak > 0 ? (p.equity / peak - 1) * 100 : 0;\n return { time: p.time, value: dd };\n });\n}\n\n/**\n * Calendar-month returns as heatmap cells. Each month's return is chained off\n * the prior month's closing equity (the first month chains off its own opening\n * equity), so the series reads as sequential monthly performance. `group` is\n * the year and `value` is the return in percent.\n */\nexport function computeMonthlyReturns(curve: ReadonlyArray<EquitySample>): HeatmapCell[] {\n if (curve.length === 0) return [];\n\n // Collapse the curve to one closing equity per calendar month, in order.\n const months: { key: number; close: number }[] = [];\n for (const p of curve) {\n const key = timeframeBucketStart(p.time, '1M');\n const last = months[months.length - 1];\n if (last && last.key === key) {\n last.close = p.equity;\n } else {\n months.push({ key, close: p.equity });\n }\n }\n\n let prevClose = curve[0].equity;\n const cells: HeatmapCell[] = [];\n for (const m of months) {\n const base = prevClose === 0 ? 1 : prevClose;\n const returnPct = (m.close / base - 1) * 100;\n prevClose = m.close;\n const d = new Date(m.key);\n const year = d.getUTCFullYear();\n const month = d.getUTCMonth();\n cells.push({\n id: `${year}-${String(month + 1).padStart(2, '0')}`,\n label: MONTH_LABELS[month],\n group: String(year),\n value: returnPct,\n });\n }\n return cells;\n}\n\nfunction pct(value: number): string {\n const sign = value > 0 ? '+' : '';\n return `${sign}${value.toFixed(2)}%`;\n}\n\nfunction tone(value: number): DashboardStat['tone'] {\n if (value > 0) return 'positive';\n if (value < 0) return 'negative';\n return 'neutral';\n}\n\n/** The headline stats rendered as cards above the charts. */\nexport function selectKeyStats(metrics: RiskMetricsLike): DashboardStat[] {\n return [\n { label: 'Total Return', value: pct(metrics.totalReturnPct), tone: tone(metrics.totalReturnPct) },\n { label: 'CAGR', value: pct(metrics.cagr * 100), tone: tone(metrics.cagr) },\n { label: 'Sharpe', value: metrics.sharpe.toFixed(2), tone: tone(metrics.sharpe) },\n { label: 'Sortino', value: metrics.sortino.toFixed(2), tone: tone(metrics.sortino) },\n { label: 'Max Drawdown', value: pct(metrics.maxDrawdownPct), tone: 'negative' },\n { label: 'Win Rate', value: `${(metrics.winRate * 100).toFixed(1)}%`, tone: 'neutral' },\n { label: 'Profit Factor', value: Number.isFinite(metrics.profitFactor) ? metrics.profitFactor.toFixed(2) : '∞', tone: tone(metrics.profitFactor - 1) },\n { label: 'Trades', value: String(metrics.trades), tone: 'neutral' },\n ];\n}\n","import type { Theme, ThemeName } from '@tradecanvas/commons';\nimport { DARK_THEME, LIGHT_THEME } from '@tradecanvas/commons';\nimport { EquityCurveChart } from './EquityCurveChart.js';\nimport { HeatmapChart } from './HeatmapChart.js';\nimport {\n toEquityPoints,\n computeDrawdownCurve,\n computeMonthlyReturns,\n selectKeyStats,\n type EquitySample,\n type RiskMetricsLike,\n type DashboardStat,\n} from './performanceData.js';\n\n/** Structurally satisfied by analytics' `BacktestResult`. */\nexport interface PerformanceResult {\n equityCurve: ReadonlyArray<EquitySample>;\n metrics: RiskMetricsLike;\n}\n\nexport interface PerformanceDashboardOptions {\n result: PerformanceResult;\n theme?: ThemeName | Theme;\n title?: string;\n subtitle?: string;\n}\n\nfunction resolveTheme(theme?: ThemeName | Theme): Theme {\n if (!theme || theme === 'dark') return DARK_THEME;\n if (theme === 'light') return LIGHT_THEME;\n return theme as Theme;\n}\n\n/**\n * A composed strategy-performance dashboard: a headline stats strip, an equity\n * curve, an underwater drawdown panel, and a monthly-returns heatmap. Built\n * entirely from a backtest `result`, reusing the finance chart renderers.\n *\n * ```ts\n * const result = new Backtester(opts).run(bars, strategy);\n * const dash = new PerformanceDashboard(el, { result, theme: 'dark' });\n * ```\n */\nexport class PerformanceDashboard {\n private options: PerformanceDashboardOptions;\n private theme: Theme;\n private root: HTMLDivElement;\n private equityChart: EquityCurveChart | null = null;\n private drawdownChart: EquityCurveChart | null = null;\n private heatmap: HeatmapChart | null = null;\n\n constructor(container: HTMLElement, options: PerformanceDashboardOptions) {\n this.options = options;\n this.theme = resolveTheme(options.theme);\n this.root = document.createElement('div');\n this.build();\n container.appendChild(this.root);\n }\n\n private build(): void {\n const t = this.theme;\n const { result, title, subtitle } = this.options;\n const surface = this.panelBackground();\n const border = t.grid;\n\n this.root.style.cssText = [\n 'display:flex',\n 'flex-direction:column',\n 'gap:14px',\n 'width:100%',\n 'box-sizing:border-box',\n 'padding:16px',\n `background:${t.background}`,\n `color:${t.text}`,\n `font-family:${t.font.family}`,\n ].join(';');\n\n if (title || subtitle) {\n const header = document.createElement('div');\n if (title) {\n const h = document.createElement('div');\n h.textContent = title;\n h.style.cssText = `font-size:${t.font.sizeLarge}px;font-weight:600;letter-spacing:-0.01em;`;\n header.appendChild(h);\n }\n if (subtitle) {\n const s = document.createElement('div');\n s.textContent = subtitle;\n s.style.cssText = `font-size:${t.font.sizeSmall}px;color:${t.textSecondary};margin-top:2px;`;\n header.appendChild(s);\n }\n this.root.appendChild(header);\n }\n\n // Stats strip\n this.root.appendChild(this.buildStatsStrip(selectKeyStats(result.metrics), surface, border));\n\n // Chart grid\n const grid = document.createElement('div');\n grid.style.cssText = [\n 'display:grid',\n 'grid-template-columns:repeat(auto-fit, minmax(280px, 1fr))',\n 'grid-auto-rows:220px',\n 'gap:14px',\n ].join(';');\n this.root.appendChild(grid);\n\n const equityPanel = this.buildPanel('Equity Curve', surface, border);\n equityPanel.wrap.style.gridColumn = '1 / -1';\n grid.appendChild(equityPanel.wrap);\n this.equityChart = new EquityCurveChart(equityPanel.body, {\n data: toEquityPoints(result.equityCurve),\n theme: t,\n lineColor: t.candleUp,\n fillArea: true,\n crosshair: true,\n });\n\n const ddPanel = this.buildPanel('Drawdown', surface, border);\n grid.appendChild(ddPanel.wrap);\n this.drawdownChart = new EquityCurveChart(ddPanel.body, {\n data: computeDrawdownCurve(result.equityCurve),\n theme: t,\n lineColor: t.candleDown,\n fillArea: true,\n crosshair: true,\n valueFormat: (v) => `${v.toFixed(1)}%`,\n });\n\n const monthlyCells = computeMonthlyReturns(result.equityCurve);\n const heatPanel = this.buildPanel('Monthly Returns', surface, border);\n grid.appendChild(heatPanel.wrap);\n this.heatmap = new HeatmapChart(heatPanel.body, {\n data: monthlyCells,\n theme: t,\n showValues: true,\n valueFormat: (v) => `${v >= 0 ? '+' : ''}${v.toFixed(1)}`,\n colorScale: { negative: t.candleDown, zero: surface, positive: t.candleUp },\n });\n }\n\n private buildStatsStrip(stats: DashboardStat[], surface: string, border: string): HTMLDivElement {\n const strip = document.createElement('div');\n strip.style.cssText = [\n 'display:grid',\n 'grid-template-columns:repeat(auto-fit, minmax(120px, 1fr))',\n 'gap:10px',\n ].join(';');\n\n const t = this.theme;\n for (const stat of stats) {\n const card = document.createElement('div');\n card.style.cssText = [\n `background:${surface}`,\n `border:1px solid ${border}`,\n 'border-radius:10px',\n 'padding:10px 12px',\n 'display:flex',\n 'flex-direction:column',\n 'gap:4px',\n ].join(';');\n\n const label = document.createElement('div');\n label.textContent = stat.label;\n label.style.cssText = `font-size:${t.font.sizeSmall}px;color:${t.textSecondary};text-transform:uppercase;letter-spacing:0.04em;`;\n\n const value = document.createElement('div');\n value.textContent = stat.value;\n const color = stat.tone === 'positive' ? t.candleUp : stat.tone === 'negative' ? t.candleDown : t.text;\n value.style.cssText = `font-size:${t.font.sizeLarge}px;font-weight:600;color:${color};font-variant-numeric:tabular-nums;`;\n\n card.appendChild(label);\n card.appendChild(value);\n strip.appendChild(card);\n }\n return strip;\n }\n\n private buildPanel(title: string, surface: string, border: string): { wrap: HTMLDivElement; body: HTMLDivElement } {\n const t = this.theme;\n const wrap = document.createElement('div');\n wrap.style.cssText = [\n `background:${surface}`,\n `border:1px solid ${border}`,\n 'border-radius:10px',\n 'overflow:hidden',\n 'display:flex',\n 'flex-direction:column',\n ].join(';');\n\n const head = document.createElement('div');\n head.textContent = title;\n head.style.cssText = [\n `font-size:${t.font.sizeSmall}px`,\n 'font-weight:600',\n `color:${t.textSecondary}`,\n 'padding:8px 12px',\n `border-bottom:1px solid ${border}`,\n 'text-transform:uppercase',\n 'letter-spacing:0.04em',\n ].join(';');\n\n const body = document.createElement('div');\n body.style.cssText = 'flex:1;min-height:0;position:relative;';\n\n wrap.appendChild(head);\n wrap.appendChild(body);\n return { wrap, body };\n }\n\n /** A subtle surface tint distinct from the page background, per theme. */\n private panelBackground(): string {\n return this.theme.name === 'light' ? 'rgba(0,0,0,0.02)' : 'rgba(255,255,255,0.03)';\n }\n\n /** Replace the displayed result and re-render all panels. */\n update(result: PerformanceResult): void {\n this.options = { ...this.options, result };\n this.destroyCharts();\n this.root.replaceChildren();\n this.build();\n }\n\n setTheme(theme: ThemeName | Theme): void {\n this.theme = resolveTheme(theme);\n this.options = { ...this.options, theme };\n this.destroyCharts();\n this.root.replaceChildren();\n this.build();\n }\n\n private destroyCharts(): void {\n this.equityChart?.destroy();\n this.drawdownChart?.destroy();\n this.heatmap?.destroy();\n this.equityChart = null;\n this.drawdownChart = null;\n this.heatmap = null;\n }\n\n destroy(): void {\n this.destroyCharts();\n this.root.remove();\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../src/grid/ChartGrid.ts","../src/finance/SparklineChart.ts","../src/finance/DepthChart.ts","../src/finance/EquityCurveChart.ts","../src/finance/HeatmapChart.ts","../src/finance/WaterfallChart.ts","../src/finance/GaugeChart.ts","../src/finance/performanceData.ts","../src/finance/PerformanceDashboard.ts"],"sourcesContent":["import type { ChartOptions, Theme, TimeFrame, DataSeries, DataAdapter, StreamConfig } from '@tradecanvas/commons';\r\nimport { Chart } from '../Chart.js';\r\n\r\nexport type GridLayout = '1x1' | '1x2' | '2x1' | '2x2' | '1x3' | '3x1' | '2x3' | '3x2';\r\n\r\nexport interface GridCellConfig {\r\n symbol?: string;\r\n timeframe?: TimeFrame;\r\n chartOptions?: Partial<ChartOptions>;\r\n}\r\n\r\nexport interface ChartGridOptions {\r\n layout?: GridLayout;\r\n theme?: ChartOptions['theme'];\r\n syncCrosshair?: boolean;\r\n syncTimeAxis?: boolean;\r\n gap?: number;\r\n cells?: GridCellConfig[];\r\n chartOptions?: Partial<ChartOptions>;\r\n}\r\n\r\ninterface GridCell {\r\n container: HTMLDivElement;\r\n chart: Chart;\r\n symbol: string;\r\n timeframe: TimeFrame;\r\n}\r\n\r\nconst LAYOUT_MAP: Record<GridLayout, { cols: number; rows: number }> = {\r\n '1x1': { cols: 1, rows: 1 },\r\n '1x2': { cols: 2, rows: 1 },\r\n '2x1': { cols: 1, rows: 2 },\r\n '2x2': { cols: 2, rows: 2 },\r\n '1x3': { cols: 3, rows: 1 },\r\n '3x1': { cols: 1, rows: 3 },\r\n '2x3': { cols: 3, rows: 2 },\r\n '3x2': { cols: 2, rows: 3 },\r\n};\r\n\r\nexport class ChartGrid {\r\n private root: HTMLDivElement;\r\n private cells: GridCell[] = [];\r\n private layout: GridLayout;\r\n private options: ChartGridOptions;\r\n private destroyed = false;\r\n private syncing = false;\r\n\r\n constructor(container: HTMLElement, options: ChartGridOptions = {}) {\r\n this.options = options;\r\n this.layout = options.layout ?? '2x2';\r\n\r\n this.root = document.createElement('div');\r\n this.root.style.cssText = 'display:grid;width:100%;height:100%;overflow:hidden;';\r\n container.appendChild(this.root);\r\n\r\n this.applyLayout();\r\n this.createCells();\r\n }\r\n\r\n private applyLayout(): void {\r\n const { cols, rows } = LAYOUT_MAP[this.layout];\r\n const gap = this.options.gap ?? 1;\r\n this.root.style.gridTemplateColumns = `repeat(${cols}, 1fr)`;\r\n this.root.style.gridTemplateRows = `repeat(${rows}, 1fr)`;\r\n this.root.style.gap = `${gap}px`;\r\n }\r\n\r\n private createCells(): void {\r\n const { cols, rows } = LAYOUT_MAP[this.layout];\r\n const count = cols * rows;\r\n for (let i = 0; i < count; i++) this.cells.push(this.createCell(i));\r\n }\r\n\r\n private createCell(i: number): GridCell {\r\n const cellConfig = this.options.cells?.[i] ?? {};\r\n\r\n const cellEl = document.createElement('div');\r\n cellEl.style.cssText = 'position:relative;overflow:hidden;min-width:0;min-height:0;';\r\n this.root.appendChild(cellEl);\r\n\r\n const chartOpts: ChartOptions = {\r\n chartType: 'candlestick',\r\n autoScale: true,\r\n features: {\r\n crosshair: true,\r\n keyboard: true,\r\n volume: true,\r\n legend: true,\r\n priceAxis: true,\r\n timeAxis: true,\r\n grid: true,\r\n },\r\n ...this.options.chartOptions,\r\n ...cellConfig.chartOptions,\r\n theme: this.options.theme,\r\n };\r\n\r\n const chart = new Chart(cellEl, chartOpts);\r\n\r\n const cell: GridCell = {\r\n container: cellEl,\r\n chart,\r\n symbol: cellConfig.symbol ?? `Chart ${i + 1}`,\r\n timeframe: cellConfig.timeframe ?? '5m',\r\n };\r\n\r\n // Charts can differ in symbol and timeframe, so the crosshair is linked by\r\n // time: the others show a vertical line on the bar containing that time.\r\n if (this.options.syncCrosshair !== false) {\r\n chart.on('crosshairMove', (e) => {\r\n const time = e.payload.bar?.time;\r\n if (time === undefined) return;\r\n for (const other of this.cells) {\r\n if (other.chart !== chart) other.chart.setCrosshairTime(time);\r\n }\r\n });\r\n chart.on('crosshairLeave', () => {\r\n for (const other of this.cells) {\r\n if (other.chart !== chart) other.chart.setCrosshairTime(null);\r\n }\r\n });\r\n }\r\n\r\n if (this.options.syncTimeAxis !== false) {\r\n chart.on('visibleRangeChange', (e) => {\r\n if (this.syncing) return;\r\n this.syncing = true;\r\n const { from, to } = e.payload;\r\n const srcData = chart.getData();\r\n if (srcData.length > 0 && from >= 0 && to < srcData.length) {\r\n const fromTime = srcData[from]?.time;\r\n const toTime = srcData[to]?.time;\r\n if (fromTime && toTime) {\r\n for (const other of this.cells) {\r\n if (other.chart !== chart) {\r\n other.chart.setVisibleRange(fromTime, toTime);\r\n }\r\n }\r\n }\r\n }\r\n this.syncing = false;\r\n });\r\n }\r\n\r\n return cell;\r\n }\r\n\r\n setLayout(layout: GridLayout): void {\r\n if (layout === this.layout) return;\r\n const oldCount = this.cells.length;\r\n const { cols, rows } = LAYOUT_MAP[layout];\r\n const newCount = cols * rows;\r\n\r\n if (newCount < oldCount) {\r\n for (let i = oldCount - 1; i >= newCount; i--) {\r\n const cell = this.cells[i];\r\n cell.chart.destroy();\r\n cell.container.remove();\r\n this.cells.pop();\r\n }\r\n }\r\n\r\n this.layout = layout;\r\n this.applyLayout();\r\n\r\n // New cells get the same options and linking as the first ones.\r\n for (let i = oldCount; i < newCount; i++) this.cells.push(this.createCell(i));\r\n }\r\n\r\n getChart(index: number): Chart | null {\r\n return this.cells[index]?.chart ?? null;\r\n }\r\n\r\n getCharts(): Chart[] {\r\n return this.cells.map(c => c.chart);\r\n }\r\n\r\n getCellCount(): number {\r\n return this.cells.length;\r\n }\r\n\r\n setData(index: number, data: DataSeries): void {\r\n this.cells[index]?.chart.setData(data);\r\n }\r\n\r\n setAllData(data: DataSeries): void {\r\n for (const cell of this.cells) {\r\n cell.chart.setData(data);\r\n }\r\n }\r\n\r\n async connectCell(index: number, config: StreamConfig): Promise<void> {\r\n const cell = this.cells[index];\r\n if (!cell) return;\r\n cell.symbol = config.symbol;\r\n cell.timeframe = config.timeframe;\r\n await cell.chart.connect(config);\r\n }\r\n\r\n /**\r\n * Connect each chart to a symbol. An adapter keeps one stream, so pass a\r\n * function that makes one per chart (`() => new BinanceAdapter()`); a single\r\n * adapter object serves one chart only.\r\n */\r\n async connectAll(\r\n adapter: DataAdapter | ((symbol: string, index: number) => DataAdapter),\r\n symbols: string[],\r\n timeframe: TimeFrame,\r\n historyLimit = 500,\r\n ): Promise<void> {\r\n const promises: Promise<void>[] = [];\r\n for (let i = 0; i < this.cells.length && i < symbols.length; i++) {\r\n promises.push(this.connectCell(i, {\r\n adapter: typeof adapter === 'function' ? adapter(symbols[i], i) : adapter,\r\n symbol: symbols[i],\r\n timeframe,\r\n historyLimit,\r\n }));\r\n }\r\n await Promise.all(promises);\r\n }\r\n\r\n setTheme(theme: Theme): void {\r\n for (const cell of this.cells) {\r\n cell.chart.setTheme(theme);\r\n }\r\n }\r\n\r\n destroy(): void {\r\n if (this.destroyed) return;\r\n this.destroyed = true;\r\n for (const cell of this.cells) {\r\n cell.chart.destroy();\r\n cell.container.remove();\r\n }\r\n this.cells = [];\r\n this.root.remove();\r\n }\r\n}\r\n","import type { SparklineOptions, Theme } from '@tradecanvas/commons';\r\nimport { BaseFinanceChart, renderSparkline } from '@tradecanvas/core';\r\n\r\nexport class SparklineChart extends BaseFinanceChart {\r\n private options: SparklineOptions;\r\n\r\n constructor(container: HTMLElement, options: SparklineOptions) {\r\n super(container, options.theme);\r\n this.options = options;\r\n this.requestRender();\r\n }\r\n\r\n protected renderChart(\r\n ctx: CanvasRenderingContext2D,\r\n width: number,\r\n height: number,\r\n theme: Theme,\r\n ): void {\r\n renderSparkline(ctx, width, height, this.options, theme);\r\n }\r\n\r\n update(data: number[]): void {\r\n this.options = { ...this.options, data };\r\n this.requestRender();\r\n }\r\n\r\n setOptions(opts: Partial<SparklineOptions>): void {\r\n this.options = { ...this.options, ...opts };\r\n this.requestRender();\r\n }\r\n}\r\n","import type { DepthChartOptions, DepthData, Theme } from '@tradecanvas/commons';\r\nimport { BaseFinanceChart, FinanceCrosshair, renderDepthChart } from '@tradecanvas/core';\r\n\r\nexport class DepthChart extends BaseFinanceChart {\r\n private options: DepthChartOptions;\r\n private crosshair: FinanceCrosshair | null = null;\r\n\r\n constructor(container: HTMLElement, options: DepthChartOptions) {\r\n super(container, options.theme);\r\n this.options = options;\r\n\r\n if (options.crosshair !== false) {\r\n this.crosshair = new FinanceCrosshair(this.canvas, () => this.requestRender());\r\n }\r\n\r\n this.requestRender();\r\n }\r\n\r\n protected renderChart(\r\n ctx: CanvasRenderingContext2D,\r\n width: number,\r\n height: number,\r\n theme: Theme,\r\n ): void {\r\n const pos = this.crosshair?.getPosition() ?? null;\r\n renderDepthChart(ctx, width, height, this.options, theme, pos);\r\n }\r\n\r\n update(data: DepthData): void {\r\n this.options = { ...this.options, data };\r\n this.requestRender();\r\n }\r\n\r\n setOptions(opts: Partial<DepthChartOptions>): void {\r\n this.options = { ...this.options, ...opts };\r\n this.requestRender();\r\n }\r\n\r\n destroy(): void {\r\n this.crosshair?.destroy();\r\n super.destroy();\r\n }\r\n}\r\n","import type { EquityCurveOptions, EquityPoint, Theme } from '@tradecanvas/commons';\r\nimport { BaseFinanceChart, FinanceCrosshair, renderEquityCurve } from '@tradecanvas/core';\r\n\r\nexport class EquityCurveChart extends BaseFinanceChart {\r\n private options: EquityCurveOptions;\r\n private crosshair: FinanceCrosshair | null = null;\r\n\r\n constructor(container: HTMLElement, options: EquityCurveOptions) {\r\n super(container, options.theme);\r\n this.options = options;\r\n\r\n if (options.crosshair !== false) {\r\n this.crosshair = new FinanceCrosshair(this.canvas, () => this.requestRender());\r\n }\r\n\r\n this.requestRender();\r\n }\r\n\r\n protected renderChart(\r\n ctx: CanvasRenderingContext2D,\r\n width: number,\r\n height: number,\r\n theme: Theme,\r\n ): void {\r\n const pos = this.crosshair?.getPosition() ?? null;\r\n renderEquityCurve(ctx, width, height, this.options, theme, pos);\r\n }\r\n\r\n update(data: EquityPoint[], benchmark?: EquityPoint[]): void {\r\n this.options = { ...this.options, data };\r\n if (benchmark !== undefined) {\r\n this.options = { ...this.options, benchmark };\r\n }\r\n this.requestRender();\r\n }\r\n\r\n setOptions(opts: Partial<EquityCurveOptions>): void {\r\n this.options = { ...this.options, ...opts };\r\n this.requestRender();\r\n }\r\n\r\n destroy(): void {\r\n this.crosshair?.destroy();\r\n super.destroy();\r\n }\r\n}\r\n","import type { HeatmapCell, HeatmapOptions, Theme } from '@tradecanvas/commons';\r\nimport {\r\n BaseFinanceChart,\r\n FinanceCrosshair,\r\n layoutUniformGrid,\r\n layoutSquarifiedTreemap,\r\n renderHeatmap,\r\n} from '@tradecanvas/core';\r\nimport type { LayoutRect } from '@tradecanvas/core';\r\n\r\nexport class HeatmapChart extends BaseFinanceChart {\r\n private options: HeatmapOptions;\r\n private crosshair: FinanceCrosshair | null = null;\r\n private cachedRects: LayoutRect[] = [];\r\n private currentData: HeatmapCell[] = [];\r\n private lastLayoutWidth = 0;\r\n private lastLayoutHeight = 0;\r\n private handleClick: ((e: MouseEvent) => void) | null = null;\r\n\r\n constructor(container: HTMLElement, options: HeatmapOptions) {\r\n super(container, options.theme);\r\n this.options = options;\r\n this.currentData = options.data ?? [];\r\n\r\n if (options.crosshair !== false) {\r\n this.crosshair = new FinanceCrosshair(this.canvas, () => this.requestRender());\r\n }\r\n\r\n if (options.onCellClick) {\r\n this.handleClick = (e: MouseEvent) => {\r\n const rect = this.canvas.getBoundingClientRect();\r\n const x = e.clientX - rect.left;\r\n const y = e.clientY - rect.top;\r\n this.onCanvasClick(x, y);\r\n };\r\n this.canvas.addEventListener('click', this.handleClick);\r\n }\r\n\r\n this.recomputeLayout();\r\n this.requestRender();\r\n }\r\n\r\n private recomputeLayout(): void {\r\n const bounds = { x: 0, y: 0, width: this.width, height: this.height };\r\n const padding = this.options.cellPadding ?? 2;\r\n this.lastLayoutWidth = this.width;\r\n this.lastLayoutHeight = this.height;\r\n\r\n if (this.options.weighted) {\r\n const weighted = this.currentData.map(c => ({\r\n id: c.id,\r\n weight: c.weight ?? (Math.abs(c.value) || 1),\r\n }));\r\n this.cachedRects = layoutSquarifiedTreemap(weighted, bounds, padding);\r\n } else {\r\n this.cachedRects = layoutUniformGrid(\r\n this.currentData.map(c => ({ id: c.id })),\r\n bounds,\r\n padding,\r\n );\r\n }\r\n }\r\n\r\n private onCanvasClick(x: number, y: number): void {\r\n if (!this.options.onCellClick) return;\r\n\r\n for (const lr of this.cachedRects) {\r\n const r = lr.rect;\r\n if (x >= r.x && x <= r.x + r.width && y >= r.y && y <= r.y + r.height) {\r\n const cell = this.currentData.find(c => c.id === lr.id);\r\n if (cell) this.options.onCellClick(cell);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n protected renderChart(\r\n ctx: CanvasRenderingContext2D,\r\n width: number,\r\n height: number,\r\n theme: Theme,\r\n ): void {\r\n if (width !== this.lastLayoutWidth || height !== this.lastLayoutHeight) {\r\n this.recomputeLayout();\r\n }\r\n\r\n const pos = this.crosshair?.getPosition() ?? null;\r\n renderHeatmap(ctx, width, height, this.currentData, this.cachedRects, this.options, theme, pos);\r\n }\r\n\r\n update(data: HeatmapCell[]): void {\r\n this.currentData = data;\r\n this.options = { ...this.options, data };\r\n this.recomputeLayout();\r\n this.requestRender();\r\n }\r\n\r\n setOptions(opts: Partial<HeatmapOptions>): void {\r\n this.options = { ...this.options, ...opts };\r\n if (opts.data) {\r\n this.currentData = opts.data;\r\n }\r\n this.recomputeLayout();\r\n this.requestRender();\r\n }\r\n\r\n destroy(): void {\r\n this.crosshair?.destroy();\r\n if (this.handleClick) {\r\n this.canvas.removeEventListener('click', this.handleClick);\r\n }\r\n super.destroy();\r\n }\r\n}\r\n","import type { Theme, WaterfallBar, WaterfallOptions } from '@tradecanvas/commons';\r\nimport { BaseFinanceChart, FinanceCrosshair, renderWaterfall } from '@tradecanvas/core';\r\n\r\nexport class WaterfallChart extends BaseFinanceChart {\r\n private options: WaterfallOptions;\r\n private crosshair: FinanceCrosshair | null = null;\r\n\r\n constructor(container: HTMLElement, options: WaterfallOptions) {\r\n super(container, options.theme);\r\n this.options = options;\r\n\r\n if (options.crosshair !== false) {\r\n this.crosshair = new FinanceCrosshair(this.canvas, () => this.requestRender());\r\n }\r\n\r\n this.requestRender();\r\n }\r\n\r\n protected renderChart(\r\n ctx: CanvasRenderingContext2D,\r\n width: number,\r\n height: number,\r\n theme: Theme,\r\n ): void {\r\n const pos = this.crosshair?.getPosition() ?? null;\r\n renderWaterfall(ctx, width, height, this.options, theme, pos);\r\n }\r\n\r\n update(data: WaterfallBar[]): void {\r\n this.options = { ...this.options, data };\r\n this.requestRender();\r\n }\r\n\r\n setOptions(opts: Partial<WaterfallOptions>): void {\r\n this.options = { ...this.options, ...opts };\r\n this.requestRender();\r\n }\r\n\r\n destroy(): void {\r\n this.crosshair?.destroy();\r\n super.destroy();\r\n }\r\n}\r\n","import type { GaugeOptions, Theme } from '@tradecanvas/commons';\r\nimport { BaseFinanceChart, renderGauge } from '@tradecanvas/core';\r\n\r\nconst DEFAULT_ANIMATION_MS = 500;\r\n\r\nfunction easeOutCubic(t: number): number {\r\n const inv = 1 - t;\r\n return 1 - inv * inv * inv;\r\n}\r\n\r\nexport class GaugeChart extends BaseFinanceChart {\r\n private options: GaugeOptions;\r\n private currentValue: number;\r\n private targetValue: number;\r\n private animationStart: number | null = null;\r\n private animationFrom = 0;\r\n private animationFrameId: number | null = null;\r\n\r\n constructor(container: HTMLElement, options: GaugeOptions) {\r\n super(container, options.theme);\r\n this.options = options;\r\n this.currentValue = options.value;\r\n this.targetValue = options.value;\r\n this.requestRender();\r\n }\r\n\r\n protected renderChart(\r\n ctx: CanvasRenderingContext2D,\r\n width: number,\r\n height: number,\r\n theme: Theme,\r\n ): void {\r\n renderGauge(ctx, width, height, this.options, theme, this.currentValue);\r\n }\r\n\r\n setValue(value: number): void {\r\n const animate = this.options.animate !== false;\r\n if (!animate) {\r\n this.cancelAnimation();\r\n this.currentValue = value;\r\n this.targetValue = value;\r\n this.options = { ...this.options, value };\r\n this.requestRender();\r\n return;\r\n }\r\n\r\n this.targetValue = value;\r\n this.animationFrom = this.currentValue;\r\n this.animationStart = performance.now();\r\n this.options = { ...this.options, value };\r\n this.startAnimationLoop();\r\n }\r\n\r\n setOptions(opts: Partial<GaugeOptions>): void {\r\n const next = { ...this.options, ...opts };\r\n // If `value` is part of the partial, route through animation path\r\n if (opts.value !== undefined && opts.value !== this.targetValue) {\r\n this.options = next;\r\n this.setValue(opts.value);\r\n return;\r\n }\r\n this.options = next;\r\n this.requestRender();\r\n }\r\n\r\n private startAnimationLoop(): void {\r\n if (this.animationFrameId !== null) return;\r\n const step = (): void => {\r\n this.animationFrameId = null;\r\n if (this.animationStart === null) return;\r\n\r\n const duration = this.options.animationDuration ?? DEFAULT_ANIMATION_MS;\r\n const elapsed = performance.now() - this.animationStart;\r\n const t = Math.min(1, elapsed / Math.max(1, duration));\r\n const eased = easeOutCubic(t);\r\n this.currentValue = this.animationFrom + (this.targetValue - this.animationFrom) * eased;\r\n\r\n this.requestRender();\r\n\r\n if (t < 1) {\r\n this.animationFrameId = requestAnimationFrame(step);\r\n } else {\r\n this.currentValue = this.targetValue;\r\n this.animationStart = null;\r\n }\r\n };\r\n this.animationFrameId = requestAnimationFrame(step);\r\n }\r\n\r\n private cancelAnimation(): void {\r\n if (this.animationFrameId !== null) {\r\n cancelAnimationFrame(this.animationFrameId);\r\n this.animationFrameId = null;\r\n }\r\n this.animationStart = null;\r\n }\r\n\r\n destroy(): void {\r\n this.cancelAnimation();\r\n super.destroy();\r\n }\r\n}\r\n","import type { EquityPoint, HeatmapCell } from '@tradecanvas/commons';\r\nimport { timeframeBucketStart } from '@tradecanvas/commons';\r\n\r\n/** Minimal equity sample shape — structurally satisfied by analytics' EquityPoint. */\r\nexport interface EquitySample {\r\n time: number;\r\n equity: number;\r\n}\r\n\r\n/** Subset of analytics RiskMetrics needed to render the stats strip. */\r\nexport interface RiskMetricsLike {\r\n totalReturnPct: number;\r\n cagr: number;\r\n sharpe: number;\r\n sortino: number;\r\n maxDrawdownPct: number;\r\n winRate: number;\r\n profitFactor: number;\r\n trades: number;\r\n}\r\n\r\nexport interface DashboardStat {\r\n label: string;\r\n value: string;\r\n tone: 'positive' | 'negative' | 'neutral';\r\n}\r\n\r\nconst MONTH_LABELS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\r\n\r\n/** Map an analytics equity curve to the finance EquityCurveChart point shape. */\r\nexport function toEquityPoints(curve: ReadonlyArray<EquitySample>): EquityPoint[] {\r\n return curve.map((p) => ({ time: p.time, value: p.equity }));\r\n}\r\n\r\n/**\r\n * Underwater drawdown curve as a percentage (<= 0). Each point is the equity's\r\n * shortfall from the running peak: `equity / peak - 1`, expressed in percent.\r\n */\r\nexport function computeDrawdownCurve(curve: ReadonlyArray<EquitySample>): EquityPoint[] {\r\n let peak = -Infinity;\r\n return curve.map((p) => {\r\n if (p.equity > peak) peak = p.equity;\r\n const dd = peak > 0 ? (p.equity / peak - 1) * 100 : 0;\r\n return { time: p.time, value: dd };\r\n });\r\n}\r\n\r\n/**\r\n * Calendar-month returns as heatmap cells. Each month's return is chained off\r\n * the prior month's closing equity (the first month chains off its own opening\r\n * equity), so the series reads as sequential monthly performance. `group` is\r\n * the year and `value` is the return in percent.\r\n */\r\nexport function computeMonthlyReturns(curve: ReadonlyArray<EquitySample>): HeatmapCell[] {\r\n if (curve.length === 0) return [];\r\n\r\n // Collapse the curve to one closing equity per calendar month, in order.\r\n const months: { key: number; close: number }[] = [];\r\n for (const p of curve) {\r\n const key = timeframeBucketStart(p.time, '1M');\r\n const last = months[months.length - 1];\r\n if (last && last.key === key) {\r\n last.close = p.equity;\r\n } else {\r\n months.push({ key, close: p.equity });\r\n }\r\n }\r\n\r\n let prevClose = curve[0].equity;\r\n const cells: HeatmapCell[] = [];\r\n for (const m of months) {\r\n const base = prevClose === 0 ? 1 : prevClose;\r\n const returnPct = (m.close / base - 1) * 100;\r\n prevClose = m.close;\r\n const d = new Date(m.key);\r\n const year = d.getUTCFullYear();\r\n const month = d.getUTCMonth();\r\n cells.push({\r\n id: `${year}-${String(month + 1).padStart(2, '0')}`,\r\n label: MONTH_LABELS[month],\r\n group: String(year),\r\n value: returnPct,\r\n });\r\n }\r\n return cells;\r\n}\r\n\r\nfunction pct(value: number): string {\r\n const sign = value > 0 ? '+' : '';\r\n return `${sign}${value.toFixed(2)}%`;\r\n}\r\n\r\nfunction tone(value: number): DashboardStat['tone'] {\r\n if (value > 0) return 'positive';\r\n if (value < 0) return 'negative';\r\n return 'neutral';\r\n}\r\n\r\n/** The headline stats rendered as cards above the charts. */\r\nexport function selectKeyStats(metrics: RiskMetricsLike): DashboardStat[] {\r\n return [\r\n { label: 'Total Return', value: pct(metrics.totalReturnPct), tone: tone(metrics.totalReturnPct) },\r\n { label: 'CAGR', value: pct(metrics.cagr * 100), tone: tone(metrics.cagr) },\r\n { label: 'Sharpe', value: metrics.sharpe.toFixed(2), tone: tone(metrics.sharpe) },\r\n { label: 'Sortino', value: metrics.sortino.toFixed(2), tone: tone(metrics.sortino) },\r\n { label: 'Max Drawdown', value: pct(metrics.maxDrawdownPct), tone: 'negative' },\r\n { label: 'Win Rate', value: `${(metrics.winRate * 100).toFixed(1)}%`, tone: 'neutral' },\r\n { label: 'Profit Factor', value: Number.isFinite(metrics.profitFactor) ? metrics.profitFactor.toFixed(2) : '∞', tone: tone(metrics.profitFactor - 1) },\r\n { label: 'Trades', value: String(metrics.trades), tone: 'neutral' },\r\n ];\r\n}\r\n","import type { Theme, ThemeName } from '@tradecanvas/commons';\r\nimport { DARK_THEME, LIGHT_THEME } from '@tradecanvas/commons';\r\nimport { EquityCurveChart } from './EquityCurveChart.js';\r\nimport { HeatmapChart } from './HeatmapChart.js';\r\nimport {\r\n toEquityPoints,\r\n computeDrawdownCurve,\r\n computeMonthlyReturns,\r\n selectKeyStats,\r\n type EquitySample,\r\n type RiskMetricsLike,\r\n type DashboardStat,\r\n} from './performanceData.js';\r\n\r\n/** Structurally satisfied by analytics' `BacktestResult`. */\r\nexport interface PerformanceResult {\r\n equityCurve: ReadonlyArray<EquitySample>;\r\n metrics: RiskMetricsLike;\r\n}\r\n\r\nexport interface PerformanceDashboardOptions {\r\n result: PerformanceResult;\r\n theme?: ThemeName | Theme;\r\n title?: string;\r\n subtitle?: string;\r\n}\r\n\r\nfunction resolveTheme(theme?: ThemeName | Theme): Theme {\r\n if (!theme || theme === 'dark') return DARK_THEME;\r\n if (theme === 'light') return LIGHT_THEME;\r\n return theme as Theme;\r\n}\r\n\r\n/**\r\n * A composed strategy-performance dashboard: a headline stats strip, an equity\r\n * curve, an underwater drawdown panel, and a monthly-returns heatmap. Built\r\n * entirely from a backtest `result`, reusing the finance chart renderers.\r\n *\r\n * ```ts\r\n * const result = new Backtester(opts).run(bars, strategy);\r\n * const dash = new PerformanceDashboard(el, { result, theme: 'dark' });\r\n * ```\r\n */\r\nexport class PerformanceDashboard {\r\n private options: PerformanceDashboardOptions;\r\n private theme: Theme;\r\n private root: HTMLDivElement;\r\n private equityChart: EquityCurveChart | null = null;\r\n private drawdownChart: EquityCurveChart | null = null;\r\n private heatmap: HeatmapChart | null = null;\r\n\r\n constructor(container: HTMLElement, options: PerformanceDashboardOptions) {\r\n this.options = options;\r\n this.theme = resolveTheme(options.theme);\r\n this.root = document.createElement('div');\r\n this.build();\r\n container.appendChild(this.root);\r\n }\r\n\r\n private build(): void {\r\n const t = this.theme;\r\n const { result, title, subtitle } = this.options;\r\n const surface = this.panelBackground();\r\n const border = t.grid;\r\n\r\n this.root.style.cssText = [\r\n 'display:flex',\r\n 'flex-direction:column',\r\n 'gap:14px',\r\n 'width:100%',\r\n 'box-sizing:border-box',\r\n 'padding:16px',\r\n `background:${t.background}`,\r\n `color:${t.text}`,\r\n `font-family:${t.font.family}`,\r\n ].join(';');\r\n\r\n if (title || subtitle) {\r\n const header = document.createElement('div');\r\n if (title) {\r\n const h = document.createElement('div');\r\n h.textContent = title;\r\n h.style.cssText = `font-size:${t.font.sizeLarge}px;font-weight:600;letter-spacing:-0.01em;`;\r\n header.appendChild(h);\r\n }\r\n if (subtitle) {\r\n const s = document.createElement('div');\r\n s.textContent = subtitle;\r\n s.style.cssText = `font-size:${t.font.sizeSmall}px;color:${t.textSecondary};margin-top:2px;`;\r\n header.appendChild(s);\r\n }\r\n this.root.appendChild(header);\r\n }\r\n\r\n // Stats strip\r\n this.root.appendChild(this.buildStatsStrip(selectKeyStats(result.metrics), surface, border));\r\n\r\n // Chart grid\r\n const grid = document.createElement('div');\r\n grid.style.cssText = [\r\n 'display:grid',\r\n 'grid-template-columns:repeat(auto-fit, minmax(280px, 1fr))',\r\n 'grid-auto-rows:220px',\r\n 'gap:14px',\r\n ].join(';');\r\n this.root.appendChild(grid);\r\n\r\n const equityPanel = this.buildPanel('Equity Curve', surface, border);\r\n equityPanel.wrap.style.gridColumn = '1 / -1';\r\n grid.appendChild(equityPanel.wrap);\r\n this.equityChart = new EquityCurveChart(equityPanel.body, {\r\n data: toEquityPoints(result.equityCurve),\r\n theme: t,\r\n lineColor: t.candleUp,\r\n fillArea: true,\r\n crosshair: true,\r\n });\r\n\r\n const ddPanel = this.buildPanel('Drawdown', surface, border);\r\n grid.appendChild(ddPanel.wrap);\r\n this.drawdownChart = new EquityCurveChart(ddPanel.body, {\r\n data: computeDrawdownCurve(result.equityCurve),\r\n theme: t,\r\n lineColor: t.candleDown,\r\n fillArea: true,\r\n crosshair: true,\r\n valueFormat: (v) => `${v.toFixed(1)}%`,\r\n });\r\n\r\n const monthlyCells = computeMonthlyReturns(result.equityCurve);\r\n const heatPanel = this.buildPanel('Monthly Returns', surface, border);\r\n grid.appendChild(heatPanel.wrap);\r\n this.heatmap = new HeatmapChart(heatPanel.body, {\r\n data: monthlyCells,\r\n theme: t,\r\n showValues: true,\r\n valueFormat: (v) => `${v >= 0 ? '+' : ''}${v.toFixed(1)}`,\r\n colorScale: { negative: t.candleDown, zero: surface, positive: t.candleUp },\r\n });\r\n }\r\n\r\n private buildStatsStrip(stats: DashboardStat[], surface: string, border: string): HTMLDivElement {\r\n const strip = document.createElement('div');\r\n strip.style.cssText = [\r\n 'display:grid',\r\n 'grid-template-columns:repeat(auto-fit, minmax(120px, 1fr))',\r\n 'gap:10px',\r\n ].join(';');\r\n\r\n const t = this.theme;\r\n for (const stat of stats) {\r\n const card = document.createElement('div');\r\n card.style.cssText = [\r\n `background:${surface}`,\r\n `border:1px solid ${border}`,\r\n 'border-radius:10px',\r\n 'padding:10px 12px',\r\n 'display:flex',\r\n 'flex-direction:column',\r\n 'gap:4px',\r\n ].join(';');\r\n\r\n const label = document.createElement('div');\r\n label.textContent = stat.label;\r\n label.style.cssText = `font-size:${t.font.sizeSmall}px;color:${t.textSecondary};text-transform:uppercase;letter-spacing:0.04em;`;\r\n\r\n const value = document.createElement('div');\r\n value.textContent = stat.value;\r\n const color = stat.tone === 'positive' ? t.candleUp : stat.tone === 'negative' ? t.candleDown : t.text;\r\n value.style.cssText = `font-size:${t.font.sizeLarge}px;font-weight:600;color:${color};font-variant-numeric:tabular-nums;`;\r\n\r\n card.appendChild(label);\r\n card.appendChild(value);\r\n strip.appendChild(card);\r\n }\r\n return strip;\r\n }\r\n\r\n private buildPanel(title: string, surface: string, border: string): { wrap: HTMLDivElement; body: HTMLDivElement } {\r\n const t = this.theme;\r\n const wrap = document.createElement('div');\r\n wrap.style.cssText = [\r\n `background:${surface}`,\r\n `border:1px solid ${border}`,\r\n 'border-radius:10px',\r\n 'overflow:hidden',\r\n 'display:flex',\r\n 'flex-direction:column',\r\n ].join(';');\r\n\r\n const head = document.createElement('div');\r\n head.textContent = title;\r\n head.style.cssText = [\r\n `font-size:${t.font.sizeSmall}px`,\r\n 'font-weight:600',\r\n `color:${t.textSecondary}`,\r\n 'padding:8px 12px',\r\n `border-bottom:1px solid ${border}`,\r\n 'text-transform:uppercase',\r\n 'letter-spacing:0.04em',\r\n ].join(';');\r\n\r\n const body = document.createElement('div');\r\n body.style.cssText = 'flex:1;min-height:0;position:relative;';\r\n\r\n wrap.appendChild(head);\r\n wrap.appendChild(body);\r\n return { wrap, body };\r\n }\r\n\r\n /** A subtle surface tint distinct from the page background, per theme. */\r\n private panelBackground(): string {\r\n return this.theme.name === 'light' ? 'rgba(0,0,0,0.02)' : 'rgba(255,255,255,0.03)';\r\n }\r\n\r\n /** Replace the displayed result and re-render all panels. */\r\n update(result: PerformanceResult): void {\r\n this.options = { ...this.options, result };\r\n this.destroyCharts();\r\n this.root.replaceChildren();\r\n this.build();\r\n }\r\n\r\n setTheme(theme: ThemeName | Theme): void {\r\n this.theme = resolveTheme(theme);\r\n this.options = { ...this.options, theme };\r\n this.destroyCharts();\r\n this.root.replaceChildren();\r\n this.build();\r\n }\r\n\r\n private destroyCharts(): void {\r\n this.equityChart?.destroy();\r\n this.drawdownChart?.destroy();\r\n this.heatmap?.destroy();\r\n this.equityChart = null;\r\n this.drawdownChart = null;\r\n this.heatmap = null;\r\n }\r\n\r\n destroy(): void {\r\n this.destroyCharts();\r\n this.root.remove();\r\n }\r\n}\r\n"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,17 +1,31 @@
1
1
  export { Chart } from './Chart.js';
2
2
  export { DataManager } from './DataManager.js';
3
+ export { HISTORY_RETRY_MS, DEFAULT_HISTORY_PAGE_SIZE } from './HistoryPager.js';
4
+ export type { HistoryLoader } from './HistoryPager.js';
3
5
  export { ThemeManager } from './ThemeManager.js';
4
6
  export { LayoutManager } from './layout/LayoutManager.js';
5
7
  export * from './plugins/index.js';
6
8
  export { parseOHLCV, DragDropImporter } from './io/index.js';
7
9
  export type { ParseResult, DragDropImporterCallbacks } from './io/index.js';
8
- export type { OHLCBar, DataSeries, TimeFrame, ChartOptions, ChartType, Theme, ThemeName, ChartEventType, ChartEvent, ChartEventMap, IndicatorPlugin, IndicatorDescriptor, IndicatorConfig, IndicatorOutput, IndicatorValue, TauriBridgeOptions, ViewportState, CrosshairMovePayload, BarClickPayload, VisibleRangeChangePayload, OrderModifyPayload, OrderCancelPayload, PositionModifyPayload, PositionClosePayload, OrderPlacePayload, IndicatorChangePayload, ThemeChangePayload, ResizePayload, ZoomChangePayload, PriceRangeChangePayload, DrawingCreatePayload, DrawingRemovePayload, SignalMarkerAddPayload, SignalMarkerRemovePayload, TradeZoneAddPayload, TradeZoneRemovePayload, DrawingToolType, DrawingState, DrawingStyle, DrawingPlugin, DrawingDescriptor, FeaturesConfig, SessionBreakOptions, PriceAxisOptions, TimeAxisOptions, AnchorPoint, PanelPosition, PanelConfig, ResolvedLayout, TradingOrder, TradingPosition, DepthData, DepthLevel, TradingConfig, OrderSide, OrderType, OrderStatus, OrderLabel, OrderPlaceIntent, OrderModifyIntent, OrderCancelIntent, PositionModifyIntent, PositionCloseIntent, ExecutionAdapter, ExecutionConfig, ExecutionEvent, ExecutionEventType, ExecutionListener, FillEvent, ExecutionError, Locale, LocaleStrings, MarketConfig, MarketType, StockExchange, MarketColorScheme, TradingSession, PriceLimitInfo, DataAdapter, DataAdapterConfig, DataAdapterEventType, StreamConfig, ConnectionState, ConnectionInfo, RawTick, AggregatedBar, ReconnectConfig, ResolvedIndicatorStyle, WatermarkConfig, GridOptions, CrosshairOptions, SignalMarker, SignalDirection, SignalMarkerStyle, TradeZone, TradeZoneDirection, TradeZoneStyle, } from '@tradecanvas/commons';
10
+ export type { OHLCBar, DataSeries, TimeFrame, ChartOptions, ChartType, Theme, ThemeName, ChartEventType, ChartEvent, ChartEventMap, IndicatorPlugin, IndicatorDescriptor, IndicatorConfig, IndicatorOutput, IndicatorValue, TauriBridgeOptions, ViewportState, CrosshairMovePayload, BarClickPayload, VisibleRangeChangePayload, OrderModifyPayload, OrderCancelPayload, PositionModifyPayload, PositionClosePayload, OrderPlacePayload, IndicatorChangePayload, ThemeChangePayload, ResizePayload, ZoomChangePayload, PriceRangeChangePayload, DrawingCreatePayload, DrawingRemovePayload, SignalMarkerAddPayload, ChartContextArea, ChartContextMenuPayload, PriceAxisAddPayload, SignalMarkerRemovePayload, TradeZoneAddPayload, TradeZoneRemovePayload, DrawingToolType, DrawingState, DrawingStyle, DrawingPlugin, DrawingDescriptor, FeaturesConfig, SessionBreakOptions, PriceAxisOptions, TimeAxisOptions, AnchorPoint, PanelPosition, PanelConfig, ResolvedLayout, TradingOrder, TradingPosition, DepthData, DepthLevel, TradingConfig, OrderSide, OrderType, OrderStatus, OrderLabel, OrderPlaceIntent, OrderModifyIntent, OrderCancelIntent, PositionModifyIntent, PositionCloseIntent, PositionReverseIntent, TimeInForce, FillReason, ExecutionAdapter, ExecutionConfig, ExecutionEvent, ExecutionEventType, ExecutionListener, FillEvent, ExecutionError, Locale, LocaleStrings, MarketConfig, MarketType, StockExchange, MarketColorScheme, TradingSession, PriceLimitInfo, DataAdapter, DataAdapterConfig, DataAdapterEventType, StreamConfig, ConnectionState, ConnectionInfo, RawTick, AggregatedBar, ReconnectConfig, ResolvedIndicatorStyle, WatermarkConfig, GridOptions, CrosshairOptions, SignalMarker, SignalDirection, SignalMarkerStyle, TradeZone, TradeZoneDirection, TradeZoneStyle, } from '@tradecanvas/commons';
9
11
  export { DARK_THEME, LIGHT_THEME, DARK_TERMINAL, TC_PALETTE, TC_SERIES_COLORS, DEFAULT_DRAWING_STYLE, DEFAULT_TRADING_CONFIG, DEFAULT_SIGNAL_STYLE, DEFAULT_TRADE_ZONE_STYLE, TIMEFRAMES_CRYPTO, TIMEFRAMES_STOCK, TIMEFRAMES_FOREX, DEFAULT_TIMEFRAME_FAVORITES, } from '@tradecanvas/commons';
10
12
  export { normalizeBarTime, normalizeBar } from '@tradecanvas/commons';
13
+ export { parseTimeframe, isTimeFrame, timeframeToMs, resampleBars, pickBaseTimeframe, isValidTimeZone, zoneOffsetMinutes, offsetAt, wallToUtc, } from '@tradecanvas/commons';
14
+ export type { KnownTimeFrame, TimeFrameUnit, TimeZoneSetting, HistoryLoadPayload, OverlayScale } from '@tradecanvas/commons';
15
+ export { rankSymbols, stepDecimals } from '@tradecanvas/commons';
16
+ export { formatFraction, fractionTick, priceFormatterFor } from '@tradecanvas/commons';
17
+ export type { PriceFormatter, PriceFraction, TimeFormatter, TimeFormatContext } from '@tradecanvas/commons';
18
+ export type { SymbolInfo, SymbolSession, SymbolSearchOptions } from '@tradecanvas/commons';
19
+ export type { ShapeConfig } from '@tradecanvas/commons';
20
+ export { readQuote, readNews, marketStatus, tickBarCount } from '@tradecanvas/commons';
21
+ export type { Quote, QuoteSource, NewsItem, Trade, MarketStatus, ChartA11yLabels } from '@tradecanvas/commons';
22
+ export { EXCHANGE_TIMEZONE } from './Chart.js';
23
+ export { PRICE_SOURCES, isPriceSource, sourcePrice, indicatorSource, parseIndicatorSource } from '@tradecanvas/commons';
24
+ export type { PriceSource, IndicatorPlot, IndicatorPlotKind, IndicatorScale, IndicatorInputSpec, IndicatorSettingsChangePayload, } from '@tradecanvas/commons';
11
25
  export { setLocale, getLocale, t, registerLocale, formatNumber, formatVND, formatVolumeLoc } from '@tradecanvas/commons';
12
26
  export { MARKET_HOSE, MARKET_HNX, MARKET_UPCOM, MARKET_CRYPTO, MARKET_NYSE, VN_COLORS, createVNTheme, computePriceLimits, getCurrentSession, } from '@tradecanvas/commons';
13
27
  export { IndicatorBase, IndicatorValueMap, DrawingBase } from '@tradecanvas/core';
14
- export { StreamManager, BinanceAdapter, MockAdapter, TickAggregator, CurrentPriceLine, PaperExecutionAdapter, WebSocketAdapter, PollingAdapter, CoinbaseAdapter, BybitAdapter, KrakenAdapter } from '@tradecanvas/core';
28
+ export { StreamManager, BinanceAdapter, MockAdapter, TickAggregator, CurrentPriceLine, PaperExecutionAdapter, WebSocketAdapter, PollingAdapter, CoinbaseAdapter, BybitAdapter, KrakenAdapter, ResamplingAdapter, withResampling, servesTimeframe, TickBarBuilder, TickBarAdapter, withTickBars } from '@tradecanvas/core';
15
29
  export type { PaperExecutionOptions, WebSocketAdapterOptions, WsParseResult, PollingAdapterOptions, CoinbaseAdapterOptions, BybitAdapterOptions, KrakenAdapterOptions } from '@tradecanvas/core';
16
30
  export { DEFAULT_RECONNECT, DEFAULT_STREAM_CONFIG } from '@tradecanvas/commons';
17
31
  export { ChartLegend, Screenshot, Watermark, BarCountdown, SessionBreaks, SessionShading, DEFAULT_LEGEND_CONFIG, DEFAULT_SESSION_HOURS } from '@tradecanvas/core';
@@ -24,12 +38,17 @@ export { DataExporter } from '@tradecanvas/core';
24
38
  export { RANGE_PRESETS, rangePresetStart } from '@tradecanvas/core';
25
39
  export type { RangePreset } from '@tradecanvas/core';
26
40
  export { AlertManager, ReplayManager, ChartStateManager, UndoRedoManager, SignalMarkerManager, TradeZoneManager } from '@tradecanvas/core';
27
- export type { PriceAlert, AlertCondition, ReplayConfig, ChartSnapshot, UndoableAction } from '@tradecanvas/core';
41
+ export type { PriceAlert, AlertCondition, AlertOptions, ReplayConfig, ChartSnapshot, UndoableAction } from '@tradecanvas/core';
42
+ export { isPriceLevelAlert, MAX_ALERT_BARS, MIN_ALERT_BARS } from '@tradecanvas/core';
28
43
  export { Animator, Easing } from '@tradecanvas/core';
29
44
  export type { EasingFn, AnimationOptions } from '@tradecanvas/core';
30
45
  export { KeyboardHandler, CrosshairTooltip, formatTooltipTime } from '@tradecanvas/core';
31
46
  export type { CrosshairTooltipContext } from '@tradecanvas/core';
32
47
  export { ChartGrid } from './grid/ChartGrid.js';
48
+ export { LayoutSession, cleanLayoutName, MAX_LAYOUT_NAME } from './state/LayoutSession.js';
49
+ export type { LayoutSessionHost, LayoutSessionOptions } from './state/LayoutSession.js';
50
+ export { localStorageLayouts, memoryLayouts } from './state/layoutStorage.js';
51
+ export type { LayoutStorage, SavedLayout, SavedLayoutSummary } from './state/layoutStorage.js';
33
52
  export type { GridLayout, GridCellConfig, ChartGridOptions } from './grid/ChartGrid.js';
34
53
  export { SparklineChart, DepthChart, EquityCurveChart, HeatmapChart, WaterfallChart, GaugeChart, PerformanceDashboard } from './finance/index.js';
35
54
  export { toEquityPoints, computeDrawdownCurve, computeMonthlyReturns, selectKeyStats, } from './finance/index.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAChF,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC7D,YAAY,EAAE,WAAW,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAG5E,YAAY,EACV,OAAO,EACP,UAAU,EACV,SAAS,EACT,YAAY,EACZ,SAAS,EACT,KAAK,EACL,SAAS,EACT,cAAc,EACd,UAAU,EACV,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,yBAAyB,EACzB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,EACtB,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,uBAAuB,EACvB,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,gBAAgB,EAChB,uBAAuB,EACvB,mBAAmB,EACnB,yBAAyB,EACzB,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,aAAa,EACb,WAAW,EACX,cAAc,EACd,YAAY,EACZ,eAAe,EACf,SAAS,EACT,UAAU,EACV,aAAa,EACb,SAAS,EACT,SAAS,EACT,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,SAAS,EACT,cAAc,EACd,MAAM,EACN,aAAa,EACb,YAAY,EACZ,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,YAAY,EACZ,eAAe,EACf,cAAc,EACd,OAAO,EACP,aAAa,EACb,eAAe,EACf,sBAAsB,EACtB,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,SAAS,EACT,kBAAkB,EAClB,cAAc,GACf,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,gBAAgB,EACpE,qBAAqB,EAAE,sBAAsB,EAC7C,oBAAoB,EAAE,wBAAwB,EAC9C,iBAAiB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,2BAA2B,GACnF,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGtE,OAAO,EACL,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAC3E,eAAe,EAAE,iBAAiB,EAAE,QAAQ,EAAE,SAAS,GACxD,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAG7H,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACvF,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC5G,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3F,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACvF,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC/G,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACxH,YAAY,EACV,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,kBAAkB,EAClB,8BAA8B,GAC/B,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,cAAc,EAAE,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGzH,OAAO,EACL,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EACjE,SAAS,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,GAChE,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGlF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC1T,YAAY,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,aAAa,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACjM,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAGhF,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAClK,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAG7G,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAG9G,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACpE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,eAAe,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC3I,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC/H,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGtF,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACrD,YAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGpE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACzF,YAAY,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAGjE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3F,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACxF,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9E,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC/F,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGxF,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,gBAAgB,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAClJ,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,qBAAqB,EACrB,cAAc,GACf,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,2BAA2B,EAC3B,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,aAAa,GACd,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,uBAAuB,EACvB,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,SAAS,EACT,YAAY,GACb,MAAM,sBAAsB,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
- import { a as e, c as t, d as n, f as r, i, l as a, m as o, n as s, o as c, p as l, r as u, s as d, t as ee, u as te } from "./DragDropImporter-Dd9Mud5J.js";
2
- import { DARK_TERMINAL as ne, DARK_THEME as re, DARK_THEME as ie, DEFAULT_DRAWING_STYLE as ae, DEFAULT_RECONNECT as oe, DEFAULT_SIGNAL_STYLE as se, DEFAULT_STREAM_CONFIG as ce, DEFAULT_TIMEFRAME_FAVORITES as le, DEFAULT_TRADE_ZONE_STYLE as ue, DEFAULT_TRADING_CONFIG as de, LIGHT_THEME as fe, LIGHT_THEME as f, MARKET_CRYPTO as p, MARKET_HNX as m, MARKET_HOSE as h, MARKET_NYSE as g, MARKET_UPCOM as _, TC_PALETTE as v, TC_SERIES_COLORS as y, TIMEFRAMES_CRYPTO as b, TIMEFRAMES_FOREX as x, TIMEFRAMES_STOCK as S, VN_COLORS as C, computePriceLimits as w, createVNTheme as T, formatNumber as E, formatVND as D, formatVolumeLoc as O, getCurrentSession as k, getLocale as A, normalizeBar as j, normalizeBarTime as M, registerLocale as N, setLocale as P, t as F, timeframeBucketStart as I } from "@tradecanvas/commons";
3
- import { AlertManager as L, Animator as R, BarCountdown as z, BaseFinanceChart as B, BinanceAdapter as V, BybitAdapter as pe, ChartLegend as me, ChartStateManager as he, CoinbaseAdapter as ge, CompareRenderer as _e, CrosshairTooltip as ve, CurrentPriceLine as ye, DEFAULT_LEGEND_CONFIG as be, DEFAULT_SESSION_HOURS as xe, DataExporter as Se, DrawingBase as Ce, Easing as we, FinanceCrosshair as H, IndicatorBase as Te, IndicatorValueMap as Ee, KeyboardHandler as De, KrakenAdapter as Oe, MockAdapter as ke, PaperExecutionAdapter as Ae, PollingAdapter as je, RANGE_PRESETS as Me, ReplayManager as Ne, Screenshot as Pe, SessionBreaks as Fe, SessionShading as Ie, SignalMarkerManager as Le, StreamManager as Re, TickAggregator as ze, TradeZoneManager as Be, UndoRedoManager as Ve, VolumeRenderer as He, Watermark as Ue, WebSocketAdapter as We, formatTooltipTime as Ge, layoutSquarifiedTreemap as Ke, layoutUniformGrid as qe, lttbDownsample as Je, lttbVisibleIndices as Ye, rangePresetStart as Xe, renderDepthChart as Ze, renderEquityCurve as Qe, renderGauge as $e, renderHeatmap as et, renderSparkline as tt, renderWaterfall as nt, toHeikinAshi as rt, toKagi as it, toLineBreak as at, toPointAndFigure as ot, toRangeBars as st, toRenko as ct } from "@tradecanvas/core";
1
+ import { S as e, _ as t, a as n, b as r, c as i, d as a, f as o, g as s, h as c, i as l, l as u, m as ee, n as te, o as ne, p as re, r as ie, s as ae, t as oe, u as se, v as ce, x as le, y as ue } from "./LayoutSession-CWn3sdbs.js";
2
+ import { DARK_TERMINAL as de, DARK_THEME as fe, DARK_THEME as pe, DEFAULT_DRAWING_STYLE as d, DEFAULT_RECONNECT as f, DEFAULT_SIGNAL_STYLE as p, DEFAULT_STREAM_CONFIG as m, DEFAULT_TIMEFRAME_FAVORITES as h, DEFAULT_TRADE_ZONE_STYLE as g, DEFAULT_TRADING_CONFIG as _, LIGHT_THEME as v, LIGHT_THEME as y, MARKET_CRYPTO as b, MARKET_HNX as x, MARKET_HOSE as S, MARKET_NYSE as C, MARKET_UPCOM as w, PRICE_SOURCES as T, TC_PALETTE as E, TC_SERIES_COLORS as D, TIMEFRAMES_CRYPTO as O, TIMEFRAMES_FOREX as k, TIMEFRAMES_STOCK as A, VN_COLORS as j, computePriceLimits as M, createVNTheme as N, formatFraction as P, formatNumber as F, formatVND as I, formatVolumeLoc as L, fractionTick as R, getCurrentSession as z, getLocale as B, indicatorSource as me, isPriceSource as he, isTimeFrame as ge, isValidTimeZone as _e, marketStatus as ve, normalizeBar as ye, normalizeBarTime as be, offsetAt as xe, parseIndicatorSource as Se, parseTimeframe as Ce, pickBaseTimeframe as we, priceFormatterFor as Te, rankSymbols as Ee, readNews as De, readQuote as Oe, registerLocale as ke, resampleBars as Ae, setLocale as je, sourcePrice as Me, stepDecimals as Ne, t as Pe, tickBarCount as Fe, timeframeBucketStart as Ie, timeframeToMs as Le, wallToUtc as Re, zoneOffsetMinutes as ze } from "@tradecanvas/commons";
3
+ import { AlertManager as Be, Animator as Ve, BarCountdown as He, BaseFinanceChart as V, BinanceAdapter as Ue, BybitAdapter as We, ChartLegend as Ge, ChartStateManager as Ke, CoinbaseAdapter as qe, CompareRenderer as Je, CrosshairTooltip as Ye, CurrentPriceLine as Xe, DEFAULT_LEGEND_CONFIG as Ze, DEFAULT_SESSION_HOURS as Qe, DataExporter as $e, DrawingBase as et, Easing as tt, FinanceCrosshair as H, IndicatorBase as nt, IndicatorValueMap as rt, KeyboardHandler as it, KrakenAdapter as at, MAX_ALERT_BARS as ot, MIN_ALERT_BARS as st, MockAdapter as ct, PaperExecutionAdapter as lt, PollingAdapter as ut, RANGE_PRESETS as dt, ReplayManager as ft, ResamplingAdapter as pt, Screenshot as mt, SessionBreaks as ht, SessionShading as gt, SignalMarkerManager as _t, StreamManager as vt, TickAggregator as yt, TickBarAdapter as bt, TickBarBuilder as xt, TradeZoneManager as St, UndoRedoManager as Ct, VolumeRenderer as wt, Watermark as Tt, WebSocketAdapter as Et, formatTooltipTime as Dt, isPriceLevelAlert as Ot, layoutSquarifiedTreemap as kt, layoutUniformGrid as At, lttbDownsample as jt, lttbVisibleIndices as Mt, rangePresetStart as Nt, renderDepthChart as Pt, renderEquityCurve as Ft, renderGauge as It, renderHeatmap as Lt, renderSparkline as Rt, renderWaterfall as zt, servesTimeframe as Bt, toHeikinAshi as Vt, toKagi as Ht, toLineBreak as Ut, toPointAndFigure as Wt, toRangeBars as Gt, toRenko as Kt, withResampling as qt, withTickBars as Jt } from "@tradecanvas/core";
4
4
  //#region src/grid/ChartGrid.ts
5
5
  var U = {
6
6
  "1x1": {
@@ -35,7 +35,7 @@ var U = {
35
35
  cols: 2,
36
36
  rows: 3
37
37
  }
38
- }, lt = class {
38
+ }, Yt = class {
39
39
  root;
40
40
  cells = [];
41
41
  layout;
@@ -56,7 +56,7 @@ var U = {
56
56
  createCell(e) {
57
57
  let t = this.options.cells?.[e] ?? {}, n = document.createElement("div");
58
58
  n.style.cssText = "position:relative;overflow:hidden;min-width:0;min-height:0;", this.root.appendChild(n);
59
- let r = new u(n, {
59
+ let r = new i(n, {
60
60
  chartType: "candlestick",
61
61
  autoScale: !0,
62
62
  features: {
@@ -71,7 +71,7 @@ var U = {
71
71
  ...this.options.chartOptions,
72
72
  ...t.chartOptions,
73
73
  theme: this.options.theme
74
- }), i = {
74
+ }), a = {
75
75
  container: n,
76
76
  chart: r,
77
77
  symbol: t.symbol ?? `Chart ${e + 1}`,
@@ -91,7 +91,7 @@ var U = {
91
91
  if (e && a) for (let t of this.cells) t.chart !== r && t.chart.setVisibleRange(e, a);
92
92
  }
93
93
  this.syncing = !1;
94
- }), i;
94
+ }), a;
95
95
  }
96
96
  setLayout(e) {
97
97
  if (e === this.layout) return;
@@ -125,7 +125,7 @@ var U = {
125
125
  async connectAll(e, t, n, r = 500) {
126
126
  let i = [];
127
127
  for (let a = 0; a < this.cells.length && a < t.length; a++) i.push(this.connectCell(a, {
128
- adapter: e,
128
+ adapter: typeof e == "function" ? e(t[a], a) : e,
129
129
  symbol: t[a],
130
130
  timeframe: n,
131
131
  historyLimit: r
@@ -142,13 +142,13 @@ var U = {
142
142
  this.cells = [], this.root.remove();
143
143
  }
144
144
  }
145
- }, ut = class extends B {
145
+ }, W = class extends V {
146
146
  options;
147
147
  constructor(e, t) {
148
148
  super(e, t.theme), this.options = t, this.requestRender();
149
149
  }
150
150
  renderChart(e, t, n, r) {
151
- tt(e, t, n, this.options, r);
151
+ Rt(e, t, n, this.options, r);
152
152
  }
153
153
  update(e) {
154
154
  this.options = {
@@ -162,7 +162,7 @@ var U = {
162
162
  ...e
163
163
  }, this.requestRender();
164
164
  }
165
- }, W = class extends B {
165
+ }, Xt = class extends V {
166
166
  options;
167
167
  crosshair = null;
168
168
  constructor(e, t) {
@@ -170,7 +170,7 @@ var U = {
170
170
  }
171
171
  renderChart(e, t, n, r) {
172
172
  let i = this.crosshair?.getPosition() ?? null;
173
- Ze(e, t, n, this.options, r, i);
173
+ Pt(e, t, n, this.options, r, i);
174
174
  }
175
175
  update(e) {
176
176
  this.options = {
@@ -187,7 +187,7 @@ var U = {
187
187
  destroy() {
188
188
  this.crosshair?.destroy(), super.destroy();
189
189
  }
190
- }, G = class extends B {
190
+ }, G = class extends V {
191
191
  options;
192
192
  crosshair = null;
193
193
  constructor(e, t) {
@@ -195,7 +195,7 @@ var U = {
195
195
  }
196
196
  renderChart(e, t, n, r) {
197
197
  let i = this.crosshair?.getPosition() ?? null;
198
- Qe(e, t, n, this.options, r, i);
198
+ Ft(e, t, n, this.options, r, i);
199
199
  }
200
200
  update(e, t) {
201
201
  this.options = {
@@ -215,7 +215,7 @@ var U = {
215
215
  destroy() {
216
216
  this.crosshair?.destroy(), super.destroy();
217
217
  }
218
- }, K = class extends B {
218
+ }, K = class extends V {
219
219
  options;
220
220
  crosshair = null;
221
221
  cachedRects = [];
@@ -241,8 +241,8 @@ var U = {
241
241
  id: e.id,
242
242
  weight: e.weight ?? (Math.abs(e.value) || 1)
243
243
  }));
244
- this.cachedRects = Ke(n, e, t);
245
- } else this.cachedRects = qe(this.currentData.map((e) => ({ id: e.id })), e, t);
244
+ this.cachedRects = kt(n, e, t);
245
+ } else this.cachedRects = At(this.currentData.map((e) => ({ id: e.id })), e, t);
246
246
  }
247
247
  onCanvasClick(e, t) {
248
248
  if (this.options.onCellClick) for (let n of this.cachedRects) {
@@ -257,7 +257,7 @@ var U = {
257
257
  renderChart(e, t, n, r) {
258
258
  (t !== this.lastLayoutWidth || n !== this.lastLayoutHeight) && this.recomputeLayout();
259
259
  let i = this.crosshair?.getPosition() ?? null;
260
- et(e, t, n, this.currentData, this.cachedRects, this.options, r, i);
260
+ Lt(e, t, n, this.currentData, this.cachedRects, this.options, r, i);
261
261
  }
262
262
  update(e) {
263
263
  this.currentData = e, this.options = {
@@ -274,7 +274,7 @@ var U = {
274
274
  destroy() {
275
275
  this.crosshair?.destroy(), this.handleClick && this.canvas.removeEventListener("click", this.handleClick), super.destroy();
276
276
  }
277
- }, dt = class extends B {
277
+ }, Zt = class extends V {
278
278
  options;
279
279
  crosshair = null;
280
280
  constructor(e, t) {
@@ -282,7 +282,7 @@ var U = {
282
282
  }
283
283
  renderChart(e, t, n, r) {
284
284
  let i = this.crosshair?.getPosition() ?? null;
285
- nt(e, t, n, this.options, r, i);
285
+ zt(e, t, n, this.options, r, i);
286
286
  }
287
287
  update(e) {
288
288
  this.options = {
@@ -299,12 +299,12 @@ var U = {
299
299
  destroy() {
300
300
  this.crosshair?.destroy(), super.destroy();
301
301
  }
302
- }, ft = 500;
303
- function pt(e) {
302
+ }, Qt = 500;
303
+ function $t(e) {
304
304
  let t = 1 - e;
305
305
  return 1 - t * t * t;
306
306
  }
307
- var mt = class extends B {
307
+ var en = class extends V {
308
308
  options;
309
309
  currentValue;
310
310
  targetValue;
@@ -315,7 +315,7 @@ var mt = class extends B {
315
315
  super(e, t.theme), this.options = t, this.currentValue = t.value, this.targetValue = t.value, this.requestRender();
316
316
  }
317
317
  renderChart(e, t, n, r) {
318
- $e(e, t, n, this.options, r, this.currentValue);
318
+ It(e, t, n, this.options, r, this.currentValue);
319
319
  }
320
320
  setValue(e) {
321
321
  if (this.options.animate === !1) {
@@ -345,7 +345,7 @@ var mt = class extends B {
345
345
  if (this.animationFrameId !== null) return;
346
346
  let e = () => {
347
347
  if (this.animationFrameId = null, this.animationStart === null) return;
348
- let t = this.options.animationDuration ?? ft, n = performance.now() - this.animationStart, r = Math.min(1, n / Math.max(1, t)), i = pt(r);
348
+ let t = this.options.animationDuration ?? Qt, n = performance.now() - this.animationStart, r = Math.min(1, n / Math.max(1, t)), i = $t(r);
349
349
  this.currentValue = this.animationFrom + (this.targetValue - this.animationFrom) * i, this.requestRender(), r < 1 ? this.animationFrameId = requestAnimationFrame(e) : (this.currentValue = this.targetValue, this.animationStart = null);
350
350
  };
351
351
  this.animationFrameId = requestAnimationFrame(e);
@@ -356,7 +356,7 @@ var mt = class extends B {
356
356
  destroy() {
357
357
  this.cancelAnimation(), super.destroy();
358
358
  }
359
- }, ht = [
359
+ }, tn = [
360
360
  "Jan",
361
361
  "Feb",
362
362
  "Mar",
@@ -391,7 +391,7 @@ function Y(e) {
391
391
  if (e.length === 0) return [];
392
392
  let t = [];
393
393
  for (let n of e) {
394
- let e = I(n.time, "1M"), r = t[t.length - 1];
394
+ let e = Ie(n.time, "1M"), r = t[t.length - 1];
395
395
  r && r.key === e ? r.close = n.equity : t.push({
396
396
  key: e,
397
397
  close: n.equity
@@ -404,7 +404,7 @@ function Y(e) {
404
404
  let a = new Date(e.key), o = a.getUTCFullYear(), s = a.getUTCMonth();
405
405
  r.push({
406
406
  id: `${o}-${String(s + 1).padStart(2, "0")}`,
407
- label: ht[s],
407
+ label: tn[s],
408
408
  group: String(o),
409
409
  value: i
410
410
  });
@@ -464,9 +464,9 @@ function Q(e) {
464
464
  //#endregion
465
465
  //#region src/finance/PerformanceDashboard.ts
466
466
  function $(e) {
467
- return !e || e === "dark" ? ie : e === "light" ? f : e;
467
+ return !e || e === "dark" ? pe : e === "light" ? y : e;
468
468
  }
469
- var gt = class {
469
+ var nn = class {
470
470
  options;
471
471
  theme;
472
472
  root;
@@ -615,6 +615,6 @@ var gt = class {
615
615
  }
616
616
  };
617
617
  //#endregion
618
- export { L as AlertManager, R as Animator, z as BarCountdown, V as BinanceAdapter, pe as BybitAdapter, u as Chart, lt as ChartGrid, me as ChartLegend, he as ChartStateManager, ge as CoinbaseAdapter, _e as CompareRenderer, ve as CrosshairTooltip, ye as CurrentPriceLine, ne as DARK_TERMINAL, re as DARK_THEME, ae as DEFAULT_DRAWING_STYLE, be as DEFAULT_LEGEND_CONFIG, oe as DEFAULT_RECONNECT, xe as DEFAULT_SESSION_HOURS, se as DEFAULT_SIGNAL_STYLE, ce as DEFAULT_STREAM_CONFIG, le as DEFAULT_TIMEFRAME_FAVORITES, ue as DEFAULT_TRADE_ZONE_STYLE, de as DEFAULT_TRADING_CONFIG, Se as DataExporter, o as DataManager, W as DepthChart, ee as DragDropImporter, Ce as DrawingBase, we as Easing, G as EquityCurveChart, mt as GaugeChart, K as HeatmapChart, Te as IndicatorBase, Ee as IndicatorValueMap, De as KeyboardHandler, Oe as KrakenAdapter, fe as LIGHT_THEME, r as LayoutManager, p as MARKET_CRYPTO, m as MARKET_HNX, h as MARKET_HOSE, g as MARKET_NYSE, _ as MARKET_UPCOM, ke as MockAdapter, a as PLUGIN_API_VERSION, Ae as PaperExecutionAdapter, gt as PerformanceDashboard, i as PluginManager, je as PollingAdapter, Me as RANGE_PRESETS, Ne as ReplayManager, Pe as Screenshot, Fe as SessionBreaks, Ie as SessionShading, Le as SignalMarkerManager, ut as SparklineChart, Re as StreamManager, v as TC_PALETTE, y as TC_SERIES_COLORS, b as TIMEFRAMES_CRYPTO, x as TIMEFRAMES_FOREX, S as TIMEFRAMES_STOCK, l as ThemeManager, ze as TickAggregator, Be as TradeZoneManager, Ve as UndoRedoManager, C as VN_COLORS, He as VolumeRenderer, dt as WaterfallChart, Ue as Watermark, We as WebSocketAdapter, e as clearGlobalPlugins, J as computeDrawdownCurve, Y as computeMonthlyReturns, w as computePriceLimits, T as createVNTheme, E as formatNumber, Ge as formatTooltipTime, D as formatVND, O as formatVolumeLoc, k as getCurrentSession, c as getGlobalPlugins, A as getLocale, Je as lttbDownsample, Ye as lttbVisibleIndices, j as normalizeBar, M as normalizeBarTime, te as overlaysForLayer, s as parseOHLCV, n as pluginKey, Xe as rangePresetStart, N as registerLocale, d as registerPlugin, Q as selectKeyStats, P as setLocale, F as t, q as toEquityPoints, rt as toHeikinAshi, it as toKagi, at as toLineBreak, ot as toPointAndFigure, st as toRangeBars, ct as toRenko, t as unregisterPlugin };
618
+ export { Be as AlertManager, Ve as Animator, He as BarCountdown, Ue as BinanceAdapter, We as BybitAdapter, i as Chart, Yt as ChartGrid, Ge as ChartLegend, Ke as ChartStateManager, qe as CoinbaseAdapter, Je as CompareRenderer, Ye as CrosshairTooltip, Xe as CurrentPriceLine, de as DARK_TERMINAL, fe as DARK_THEME, d as DEFAULT_DRAWING_STYLE, r as DEFAULT_HISTORY_PAGE_SIZE, Ze as DEFAULT_LEGEND_CONFIG, f as DEFAULT_RECONNECT, Qe as DEFAULT_SESSION_HOURS, p as DEFAULT_SIGNAL_STYLE, m as DEFAULT_STREAM_CONFIG, h as DEFAULT_TIMEFRAME_FAVORITES, g as DEFAULT_TRADE_ZONE_STYLE, _ as DEFAULT_TRADING_CONFIG, $e as DataExporter, e as DataManager, Xt as DepthChart, ne as DragDropImporter, et as DrawingBase, u as EXCHANGE_TIMEZONE, tt as Easing, G as EquityCurveChart, en as GaugeChart, le as HISTORY_RETRY_MS, K as HeatmapChart, nt as IndicatorBase, rt as IndicatorValueMap, it as KeyboardHandler, at as KrakenAdapter, v as LIGHT_THEME, ce as LayoutManager, oe as LayoutSession, b as MARKET_CRYPTO, x as MARKET_HNX, S as MARKET_HOSE, C as MARKET_NYSE, w as MARKET_UPCOM, ot as MAX_ALERT_BARS, te as MAX_LAYOUT_NAME, st as MIN_ALERT_BARS, ct as MockAdapter, c as PLUGIN_API_VERSION, T as PRICE_SOURCES, lt as PaperExecutionAdapter, nn as PerformanceDashboard, se as PluginManager, ut as PollingAdapter, dt as RANGE_PRESETS, ft as ReplayManager, pt as ResamplingAdapter, mt as Screenshot, ht as SessionBreaks, gt as SessionShading, _t as SignalMarkerManager, W as SparklineChart, vt as StreamManager, E as TC_PALETTE, D as TC_SERIES_COLORS, O as TIMEFRAMES_CRYPTO, k as TIMEFRAMES_FOREX, A as TIMEFRAMES_STOCK, ue as ThemeManager, yt as TickAggregator, bt as TickBarAdapter, xt as TickBarBuilder, St as TradeZoneManager, Ct as UndoRedoManager, j as VN_COLORS, wt as VolumeRenderer, Zt as WaterfallChart, Tt as Watermark, Et as WebSocketAdapter, ie as cleanLayoutName, a as clearGlobalPlugins, J as computeDrawdownCurve, Y as computeMonthlyReturns, M as computePriceLimits, N as createVNTheme, P as formatFraction, F as formatNumber, Dt as formatTooltipTime, I as formatVND, L as formatVolumeLoc, R as fractionTick, z as getCurrentSession, o as getGlobalPlugins, B as getLocale, me as indicatorSource, Ot as isPriceLevelAlert, he as isPriceSource, ge as isTimeFrame, _e as isValidTimeZone, l as localStorageLayouts, jt as lttbDownsample, Mt as lttbVisibleIndices, ve as marketStatus, n as memoryLayouts, ye as normalizeBar, be as normalizeBarTime, xe as offsetAt, s as overlaysForLayer, Se as parseIndicatorSource, ae as parseOHLCV, Ce as parseTimeframe, we as pickBaseTimeframe, t as pluginKey, Te as priceFormatterFor, Nt as rangePresetStart, Ee as rankSymbols, De as readNews, Oe as readQuote, ke as registerLocale, re as registerPlugin, Ae as resampleBars, Q as selectKeyStats, Bt as servesTimeframe, je as setLocale, Me as sourcePrice, Ne as stepDecimals, Pe as t, Fe as tickBarCount, Le as timeframeToMs, q as toEquityPoints, Vt as toHeikinAshi, Ht as toKagi, Ut as toLineBreak, Wt as toPointAndFigure, Gt as toRangeBars, Kt as toRenko, ee as unregisterPlugin, Re as wallToUtc, qt as withResampling, Jt as withTickBars, ze as zoneOffsetMinutes };
619
619
 
620
620
  //# sourceMappingURL=index.js.map