@tradecanvas/chart 1.3.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/README.md +131 -49
- package/dist/Chart.d.ts +724 -18
- 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/PaneManager.d.ts.map +1 -1
- 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 +11 -4
- package/dist/charts/ChartTypeStrategy.d.ts.map +1 -1
- package/dist/grid/ChartGrid.d.ts +7 -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 +24 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +74 -89
- 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 +283 -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 +5 -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 +26 -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 +46 -0
- package/dist/widget/WidgetGoToDate.d.ts.map +1 -0
- package/dist/widget/WidgetHistoryPill.d.ts +23 -0
- package/dist/widget/WidgetHistoryPill.d.ts.map +1 -0
- package/dist/widget/WidgetHotkeySheet.d.ts +3 -1
- package/dist/widget/WidgetHotkeySheet.d.ts.map +1 -1
- package/dist/widget/WidgetIndicatorLegend.d.ts +98 -0
- package/dist/widget/WidgetIndicatorLegend.d.ts.map +1 -0
- 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/WidgetLoadingOverlay.d.ts.map +1 -1
- 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 +52 -7
- package/dist/widget/WidgetReplayBar.d.ts.map +1 -1
- package/dist/widget/WidgetSettings.d.ts +26 -2
- package/dist/widget/WidgetSettings.d.ts.map +1 -1
- package/dist/widget/WidgetStatusBar.d.ts +19 -1
- 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 +28 -5
- package/dist/widget/WidgetSymbolSearch.d.ts.map +1 -1
- package/dist/widget/WidgetToolbar.d.ts +42 -4
- package/dist/widget/WidgetToolbar.d.ts.map +1 -1
- package/dist/widget/WidgetTooltip.d.ts +43 -0
- package/dist/widget/WidgetTooltip.d.ts.map +1 -0
- 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/escapeHtml.d.ts +3 -0
- package/dist/widget/escapeHtml.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 -63
- package/dist/widget/i18n.d.ts.map +1 -1
- package/dist/widget/iconSet.d.ts +26 -0
- package/dist/widget/iconSet.d.ts.map +1 -0
- package/dist/widget/icons.d.ts +5 -0
- package/dist/widget/icons.d.ts.map +1 -1
- package/dist/widget/index.cjs +2145 -405
- package/dist/widget/index.cjs.map +1 -1
- package/dist/widget/index.d.ts +18 -1
- package/dist/widget/index.d.ts.map +1 -1
- package/dist/widget/index.js +7376 -1274
- 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 +19 -0
- package/dist/widget/legendValues.d.ts.map +1 -0
- 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 +215 -13
- package/dist/widget/types.d.ts.map +1 -1
- package/dist/widget/widgetConfig.d.ts +1 -5
- 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 +28 -0
- package/dist/widget/widgetTimeframes.d.ts.map +1 -0
- 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-BazeSQPD.cjs +0 -2
- package/dist/DragDropImporter-BazeSQPD.cjs.map +0 -1
- package/dist/DragDropImporter-cURSpfUb.js +0 -1883
- package/dist/DragDropImporter-cURSpfUb.js.map +0 -1
- package/dist/charts/IndicatorPriceRange.d.ts +0 -20
- package/dist/charts/IndicatorPriceRange.d.ts.map +0 -1
|
@@ -1,16 +1,66 @@
|
|
|
1
1
|
import { PanelPosition, PanelConfig, ResolvedLayout, Rect } from '@tradecanvas/commons';
|
|
2
|
+
/** What a folded pane keeps: its header, with the indicator's name and the pane's buttons. */
|
|
3
|
+
export declare const COLLAPSED_PANE_HEIGHT = 20;
|
|
4
|
+
/** The least the price pane keeps while a pane is maximised. */
|
|
5
|
+
export declare const MIN_MAIN_HEIGHT_WITH_MAXIMIZED = 48;
|
|
2
6
|
export declare class LayoutManager {
|
|
3
7
|
private panels;
|
|
4
8
|
private containerWidth;
|
|
5
9
|
private containerHeight;
|
|
6
10
|
private priceAxisWidth;
|
|
11
|
+
/** Width of the left price scale; 0 while it is hidden. */
|
|
12
|
+
private leftAxisWidth;
|
|
13
|
+
/** The pane that takes the room of the others (they fold to their headers), or null. */
|
|
14
|
+
private maximized;
|
|
7
15
|
resize(width: number, height: number): void;
|
|
8
16
|
addPanel(instanceId: string, position?: PanelPosition, size?: number): void;
|
|
17
|
+
/** Hand a pane to another indicator, keeping its place and size. */
|
|
18
|
+
renamePanel(fromId: string, toId: string): void;
|
|
9
19
|
removePanel(instanceId: string): void;
|
|
20
|
+
/**
|
|
21
|
+
* Fold a top or bottom pane to its header, or open it again. While a pane
|
|
22
|
+
* is maximised this puts the layout back to normal first (the other panes
|
|
23
|
+
* show folded then). False when nothing changed.
|
|
24
|
+
*/
|
|
25
|
+
setPanelCollapsed(instanceId: string, collapsed: boolean): boolean;
|
|
26
|
+
/** Folded as set (see `isPanelShownCollapsed` for how it shows). */
|
|
27
|
+
isPanelCollapsed(instanceId: string): boolean;
|
|
28
|
+
/** Shown folded: folded as set, or another pane is maximised. */
|
|
29
|
+
isPanelShownCollapsed(instanceId: string): boolean;
|
|
30
|
+
/** A pane's value scale: logarithmic, upside down, in percent. False when nothing changed. */
|
|
31
|
+
setPanelScale(instanceId: string, scale: {
|
|
32
|
+
log?: boolean;
|
|
33
|
+
invert?: boolean;
|
|
34
|
+
percent?: boolean;
|
|
35
|
+
}): boolean;
|
|
36
|
+
/** Whether `movePanel(instanceId, delta)` would move it. */
|
|
37
|
+
canMovePanel(instanceId: string, delta: -1 | 1): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Let one top or bottom pane take the room: the others fold to their
|
|
40
|
+
* headers and the price pane keeps a strip. `null` puts them back.
|
|
41
|
+
*/
|
|
42
|
+
setMaximizedPanel(instanceId: string | null): boolean;
|
|
43
|
+
getMaximizedPanel(): string | null;
|
|
44
|
+
/**
|
|
45
|
+
* Move a pane one place up (`-1`) or down (`1`) among the panes on its side
|
|
46
|
+
* of the price pane. False at the end of the line.
|
|
47
|
+
*/
|
|
48
|
+
movePanel(instanceId: string, delta: -1 | 1): boolean;
|
|
49
|
+
/** Put the panes on each side in the order of `ids` (others keep their place after them). */
|
|
50
|
+
orderPanels(ids: readonly string[]): void;
|
|
51
|
+
/** A pane's height (or width) on screen: folded, maximised or as set. */
|
|
52
|
+
private shownSize;
|
|
10
53
|
setPanelPosition(instanceId: string, position: PanelPosition): void;
|
|
54
|
+
/**
|
|
55
|
+
* Resize a pane; a folded pane opens, and a maximised layout goes back to
|
|
56
|
+
* normal. A height is kept within the room there is (a stored layout may ask
|
|
57
|
+
* for more).
|
|
58
|
+
*/
|
|
11
59
|
setPanelSize(instanceId: string, size: number): void;
|
|
12
60
|
/** Width reserved for the price axis right of the main chart. */
|
|
13
61
|
setPriceAxisWidth(width: number): void;
|
|
62
|
+
/** Width reserved left of the plot for the left price scale (0 = none). */
|
|
63
|
+
setLeftAxisWidth(width: number): void;
|
|
14
64
|
getPanels(): PanelConfig[];
|
|
15
65
|
resolve(): ResolvedLayout;
|
|
16
66
|
getMainChartRect(): Rect;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LayoutManager.d.ts","sourceRoot":"","sources":["../../src/layout/LayoutManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAA8B,IAAI,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"LayoutManager.d.ts","sourceRoot":"","sources":["../../src/layout/LayoutManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAA8B,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAKzH,8FAA8F;AAC9F,eAAO,MAAM,qBAAqB,KAAK,CAAC;AACxC,gEAAgE;AAChE,eAAO,MAAM,8BAA8B,KAAK,CAAC;AAIjD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,cAAc,CAAoB;IAC1C,2DAA2D;IAC3D,OAAO,CAAC,aAAa,CAAK;IAC1B,wFAAwF;IACxF,OAAO,CAAC,SAAS,CAAuB;IAExC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAK3C,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,GAAE,aAAwB,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAarF,oEAAoE;IACpE,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ/C,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAKrC;;;;OAIG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO;IASlE,oEAAoE;IACpE,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAI7C,iEAAiE;IACjE,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAMlD,8FAA8F;IAC9F,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE;QAAE,GAAG,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO;IAmBzG,4DAA4D;IAC5D,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO;IAOxD;;;OAGG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO;IASrD,iBAAiB,IAAI,MAAM,GAAG,IAAI;IAIlC;;;OAGG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO;IAgBrD,6FAA6F;IAC7F,WAAW,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI;IAQzC,yEAAyE;IACzE,OAAO,CAAC,SAAS;IAMjB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAkBnE;;;;OAIG;IACH,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAWpD,iEAAiE;IACjE,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAItC,2EAA2E;IAC3E,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIrC,SAAS,IAAI,WAAW,EAAE;IAI1B,OAAO,IAAI,cAAc;IAgGzB,gBAAgB,IAAI,IAAI;CAGzB"}
|
|
@@ -7,6 +7,8 @@ export interface PriceAxisWidthInput {
|
|
|
7
7
|
/** Decimals for the price tags (a market's `pricePrecision`), or null to follow the axis. */
|
|
8
8
|
tagPrecision: number | null;
|
|
9
9
|
locale: string;
|
|
10
|
+
/** The chart's price format, when it has one: labels and tags print with it. */
|
|
11
|
+
format?: ((price: number) => string) | null;
|
|
10
12
|
fontFamily: string;
|
|
11
13
|
fontSizeSmall: number;
|
|
12
14
|
measure: (text: string, font: string) => number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"priceAxisWidth.d.ts","sourceRoot":"","sources":["../../src/layout/priceAxisWidth.ts"],"names":[],"mappings":"AAUA,8FAA8F;AAC9F,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,6FAA6F;IAC7F,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACjD;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM,CAoBzE;AAED,uFAAuF;AACvF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAI5E"}
|
|
1
|
+
{"version":3,"file":"priceAxisWidth.d.ts","sourceRoot":"","sources":["../../src/layout/priceAxisWidth.ts"],"names":[],"mappings":"AAUA,8FAA8F;AAC9F,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,6FAA6F;IAC7F,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,gFAAgF;IAChF,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,IAAI,CAAC;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACjD;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM,CAoBzE;AAED,uFAAuF;AACvF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAI5E"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { SymbolInfo } from '@tradecanvas/commons';
|
|
2
|
+
/**
|
|
3
|
+
* Which bar times fall in `info`'s regular hours, for bars like `data`'s
|
|
4
|
+
* (by the time each bar opens). Null when there is nothing to leave out:
|
|
5
|
+
* the symbol has no hours or no zone, or the bars are a day or longer.
|
|
6
|
+
*/
|
|
7
|
+
export declare function regularHoursFilter(info: SymbolInfo | null, data: readonly {
|
|
8
|
+
time: number;
|
|
9
|
+
}[]): ((time: number) => boolean) | null;
|
|
10
|
+
//# sourceMappingURL=regularHours.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regularHours.d.ts","sourceRoot":"","sources":["../src/regularHours.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAQvD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,UAAU,GAAG,IAAI,EACvB,IAAI,EAAE,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,GAChC,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,IAAI,CAiBpC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { LayoutStorage, SavedLayout, SavedLayoutSummary } from './layoutStorage.js';
|
|
2
|
+
/** The longest a layout's name may be. */
|
|
3
|
+
export declare const MAX_LAYOUT_NAME = 80;
|
|
4
|
+
/** A layout name trimmed, with runs of spaces folded and capped in length; `null` when nothing is left. */
|
|
5
|
+
export declare function cleanLayoutName(name: string): string | null;
|
|
6
|
+
/** What a session saves and opens: the widget, or a grid of widgets. */
|
|
7
|
+
export interface LayoutSessionHost {
|
|
8
|
+
/** What to save now, with the symbol and interval a list shows. */
|
|
9
|
+
capture(): {
|
|
10
|
+
content: string;
|
|
11
|
+
symbol?: string;
|
|
12
|
+
timeframe?: string;
|
|
13
|
+
};
|
|
14
|
+
/** Show a saved layout; throw when its content can't be shown. */
|
|
15
|
+
apply(layout: SavedLayout): Promise<void> | void;
|
|
16
|
+
}
|
|
17
|
+
export interface LayoutSessionOptions {
|
|
18
|
+
/** Save the current layout by itself once changes settle. Default `true`. */
|
|
19
|
+
autoSave?: boolean;
|
|
20
|
+
/** How long changes must settle before an auto-save. Default 1500 ms. */
|
|
21
|
+
debounceMs?: number;
|
|
22
|
+
/**
|
|
23
|
+
* What this session saves (`'chart'`, the default, or `'grid'`): it lists
|
|
24
|
+
* and opens only layouts of its kind, so both can share one storage.
|
|
25
|
+
*/
|
|
26
|
+
kind?: string;
|
|
27
|
+
/** The current layout, its saved state or the auto-save switch changed. */
|
|
28
|
+
onChange?: () => void;
|
|
29
|
+
/** An auto-save failed (a full storage, a server down). */
|
|
30
|
+
onError?: (error: unknown) => void;
|
|
31
|
+
now?: () => number;
|
|
32
|
+
newId?: () => string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Named layouts over a {@link LayoutStorage}: the one showing now, save it,
|
|
36
|
+
* save it under a new name, open, rename and remove. Changes reported with
|
|
37
|
+
* `changed()` are auto-saved into the current layout once they settle, and
|
|
38
|
+
* only when what would be saved differs from what was.
|
|
39
|
+
*
|
|
40
|
+
* Every operation runs in turn, and reads the current layout and captures
|
|
41
|
+
* the chart when its turn comes: a save never lands in a layout opened after
|
|
42
|
+
* it was asked for, and never holds a half-opened chart. What storage hands
|
|
43
|
+
* back is checked before it is used.
|
|
44
|
+
*/
|
|
45
|
+
export declare class LayoutSession {
|
|
46
|
+
private readonly storage;
|
|
47
|
+
private readonly host;
|
|
48
|
+
private readonly options;
|
|
49
|
+
private currentLayout;
|
|
50
|
+
/** What the current layout holds in storage (as captured), to tell a real change. */
|
|
51
|
+
private savedContent;
|
|
52
|
+
private dirty;
|
|
53
|
+
private autoSave;
|
|
54
|
+
private readonly debounceMs;
|
|
55
|
+
private readonly kind;
|
|
56
|
+
private timer;
|
|
57
|
+
private applying;
|
|
58
|
+
/** Operations waiting or running; a change while one runs is looked at after. */
|
|
59
|
+
private busy;
|
|
60
|
+
private changedWhileBusy;
|
|
61
|
+
private tail;
|
|
62
|
+
private destroyed;
|
|
63
|
+
private readonly now;
|
|
64
|
+
private readonly newId;
|
|
65
|
+
constructor(storage: LayoutStorage, host: LayoutSessionHost, options?: LayoutSessionOptions);
|
|
66
|
+
/** The layout showing now, or `null` before one is saved or opened. */
|
|
67
|
+
current(): SavedLayoutSummary | null;
|
|
68
|
+
/** The chart differs from the current layout as saved (auto-save off, failed, or not yet run). */
|
|
69
|
+
isDirty(): boolean;
|
|
70
|
+
isAutoSave(): boolean;
|
|
71
|
+
setAutoSave(on: boolean): void;
|
|
72
|
+
/** Every saved layout of this session's kind, newest first; entries that aren't layouts are left out. */
|
|
73
|
+
list(): Promise<SavedLayoutSummary[]>;
|
|
74
|
+
/** Save into the current layout; `null` when there is none yet (ask for a name, then `saveAs`). */
|
|
75
|
+
save(): Promise<SavedLayoutSummary | null>;
|
|
76
|
+
/** Save as a new layout called `name`, and make it the current one. */
|
|
77
|
+
saveAs(name: string): Promise<SavedLayoutSummary>;
|
|
78
|
+
/**
|
|
79
|
+
* Show a saved layout. `false` when there is no such layout (or it isn't
|
|
80
|
+
* one of this kind); rejects when it could not be shown, and then no layout
|
|
81
|
+
* is current (the chart may be part way).
|
|
82
|
+
*/
|
|
83
|
+
open(id: string): Promise<boolean>;
|
|
84
|
+
rename(id: string, name: string): Promise<void>;
|
|
85
|
+
remove(id: string): Promise<void>;
|
|
86
|
+
/** Something a layout holds may have changed: check once things settle, and auto-save. */
|
|
87
|
+
changed(): void;
|
|
88
|
+
/** Stop. A change still waiting to be auto-saved is saved now. */
|
|
89
|
+
destroy(): void;
|
|
90
|
+
/** The changes have settled: save them into the current layout, or mark it changed. */
|
|
91
|
+
private settle;
|
|
92
|
+
/** Store the chart as layout `id` and make it the current one (runs inside the queue). */
|
|
93
|
+
private write;
|
|
94
|
+
/** No layout is current any more. */
|
|
95
|
+
private forget;
|
|
96
|
+
/** Run operations one after another; a failed one does not stop the next. */
|
|
97
|
+
private queue;
|
|
98
|
+
private cancelTimer;
|
|
99
|
+
private notify;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=LayoutSession.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LayoutSession.d.ts","sourceRoot":"","sources":["../../src/state/LayoutSession.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/** A saved layout as a list shows it. */
|
|
2
|
+
export interface SavedLayoutSummary {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
/** The symbol it opens on. */
|
|
6
|
+
symbol?: string;
|
|
7
|
+
/** The interval it opens on. */
|
|
8
|
+
timeframe?: string;
|
|
9
|
+
/** When it was last saved, in ms since the epoch. */
|
|
10
|
+
updatedAt: number;
|
|
11
|
+
/** What saved it: `'chart'` (a widget, the default) or `'grid'` (a grid of charts). */
|
|
12
|
+
kind?: string;
|
|
13
|
+
}
|
|
14
|
+
/** A saved layout: its summary and what it holds, as the widget wrote it (JSON). */
|
|
15
|
+
export interface SavedLayout extends SavedLayoutSummary {
|
|
16
|
+
content: string;
|
|
17
|
+
}
|
|
18
|
+
type MaybePromise<T> = T | Promise<T>;
|
|
19
|
+
/**
|
|
20
|
+
* Where named layouts live. The widget ships one for `localStorage` and one in
|
|
21
|
+
* memory; a host keeps layouts on its server by implementing these four calls
|
|
22
|
+
* (each may return a promise).
|
|
23
|
+
*/
|
|
24
|
+
export interface LayoutStorage {
|
|
25
|
+
/** Every layout, newest first. */
|
|
26
|
+
list(): MaybePromise<SavedLayoutSummary[]>;
|
|
27
|
+
/** One layout, or `null` when there is no such layout. */
|
|
28
|
+
load(id: string): MaybePromise<SavedLayout | null>;
|
|
29
|
+
/** Save a layout, replacing one with the same id. */
|
|
30
|
+
save(layout: SavedLayout): MaybePromise<void>;
|
|
31
|
+
remove(id: string): MaybePromise<void>;
|
|
32
|
+
}
|
|
33
|
+
/** A summary read back from storage (or a host's server), or null when it is not one. */
|
|
34
|
+
export declare function readLayoutSummary(value: unknown): SavedLayoutSummary | null;
|
|
35
|
+
/** A whole layout read back from storage, or null when it is not one. */
|
|
36
|
+
export declare function readSavedLayout(value: unknown): SavedLayout | null;
|
|
37
|
+
/** Layouts kept in memory: for tests, or a page that does not keep them. */
|
|
38
|
+
export declare function memoryLayouts(initial?: readonly SavedLayout[]): LayoutStorage;
|
|
39
|
+
/**
|
|
40
|
+
* Layouts in the browser's `localStorage`: an index of summaries under
|
|
41
|
+
* `<prefix>index` and each layout's content under `<prefix>item:<id>`.
|
|
42
|
+
* Entries it cannot read are skipped.
|
|
43
|
+
*/
|
|
44
|
+
export declare function localStorageLayouts(prefix?: string): LayoutStorage;
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=layoutStorage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layoutStorage.d.ts","sourceRoot":"","sources":["../../src/state/layoutStorage.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,uFAAuF;IACvF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,oFAAoF;AACpF,MAAM,WAAW,WAAY,SAAQ,kBAAkB;IACrD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAEtC;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,kCAAkC;IAClC,IAAI,IAAI,YAAY,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAC3C,0DAA0D;IAC1D,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACnD,qDAAqD;IACrD,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;CACxC;AAYD,yFAAyF;AACzF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,GAAG,IAAI,CAY3E;AAED,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAIlE;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,OAAO,GAAE,SAAS,WAAW,EAAO,GAAG,aAAa,CAejF;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,SAAiB,GAAG,aAAa,CAiC1E"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { ExecutionAdapter, ExecutionError, TradingOrder, TradingPosition } from '@tradecanvas/commons';
|
|
2
|
-
/** The
|
|
3
|
-
export type ExecutionIntentType = 'orderPlace' | 'orderModify' | 'orderCancel' | 'positionModify' | 'positionClose';
|
|
1
|
+
import { ExecutionAdapter, ExecutionError, TradingOrder, TradingPosition, FillEvent } from '@tradecanvas/commons';
|
|
2
|
+
/** The order/position intents the chart emits and an adapter consumes. */
|
|
3
|
+
export type ExecutionIntentType = 'orderPlace' | 'orderModify' | 'orderCancel' | 'positionModify' | 'positionClose' | 'positionReverse';
|
|
4
4
|
/**
|
|
5
5
|
* Surface the host (the Chart) provides so execution can be bridged without
|
|
6
6
|
* the helper knowing anything about chart internals — which keeps it pure and
|
|
@@ -15,6 +15,10 @@ export interface ExecutionHost {
|
|
|
15
15
|
setPositions(positions: TradingPosition[]): void;
|
|
16
16
|
/** Surface an execution failure (adapter-reported or a failed command). */
|
|
17
17
|
onError(error: ExecutionError): void;
|
|
18
|
+
/** An order filled or a position closed (the adapter's `fill`). */
|
|
19
|
+
onFill?(fill: FillEvent): void;
|
|
20
|
+
/** The positions on the chart, until the adapter reports its own. */
|
|
21
|
+
getPositions?(): readonly TradingPosition[];
|
|
18
22
|
}
|
|
19
23
|
/**
|
|
20
24
|
* Bridge an `ExecutionAdapter` to a host: render the adapter's authoritative
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wireExecution.d.ts","sourceRoot":"","sources":["../../src/trading/wireExecution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAEhB,cAAc,EACd,YAAY,EACZ,eAAe,
|
|
1
|
+
{"version":3,"file":"wireExecution.d.ts","sourceRoot":"","sources":["../../src/trading/wireExecution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAEhB,cAAc,EACd,YAAY,EACZ,eAAe,EAOf,SAAS,EACV,MAAM,sBAAsB,CAAC;AAE9B,0EAA0E;AAC1E,MAAM,MAAM,mBAAmB,GAC3B,YAAY,GACZ,aAAa,GACb,aAAa,GACb,gBAAgB,GAChB,eAAe,GACf,iBAAiB,CAAC;AAEtB;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,uEAAuE;IACvE,QAAQ,CAAC,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACrF,yDAAyD;IACzD,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IACxC,yDAAyD;IACzD,YAAY,CAAC,SAAS,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;IACjD,2EAA2E;IAC3E,OAAO,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;IACrC,mEAAmE;IACnE,MAAM,CAAC,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;IAC/B,qEAAqE;IACrE,YAAY,CAAC,IAAI,SAAS,eAAe,EAAE,CAAC;CAC7C;AAsDD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,IAAI,CA6CxF"}
|