@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
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The widget's look: corners, sizes, type, lines, shadows and the shape of
|
|
3
|
+
* its bars, as tokens. A preset gives all of them; a theme of yours changes
|
|
4
|
+
* what it names. Colours stay with the widget's dark / light theme.
|
|
5
|
+
*/
|
|
6
|
+
export type WidgetUIPreset = 'studio' | 'terminal' | 'capsule';
|
|
7
|
+
/** Corners, in px (999 makes a pill). */
|
|
8
|
+
export interface WidgetUIRadius {
|
|
9
|
+
xs: number;
|
|
10
|
+
sm: number;
|
|
11
|
+
md: number;
|
|
12
|
+
lg: number;
|
|
13
|
+
xl: number;
|
|
14
|
+
}
|
|
15
|
+
/** Each part's corners, in px; unset parts follow the scale. */
|
|
16
|
+
export interface WidgetUIComponentRadius {
|
|
17
|
+
/** Buttons and toggles in bars. */
|
|
18
|
+
control: number;
|
|
19
|
+
/** Text fields and selects. */
|
|
20
|
+
input: number;
|
|
21
|
+
/** Menus and dropdowns. */
|
|
22
|
+
menu: number;
|
|
23
|
+
/** Dialogs. */
|
|
24
|
+
dialog: number;
|
|
25
|
+
/** Floating panels (alerts, data window, order ticket). */
|
|
26
|
+
panel: number;
|
|
27
|
+
tooltip: number;
|
|
28
|
+
/** Price tags and chips. */
|
|
29
|
+
tag: number;
|
|
30
|
+
toast: number;
|
|
31
|
+
/** The toolbar's own box (a floating toolbar is an island). */
|
|
32
|
+
toolbar: number;
|
|
33
|
+
/** The drawing tools' own box. */
|
|
34
|
+
sidebar: number;
|
|
35
|
+
}
|
|
36
|
+
/** Sizes, in px. */
|
|
37
|
+
export interface WidgetUISizes {
|
|
38
|
+
toolbar: number;
|
|
39
|
+
control: number;
|
|
40
|
+
controlSmall: number;
|
|
41
|
+
icon: number;
|
|
42
|
+
sidebar: number;
|
|
43
|
+
menuItem: number;
|
|
44
|
+
}
|
|
45
|
+
export interface WidgetUIFont {
|
|
46
|
+
/** A CSS font-family list. The widget loads no fonts: load the ones you name. */
|
|
47
|
+
family: string;
|
|
48
|
+
/** For prices and numbers. */
|
|
49
|
+
mono: string;
|
|
50
|
+
/** Body size, px; the small sizes follow it. */
|
|
51
|
+
size: number;
|
|
52
|
+
weight: number;
|
|
53
|
+
strongWeight: number;
|
|
54
|
+
/** Small labels (section titles, field names): as written or in capitals. */
|
|
55
|
+
labelCase: 'none' | 'uppercase';
|
|
56
|
+
/** Their letter spacing, in em. */
|
|
57
|
+
labelTracking: number;
|
|
58
|
+
}
|
|
59
|
+
export interface WidgetUIShadows {
|
|
60
|
+
menu: string;
|
|
61
|
+
dialog: string;
|
|
62
|
+
tooltip: string;
|
|
63
|
+
}
|
|
64
|
+
/** The whole look, every token set. */
|
|
65
|
+
export interface ResolvedWidgetUI {
|
|
66
|
+
preset: WidgetUIPreset;
|
|
67
|
+
radius: WidgetUIRadius;
|
|
68
|
+
components: WidgetUIComponentRadius;
|
|
69
|
+
sizes: WidgetUISizes;
|
|
70
|
+
font: WidgetUIFont;
|
|
71
|
+
borders: {
|
|
72
|
+
width: number;
|
|
73
|
+
separators: boolean;
|
|
74
|
+
};
|
|
75
|
+
shadows: WidgetUIShadows;
|
|
76
|
+
/** Frosted floating surfaces: blur behind them, px (0: solid). */
|
|
77
|
+
blur: number;
|
|
78
|
+
/** How a chosen button shows: a tinted fill, a solid pill, or an underline. */
|
|
79
|
+
active: 'tint' | 'solid' | 'underline';
|
|
80
|
+
/** The toolbar along the top edge, or floating as an island. */
|
|
81
|
+
toolbar: 'docked' | 'floating';
|
|
82
|
+
/** The drawing tools along the left edge, or floating. */
|
|
83
|
+
sidebar: 'docked' | 'floating';
|
|
84
|
+
/** The interval buttons as they are, or in a segmented track. */
|
|
85
|
+
intervals: 'plain' | 'segmented';
|
|
86
|
+
/** Corners of the price tags and pills the chart draws (999: pills). */
|
|
87
|
+
tagRadius: number;
|
|
88
|
+
}
|
|
89
|
+
/** Your look: a preset to start from (Studio by default) and what to change. */
|
|
90
|
+
export interface WidgetUITheme {
|
|
91
|
+
preset?: WidgetUIPreset;
|
|
92
|
+
radius?: Partial<WidgetUIRadius>;
|
|
93
|
+
components?: Partial<WidgetUIComponentRadius>;
|
|
94
|
+
/** Control sizes at once: compact, comfortable (the preset's) or spacious; `sizes` win over it. */
|
|
95
|
+
density?: 'compact' | 'comfortable' | 'spacious';
|
|
96
|
+
sizes?: Partial<WidgetUISizes>;
|
|
97
|
+
font?: Partial<WidgetUIFont>;
|
|
98
|
+
borders?: Partial<ResolvedWidgetUI['borders']>;
|
|
99
|
+
shadows?: Partial<WidgetUIShadows>;
|
|
100
|
+
blur?: number;
|
|
101
|
+
active?: ResolvedWidgetUI['active'];
|
|
102
|
+
toolbar?: ResolvedWidgetUI['toolbar'];
|
|
103
|
+
sidebar?: ResolvedWidgetUI['sidebar'];
|
|
104
|
+
intervals?: ResolvedWidgetUI['intervals'];
|
|
105
|
+
tagRadius?: number;
|
|
106
|
+
}
|
|
107
|
+
/** The presets, every token set. */
|
|
108
|
+
export declare const WIDGET_UI_PRESETS: Readonly<Record<WidgetUIPreset, Readonly<ResolvedWidgetUI>>>;
|
|
109
|
+
/**
|
|
110
|
+
* Every token of a look: a preset by name, or your theme over its preset
|
|
111
|
+
* (Studio when none). What isn't a usable value is left at the preset's.
|
|
112
|
+
*/
|
|
113
|
+
export declare function resolveWidgetUI(theme?: WidgetUIPreset | WidgetUITheme): ResolvedWidgetUI;
|
|
114
|
+
/** The look as the widget's CSS variables. */
|
|
115
|
+
export declare function widgetUIVariables(ui: ResolvedWidgetUI): Record<string, string>;
|
|
116
|
+
/**
|
|
117
|
+
* Put the look on an element of the widget (its root, its modal portal):
|
|
118
|
+
* its tokens inline and its layout switches as data attributes. With
|
|
119
|
+
* `variables: false` only the switches; the tokens are left to the
|
|
120
|
+
* stylesheet (whose defaults are Studio's), and any set inline before are
|
|
121
|
+
* cleared.
|
|
122
|
+
*/
|
|
123
|
+
export declare function applyWidgetUI(el: HTMLElement, ui: ResolvedWidgetUI, options?: {
|
|
124
|
+
variables?: boolean;
|
|
125
|
+
}): void;
|
|
126
|
+
//# sourceMappingURL=widgetUI.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widgetUI.d.ts","sourceRoot":"","sources":["../../src/widget/widgetUI.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;AAE/D,yCAAyC;AACzC,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,gEAAgE;AAChE,MAAM,WAAW,uBAAuB;IACtC,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,eAAe;IACf,MAAM,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,4BAA4B;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,oBAAoB;AACpB,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,iFAAiF;IACjF,MAAM,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,6EAA6E;IAC7E,SAAS,EAAE,MAAM,GAAG,WAAW,CAAC;IAChC,mCAAmC;IACnC,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,uCAAuC;AACvC,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,cAAc,CAAC;IACvB,UAAU,EAAE,uBAAuB,CAAC;IACpC,KAAK,EAAE,aAAa,CAAC;IACrB,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,OAAO,CAAA;KAAE,CAAC;IAChD,OAAO,EAAE,eAAe,CAAC;IACzB,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,WAAW,CAAC;IACvC,gEAAgE;IAChE,OAAO,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC/B,0DAA0D;IAC1D,OAAO,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC/B,iEAAiE;IACjE,SAAS,EAAE,OAAO,GAAG,WAAW,CAAC;IACjC,wEAAwE;IACxE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,gFAAgF;AAChF,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAC9C,mGAAmG;IACnG,OAAO,CAAC,EAAE,SAAS,GAAG,aAAa,GAAG,UAAU,CAAC;IACjD,KAAK,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAC/B,IAAI,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACpC,OAAO,CAAC,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACtC,OAAO,CAAC,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACtC,SAAS,CAAC,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAuFD,oCAAoC;AACpC,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAE1F,CAAC;AAuDF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,CAAC,EAAE,cAAc,GAAG,aAAa,GAAG,gBAAgB,CAgCxF;AAED,8CAA8C;AAC9C,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA+C9E;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,gBAAgB,EAAE,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,IAAI,CAYhH"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tradecanvas/chart",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "High-performance canvas trading chart with built-in indicators, drawing tools, and real-time streaming. Zero external dependencies.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -42,6 +42,11 @@
|
|
|
42
42
|
"types": "./dist/widget/index.d.ts",
|
|
43
43
|
"import": "./dist/widget/index.js",
|
|
44
44
|
"require": "./dist/widget/index.cjs"
|
|
45
|
+
},
|
|
46
|
+
"./widget/locales": {
|
|
47
|
+
"types": "./dist/widget/locales/index.d.ts",
|
|
48
|
+
"import": "./dist/widget/locales/index.js",
|
|
49
|
+
"require": "./dist/widget/locales/index.cjs"
|
|
45
50
|
}
|
|
46
51
|
},
|
|
47
52
|
"files": [
|
|
@@ -49,8 +54,8 @@
|
|
|
49
54
|
"README.md"
|
|
50
55
|
],
|
|
51
56
|
"dependencies": {
|
|
52
|
-
"@tradecanvas/commons": "1.
|
|
53
|
-
"@tradecanvas/core": "1.
|
|
57
|
+
"@tradecanvas/commons": "1.7.0",
|
|
58
|
+
"@tradecanvas/core": "1.7.0"
|
|
54
59
|
},
|
|
55
60
|
"devDependencies": {
|
|
56
61
|
"jsdom": "^25.0.1",
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
let e=require(`@tradecanvas/commons`),t=require(`@tradecanvas/core`);function n(e){switch(e){case`candlestick`:case`heikinAshi`:case`lineBreak`:case`rangeBars`:return new t.CandlestickRenderer;case`line`:return new t.LineRenderer;case`area`:return new t.AreaRenderer;case`bar`:return new t.BarRenderer;case`hollowCandle`:return new t.HollowCandleRenderer;case`baseline`:return new t.BaselineRenderer;case`renko`:return new t.RenkoRenderer;case`kagi`:return new t.KagiRenderer;case`pointAndFigure`:return new t.PointAndFigureRenderer;case`volumeCandles`:return new t.VolumeCandleRenderer;case`equivolume`:return new t.EquivolumeRenderer;case`hlcArea`:return new t.HLCAreaRenderer;case`stepLine`:return new t.StepLineRenderer;case`lineWithMarkers`:return new t.LineWithMarkersRenderer;default:return new t.CandlestickRenderer}}function r(e,n){if(n.length===0)return n;switch(e){case`heikinAshi`:return(0,t.toHeikinAshi)(n);case`renko`:return(0,t.toRenko)(n,{brickSize:0,useATR:!0,atrPeriod:14});case`lineBreak`:return(0,t.toLineBreak)(n,3);case`kagi`:return(0,t.toKagi)(n,4);case`pointAndFigure`:return(0,t.toPointAndFigure)(n,o(n)*.01,3);case`rangeBars`:return(0,t.toRangeBars)(n,{rangeSize:o(n)*.005});default:return n}}function i(e){switch(e){case`heikinAshi`:case`renko`:case`lineBreak`:case`kagi`:case`pointAndFigure`:case`rangeBars`:return!0;default:return!1}}function a(e){return e!==`heikinAshi`&&i(e)}function o(e){let t=0;for(let n of e)t+=n.close;return t/e.length}function s(e,t){let r=t?.(e);return r?r.createRenderer():n(e)}function c(e,t,n){if(t.length===0)return t;let i=n?.(e);return i?.transform?i.transform(t):r(e,t)}var l={min:0,max:100},u=.1;function d(e,t,n){if(!e)return{...l};let r=1/0,i=-1/0;if(e.series){let a=Math.min(n,e.series.length-1);for(let n=Math.max(0,t);n<=a;n++){let t=e.series[n];if(t)for(let e in t){let n=t[e];n!==void 0&&Number.isFinite(n)&&(n<r&&(r=n),n>i&&(i=n))}}}else{let a=0;for(let[,o]of e.values){if(a>=t&&a<=n)for(let e in o){let t=o[e];t!==void 0&&Number.isFinite(t)&&(t<r&&(r=t),t>i&&(i=t))}a++}}if(r===1/0)return{...l};let a=i-r||1;return{min:r-a*u,max:i+a*u}}var f=class{timer=null;delayMs=0;key=null;constructor(e){this.save=e}enable(e,t){this.key=e,this.delayMs=t}disable(){this.key=null,this.delayMs=0,this.cancel()}schedule(){this.delayMs<=0||!this.key||(this.timer&&clearTimeout(this.timer),this.timer=setTimeout(()=>{this.timer=null,this.key&&this.save(this.key)},this.delayMs))}cancel(){this.timer&&=(clearTimeout(this.timer),null)}isEnabled(){return this.delayMs>0&&this.key!==null}hasPending(){return this.timer!==null}};function p(e){if(!e||typeof e.time!=`number`)return!1;let{open:t,high:n,low:r,close:i}=e;return!(!isFinite(t)||!isFinite(n)||!isFinite(r)||!isFinite(i)||t<0||n<0||r<0||i<0||n<r||e.volume!==void 0&&(!isFinite(e.volume)||e.volume<0))}function m(e){return e.volume!==void 0&&e.high>=e.open&&e.high>=e.close&&e.low<=e.open&&e.low<=e.close}function h(e){return{...e,high:Math.max(e.open,e.high,e.low,e.close),low:Math.min(e.open,e.high,e.low,e.close),volume:e.volume===void 0?0:Math.max(0,e.volume)}}var g=class{data=[];getData(){return this.data}setData(e){let t=[];for(let n=0;n<e.length;n++){let r=e[n];p(r)&&t.push(m(r)?r:h(r))}this.data=t}appendBar(e){p(e)&&this.data.push(h(e))}updateLastBar(e){if(!p(e))return;let t=h(e);if(this.data.length===0){this.data.push(t);return}this.data[this.data.length-1]=t}updateLastBarFromTick(t){this.data.length!==0&&(!isFinite(t.price)||t.price<0||t.volume!==void 0&&(!isFinite(t.volume)||t.volume<0)||(this.data[this.data.length-1]=(0,e.mergeBar)(this.data[this.data.length-1],t)))}getLength(){return this.data.length}clear(){this.data=[]}},_=class{theme;constructor(t){!t||t===`dark`?this.theme={...e.DARK_THEME}:t===`light`?this.theme={...e.LIGHT_THEME}:this.theme={...t}}getTheme(){return this.theme}setTheme(t){t===`dark`?this.theme={...e.DARK_THEME}:t===`light`?this.theme={...e.LIGHT_THEME}:this.theme={...t}}},v=200,y=80,b=class{panels=[];containerWidth=0;containerHeight=0;priceAxisWidth=e.PRICE_AXIS_WIDTH;resize(e,t){this.containerWidth=e,this.containerHeight=t}addPanel(t,n=`bottom`,r){let i=n===`left`||n===`right`;this.panels.push({id:t,position:n,size:r??(i?v:e.DEFAULT_PANEL_HEIGHT),minSize:i?y:e.MIN_PANEL_HEIGHT,content:{type:`indicator`,indicatorInstanceId:t}})}removePanel(e){this.panels=this.panels.filter(t=>t.id!==e)}setPanelPosition(t,n){let r=this.panels.find(e=>e.id===t);if(r){let t=r.position===`left`||r.position===`right`,i=n===`left`||n===`right`;r.position=n,t!==i&&(r.size=i?v:e.DEFAULT_PANEL_HEIGHT,r.minSize=i?y:e.MIN_PANEL_HEIGHT)}}setPanelSize(e,t){let n=this.panels.find(t=>t.id===e);n&&(n.size=Math.max(n.minSize,t))}setPriceAxisWidth(e){this.priceAxisWidth=e}getPanels(){return this.panels}resolve(){let t=this.panels.filter(e=>e.position===`left`),n=this.panels.filter(e=>e.position===`right`),r=this.panels.filter(e=>e.position===`top`),i=this.panels.filter(e=>e.position===`bottom`),a=t.reduce((e,t)=>e+t.size,0),o=n.reduce((e,t)=>e+t.size,0),s=r.reduce((e,t)=>e+t.size,0),c=i.reduce((e,t)=>e+t.size,0),l={x:a,y:s,width:Math.max(0,this.containerWidth-a-o-this.priceAxisWidth),height:Math.max(0,this.containerHeight-s-c-e.TIME_AXIS_HEIGHT)},u=[],d=[],f=0;for(let n of t)u.push({config:n,rect:{x:f,y:0,width:n.size,height:this.containerHeight-e.TIME_AXIS_HEIGHT}}),d.push({panelId:n.id,rect:{x:f+n.size-2,y:0,width:4,height:this.containerHeight},orientation:`vertical`}),f+=n.size;let p=0;for(let e of r)u.push({config:e,rect:{x:a,y:p,width:l.width,height:e.size}}),d.push({panelId:e.id,rect:{x:a,y:p+e.size-2,width:l.width,height:4},orientation:`horizontal`}),p+=e.size;p=l.y+l.height;for(let e of i)u.push({config:e,rect:{x:a,y:p,width:l.width,height:e.size}}),d.push({panelId:e.id,rect:{x:a,y:p-2,width:l.width,height:4},orientation:`horizontal`}),p+=e.size;f=a+l.width+this.priceAxisWidth;for(let t of n)u.push({config:t,rect:{x:f,y:0,width:t.size,height:this.containerHeight-e.TIME_AXIS_HEIGHT}}),d.push({panelId:t.id,rect:{x:f-2,y:0,width:4,height:this.containerHeight},orientation:`vertical`}),f+=t.size;return{mainChartRect:l,panels:u,dividers:d}}getMainChartRect(){return this.resolve().mainChartRect}},x=14,S=14,C=22,w=4;function ee(t){let{min:n,max:r,lastPrice:i,locale:a,fontFamily:o,fontSizeSmall:s,measure:c}=t,l=(0,e.autoPricePrecision)(n,r),u=t.tagPrecision??l,d=i===null?[n,r]:[n,r,i],f=e.PRICE_AXIS_WIDTH;for(let t of d){if(!Number.isFinite(t))continue;let n=(0,e.formatPrice)(t,l,a),r=(0,e.formatPrice)(t,u,a);f=Math.max(f,c(n,`500 ${s}px ${o}`)+x,c(r,`bold 11px ${o}`)+S,c(r,`600 ${s}px ${o}`)+C)}return f<=e.PRICE_AXIS_WIDTH?e.PRICE_AXIS_WIDTH:Math.ceil(f/w)*w}function te(e,t){return t>e||t<=e-12?t:e}var T=class{netY=0;travelX=0;engaged=!1;reset(){this.netY=0,this.travelX=0,this.engaged=!1}step(e,t,n){if(this.engaged)return!0;if(this.netY+=t,this.travelX+=Math.abs(e),!n)this.engaged=!0;else{let e=Math.abs(this.netY);this.engaged=e>24&&e>=this.travelX*.5}return this.engaged}},E=1;function D(e,t){return e.filter(e=>(e.descriptor.layer??`overlay`)===t)}function O(e){switch(e.kind){case`indicator`:return`indicator:${e.plugin.descriptor.id}`;case`drawing`:return`drawing:${e.plugin.descriptor.type}`;case`chartType`:return`chartType:${e.plugin.descriptor.type}`;case`overlay`:return`overlay:${e.plugin.descriptor.id}`}}var k=new Map;function A(e){k.set(O(e),e)}function j(e){return k.delete(e)}function M(){return[...k.values()]}function N(){k.clear()}var P=class{plugins=new Map;constructor(e,t={}){if(this.indicatorEngine=e,t.inheritGlobal!==!1)for(let e of M())this.add(e);for(let e of t.plugins??[])this.add(e)}register(e){this.add(e)}unregister(e){return this.plugins.delete(e)}list(){return[...this.plugins.values()]}registerIndicator(e){this.add({kind:`indicator`,plugin:e})}getChartType(e){let t=this.plugins.get(`chartType:${e}`);return t?.kind===`chartType`?t.plugin:void 0}getOverlays(){let e=[];for(let t of this.plugins.values())t.kind===`overlay`&&e.push(t.plugin);return e}add(e){this.plugins.set(O(e),e),e.kind===`indicator`&&this.indicatorEngine.register(e.plugin)}},F={orderPlace:(e,t)=>e.placeOrder(t),orderModify:(e,t)=>e.modifyOrder(t),orderCancel:(e,t)=>e.cancelOrder(t),positionModify:(e,t)=>e.modifyPosition(t),positionClose:(e,t)=>e.closePosition(t)};function ne(e,t){let n=[],r=e=>t.setOrders(e.data??[]),i=e=>t.setPositions(e.data??[]),a=e=>t.onError(e.data??{message:`Execution error`});e.on(`orders`,r),e.on(`positions`,i),e.on(`error`,a),n.push(()=>e.off(`orders`,r),()=>e.off(`positions`,i),()=>e.off(`error`,a));for(let r of Object.keys(F)){let i=F[r],a=t.onIntent(r,n=>{Promise.resolve(i(e,n)).catch(e=>t.onError({message:`Execution command failed: ${r}`,cause:e}))});n.push(a)}return()=>{for(let e of n)e()}}var re=0xe8d4a51000,I=class{static version=`1.4.0`;engine;viewport;dataManager;themeManager;layoutManager;pluginManager;indicatorEngine;drawingManager;drawingRenderer;tradingManager;tradingRenderer;eventBus;streamManager=null;executionAdapter=null;execTeardown=null;autoScrollOnNewBar=!0;displayDataCache=null;indicatorUpdateFrom=null;resolvedLayoutCache=null;panelInfoCache=null;renderScheduled=!1;priceAxisWidth=e.PRICE_AXIS_WIDTH;measureCtx;containerSizeCache=null;containerSizeCacheTime=0;lastEmittedRange=null;lastEmittedPriceRange=null;lastEmittedBarWidth=null;chartLegend;watermark;barCountdown;unrestoredIndicators=[];displayTzOffset=null;sessionBreaks;sessionShading;compareRenderer;countdownInterval=null;volumeRenderer;volumeProfile;marketProfile;depthHeatmap;periodLevels;pivotMarkers;alertManager;signalMarkerManager;tradeZoneManager;measureOverlay;selectionBoxOverlay=new t.SelectionBoxOverlay;replayManager;replayBarUnsub=null;replaySeeking=!1;replaySession=null;undoRedoManager;autoSaveScheduler=new f(e=>this.saveState(e));animator;crosshairTooltip;pinnedTooltip;interactionManager;crosshairHandler;chartRenderer;gridRenderer;priceAxis;timeAxis;options;features;marketConfig=null;container;currentPriceLine;numberLocale;marketPricePrecision=null;paneTitles=!0;defaultAutoScale;keyboardHandler=null;onWindowKeyDown=null;currentSymbol=``;constructor(n,r){this.container=n,this.options=r,this.numberLocale=r.numberLocale??`en-US`,this.defaultAutoScale=r.autoScale!==!1;let i=r.features??{};this.features={drawings:i.drawings??!0,drawingTools:i.drawingTools??[],drawingMagnet:i.drawingMagnet??!0,drawingUndoRedo:i.drawingUndoRedo??!0,trading:i.trading??!0,tradingContextMenu:i.tradingContextMenu??!1,indicators:i.indicators??!0,indicatorIds:i.indicatorIds??[],panning:i.panning??!0,zooming:i.zooming??!0,crosshair:i.crosshair??!0,crosshairTooltip:i.crosshairTooltip??!0,keyboard:i.keyboard??!0,priceAxis:i.priceAxis??!0,timeAxis:i.timeAxis??!0,grid:i.grid??r.grid?.visible??!0,legend:i.legend??!0,volume:i.volume??!0,watermark:i.watermark??!0,saveLoad:i.saveLoad??!0,screenshot:i.screenshot??!0,alerts:i.alerts??!0,replay:i.replay??!0,sessionBreaks:i.sessionBreaks??!0,barCountdown:i.barCountdown??!0,compareSymbols:i.compareSymbols??!0,dataExport:i.dataExport??!0,logScale:i.logScale??!0,timeframes:i.timeframes??[],defaultTimeframeFavorites:i.defaultTimeframeFavorites??[]},n.style.position=`relative`,n.style.overflow=`hidden`,n.tabIndex=0,n.style.outline=`none`,this.dataManager=new g,this.themeManager=new _(r.theme),this.layoutManager=new b,this.indicatorEngine=new t.IndicatorEngine,this.pluginManager=new P(this.indicatorEngine,{plugins:r.plugins}),this.eventBus=new t.EventBus,(0,t.registerBuiltInIndicators)(this.indicatorEngine),this.drawingManager=new t.DrawingManager,(0,t.registerBuiltInDrawingTools)(this.drawingManager),this.drawingRenderer=new t.DrawingRenderer(this.drawingManager),this.drawingManager.setRequestRender(()=>{this.syncRenderContext(),this.engine.requestRender(e.LayerType.Overlay),this.scheduleAutoSave()}),this.drawingManager.setEventCallback((e,t)=>{this.eventBus.emit(e,t)}),this.drawingManager.setToolFilter(e=>this.features.drawings&&(this.features.drawingTools.length===0||this.features.drawingTools.includes(e))),this.undoRedoManager=new t.UndoRedoManager,this.drawingManager.setUndoRedoManager(this.undoRedoManager),this.drawingManager.setDataGetter(()=>this.dataManager.getData()),this.drawingManager.setDisplayDataGetter(()=>this.getDisplayData()),r.crosshair?.mode===`magnet`&&this.features.drawingMagnet&&this.drawingManager.setMagnetMode(`magnet`),this.tradingManager=new t.TradingManager({enabled:this.features.trading,contextMenu:{enabled:this.features.tradingContextMenu}}),this.tradingRenderer=new t.TradingRenderer(this.tradingManager),this.tradingManager.setContainer(n),this.tradingManager.setRequestRender(()=>this.engine.requestRender(e.LayerType.Overlay)),this.tradingManager.setEventCallback((e,t)=>{this.eventBus.emit(e,t)}),this.engine=new t.RenderEngine(n);let a=this.engine.dprManager.getContainerSize();if(this.viewport=new t.Viewport(a.width,a.height,r.minBarSpacing??2,r.maxBarSpacing??30,r.rightMargin??5),this.viewport.setPanLimits({freePan:r.freePan??!0,minVisibleBars:r.panLimits?.minVisibleBars??3}),this.layoutManager.resize(a.width,a.height),this.engine.onContainerResize=e=>{if(e.width<=0||e.height<=0)return;let t=this.viewport.isAtEnd();this.viewport.resize(e.width,e.height),this.layoutManager.resize(e.width,e.height),this.updateViewportAndRender(t)},this.chartRenderer=this.createChartRenderer(r.chartType),this.gridRenderer=new t.GridRenderer,r.grid?.visible===!1&&this.gridRenderer.setVisible(!1),this.priceAxis=new t.PriceAxis,this.priceAxis.setLocale(this.numberLocale),this.timeAxis=new t.TimeAxis,this.crosshairHandler=new t.CrosshairHandler,this.crosshairHandler.setLocale(this.numberLocale),r.crosshair?.mode&&this.crosshairHandler.setMode(r.crosshair.mode),this.crosshairHandler.setCallback((e,n)=>{if(e!==null&&n){let r=this.dataManager.getData(),i=e<r.length?r[e]:void 0;this.chartLegend.setHoverBar(i??null);let a=this.viewport.getState(),o=n.y>=a.chartRect.y&&n.y<=a.chartRect.y+a.chartRect.height;i&&o&&this.features.crosshairTooltip?this.crosshairTooltip.show(n,i,this.themeManager.getTheme(),this.cachedContainerSize(),{prevClose:e>0?r[e-1]?.close:void 0,priceRange:a.priceRange,plot:a.chartRect,barStepMs:(0,t.barTimeStepMs)(r)}):this.crosshairTooltip.hide(),this.pinnedTooltip.isPinned()&&this.pinnedTooltip.reposition(this.viewport.getState(),i??null,e,this.themeManager.getTheme()),this.eventBus.emit(`crosshairMove`,{point:n,bar:i,barIndex:e})}else this.crosshairTooltip.hide(),this.chartLegend.setHoverBar(null),this.eventBus.emit(`crosshairLeave`,{})}),this.chartLegend=new t.ChartLegend,this.chartLegend.setChartType(r.chartType),this.chartLegend.setLocale(this.numberLocale),this.watermark=new t.Watermark,r.watermark&&this.watermark.setConfig(r.watermark),this.volumeRenderer=new t.VolumeRenderer,this.volumeProfile=new t.VolumeProfileRenderer,this.marketProfile=new t.MarketProfileRenderer,this.depthHeatmap=new t.DepthHeatmapRenderer,this.periodLevels=new t.PeriodLevelsRenderer,this.pivotMarkers=new t.PivotMarkersRenderer,this.barCountdown=new t.BarCountdown,this.barCountdown.setVisible(this.features.barCountdown),this.sessionBreaks=new t.SessionBreaks,this.sessionBreaks.setLocale(this.numberLocale),this.sessionShading=new t.SessionShading,this.compareRenderer=new t.CompareRenderer,r.sessionBreaks?this.sessionBreaks.setConfig({visible:r.sessionBreaks.visible??!0,color:r.sessionBreaks.color,lineStyle:r.sessionBreaks.lineStyle,lineWidth:r.sessionBreaks.lineWidth}):r.features?.sessionBreaks!==!1&&this.sessionBreaks.setVisible(!0),r.logScale&&this.features.logScale&&this.viewport.setLogScale(!0),this.animator=new t.Animator,this.crosshairTooltip=new t.CrosshairTooltip,this.crosshairTooltip.create(n),this.crosshairTooltip.setLocale(this.numberLocale),this.pinnedTooltip=new t.PinnedTooltip,this.pinnedTooltip.create(n),this.keyboardHandler=new t.KeyboardHandler({scrollBars:e=>{let t=this.viewport.getState().barWidth+this.viewport.getState().barSpacing;this.viewport.scrollBy(e*t),this.updateViewportAndRender()},zoom:e=>{let t=this.viewport.getState().chartRect.width;this.viewport.zoom(e,t/2),this.updateViewportAndRender()},goToStart:()=>{this.viewport.scrollBy(-1/0),this.updateViewportAndRender()},goToEnd:()=>{this.viewport.scrollToEnd(),this.updateViewportAndRender()},fitContent:()=>this.fitContent()}),this.keyboardHandler.setEnabled(this.features.keyboard),this.onWindowKeyDown=e=>{if(!this.keyboardHandler)return;let t=document.activeElement;t&&t!==this.container&&!this.container.contains(t)||t&&(t.tagName===`INPUT`||t.tagName===`TEXTAREA`||t.isContentEditable)||this.keyboardHandler.handleKey(e)&&e.preventDefault()},window.addEventListener(`keydown`,this.onWindowKeyDown),this.currentPriceLine=new t.CurrentPriceLine,this.currentPriceLine.setLocale(this.numberLocale),this.priceAxis.setReservedPriceProvider(()=>this.currentPriceLine.isVisible()?this.currentPriceLine.getPrice():null),this.alertManager=new t.AlertManager,this.alertManager.setRequestRender(()=>this.engine.requestRender(e.LayerType.Overlay)),this.alertManager.on(`triggered`,e=>{let t={id:e.id,price:e.price,condition:e.condition,message:e.message,triggered:e.triggered};this.eventBus.emit(`alertTriggered`,t),this.eventBus.emit(`dataUpdate`,{alert:`triggered`,alertId:e.id,price:e.price,message:e.message})}),this.alertManager.on(`added`,e=>{this.eventBus.emit(`alertAdd`,{id:e.id,price:e.price,condition:e.condition,message:e.message,triggered:e.triggered})}),this.alertManager.on(`removed`,e=>{this.eventBus.emit(`alertRemove`,{id:e})}),this.alertManager.on(`updated`,e=>{this.eventBus.emit(`alertUpdate`,{id:e.id,price:e.price,condition:e.condition,message:e.message,triggered:e.triggered})}),this.signalMarkerManager=new t.SignalMarkerManager,this.signalMarkerManager.setRequestRender(()=>this.engine.requestRender(e.LayerType.Overlay)),this.signalMarkerManager.setDataGetter(()=>this.dataManager.getData()),this.signalMarkerManager.on(`added`,e=>{this.eventBus.emit(`signalMarkerAdd`,{id:e.id,source:e.source,direction:e.direction})}),this.signalMarkerManager.on(`removed`,e=>{this.eventBus.emit(`signalMarkerRemove`,{id:e})}),this.tradeZoneManager=new t.TradeZoneManager,this.tradeZoneManager.setRequestRender(()=>this.engine.requestRender(e.LayerType.Overlay)),this.tradeZoneManager.setDataGetter(()=>this.dataManager.getData()),this.tradeZoneManager.on(`added`,e=>{this.eventBus.emit(`tradeZoneAdd`,{id:e.id,direction:e.direction})}),this.tradeZoneManager.on(`removed`,e=>{this.eventBus.emit(`tradeZoneRemove`,{id:e})}),this.replayManager=new t.ReplayManager,this.measureOverlay=new t.MeasureOverlay,this.interactionManager=new t.InteractionManager(n),this.features.panning){let e=new T;this.interactionManager.setPanHandler(new t.PanHandler((t,n)=>{t&&this.viewport.scrollBy(t),e.step(t,n,this.options.autoScale!==!1)&&n&&(this.options.autoScale=!1,this.viewport.panPriceRange(n)),this.updateViewportAndRender()},()=>e.reset()))}if(this.features.zooming){this.interactionManager.setZoomHandler(new t.ZoomHandler((e,t)=>{this.viewport.zoom(e,t),this.updateViewportAndRender()}));let e=new t.AxisDragHandler(e=>{this.options.autoScale=!1,this.viewport.scalePriceRange(e),this.syncRenderContext(),this.engine.requestRender(),this.emitViewportEvents()},e=>{let t=this.viewport.getState().chartRect.width;this.viewport.zoom(1/e-1,t/2),this.updateViewportAndRender()});this.interactionManager.setAxisDragHandler(e,()=>this.viewport.getState(),e=>{e===`price`?(this.options.autoScale=!0,this.updateViewportAndRender()):this.fitContent()})}if(this.features.crosshair&&this.interactionManager.setCrosshairHandler(this.crosshairHandler),this.features.drawings&&this.interactionManager.setDrawingManager(this.drawingManager,()=>({...this.viewport.getState(),data:this.getDisplayData()})),this.features.trading&&this.interactionManager.setTradingManager(this.tradingManager,()=>({...this.viewport.getState(),data:this.getDisplayData()})),this.features.alerts){let e=new t.AlertDragHandler(this.alertManager,()=>this.viewport.getState());this.interactionManager.setAlertDragHandler(e)}let o=new t.PaneResizeHandler;o.configure(()=>this.getResolvedLayout(),(e,t)=>this.setPanelSize(e,t)),this.interactionManager.setPaneResizeHandler(o),this.interactionManager.setAltClickHandler(t=>{let n=this.getDisplayData();if(n.length===0)return;let r=this.viewport.getState(),i=r.barWidth+r.barSpacing,a=Math.round((r.offset+t.x)/i);a<0||a>=n.length||(this.pinnedTooltip.isPinned()&&this.pinnedTooltip.getPinnedIndex()===a?this.pinnedTooltip.unpin():this.pinnedTooltip.pin(n[a],a,this.themeManager.getTheme()),this.pinnedTooltip.reposition(this.viewport.getState(),this.dataManager.getData()[a]??null,a,this.themeManager.getTheme()),this.engine.requestRender(e.LayerType.Overlay))}),this.interactionManager.setClickHandler(e=>{let n=this.getDisplayData();if(this.eventBus.emit(`click`,{x:e.x,y:e.y}),n.length===0)return;let r=(0,t.xToBarIndex)(e.x,this.viewport.getState());r<0||r>=n.length||this.eventBus.emit(`barClick`,{bar:n[r],barIndex:r,point:e})}),this.interactionManager.setEscapeHandler(()=>{if(this.features.trading&&this.tradingManager.isBracketActive()){this.tradingManager.cancelBracket(),this.eventBus.emit(`dataUpdate`,{bracket:`cancelled`});return}this.pinnedTooltip.isPinned()&&(this.pinnedTooltip.unpin(),this.engine.requestRender(e.LayerType.Overlay))}),this.interactionManager.setConfirmHandler(()=>this.features.trading&&this.tradingManager.isBracketActive()?(this.tradingManager.confirmBracket(),!0):!1),this.interactionManager.setMeasureHandlers({begin:e=>{this.measureOverlay.begin(e,this.viewport.getState(),this.getDisplayData())},move:e=>{this.measureOverlay.update(e,this.viewport.getState(),this.getDisplayData())},end:()=>{this.measureOverlay.end()}});let s=e=>{let t=this.viewport.getState().chartRect;return{x:Math.max(t.x,Math.min(t.x+t.width,e.x)),y:Math.max(t.y,Math.min(t.y+t.height,e.y))}};this.interactionManager.setBoxSelectHandlers({begin:e=>this.selectionBoxOverlay.begin(s(e)),move:e=>this.selectionBoxOverlay.update(s(e)),end:()=>{let t=this.selectionBoxOverlay.end();if(!t||!this.features.drawings)return;let n={...this.viewport.getState(),data:this.getDisplayData()};t.isClick?this.drawingManager.toggleSelectionAt({x:t.x1,y:t.y1},n):this.drawingManager.selectInRect(t,n),this.engine.requestRender(e.LayerType.Overlay)},cancel:()=>this.selectionBoxOverlay.cancel()}),this.interactionManager.setOverlayDirtyCallback(t=>{this.engine.requestRender(t?e.LayerType.Hover:e.LayerType.Overlay)}),this.interactionManager.attach(),this.syncRenderContext(),this.engine.start()}setData(e){this.endReplaySession(),this.dataManager.setData(e),this.crosshairHandler.setData(this.dataManager.getData()),this.displayDataCache=null,this.sessionBreaks.invalidateCache(),this.options.autoScale=this.defaultAutoScale,this.alertManager.clearLastValues(),this.recalcIndicators(this.dataManager.getData()),e.length>0&&this.currentPriceLine.setPrice(e[e.length-1].close),this.updateViewportAndRender(!0),this.eventBus.emit(`dataUpdate`,{length:e.length})}appendBar(e){if(this.replaySession){this.replaySession.live.appendBar(e);return}let t=this.autoScrollOnNewBar&&this.viewport.isAtEnd();this.dataManager.appendBar(e);let n=this.dataManager.getData();this.crosshairHandler.setData(n),this.displayDataCache=null,this.recalcIndicatorsFrom(n,n.length-2),this.updateViewportAndRender(t)}appendBars(e){if(e.length===0)return;if(this.replaySession){for(let t of e)this.replaySession.live.appendBar(t);return}let t=this.viewport.isAtEnd(),n=this.dataManager.getLength()-1;for(let t of e)this.dataManager.appendBar(t);this.displayDataCache=null,this.recalcIndicatorsFrom(this.dataManager.getData(),n),this.crosshairHandler.setData(this.dataManager.getData()),this.updateViewportAndRender(t)}updateLastBar(e){if(this.replaySession){this.replaySession.live.updateLastBar(e);return}this.dataManager.updateLastBar(e),this.currentPriceLine.setPrice(e.close),this.options.chartType!==`candlestick`&&this.options.chartType!==`line`&&this.options.chartType!==`area`&&this.options.chartType!==`bar`&&this.options.chartType!==`hollowCandle`&&(this.displayDataCache=null);let t=this.dataManager.getData();this.recalcIndicatorsFrom(t,t.length-1),this.scheduleRender()}updateLastBarFromTick(e){if(this.replaySession){this.replaySession.live.updateLastBarFromTick(e),Number.isFinite(e.price)&&(this.replaySession.price={price:e.price});return}this.dataManager.updateLastBarFromTick(e),this.currentPriceLine.setPrice(e.price),this.options.chartType!==`candlestick`&&this.options.chartType!==`line`&&this.options.chartType!==`area`&&this.options.chartType!==`bar`&&this.options.chartType!==`hollowCandle`&&(this.displayDataCache=null);let t=this.dataManager.getData();this.recalcIndicatorsFrom(t,t.length-1),this.scheduleRender()}setChartType(e){this.options.chartType=e,this.chartRenderer=this.createChartRenderer(e),this.chartLegend.setChartType(e),this.displayDataCache=null,this.updateViewportAndRender(!0)}addIndicator(e,t={},n=`bottom`){if(!this.features.indicators||this.features.indicatorIds.length>0&&!this.features.indicatorIds.includes(e))return null;let r=this.indicatorEngine.addIndicator(e,t,this.dataManager.getData());return this.indicatorEngine.getAvailableIndicators().find(t=>t.id===e)?.placement===`panel`?(this.layoutManager.addPanel(r,n),this.updateViewportAndRender()):this.engine.requestRender(),this.eventBus.emit(`indicatorAdd`,{instanceId:r,id:e}),this.scheduleAutoSave(),r}updateIndicator(e,t){this.indicatorEngine.updateIndicator(e,t,this.dataManager.getData()),this.announceIndicatorUpdate(0),this.engine.requestRender(),this.scheduleAutoSave()}removeIndicator(e){let t=this.layoutManager.getPanels().some(t=>t.id===e);this.indicatorEngine.removeIndicator(e),this.layoutManager.removePanel(e),this.eventBus.emit(`indicatorRemove`,{instanceId:e}),this.scheduleAutoSave(),t?this.updateViewportAndRender():this.engine.requestRender()}getIndicatorStyle(e){return this.indicatorEngine.getIndicatorStyle(e)}getIndicatorOutput(e){return this.indicatorEngine.getOutput(e)}registerIndicator(e){this.pluginManager.registerIndicator(e)}get plugins(){return this.pluginManager}static indicators(){let e=new t.IndicatorEngine;return(0,t.registerBuiltInIndicators)(e),e.getAvailableIndicators()}setPanelPosition(e,t){this.layoutManager.setPanelPosition(e,t),this.engine.requestRender()}setPanelSize(e,t){this.layoutManager.setPanelSize(e,t),this.updateViewportAndRender(),this.eventBus.emit(`paneResize`,{instanceId:e,size:t})}getIndicatorPanes(){return this.buildPanelRenderInfos().map(e=>({instanceId:e.instanceId,rect:{...e.rect}}))}setPaneTitlesVisible(e){this.paneTitles=e,this.engine.requestRender()}getLegendBottom(){let e=this.viewport.getState().chartRect.y;return this.features.legend?e+this.chartLegend.getHeight():e}isTimeAligned(){return a(this.options.chartType)?!1:this.getDisplayData().length===this.dataManager.getLength()}formatPrice(t){let{min:n,max:r}=this.viewport.getState().priceRange;return(0,e.formatPrice)(t,this.marketPricePrecision??(0,e.autoPricePrecision)(n,r),this.numberLocale)}setDrawingTool(e){this.features.drawings&&(e&&this.features.drawingTools.length>0&&!this.features.drawingTools.includes(e)||this.drawingManager.setActiveTool(e))}getDrawingTool(){return this.drawingManager.getActiveTool()}setStayInDrawingMode(e){this.drawingManager.setStayInDrawingMode(e)}isStayInDrawingMode(){return this.drawingManager.isStayInDrawingMode()}copyDrawings(){return this.drawingManager.copySelection()}pasteDrawings(){return this.features.drawings?this.drawingManager.paste():[]}setDrawingStyle(e){this.drawingManager.setStyle(e)}getDrawingStyle(){return this.drawingManager.getActiveStyle()}getSelectedDrawingId(){return this.drawingManager.getSelectedDrawingId()}setSelectedDrawingStyle(e,t){return this.drawingManager.setSelectedDrawingStyle(e,t)}getDrawings(){return this.drawingManager.getDrawings()}setDrawings(e){this.drawingManager.setDrawings(e)}addDrawing(e){if(!this.features.drawings)return null;let t=this.drawingManager.addDrawing(e);return this.scheduleAutoSave(),t}autoFib(){if(!this.features.drawings)return null;let e=this.getDisplayData(),n=this.viewport.getState(),r=(0,t.findDominantSwing)(e,n.visibleRange.from,n.visibleRange.to);return r?this.addDrawing({type:`fibRetracement`,anchors:[r[0],r[1]]}):null}removeDrawing(e){this.drawingManager.removeDrawing(e)}setDrawingVisible(e,t){this.drawingManager.setDrawingVisible(e,t)}setDrawingLocked(e,t){this.drawingManager.setDrawingLocked(e,t)}clearDrawings(){this.drawingManager.clearDrawings()}registerDrawingTool(e){this.drawingManager.register(e)}undo(){return this.features.drawingUndoRedo?this.drawingManager.undo():!1}redo(){return this.features.drawingUndoRedo?this.drawingManager.redo():!1}getUndoRedoState(){return this.undoRedoManager.getState()}setDrawingMagnet(e){this.drawingManager.setMagnetMode(e&&this.features.drawingMagnet?`magnet`:`none`)}getDrawingMagnet(){return this.drawingManager.getMagnetMode()===`magnet`}lockAllDrawings(){this.drawingManager.lockAllDrawings()}unlockAllDrawings(){this.drawingManager.unlockAllDrawings()}hideAllDrawings(){this.drawingManager.hideAllDrawings()}showAllDrawings(){this.drawingManager.showAllDrawings()}duplicateDrawing(e){let t=e??this.drawingManager.getSelectedDrawingId();return t?this.drawingManager.duplicateDrawing(t):null}exportVisibleData(e=`csv`,n){if(!this.features.dataExport)return;let r=this.viewport.getState(),i=this.dataManager.getData(),a=Math.max(0,r.visibleRange.from),o=Math.min(i.length-1,r.visibleRange.to),s=i.slice(a,o+1);if(e===`json`){let e=t.DataExporter.toJSON(s);t.DataExporter.download(e,n??`chart-data.json`,`application/json`)}else{let e=t.DataExporter.toCSV(s);t.DataExporter.download(e,n??`chart-data.csv`,`text/csv`)}}exportAllData(e=`csv`,n){if(!this.features.dataExport)return;let r=this.dataManager.getData();if(e===`json`){let e=t.DataExporter.toJSON(r);t.DataExporter.download(e,n??`chart-data.json`,`application/json`)}else{let e=t.DataExporter.toCSV(r);t.DataExporter.download(e,n??`chart-data.csv`,`text/csv`)}}setAutoSave(e,t=5e3){this.autoSaveScheduler.enable(e,t)}disableAutoSave(){this.autoSaveScheduler.disable()}scheduleAutoSave(){this.autoSaveScheduler.schedule()}getAvailableIndicators(){return this.indicatorEngine.getAvailableIndicators()}getIndicatorInputs(e){let t=this.indicatorEngine.getAvailableIndicators().find(t=>t.id===e);return t?{id:t.id,params:t.defaultConfig}:null}getActiveIndicators(){return this.indicatorEngine.getActiveIndicators()}setIndicatorVisible(e,t){this.indicatorEngine.setVisible(e,t)!==null&&(this.updateViewportAndRender(),this.scheduleAutoSave())}getIndicatorConfig(e){let t=this.indicatorEngine.getIndicatorConfig(e);return t?{id:t.id,params:{...t.params}}:null}updateIndicatorStyle(e,t){this.indicatorEngine.updateIndicatorStyle(e,t),this.engine.requestRender(),this.scheduleAutoSave()}setOrders(e){this.features.trading&&this.tradingManager.setOrders(e)}startBracket(e,t){if(!this.features.trading)return!1;let n=this.dataManager.getData(),r=t??(n.length>0?n[n.length-1].close:null);return r===null?!1:(this.tradingManager.startBracket(e,r),!0)}cancelBracket(){this.features.trading&&this.tradingManager.cancelBracket()}confirmBracket(){return this.features.trading?this.tradingManager.confirmBracket():!1}isBracketActive(){return this.features.trading&&this.tradingManager.isBracketActive()}startOrderDraft(e,t){if(!this.features.trading)return!1;let n=this.dataManager.getData(),r=t??(n.length>0?n[n.length-1].close:null);return r===null?!1:(this.tradingManager.startOrderDraft(e,r),!0)}cancelOrderDraft(){this.features.trading&&this.tradingManager.cancelOrderDraft()}confirmOrderDraft(){return this.features.trading?this.tradingManager.confirmOrderDraft():!1}isOrderDraftActive(){return this.features.trading&&this.tradingManager.isOrderDraftActive()}placeOrderIntent(e){this.features.trading&&this.eventBus.emit(`orderPlace`,e)}setPositions(e){this.features.trading&&this.tradingManager.setPositions(e)}setDepthData(e){this.features.trading&&this.tradingManager.setDepthData(e)}setCurrentPrice(e,t){this.tradingManager.setCurrentPrice(e),this.replaySession?this.replaySession.price={price:e}:(this.currentPriceLine.setPrice(e),this.scheduleRender()),this.features.alerts&&(this.alertManager.checkPrice(e),this.feedIndicatorAlerts())}feedIndicatorAlerts(){let e=this.alertManager.getAlerts(),t=this.dataManager.getData();if(t.length===0)return;let n=t.length-1,r=new Set;for(let t of e){if(t.channel===`price`||r.has(t.channel))continue;r.add(t.channel);let e=t.channel.indexOf(`:`);if(e<0)continue;let i=t.channel.slice(0,e),a=t.channel.slice(e+1),o=this.indicatorEngine.getOutput(i)?.series?.[n]?.[a];typeof o==`number`&&Number.isFinite(o)&&this.alertManager.checkChannel(t.channel,o)}}setTradingConfig(e){this.features.trading&&this.tradingManager.setConfig(e)}async connect(n){this.replayStop(),this.disconnectStream(),this.streamManager=new t.StreamManager,this.streamManager.on(`snapshot`,e=>{if(this.replaySession){this.replaySession.live.setData(e);return}this.setData(e)}),this.streamManager.on(`barClose`,e=>{if(this.replaySession){this.replaySession.live.appendBar(e);return}let t=this.autoScrollOnNewBar&&this.viewport.isAtEnd();this.dataManager.appendBar(e);let n=this.dataManager.getData();this.crosshairHandler.setData(n),this.displayDataCache=null,this.recalcIndicatorsFrom(n,n.length-2),this.updateViewportAndRender(t)}),this.streamManager.on(`barUpdate`,e=>{if(this.replaySession){this.replaySession.live.updateLastBar(e);return}this.dataManager.updateLastBar(e),this.currentPriceLine.setPrice(e.close);let t=this.dataManager.getData();this.recalcIndicatorsFrom(t,t.length-1),this.scheduleRender()}),this.streamManager.on(`priceChange`,({price:t,previousClose:n})=>{if(this.tradingManager.setCurrentPrice(t),this.replaySession){this.replaySession.price={price:t,previousClose:n??void 0};return}this.currentPriceLine.setPrice(t,n??void 0),this.engine.requestRender(e.LayerType.Overlay)}),this.streamManager.on(`connectionChange`,e=>{this.eventBus.emit(`dataUpdate`,{connection:e})}),this.streamManager.on(`error`,e=>{this.eventBus.emit(`dataUpdate`,{error:e.message})}),this.autoScrollOnNewBar=n.autoScroll!==!1,this.currentSymbol=n.symbol;let r=this.streamManager;if(await r.connect(n),this.streamManager!==r)return;let i=(0,e.timeframeToMs)(n.timeframe);this.barCountdown.setTimeframeMs(i),this.countdownInterval&&clearInterval(this.countdownInterval),this.countdownInterval=setInterval(()=>{this.barCountdown.isVisible()&&this.engine.requestRender(e.LayerType.Hover)},1e3)}async switchStream(t,n){this.streamManager&&(this.currentSymbol=t,this.barCountdown.setTimeframeMs((0,e.timeframeToMs)(n)),await this.streamManager.switchTo(t,n))}isTimeframeAllowed(e){let t=this.features.timeframes;return t.length===0||t.includes(e)}async setTimeframe(e){if(!this.streamManager)throw Error(`No active stream. Call connect() first.`);this.isTimeframeAllowed(e)&&await this.switchStream(this.currentSymbol,e)}disconnectStream(){this.streamManager&&=(this.streamManager.dispose(),null)}connectExecution(e,t={}){if(!this.features.trading)throw Error(`connectExecution requires features.trading to be enabled`);this.disconnectExecution(),this.executionAdapter=e,this.execTeardown=ne(e,{onIntent:(e,t)=>{let n=e=>t(e.payload);return this.eventBus.on(e,n),()=>this.eventBus.off(e,n)},setOrders:e=>this.setOrders(e),setPositions:e=>this.setPositions(e),onError:e=>this.eventBus.emit(`executionError`,e)}),Promise.resolve(e.connect(t)).catch(e=>this.eventBus.emit(`executionError`,{message:`Execution connect failed`,cause:e}))}disconnectExecution(){this.execTeardown&&=(this.execTeardown(),null),this.executionAdapter&&=(this.executionAdapter.disconnect(),null)}getExecutionAdapter(){return this.executionAdapter}setBarCountdownVisible(t){this.barCountdown.setVisible(t&&this.features.barCountdown),this.engine.requestRender(e.LayerType.Hover)}setSessionBreaksVisible(t){this.sessionBreaks.setVisible(t),this.engine.requestRender(e.LayerType.Background)}addCompareSymbol(t,n,r,i){this.features.compareSymbols&&(this.compareRenderer.addSymbol({id:t,label:n,data:r,color:i,visible:!0}),this.engine.requestRender(e.LayerType.Main))}removeCompareSymbol(t){this.compareRenderer.removeSymbol(t),this.engine.requestRender(e.LayerType.Main)}updateCompareData(t,n){this.compareRenderer.setSymbolData(t,n),this.engine.requestRender(e.LayerType.Main)}setCompareMode(t){this.compareRenderer.setMode(t),this.engine.requestRender(e.LayerType.Main)}clearCompareSymbols(){this.compareRenderer.clear(),this.engine.requestRender(e.LayerType.Main)}setLogScale(e){e&&!this.features.logScale||(this.viewport.setLogScale(e),this.updateViewportAndRender())}isLogScale(){return this.viewport.isLogScale()}setInvertScale(e){this.viewport.setInvertScale(e),this.updateViewportAndRender()}isInvertScale(){return this.viewport.isInvertScale()}setScaleMode(e){e===`logarithmic`&&!this.features.logScale||(this.viewport.setScaleMode(e),this.updateViewportAndRender())}getScaleMode(){return this.viewport.getScaleMode()}setSessionBreaksConfig(t){this.sessionBreaks.setConfig(t),this.engine.requestRender(e.LayerType.Background)}getConnectionState(){return this.streamManager?.getConnectionState()??`disconnected`}getConnectionInfo(){return this.streamManager?.getConnectionInfo()??{state:`disconnected`}}setAutoScroll(e){this.autoScrollOnNewBar=e}scrollTo(e){let t=this.dataManager.getData();for(let n=0;n<t.length;n++)if(t[n].time>=e){let e=this.viewport.getState().barWidth+this.viewport.getState().barSpacing;this.viewport.scrollBy(n*e-this.viewport.getState().offset),this.updateViewportAndRender();return}}goToTime(e){let n=this.getDisplayData();if(n.length===0||!Number.isFinite(e))return-1;let r=Math.max(0,Math.min(n.length-1,Math.floor((0,t.timestampToBarIndex)(e,n)))),i=this.viewport.getState(),a=r*(i.barWidth+i.barSpacing)+i.barWidth/2-i.chartRect.width/2;return this.viewport.scrollBy(a-i.offset),this.updateViewportAndRender(),r}setVisibleRangePreset(e){let n=this.getDisplayData();if(n.length===0)return;let r=n.length-1,i=n[r].time>re?1:1e3,a=(0,t.rangePresetStart)(e,n[r].time*i,this.displayTzOffset),o=a===null?null:a/i;if(o===null||o<n[0].time){this.fitContent();return}let s=Math.min(r,Math.floor((0,t.timestampToBarIndex)(o,n))+1);this.viewport.zoomToBarRange(s,r+this.viewport.getRightMargin()),this.viewport.scrollToEnd(),this.updateViewportAndRender()}scrollToEnd(){this.viewport.scrollToEnd(),this.updateViewportAndRender()}setVisibleRange(e,n){let r=this.dataManager.getData();if(r.length===0)return;let i=(0,t.timestampToBarIndex)(Math.min(e,n),r),a=(0,t.timestampToBarIndex)(Math.max(e,n),r);this.viewport.zoomToBarRange(i,a),this.updateViewportAndRender()}setPanLimits(e){this.viewport.setPanLimits(e),this.updateViewportAndRender()}zoomIn(){let e=this.viewport.getState().chartRect.width;this.viewport.zoom(.2,e/2),this.updateViewportAndRender()}zoomOut(){let e=this.viewport.getState().chartRect.width;this.viewport.zoom(-.2,e/2),this.updateViewportAndRender()}fitContent(){let e=this.dataManager.getLength();e!==0&&(this.viewport.zoomToBarRange(0,e-1+this.viewport.getRightMargin()),this.viewport.scrollToEnd(),this.updateViewportAndRender())}on(e,t){this.eventBus.on(e,t)}off(e,t){this.eventBus.off(e,t)}enableTauriBridge(e){this.eventBus.enableTauriBridge({enabled:!0,...e})}disableTauriBridge(){this.eventBus.disableTauriBridge()}setTheme(e){this.themeManager.setTheme(e),this.syncRenderContext(),this.container.style.backgroundColor=this.themeManager.getTheme().background,this.engine.requestRender(),this.eventBus.emit(`themeChange`,{theme:e})}getTheme(){return this.themeManager.getTheme()}setWatermark(t,n){this.watermark.setConfig({text:t,...n}),this.engine.requestRender(e.LayerType.Background)}setAutoScale(e){this.options.autoScale=e,this.defaultAutoScale=e,this.updateViewportAndRender()}isAutoScale(){return this.options.autoScale!==!1}setCrosshairMode(t){this.crosshairHandler.setMode(t),this.engine.requestRender(e.LayerType.Hover)}getCrosshairMode(){return this.crosshairHandler.getMode()}setCrosshairPosition(t){t?this.crosshairHandler.onPointerMove(t):this.crosshairHandler.onPointerLeave(),this.engine.requestRender(e.LayerType.Hover)}setCrosshairTime(n){let r=this.getDisplayData(),i=n===null||r.length===0?null:Math.floor((0,t.timestampToBarIndex)(n,r));i!==this.crosshairHandler.getSyncedSlot()&&(this.crosshairHandler.setSyncedSlot(i),this.engine.requestRender(e.LayerType.Hover))}getData(){return this.dataManager.getData()}setGridVisible(t){this.gridRenderer.setVisible(t),this.engine.requestRender(e.LayerType.Background)}isGridVisible(){return this.gridRenderer.isVisible()}setVolumeVisible(t){this.volumeRenderer.setVisible(t),this.engine.requestRender(e.LayerType.Main)}setVolumeProfileVisible(t){this.volumeProfile.setVisible(t),this.engine.requestRender(e.LayerType.Main)}isVolumeProfileVisible(){return this.volumeProfile.isVisible()}setVolumeProfileConfig(t){t.buckets!==void 0&&this.volumeProfile.setBuckets(t.buckets),t.widthRatio!==void 0&&this.volumeProfile.setWidthRatio(t.widthRatio),t.opacity!==void 0&&this.volumeProfile.setOpacity(t.opacity),t.highlightPoC!==void 0&&this.volumeProfile.setHighlightPoC(t.highlightPoC),this.engine.requestRender(e.LayerType.Main)}setMarketProfileVisible(t){this.marketProfile.setVisible(t),this.engine.requestRender(e.LayerType.Main)}isMarketProfileVisible(){return this.marketProfile.isVisible()}setMarketProfileConfig(t){t.buckets!==void 0&&this.marketProfile.setBuckets(t.buckets),t.widthRatio!==void 0&&this.marketProfile.setWidthRatio(t.widthRatio),t.opacity!==void 0&&this.marketProfile.setOpacity(t.opacity),t.valueAreaPct!==void 0&&this.marketProfile.setValueAreaPct(t.valueAreaPct),t.highlightPoC!==void 0&&this.marketProfile.setHighlightPoC(t.highlightPoC),t.showStats!==void 0&&this.marketProfile.setShowStats(t.showStats),t.splitBySession!==void 0&&this.marketProfile.setSplitBySession(t.splitBySession),t.letters!==void 0&&this.marketProfile.setLetters(t.letters),this.engine.requestRender(e.LayerType.Main)}getMarketProfileStats(){return this.marketProfile.getStats()}setDepthHeatmapVisible(t){this.depthHeatmap.setVisible(t),this.engine.requestRender(e.LayerType.Main)}isDepthHeatmapVisible(){return this.depthHeatmap.isVisible()}setDepthHeatmapConfig(t){t.opacity!==void 0&&this.depthHeatmap.setOpacity(t.opacity),t.capacity!==void 0&&this.depthHeatmap.setCapacity(t.capacity),this.engine.requestRender(e.LayerType.Main)}pushDepthSnapshot(t){let n=this.dataManager.getData();n.length!==0&&(this.depthHeatmap.push(n[n.length-1].time,t),this.depthHeatmap.isVisible()&&this.engine.requestRender(e.LayerType.Main))}clearDepthHeatmap(){this.depthHeatmap.clear(),this.engine.requestRender(e.LayerType.Main)}setPeriodLevelsVisible(t){this.periodLevels.setVisible(t),this.engine.requestRender(e.LayerType.Main)}isPeriodLevelsVisible(){return this.periodLevels.isVisible()}setPeriodLevelsPeriod(t){this.periodLevels.setPeriod(t),this.engine.requestRender(e.LayerType.Main)}setTimezoneOffset(t){this.displayTzOffset=t,this.timeAxis.setTimezoneOffset(t),this.crosshairHandler.setTimezoneOffset(t),this.crosshairTooltip.setTimezoneOffset(t),this.engine.requestRender(e.LayerType.UI)}setPivotMarkersVisible(t){this.pivotMarkers.setVisible(t),this.engine.requestRender(e.LayerType.Overlay)}isPivotMarkersVisible(){return this.pivotMarkers.isVisible()}setPivotMarkersConfig(t){(t.left!==void 0||t.right!==void 0)&&this.pivotMarkers.setStrength(t.left??5,t.right??t.left??5),t.showLabels!==void 0&&this.pivotMarkers.setShowLabels(t.showLabels),t.structureLabels!==void 0&&this.pivotMarkers.setStructureLabels(t.structureLabels),this.engine.requestRender(e.LayerType.Overlay)}setSessionShadingVisible(t){this.sessionShading.setVisible(t),this.engine.requestRender(e.LayerType.Background)}isSessionShadingVisible(){return this.sessionShading.isVisible()}setSessionShadingConfig(t){this.sessionShading.setConfig(t),this.engine.requestRender(e.LayerType.Background)}setTooltipVisible(e){e||this.crosshairTooltip.hide()}setLegend(t){this.chartLegend.setConfig(t),this.engine.requestRender(e.LayerType.Hover)}setSymbolName(t){this.chartLegend.setSymbol(t),this.engine.requestRender(e.LayerType.Hover)}setStatusText(t){this.chartLegend.setStatusText(t),this.engine.requestRender(e.LayerType.Hover)}screenshot(e){this.features.screenshot&&t.Screenshot.download(this.container,e,this.themeManager.getTheme().background)}async copyScreenshot(){if(!this.features.screenshot)return!1;try{let e=await t.Screenshot.toBlob(this.container,this.themeManager.getTheme().background),n=globalThis.ClipboardItem;return!e||!navigator.clipboard?.write||!n?!1:(await navigator.clipboard.write([new n({"image/png":e})]),!0)}catch{return!1}}screenshotDataURL(){return this.features.screenshot?t.Screenshot.toDataURL(this.container,this.themeManager.getTheme().background):null}async screenshotBlob(){return this.features.screenshot?t.Screenshot.toBlob(this.container,this.themeManager.getTheme().background):null}addAlert(e,t=`crossing`,n,r=`price`,i){if(!this.features.alerts)return null;let a=this.alertManager.addAlert(e,t,n,!1,r,i);return this.scheduleAutoSave(),a}removeAlert(e){this.alertManager.removeAlert(e),this.scheduleAutoSave()}getAlerts(){return this.alertManager.getAlerts()}clearAlerts(){this.alertManager.clearAlerts(),this.scheduleAutoSave()}saveAlerts(e){this.alertManager.saveToStorage(e)}loadAlerts(t){this.alertManager.loadFromStorage(t),this.engine.requestRender(e.LayerType.Overlay)}addSignalMarker(e){return this.signalMarkerManager.addMarker(e)}removeSignalMarker(e){this.signalMarkerManager.removeMarker(e)}getSignalMarkers(){return this.signalMarkerManager.getMarkers()}setSignalMarkers(e){this.signalMarkerManager.setMarkers(e)}clearSignalMarkers(){this.signalMarkerManager.clearMarkers()}setSignalMarkerStyle(e){this.signalMarkerManager.setStyle(e)}addTradeZone(e){return this.tradeZoneManager.addZone(e)}updateTradeZone(e,t){this.tradeZoneManager.updateZone(e,t)}removeTradeZone(e){this.tradeZoneManager.removeZone(e)}getTradeZones(){return this.tradeZoneManager.getZones()}setTradeZones(e){this.tradeZoneManager.setZones(e)}clearTradeZones(){this.tradeZoneManager.clearZones()}setTradeZoneStyle(e){this.tradeZoneManager.setStyle(e)}replayStart(e){if(!this.features.replay)return;if(!this.replaySession){if(this.dataManager.getLength()===0)return;let e=new g;e.setData(this.dataManager.getData()),this.replaySession={live:e,price:null}}let t=this.replaySession.live.getData().slice();this.options.autoScale=!0,this.replayManager.load(t);let n=-1;this.replayBarUnsub?.(),this.replayBarUnsub=this.replayManager.on(`bar`,({bar:e,index:r})=>{let i=r+1,a=n>0&&i>n&&this.dataManager.getLength()===n,o=!(a&&!this.replaySeeking)||this.autoScrollOnNewBar&&this.viewport.isAtEnd();if(a){for(let e=n;e<i;e++)this.dataManager.appendBar(t[e]);this.recalcIndicatorsFrom(this.dataManager.getData(),n)}else this.dataManager.setData(t.slice(0,i)),this.recalcIndicators(this.dataManager.getData());n=i,this.currentPriceLine.setPrice(t[r].close,r>0?t[r-1].close:void 0),this.crosshairHandler.setData(this.dataManager.getData()),this.displayDataCache=null,this.updateViewportAndRender(o)}),this.replayManager.play(e)}replayPause(){this.replayManager.pause()}replayResume(){this.replayManager.resume()}replayStop(){let e=this.replaySession;this.endReplaySession(),e&&(this.setData(e.live.getData()),e.price&&this.currentPriceLine.setPrice(e.price.price,e.price.previousClose))}isReplayActive(){return this.replaySession!==null}getPlotRect(){let{x:e,y:t,width:n,height:r}=this.viewport.getState().chartRect;return{x:e,y:t,width:n,height:r}}endReplaySession(){this.replaySession&&(this.replaySession=null,this.replayBarUnsub?.(),this.replayBarUnsub=null,this.replayManager.stop())}replaySeek(e){this.replaySeeking=!0;try{this.replayManager.seekTo(e)}finally{this.replaySeeking=!1}}setReplaySpeed(e){this.replayManager.setSpeed(e)}getReplayState(){return this.replayManager.getState()}getReplayProgress(){return this.replayManager.getProgress()}captureSnapshot(){let e=this.layoutManager.getPanels();return t.ChartStateManager.capture({getDrawings:()=>this.getDrawings(),getTheme:()=>this.getTheme(),getAlerts:()=>this.getAlerts(),getIndicators:()=>[...this.indicatorEngine.getActiveIndicators().map(t=>({id:t.id,instanceId:t.instanceId,params:t.params,position:e.find(e=>e.id===t.instanceId)?.position,style:this.indicatorEngine.getIndicatorStyle(t.instanceId)??void 0,visible:t.visible})),...this.unrestoredIndicators]},{chartType:this.options.chartType,symbol:this.currentSymbol||void 0})}saveState(e){if(!this.features.saveLoad)return null;let n=this.captureSnapshot(),r=t.ChartStateManager.serialize(n);return e&&t.ChartStateManager.saveToStorage(e,n),r}loadState(e){if(!this.features.saveLoad)return;let n=t.ChartStateManager.deserialize(e);n.chartType&&this.setChartType(n.chartType),n.drawings&&this.setDrawings(n.drawings),n.theme&&this.setTheme(n.theme);let r=new Map;if(n.version>=2&&this.features.indicators){this.unrestoredIndicators=[];let e=new Set(this.indicatorEngine.getAvailableIndicators().map(e=>e.id));for(let e of this.indicatorEngine.getActiveIndicators())this.removeIndicator(e.instanceId);for(let t of n.indicators){let n=[`top`,`bottom`,`left`,`right`].find(e=>e===t.position)??`bottom`,i=null;try{if(!e.has(t.id))throw Error(`no such indicator is registered`);i=this.addIndicator(t.id,t.params,n)}catch(e){console.warn(`Layout indicator "${t.id}" kept but not shown:`,e)}if(!i){this.unrestoredIndicators.push(t);continue}r.set(t.instanceId,i),t.style&&this.updateIndicatorStyle(i,t.style),t.visible===!1&&this.setIndicatorVisible(i,!1)}}if(n.alerts&&this.features.alerts){this.alertManager.clearAlerts();for(let e of n.alerts){if(e.triggered&&!e.repeating)continue;let t=e.channel.indexOf(`:`),n=t>0?r.get(e.channel.slice(0,t)):void 0,i=n?n+e.channel.slice(t):e.channel;this.alertManager.addAlert(e.price,e.condition,e.message,e.repeating,i,e.label)}}this.scheduleAutoSave()}loadStateFromStorage(e){if(!this.features.saveLoad)return!1;let n=t.ChartStateManager.loadFromStorage(e);return n?(this.loadState(t.ChartStateManager.serialize(n)),!0):!1}downloadState(e){this.features.saveLoad&&t.ChartStateManager.downloadFile(this.captureSnapshot(),e)}async loadStateFromFile(){if(!this.features.saveLoad)return;let e=await t.ChartStateManager.loadFromFile();this.loadState(t.ChartStateManager.serialize(e))}setLocale(t){(0,e.setLocale)(t),this.engine.requestRender()}setNumberLocale(e){this.numberLocale=e,this.priceAxis.setLocale(e),this.crosshairHandler.setLocale(e),this.chartLegend.setLocale(e),this.crosshairTooltip.setLocale(e),this.sessionBreaks.setLocale(e),this.currentPriceLine.setLocale(e),this.updateViewportAndRender()}getNumberLocale(){return this.numberLocale}setMarket(e){if(this.marketConfig=e,e.colorScheme){let t={...this.themeManager.getTheme(),candleUp:e.colorScheme.up,candleDown:e.colorScheme.down,candleUpWick:e.colorScheme.up,candleDownWick:e.colorScheme.down,volumeUp:e.colorScheme.up.replace(`)`,`, 0.3)`).replace(`rgb(`,`rgba(`)||`${e.colorScheme.up}4D`,volumeDown:e.colorScheme.down.replace(`)`,`, 0.3)`).replace(`rgb(`,`rgba(`)||`${e.colorScheme.down}4D`};this.themeManager.setTheme(t)}e.pricePrecision!==void 0&&(this.marketPricePrecision=e.pricePrecision,this.tradingManager.setConfig({pricePrecision:e.pricePrecision}),this.alertManager.setPricePrecision(e.pricePrecision),this.streamManager?.priceLine.setPricePrecision(e.pricePrecision),this.currentPriceLine.setPricePrecision(e.pricePrecision),this.crosshairHandler.setPricePrecision(e.pricePrecision),this.chartLegend.setPricePrecision(e.pricePrecision),this.crosshairTooltip.setPricePrecision(e.pricePrecision)),this.updateViewportAndRender()}getMarket(){return this.marketConfig}setPriceLimits(t){this.marketConfig&&((0,e.computePriceLimits)(t,this.marketConfig)&&(this.marketConfig.priceLimits={...this.marketConfig.priceLimits,referencePrice:t}),this.engine.requestRender())}getFeatures(){return this.features}setFeatures(t){Object.assign(this.features,t),(t.crosshair===!1||t.crosshairTooltip===!1)&&this.crosshairTooltip.hide(),t.grid!==void 0&&this.engine.requestRender(e.LayerType.Background),t.volume!==void 0&&(this.volumeRenderer.setVisible(t.volume),this.engine.requestRender(e.LayerType.Main)),t.drawings===!1&&this.drawingManager.setActiveTool(null),t.trading===!1&&(this.tradingManager.setOrders([]),this.tradingManager.setPositions([])),t.keyboard!==void 0&&this.keyboardHandler?.setEnabled(t.keyboard),this.engine.requestRender()}resize(){let e=this.engine.dprManager.readContainerSize();if(e.width<=0||e.height<=0)return;this.containerSizeCache=e,this.containerSizeCacheTime=Date.now();let t=this.engine.dprManager.getDpr();this.engine.layerManager.resize(e,t);let n=this.viewport.isAtEnd();this.viewport.resize(e.width,e.height),this.layoutManager.resize(e.width,e.height),this.updateViewportAndRender(n),this.eventBus.emit(`resize`,e)}destroy(){this.countdownInterval&&clearInterval(this.countdownInterval),this.disableAutoSave(),this.disconnectStream(),this.disconnectExecution(),this.onWindowKeyDown&&=(window.removeEventListener(`keydown`,this.onWindowKeyDown),null),this.keyboardHandler=null,this.interactionManager.detach(),this.tradingManager.destroy(),this.animator.dispose(),this.crosshairTooltip.destroy(),this.pinnedTooltip.destroy(),this.replayManager.dispose(),this.undoRedoManager.clear(),this.engine.destroy(),this.eventBus.destroy(),this.container.innerHTML=``}createChartRenderer(e){return s(e,e=>this.pluginManager.getChartType(e))}getDisplayData(){if(this.displayDataCache)return this.displayDataCache;let e=this.dataManager.getData();if(e.length===0)return e;let t=c(this.options.chartType,e,e=>this.pluginManager.getChartType(e));return this.displayDataCache=t,t}recalcIndicatorsFrom(e,t){this.indicatorEngine.recalculateFrom(e,t),this.announceIndicatorUpdate(t)}recalcIndicators(e){this.indicatorEngine.recalculateAll(e),this.announceIndicatorUpdate(0)}announceIndicatorUpdate(e){if(this.indicatorUpdateFrom!==null){this.indicatorUpdateFrom=Math.min(this.indicatorUpdateFrom,e);return}this.indicatorUpdateFrom=e,queueMicrotask(()=>{let e=this.indicatorUpdateFrom;this.indicatorUpdateFrom=null,e!==null&&this.eventBus.emit(`indicatorUpdate`,{from:e})})}scheduleRender(){this.renderScheduled||(this.renderScheduled=!0,requestAnimationFrame(()=>{this.renderScheduled=!1,this.applyDataToViewport(),this.fitPriceAxisWidth()&&this.applyDataToViewport(),this.syncRenderContext(),this.engine.requestRender(),this.emitViewportEvents()}))}applyDataToViewport(e=!1){let t=this.getDisplayData(),n=this.options.autoScale!==!1;this.viewport.updateData(t,n&&!e),e&&(this.viewport.scrollToEnd(),n&&this.viewport.updateData(t,!0));let r=this.viewport.getState();if(t.length>0){let e=Math.max(0,Math.min(r.visibleRange.from,t.length-1));this.viewport.setScaleBaseline(t[e]?.close)}if(n){let e=this.indicatorEngine.getOverlayPriceRange(r.visibleRange.from,Math.min(r.visibleRange.to,t.length-1));if(e){let t=r.priceRange,n=Math.min(t.min,e.min),i=Math.max(t.max,e.max);if(n<t.min||i>t.max){let e=i-n||1;this.viewport.setPriceRange(n-e*.02,i+e*.02)}}}return t}updateViewportAndRender(e=!1){this.resolvedLayoutCache=null,this.panelInfoCache=null;let t=this.getResolvedLayout();this.viewport.setChartRect(t.mainChartRect),this.applyDataToViewport(e),this.fitPriceAxisWidth()&&this.applyDataToViewport(e),this.syncRenderContext(),this.engine.requestRender(),this.emitViewportEvents()}fitPriceAxisWidth(){if(!this.features.priceAxis)return!1;let{priceRange:e}=this.viewport.getState(),t=this.themeManager.getTheme(),n=ee({min:e.min,max:e.max,lastPrice:this.currentPriceLine.getPrice(),tagPrecision:this.marketConfig?.pricePrecision??null,locale:this.numberLocale,fontFamily:t.font.family,fontSizeSmall:t.font.sizeSmall,measure:(e,t)=>this.measureText(e,t)}),r=te(this.priceAxisWidth,n);return r===this.priceAxisWidth?!1:(this.priceAxisWidth=r,this.layoutManager.setPriceAxisWidth(r),this.viewport.setPriceAxisWidth(r),this.resolvedLayoutCache=null,this.panelInfoCache=null,this.viewport.setChartRect(this.getResolvedLayout().mainChartRect),!0)}measureText(e,t){this.measureCtx===void 0&&(this.measureCtx=typeof document<`u`?document.createElement(`canvas`).getContext(`2d`):null);let n=this.measureCtx;return n?(n.font=t,n.measureText(e).width):e.length*7}emitViewportEvents(){let e=this.viewport.getState(),t=Math.max(0,Math.floor(e.visibleRange.from)),n=Math.max(t,Math.ceil(e.visibleRange.to));(!this.lastEmittedRange||this.lastEmittedRange.from!==t||this.lastEmittedRange.to!==n)&&(this.lastEmittedRange={from:t,to:n},this.eventBus.emit(`visibleRangeChange`,{from:t,to:n}));let{min:r,max:i}=e.priceRange;(!this.lastEmittedPriceRange||this.lastEmittedPriceRange.min!==r||this.lastEmittedPriceRange.max!==i)&&(this.lastEmittedPriceRange={min:r,max:i},this.eventBus.emit(`priceRangeChange`,{min:r,max:i})),this.lastEmittedBarWidth!==e.barWidth&&(this.lastEmittedBarWidth=e.barWidth,this.eventBus.emit(`zoomChange`,{barWidth:e.barWidth}))}getResolvedLayout(){return this.resolvedLayoutCache||(this.resolvedLayoutCache=this.layoutManager.resolve(),this.syncCrosshairBounds(this.resolvedLayoutCache)),this.resolvedLayoutCache}syncCrosshairBounds(e){let t=e.mainChartRect,n=t.y,r=t.y+t.height;for(let t of e.panels)t.config.position!==`top`&&t.config.position!==`bottom`||(n=Math.min(n,t.rect.y),r=Math.max(r,t.rect.y+t.rect.height));this.crosshairHandler.setReportBounds({top:n,bottom:r})}cachedContainerSize(){let e=Date.now();return(!this.containerSizeCache||e-this.containerSizeCacheTime>500)&&(this.containerSizeCache=this.engine.dprManager.getContainerSize(),this.containerSizeCacheTime=e),this.containerSizeCache}buildPanelRenderInfos(){if(this.panelInfoCache)return this.panelInfoCache;let e=this.getResolvedLayout(),t=this.viewport.getState(),{from:n,to:r}=t.visibleRange,i=e.panels.map(e=>{let i=d(this.indicatorEngine.getOutput(e.config.id),n,r),a={x:e.rect.x,y:e.rect.y+20,width:e.rect.width,height:Math.max(0,e.rect.height-20)};return{instanceId:e.config.id,rect:e.rect,viewport:{...t,chartRect:a,priceRange:i,logScale:!1,scaleMode:`regular`,invertScale:!1}}});return this.panelInfoCache=i,i}syncRenderContext(){this.pinnedTooltip.isPinned()&&this.pinnedTooltip.reposition(this.viewport.getState(),null,null,this.themeManager.getTheme());let e=this.getResolvedLayout(),t=this.features.indicators?this.buildPanelRenderInfos():[],n=e.panels.filter(e=>e.config.position===`bottom`).reduce((e,t)=>e+t.rect.height,0),r=e.mainChartRect.y+e.mainChartRect.height+n,i=this.getDisplayData();this.engine.setRenderContext({chartRenderer:this.chartRenderer,gridRenderer:this.features.grid?this.gridRenderer:null,priceAxis:this.features.priceAxis?this.priceAxis:null,timeAxis:this.features.timeAxis?this.timeAxis:null,crosshairHandler:this.features.crosshair?this.crosshairHandler:null,indicatorEngine:this.features.indicators?this.indicatorEngine:null,drawingRenderer:this.features.drawings?this.drawingRenderer:null,tradingRenderer:this.features.trading?this.tradingRenderer:null,currentPriceLine:this.currentPriceLine,chartLegend:this.features.legend?this.chartLegend:null,volumeRenderer:this.features.volume?this.volumeRenderer:null,volumeProfile:this.volumeProfile,marketProfile:this.marketProfile,depthHeatmap:this.depthHeatmap,periodLevels:this.periodLevels,pivotMarkers:this.pivotMarkers,watermark:this.features.watermark?this.watermark:null,barCountdown:this.barCountdown,sessionBreaks:this.sessionBreaks,sessionShading:this.sessionShading,compareRenderer:this.compareRenderer,alertManager:this.features.alerts?this.alertManager:null,measureOverlay:this.measureOverlay,selectionBoxOverlay:this.selectionBoxOverlay,signalMarkerManager:this.signalMarkerManager,tradeZoneManager:this.tradeZoneManager,panels:t,priceLimits:this.buildPriceLimits(),timeAxisY:r,viewport:{...this.viewport.getState(),data:i},theme:this.themeManager.getTheme(),data:i,numberLocale:this.numberLocale,paneTitles:this.paneTitles,renderOverlayPlugins:(e,t)=>this.drawOverlayPlugins(e,t)})}drawOverlayPlugins(e,t){let n=D(this.pluginManager.getOverlays(),t);if(n.length===0)return;let r={viewport:this.viewport.getState(),data:this.getDisplayData(),theme:this.themeManager.getTheme()};for(let t of n)t.render(e,r)}buildPriceLimits(){if(!this.marketConfig?.priceLimits?.enabled||!this.marketConfig.priceLimits.referencePrice)return null;let t=(0,e.computePriceLimits)(this.marketConfig.priceLimits.referencePrice,this.marketConfig);return t?{...t,colors:this.marketConfig.colorScheme?{ceiling:this.marketConfig.colorScheme.ceiling,floor:this.marketConfig.colorScheme.floor,reference:this.marketConfig.colorScheme.reference}:void 0}:null}},L=[`time`,`timestamp`,`date`,`datetime`,`t`],R=[`open`,`o`],z=[`high`,`h`],B=[`low`,`l`],V=[`close`,`c`],H=[`volume`,`vol`,`v`];function U(e){let t=e.trim();return t?t[0]===`[`||t[0]===`{`?W(t):G(t):{data:[],rowCount:0,skipped:0}}function W(e){let t;try{t=JSON.parse(e)}catch(e){throw Error(`Invalid JSON: ${e.message}`)}if(!Array.isArray(t))throw Error(`Expected a JSON array of OHLCV rows`);let n=[],r=0;for(let e of t){let t=Array.isArray(e)?ie(e):Y(e);t?n.push(t):r++}return Q(n,t.length,r)}function G(e){let t=e.split(/\r?\n/).filter(e=>e.trim().length>0);if(t.length===0)return{data:[],rowCount:0,skipped:0};let n=K(t[0]),r=q(t[0],n).map(e=>e.trim().toLowerCase()),i=r.some(e=>isNaN(Number(e))&&e.length>0),a=i?J(r):{time:0,open:1,high:2,low:3,close:4,volume:5};if(a.time<0||a.open<0||a.high<0||a.low<0||a.close<0)throw Error(`CSV is missing required column(s): time, open, high, low, close`);let o=[],s=0;for(let e=+!!i;e<t.length;e++){let r=q(t[e],n),i=Z(r[a.time]),c=X(r[a.open]),l=X(r[a.high]),u=X(r[a.low]),d=X(r[a.close]),f=a.volume>=0?Number(r[a.volume]):0;if(i===null||![c,l,u,d].every(Number.isFinite)){s++;continue}o.push({time:i,open:c,high:l,low:u,close:d,volume:Number.isFinite(f)?f:0})}return Q(o,t.length-+!!i,s)}function K(e){let t={",":0,";":0," ":0,"|":0};for(let n of e)n in t&&t[n]++;let n=`,`,r=0;for(let[e,i]of Object.entries(t))i>r&&(n=e,r=i);return n}function q(e,t){let n=[],r=``,i=!1;for(let a=0;a<e.length;a++){let o=e[a];o===`"`?i&&e[a+1]===`"`?(r+=`"`,a++):i=!i:o===t&&!i?(n.push(r),r=``):r+=o}return n.push(r),n}function J(e){let t=t=>e.findIndex(e=>t.includes(e));return{time:t(L),open:t(R),high:t(z),low:t(B),close:t(V),volume:t(H)}}function Y(e){let t=t=>{for(let n of t){if(e[n]!==void 0)return e[n];let t=n.toUpperCase();if(e[t]!==void 0)return e[t]}},n=Z(String(t(L)??``)),r=Number(t(R)),i=Number(t(z)),a=Number(t(B)),o=Number(t(V)),s=Number(t(H)??0);return n===null||![r,i,a,o].every(Number.isFinite)?null:{time:n,open:r,high:i,low:a,close:o,volume:Number.isFinite(s)?s:0}}function ie(e){if(e.length<5)return null;let t=Z(String(e[0])),n=Number(e[1]),r=Number(e[2]),i=Number(e[3]),a=Number(e[4]),o=e.length>=6?Number(e[5]):0;return t===null||![n,r,i,a].every(Number.isFinite)?null:{time:t,open:n,high:r,low:i,close:a,volume:Number.isFinite(o)?o:0}}function X(e){return e===void 0||e.trim()===``?NaN:Number(e)}function Z(e){let t=e.trim();if(!t)return null;let n=Number(t);if(Number.isFinite(n)&&n>0)return n<0xe8d4a51000?n*1e3:n;let r=Date.parse(t);return Number.isFinite(r)?r:null}function Q(e,t,n){e.sort((e,t)=>e.time-t.time);let r=[];for(let t of e)r.length>0&&r[r.length-1].time===t.time?r[r.length-1]=t:r.push(t);return{data:r,rowCount:t,skipped:n}}var ae=class{host;overlay=null;callbacks;bound;depth=0;constructor(e,t){this.host=e,this.callbacks=t,this.bound={dragenter:e=>this.onDragEnter(e),dragover:e=>this.onDragOver(e),dragleave:e=>this.onDragLeave(e),drop:e=>this.onDrop(e)}}attach(){this.host.addEventListener(`dragenter`,this.bound.dragenter),this.host.addEventListener(`dragover`,this.bound.dragover),this.host.addEventListener(`dragleave`,this.bound.dragleave),this.host.addEventListener(`drop`,this.bound.drop)}detach(){this.host.removeEventListener(`dragenter`,this.bound.dragenter),this.host.removeEventListener(`dragover`,this.bound.dragover),this.host.removeEventListener(`dragleave`,this.bound.dragleave),this.host.removeEventListener(`drop`,this.bound.drop),this.hideOverlay()}onDragEnter(e){$(e)&&(e.preventDefault(),this.depth++,this.showOverlay())}onDragOver(e){$(e)&&(e.preventDefault(),e.dataTransfer&&(e.dataTransfer.dropEffect=`copy`))}onDragLeave(e){$(e)&&(this.depth=Math.max(0,this.depth-1),this.depth===0&&this.hideOverlay())}async onDrop(e){e.preventDefault(),this.depth=0,this.hideOverlay();let t=e.dataTransfer?.files?.[0];if(t)try{let e=U(await t.text());if(e.data.length===0)throw Error(`No valid OHLCV rows found in "${t.name}"`);this.callbacks.onData(e.data,e,t)}catch(e){this.callbacks.onError?.(e,t)}}showOverlay(){this.overlay||(this.overlay=document.createElement(`div`),Object.assign(this.overlay.style,{position:`absolute`,inset:`8px`,zIndex:`90`,pointerEvents:`none`,borderRadius:`10px`,border:`2px dashed var(--tcw-accent, #f2a93b)`,background:`rgba(79, 136, 255, 0.06)`,display:`flex`,alignItems:`center`,justifyContent:`center`,color:`var(--tcw-accent, #f2a93b)`,fontSize:`14px`,fontWeight:`600`,letterSpacing:`-0.005em`,fontFamily:`inherit`,backdropFilter:`blur(2px)`}),this.overlay.textContent=`Drop CSV or JSON to load chart data`,getComputedStyle(this.host).position===`static`&&(this.host.style.position=`relative`),this.host.appendChild(this.overlay))}hideOverlay(){this.overlay?.remove(),this.overlay=null}};function $(e){return e.dataTransfer?.types?.includes(`Files`)??!1}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return U}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return ae}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return D}});
|
|
2
|
-
//# sourceMappingURL=DragDropImporter-C5kgfbET.cjs.map
|