@tradecanvas/chart 1.71.0 → 1.72.1
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/dist/LayoutSession-DO4bYkUi.cjs +2 -0
- package/dist/LayoutSession-DO4bYkUi.cjs.map +1 -0
- package/dist/{LayoutSession-BOQCN6yY.js → LayoutSession-qRYG8GTD.js} +539 -552
- package/dist/LayoutSession-qRYG8GTD.js.map +1 -0
- package/dist/WidgetCommandPalette-CeCLHPy1.js +177 -0
- package/dist/WidgetCommandPalette-CeCLHPy1.js.map +1 -0
- package/dist/WidgetCommandPalette-ZZNbWwCZ.cjs +2 -0
- package/dist/WidgetCommandPalette-ZZNbWwCZ.cjs.map +1 -0
- package/dist/WidgetDrawingSettings-BeW8fX7r.js +474 -0
- package/dist/WidgetDrawingSettings-BeW8fX7r.js.map +1 -0
- package/dist/WidgetDrawingSettings-Cyl2u_u8.cjs +2 -0
- package/dist/WidgetDrawingSettings-Cyl2u_u8.cjs.map +1 -0
- package/dist/WidgetGoToDate-BNdngHlg.cjs +2 -0
- package/dist/WidgetGoToDate-BNdngHlg.cjs.map +1 -0
- package/dist/WidgetGoToDate-hcDtezRm.js +191 -0
- package/dist/WidgetGoToDate-hcDtezRm.js.map +1 -0
- package/dist/WidgetHotkeySheet-1lRFSdvt.js +416 -0
- package/dist/WidgetHotkeySheet-1lRFSdvt.js.map +1 -0
- package/dist/WidgetHotkeySheet-y5LWKSG6.cjs +2 -0
- package/dist/WidgetHotkeySheet-y5LWKSG6.cjs.map +1 -0
- package/dist/WidgetIndicatorPicker-CGvZ5kYd.js +245 -0
- package/dist/WidgetIndicatorPicker-CGvZ5kYd.js.map +1 -0
- package/dist/WidgetIndicatorPicker-DuKJFPRC.cjs +2 -0
- package/dist/WidgetIndicatorPicker-DuKJFPRC.cjs.map +1 -0
- package/dist/WidgetIndicatorSettings-C7vpco6e.cjs +2 -0
- package/dist/WidgetIndicatorSettings-C7vpco6e.cjs.map +1 -0
- package/dist/WidgetIndicatorSettings-dDkqzzYo.js +326 -0
- package/dist/WidgetIndicatorSettings-dDkqzzYo.js.map +1 -0
- package/dist/WidgetSettings-D7Pq42zW.cjs +2 -0
- package/dist/WidgetSettings-D7Pq42zW.cjs.map +1 -0
- package/dist/WidgetSettings-eOo93L7Z.js +546 -0
- package/dist/WidgetSettings-eOo93L7Z.js.map +1 -0
- package/dist/WidgetSymbolSearch-C4OR42nZ.cjs +2 -0
- package/dist/WidgetSymbolSearch-C4OR42nZ.cjs.map +1 -0
- package/dist/WidgetSymbolSearch-CvPpjIwa.js +580 -0
- package/dist/WidgetSymbolSearch-CvPpjIwa.js.map +1 -0
- package/dist/focusTrap-Br9Zfje0.js +27 -0
- package/dist/focusTrap-Br9Zfje0.js.map +1 -0
- package/dist/focusTrap-DrhhmG0V.cjs +2 -0
- package/dist/focusTrap-DrhhmG0V.cjs.map +1 -0
- package/dist/i18n-C2nQBZTY.cjs +2 -0
- package/dist/i18n-C2nQBZTY.cjs.map +1 -0
- package/dist/{i18n-DUmd4Z_r.js → i18n-C5v6Tzp1.js} +3 -1
- package/dist/i18n-C5v6Tzp1.js.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/indicatorInputWords-Bd9Pt6qp.js +25 -0
- package/dist/indicatorInputWords-Bd9Pt6qp.js.map +1 -0
- package/dist/indicatorInputWords-CTA4IcJR.cjs +2 -0
- package/dist/indicatorInputWords-CTA4IcJR.cjs.map +1 -0
- package/dist/indicatorLabel-BNZvaOcl.cjs +2 -0
- package/dist/indicatorLabel-BNZvaOcl.cjs.map +1 -0
- package/dist/indicatorLabel-Sbegyhp2.js +17 -0
- package/dist/indicatorLabel-Sbegyhp2.js.map +1 -0
- package/dist/indicatorSettingsTabs-B0liE3ST.cjs +2 -0
- package/dist/indicatorSettingsTabs-B0liE3ST.cjs.map +1 -0
- package/dist/indicatorSettingsTabs-XcgMdbLp.js +161 -0
- package/dist/indicatorSettingsTabs-XcgMdbLp.js.map +1 -0
- package/dist/monthView-B-CieFDJ.cjs +2 -0
- package/dist/monthView-B-CieFDJ.cjs.map +1 -0
- package/dist/monthView-N8yDaTqZ.js +198 -0
- package/dist/monthView-N8yDaTqZ.js.map +1 -0
- package/dist/platformKeys-B82-j1Fs.cjs +2 -0
- package/dist/platformKeys-B82-j1Fs.cjs.map +1 -0
- package/dist/platformKeys-Dd1qOCjF.js +5 -0
- package/dist/platformKeys-Dd1qOCjF.js.map +1 -0
- package/dist/settingsControls-DIjzCFHI.js +379 -0
- package/dist/settingsControls-DIjzCFHI.js.map +1 -0
- package/dist/settingsControls-Tn8_vJJv.cjs +2 -0
- package/dist/settingsControls-Tn8_vJJv.cjs.map +1 -0
- package/dist/symbolCatalog-CA1fpz3s.js +90 -0
- package/dist/symbolCatalog-CA1fpz3s.js.map +1 -0
- package/dist/symbolCatalog-Dx1YnZgm.cjs +2 -0
- package/dist/symbolCatalog-Dx1YnZgm.cjs.map +1 -0
- package/dist/widget/ChartWidget.d.ts +102 -582
- package/dist/widget/ChartWidget.d.ts.map +1 -1
- package/dist/widget/WidgetAlerts.d.ts +35 -0
- package/dist/widget/WidgetAlerts.d.ts.map +1 -0
- package/dist/widget/WidgetChartSettings.d.ts +194 -0
- package/dist/widget/WidgetChartSettings.d.ts.map +1 -0
- package/dist/widget/WidgetCommands.d.ts +54 -0
- package/dist/widget/WidgetCommands.d.ts.map +1 -0
- package/dist/widget/WidgetCompares.d.ts +140 -0
- package/dist/widget/WidgetCompares.d.ts.map +1 -0
- package/dist/widget/WidgetDockArea.d.ts +89 -0
- package/dist/widget/WidgetDockArea.d.ts.map +1 -0
- package/dist/widget/WidgetDrawingEdit.d.ts +73 -0
- package/dist/widget/WidgetDrawingEdit.d.ts.map +1 -0
- package/dist/widget/WidgetGoToDate.d.ts +1 -14
- package/dist/widget/WidgetGoToDate.d.ts.map +1 -1
- package/dist/widget/WidgetIndicatorSettings.d.ts.map +1 -1
- package/dist/widget/WidgetIntervals.d.ts +66 -0
- package/dist/widget/WidgetIntervals.d.ts.map +1 -0
- package/dist/widget/WidgetLayouts.d.ts +85 -0
- package/dist/widget/WidgetLayouts.d.ts.map +1 -0
- package/dist/widget/WidgetLegendView.d.ts +54 -0
- package/dist/widget/WidgetLegendView.d.ts.map +1 -0
- package/dist/widget/WidgetMenus.d.ts +79 -0
- package/dist/widget/WidgetMenus.d.ts.map +1 -0
- package/dist/widget/WidgetReplay.d.ts +199 -0
- package/dist/widget/WidgetReplay.d.ts.map +1 -0
- package/dist/widget/WidgetTrading.d.ts +48 -0
- package/dist/widget/WidgetTrading.d.ts.map +1 -0
- package/dist/widget/WidgetWatchlists.d.ts +77 -0
- package/dist/widget/WidgetWatchlists.d.ts.map +1 -0
- package/dist/widget/drawingSettingsTabs.d.ts +2 -19
- package/dist/widget/drawingSettingsTabs.d.ts.map +1 -1
- package/dist/widget/drawingText.d.ts +24 -0
- package/dist/widget/drawingText.d.ts.map +1 -0
- package/dist/widget/index.cjs +22 -23
- package/dist/widget/index.cjs.map +1 -1
- package/dist/widget/index.js +6193 -9868
- package/dist/widget/index.js.map +1 -1
- package/dist/widget/keyTarget.d.ts +4 -0
- package/dist/widget/keyTarget.d.ts.map +1 -1
- package/dist/widget/lazyPart.d.ts +47 -0
- package/dist/widget/lazyPart.d.ts.map +1 -0
- package/dist/widget/locales/ar.d.ts.map +1 -1
- package/dist/widget/locales/cs.d.ts.map +1 -1
- package/dist/widget/locales/da.d.ts.map +1 -1
- package/dist/widget/locales/de.d.ts.map +1 -1
- package/dist/widget/locales/el.d.ts.map +1 -1
- package/dist/widget/locales/en.d.ts +1 -0
- package/dist/widget/locales/en.d.ts.map +1 -1
- package/dist/widget/locales/es.d.ts.map +1 -1
- package/dist/widget/locales/et.d.ts.map +1 -1
- package/dist/widget/locales/fa.d.ts.map +1 -1
- package/dist/widget/locales/fr.d.ts.map +1 -1
- package/dist/widget/locales/he.d.ts.map +1 -1
- package/dist/widget/locales/hu.d.ts.map +1 -1
- package/dist/widget/locales/id.d.ts.map +1 -1
- package/dist/widget/locales/index.cjs +1 -1
- package/dist/widget/locales/index.cjs.map +1 -1
- package/dist/widget/locales/index.js +29 -1
- package/dist/widget/locales/index.js.map +1 -1
- package/dist/widget/locales/it.d.ts.map +1 -1
- package/dist/widget/locales/ja.d.ts.map +1 -1
- package/dist/widget/locales/ko.d.ts.map +1 -1
- package/dist/widget/locales/ms.d.ts.map +1 -1
- package/dist/widget/locales/nb.d.ts.map +1 -1
- package/dist/widget/locales/nl.d.ts.map +1 -1
- package/dist/widget/locales/pl.d.ts.map +1 -1
- package/dist/widget/locales/pt.d.ts.map +1 -1
- package/dist/widget/locales/ro.d.ts.map +1 -1
- package/dist/widget/locales/ru.d.ts.map +1 -1
- package/dist/widget/locales/sk.d.ts.map +1 -1
- package/dist/widget/locales/sv.d.ts.map +1 -1
- package/dist/widget/locales/th.d.ts.map +1 -1
- package/dist/widget/locales/tr.d.ts.map +1 -1
- package/dist/widget/locales/vi.d.ts.map +1 -1
- package/dist/widget/locales/zh.d.ts.map +1 -1
- package/dist/widget/locales/zhHant.d.ts.map +1 -1
- package/dist/widget/pageEnv.d.ts +5 -0
- package/dist/widget/pageEnv.d.ts.map +1 -0
- package/dist/widget/signals.d.ts +41 -0
- package/dist/widget/signals.d.ts.map +1 -0
- package/dist/widget/wallTime.d.ts +15 -0
- package/dist/widget/wallTime.d.ts.map +1 -0
- package/dist/widget/widgetDialogs.d.ts +17 -0
- package/dist/widget/widgetDialogs.d.ts.map +1 -0
- package/dist/widgetFeatures-BM6u0u74.js +186 -0
- package/dist/widgetFeatures-BM6u0u74.js.map +1 -0
- package/dist/widgetFeatures-BZ8OVPN2.cjs +3 -0
- package/dist/widgetFeatures-BZ8OVPN2.cjs.map +1 -0
- package/dist/widgetLocales-BPK5i0Ok.cjs +2 -0
- package/dist/widgetLocales-BPK5i0Ok.cjs.map +1 -0
- package/dist/widgetLocales-DgTR8JSu.js +838 -0
- package/dist/widgetLocales-DgTR8JSu.js.map +1 -0
- package/package.json +3 -3
- package/dist/LayoutSession-BOQCN6yY.js.map +0 -1
- package/dist/LayoutSession-RF8OqOXy.cjs +0 -2
- package/dist/LayoutSession-RF8OqOXy.cjs.map +0 -1
- package/dist/i18n-BsstZ9md.cjs +0 -2
- package/dist/i18n-BsstZ9md.cjs.map +0 -1
- package/dist/i18n-DUmd4Z_r.js.map +0 -1
|
@@ -0,0 +1,546 @@
|
|
|
1
|
+
import { a as e, c as t, d as n, f as r, i, m as a, o, p as s, r as c, s as l, t as u, u as d, y as f } from "./widgetLocales-DgTR8JSu.js";
|
|
2
|
+
import { i as p, n as m, r as h, t as g } from "./focusTrap-Br9Zfje0.js";
|
|
3
|
+
import { f as _, l as v } from "./settingsControls-DIjzCFHI.js";
|
|
4
|
+
import { r as y } from "./i18n-C5v6Tzp1.js";
|
|
5
|
+
import { CHART_STYLE_KEYS as b } from "@tradecanvas/commons";
|
|
6
|
+
//#region src/widget/settingsRows.ts
|
|
7
|
+
var x = 0, S = 0, C = 20;
|
|
8
|
+
function w(e) {
|
|
9
|
+
let t = document.createElement("div");
|
|
10
|
+
if (t.className = "tcw-settings-section", e) {
|
|
11
|
+
let n = document.createElement("div");
|
|
12
|
+
n.className = "tcw-settings-section-title", n.textContent = e, t.appendChild(n), t.setAttribute("role", "group"), t.setAttribute("aria-label", e);
|
|
13
|
+
}
|
|
14
|
+
return t;
|
|
15
|
+
}
|
|
16
|
+
function T(e) {
|
|
17
|
+
let t = document.createElement("div");
|
|
18
|
+
t.className = "tcw-settings-row";
|
|
19
|
+
let n = document.createElement("span");
|
|
20
|
+
return n.className = "tcw-settings-label", n.textContent = e, t.appendChild(n), t;
|
|
21
|
+
}
|
|
22
|
+
function E(e, t, n, r, i) {
|
|
23
|
+
let a = T(e), o = document.createElement("div");
|
|
24
|
+
o.className = "tcw-color-picker-wrap";
|
|
25
|
+
let s = document.createElement("input");
|
|
26
|
+
s.type = "color", s.setAttribute("aria-label", e);
|
|
27
|
+
let c = document.createElement("span");
|
|
28
|
+
c.className = "tcw-color-hex", c.id = `tcw-color-${++x}`, s.setAttribute("aria-describedby", c.id);
|
|
29
|
+
let l = null, u = (t) => {
|
|
30
|
+
s.value = v(t ?? r.start?.()), c.textContent = t ?? i("settings.auto"), a.classList.toggle("tcw-color-auto", t === null), t !== null && r.start && !l ? (l = document.createElement("button"), l.type = "button", l.className = "tcw-color-auto-btn", l.textContent = i("settings.auto"), l.setAttribute("aria-label", `${e}: ${i("settings.auto")}`), l.addEventListener("click", () => {
|
|
31
|
+
n(null), s.focus(), u(r.read());
|
|
32
|
+
}), o.appendChild(l)) : t === null && l && (l.remove(), l = null);
|
|
33
|
+
};
|
|
34
|
+
return s.addEventListener("input", () => {
|
|
35
|
+
n(s.value), u(s.value);
|
|
36
|
+
}), o.append(s, c), a.appendChild(o), u(t), {
|
|
37
|
+
row: a,
|
|
38
|
+
sync: () => u(r.read())
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function D(e, t, n) {
|
|
42
|
+
let r = T(e), i = document.createElement("button");
|
|
43
|
+
return i.type = "button", i.className = `tcw-toggle${t ? " tcw-on" : ""}`, i.setAttribute("role", "switch"), i.setAttribute("aria-checked", String(t)), i.setAttribute("aria-label", e), i.addEventListener("click", () => {
|
|
44
|
+
let e = !i.classList.contains("tcw-on");
|
|
45
|
+
i.classList.toggle("tcw-on", e), i.setAttribute("aria-checked", String(e)), n(e);
|
|
46
|
+
}), r.appendChild(i), r;
|
|
47
|
+
}
|
|
48
|
+
function O(e, t, n, r) {
|
|
49
|
+
let i = T(e), a = document.createElement("select");
|
|
50
|
+
a.className = "tcw-settings-select", a.setAttribute("aria-label", e);
|
|
51
|
+
for (let e of n) {
|
|
52
|
+
let n = document.createElement("option");
|
|
53
|
+
n.value = e.value, n.textContent = e.label, e.value === t && (n.selected = !0), a.appendChild(n);
|
|
54
|
+
}
|
|
55
|
+
return n.some((e) => e.value === t) || (a.selectedIndex = -1), a.addEventListener("change", () => r(a.value)), i.appendChild(a), i;
|
|
56
|
+
}
|
|
57
|
+
function k(e, t, n, r, i = (e) => String(e)) {
|
|
58
|
+
let a = T(e), o = document.createElement("div");
|
|
59
|
+
o.className = "tcw-settings-range";
|
|
60
|
+
let s = document.createElement("input");
|
|
61
|
+
s.type = "range", s.min = String(n.min), s.max = String(n.max), s.step = String(n.step), s.value = String(t), s.setAttribute("aria-label", e);
|
|
62
|
+
let c = document.createElement("span");
|
|
63
|
+
return c.className = "tcw-settings-range-val", c.textContent = i(t), s.addEventListener("input", () => {
|
|
64
|
+
let e = Number(s.value);
|
|
65
|
+
c.textContent = i(e), r(e);
|
|
66
|
+
}), o.append(s, c), a.appendChild(o), a;
|
|
67
|
+
}
|
|
68
|
+
function A(e, t, n) {
|
|
69
|
+
let r = new Intl.NumberFormat(n, { maximumFractionDigits: C }).format;
|
|
70
|
+
return e.step === "1" && Number.isFinite(e.max) ? y(t("settings.numberWhole"), {
|
|
71
|
+
min: r(Math.max(1, e.min ?? 1)),
|
|
72
|
+
max: r(e.max)
|
|
73
|
+
}) : y(t("settings.numberAtLeast"), { min: r(e.min ?? 0) });
|
|
74
|
+
}
|
|
75
|
+
function j(e, t, n, r, i, a = "en-US") {
|
|
76
|
+
let o = document.createElement("div");
|
|
77
|
+
o.className = "tcw-settings-row tcw-settings-row--number";
|
|
78
|
+
let s = document.createElement("label");
|
|
79
|
+
s.className = "tcw-settings-label", s.textContent = e, o.appendChild(s);
|
|
80
|
+
let c = document.createElement("input");
|
|
81
|
+
c.type = "number", c.className = "tcw-settings-number", c.min = "0", c.step = n.step, Number.isFinite(n.max) && (c.max = String(n.max)), c.placeholder = i("settings.auto"), c.value = t === null ? "" : String(t), c.setAttribute("aria-label", e);
|
|
82
|
+
let l = document.createElement("div");
|
|
83
|
+
l.className = "tcw-settings-hint", l.id = `tcw-number-hint-${++S}`, l.setAttribute("role", "status"), c.setAttribute("aria-describedby", l.id);
|
|
84
|
+
let u = (e) => {
|
|
85
|
+
e ? c.removeAttribute("aria-invalid") : c.setAttribute("aria-invalid", "true"), l.textContent = e ? "" : A(n, i, a);
|
|
86
|
+
};
|
|
87
|
+
return c.addEventListener("change", () => {
|
|
88
|
+
if (c.value.trim() === "") {
|
|
89
|
+
u(!0), r(null);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
let e = Number(c.value), t = Number.isFinite(e) && e > 0 && e >= (n.min ?? 0) && e <= n.max && (n.step !== "1" || Number.isInteger(e));
|
|
93
|
+
u(t), t && r(e);
|
|
94
|
+
}), o.append(c, l), o;
|
|
95
|
+
}
|
|
96
|
+
//#endregion
|
|
97
|
+
//#region src/widget/WidgetSettings.ts
|
|
98
|
+
var M = [
|
|
99
|
+
{
|
|
100
|
+
id: "symbol",
|
|
101
|
+
icon: "chartType:candlestick"
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
id: "statusLine",
|
|
105
|
+
icon: "type"
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
id: "scales",
|
|
109
|
+
icon: "ruler"
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
id: "appearance",
|
|
113
|
+
icon: "palette"
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
id: "layers",
|
|
117
|
+
icon: "layers"
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
id: "trading",
|
|
121
|
+
icon: "trendingUp"
|
|
122
|
+
}
|
|
123
|
+
], N = [
|
|
124
|
+
1,
|
|
125
|
+
2,
|
|
126
|
+
3,
|
|
127
|
+
4
|
|
128
|
+
], P = "t:", F = {
|
|
129
|
+
step: "any",
|
|
130
|
+
max: Infinity,
|
|
131
|
+
min: 1e-8
|
|
132
|
+
}, I = 1, L = class {
|
|
133
|
+
callbacks;
|
|
134
|
+
t;
|
|
135
|
+
backdrop = null;
|
|
136
|
+
modal = null;
|
|
137
|
+
bodyEl = null;
|
|
138
|
+
tabButtons = [];
|
|
139
|
+
templateBtn = null;
|
|
140
|
+
menu = null;
|
|
141
|
+
currentTab = "symbol";
|
|
142
|
+
currentSettings = null;
|
|
143
|
+
chartType = null;
|
|
144
|
+
lookRows = [];
|
|
145
|
+
returnFocus = null;
|
|
146
|
+
uid = I++;
|
|
147
|
+
constructor(e, t, n = {}, r = () => document.body) {
|
|
148
|
+
this.available = n, this.host = r, this.callbacks = e, this.t = t;
|
|
149
|
+
}
|
|
150
|
+
open(e, t = null, n = "symbol") {
|
|
151
|
+
this.modal && this.remove(), this.returnFocus = document.activeElement instanceof HTMLElement ? document.activeElement : null, this.currentSettings = { ...e }, this.chartType = t, this.currentTab = n, this.buildModal(), this.tabButtons.find((e) => e.dataset.tab === n)?.focus();
|
|
152
|
+
}
|
|
153
|
+
isOpen() {
|
|
154
|
+
return this.modal !== null;
|
|
155
|
+
}
|
|
156
|
+
refresh(e, t) {
|
|
157
|
+
if (!this.modal) return;
|
|
158
|
+
this.currentSettings = { ...e }, t !== void 0 && (this.chartType = t);
|
|
159
|
+
let n = this.focusedControl();
|
|
160
|
+
this.renderTabContent(), n !== null && this.focusControl(n);
|
|
161
|
+
}
|
|
162
|
+
focusedControl() {
|
|
163
|
+
let e = document.activeElement;
|
|
164
|
+
if (!this.bodyEl || !(e instanceof HTMLElement) || !this.bodyEl.contains(e)) return null;
|
|
165
|
+
let t = this.panelControls().indexOf(e);
|
|
166
|
+
return t < 0 ? null : t;
|
|
167
|
+
}
|
|
168
|
+
focusControl(e) {
|
|
169
|
+
let t = this.panelControls();
|
|
170
|
+
(t[Math.min(e, t.length - 1)] ?? this.tabButtons.find((e) => e.dataset.tab === this.currentTab))?.focus();
|
|
171
|
+
}
|
|
172
|
+
panelControls() {
|
|
173
|
+
return this.bodyEl ? [...this.bodyEl.querySelectorAll(g)] : [];
|
|
174
|
+
}
|
|
175
|
+
close() {
|
|
176
|
+
this.finish(!0);
|
|
177
|
+
}
|
|
178
|
+
destroy() {
|
|
179
|
+
this.remove();
|
|
180
|
+
}
|
|
181
|
+
finish(e) {
|
|
182
|
+
this.modal && (e ? this.callbacks.onClose() : this.callbacks.onCancel?.(), this.remove(), this.returnFocus?.isConnected && this.returnFocus.focus(), this.returnFocus = null);
|
|
183
|
+
}
|
|
184
|
+
remove() {
|
|
185
|
+
this.menu?.destroy(), this.menu = null, this.backdrop?.remove(), this.backdrop = this.modal = this.bodyEl = this.templateBtn = null, this.tabButtons = [];
|
|
186
|
+
}
|
|
187
|
+
buildModal() {
|
|
188
|
+
let e = document.createElement("div");
|
|
189
|
+
e.className = "tcw-modal-backdrop";
|
|
190
|
+
let t = !1;
|
|
191
|
+
e.addEventListener("pointerdown", (n) => {
|
|
192
|
+
t = n.target === e;
|
|
193
|
+
}), e.addEventListener("click", (n) => {
|
|
194
|
+
n.target === e && t && this.finish(!1), t = !1;
|
|
195
|
+
});
|
|
196
|
+
let n = document.createElement("div");
|
|
197
|
+
n.className = "tcw-modal tcw-set", n.setAttribute("role", "dialog"), n.setAttribute("aria-modal", "true"), n.setAttribute("aria-labelledby", `tcw-set-title-${this.uid}`), n.tabIndex = -1, n.addEventListener("keydown", (e) => {
|
|
198
|
+
if (e.key === "Escape") {
|
|
199
|
+
e.preventDefault(), e.stopPropagation(), this.finish(!1);
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
m(e, n);
|
|
203
|
+
}), this.backdrop = e, this.modal = n, n.append(this.buildHeader(), this.buildBody(), this.buildFooter()), e.appendChild(n), this.host().appendChild(e), this.markTabs(), this.renderTabContent();
|
|
204
|
+
}
|
|
205
|
+
buildHeader() {
|
|
206
|
+
let e = document.createElement("div");
|
|
207
|
+
e.className = "tcw-modal-header";
|
|
208
|
+
let t = document.createElement("h3");
|
|
209
|
+
t.id = `tcw-set-title-${this.uid}`, t.textContent = this.t("settings.title");
|
|
210
|
+
let n = document.createElement("button");
|
|
211
|
+
return n.type = "button", n.className = "tcw-modal-close", n.setAttribute("aria-label", this.t("common.close")), n.innerHTML = p("x", 16), n.addEventListener("click", () => this.finish(!1)), e.append(t, n), e;
|
|
212
|
+
}
|
|
213
|
+
buildBody() {
|
|
214
|
+
let e = document.createElement("div");
|
|
215
|
+
e.className = "tcw-set-body";
|
|
216
|
+
let t = document.createElement("div");
|
|
217
|
+
t.className = "tcw-set-nav", t.setAttribute("role", "tablist"), t.setAttribute("aria-orientation", "vertical"), t.setAttribute("aria-label", this.t("settings.title")), t.addEventListener("keydown", (e) => this.onTabKey(e)), this.tabButtons = M.map(({ id: e, icon: t }) => {
|
|
218
|
+
let n = document.createElement("button");
|
|
219
|
+
return n.type = "button", n.className = "tcw-set-tab", n.id = `tcw-set-tab-${this.uid}-${e}`, n.dataset.tab = e, n.setAttribute("role", "tab"), n.setAttribute("aria-controls", `tcw-set-panel-${this.uid}`), n.innerHTML = `${t.startsWith("chartType:") ? h(t.slice(10), 16) : p(t, 16)}<span></span>`, n.querySelector("span").textContent = this.t(`settings.tab.${e}`), n.addEventListener("click", () => this.selectTab(e)), n;
|
|
220
|
+
}), t.append(...this.tabButtons);
|
|
221
|
+
let n = document.createElement("div");
|
|
222
|
+
return n.className = "tcw-modal-body tcw-set-panel", n.id = `tcw-set-panel-${this.uid}`, n.setAttribute("role", "tabpanel"), this.bodyEl = n, e.append(t, n), e;
|
|
223
|
+
}
|
|
224
|
+
buildFooter() {
|
|
225
|
+
let e = document.createElement("div");
|
|
226
|
+
e.className = "tcw-modal-footer";
|
|
227
|
+
let t = this.footerButton("template", "tcw-footer-menu", () => this.openTemplates());
|
|
228
|
+
t.setAttribute("aria-haspopup", "menu"), t.setAttribute("aria-expanded", "false"), t.innerHTML = `<span></span>${p("chevronDown", 12)}`, t.querySelector("span").textContent = this.t("settings.template"), this.templateBtn = t;
|
|
229
|
+
let n = document.createElement("div");
|
|
230
|
+
return n.className = "tcw-footer-end", n.append(this.footerButton("cancel", "tcw-footer-cancel", () => this.finish(!1), this.t("common.cancel")), this.footerButton("ok", "tcw-done-btn", () => this.finish(!0), this.t("drawingSettings.ok"))), e.append(t, n), e;
|
|
231
|
+
}
|
|
232
|
+
footerButton(e, t, n, r) {
|
|
233
|
+
let i = document.createElement("button");
|
|
234
|
+
return i.type = "button", i.className = t, i.dataset.act = e, r && (i.textContent = r), i.addEventListener("click", n), i;
|
|
235
|
+
}
|
|
236
|
+
markTabs() {
|
|
237
|
+
for (let e of this.tabButtons) {
|
|
238
|
+
let t = e.dataset.tab === this.currentTab;
|
|
239
|
+
e.classList.toggle("tcw-active", t), e.setAttribute("aria-selected", String(t)), e.tabIndex = t ? 0 : -1, t && this.bodyEl?.setAttribute("aria-labelledby", e.id);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
selectTab(e, t = !1) {
|
|
243
|
+
this.currentTab = e, this.markTabs(), this.renderTabContent(), t && this.tabButtons.find((t) => t.dataset.tab === e)?.focus();
|
|
244
|
+
}
|
|
245
|
+
onTabKey(e) {
|
|
246
|
+
let t = M.findIndex((e) => e.id === this.currentTab), n = e.key === "ArrowDown" || e.key === "ArrowRight" ? (t + 1) % M.length : e.key === "ArrowUp" || e.key === "ArrowLeft" ? (t - 1 + M.length) % M.length : e.key === "Home" ? 0 : e.key === "End" ? M.length - 1 : -1;
|
|
247
|
+
n < 0 || (e.preventDefault(), this.selectTab(M[n].id, !0));
|
|
248
|
+
}
|
|
249
|
+
openTemplates() {
|
|
250
|
+
let e = this.templateBtn;
|
|
251
|
+
if (!this.modal || !e) return;
|
|
252
|
+
if (this.menu?.isOpen()) {
|
|
253
|
+
this.menu.close();
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
let t = this.callbacks.templates, n = (t?.list() ?? []).map((e) => ({
|
|
257
|
+
id: `${P}${e}`,
|
|
258
|
+
label: e,
|
|
259
|
+
icon: "layers",
|
|
260
|
+
remove: y(this.t("templates.delete"), { name: e })
|
|
261
|
+
})), r = [
|
|
262
|
+
...n,
|
|
263
|
+
...n.length > 0 ? ["separator"] : [],
|
|
264
|
+
...t ? [{
|
|
265
|
+
id: "save",
|
|
266
|
+
label: this.t("settings.saveTemplate"),
|
|
267
|
+
icon: "save"
|
|
268
|
+
}] : [],
|
|
269
|
+
{
|
|
270
|
+
id: "reset",
|
|
271
|
+
label: this.t("settings.resetToDefaults"),
|
|
272
|
+
icon: "reset"
|
|
273
|
+
}
|
|
274
|
+
];
|
|
275
|
+
this.menu ??= new _(this.modal, this.t("settings.template"));
|
|
276
|
+
let i = e.getBoundingClientRect(), a = this.modal.getBoundingClientRect();
|
|
277
|
+
this.menu.open(r, i.left - a.left, i.top - a.top, (e) => {
|
|
278
|
+
e === "reset" ? this.callbacks.onReset() : e === "save" ? t?.save() : e.startsWith(P) && t?.apply(e.slice(2));
|
|
279
|
+
}, e, (e) => t?.remove(e.slice(2)));
|
|
280
|
+
}
|
|
281
|
+
renderTabContent() {
|
|
282
|
+
if (!(!this.bodyEl || !this.currentSettings)) switch (this.bodyEl.replaceChildren(), this.lookRows = [], this.currentTab) {
|
|
283
|
+
case "symbol":
|
|
284
|
+
this.renderSymbolTab(this.currentSettings);
|
|
285
|
+
break;
|
|
286
|
+
case "statusLine":
|
|
287
|
+
this.renderStatusLineTab(this.currentSettings);
|
|
288
|
+
break;
|
|
289
|
+
case "scales":
|
|
290
|
+
this.renderScalesTab(this.currentSettings);
|
|
291
|
+
break;
|
|
292
|
+
case "appearance":
|
|
293
|
+
this.renderAppearanceTab(this.currentSettings);
|
|
294
|
+
break;
|
|
295
|
+
case "layers":
|
|
296
|
+
this.renderLayersTab(this.currentSettings);
|
|
297
|
+
break;
|
|
298
|
+
case "trading":
|
|
299
|
+
for (let e of n) (!e.trading || this.available.trading !== !1) && this.renderLookSection(e);
|
|
300
|
+
break;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
renderSymbolTab(t) {
|
|
304
|
+
this.renderChartTypeSection(), this.addSection(void 0, [D(this.t("settings.mainSeries"), t.mainSeriesVisible, (e) => this.patch({ mainSeriesVisible: e })), D(this.t("settings.extendedHours"), t.extendedHours, (e) => this.patch({ extendedHours: e }))]);
|
|
305
|
+
let n = this.t("common.show");
|
|
306
|
+
this.renderLookSection(o), this.available.volume !== !1 && this.renderLookSection(r, [D(n, t.volumeVisible, (e) => this.patch({ volumeVisible: e }))]), this.renderLookSection(e, [D(n, t.highLowLines, (e) => this.patch({ highLowLines: e }))]);
|
|
307
|
+
}
|
|
308
|
+
renderStatusLineTab(e) {
|
|
309
|
+
let t = this.available.legend !== !1, n = t ? d : d.filter((e) => !l.includes(e));
|
|
310
|
+
this.addSection(void 0, [...t ? [D(this.t("settings.ohlcLegend"), e.legendVisible, (e) => this.patch({ legendVisible: e }))] : [], ...n.map((e) => this.lookRow(e))]);
|
|
311
|
+
}
|
|
312
|
+
renderScalesTab(e) {
|
|
313
|
+
let n = [
|
|
314
|
+
{
|
|
315
|
+
value: "regular",
|
|
316
|
+
label: this.t("settings.scale.regular")
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
value: "logarithmic",
|
|
320
|
+
label: this.t("settings.scale.logarithmic")
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
value: "percentage",
|
|
324
|
+
label: this.t("settings.scale.percentage")
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
value: "indexedTo100",
|
|
328
|
+
label: this.t("settings.scale.indexedTo100")
|
|
329
|
+
}
|
|
330
|
+
].filter((e) => e.value !== "logarithmic" || this.available.logScale !== !1), r = this.available.exchangeZone?.(), i = f(e.timezone, Date.now(), this.t("settings.timezone.local"), r === void 0 ? void 0 : {
|
|
331
|
+
label: this.t("settings.timezone.exchange"),
|
|
332
|
+
zone: r
|
|
333
|
+
});
|
|
334
|
+
this.addSection(void 0, [
|
|
335
|
+
O(this.t("settings.priceScale"), e.scaleMode, n, (e) => this.patch({ scaleMode: e })),
|
|
336
|
+
D(this.t("settings.autoScale"), e.autoScale, (e) => this.patch({ autoScale: e })),
|
|
337
|
+
D(this.t("settings.invertScale"), e.invertScale, (e) => this.patch({ invertScale: e })),
|
|
338
|
+
D(this.t("settings.leftScale"), e.leftPriceScale, (e) => this.patch({ leftPriceScale: e })),
|
|
339
|
+
D(this.t("settings.indicatorValues"), e.indicatorValueLabels, (e) => this.patch({ indicatorValueLabels: e })),
|
|
340
|
+
D(this.t("settings.alignAxisLabels"), e.alignAxisLabels, (e) => this.patch({ alignAxisLabels: e })),
|
|
341
|
+
...this.available.barCountdown === !1 ? [] : [D(this.t("settings.barCountdown"), e.barCountdown, (e) => this.patch({ barCountdown: e }))],
|
|
342
|
+
O(this.t("settings.timezone"), e.timezone, i, (e) => this.patch({ timezone: e })),
|
|
343
|
+
O(this.t("settings.numberLocale"), e.numberLocale, c(e.numberLocale), (e) => this.patch({ numberLocale: e }))
|
|
344
|
+
]), this.addSection(this.t("settings.section.axes"), t.map((e) => this.lookRow(e)));
|
|
345
|
+
}
|
|
346
|
+
renderAppearanceTab(e) {
|
|
347
|
+
let [t, n, r, ...a] = i;
|
|
348
|
+
this.renderLookSection(t), this.renderLookSection(n, [D(this.t("common.show"), e.gridVisible, (e) => this.patch({ gridVisible: e }))]), this.renderLookSection(r, [O(this.t("settings.crosshairMode"), e.crosshairMode, [
|
|
349
|
+
{
|
|
350
|
+
label: this.t("settings.crosshair.magnet"),
|
|
351
|
+
value: "magnet"
|
|
352
|
+
},
|
|
353
|
+
{
|
|
354
|
+
label: this.t("settings.crosshair.normal"),
|
|
355
|
+
value: "normal"
|
|
356
|
+
},
|
|
357
|
+
{
|
|
358
|
+
label: this.t("settings.crosshair.hidden"),
|
|
359
|
+
value: "hidden"
|
|
360
|
+
}
|
|
361
|
+
], (e) => this.patch({ crosshairMode: e }))]);
|
|
362
|
+
for (let e of a) this.renderLookSection(e);
|
|
363
|
+
}
|
|
364
|
+
renderLayersTab(e) {
|
|
365
|
+
let t = (e) => `${Math.round(e * 100)}%`, n = (e) => this.t(e);
|
|
366
|
+
this.addSection(void 0, [D(n("settings.volumeProfile"), e.volumeProfileVisible, (e) => this.patch({ volumeProfileVisible: e }))]), this.addSection(void 0, [
|
|
367
|
+
D(n("settings.marketProfile"), e.marketProfileVisible, (e) => this.patch({ marketProfileVisible: e })),
|
|
368
|
+
D(n("settings.marketProfileSplit"), e.marketProfileSplit, (e) => this.patch({ marketProfileSplit: e })),
|
|
369
|
+
D(n("settings.marketProfileLetters"), e.marketProfileLetters, (e) => this.patch({ marketProfileLetters: e })),
|
|
370
|
+
k(n("settings.marketProfileBuckets"), e.marketProfileBuckets, {
|
|
371
|
+
min: 8,
|
|
372
|
+
max: 200,
|
|
373
|
+
step: 1
|
|
374
|
+
}, (e) => this.patch({ marketProfileBuckets: e })),
|
|
375
|
+
k(n("settings.marketProfileOpacity"), e.marketProfileOpacity, {
|
|
376
|
+
min: .05,
|
|
377
|
+
max: 1,
|
|
378
|
+
step: .05
|
|
379
|
+
}, (e) => this.patch({ marketProfileOpacity: e }), t)
|
|
380
|
+
]), this.addSection(void 0, [D(n("settings.depthHeatmap"), e.depthHeatmapVisible, (e) => this.patch({ depthHeatmapVisible: e })), k(n("settings.depthHeatmapOpacity"), e.depthHeatmapOpacity, {
|
|
381
|
+
min: .1,
|
|
382
|
+
max: 1,
|
|
383
|
+
step: .05
|
|
384
|
+
}, (e) => this.patch({ depthHeatmapOpacity: e }), t)]), this.addSection(void 0, [
|
|
385
|
+
D(n("settings.swingMarkers"), e.pivotMarkersVisible, (e) => this.patch({ pivotMarkersVisible: e })),
|
|
386
|
+
k(n("settings.swingStrength"), e.pivotStrength, {
|
|
387
|
+
min: 2,
|
|
388
|
+
max: 20,
|
|
389
|
+
step: 1
|
|
390
|
+
}, (e) => this.patch({ pivotStrength: e })),
|
|
391
|
+
D(n("settings.swingStructure"), e.pivotStructureLabels, (e) => this.patch({ pivotStructureLabels: e }))
|
|
392
|
+
]), this.addSection(void 0, [
|
|
393
|
+
D(n("settings.sessionShading"), e.sessionShadingVisible, (e) => this.patch({ sessionShadingVisible: e })),
|
|
394
|
+
D(n("settings.periodLevels"), e.periodLevelsVisible, (e) => this.patch({ periodLevelsVisible: e })),
|
|
395
|
+
O(n("settings.periodLevelsBasis"), e.periodLevelsPeriod, [{
|
|
396
|
+
value: "day",
|
|
397
|
+
label: n("settings.priorDay")
|
|
398
|
+
}, {
|
|
399
|
+
value: "week",
|
|
400
|
+
label: n("settings.priorWeek")
|
|
401
|
+
}], (e) => this.patch({ periodLevelsPeriod: e }))
|
|
402
|
+
]);
|
|
403
|
+
}
|
|
404
|
+
addSection(e, t) {
|
|
405
|
+
let n = w(e);
|
|
406
|
+
return n.append(...t), this.bodyEl?.appendChild(n), n;
|
|
407
|
+
}
|
|
408
|
+
renderLookSection(e, t = []) {
|
|
409
|
+
this.addSection(this.t(e.title), [...t, ...e.rows.map((e) => this.lookRow(e))]);
|
|
410
|
+
}
|
|
411
|
+
lookRow(e) {
|
|
412
|
+
let t = this.t(e.label), n = () => this.callbacks.styleValue(e.keys[0]), r = () => {
|
|
413
|
+
let t = e.keys.map((e) => this.callbacks.styleValue(e));
|
|
414
|
+
return t.every((e) => e === t[0]) && t[0] !== null ? String(t[0]) : "";
|
|
415
|
+
}, i, a = (t) => {
|
|
416
|
+
this.callbacks.onStyleChange(Object.fromEntries(e.keys.map((e) => [e, t])));
|
|
417
|
+
for (let e of this.lookRows) e.el !== i && e.sync();
|
|
418
|
+
}, o = e.auto ? [{
|
|
419
|
+
value: "",
|
|
420
|
+
label: this.t("settings.auto")
|
|
421
|
+
}] : [], s;
|
|
422
|
+
switch (b[e.keys[0]]) {
|
|
423
|
+
case "boolean": {
|
|
424
|
+
i = D(t, n() === !0, a);
|
|
425
|
+
let e = i.querySelector("button");
|
|
426
|
+
s = () => {
|
|
427
|
+
let t = n() === !0;
|
|
428
|
+
e.classList.toggle("tcw-on", t), e.setAttribute("aria-checked", String(t));
|
|
429
|
+
};
|
|
430
|
+
break;
|
|
431
|
+
}
|
|
432
|
+
case "lineStyle":
|
|
433
|
+
i = O(t, r(), [...o, ...this.lineStyles()], (e) => a(e === "" ? null : z(e))), s = () => {
|
|
434
|
+
i.querySelector("select").value = r();
|
|
435
|
+
};
|
|
436
|
+
break;
|
|
437
|
+
case "width": {
|
|
438
|
+
let e = n(), c = typeof e == "number" && !N.includes(e) ? [...N, e].sort((e, t) => e - t) : N;
|
|
439
|
+
i = O(t, r(), [...o, ...c.map((e) => ({
|
|
440
|
+
value: String(e),
|
|
441
|
+
label: `${e}px`
|
|
442
|
+
}))], (e) => a(e === "" ? null : Number(e))), s = () => {
|
|
443
|
+
i.querySelector("select").value = r();
|
|
444
|
+
};
|
|
445
|
+
break;
|
|
446
|
+
}
|
|
447
|
+
default: {
|
|
448
|
+
let r = n(), o = E(t, typeof r == "string" ? r : null, a, {
|
|
449
|
+
read: () => {
|
|
450
|
+
let e = n();
|
|
451
|
+
return typeof e == "string" ? e : null;
|
|
452
|
+
},
|
|
453
|
+
start: e.auto ? () => (e.auto?.from ? this.callbacks.styleValue(e.auto.from) : e.auto?.hint) ?? null : void 0
|
|
454
|
+
}, this.t);
|
|
455
|
+
i = o.row, s = o.sync;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
return this.lookRows.push({
|
|
459
|
+
el: i,
|
|
460
|
+
sync: s
|
|
461
|
+
}), i;
|
|
462
|
+
}
|
|
463
|
+
lineStyles() {
|
|
464
|
+
return [
|
|
465
|
+
{
|
|
466
|
+
value: "solid",
|
|
467
|
+
label: this.t("drawingSettings.lineStyle.solid")
|
|
468
|
+
},
|
|
469
|
+
{
|
|
470
|
+
value: "dashed",
|
|
471
|
+
label: this.t("drawingSettings.lineStyle.dashed")
|
|
472
|
+
},
|
|
473
|
+
{
|
|
474
|
+
value: "dotted",
|
|
475
|
+
label: this.t("drawingSettings.lineStyle.dotted")
|
|
476
|
+
}
|
|
477
|
+
];
|
|
478
|
+
}
|
|
479
|
+
renderChartTypeSection() {
|
|
480
|
+
if (!this.bodyEl || !this.currentSettings || !this.chartType) return;
|
|
481
|
+
let e = this.chartType, t = this.currentSettings.chartTypeOptions ?? {}, n = a.find((t) => t.value === e), r = w(n ? u(n, this.t) : e), i = () => this.currentSettings?.chartTypeOptions ?? {}, o = (e, t) => this.patch({ chartTypeOptions: {
|
|
482
|
+
...i(),
|
|
483
|
+
[e]: t
|
|
484
|
+
} }), c = (e, t, n, i) => r.appendChild(j(this.t(e), t, n, i, this.t, this.currentSettings?.numberLocale || void 0));
|
|
485
|
+
switch (e) {
|
|
486
|
+
case "renko": {
|
|
487
|
+
let e = t.renko ?? {};
|
|
488
|
+
c("settings.boxSize", typeof e.boxSize == "number" ? e.boxSize : null, F, (e) => o("renko", {
|
|
489
|
+
...i().renko ?? {},
|
|
490
|
+
boxSize: e ?? "atr"
|
|
491
|
+
})), c("settings.atrPeriod", e.atrPeriod ?? null, {
|
|
492
|
+
step: "1",
|
|
493
|
+
max: 500
|
|
494
|
+
}, (e) => o("renko", R(i().renko, "atrPeriod", e)));
|
|
495
|
+
break;
|
|
496
|
+
}
|
|
497
|
+
case "lineBreak":
|
|
498
|
+
c("settings.lineBreakLines", t.lineBreak?.lines ?? null, {
|
|
499
|
+
step: "1",
|
|
500
|
+
max: 10
|
|
501
|
+
}, (e) => o("lineBreak", R(i().lineBreak, "lines", e)));
|
|
502
|
+
break;
|
|
503
|
+
case "kagi":
|
|
504
|
+
c("settings.reversal", t.kagi?.reversal ?? null, F, (e) => o("kagi", R(i().kagi, "reversal", e))), r.appendChild(O(this.t("settings.reversalType"), t.kagi?.reversalType ?? "percent", [{
|
|
505
|
+
value: "percent",
|
|
506
|
+
label: this.t("settings.reversalType.percent")
|
|
507
|
+
}, {
|
|
508
|
+
value: "price",
|
|
509
|
+
label: this.t("settings.reversalType.price")
|
|
510
|
+
}], (e) => o("kagi", {
|
|
511
|
+
...i().kagi ?? {},
|
|
512
|
+
reversalType: e === "price" ? "price" : "percent"
|
|
513
|
+
})));
|
|
514
|
+
break;
|
|
515
|
+
case "pointAndFigure":
|
|
516
|
+
c("settings.boxSize", typeof t.pointAndFigure?.boxSize == "number" ? t.pointAndFigure.boxSize : null, F, (e) => o("pointAndFigure", {
|
|
517
|
+
...i().pointAndFigure ?? {},
|
|
518
|
+
boxSize: e ?? "auto"
|
|
519
|
+
})), c("settings.reversalBoxes", t.pointAndFigure?.reversal ?? null, {
|
|
520
|
+
step: "1",
|
|
521
|
+
max: 10
|
|
522
|
+
}, (e) => o("pointAndFigure", R(i().pointAndFigure, "reversal", e)));
|
|
523
|
+
break;
|
|
524
|
+
case "rangeBars":
|
|
525
|
+
c("settings.barRange", typeof t.rangeBars?.range == "number" ? t.rangeBars.range : null, F, (e) => o("rangeBars", { range: e ?? "auto" }));
|
|
526
|
+
break;
|
|
527
|
+
default: break;
|
|
528
|
+
}
|
|
529
|
+
for (let t of s(e)) r.appendChild(this.lookRow(t));
|
|
530
|
+
this.bodyEl.appendChild(r);
|
|
531
|
+
}
|
|
532
|
+
patch(e) {
|
|
533
|
+
this.currentSettings && Object.assign(this.currentSettings, e), this.callbacks.onChange(e);
|
|
534
|
+
}
|
|
535
|
+
};
|
|
536
|
+
function R(e, t, n) {
|
|
537
|
+
let r = { ...e ?? {} };
|
|
538
|
+
return n === null ? delete r[t] : r[t] = n, r;
|
|
539
|
+
}
|
|
540
|
+
function z(e) {
|
|
541
|
+
return e === "dashed" || e === "dotted" ? e : "solid";
|
|
542
|
+
}
|
|
543
|
+
//#endregion
|
|
544
|
+
export { L as WidgetSettings };
|
|
545
|
+
|
|
546
|
+
//# sourceMappingURL=WidgetSettings-eOo93L7Z.js.map
|