@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.
- package/LICENSE +21 -21
- package/README.md +910 -858
- package/dist/Chart.d.ts +606 -23
- package/dist/Chart.d.ts.map +1 -1
- package/dist/DataManager.d.ts +5 -0
- package/dist/DataManager.d.ts.map +1 -1
- package/dist/HistoryPager.d.ts +58 -0
- package/dist/HistoryPager.d.ts.map +1 -0
- package/dist/LayoutSession-CTZB90NX.cjs +2 -0
- package/dist/LayoutSession-CTZB90NX.cjs.map +1 -0
- package/dist/LayoutSession-CWn3sdbs.js +3967 -0
- package/dist/LayoutSession-CWn3sdbs.js.map +1 -0
- package/dist/ThemeManager.d.ts +5 -1
- package/dist/ThemeManager.d.ts.map +1 -1
- package/dist/chartA11y.d.ts +59 -0
- package/dist/chartA11y.d.ts.map +1 -0
- package/dist/charts/ChartTypeStrategy.d.ts +5 -4
- package/dist/charts/ChartTypeStrategy.d.ts.map +1 -1
- package/dist/grid/ChartGrid.d.ts +6 -1
- package/dist/grid/ChartGrid.d.ts.map +1 -1
- package/dist/i18n-CiQ8EDVs.js +1469 -0
- package/dist/i18n-CiQ8EDVs.js.map +1 -0
- package/dist/i18n-WsLA9SmD.cjs +2 -0
- package/dist/i18n-WsLA9SmD.cjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +22 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +31 -31
- package/dist/index.js.map +1 -1
- package/dist/indicatorLabel.d.ts +7 -0
- package/dist/indicatorLabel.d.ts.map +1 -0
- package/dist/layout/LayoutManager.d.ts +50 -0
- package/dist/layout/LayoutManager.d.ts.map +1 -1
- package/dist/layout/priceAxisWidth.d.ts +2 -0
- package/dist/layout/priceAxisWidth.d.ts.map +1 -1
- package/dist/regularHours.d.ts +10 -0
- package/dist/regularHours.d.ts.map +1 -0
- package/dist/state/LayoutSession.d.ts +101 -0
- package/dist/state/LayoutSession.d.ts.map +1 -0
- package/dist/state/layoutStorage.d.ts +46 -0
- package/dist/state/layoutStorage.d.ts.map +1 -0
- package/dist/trading/wireExecution.d.ts +7 -3
- package/dist/trading/wireExecution.d.ts.map +1 -1
- package/dist/widget/ChartWidget.d.ts +219 -10
- package/dist/widget/ChartWidget.d.ts.map +1 -1
- package/dist/widget/ChartWidgetGrid.d.ts +166 -0
- package/dist/widget/ChartWidgetGrid.d.ts.map +1 -0
- package/dist/widget/DrawingTemplateStore.d.ts +29 -8
- package/dist/widget/DrawingTemplateStore.d.ts.map +1 -1
- package/dist/widget/WatchlistStore.d.ts +65 -0
- package/dist/widget/WatchlistStore.d.ts.map +1 -0
- package/dist/widget/WidgetAccountPanel.d.ts +72 -0
- package/dist/widget/WidgetAccountPanel.d.ts.map +1 -0
- package/dist/widget/WidgetAlertsPanel.d.ts +50 -3
- package/dist/widget/WidgetAlertsPanel.d.ts.map +1 -1
- package/dist/widget/WidgetBracketBar.d.ts +3 -1
- package/dist/widget/WidgetBracketBar.d.ts.map +1 -1
- package/dist/widget/WidgetChartNav.d.ts +36 -0
- package/dist/widget/WidgetChartNav.d.ts.map +1 -0
- package/dist/widget/WidgetCommandPalette.d.ts +3 -1
- package/dist/widget/WidgetCommandPalette.d.ts.map +1 -1
- package/dist/widget/WidgetContextMenu.d.ts +40 -0
- package/dist/widget/WidgetContextMenu.d.ts.map +1 -0
- package/dist/widget/WidgetDataWindow.d.ts +3 -1
- package/dist/widget/WidgetDataWindow.d.ts.map +1 -1
- package/dist/widget/WidgetDepthLadder.d.ts +3 -1
- package/dist/widget/WidgetDepthLadder.d.ts.map +1 -1
- package/dist/widget/WidgetDrawingSettings.d.ts +108 -0
- package/dist/widget/WidgetDrawingSettings.d.ts.map +1 -0
- package/dist/widget/WidgetDrawingSidebar.d.ts +14 -1
- package/dist/widget/WidgetDrawingSidebar.d.ts.map +1 -1
- package/dist/widget/WidgetDrawingStyle.d.ts +3 -1
- package/dist/widget/WidgetDrawingStyle.d.ts.map +1 -1
- package/dist/widget/WidgetDropdown.d.ts.map +1 -1
- package/dist/widget/WidgetGoToDate.d.ts +5 -4
- package/dist/widget/WidgetGoToDate.d.ts.map +1 -1
- package/dist/widget/WidgetHistoryPill.d.ts +23 -0
- package/dist/widget/WidgetHistoryPill.d.ts.map +1 -0
- package/dist/widget/WidgetHotkeySheet.d.ts.map +1 -1
- package/dist/widget/WidgetIndicatorLegend.d.ts +31 -1
- package/dist/widget/WidgetIndicatorLegend.d.ts.map +1 -1
- package/dist/widget/WidgetIndicatorSettings.d.ts +62 -7
- package/dist/widget/WidgetIndicatorSettings.d.ts.map +1 -1
- package/dist/widget/WidgetIntervalInput.d.ts +34 -0
- package/dist/widget/WidgetIntervalInput.d.ts.map +1 -0
- package/dist/widget/WidgetLayoutsDialog.d.ts +39 -0
- package/dist/widget/WidgetLayoutsDialog.d.ts.map +1 -0
- package/dist/widget/WidgetLayoutsUI.d.ts +37 -0
- package/dist/widget/WidgetLayoutsUI.d.ts.map +1 -0
- package/dist/widget/WidgetNamePrompt.d.ts +31 -0
- package/dist/widget/WidgetNamePrompt.d.ts.map +1 -0
- package/dist/widget/WidgetObjectTree.d.ts +21 -3
- package/dist/widget/WidgetObjectTree.d.ts.map +1 -1
- package/dist/widget/WidgetOrderTicket.d.ts +49 -0
- package/dist/widget/WidgetOrderTicket.d.ts.map +1 -0
- package/dist/widget/WidgetReplayBar.d.ts +15 -0
- package/dist/widget/WidgetReplayBar.d.ts.map +1 -1
- package/dist/widget/WidgetSettings.d.ts +13 -1
- package/dist/widget/WidgetSettings.d.ts.map +1 -1
- package/dist/widget/WidgetStatusBar.d.ts +3 -0
- package/dist/widget/WidgetStatusBar.d.ts.map +1 -1
- package/dist/widget/WidgetStyles.d.ts +3 -1
- package/dist/widget/WidgetStyles.d.ts.map +1 -1
- package/dist/widget/WidgetSymbolInfo.d.ts +64 -0
- package/dist/widget/WidgetSymbolInfo.d.ts.map +1 -0
- package/dist/widget/WidgetSymbolSearch.d.ts +26 -5
- package/dist/widget/WidgetSymbolSearch.d.ts.map +1 -1
- package/dist/widget/WidgetToolbar.d.ts +30 -1
- package/dist/widget/WidgetToolbar.d.ts.map +1 -1
- package/dist/widget/WidgetWatchlist.d.ts +53 -13
- package/dist/widget/WidgetWatchlist.d.ts.map +1 -1
- package/dist/widget/chartMenu.d.ts +40 -0
- package/dist/widget/chartMenu.d.ts.map +1 -0
- package/dist/widget/drawingMenu.d.ts +21 -0
- package/dist/widget/drawingMenu.d.ts.map +1 -0
- package/dist/widget/focusTrap.d.ts +8 -0
- package/dist/widget/focusTrap.d.ts.map +1 -0
- package/dist/widget/i18n.d.ts +20 -89
- package/dist/widget/i18n.d.ts.map +1 -1
- package/dist/widget/iconSet.d.ts.map +1 -1
- package/dist/widget/index.cjs +4294 -3028
- package/dist/widget/index.cjs.map +1 -1
- package/dist/widget/index.d.ts +15 -1
- package/dist/widget/index.d.ts.map +1 -1
- package/dist/widget/index.js +6326 -1185
- package/dist/widget/index.js.map +1 -1
- package/dist/widget/indicatorTemplates.d.ts +24 -0
- package/dist/widget/indicatorTemplates.d.ts.map +1 -0
- package/dist/widget/keyTarget.d.ts +11 -0
- package/dist/widget/keyTarget.d.ts.map +1 -0
- package/dist/widget/legendValues.d.ts +11 -6
- package/dist/widget/legendValues.d.ts.map +1 -1
- package/dist/widget/locales/ar.d.ts +4 -0
- package/dist/widget/locales/ar.d.ts.map +1 -0
- package/dist/widget/locales/de.d.ts +4 -0
- package/dist/widget/locales/de.d.ts.map +1 -0
- package/dist/widget/locales/en.d.ts +722 -0
- package/dist/widget/locales/en.d.ts.map +1 -0
- package/dist/widget/locales/es.d.ts +4 -0
- package/dist/widget/locales/es.d.ts.map +1 -0
- package/dist/widget/locales/fr.d.ts +4 -0
- package/dist/widget/locales/fr.d.ts.map +1 -0
- package/dist/widget/locales/he.d.ts +4 -0
- package/dist/widget/locales/he.d.ts.map +1 -0
- package/dist/widget/locales/id.d.ts +4 -0
- package/dist/widget/locales/id.d.ts.map +1 -0
- package/dist/widget/locales/index.cjs +2 -0
- package/dist/widget/locales/index.cjs.map +1 -0
- package/dist/widget/locales/index.d.ts +33 -0
- package/dist/widget/locales/index.d.ts.map +1 -0
- package/dist/widget/locales/index.js +10089 -0
- package/dist/widget/locales/index.js.map +1 -0
- package/dist/widget/locales/ja.d.ts +4 -0
- package/dist/widget/locales/ja.d.ts.map +1 -0
- package/dist/widget/locales/ko.d.ts +4 -0
- package/dist/widget/locales/ko.d.ts.map +1 -0
- package/dist/widget/locales/pt.d.ts +4 -0
- package/dist/widget/locales/pt.d.ts.map +1 -0
- package/dist/widget/locales/ru.d.ts +4 -0
- package/dist/widget/locales/ru.d.ts.map +1 -0
- package/dist/widget/locales/th.d.ts +4 -0
- package/dist/widget/locales/th.d.ts.map +1 -0
- package/dist/widget/locales/tr.d.ts +4 -0
- package/dist/widget/locales/tr.d.ts.map +1 -0
- package/dist/widget/locales/vi.d.ts +4 -0
- package/dist/widget/locales/vi.d.ts.map +1 -0
- package/dist/widget/locales/zh.d.ts +4 -0
- package/dist/widget/locales/zh.d.ts.map +1 -0
- package/dist/widget/locales/zhHant.d.ts +4 -0
- package/dist/widget/locales/zhHant.d.ts.map +1 -0
- package/dist/widget/orderTicket.d.ts +27 -0
- package/dist/widget/orderTicket.d.ts.map +1 -0
- package/dist/widget/settingsControls.d.ts +24 -0
- package/dist/widget/settingsControls.d.ts.map +1 -0
- package/dist/widget/types.d.ts +182 -6
- package/dist/widget/types.d.ts.map +1 -1
- package/dist/widget/widgetConfig.d.ts.map +1 -1
- package/dist/widget/widgetLayout.d.ts +22 -0
- package/dist/widget/widgetLayout.d.ts.map +1 -0
- package/dist/widget/widgetLocales.d.ts +17 -0
- package/dist/widget/widgetLocales.d.ts.map +1 -0
- package/dist/widget/widgetTimeframes.d.ts +8 -0
- package/dist/widget/widgetTimeframes.d.ts.map +1 -1
- package/dist/widget/widgetTimezones.d.ts +32 -0
- package/dist/widget/widgetTimezones.d.ts.map +1 -0
- package/dist/widget/widgetUI.d.ts +126 -0
- package/dist/widget/widgetUI.d.ts.map +1 -0
- package/package.json +8 -3
- package/dist/DragDropImporter-C5kgfbET.cjs +0 -2
- package/dist/DragDropImporter-C5kgfbET.cjs.map +0 -1
- package/dist/DragDropImporter-Dd9Mud5J.js +0 -2099
- package/dist/DragDropImporter-Dd9Mud5J.js.map +0 -1
- package/dist/charts/IndicatorPriceRange.d.ts +0 -20
- package/dist/charts/IndicatorPriceRange.d.ts.map +0 -1
package/dist/index.cjs.map
CHANGED
|
@@ -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":"2LA4BA,IAAM,EAAiE,CACrE,MAAO,CAAE,KAAM,EAAG,KAAM,EAAG,CAC3B,MAAO,CAAE,KAAM,EAAG,KAAM,EAAG,CAC3B,MAAO,CAAE,KAAM,EAAG,KAAM,EAAG,CAC3B,MAAO,CAAE,KAAM,EAAG,KAAM,EAAG,CAC3B,MAAO,CAAE,KAAM,EAAG,KAAM,EAAG,CAC3B,MAAO,CAAE,KAAM,EAAG,KAAM,EAAG,CAC3B,MAAO,CAAE,KAAM,EAAG,KAAM,EAAG,CAC3B,MAAO,CAAE,KAAM,EAAG,KAAM,EAAG,CAC5B,CAEY,EAAb,KAAuB,CACrB,KACA,MAA4B,EAAE,CAC9B,OACA,QACA,UAAoB,GACpB,QAAkB,GAElB,YAAY,EAAwB,EAA4B,EAAE,CAAE,CAClE,KAAK,QAAU,EACf,KAAK,OAAS,EAAQ,QAAU,MAEhC,KAAK,KAAO,SAAS,cAAc,MAAM,CACzC,KAAK,KAAK,MAAM,QAAU,uDAC1B,EAAU,YAAY,KAAK,KAAK,CAEhC,KAAK,aAAa,CAClB,KAAK,aAAa,CAGpB,aAA4B,CAC1B,GAAM,CAAE,OAAM,QAAS,EAAW,KAAK,QACjC,EAAM,KAAK,QAAQ,KAAO,EAChC,KAAK,KAAK,MAAM,oBAAsB,UAAU,EAAK,QACrD,KAAK,KAAK,MAAM,iBAAmB,UAAU,EAAK,QAClD,KAAK,KAAK,MAAM,IAAM,GAAG,EAAI,IAG/B,aAA4B,CAC1B,GAAM,CAAE,OAAM,QAAS,EAAW,KAAK,QACjC,EAAQ,EAAO,EACrB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAO,IAAK,KAAK,MAAM,KAAK,KAAK,WAAW,EAAE,CAAC,CAGrE,WAAmB,EAAqB,CACtC,IAAM,EAAa,KAAK,QAAQ,QAAQ,IAAM,EAAE,CAE1C,EAAS,SAAS,cAAc,MAAM,CAC5C,EAAO,MAAM,QAAU,8DACvB,KAAK,KAAK,YAAY,EAAO,CAmB7B,IAAM,EAAQ,IAAI,EAAA,EAAM,EAAQ,CAhB9B,UAAW,cACX,UAAW,GACX,SAAU,CACR,UAAW,GACX,SAAU,GACV,OAAQ,GACR,OAAQ,GACR,UAAW,GACX,SAAU,GACV,KAAM,GACP,CACD,GAAG,KAAK,QAAQ,aAChB,GAAG,EAAW,aACd,MAAO,KAAK,QAAQ,MAGU,CAAU,CAEpC,EAAiB,CACrB,UAAW,EACX,QACA,OAAQ,EAAW,QAAU,SAAS,EAAI,IAC1C,UAAW,EAAW,WAAa,KACpC,CAwCD,OApCI,KAAK,QAAQ,gBAAkB,KACjC,EAAM,GAAG,gBAAkB,GAAM,CAC/B,IAAM,EAAO,EAAE,QAAQ,KAAK,KACxB,OAAS,IAAA,GACb,IAAK,IAAM,KAAS,KAAK,MACnB,EAAM,QAAU,GAAO,EAAM,MAAM,iBAAiB,EAAK,EAE/D,CACF,EAAM,GAAG,qBAAwB,CAC/B,IAAK,IAAM,KAAS,KAAK,MACnB,EAAM,QAAU,GAAO,EAAM,MAAM,iBAAiB,KAAK,EAE/D,EAGA,KAAK,QAAQ,eAAiB,IAChC,EAAM,GAAG,qBAAuB,GAAM,CACpC,GAAI,KAAK,QAAS,OAClB,KAAK,QAAU,GACf,GAAM,CAAE,OAAM,MAAO,EAAE,QACjB,EAAU,EAAM,SAAS,CAC/B,GAAI,EAAQ,OAAS,GAAK,GAAQ,GAAK,EAAK,EAAQ,OAAQ,CAC1D,IAAM,EAAW,EAAQ,IAAO,KAC1B,EAAS,EAAQ,IAAK,KAC5B,GAAI,GAAY,MACT,IAAM,KAAS,KAAK,MACnB,EAAM,QAAU,GAClB,EAAM,MAAM,gBAAgB,EAAU,EAAO,CAKrD,KAAK,QAAU,IACf,CAGG,EAGT,UAAU,EAA0B,CAClC,GAAI,IAAW,KAAK,OAAQ,OAC5B,IAAM,EAAW,KAAK,MAAM,OACtB,CAAE,OAAM,QAAS,EAAW,GAC5B,EAAW,EAAO,EAExB,GAAI,EAAW,EACb,IAAK,IAAI,EAAI,EAAW,EAAG,GAAK,EAAU,IAAK,CAC7C,IAAM,EAAO,KAAK,MAAM,GACxB,EAAK,MAAM,SAAS,CACpB,EAAK,UAAU,QAAQ,CACvB,KAAK,MAAM,KAAK,CAIpB,KAAK,OAAS,EACd,KAAK,aAAa,CAGlB,IAAK,IAAI,EAAI,EAAU,EAAI,EAAU,IAAK,KAAK,MAAM,KAAK,KAAK,WAAW,EAAE,CAAC,CAG/E,SAAS,EAA6B,CACpC,OAAO,KAAK,MAAM,IAAQ,OAAS,KAGrC,WAAqB,CACnB,OAAO,KAAK,MAAM,IAAI,GAAK,EAAE,MAAM,CAGrC,cAAuB,CACrB,OAAO,KAAK,MAAM,OAGpB,QAAQ,EAAe,EAAwB,CAC7C,KAAK,MAAM,IAAQ,MAAM,QAAQ,EAAK,CAGxC,WAAW,EAAwB,CACjC,IAAK,IAAM,KAAQ,KAAK,MACtB,EAAK,MAAM,QAAQ,EAAK,CAI5B,MAAM,YAAY,EAAe,EAAqC,CACpE,IAAM,EAAO,KAAK,MAAM,GACnB,IACL,EAAK,OAAS,EAAO,OACrB,EAAK,UAAY,EAAO,UACxB,MAAM,EAAK,MAAM,QAAQ,EAAO,EAGlC,MAAM,WAAW,EAAsB,EAAmB,EAAsB,EAAe,IAAoB,CACjH,IAAM,EAA4B,EAAE,CACpC,IAAK,IAAI,EAAI,EAAG,EAAI,KAAK,MAAM,QAAU,EAAI,EAAQ,OAAQ,IAC3D,EAAS,KAAK,KAAK,YAAY,EAAG,CAChC,UACA,OAAQ,EAAQ,GAChB,YACA,eACD,CAAC,CAAC,CAEL,MAAM,QAAQ,IAAI,EAAS,CAG7B,SAAS,EAAoB,CAC3B,IAAK,IAAM,KAAQ,KAAK,MACtB,EAAK,MAAM,SAAS,EAAM,CAI9B,SAAgB,CACV,SAAK,UACT,MAAK,UAAY,GACjB,IAAK,IAAM,KAAQ,KAAK,MACtB,EAAK,MAAM,SAAS,CACpB,EAAK,UAAU,QAAQ,CAEzB,KAAK,MAAQ,EAAE,CACf,KAAK,KAAK,QAAQ,IC/NT,EAAb,cAAoC,EAAA,gBAAiB,CACnD,QAEA,YAAY,EAAwB,EAA2B,CAC7D,MAAM,EAAW,EAAQ,MAAM,CAC/B,KAAK,QAAU,EACf,KAAK,eAAe,CAGtB,YACE,EACA,EACA,EACA,EACM,EACN,EAAA,EAAA,iBAAgB,EAAK,EAAO,EAAQ,KAAK,QAAS,EAAM,CAG1D,OAAO,EAAsB,CAC3B,KAAK,QAAU,CAAE,GAAG,KAAK,QAAS,OAAM,CACxC,KAAK,eAAe,CAGtB,WAAW,EAAuC,CAChD,KAAK,QAAU,CAAE,GAAG,KAAK,QAAS,GAAG,EAAM,CAC3C,KAAK,eAAe,GCzBX,EAAb,cAAgC,EAAA,gBAAiB,CAC/C,QACA,UAA6C,KAE7C,YAAY,EAAwB,EAA4B,CAC9D,MAAM,EAAW,EAAQ,MAAM,CAC/B,KAAK,QAAU,EAEX,EAAQ,YAAc,KACxB,KAAK,UAAY,IAAI,EAAA,iBAAiB,KAAK,WAAc,KAAK,eAAe,CAAC,EAGhF,KAAK,eAAe,CAGtB,YACE,EACA,EACA,EACA,EACM,CACN,IAAM,EAAM,KAAK,WAAW,aAAa,EAAI,MAC7C,EAAA,EAAA,kBAAiB,EAAK,EAAO,EAAQ,KAAK,QAAS,EAAO,EAAI,CAGhE,OAAO,EAAuB,CAC5B,KAAK,QAAU,CAAE,GAAG,KAAK,QAAS,OAAM,CACxC,KAAK,eAAe,CAGtB,WAAW,EAAwC,CACjD,KAAK,QAAU,CAAE,GAAG,KAAK,QAAS,GAAG,EAAM,CAC3C,KAAK,eAAe,CAGtB,SAAgB,CACd,KAAK,WAAW,SAAS,CACzB,MAAM,SAAS,GCrCN,EAAb,cAAsC,EAAA,gBAAiB,CACrD,QACA,UAA6C,KAE7C,YAAY,EAAwB,EAA6B,CAC/D,MAAM,EAAW,EAAQ,MAAM,CAC/B,KAAK,QAAU,EAEX,EAAQ,YAAc,KACxB,KAAK,UAAY,IAAI,EAAA,iBAAiB,KAAK,WAAc,KAAK,eAAe,CAAC,EAGhF,KAAK,eAAe,CAGtB,YACE,EACA,EACA,EACA,EACM,CACN,IAAM,EAAM,KAAK,WAAW,aAAa,EAAI,MAC7C,EAAA,EAAA,mBAAkB,EAAK,EAAO,EAAQ,KAAK,QAAS,EAAO,EAAI,CAGjE,OAAO,EAAqB,EAAiC,CAC3D,KAAK,QAAU,CAAE,GAAG,KAAK,QAAS,OAAM,CACpC,IAAc,IAAA,KAChB,KAAK,QAAU,CAAE,GAAG,KAAK,QAAS,YAAW,EAE/C,KAAK,eAAe,CAGtB,WAAW,EAAyC,CAClD,KAAK,QAAU,CAAE,GAAG,KAAK,QAAS,GAAG,EAAM,CAC3C,KAAK,eAAe,CAGtB,SAAgB,CACd,KAAK,WAAW,SAAS,CACzB,MAAM,SAAS,GCjCN,EAAb,cAAkC,EAAA,gBAAiB,CACjD,QACA,UAA6C,KAC7C,YAAoC,EAAE,CACtC,YAAqC,EAAE,CACvC,gBAA0B,EAC1B,iBAA2B,EAC3B,YAAwD,KAExD,YAAY,EAAwB,EAAyB,CAC3D,MAAM,EAAW,EAAQ,MAAM,CAC/B,KAAK,QAAU,EACf,KAAK,YAAc,EAAQ,MAAQ,EAAE,CAEjC,EAAQ,YAAc,KACxB,KAAK,UAAY,IAAI,EAAA,iBAAiB,KAAK,WAAc,KAAK,eAAe,CAAC,EAG5E,EAAQ,cACV,KAAK,YAAe,GAAkB,CACpC,IAAM,EAAO,KAAK,OAAO,uBAAuB,CAC1C,EAAI,EAAE,QAAU,EAAK,KACrB,EAAI,EAAE,QAAU,EAAK,IAC3B,KAAK,cAAc,EAAG,EAAE,EAE1B,KAAK,OAAO,iBAAiB,QAAS,KAAK,YAAY,EAGzD,KAAK,iBAAiB,CACtB,KAAK,eAAe,CAGtB,iBAAgC,CAC9B,IAAM,EAAS,CAAE,EAAG,EAAG,EAAG,EAAG,MAAO,KAAK,MAAO,OAAQ,KAAK,OAAQ,CAC/D,EAAU,KAAK,QAAQ,aAAe,EAI5C,GAHA,KAAK,gBAAkB,KAAK,MAC5B,KAAK,iBAAmB,KAAK,OAEzB,KAAK,QAAQ,SAAU,CACzB,IAAM,EAAW,KAAK,YAAY,IAAI,IAAM,CAC1C,GAAI,EAAE,GACN,OAAQ,EAAE,SAAW,KAAK,IAAI,EAAE,MAAM,EAAI,GAC3C,EAAE,CACH,KAAK,aAAA,EAAA,EAAA,yBAAsC,EAAU,EAAQ,EAAQ,MAErE,KAAK,aAAA,EAAA,EAAA,mBACH,KAAK,YAAY,IAAI,IAAM,CAAE,GAAI,EAAE,GAAI,EAAE,CACzC,EACA,EACD,CAIL,cAAsB,EAAW,EAAiB,CAC3C,QAAK,QAAQ,YAElB,IAAK,IAAM,KAAM,KAAK,YAAa,CACjC,IAAM,EAAI,EAAG,KACb,GAAI,GAAK,EAAE,GAAK,GAAK,EAAE,EAAI,EAAE,OAAS,GAAK,EAAE,GAAK,GAAK,EAAE,EAAI,EAAE,OAAQ,CACrE,IAAM,EAAO,KAAK,YAAY,KAAK,GAAK,EAAE,KAAO,EAAG,GAAG,CACnD,GAAM,KAAK,QAAQ,YAAY,EAAK,CACxC,SAKN,YACE,EACA,EACA,EACA,EACM,EACF,IAAU,KAAK,iBAAmB,IAAW,KAAK,mBACpD,KAAK,iBAAiB,CAGxB,IAAM,EAAM,KAAK,WAAW,aAAa,EAAI,MAC7C,EAAA,EAAA,eAAc,EAAK,EAAO,EAAQ,KAAK,YAAa,KAAK,YAAa,KAAK,QAAS,EAAO,EAAI,CAGjG,OAAO,EAA2B,CAChC,KAAK,YAAc,EACnB,KAAK,QAAU,CAAE,GAAG,KAAK,QAAS,OAAM,CACxC,KAAK,iBAAiB,CACtB,KAAK,eAAe,CAGtB,WAAW,EAAqC,CAC9C,KAAK,QAAU,CAAE,GAAG,KAAK,QAAS,GAAG,EAAM,CACvC,EAAK,OACP,KAAK,YAAc,EAAK,MAE1B,KAAK,iBAAiB,CACtB,KAAK,eAAe,CAGtB,SAAgB,CACd,KAAK,WAAW,SAAS,CACrB,KAAK,aACP,KAAK,OAAO,oBAAoB,QAAS,KAAK,YAAY,CAE5D,MAAM,SAAS,GC5GN,EAAb,cAAoC,EAAA,gBAAiB,CACnD,QACA,UAA6C,KAE7C,YAAY,EAAwB,EAA2B,CAC7D,MAAM,EAAW,EAAQ,MAAM,CAC/B,KAAK,QAAU,EAEX,EAAQ,YAAc,KACxB,KAAK,UAAY,IAAI,EAAA,iBAAiB,KAAK,WAAc,KAAK,eAAe,CAAC,EAGhF,KAAK,eAAe,CAGtB,YACE,EACA,EACA,EACA,EACM,CACN,IAAM,EAAM,KAAK,WAAW,aAAa,EAAI,MAC7C,EAAA,EAAA,iBAAgB,EAAK,EAAO,EAAQ,KAAK,QAAS,EAAO,EAAI,CAG/D,OAAO,EAA4B,CACjC,KAAK,QAAU,CAAE,GAAG,KAAK,QAAS,OAAM,CACxC,KAAK,eAAe,CAGtB,WAAW,EAAuC,CAChD,KAAK,QAAU,CAAE,GAAG,KAAK,QAAS,GAAG,EAAM,CAC3C,KAAK,eAAe,CAGtB,SAAgB,CACd,KAAK,WAAW,SAAS,CACzB,MAAM,SAAS,GCrCb,EAAuB,IAE7B,SAAS,EAAa,EAAmB,CACvC,IAAM,EAAM,EAAI,EAChB,MAAO,GAAI,EAAM,EAAM,EAGzB,IAAa,EAAb,cAAgC,EAAA,gBAAiB,CAC/C,QACA,aACA,YACA,eAAwC,KACxC,cAAwB,EACxB,iBAA0C,KAE1C,YAAY,EAAwB,EAAuB,CACzD,MAAM,EAAW,EAAQ,MAAM,CAC/B,KAAK,QAAU,EACf,KAAK,aAAe,EAAQ,MAC5B,KAAK,YAAc,EAAQ,MAC3B,KAAK,eAAe,CAGtB,YACE,EACA,EACA,EACA,EACM,EACN,EAAA,EAAA,aAAY,EAAK,EAAO,EAAQ,KAAK,QAAS,EAAO,KAAK,aAAa,CAGzE,SAAS,EAAqB,CAE5B,GADgB,KAAK,QAAQ,UAAY,GAC3B,CACZ,KAAK,iBAAiB,CACtB,KAAK,aAAe,EACpB,KAAK,YAAc,EACnB,KAAK,QAAU,CAAE,GAAG,KAAK,QAAS,QAAO,CACzC,KAAK,eAAe,CACpB,OAGF,KAAK,YAAc,EACnB,KAAK,cAAgB,KAAK,aAC1B,KAAK,eAAiB,YAAY,KAAK,CACvC,KAAK,QAAU,CAAE,GAAG,KAAK,QAAS,QAAO,CACzC,KAAK,oBAAoB,CAG3B,WAAW,EAAmC,CAC5C,IAAM,EAAO,CAAE,GAAG,KAAK,QAAS,GAAG,EAAM,CAEzC,GAAI,EAAK,QAAU,IAAA,IAAa,EAAK,QAAU,KAAK,YAAa,CAC/D,KAAK,QAAU,EACf,KAAK,SAAS,EAAK,MAAM,CACzB,OAEF,KAAK,QAAU,EACf,KAAK,eAAe,CAGtB,oBAAmC,CACjC,GAAI,KAAK,mBAAqB,KAAM,OACpC,IAAM,MAAmB,CAEvB,GADA,KAAK,iBAAmB,KACpB,KAAK,iBAAmB,KAAM,OAElC,IAAM,EAAW,KAAK,QAAQ,mBAAqB,EAC7C,EAAU,YAAY,KAAK,CAAG,KAAK,eACnC,EAAI,KAAK,IAAI,EAAG,EAAU,KAAK,IAAI,EAAG,EAAS,CAAC,CAChD,EAAQ,EAAa,EAAE,CAC7B,KAAK,aAAe,KAAK,eAAiB,KAAK,YAAc,KAAK,eAAiB,EAEnF,KAAK,eAAe,CAEhB,EAAI,EACN,KAAK,iBAAmB,sBAAsB,EAAK,EAEnD,KAAK,aAAe,KAAK,YACzB,KAAK,eAAiB,OAG1B,KAAK,iBAAmB,sBAAsB,EAAK,CAGrD,iBAAgC,CAC1B,KAAK,mBAAqB,OAC5B,qBAAqB,KAAK,iBAAiB,CAC3C,KAAK,iBAAmB,MAE1B,KAAK,eAAiB,KAGxB,SAAgB,CACd,KAAK,iBAAiB,CACtB,MAAM,SAAS,GCxEb,EAAe,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAM,CAGzG,SAAgB,EAAe,EAAmD,CAChF,OAAO,EAAM,IAAK,IAAO,CAAE,KAAM,EAAE,KAAM,MAAO,EAAE,OAAQ,EAAE,CAO9D,SAAgB,EAAqB,EAAmD,CACtF,IAAI,EAAO,KACX,OAAO,EAAM,IAAK,GAAM,CAClB,EAAE,OAAS,IAAM,EAAO,EAAE,QAC9B,IAAM,EAAK,EAAO,GAAK,EAAE,OAAS,EAAO,GAAK,IAAM,EACpD,MAAO,CAAE,KAAM,EAAE,KAAM,MAAO,EAAI,EAClC,CASJ,SAAgB,EAAsB,EAAmD,CACvF,GAAI,EAAM,SAAW,EAAG,MAAO,EAAE,CAGjC,IAAM,EAA2C,EAAE,CACnD,IAAK,IAAM,KAAK,EAAO,CACrB,IAAM,GAAA,EAAA,EAAA,sBAA2B,EAAE,KAAM,KAAK,CACxC,EAAO,EAAO,EAAO,OAAS,GAChC,GAAQ,EAAK,MAAQ,EACvB,EAAK,MAAQ,EAAE,OAEf,EAAO,KAAK,CAAE,MAAK,MAAO,EAAE,OAAQ,CAAC,CAIzC,IAAI,EAAY,EAAM,GAAG,OACnB,EAAuB,EAAE,CAC/B,IAAK,IAAM,KAAK,EAAQ,CACtB,IAAM,EAAO,IAAc,EAAI,EAAI,EAC7B,GAAa,EAAE,MAAQ,EAAO,GAAK,IACzC,EAAY,EAAE,MACd,IAAM,EAAI,IAAI,KAAK,EAAE,IAAI,CACnB,EAAO,EAAE,gBAAgB,CACzB,EAAQ,EAAE,aAAa,CAC7B,EAAM,KAAK,CACT,GAAI,GAAG,EAAK,GAAG,OAAO,EAAQ,EAAE,CAAC,SAAS,EAAG,IAAI,GACjD,MAAO,EAAa,GACpB,MAAO,OAAO,EAAK,CACnB,MAAO,EACR,CAAC,CAEJ,OAAO,EAGT,SAAS,EAAI,EAAuB,CAElC,MAAO,GADM,EAAQ,EAAI,IAAM,KACd,EAAM,QAAQ,EAAE,CAAC,GAGpC,SAAS,EAAK,EAAsC,CAGlD,OAFI,EAAQ,EAAU,WAClB,EAAQ,EAAU,WACf,UAIT,SAAgB,EAAe,EAA2C,CACxE,MAAO,CACL,CAAE,MAAO,eAAgB,MAAO,EAAI,EAAQ,eAAe,CAAE,KAAM,EAAK,EAAQ,eAAe,CAAE,CACjG,CAAE,MAAO,OAAQ,MAAO,EAAI,EAAQ,KAAO,IAAI,CAAE,KAAM,EAAK,EAAQ,KAAK,CAAE,CAC3E,CAAE,MAAO,SAAU,MAAO,EAAQ,OAAO,QAAQ,EAAE,CAAE,KAAM,EAAK,EAAQ,OAAO,CAAE,CACjF,CAAE,MAAO,UAAW,MAAO,EAAQ,QAAQ,QAAQ,EAAE,CAAE,KAAM,EAAK,EAAQ,QAAQ,CAAE,CACpF,CAAE,MAAO,eAAgB,MAAO,EAAI,EAAQ,eAAe,CAAE,KAAM,WAAY,CAC/E,CAAE,MAAO,WAAY,MAAO,IAAI,EAAQ,QAAU,KAAK,QAAQ,EAAE,CAAC,GAAI,KAAM,UAAW,CACvF,CAAE,MAAO,gBAAiB,MAAO,OAAO,SAAS,EAAQ,aAAa,CAAG,EAAQ,aAAa,QAAQ,EAAE,CAAG,IAAK,KAAM,EAAK,EAAQ,aAAe,EAAE,CAAE,CACtJ,CAAE,MAAO,SAAU,MAAO,OAAO,EAAQ,OAAO,CAAE,KAAM,UAAW,CACpE,CClFH,SAAS,EAAa,EAAkC,CAGtD,MAFI,CAAC,GAAS,IAAU,OAAe,EAAA,WACnC,IAAU,QAAgB,EAAA,YACvB,EAaT,IAAa,EAAb,KAAkC,CAChC,QACA,MACA,KACA,YAA+C,KAC/C,cAAiD,KACjD,QAAuC,KAEvC,YAAY,EAAwB,EAAsC,CACxE,KAAK,QAAU,EACf,KAAK,MAAQ,EAAa,EAAQ,MAAM,CACxC,KAAK,KAAO,SAAS,cAAc,MAAM,CACzC,KAAK,OAAO,CACZ,EAAU,YAAY,KAAK,KAAK,CAGlC,OAAsB,CACpB,IAAM,EAAI,KAAK,MACT,CAAE,SAAQ,QAAO,YAAa,KAAK,QACnC,EAAU,KAAK,iBAAiB,CAChC,EAAS,EAAE,KAcjB,GAZA,KAAK,KAAK,MAAM,QAAU,CACxB,eACA,wBACA,WACA,aACA,wBACA,eACA,cAAc,EAAE,aAChB,SAAS,EAAE,OACX,eAAe,EAAE,KAAK,SACvB,CAAC,KAAK,IAAI,CAEP,GAAS,EAAU,CACrB,IAAM,EAAS,SAAS,cAAc,MAAM,CAC5C,GAAI,EAAO,CACT,IAAM,EAAI,SAAS,cAAc,MAAM,CACvC,EAAE,YAAc,EAChB,EAAE,MAAM,QAAU,aAAa,EAAE,KAAK,UAAU,4CAChD,EAAO,YAAY,EAAE,CAEvB,GAAI,EAAU,CACZ,IAAM,EAAI,SAAS,cAAc,MAAM,CACvC,EAAE,YAAc,EAChB,EAAE,MAAM,QAAU,aAAa,EAAE,KAAK,UAAU,WAAW,EAAE,cAAc,kBAC3E,EAAO,YAAY,EAAE,CAEvB,KAAK,KAAK,YAAY,EAAO,CAI/B,KAAK,KAAK,YAAY,KAAK,gBAAgB,EAAe,EAAO,QAAQ,CAAE,EAAS,EAAO,CAAC,CAG5F,IAAM,EAAO,SAAS,cAAc,MAAM,CAC1C,EAAK,MAAM,QAAU,CACnB,eACA,6DACA,uBACA,WACD,CAAC,KAAK,IAAI,CACX,KAAK,KAAK,YAAY,EAAK,CAE3B,IAAM,EAAc,KAAK,WAAW,eAAgB,EAAS,EAAO,CACpE,EAAY,KAAK,MAAM,WAAa,SACpC,EAAK,YAAY,EAAY,KAAK,CAClC,KAAK,YAAc,IAAI,EAAiB,EAAY,KAAM,CACxD,KAAM,EAAe,EAAO,YAAY,CACxC,MAAO,EACP,UAAW,EAAE,SACb,SAAU,GACV,UAAW,GACZ,CAAC,CAEF,IAAM,EAAU,KAAK,WAAW,WAAY,EAAS,EAAO,CAC5D,EAAK,YAAY,EAAQ,KAAK,CAC9B,KAAK,cAAgB,IAAI,EAAiB,EAAQ,KAAM,CACtD,KAAM,EAAqB,EAAO,YAAY,CAC9C,MAAO,EACP,UAAW,EAAE,WACb,SAAU,GACV,UAAW,GACX,YAAc,GAAM,GAAG,EAAE,QAAQ,EAAE,CAAC,GACrC,CAAC,CAEF,IAAM,EAAe,EAAsB,EAAO,YAAY,CACxD,EAAY,KAAK,WAAW,kBAAmB,EAAS,EAAO,CACrE,EAAK,YAAY,EAAU,KAAK,CAChC,KAAK,QAAU,IAAI,EAAa,EAAU,KAAM,CAC9C,KAAM,EACN,MAAO,EACP,WAAY,GACZ,YAAc,GAAM,GAAG,GAAK,EAAI,IAAM,KAAK,EAAE,QAAQ,EAAE,GACvD,WAAY,CAAE,SAAU,EAAE,WAAY,KAAM,EAAS,SAAU,EAAE,SAAU,CAC5E,CAAC,CAGJ,gBAAwB,EAAwB,EAAiB,EAAgC,CAC/F,IAAM,EAAQ,SAAS,cAAc,MAAM,CAC3C,EAAM,MAAM,QAAU,CACpB,eACA,6DACA,WACD,CAAC,KAAK,IAAI,CAEX,IAAM,EAAI,KAAK,MACf,IAAK,IAAM,KAAQ,EAAO,CACxB,IAAM,EAAO,SAAS,cAAc,MAAM,CAC1C,EAAK,MAAM,QAAU,CACnB,cAAc,IACd,oBAAoB,IACpB,qBACA,oBACA,eACA,wBACA,UACD,CAAC,KAAK,IAAI,CAEX,IAAM,EAAQ,SAAS,cAAc,MAAM,CAC3C,EAAM,YAAc,EAAK,MACzB,EAAM,MAAM,QAAU,aAAa,EAAE,KAAK,UAAU,WAAW,EAAE,cAAc,kDAE/E,IAAM,EAAQ,SAAS,cAAc,MAAM,CAC3C,EAAM,YAAc,EAAK,MACzB,IAAM,EAAQ,EAAK,OAAS,WAAa,EAAE,SAAW,EAAK,OAAS,WAAa,EAAE,WAAa,EAAE,KAClG,EAAM,MAAM,QAAU,aAAa,EAAE,KAAK,UAAU,2BAA2B,EAAM,qCAErF,EAAK,YAAY,EAAM,CACvB,EAAK,YAAY,EAAM,CACvB,EAAM,YAAY,EAAK,CAEzB,OAAO,EAGT,WAAmB,EAAe,EAAiB,EAAgE,CACjH,IAAM,EAAI,KAAK,MACT,EAAO,SAAS,cAAc,MAAM,CAC1C,EAAK,MAAM,QAAU,CACnB,cAAc,IACd,oBAAoB,IACpB,qBACA,kBACA,eACA,wBACD,CAAC,KAAK,IAAI,CAEX,IAAM,EAAO,SAAS,cAAc,MAAM,CAC1C,EAAK,YAAc,EACnB,EAAK,MAAM,QAAU,CACnB,aAAa,EAAE,KAAK,UAAU,IAC9B,kBACA,SAAS,EAAE,gBACX,mBACA,2BAA2B,IAC3B,2BACA,wBACD,CAAC,KAAK,IAAI,CAEX,IAAM,EAAO,SAAS,cAAc,MAAM,CAK1C,MAJA,GAAK,MAAM,QAAU,yCAErB,EAAK,YAAY,EAAK,CACtB,EAAK,YAAY,EAAK,CACf,CAAE,OAAM,OAAM,CAIvB,iBAAkC,CAChC,OAAO,KAAK,MAAM,OAAS,QAAU,mBAAqB,yBAI5D,OAAO,EAAiC,CACtC,KAAK,QAAU,CAAE,GAAG,KAAK,QAAS,SAAQ,CAC1C,KAAK,eAAe,CACpB,KAAK,KAAK,iBAAiB,CAC3B,KAAK,OAAO,CAGd,SAAS,EAAgC,CACvC,KAAK,MAAQ,EAAa,EAAM,CAChC,KAAK,QAAU,CAAE,GAAG,KAAK,QAAS,QAAO,CACzC,KAAK,eAAe,CACpB,KAAK,KAAK,iBAAiB,CAC3B,KAAK,OAAO,CAGd,eAA8B,CAC5B,KAAK,aAAa,SAAS,CAC3B,KAAK,eAAe,SAAS,CAC7B,KAAK,SAAS,SAAS,CACvB,KAAK,YAAc,KACnB,KAAK,cAAgB,KACrB,KAAK,QAAU,KAGjB,SAAgB,CACd,KAAK,eAAe,CACpB,KAAK,KAAK,QAAQ"}
|
|
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';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,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,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,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,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,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { DARK_TERMINAL as
|
|
3
|
-
import { AlertManager as
|
|
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
|
-
},
|
|
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
|
|
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
|
-
}),
|
|
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
|
-
}),
|
|
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
|
-
},
|
|
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
|
-
|
|
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
|
-
},
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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 =
|
|
245
|
-
} else this.cachedRects =
|
|
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
|
-
|
|
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
|
-
},
|
|
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
|
-
|
|
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
|
-
},
|
|
303
|
-
function
|
|
302
|
+
}, Qt = 500;
|
|
303
|
+
function $t(e) {
|
|
304
304
|
let t = 1 - e;
|
|
305
305
|
return 1 - t * t * t;
|
|
306
306
|
}
|
|
307
|
-
var
|
|
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
|
-
|
|
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 ??
|
|
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
|
-
},
|
|
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 =
|
|
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:
|
|
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" ?
|
|
467
|
+
return !e || e === "dark" ? pe : e === "light" ? y : e;
|
|
468
468
|
}
|
|
469
|
-
var
|
|
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 {
|
|
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
|