@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.
Files changed (177) hide show
  1. package/dist/LayoutSession-DO4bYkUi.cjs +2 -0
  2. package/dist/LayoutSession-DO4bYkUi.cjs.map +1 -0
  3. package/dist/{LayoutSession-BOQCN6yY.js → LayoutSession-qRYG8GTD.js} +539 -552
  4. package/dist/LayoutSession-qRYG8GTD.js.map +1 -0
  5. package/dist/WidgetCommandPalette-CeCLHPy1.js +177 -0
  6. package/dist/WidgetCommandPalette-CeCLHPy1.js.map +1 -0
  7. package/dist/WidgetCommandPalette-ZZNbWwCZ.cjs +2 -0
  8. package/dist/WidgetCommandPalette-ZZNbWwCZ.cjs.map +1 -0
  9. package/dist/WidgetDrawingSettings-BeW8fX7r.js +474 -0
  10. package/dist/WidgetDrawingSettings-BeW8fX7r.js.map +1 -0
  11. package/dist/WidgetDrawingSettings-Cyl2u_u8.cjs +2 -0
  12. package/dist/WidgetDrawingSettings-Cyl2u_u8.cjs.map +1 -0
  13. package/dist/WidgetGoToDate-BNdngHlg.cjs +2 -0
  14. package/dist/WidgetGoToDate-BNdngHlg.cjs.map +1 -0
  15. package/dist/WidgetGoToDate-hcDtezRm.js +191 -0
  16. package/dist/WidgetGoToDate-hcDtezRm.js.map +1 -0
  17. package/dist/WidgetHotkeySheet-1lRFSdvt.js +416 -0
  18. package/dist/WidgetHotkeySheet-1lRFSdvt.js.map +1 -0
  19. package/dist/WidgetHotkeySheet-y5LWKSG6.cjs +2 -0
  20. package/dist/WidgetHotkeySheet-y5LWKSG6.cjs.map +1 -0
  21. package/dist/WidgetIndicatorPicker-CGvZ5kYd.js +245 -0
  22. package/dist/WidgetIndicatorPicker-CGvZ5kYd.js.map +1 -0
  23. package/dist/WidgetIndicatorPicker-DuKJFPRC.cjs +2 -0
  24. package/dist/WidgetIndicatorPicker-DuKJFPRC.cjs.map +1 -0
  25. package/dist/WidgetIndicatorSettings-C7vpco6e.cjs +2 -0
  26. package/dist/WidgetIndicatorSettings-C7vpco6e.cjs.map +1 -0
  27. package/dist/WidgetIndicatorSettings-dDkqzzYo.js +326 -0
  28. package/dist/WidgetIndicatorSettings-dDkqzzYo.js.map +1 -0
  29. package/dist/WidgetSettings-D7Pq42zW.cjs +2 -0
  30. package/dist/WidgetSettings-D7Pq42zW.cjs.map +1 -0
  31. package/dist/WidgetSettings-eOo93L7Z.js +546 -0
  32. package/dist/WidgetSettings-eOo93L7Z.js.map +1 -0
  33. package/dist/WidgetSymbolSearch-C4OR42nZ.cjs +2 -0
  34. package/dist/WidgetSymbolSearch-C4OR42nZ.cjs.map +1 -0
  35. package/dist/WidgetSymbolSearch-CvPpjIwa.js +580 -0
  36. package/dist/WidgetSymbolSearch-CvPpjIwa.js.map +1 -0
  37. package/dist/focusTrap-Br9Zfje0.js +27 -0
  38. package/dist/focusTrap-Br9Zfje0.js.map +1 -0
  39. package/dist/focusTrap-DrhhmG0V.cjs +2 -0
  40. package/dist/focusTrap-DrhhmG0V.cjs.map +1 -0
  41. package/dist/i18n-C2nQBZTY.cjs +2 -0
  42. package/dist/i18n-C2nQBZTY.cjs.map +1 -0
  43. package/dist/{i18n-DUmd4Z_r.js → i18n-C5v6Tzp1.js} +3 -1
  44. package/dist/i18n-C5v6Tzp1.js.map +1 -0
  45. package/dist/index.cjs +1 -1
  46. package/dist/index.d.ts +1 -1
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +1 -1
  49. package/dist/indicatorInputWords-Bd9Pt6qp.js +25 -0
  50. package/dist/indicatorInputWords-Bd9Pt6qp.js.map +1 -0
  51. package/dist/indicatorInputWords-CTA4IcJR.cjs +2 -0
  52. package/dist/indicatorInputWords-CTA4IcJR.cjs.map +1 -0
  53. package/dist/indicatorLabel-BNZvaOcl.cjs +2 -0
  54. package/dist/indicatorLabel-BNZvaOcl.cjs.map +1 -0
  55. package/dist/indicatorLabel-Sbegyhp2.js +17 -0
  56. package/dist/indicatorLabel-Sbegyhp2.js.map +1 -0
  57. package/dist/indicatorSettingsTabs-B0liE3ST.cjs +2 -0
  58. package/dist/indicatorSettingsTabs-B0liE3ST.cjs.map +1 -0
  59. package/dist/indicatorSettingsTabs-XcgMdbLp.js +161 -0
  60. package/dist/indicatorSettingsTabs-XcgMdbLp.js.map +1 -0
  61. package/dist/monthView-B-CieFDJ.cjs +2 -0
  62. package/dist/monthView-B-CieFDJ.cjs.map +1 -0
  63. package/dist/monthView-N8yDaTqZ.js +198 -0
  64. package/dist/monthView-N8yDaTqZ.js.map +1 -0
  65. package/dist/platformKeys-B82-j1Fs.cjs +2 -0
  66. package/dist/platformKeys-B82-j1Fs.cjs.map +1 -0
  67. package/dist/platformKeys-Dd1qOCjF.js +5 -0
  68. package/dist/platformKeys-Dd1qOCjF.js.map +1 -0
  69. package/dist/settingsControls-DIjzCFHI.js +379 -0
  70. package/dist/settingsControls-DIjzCFHI.js.map +1 -0
  71. package/dist/settingsControls-Tn8_vJJv.cjs +2 -0
  72. package/dist/settingsControls-Tn8_vJJv.cjs.map +1 -0
  73. package/dist/symbolCatalog-CA1fpz3s.js +90 -0
  74. package/dist/symbolCatalog-CA1fpz3s.js.map +1 -0
  75. package/dist/symbolCatalog-Dx1YnZgm.cjs +2 -0
  76. package/dist/symbolCatalog-Dx1YnZgm.cjs.map +1 -0
  77. package/dist/widget/ChartWidget.d.ts +102 -582
  78. package/dist/widget/ChartWidget.d.ts.map +1 -1
  79. package/dist/widget/WidgetAlerts.d.ts +35 -0
  80. package/dist/widget/WidgetAlerts.d.ts.map +1 -0
  81. package/dist/widget/WidgetChartSettings.d.ts +194 -0
  82. package/dist/widget/WidgetChartSettings.d.ts.map +1 -0
  83. package/dist/widget/WidgetCommands.d.ts +54 -0
  84. package/dist/widget/WidgetCommands.d.ts.map +1 -0
  85. package/dist/widget/WidgetCompares.d.ts +140 -0
  86. package/dist/widget/WidgetCompares.d.ts.map +1 -0
  87. package/dist/widget/WidgetDockArea.d.ts +89 -0
  88. package/dist/widget/WidgetDockArea.d.ts.map +1 -0
  89. package/dist/widget/WidgetDrawingEdit.d.ts +73 -0
  90. package/dist/widget/WidgetDrawingEdit.d.ts.map +1 -0
  91. package/dist/widget/WidgetGoToDate.d.ts +1 -14
  92. package/dist/widget/WidgetGoToDate.d.ts.map +1 -1
  93. package/dist/widget/WidgetIndicatorSettings.d.ts.map +1 -1
  94. package/dist/widget/WidgetIntervals.d.ts +66 -0
  95. package/dist/widget/WidgetIntervals.d.ts.map +1 -0
  96. package/dist/widget/WidgetLayouts.d.ts +85 -0
  97. package/dist/widget/WidgetLayouts.d.ts.map +1 -0
  98. package/dist/widget/WidgetLegendView.d.ts +54 -0
  99. package/dist/widget/WidgetLegendView.d.ts.map +1 -0
  100. package/dist/widget/WidgetMenus.d.ts +79 -0
  101. package/dist/widget/WidgetMenus.d.ts.map +1 -0
  102. package/dist/widget/WidgetReplay.d.ts +199 -0
  103. package/dist/widget/WidgetReplay.d.ts.map +1 -0
  104. package/dist/widget/WidgetTrading.d.ts +48 -0
  105. package/dist/widget/WidgetTrading.d.ts.map +1 -0
  106. package/dist/widget/WidgetWatchlists.d.ts +77 -0
  107. package/dist/widget/WidgetWatchlists.d.ts.map +1 -0
  108. package/dist/widget/drawingSettingsTabs.d.ts +2 -19
  109. package/dist/widget/drawingSettingsTabs.d.ts.map +1 -1
  110. package/dist/widget/drawingText.d.ts +24 -0
  111. package/dist/widget/drawingText.d.ts.map +1 -0
  112. package/dist/widget/index.cjs +22 -23
  113. package/dist/widget/index.cjs.map +1 -1
  114. package/dist/widget/index.js +6193 -9868
  115. package/dist/widget/index.js.map +1 -1
  116. package/dist/widget/keyTarget.d.ts +4 -0
  117. package/dist/widget/keyTarget.d.ts.map +1 -1
  118. package/dist/widget/lazyPart.d.ts +47 -0
  119. package/dist/widget/lazyPart.d.ts.map +1 -0
  120. package/dist/widget/locales/ar.d.ts.map +1 -1
  121. package/dist/widget/locales/cs.d.ts.map +1 -1
  122. package/dist/widget/locales/da.d.ts.map +1 -1
  123. package/dist/widget/locales/de.d.ts.map +1 -1
  124. package/dist/widget/locales/el.d.ts.map +1 -1
  125. package/dist/widget/locales/en.d.ts +1 -0
  126. package/dist/widget/locales/en.d.ts.map +1 -1
  127. package/dist/widget/locales/es.d.ts.map +1 -1
  128. package/dist/widget/locales/et.d.ts.map +1 -1
  129. package/dist/widget/locales/fa.d.ts.map +1 -1
  130. package/dist/widget/locales/fr.d.ts.map +1 -1
  131. package/dist/widget/locales/he.d.ts.map +1 -1
  132. package/dist/widget/locales/hu.d.ts.map +1 -1
  133. package/dist/widget/locales/id.d.ts.map +1 -1
  134. package/dist/widget/locales/index.cjs +1 -1
  135. package/dist/widget/locales/index.cjs.map +1 -1
  136. package/dist/widget/locales/index.js +29 -1
  137. package/dist/widget/locales/index.js.map +1 -1
  138. package/dist/widget/locales/it.d.ts.map +1 -1
  139. package/dist/widget/locales/ja.d.ts.map +1 -1
  140. package/dist/widget/locales/ko.d.ts.map +1 -1
  141. package/dist/widget/locales/ms.d.ts.map +1 -1
  142. package/dist/widget/locales/nb.d.ts.map +1 -1
  143. package/dist/widget/locales/nl.d.ts.map +1 -1
  144. package/dist/widget/locales/pl.d.ts.map +1 -1
  145. package/dist/widget/locales/pt.d.ts.map +1 -1
  146. package/dist/widget/locales/ro.d.ts.map +1 -1
  147. package/dist/widget/locales/ru.d.ts.map +1 -1
  148. package/dist/widget/locales/sk.d.ts.map +1 -1
  149. package/dist/widget/locales/sv.d.ts.map +1 -1
  150. package/dist/widget/locales/th.d.ts.map +1 -1
  151. package/dist/widget/locales/tr.d.ts.map +1 -1
  152. package/dist/widget/locales/vi.d.ts.map +1 -1
  153. package/dist/widget/locales/zh.d.ts.map +1 -1
  154. package/dist/widget/locales/zhHant.d.ts.map +1 -1
  155. package/dist/widget/pageEnv.d.ts +5 -0
  156. package/dist/widget/pageEnv.d.ts.map +1 -0
  157. package/dist/widget/signals.d.ts +41 -0
  158. package/dist/widget/signals.d.ts.map +1 -0
  159. package/dist/widget/wallTime.d.ts +15 -0
  160. package/dist/widget/wallTime.d.ts.map +1 -0
  161. package/dist/widget/widgetDialogs.d.ts +17 -0
  162. package/dist/widget/widgetDialogs.d.ts.map +1 -0
  163. package/dist/widgetFeatures-BM6u0u74.js +186 -0
  164. package/dist/widgetFeatures-BM6u0u74.js.map +1 -0
  165. package/dist/widgetFeatures-BZ8OVPN2.cjs +3 -0
  166. package/dist/widgetFeatures-BZ8OVPN2.cjs.map +1 -0
  167. package/dist/widgetLocales-BPK5i0Ok.cjs +2 -0
  168. package/dist/widgetLocales-BPK5i0Ok.cjs.map +1 -0
  169. package/dist/widgetLocales-DgTR8JSu.js +838 -0
  170. package/dist/widgetLocales-DgTR8JSu.js.map +1 -0
  171. package/package.json +3 -3
  172. package/dist/LayoutSession-BOQCN6yY.js.map +0 -1
  173. package/dist/LayoutSession-RF8OqOXy.cjs +0 -2
  174. package/dist/LayoutSession-RF8OqOXy.cjs.map +0 -1
  175. package/dist/i18n-BsstZ9md.cjs +0 -2
  176. package/dist/i18n-BsstZ9md.cjs.map +0 -1
  177. 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