@luxalgo/vela 0.7.3 → 0.7.5
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/{DataProvider-BALR0qPq.d.ts → DataProvider-DLeFs1gE.d.ts} +1 -1
- package/dist/{DataProvider-D5uMiJYz.d.cts → DataProvider-Dut6lXGM.d.cts} +1 -1
- package/dist/{chunk-2EO74GIE.js → chunk-MCLI6B3S.js} +261 -68
- package/dist/{chunk-DH2VF5X7.js → chunk-MNG5XPLV.js} +6 -1
- package/dist/{contributions-BbhbZd3c.d.ts → contributions-CEkgJKTU.d.ts} +7 -3
- package/dist/{contributions-CcBFe-91.d.cts → contributions-DYtiRtES.d.cts} +7 -3
- package/dist/index.cjs +261 -68
- package/dist/index.d.cts +23 -6
- package/dist/index.d.ts +23 -6
- package/dist/index.js +1 -1
- package/dist/{options-C7b_Qssu.d.cts → options-DNBoMKkX.d.cts} +10 -1
- package/dist/{options-C7b_Qssu.d.ts → options-DNBoMKkX.d.ts} +10 -1
- package/dist/{plugin-Cnix5ZBh.d.ts → plugin-CLn--oP6.d.ts} +3 -3
- package/dist/{plugin-D6MlX4--.d.cts → plugin-DtkeQVAO.d.cts} +3 -3
- package/dist/plugin.d.cts +4 -4
- package/dist/plugin.d.ts +4 -4
- package/dist/providers/binance.d.cts +2 -2
- package/dist/providers/binance.d.ts +2 -2
- package/dist/providers/coinbase.d.cts +2 -2
- package/dist/providers/coinbase.d.ts +2 -2
- package/dist/providers/hyperliquid.d.cts +2 -2
- package/dist/providers/hyperliquid.d.ts +2 -2
- package/dist/{statusline-model-D8NL7o4L.d.ts → statusline-model-DypGXjtr.d.ts} +3 -3
- package/dist/{statusline-model-DUKt7_TQ.d.cts → statusline-model-gA__yaog.d.cts} +3 -3
- package/dist/ui.d.cts +1 -1
- package/dist/ui.d.ts +1 -1
- package/dist/vela.global.js +261 -68
- package/dist/vela.global.min.js +53 -49
- package/dist/widget.cjs +266 -68
- package/dist/widget.d.cts +6 -6
- package/dist/widget.d.ts +6 -6
- package/dist/widget.js +3 -3
- package/dist/workspace.cjs +266 -68
- package/dist/workspace.d.cts +5 -5
- package/dist/workspace.d.ts +5 -5
- package/dist/workspace.js +2 -2
- package/package.json +1 -1
|
@@ -5356,6 +5356,17 @@ function hasOwnCandlePaint(style) {
|
|
|
5356
5356
|
for (const t of chartTypes()) if (t.id === style) return (t.basePainting ?? "candles") === "candles";
|
|
5357
5357
|
return false;
|
|
5358
5358
|
}
|
|
5359
|
+
var CANDLE_OVERRIDE_KEYS = [
|
|
5360
|
+
"candleUpColor",
|
|
5361
|
+
"candleDownColor",
|
|
5362
|
+
"candleBodyVisible",
|
|
5363
|
+
"candleBorderVisible",
|
|
5364
|
+
"candleBorderUpColor",
|
|
5365
|
+
"candleBorderDownColor",
|
|
5366
|
+
"candleWickVisible",
|
|
5367
|
+
"candleWickUpColor",
|
|
5368
|
+
"candleWickDownColor"
|
|
5369
|
+
];
|
|
5359
5370
|
function candleOverrideFor(style, bags) {
|
|
5360
5371
|
if (!hasOwnCandlePaint(style)) return null;
|
|
5361
5372
|
const bag = bags[style] ?? {};
|
|
@@ -5427,7 +5438,7 @@ function clampLevel(v) {
|
|
|
5427
5438
|
function clampSpacing(v) {
|
|
5428
5439
|
return v < 0.1 ? 0.1 : v > 10 ? 10 : v;
|
|
5429
5440
|
}
|
|
5430
|
-
function factoryResetConfig(factory) {
|
|
5441
|
+
function factoryResetConfig(factory, priceStyle = factory.series.style) {
|
|
5431
5442
|
const bag = {};
|
|
5432
5443
|
for (const t of chartTypes()) {
|
|
5433
5444
|
const section = t.settings;
|
|
@@ -5449,10 +5460,16 @@ function factoryResetConfig(factory) {
|
|
|
5449
5460
|
if (!section.instances) addRows(section.rows);
|
|
5450
5461
|
bag[t.id] = defaults;
|
|
5451
5462
|
}
|
|
5463
|
+
for (const t of chartTypes()) {
|
|
5464
|
+
if (!hasOwnCandlePaint(t.id)) continue;
|
|
5465
|
+
const defaults = bag[t.id] ?? {};
|
|
5466
|
+
for (const key of CANDLE_OVERRIDE_KEYS) defaults[key] = null;
|
|
5467
|
+
bag[t.id] = defaults;
|
|
5468
|
+
}
|
|
5452
5469
|
for (const [typeId, vals] of Object.entries(factory.chartTypes)) {
|
|
5453
5470
|
bag[typeId] = { ...bag[typeId] ?? {}, ...vals };
|
|
5454
5471
|
}
|
|
5455
|
-
return { ...factory, chartTypes: bag };
|
|
5472
|
+
return { ...factory, chartTypes: bag, series: { ...factory.series, style: priceStyle } };
|
|
5456
5473
|
}
|
|
5457
5474
|
function mergeConfig(base, patch) {
|
|
5458
5475
|
const p = asObject(patch);
|
|
@@ -7819,6 +7836,42 @@ function drawTextLines(ctx, lines, x, firstY, step, color) {
|
|
|
7819
7836
|
for (let i = 0; i < lines.length; i += 1) ctx.fillText(lines[i], x, firstY + i * step);
|
|
7820
7837
|
}
|
|
7821
7838
|
|
|
7839
|
+
// src/core/marks/visibility.ts
|
|
7840
|
+
function markGroupOwnVisible(choices, groupId, groups) {
|
|
7841
|
+
const chosen = choices[groupId];
|
|
7842
|
+
if (typeof chosen === "boolean") return chosen;
|
|
7843
|
+
return groups.find((g) => g.id === groupId)?.visible !== false;
|
|
7844
|
+
}
|
|
7845
|
+
function markGroupVisible(choices, groupId, groups) {
|
|
7846
|
+
if (groupId === void 0) return true;
|
|
7847
|
+
const seen = /* @__PURE__ */ new Set();
|
|
7848
|
+
let id = groupId;
|
|
7849
|
+
while (id !== void 0 && !seen.has(id)) {
|
|
7850
|
+
seen.add(id);
|
|
7851
|
+
if (!markGroupOwnVisible(choices, id, groups)) return false;
|
|
7852
|
+
const parent = groups.find((g) => g.id === id)?.parent;
|
|
7853
|
+
id = parent !== void 0 && groups.some((g) => g.id === parent) ? parent : void 0;
|
|
7854
|
+
}
|
|
7855
|
+
return true;
|
|
7856
|
+
}
|
|
7857
|
+
function markGroupRows(groups) {
|
|
7858
|
+
const ids = new Set(groups.map((g) => g.id));
|
|
7859
|
+
const out = [];
|
|
7860
|
+
const placed = /* @__PURE__ */ new Set();
|
|
7861
|
+
const place = (group, depth) => {
|
|
7862
|
+
if (placed.has(group.id)) return;
|
|
7863
|
+
placed.add(group.id);
|
|
7864
|
+
out.push({ group, depth });
|
|
7865
|
+
for (const child of groups) if (child.parent === group.id && child.id !== group.id) place(child, depth + 1);
|
|
7866
|
+
};
|
|
7867
|
+
for (const g of groups) {
|
|
7868
|
+
const parentKnown = g.parent !== void 0 && ids.has(g.parent) && g.parent !== g.id;
|
|
7869
|
+
if (!parentKnown) place(g, 0);
|
|
7870
|
+
}
|
|
7871
|
+
for (const g of groups) place(g, 0);
|
|
7872
|
+
return out;
|
|
7873
|
+
}
|
|
7874
|
+
|
|
7822
7875
|
// src/renderers/shared/marks-state.ts
|
|
7823
7876
|
function defaultMarksState() {
|
|
7824
7877
|
return { visible: true, groups: {} };
|
|
@@ -7831,11 +7884,8 @@ function mergeMarksState(base, patch) {
|
|
|
7831
7884
|
for (const [id, v] of Object.entries(g)) if (typeof v === "boolean") groups[id] = v;
|
|
7832
7885
|
return { visible: typeof p.visible === "boolean" ? p.visible : base.visible, groups };
|
|
7833
7886
|
}
|
|
7834
|
-
function
|
|
7835
|
-
|
|
7836
|
-
const chosen = state.groups[groupId];
|
|
7837
|
-
if (typeof chosen === "boolean") return chosen;
|
|
7838
|
-
return groups.find((g) => g.id === groupId)?.visible !== false;
|
|
7887
|
+
function markGroupVisible2(state, groupId, groups) {
|
|
7888
|
+
return markGroupVisible(state.groups, groupId, groups);
|
|
7839
7889
|
}
|
|
7840
7890
|
|
|
7841
7891
|
// src/renderers/native/core/SceneGraph.ts
|
|
@@ -9847,6 +9897,32 @@ function clusterMarks(marks, barTimes, intervalMs2, hidden) {
|
|
|
9847
9897
|
}
|
|
9848
9898
|
return out;
|
|
9849
9899
|
}
|
|
9900
|
+
function foldOverlappingClusters(clusters, xOf, bucketPx = MARK_CLUSTER_PX) {
|
|
9901
|
+
const byGroup = /* @__PURE__ */ new Map();
|
|
9902
|
+
for (const c of clusters) {
|
|
9903
|
+
const list = byGroup.get(c.group);
|
|
9904
|
+
if (list) list.push(c);
|
|
9905
|
+
else byGroup.set(c.group, [c]);
|
|
9906
|
+
}
|
|
9907
|
+
const out = [];
|
|
9908
|
+
for (const list of byGroup.values()) {
|
|
9909
|
+
list.sort((a, b) => a.bar - b.bar);
|
|
9910
|
+
const runs = [];
|
|
9911
|
+
let anchorX = Number.NaN;
|
|
9912
|
+
for (const c of list) {
|
|
9913
|
+
const x = xOf(c.bar);
|
|
9914
|
+
const run = runs[runs.length - 1];
|
|
9915
|
+
if (run && Number.isFinite(x) && Number.isFinite(anchorX) && x - anchorX < bucketPx) {
|
|
9916
|
+
run.marks.push(...c.marks);
|
|
9917
|
+
} else {
|
|
9918
|
+
runs.push({ key: c.key, bar: c.bar, group: c.group, marks: [...c.marks] });
|
|
9919
|
+
anchorX = x;
|
|
9920
|
+
}
|
|
9921
|
+
}
|
|
9922
|
+
out.push(...runs);
|
|
9923
|
+
}
|
|
9924
|
+
return out;
|
|
9925
|
+
}
|
|
9850
9926
|
function groupRank(groups, clusters) {
|
|
9851
9927
|
const rank = /* @__PURE__ */ new Map();
|
|
9852
9928
|
groups.forEach((g, i) => rank.set(g.id, i));
|
|
@@ -9856,7 +9932,7 @@ function groupRank(groups, clusters) {
|
|
|
9856
9932
|
return (group) => group === void 0 ? Number.MAX_SAFE_INTEGER : rank.get(group) ?? Number.MAX_SAFE_INTEGER - 1;
|
|
9857
9933
|
}
|
|
9858
9934
|
function layoutMarkLane(input) {
|
|
9859
|
-
const clusters = clusterMarks(input.marks, input.barTimes, input.intervalMs, input.hidden);
|
|
9935
|
+
const clusters = foldOverlappingClusters(clusterMarks(input.marks, input.barTimes, input.intervalMs, input.hidden), input.xOf);
|
|
9860
9936
|
const rankOf = groupRank(input.groups, clusters);
|
|
9861
9937
|
const byBar = /* @__PURE__ */ new Map();
|
|
9862
9938
|
for (const c of clusters) {
|
|
@@ -9985,13 +10061,29 @@ function paintMarkLane(ctx, layout, deps) {
|
|
|
9985
10061
|
const img = deps.icons.get(mark.glyph.icon, ink, symbolPx, deps.dpr);
|
|
9986
10062
|
if (img) ctx.drawImage(img, center.x - symbolPx / 2, center.y - symbolPx / 2, symbolPx, symbolPx);
|
|
9987
10063
|
} else if (mark.glyph.letter) {
|
|
10064
|
+
const letter = mark.glyph.letter.slice(0, 2);
|
|
9988
10065
|
ctx.fillStyle = ink;
|
|
9989
|
-
|
|
9990
|
-
ctx.
|
|
10066
|
+
let px = letterFontPx(size, letter);
|
|
10067
|
+
ctx.font = `600 ${px}px ${deps.fontFamily}`;
|
|
10068
|
+
if (letter.length > 1) {
|
|
10069
|
+
px = fitLetterPx(px, ctx.measureText(letter).width, symbolInnerWidth(shape, size));
|
|
10070
|
+
ctx.font = `600 ${px}px ${deps.fontFamily}`;
|
|
10071
|
+
}
|
|
10072
|
+
ctx.fillText(letter, center.x, center.y + 0.5);
|
|
9991
10073
|
}
|
|
9992
10074
|
}
|
|
9993
10075
|
ctx.restore();
|
|
9994
10076
|
}
|
|
10077
|
+
function letterFontPx(size, letter) {
|
|
10078
|
+
return Math.round(size * (letter.length > 1 ? 0.38 : 0.58));
|
|
10079
|
+
}
|
|
10080
|
+
function symbolInnerWidth(shape, size) {
|
|
10081
|
+
return (shape === "pin" ? size * 0.82 : size) - 3;
|
|
10082
|
+
}
|
|
10083
|
+
function fitLetterPx(px, width, inner) {
|
|
10084
|
+
if (!(width > inner) || !(width > 0)) return px;
|
|
10085
|
+
return Math.max(4, Math.floor(px * inner / width));
|
|
10086
|
+
}
|
|
9995
10087
|
function traceShape(ctx, shape, x, y, size) {
|
|
9996
10088
|
const r = size / 2;
|
|
9997
10089
|
ctx.beginPath();
|
|
@@ -10193,7 +10285,7 @@ var ChromeRenderer = class {
|
|
|
10193
10285
|
this.markLayout = layoutMarkLane({
|
|
10194
10286
|
marks: scene.timelineMarks,
|
|
10195
10287
|
groups: scene.markGroups,
|
|
10196
|
-
hidden: (groupId) => !
|
|
10288
|
+
hidden: (groupId) => !markGroupVisible2(scene.marks, groupId, scene.markGroups),
|
|
10197
10289
|
barTimes: this.barTimes(scene),
|
|
10198
10290
|
intervalMs: coords.barInterval,
|
|
10199
10291
|
xOf: (bar) => coords.logicalToX(bar),
|
|
@@ -10883,6 +10975,10 @@ ${overlayScrollbarCss(".vela-sd-pane")}
|
|
|
10883
10975
|
muted and non-interactive. Applied to each row's children so it survives display:contents;
|
|
10884
10976
|
!important beats the inline opacity on labels. */
|
|
10885
10977
|
.vela-sd-soft>*{opacity:0.4 !important;pointer-events:none !important;}
|
|
10978
|
+
/* A mark group nested under a parent group on the Events tab: indented one step per level
|
|
10979
|
+
(--vela-sd-depth). The indent rides the first child (the switch) as a MARGIN \u2014 padding
|
|
10980
|
+
would push the switch's own tick out of its box. */
|
|
10981
|
+
.vela-sd-nested>*:first-child{margin-left:calc(var(--vela-sd-depth,1)*24px);}
|
|
10886
10982
|
/* \u2500\u2500 mobile presentation (.vela-sd-mobile on the scrim; structural sizes are inline in open()) \u2500\u2500
|
|
10887
10983
|
The tab rail becomes a burger-opened overlay sidebar; the group TOC becomes a sticky
|
|
10888
10984
|
row of horizontally scrollable tabs; the instance strip scrolls instead of wrapping;
|
|
@@ -10931,6 +11027,8 @@ var SettingsDialog = class {
|
|
|
10931
11027
|
this.hostSections = [];
|
|
10932
11028
|
/** The timeline-mark groups (defined + named by marks) — one checkbox each on the Events tab. */
|
|
10933
11029
|
this.markGroups = [];
|
|
11030
|
+
/** A group's OWN switch (what its checkbox shows) — a child under an off parent keeps its own state. */
|
|
11031
|
+
this.markGroupOwnVisible = () => true;
|
|
10934
11032
|
this.markGroupVisible = () => true;
|
|
10935
11033
|
/** The Canvas → Theme row: current app theme + where a pick is raised. The row is a
|
|
10936
11034
|
* host callback, NOT a config patch — the app theme stays out of the persisted
|
|
@@ -10948,6 +11046,9 @@ var SettingsDialog = class {
|
|
|
10948
11046
|
this.activeSection = null;
|
|
10949
11047
|
/** Mobile chrome: fullscreen card, burger-opened section sidebar, TOC as top tabs. */
|
|
10950
11048
|
this.mobileLayout = false;
|
|
11049
|
+
/** Opens/closes the mobile section sidebar of the CURRENT build (the burger in the
|
|
11050
|
+
* shell header outlives pane rebuilds, so it reaches the rail through here). */
|
|
11051
|
+
this.toggleRail = null;
|
|
10951
11052
|
/** The visibility policy: setting ids hidden by the host (subtree semantics). */
|
|
10952
11053
|
this.hiddenSettings = /* @__PURE__ */ new Set();
|
|
10953
11054
|
if (getComputedStyle(container).position === "static") container.style.position = "relative";
|
|
@@ -10957,7 +11058,8 @@ var SettingsDialog = class {
|
|
|
10957
11058
|
this.hostSections = sections;
|
|
10958
11059
|
}
|
|
10959
11060
|
/** The timeline-mark groups and their current visibility — the Events tab's rows on next open. */
|
|
10960
|
-
setMarkGroups(groups, visible) {
|
|
11061
|
+
setMarkGroups(groups, visible, ownVisible = visible) {
|
|
11062
|
+
this.markGroupOwnVisible = ownVisible;
|
|
10961
11063
|
this.markGroups = groups;
|
|
10962
11064
|
this.markGroupVisible = visible;
|
|
10963
11065
|
}
|
|
@@ -11023,7 +11125,6 @@ var SettingsDialog = class {
|
|
|
11023
11125
|
this.onReset = onReset ?? null;
|
|
11024
11126
|
ensureControlStyles();
|
|
11025
11127
|
const mobile = this.mobileLayout;
|
|
11026
|
-
let toggleRail = null;
|
|
11027
11128
|
let burger;
|
|
11028
11129
|
if (mobile) {
|
|
11029
11130
|
burger = document.createElement("button");
|
|
@@ -11031,8 +11132,83 @@ var SettingsDialog = class {
|
|
|
11031
11132
|
burger.className = "vela-sd-burger";
|
|
11032
11133
|
burger.innerHTML = iconAt("burger", 16);
|
|
11033
11134
|
burger.title = "Sections";
|
|
11034
|
-
burger.addEventListener("click", () => toggleRail?.());
|
|
11135
|
+
burger.addEventListener("click", () => this.toggleRail?.());
|
|
11035
11136
|
}
|
|
11137
|
+
const ui = new Dialog({
|
|
11138
|
+
host: this.container,
|
|
11139
|
+
title: "Chart settings",
|
|
11140
|
+
// Non-modal: a live-edit dialog must leave the page interactive — a modal
|
|
11141
|
+
// machine locks pointer events on the whole body, killing the chart, the
|
|
11142
|
+
// legend, and the body-portaled popovers (color picker, select lists).
|
|
11143
|
+
modal: false,
|
|
11144
|
+
contained: true,
|
|
11145
|
+
align: "top",
|
|
11146
|
+
draggable: !mobile,
|
|
11147
|
+
flush: true,
|
|
11148
|
+
className: "vela-dialog--settings",
|
|
11149
|
+
headerStart: burger,
|
|
11150
|
+
closeOnBackdrop: true,
|
|
11151
|
+
footer: (foot) => {
|
|
11152
|
+
foot.style.cssText = `padding:10px 14px;display:flex;align-items:center;justify-content:flex-start;gap:8px;`;
|
|
11153
|
+
const resetBtn = document.createElement("button");
|
|
11154
|
+
resetBtn.type = "button";
|
|
11155
|
+
resetBtn.textContent = "Reset defaults";
|
|
11156
|
+
resetBtn.className = "vela-sd-btn";
|
|
11157
|
+
resetBtn.addEventListener("click", () => this.onReset?.());
|
|
11158
|
+
foot.appendChild(resetBtn);
|
|
11159
|
+
},
|
|
11160
|
+
// A close signal may only close ITS OWN dialog: the machine reports the exit
|
|
11161
|
+
// asynchronously, so a close-then-reopen in one tick would otherwise see the
|
|
11162
|
+
// old instance's signal tear down the freshly opened one.
|
|
11163
|
+
onOpenChange: (open) => {
|
|
11164
|
+
if (!open && this.ui === ui) this.close();
|
|
11165
|
+
}
|
|
11166
|
+
});
|
|
11167
|
+
if (mobile) ui.positioner.classList.add("vela-sd-mobile");
|
|
11168
|
+
ui.positioner.style.paddingTop = mobile ? "0" : "8vh";
|
|
11169
|
+
this.root = ui.positioner;
|
|
11170
|
+
this.ui = ui;
|
|
11171
|
+
const panes = this.buildContent(ui, config, section, mobile);
|
|
11172
|
+
ui.show();
|
|
11173
|
+
this.layoutPanes(panes);
|
|
11174
|
+
}
|
|
11175
|
+
/**
|
|
11176
|
+
* Re-seed every control of an OPEN dialog from `config`, in place: the shell stays
|
|
11177
|
+
* (no close/open transition), only the tab rail and panes rebuild, landing back on
|
|
11178
|
+
* the current tab. The reset path — the restored values must show without the
|
|
11179
|
+
* dialog re-entering. No-op while closed.
|
|
11180
|
+
*/
|
|
11181
|
+
refresh(config) {
|
|
11182
|
+
const ui = this.ui;
|
|
11183
|
+
if (!ui) return;
|
|
11184
|
+
closeOpenPopovers();
|
|
11185
|
+
closeWidthPopover();
|
|
11186
|
+
for (const dispose of this.hintTips) dispose();
|
|
11187
|
+
this.hintTips = [];
|
|
11188
|
+
this.config = config;
|
|
11189
|
+
ui.body.replaceChildren();
|
|
11190
|
+
this.layoutPanes(this.buildContent(ui, config, this.activeSection ?? void 0, this.mobileLayout));
|
|
11191
|
+
}
|
|
11192
|
+
/** Structured chart-type panes (instance strip / group TOC) own their layout and
|
|
11193
|
+
* tag their rows hosts instead; each host gets its own field grid. Runs on a SHOWN
|
|
11194
|
+
* dialog — the grids measure their labels. */
|
|
11195
|
+
layoutPanes(panes) {
|
|
11196
|
+
for (const el of panes) {
|
|
11197
|
+
const hosts = [...el.querySelectorAll("[data-sd-rows-host]")];
|
|
11198
|
+
if (hosts.length === 0) {
|
|
11199
|
+
this.layoutSettingsGrids(el);
|
|
11200
|
+
continue;
|
|
11201
|
+
}
|
|
11202
|
+
for (const h of hosts) this.layoutSettingsGrids(h);
|
|
11203
|
+
}
|
|
11204
|
+
}
|
|
11205
|
+
/**
|
|
11206
|
+
* Build the tab rail + one pane per section into `ui.body` (the linear `body` of
|
|
11207
|
+
* section markers and rows is split afterwards), select `section` (the active
|
|
11208
|
+
* style's own tab when none is asked for), and return the pane elements for
|
|
11209
|
+
* {@link layoutPanes}.
|
|
11210
|
+
*/
|
|
11211
|
+
buildContent(ui, config, section, mobile) {
|
|
11036
11212
|
const body = document.createElement("div");
|
|
11037
11213
|
body.style.cssText = "display:flex;flex-direction:column;gap:0;";
|
|
11038
11214
|
const sid = (el, id) => {
|
|
@@ -11236,9 +11412,28 @@ var SettingsDialog = class {
|
|
|
11236
11412
|
if (this.markGroups.length > 0) {
|
|
11237
11413
|
body.append(sid(this.section("Events"), MARKS_SETTINGS_ID));
|
|
11238
11414
|
body.append(sid(this.sectionTitle("Visible events"), MARKS_GROUPS_SETTINGS_ID));
|
|
11239
|
-
|
|
11240
|
-
|
|
11415
|
+
const rowsById = /* @__PURE__ */ new Map();
|
|
11416
|
+
const rows = markGroupRows(this.markGroups);
|
|
11417
|
+
const refreshDimming = () => {
|
|
11418
|
+
for (const { group } of rows) {
|
|
11419
|
+
const el = rowsById.get(group.id);
|
|
11420
|
+
if (!el || group.parent === void 0) continue;
|
|
11421
|
+
el.classList.toggle("vela-sd-soft", !this.markGroupVisible(group.parent));
|
|
11422
|
+
}
|
|
11423
|
+
};
|
|
11424
|
+
for (const { group: g, depth } of rows) {
|
|
11425
|
+
const row = this.boolRow(g.label, this.markGroupOwnVisible(g.id), (v) => {
|
|
11426
|
+
this.emit({ marks: { groups: { [g.id]: v } } });
|
|
11427
|
+
refreshDimming();
|
|
11428
|
+
});
|
|
11429
|
+
if (depth > 0) {
|
|
11430
|
+
row.classList.add("vela-sd-nested");
|
|
11431
|
+
row.style.setProperty("--vela-sd-depth", String(depth));
|
|
11432
|
+
}
|
|
11433
|
+
rowsById.set(g.id, row);
|
|
11434
|
+
body.append(sid(row, markGroupSettingsId(g.id)));
|
|
11241
11435
|
}
|
|
11436
|
+
refreshDimming();
|
|
11242
11437
|
}
|
|
11243
11438
|
renderChartTypeSections("end");
|
|
11244
11439
|
renderHostSections("end");
|
|
@@ -11266,8 +11461,8 @@ var SettingsDialog = class {
|
|
|
11266
11461
|
if (mobile) {
|
|
11267
11462
|
railScrim = document.createElement("div");
|
|
11268
11463
|
railScrim.className = "vela-sd-railscrim";
|
|
11269
|
-
railScrim.addEventListener("click", () => toggleRail?.());
|
|
11270
|
-
toggleRail = (open) => {
|
|
11464
|
+
railScrim.addEventListener("click", () => this.toggleRail?.());
|
|
11465
|
+
this.toggleRail = (open) => {
|
|
11271
11466
|
const on = open ?? !rail.classList.contains("open");
|
|
11272
11467
|
rail.classList.toggle("open", on);
|
|
11273
11468
|
railScrim?.classList.toggle("open", on);
|
|
@@ -11307,35 +11502,6 @@ var SettingsDialog = class {
|
|
|
11307
11502
|
});
|
|
11308
11503
|
if (hidActive) activate(0);
|
|
11309
11504
|
};
|
|
11310
|
-
const ui = new Dialog({
|
|
11311
|
-
host: this.container,
|
|
11312
|
-
title: "Chart settings",
|
|
11313
|
-
// Non-modal: a live-edit dialog must leave the page interactive — a modal
|
|
11314
|
-
// machine locks pointer events on the whole body, killing the chart, the
|
|
11315
|
-
// legend, and the body-portaled popovers (color picker, select lists).
|
|
11316
|
-
modal: false,
|
|
11317
|
-
contained: true,
|
|
11318
|
-
align: "top",
|
|
11319
|
-
draggable: !mobile,
|
|
11320
|
-
flush: true,
|
|
11321
|
-
className: "vela-dialog--settings",
|
|
11322
|
-
headerStart: burger,
|
|
11323
|
-
closeOnBackdrop: true,
|
|
11324
|
-
footer: (foot) => {
|
|
11325
|
-
foot.style.cssText = `padding:10px 14px;display:flex;align-items:center;justify-content:flex-start;gap:8px;`;
|
|
11326
|
-
const resetBtn = document.createElement("button");
|
|
11327
|
-
resetBtn.type = "button";
|
|
11328
|
-
resetBtn.textContent = "Reset defaults";
|
|
11329
|
-
resetBtn.className = "vela-sd-btn";
|
|
11330
|
-
resetBtn.addEventListener("click", () => this.onReset?.());
|
|
11331
|
-
foot.appendChild(resetBtn);
|
|
11332
|
-
},
|
|
11333
|
-
onOpenChange: (open) => {
|
|
11334
|
-
if (!open) this.close();
|
|
11335
|
-
}
|
|
11336
|
-
});
|
|
11337
|
-
if (mobile) ui.positioner.classList.add("vela-sd-mobile");
|
|
11338
|
-
ui.positioner.style.paddingTop = mobile ? "0" : "8vh";
|
|
11339
11505
|
const activate = (idx) => {
|
|
11340
11506
|
panes.forEach((p, i) => {
|
|
11341
11507
|
p.el.style.display = i === idx ? "block" : "none";
|
|
@@ -11344,7 +11510,7 @@ var SettingsDialog = class {
|
|
|
11344
11510
|
this.activeSection = panes[idx]?.title ?? null;
|
|
11345
11511
|
if (mobile) {
|
|
11346
11512
|
ui.titleEl.textContent = panes[idx]?.title ?? "Chart settings";
|
|
11347
|
-
toggleRail?.(false);
|
|
11513
|
+
this.toggleRail?.(false);
|
|
11348
11514
|
}
|
|
11349
11515
|
};
|
|
11350
11516
|
panes.forEach((p, i) => {
|
|
@@ -11359,17 +11525,7 @@ var SettingsDialog = class {
|
|
|
11359
11525
|
shell.append(rail, paneHost);
|
|
11360
11526
|
if (railScrim) shell.append(railScrim);
|
|
11361
11527
|
ui.body.appendChild(shell);
|
|
11362
|
-
|
|
11363
|
-
this.ui = ui;
|
|
11364
|
-
ui.show();
|
|
11365
|
-
for (const p of panes) {
|
|
11366
|
-
const hosts = [...p.el.querySelectorAll("[data-sd-rows-host]")];
|
|
11367
|
-
if (hosts.length === 0) {
|
|
11368
|
-
this.layoutSettingsGrids(p.el);
|
|
11369
|
-
continue;
|
|
11370
|
-
}
|
|
11371
|
-
for (const h of hosts) this.layoutSettingsGrids(h);
|
|
11372
|
-
}
|
|
11528
|
+
return panes.map((p) => p.el);
|
|
11373
11529
|
}
|
|
11374
11530
|
close() {
|
|
11375
11531
|
closeOpenPopovers();
|
|
@@ -11377,6 +11533,7 @@ var SettingsDialog = class {
|
|
|
11377
11533
|
const ui = this.ui;
|
|
11378
11534
|
this.ui = null;
|
|
11379
11535
|
this.root = null;
|
|
11536
|
+
this.toggleRail = null;
|
|
11380
11537
|
this.tabs = [];
|
|
11381
11538
|
for (const dispose of this.hintTips) dispose();
|
|
11382
11539
|
this.hintTips = [];
|
|
@@ -18817,7 +18974,11 @@ var NativeRenderer = class {
|
|
|
18817
18974
|
}
|
|
18818
18975
|
this.settingsDialog.setTheme(this.theme);
|
|
18819
18976
|
this.settingsDialog.setHostSections(this.hostSettingsSections);
|
|
18820
|
-
this.settingsDialog.setMarkGroups(
|
|
18977
|
+
this.settingsDialog.setMarkGroups(
|
|
18978
|
+
this.markGroupsForEventsTab(),
|
|
18979
|
+
(id) => markGroupVisible2(this.scene.marks, id, this.scene.markGroups),
|
|
18980
|
+
(id) => markGroupOwnVisible(this.scene.marks.groups, id, this.scene.markGroups)
|
|
18981
|
+
);
|
|
18821
18982
|
this.settingsDialog.setHiddenSettings(this.hiddenSettings);
|
|
18822
18983
|
this.syncThemeControl();
|
|
18823
18984
|
this.settingsDialog.toggle(
|
|
@@ -18825,13 +18986,24 @@ var NativeRenderer = class {
|
|
|
18825
18986
|
(patch) => this.applyConfig(patch),
|
|
18826
18987
|
(json) => this.applyConfig(json),
|
|
18827
18988
|
() => {
|
|
18828
|
-
if (this.factoryConfig) this.applyConfig(
|
|
18829
|
-
this.settingsDialog?.
|
|
18830
|
-
this.openSettingsDialog();
|
|
18989
|
+
if (this.factoryConfig) this.applyConfig(this.factoryResetDocument(this.factoryConfig));
|
|
18990
|
+
this.settingsDialog?.refresh(this.getConfig());
|
|
18831
18991
|
},
|
|
18832
18992
|
section
|
|
18833
18993
|
);
|
|
18834
18994
|
}
|
|
18995
|
+
/**
|
|
18996
|
+
* The document "Reset defaults" applies: every setting back to its first-run value,
|
|
18997
|
+
* with two things that are NOT settings held or resolved here — the price style
|
|
18998
|
+
* stays the one the user is looking at, and the timeline-mark groups (an additive
|
|
18999
|
+
* merge, like the type bags) are named back to their host-declared visibility.
|
|
19000
|
+
*/
|
|
19001
|
+
factoryResetDocument(factory) {
|
|
19002
|
+
const doc = factoryResetConfig(factory, this.scene.priceStyle);
|
|
19003
|
+
const groups = { ...doc.marks.groups };
|
|
19004
|
+
for (const g of this.markGroupsInUse()) groups[g.id] = g.visible !== false;
|
|
19005
|
+
return { ...doc, marks: { ...doc.marks, groups } };
|
|
19006
|
+
}
|
|
18835
19007
|
/** Close the in-chart dialogs (indicator settings + chart-settings gear). No-op when none are open. */
|
|
18836
19008
|
closeDialogs() {
|
|
18837
19009
|
this.inputsUI?.closeOpenDialog();
|
|
@@ -19894,6 +20066,15 @@ var NativeRenderer = class {
|
|
|
19894
20066
|
markGroupsInUse() {
|
|
19895
20067
|
return effectiveMarkGroups(this.scene.timelineMarks, this.scene.markGroups);
|
|
19896
20068
|
}
|
|
20069
|
+
/**
|
|
20070
|
+
* The groups as the Events tab lists them: nested only under a DEFINED parent. The
|
|
20071
|
+
* painter's visibility chain resolves parents against the defined groups alone, so a
|
|
20072
|
+
* parent that marks merely name must not nest (and dim) a child the painter still shows.
|
|
20073
|
+
*/
|
|
20074
|
+
markGroupsForEventsTab() {
|
|
20075
|
+
const defined = new Set(this.scene.markGroups.map((g) => g.id));
|
|
20076
|
+
return this.markGroupsInUse().map((g) => g.parent !== void 0 && !defined.has(g.parent) ? { ...g, parent: void 0 } : g);
|
|
20077
|
+
}
|
|
19897
20078
|
onViewportChange(cb) {
|
|
19898
20079
|
this.viewportCbs.add(cb);
|
|
19899
20080
|
return () => this.viewportCbs.delete(cb);
|
|
@@ -20852,7 +21033,7 @@ var NativeRenderer = class {
|
|
|
20852
21033
|
const or = overlaySeriesRange(this.scene.indicators.values(), i0, i1, (id) => this.scene.offsetOf(id));
|
|
20853
21034
|
if (or) dr = dr ? { min: Math.min(dr.min, or.min), max: Math.max(dr.max, or.max) } : or;
|
|
20854
21035
|
}
|
|
20855
|
-
const includeCandles = pane.kind === "price" && (!this.scene.candlesHidden || this.priceLayersAnchoredToBars(masterModels));
|
|
21036
|
+
const includeCandles = pane.kind === "price" && (!this.scene.candlesHidden || this.priceLayersAnchoredToBars(masterModels) || !this.paneHasMeasurableContent(masterModels, dr));
|
|
20856
21037
|
pane.scaleTarget = computePaneScale(masterModels, this.bars, includeCandles, i0, i1, dr, paneLogScale(this.scene, pane), (id) => this.scene.offsetOf(id));
|
|
20857
21038
|
pane.percentBaseline = pane.kind === "price" ? this.bars[i0]?.close ?? 0 : this.firstVisibleValue(masterModels, i0);
|
|
20858
21039
|
pane.axisFormat = void 0;
|
|
@@ -21102,6 +21283,13 @@ var NativeRenderer = class {
|
|
|
21102
21283
|
priceLayersAnchoredToBars(masterModels) {
|
|
21103
21284
|
return masterModels.some((m) => m.series.length === 0 && !!m.native && this.extLayers.some((l) => l.def.id === m.native.type));
|
|
21104
21285
|
}
|
|
21286
|
+
/** True when the pane's master content contributes SOMETHING to its autoscale besides
|
|
21287
|
+
* the candles: a series painted on the pane (force_overlay ones scale elsewhere), a
|
|
21288
|
+
* price line, or a measured drawings range. Mirrors what `computePaneScale` considers. */
|
|
21289
|
+
paneHasMeasurableContent(masterModels, drawings) {
|
|
21290
|
+
if (drawings) return true;
|
|
21291
|
+
return masterModels.some((m) => m.priceLines.length > 0 || m.series.some((s) => s.overlay !== true));
|
|
21292
|
+
}
|
|
21105
21293
|
/** Per-pane scale state for a host UI (e.g. a price-axis context menu): the pane's pixel
|
|
21106
21294
|
* band (`top`/`height`, so a click y maps to a pane) plus its current axis `mode`/`log`.
|
|
21107
21295
|
* Top-to-bottom order. Every pane is independent — the price pane from the scene setting,
|
|
@@ -21758,6 +21946,7 @@ var MarksController = class {
|
|
|
21758
21946
|
defineGroup(group) {
|
|
21759
21947
|
if (!group || typeof group.id !== "string" || group.id.length === 0) throw new Error("[vela] marks.defineGroup: `id` must be a non-empty string");
|
|
21760
21948
|
if (typeof group.label !== "string") throw new Error(`[vela] marks.defineGroup: group "${group.id}" needs a string \`label\``);
|
|
21949
|
+
if (group.parent !== void 0 && (typeof group.parent !== "string" || group.parent.length === 0)) throw new Error(`[vela] marks.defineGroup: group "${group.id}" has a \`parent\` that is not a group id`);
|
|
21761
21950
|
this.groups.set(group.id, { ...group });
|
|
21762
21951
|
this.sync();
|
|
21763
21952
|
}
|
|
@@ -21777,12 +21966,16 @@ var MarksController = class {
|
|
|
21777
21966
|
}
|
|
21778
21967
|
this.renderer.applyFeature("marks", { groups: { [id]: visible } });
|
|
21779
21968
|
}
|
|
21780
|
-
/**
|
|
21969
|
+
/**
|
|
21970
|
+
* A group's effective visibility: its own switch — the user's (persisted) choice, else
|
|
21971
|
+
* the declared default, else visible — AND every ancestor's, so a child under a
|
|
21972
|
+
* switched-off parent reads hidden whatever its own choice says.
|
|
21973
|
+
*/
|
|
21781
21974
|
isGroupVisible(id) {
|
|
21782
21975
|
const state = this.renderer.readFeature("marks");
|
|
21783
|
-
const
|
|
21784
|
-
if (typeof
|
|
21785
|
-
return this.groups.
|
|
21976
|
+
const groups = {};
|
|
21977
|
+
for (const [gid, v] of Object.entries(state?.groups ?? {})) if (typeof v === "boolean") groups[gid] = v;
|
|
21978
|
+
return markGroupVisible(groups, id, [...this.groups.values()]);
|
|
21786
21979
|
}
|
|
21787
21980
|
destroy() {
|
|
21788
21981
|
for (const unsub of this.subs) unsub();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { parseSymbol, priceStyleIds, BUILTIN_PRICE_STYLES, tzButtonLabel, SecondClock, TIMEZONES, normalizeTimezone, tzMenuLabel, isGroupRow, defaultMemberOf, groupKeyOf, groupMembers, LEGEND_AT_TOP_ATTR, normalizeSession, Vela, TypedEventBus, MultiProviderFeed, registerBuiltinChartTypes, resolveTheme, buildToolbar, createCustomMark, createAttributionMark, DrawingToolbar, applyAttributionMarkTheme, sharedBarStore, timeframeToMs } from './chunk-
|
|
1
|
+
import { parseSymbol, priceStyleIds, BUILTIN_PRICE_STYLES, tzButtonLabel, SecondClock, TIMEZONES, normalizeTimezone, tzMenuLabel, isGroupRow, defaultMemberOf, groupKeyOf, groupMembers, LEGEND_AT_TOP_ATTR, normalizeSession, Vela, TypedEventBus, MultiProviderFeed, registerBuiltinChartTypes, resolveTheme, buildToolbar, createCustomMark, createAttributionMark, DrawingToolbar, applyAttributionMarkTheme, sharedBarStore, timeframeToMs } from './chunk-MCLI6B3S.js';
|
|
2
2
|
import { chartType, resolveTopbarComposition, topbarActionOverride, TOPBAR_BUILTIN_IDS, widgetActions, SidePanel, sidePanels, DEFAULT_PANEL_ORDER, symbolRanking, resolveEngines, legendActionsProviderFor, legendCalloutsProviderFor, statePersistenceHandlers, topbarHas, rendererDefaults, widgetAttachments, getDrawingType, inputDeltas } from './chunk-BFA32GOU.js';
|
|
3
3
|
import { Tooltip, KeymapManager, isEditableTarget, Drawer } from './chunk-ZADTVRUO.js';
|
|
4
4
|
import { Menu, Dialog, CalloutBubble, applyPlotOverlayTokens, ensureUIHost } from './chunk-BKHSQ4YM.js';
|
|
@@ -5644,6 +5644,11 @@ var ChartCell = class {
|
|
|
5644
5644
|
if (typeof zone === "string" && normalizeTimezone(zone) !== normalizeTimezone(this.deps.timezone())) {
|
|
5645
5645
|
this.deps.setTimezone(normalizeTimezone(zone));
|
|
5646
5646
|
}
|
|
5647
|
+
const style = this.priceStyle;
|
|
5648
|
+
if (style !== (this.state.priceStyle ?? "candles")) {
|
|
5649
|
+
this.state.priceStyle = style;
|
|
5650
|
+
this.deps.onPriceStyleChanged(this.id);
|
|
5651
|
+
}
|
|
5647
5652
|
this.syncStatuslineColors();
|
|
5648
5653
|
this.syncPlotOverlayTokens();
|
|
5649
5654
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { x as Millis, an as InputSchema, al as IndicatorMeta, P as PriceStyle, O as OHLCV, I as InputValue, l as IndicatorModel, k as MoveTarget, aH as PaneAxis, aW as SeriesSpec, aj as Fill, G as Background, aM as PriceLine, a6 as DrawingLine, a2 as DrawingBox, a5 as DrawingLabel, aa as DrawingPolyline, a7 as DrawingLinefill, af as DrawingTable, h as IndicatorStatus, a as VisibleRange, c as VelaTheme, S as SerializedDrawing, z as DrawingTypeKey, y as SnapMode, a8 as DrawingMode, u as MarkClickEvent, e as IChartRenderer, R as RendererCapabilities, o as LegendActionView, p as LegendCalloutView, U as Unsubscribe, C as CrosshairEvent, A as AxisLongPressEvent, v as DataWindowReadout, n as SymbolPickerFn, W as WallClock, bc as PaneInfo, ai as DrawingsOption, ac as DrawingSeriesGateway, D as Drawing, s as TimelineMark, t as MarkGroup, b as VelaOptions, E as AddIndicatorOptions, aG as MarketSwitch, aF as MarketSnapshot, V as VisibleRangePreset, T as ThemeName } from './options-
|
|
2
|
-
import { S as SymbolInfo, B as BarRange, M as MarketDataFeed, D as DataProvider, P as ProviderInfo, a as SymbolDescriptor, b as ProviderCapabilities } from './DataProvider-
|
|
1
|
+
import { x as Millis, an as InputSchema, al as IndicatorMeta, P as PriceStyle, O as OHLCV, I as InputValue, l as IndicatorModel, k as MoveTarget, aH as PaneAxis, aW as SeriesSpec, aj as Fill, G as Background, aM as PriceLine, a6 as DrawingLine, a2 as DrawingBox, a5 as DrawingLabel, aa as DrawingPolyline, a7 as DrawingLinefill, af as DrawingTable, h as IndicatorStatus, a as VisibleRange, c as VelaTheme, S as SerializedDrawing, z as DrawingTypeKey, y as SnapMode, a8 as DrawingMode, u as MarkClickEvent, e as IChartRenderer, R as RendererCapabilities, o as LegendActionView, p as LegendCalloutView, U as Unsubscribe, C as CrosshairEvent, A as AxisLongPressEvent, v as DataWindowReadout, n as SymbolPickerFn, W as WallClock, bc as PaneInfo, ai as DrawingsOption, ac as DrawingSeriesGateway, D as Drawing, s as TimelineMark, t as MarkGroup, b as VelaOptions, E as AddIndicatorOptions, aG as MarketSwitch, aF as MarketSnapshot, V as VisibleRangePreset, T as ThemeName } from './options-DNBoMKkX.js';
|
|
2
|
+
import { S as SymbolInfo, B as BarRange, M as MarketDataFeed, D as DataProvider, P as ProviderInfo, a as SymbolDescriptor, b as ProviderCapabilities } from './DataProvider-DLeFs1gE.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* A strategy's broker state at ONE bar — the flat summary a host reads while a script
|
|
@@ -1391,7 +1391,11 @@ declare class MarksController {
|
|
|
1391
1391
|
* a persisted chart restores — so it warns + no-ops on a renderer without it.
|
|
1392
1392
|
*/
|
|
1393
1393
|
setGroupVisible(id: string, visible: boolean): void;
|
|
1394
|
-
/**
|
|
1394
|
+
/**
|
|
1395
|
+
* A group's effective visibility: its own switch — the user's (persisted) choice, else
|
|
1396
|
+
* the declared default, else visible — AND every ancestor's, so a child under a
|
|
1397
|
+
* switched-off parent reads hidden whatever its own choice says.
|
|
1398
|
+
*/
|
|
1395
1399
|
isGroupVisible(id: string): boolean;
|
|
1396
1400
|
destroy(): void;
|
|
1397
1401
|
private sync;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { x as Millis, an as InputSchema, al as IndicatorMeta, P as PriceStyle, O as OHLCV, I as InputValue, l as IndicatorModel, k as MoveTarget, aH as PaneAxis, aW as SeriesSpec, aj as Fill, G as Background, aM as PriceLine, a6 as DrawingLine, a2 as DrawingBox, a5 as DrawingLabel, aa as DrawingPolyline, a7 as DrawingLinefill, af as DrawingTable, h as IndicatorStatus, a as VisibleRange, c as VelaTheme, S as SerializedDrawing, z as DrawingTypeKey, y as SnapMode, a8 as DrawingMode, u as MarkClickEvent, e as IChartRenderer, R as RendererCapabilities, o as LegendActionView, p as LegendCalloutView, U as Unsubscribe, C as CrosshairEvent, A as AxisLongPressEvent, v as DataWindowReadout, n as SymbolPickerFn, W as WallClock, bc as PaneInfo, ai as DrawingsOption, ac as DrawingSeriesGateway, D as Drawing, s as TimelineMark, t as MarkGroup, b as VelaOptions, E as AddIndicatorOptions, aG as MarketSwitch, aF as MarketSnapshot, V as VisibleRangePreset, T as ThemeName } from './options-
|
|
2
|
-
import { S as SymbolInfo, B as BarRange, M as MarketDataFeed, D as DataProvider, P as ProviderInfo, a as SymbolDescriptor, b as ProviderCapabilities } from './DataProvider-
|
|
1
|
+
import { x as Millis, an as InputSchema, al as IndicatorMeta, P as PriceStyle, O as OHLCV, I as InputValue, l as IndicatorModel, k as MoveTarget, aH as PaneAxis, aW as SeriesSpec, aj as Fill, G as Background, aM as PriceLine, a6 as DrawingLine, a2 as DrawingBox, a5 as DrawingLabel, aa as DrawingPolyline, a7 as DrawingLinefill, af as DrawingTable, h as IndicatorStatus, a as VisibleRange, c as VelaTheme, S as SerializedDrawing, z as DrawingTypeKey, y as SnapMode, a8 as DrawingMode, u as MarkClickEvent, e as IChartRenderer, R as RendererCapabilities, o as LegendActionView, p as LegendCalloutView, U as Unsubscribe, C as CrosshairEvent, A as AxisLongPressEvent, v as DataWindowReadout, n as SymbolPickerFn, W as WallClock, bc as PaneInfo, ai as DrawingsOption, ac as DrawingSeriesGateway, D as Drawing, s as TimelineMark, t as MarkGroup, b as VelaOptions, E as AddIndicatorOptions, aG as MarketSwitch, aF as MarketSnapshot, V as VisibleRangePreset, T as ThemeName } from './options-DNBoMKkX.cjs';
|
|
2
|
+
import { S as SymbolInfo, B as BarRange, M as MarketDataFeed, D as DataProvider, P as ProviderInfo, a as SymbolDescriptor, b as ProviderCapabilities } from './DataProvider-Dut6lXGM.cjs';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* A strategy's broker state at ONE bar — the flat summary a host reads while a script
|
|
@@ -1391,7 +1391,11 @@ declare class MarksController {
|
|
|
1391
1391
|
* a persisted chart restores — so it warns + no-ops on a renderer without it.
|
|
1392
1392
|
*/
|
|
1393
1393
|
setGroupVisible(id: string, visible: boolean): void;
|
|
1394
|
-
/**
|
|
1394
|
+
/**
|
|
1395
|
+
* A group's effective visibility: its own switch — the user's (persisted) choice, else
|
|
1396
|
+
* the declared default, else visible — AND every ancestor's, so a child under a
|
|
1397
|
+
* switched-off parent reads hidden whatever its own choice says.
|
|
1398
|
+
*/
|
|
1395
1399
|
isGroupVisible(id: string): boolean;
|
|
1396
1400
|
destroy(): void;
|
|
1397
1401
|
private sync;
|