@luxalgo/vela 0.7.4 → 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.
Files changed (37) hide show
  1. package/dist/{DataProvider-CVpN5sCq.d.ts → DataProvider-DLeFs1gE.d.ts} +1 -1
  2. package/dist/{DataProvider-RF1axuy1.d.cts → DataProvider-Dut6lXGM.d.cts} +1 -1
  3. package/dist/{chunk-DUURH3RN.js → chunk-MCLI6B3S.js} +226 -66
  4. package/dist/{chunk-CSFNKXUW.js → chunk-MNG5XPLV.js} +6 -1
  5. package/dist/{contributions-CspPrMAJ.d.ts → contributions-CEkgJKTU.d.ts} +7 -3
  6. package/dist/{contributions-DpZeu7KP.d.cts → contributions-DYtiRtES.d.cts} +7 -3
  7. package/dist/index.cjs +226 -66
  8. package/dist/index.d.cts +19 -6
  9. package/dist/index.d.ts +19 -6
  10. package/dist/index.js +1 -1
  11. package/dist/{options-XVpfr9HV.d.cts → options-DNBoMKkX.d.cts} +8 -0
  12. package/dist/{options-XVpfr9HV.d.ts → options-DNBoMKkX.d.ts} +8 -0
  13. package/dist/{plugin-BoLOkblF.d.ts → plugin-CLn--oP6.d.ts} +3 -3
  14. package/dist/{plugin-D07HD2GL.d.cts → plugin-DtkeQVAO.d.cts} +3 -3
  15. package/dist/plugin.d.cts +4 -4
  16. package/dist/plugin.d.ts +4 -4
  17. package/dist/providers/binance.d.cts +2 -2
  18. package/dist/providers/binance.d.ts +2 -2
  19. package/dist/providers/coinbase.d.cts +2 -2
  20. package/dist/providers/coinbase.d.ts +2 -2
  21. package/dist/providers/hyperliquid.d.cts +2 -2
  22. package/dist/providers/hyperliquid.d.ts +2 -2
  23. package/dist/{statusline-model-CPa_hmhd.d.ts → statusline-model-DypGXjtr.d.ts} +3 -3
  24. package/dist/{statusline-model-Bd4qKuD6.d.cts → statusline-model-gA__yaog.d.cts} +3 -3
  25. package/dist/ui.d.cts +1 -1
  26. package/dist/ui.d.ts +1 -1
  27. package/dist/vela.global.js +226 -66
  28. package/dist/vela.global.min.js +53 -49
  29. package/dist/widget.cjs +231 -66
  30. package/dist/widget.d.cts +6 -6
  31. package/dist/widget.d.ts +6 -6
  32. package/dist/widget.js +3 -3
  33. package/dist/workspace.cjs +231 -66
  34. package/dist/workspace.d.cts +5 -5
  35. package/dist/workspace.d.ts +5 -5
  36. package/dist/workspace.js +2 -2
  37. package/package.json +1 -1
package/dist/index.cjs CHANGED
@@ -7140,6 +7140,42 @@ var DrawingController = class {
7140
7140
  }
7141
7141
  };
7142
7142
 
7143
+ // src/core/marks/visibility.ts
7144
+ function markGroupOwnVisible(choices, groupId, groups) {
7145
+ const chosen = choices[groupId];
7146
+ if (typeof chosen === "boolean") return chosen;
7147
+ return groups.find((g) => g.id === groupId)?.visible !== false;
7148
+ }
7149
+ function markGroupVisible(choices, groupId, groups) {
7150
+ if (groupId === void 0) return true;
7151
+ const seen = /* @__PURE__ */ new Set();
7152
+ let id = groupId;
7153
+ while (id !== void 0 && !seen.has(id)) {
7154
+ seen.add(id);
7155
+ if (!markGroupOwnVisible(choices, id, groups)) return false;
7156
+ const parent = groups.find((g) => g.id === id)?.parent;
7157
+ id = parent !== void 0 && groups.some((g) => g.id === parent) ? parent : void 0;
7158
+ }
7159
+ return true;
7160
+ }
7161
+ function markGroupRows(groups) {
7162
+ const ids = new Set(groups.map((g) => g.id));
7163
+ const out = [];
7164
+ const placed = /* @__PURE__ */ new Set();
7165
+ const place = (group, depth) => {
7166
+ if (placed.has(group.id)) return;
7167
+ placed.add(group.id);
7168
+ out.push({ group, depth });
7169
+ for (const child of groups) if (child.parent === group.id && child.id !== group.id) place(child, depth + 1);
7170
+ };
7171
+ for (const g of groups) {
7172
+ const parentKnown = g.parent !== void 0 && ids.has(g.parent) && g.parent !== g.id;
7173
+ if (!parentKnown) place(g, 0);
7174
+ }
7175
+ for (const g of groups) place(g, 0);
7176
+ return out;
7177
+ }
7178
+
7143
7179
  // src/core/marks/MarksController.ts
7144
7180
  var MarksController = class {
7145
7181
  constructor(renderer, events) {
@@ -7184,6 +7220,7 @@ var MarksController = class {
7184
7220
  defineGroup(group) {
7185
7221
  if (!group || typeof group.id !== "string" || group.id.length === 0) throw new Error("[vela] marks.defineGroup: `id` must be a non-empty string");
7186
7222
  if (typeof group.label !== "string") throw new Error(`[vela] marks.defineGroup: group "${group.id}" needs a string \`label\``);
7223
+ 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`);
7187
7224
  this.groups.set(group.id, { ...group });
7188
7225
  this.sync();
7189
7226
  }
@@ -7203,12 +7240,16 @@ var MarksController = class {
7203
7240
  }
7204
7241
  this.renderer.applyFeature("marks", { groups: { [id]: visible } });
7205
7242
  }
7206
- /** A group's effective visibility: the user's (persisted) choice, else the group's declared default, else visible. */
7243
+ /**
7244
+ * A group's effective visibility: its own switch — the user's (persisted) choice, else
7245
+ * the declared default, else visible — AND every ancestor's, so a child under a
7246
+ * switched-off parent reads hidden whatever its own choice says.
7247
+ */
7207
7248
  isGroupVisible(id) {
7208
7249
  const state = this.renderer.readFeature("marks");
7209
- const chosen = state?.groups?.[id];
7210
- if (typeof chosen === "boolean") return chosen;
7211
- return this.groups.get(id)?.visible !== false;
7250
+ const groups = {};
7251
+ for (const [gid, v] of Object.entries(state?.groups ?? {})) if (typeof v === "boolean") groups[gid] = v;
7252
+ return markGroupVisible(groups, id, [...this.groups.values()]);
7212
7253
  }
7213
7254
  destroy() {
7214
7255
  for (const unsub of this.subs) unsub();
@@ -15958,6 +15999,17 @@ function hasOwnCandlePaint(style) {
15958
15999
  for (const t of chartTypes()) if (t.id === style) return (t.basePainting ?? "candles") === "candles";
15959
16000
  return false;
15960
16001
  }
16002
+ var CANDLE_OVERRIDE_KEYS = [
16003
+ "candleUpColor",
16004
+ "candleDownColor",
16005
+ "candleBodyVisible",
16006
+ "candleBorderVisible",
16007
+ "candleBorderUpColor",
16008
+ "candleBorderDownColor",
16009
+ "candleWickVisible",
16010
+ "candleWickUpColor",
16011
+ "candleWickDownColor"
16012
+ ];
15961
16013
  function candleOverrideFor(style, bags) {
15962
16014
  if (!hasOwnCandlePaint(style)) return null;
15963
16015
  const bag = bags[style] ?? {};
@@ -16029,7 +16081,7 @@ function clampLevel(v) {
16029
16081
  function clampSpacing(v) {
16030
16082
  return v < 0.1 ? 0.1 : v > 10 ? 10 : v;
16031
16083
  }
16032
- function factoryResetConfig(factory) {
16084
+ function factoryResetConfig(factory, priceStyle = factory.series.style) {
16033
16085
  const bag = {};
16034
16086
  for (const t of chartTypes()) {
16035
16087
  const section = t.settings;
@@ -16051,10 +16103,16 @@ function factoryResetConfig(factory) {
16051
16103
  if (!section.instances) addRows(section.rows);
16052
16104
  bag[t.id] = defaults2;
16053
16105
  }
16106
+ for (const t of chartTypes()) {
16107
+ if (!hasOwnCandlePaint(t.id)) continue;
16108
+ const defaults2 = bag[t.id] ?? {};
16109
+ for (const key of CANDLE_OVERRIDE_KEYS) defaults2[key] = null;
16110
+ bag[t.id] = defaults2;
16111
+ }
16054
16112
  for (const [typeId, vals] of Object.entries(factory.chartTypes)) {
16055
16113
  bag[typeId] = { ...bag[typeId] ?? {}, ...vals };
16056
16114
  }
16057
- return { ...factory, chartTypes: bag };
16115
+ return { ...factory, chartTypes: bag, series: { ...factory.series, style: priceStyle } };
16058
16116
  }
16059
16117
  function mergeConfig(base, patch) {
16060
16118
  const p = asObject(patch);
@@ -18433,11 +18491,8 @@ function mergeMarksState(base, patch) {
18433
18491
  for (const [id, v] of Object.entries(g)) if (typeof v === "boolean") groups[id] = v;
18434
18492
  return { visible: typeof p.visible === "boolean" ? p.visible : base.visible, groups };
18435
18493
  }
18436
- function markGroupVisible(state, groupId, groups) {
18437
- if (groupId === void 0) return true;
18438
- const chosen = state.groups[groupId];
18439
- if (typeof chosen === "boolean") return chosen;
18440
- return groups.find((g) => g.id === groupId)?.visible !== false;
18494
+ function markGroupVisible2(state, groupId, groups) {
18495
+ return markGroupVisible(state.groups, groupId, groups);
18441
18496
  }
18442
18497
 
18443
18498
  // src/renderers/native/core/SceneGraph.ts
@@ -20613,13 +20668,29 @@ function paintMarkLane(ctx, layout, deps) {
20613
20668
  const img = deps.icons.get(mark.glyph.icon, ink, symbolPx, deps.dpr);
20614
20669
  if (img) ctx.drawImage(img, center.x - symbolPx / 2, center.y - symbolPx / 2, symbolPx, symbolPx);
20615
20670
  } else if (mark.glyph.letter) {
20671
+ const letter = mark.glyph.letter.slice(0, 2);
20616
20672
  ctx.fillStyle = ink;
20617
- ctx.font = `600 ${Math.round(size * 0.58)}px ${deps.fontFamily}`;
20618
- ctx.fillText(mark.glyph.letter.slice(0, 2), center.x, center.y + 0.5);
20673
+ let px = letterFontPx(size, letter);
20674
+ ctx.font = `600 ${px}px ${deps.fontFamily}`;
20675
+ if (letter.length > 1) {
20676
+ px = fitLetterPx(px, ctx.measureText(letter).width, symbolInnerWidth(shape, size));
20677
+ ctx.font = `600 ${px}px ${deps.fontFamily}`;
20678
+ }
20679
+ ctx.fillText(letter, center.x, center.y + 0.5);
20619
20680
  }
20620
20681
  }
20621
20682
  ctx.restore();
20622
20683
  }
20684
+ function letterFontPx(size, letter) {
20685
+ return Math.round(size * (letter.length > 1 ? 0.38 : 0.58));
20686
+ }
20687
+ function symbolInnerWidth(shape, size) {
20688
+ return (shape === "pin" ? size * 0.82 : size) - 3;
20689
+ }
20690
+ function fitLetterPx(px, width, inner) {
20691
+ if (!(width > inner) || !(width > 0)) return px;
20692
+ return Math.max(4, Math.floor(px * inner / width));
20693
+ }
20623
20694
  function traceShape(ctx, shape, x, y, size) {
20624
20695
  const r = size / 2;
20625
20696
  ctx.beginPath();
@@ -20821,7 +20892,7 @@ var ChromeRenderer = class {
20821
20892
  this.markLayout = layoutMarkLane({
20822
20893
  marks: scene.timelineMarks,
20823
20894
  groups: scene.markGroups,
20824
- hidden: (groupId) => !markGroupVisible(scene.marks, groupId, scene.markGroups),
20895
+ hidden: (groupId) => !markGroupVisible2(scene.marks, groupId, scene.markGroups),
20825
20896
  barTimes: this.barTimes(scene),
20826
20897
  intervalMs: coords.barInterval,
20827
20898
  xOf: (bar) => coords.logicalToX(bar),
@@ -21588,6 +21659,10 @@ ${overlayScrollbarCss(".vela-sd-pane")}
21588
21659
  muted and non-interactive. Applied to each row's children so it survives display:contents;
21589
21660
  !important beats the inline opacity on labels. */
21590
21661
  .vela-sd-soft>*{opacity:0.4 !important;pointer-events:none !important;}
21662
+ /* A mark group nested under a parent group on the Events tab: indented one step per level
21663
+ (--vela-sd-depth). The indent rides the first child (the switch) as a MARGIN \u2014 padding
21664
+ would push the switch's own tick out of its box. */
21665
+ .vela-sd-nested>*:first-child{margin-left:calc(var(--vela-sd-depth,1)*24px);}
21591
21666
  /* \u2500\u2500 mobile presentation (.vela-sd-mobile on the scrim; structural sizes are inline in open()) \u2500\u2500
21592
21667
  The tab rail becomes a burger-opened overlay sidebar; the group TOC becomes a sticky
21593
21668
  row of horizontally scrollable tabs; the instance strip scrolls instead of wrapping;
@@ -21636,6 +21711,8 @@ var SettingsDialog = class {
21636
21711
  this.hostSections = [];
21637
21712
  /** The timeline-mark groups (defined + named by marks) — one checkbox each on the Events tab. */
21638
21713
  this.markGroups = [];
21714
+ /** A group's OWN switch (what its checkbox shows) — a child under an off parent keeps its own state. */
21715
+ this.markGroupOwnVisible = () => true;
21639
21716
  this.markGroupVisible = () => true;
21640
21717
  /** The Canvas → Theme row: current app theme + where a pick is raised. The row is a
21641
21718
  * host callback, NOT a config patch — the app theme stays out of the persisted
@@ -21653,6 +21730,9 @@ var SettingsDialog = class {
21653
21730
  this.activeSection = null;
21654
21731
  /** Mobile chrome: fullscreen card, burger-opened section sidebar, TOC as top tabs. */
21655
21732
  this.mobileLayout = false;
21733
+ /** Opens/closes the mobile section sidebar of the CURRENT build (the burger in the
21734
+ * shell header outlives pane rebuilds, so it reaches the rail through here). */
21735
+ this.toggleRail = null;
21656
21736
  /** The visibility policy: setting ids hidden by the host (subtree semantics). */
21657
21737
  this.hiddenSettings = /* @__PURE__ */ new Set();
21658
21738
  if (getComputedStyle(container).position === "static") container.style.position = "relative";
@@ -21662,7 +21742,8 @@ var SettingsDialog = class {
21662
21742
  this.hostSections = sections;
21663
21743
  }
21664
21744
  /** The timeline-mark groups and their current visibility — the Events tab's rows on next open. */
21665
- setMarkGroups(groups, visible) {
21745
+ setMarkGroups(groups, visible, ownVisible = visible) {
21746
+ this.markGroupOwnVisible = ownVisible;
21666
21747
  this.markGroups = groups;
21667
21748
  this.markGroupVisible = visible;
21668
21749
  }
@@ -21728,7 +21809,6 @@ var SettingsDialog = class {
21728
21809
  this.onReset = onReset ?? null;
21729
21810
  ensureControlStyles();
21730
21811
  const mobile = this.mobileLayout;
21731
- let toggleRail = null;
21732
21812
  let burger;
21733
21813
  if (mobile) {
21734
21814
  burger = document.createElement("button");
@@ -21736,8 +21816,83 @@ var SettingsDialog = class {
21736
21816
  burger.className = "vela-sd-burger";
21737
21817
  burger.innerHTML = iconAt("burger", 16);
21738
21818
  burger.title = "Sections";
21739
- burger.addEventListener("click", () => toggleRail?.());
21819
+ burger.addEventListener("click", () => this.toggleRail?.());
21740
21820
  }
21821
+ const ui = new Dialog({
21822
+ host: this.container,
21823
+ title: "Chart settings",
21824
+ // Non-modal: a live-edit dialog must leave the page interactive — a modal
21825
+ // machine locks pointer events on the whole body, killing the chart, the
21826
+ // legend, and the body-portaled popovers (color picker, select lists).
21827
+ modal: false,
21828
+ contained: true,
21829
+ align: "top",
21830
+ draggable: !mobile,
21831
+ flush: true,
21832
+ className: "vela-dialog--settings",
21833
+ headerStart: burger,
21834
+ closeOnBackdrop: true,
21835
+ footer: (foot) => {
21836
+ foot.style.cssText = `padding:10px 14px;display:flex;align-items:center;justify-content:flex-start;gap:8px;`;
21837
+ const resetBtn = document.createElement("button");
21838
+ resetBtn.type = "button";
21839
+ resetBtn.textContent = "Reset defaults";
21840
+ resetBtn.className = "vela-sd-btn";
21841
+ resetBtn.addEventListener("click", () => this.onReset?.());
21842
+ foot.appendChild(resetBtn);
21843
+ },
21844
+ // A close signal may only close ITS OWN dialog: the machine reports the exit
21845
+ // asynchronously, so a close-then-reopen in one tick would otherwise see the
21846
+ // old instance's signal tear down the freshly opened one.
21847
+ onOpenChange: (open2) => {
21848
+ if (!open2 && this.ui === ui) this.close();
21849
+ }
21850
+ });
21851
+ if (mobile) ui.positioner.classList.add("vela-sd-mobile");
21852
+ ui.positioner.style.paddingTop = mobile ? "0" : "8vh";
21853
+ this.root = ui.positioner;
21854
+ this.ui = ui;
21855
+ const panes = this.buildContent(ui, config, section, mobile);
21856
+ ui.show();
21857
+ this.layoutPanes(panes);
21858
+ }
21859
+ /**
21860
+ * Re-seed every control of an OPEN dialog from `config`, in place: the shell stays
21861
+ * (no close/open transition), only the tab rail and panes rebuild, landing back on
21862
+ * the current tab. The reset path — the restored values must show without the
21863
+ * dialog re-entering. No-op while closed.
21864
+ */
21865
+ refresh(config) {
21866
+ const ui = this.ui;
21867
+ if (!ui) return;
21868
+ closeOpenPopovers();
21869
+ closeWidthPopover();
21870
+ for (const dispose of this.hintTips) dispose();
21871
+ this.hintTips = [];
21872
+ this.config = config;
21873
+ ui.body.replaceChildren();
21874
+ this.layoutPanes(this.buildContent(ui, config, this.activeSection ?? void 0, this.mobileLayout));
21875
+ }
21876
+ /** Structured chart-type panes (instance strip / group TOC) own their layout and
21877
+ * tag their rows hosts instead; each host gets its own field grid. Runs on a SHOWN
21878
+ * dialog — the grids measure their labels. */
21879
+ layoutPanes(panes) {
21880
+ for (const el of panes) {
21881
+ const hosts = [...el.querySelectorAll("[data-sd-rows-host]")];
21882
+ if (hosts.length === 0) {
21883
+ this.layoutSettingsGrids(el);
21884
+ continue;
21885
+ }
21886
+ for (const h of hosts) this.layoutSettingsGrids(h);
21887
+ }
21888
+ }
21889
+ /**
21890
+ * Build the tab rail + one pane per section into `ui.body` (the linear `body` of
21891
+ * section markers and rows is split afterwards), select `section` (the active
21892
+ * style's own tab when none is asked for), and return the pane elements for
21893
+ * {@link layoutPanes}.
21894
+ */
21895
+ buildContent(ui, config, section, mobile) {
21741
21896
  const body = document.createElement("div");
21742
21897
  body.style.cssText = "display:flex;flex-direction:column;gap:0;";
21743
21898
  const sid = (el, id) => {
@@ -21941,9 +22096,28 @@ var SettingsDialog = class {
21941
22096
  if (this.markGroups.length > 0) {
21942
22097
  body.append(sid(this.section("Events"), MARKS_SETTINGS_ID));
21943
22098
  body.append(sid(this.sectionTitle("Visible events"), MARKS_GROUPS_SETTINGS_ID));
21944
- for (const g of this.markGroups) {
21945
- body.append(sid(this.boolRow(g.label, this.markGroupVisible(g.id), (v) => this.emit({ marks: { groups: { [g.id]: v } } })), markGroupSettingsId(g.id)));
22099
+ const rowsById = /* @__PURE__ */ new Map();
22100
+ const rows = markGroupRows(this.markGroups);
22101
+ const refreshDimming = () => {
22102
+ for (const { group } of rows) {
22103
+ const el = rowsById.get(group.id);
22104
+ if (!el || group.parent === void 0) continue;
22105
+ el.classList.toggle("vela-sd-soft", !this.markGroupVisible(group.parent));
22106
+ }
22107
+ };
22108
+ for (const { group: g, depth } of rows) {
22109
+ const row = this.boolRow(g.label, this.markGroupOwnVisible(g.id), (v) => {
22110
+ this.emit({ marks: { groups: { [g.id]: v } } });
22111
+ refreshDimming();
22112
+ });
22113
+ if (depth > 0) {
22114
+ row.classList.add("vela-sd-nested");
22115
+ row.style.setProperty("--vela-sd-depth", String(depth));
22116
+ }
22117
+ rowsById.set(g.id, row);
22118
+ body.append(sid(row, markGroupSettingsId(g.id)));
21946
22119
  }
22120
+ refreshDimming();
21947
22121
  }
21948
22122
  renderChartTypeSections("end");
21949
22123
  renderHostSections("end");
@@ -21971,8 +22145,8 @@ var SettingsDialog = class {
21971
22145
  if (mobile) {
21972
22146
  railScrim = document.createElement("div");
21973
22147
  railScrim.className = "vela-sd-railscrim";
21974
- railScrim.addEventListener("click", () => toggleRail?.());
21975
- toggleRail = (open2) => {
22148
+ railScrim.addEventListener("click", () => this.toggleRail?.());
22149
+ this.toggleRail = (open2) => {
21976
22150
  const on = open2 ?? !rail.classList.contains("open");
21977
22151
  rail.classList.toggle("open", on);
21978
22152
  railScrim?.classList.toggle("open", on);
@@ -22012,35 +22186,6 @@ var SettingsDialog = class {
22012
22186
  });
22013
22187
  if (hidActive) activate(0);
22014
22188
  };
22015
- const ui = new Dialog({
22016
- host: this.container,
22017
- title: "Chart settings",
22018
- // Non-modal: a live-edit dialog must leave the page interactive — a modal
22019
- // machine locks pointer events on the whole body, killing the chart, the
22020
- // legend, and the body-portaled popovers (color picker, select lists).
22021
- modal: false,
22022
- contained: true,
22023
- align: "top",
22024
- draggable: !mobile,
22025
- flush: true,
22026
- className: "vela-dialog--settings",
22027
- headerStart: burger,
22028
- closeOnBackdrop: true,
22029
- footer: (foot) => {
22030
- foot.style.cssText = `padding:10px 14px;display:flex;align-items:center;justify-content:flex-start;gap:8px;`;
22031
- const resetBtn = document.createElement("button");
22032
- resetBtn.type = "button";
22033
- resetBtn.textContent = "Reset defaults";
22034
- resetBtn.className = "vela-sd-btn";
22035
- resetBtn.addEventListener("click", () => this.onReset?.());
22036
- foot.appendChild(resetBtn);
22037
- },
22038
- onOpenChange: (open2) => {
22039
- if (!open2) this.close();
22040
- }
22041
- });
22042
- if (mobile) ui.positioner.classList.add("vela-sd-mobile");
22043
- ui.positioner.style.paddingTop = mobile ? "0" : "8vh";
22044
22189
  const activate = (idx) => {
22045
22190
  panes.forEach((p, i) => {
22046
22191
  p.el.style.display = i === idx ? "block" : "none";
@@ -22049,7 +22194,7 @@ var SettingsDialog = class {
22049
22194
  this.activeSection = panes[idx]?.title ?? null;
22050
22195
  if (mobile) {
22051
22196
  ui.titleEl.textContent = panes[idx]?.title ?? "Chart settings";
22052
- toggleRail?.(false);
22197
+ this.toggleRail?.(false);
22053
22198
  }
22054
22199
  };
22055
22200
  panes.forEach((p, i) => {
@@ -22064,17 +22209,7 @@ var SettingsDialog = class {
22064
22209
  shell.append(rail, paneHost);
22065
22210
  if (railScrim) shell.append(railScrim);
22066
22211
  ui.body.appendChild(shell);
22067
- this.root = ui.positioner;
22068
- this.ui = ui;
22069
- ui.show();
22070
- for (const p of panes) {
22071
- const hosts = [...p.el.querySelectorAll("[data-sd-rows-host]")];
22072
- if (hosts.length === 0) {
22073
- this.layoutSettingsGrids(p.el);
22074
- continue;
22075
- }
22076
- for (const h of hosts) this.layoutSettingsGrids(h);
22077
- }
22212
+ return panes.map((p) => p.el);
22078
22213
  }
22079
22214
  close() {
22080
22215
  closeOpenPopovers();
@@ -22082,6 +22217,7 @@ var SettingsDialog = class {
22082
22217
  const ui = this.ui;
22083
22218
  this.ui = null;
22084
22219
  this.root = null;
22220
+ this.toggleRail = null;
22085
22221
  this.tabs = [];
22086
22222
  for (const dispose of this.hintTips) dispose();
22087
22223
  this.hintTips = [];
@@ -30181,7 +30317,11 @@ var NativeRenderer = class {
30181
30317
  }
30182
30318
  this.settingsDialog.setTheme(this.theme);
30183
30319
  this.settingsDialog.setHostSections(this.hostSettingsSections);
30184
- this.settingsDialog.setMarkGroups(this.markGroupsInUse(), (id) => markGroupVisible(this.scene.marks, id, this.scene.markGroups));
30320
+ this.settingsDialog.setMarkGroups(
30321
+ this.markGroupsForEventsTab(),
30322
+ (id) => markGroupVisible2(this.scene.marks, id, this.scene.markGroups),
30323
+ (id) => markGroupOwnVisible(this.scene.marks.groups, id, this.scene.markGroups)
30324
+ );
30185
30325
  this.settingsDialog.setHiddenSettings(this.hiddenSettings);
30186
30326
  this.syncThemeControl();
30187
30327
  this.settingsDialog.toggle(
@@ -30189,13 +30329,24 @@ var NativeRenderer = class {
30189
30329
  (patch) => this.applyConfig(patch),
30190
30330
  (json) => this.applyConfig(json),
30191
30331
  () => {
30192
- if (this.factoryConfig) this.applyConfig(factoryResetConfig(this.factoryConfig));
30193
- this.settingsDialog?.close();
30194
- this.openSettingsDialog();
30332
+ if (this.factoryConfig) this.applyConfig(this.factoryResetDocument(this.factoryConfig));
30333
+ this.settingsDialog?.refresh(this.getConfig());
30195
30334
  },
30196
30335
  section
30197
30336
  );
30198
30337
  }
30338
+ /**
30339
+ * The document "Reset defaults" applies: every setting back to its first-run value,
30340
+ * with two things that are NOT settings held or resolved here — the price style
30341
+ * stays the one the user is looking at, and the timeline-mark groups (an additive
30342
+ * merge, like the type bags) are named back to their host-declared visibility.
30343
+ */
30344
+ factoryResetDocument(factory) {
30345
+ const doc = factoryResetConfig(factory, this.scene.priceStyle);
30346
+ const groups = { ...doc.marks.groups };
30347
+ for (const g of this.markGroupsInUse()) groups[g.id] = g.visible !== false;
30348
+ return { ...doc, marks: { ...doc.marks, groups } };
30349
+ }
30199
30350
  /** Close the in-chart dialogs (indicator settings + chart-settings gear). No-op when none are open. */
30200
30351
  closeDialogs() {
30201
30352
  this.inputsUI?.closeOpenDialog();
@@ -31258,6 +31409,15 @@ var NativeRenderer = class {
31258
31409
  markGroupsInUse() {
31259
31410
  return effectiveMarkGroups(this.scene.timelineMarks, this.scene.markGroups);
31260
31411
  }
31412
+ /**
31413
+ * The groups as the Events tab lists them: nested only under a DEFINED parent. The
31414
+ * painter's visibility chain resolves parents against the defined groups alone, so a
31415
+ * parent that marks merely name must not nest (and dim) a child the painter still shows.
31416
+ */
31417
+ markGroupsForEventsTab() {
31418
+ const defined = new Set(this.scene.markGroups.map((g) => g.id));
31419
+ return this.markGroupsInUse().map((g) => g.parent !== void 0 && !defined.has(g.parent) ? { ...g, parent: void 0 } : g);
31420
+ }
31261
31421
  onViewportChange(cb) {
31262
31422
  this.viewportCbs.add(cb);
31263
31423
  return () => this.viewportCbs.delete(cb);
package/dist/index.d.cts CHANGED
@@ -1,9 +1,9 @@
1
- import { D as DrawingsDocument, R as Resolved } from './contributions-DpZeu7KP.cjs';
2
- export { B as BarsChangeReason, C as CellStateContext, b as ContextSelect, c as DataControl, d as DrawingsControl, e as EngineAlert, f as EngineCapabilities, g as EngineContextSnapshot, h as EngineFactory, i as EngineWarning, j as ExecutionHandlers, k as ExecutionMarket, l as ExecutionRequest, m as ExecutionSession, E as ExternalIndicatorEntry, F as FetchSeries, n as IndicatorEventMap, I as IndicatorHandle, o as IndicatorSummary, L as LegendActionDescriptor, p as LegendCalloutContent, q as LegendCalloutDescriptor, r as LegendCalloutItem, s as LegendCalloutSpec, t as LegendIndicatorInfo, M as MarksControl, N as NativeIndicator, u as NativeIndicatorContext, v as NativeIndicatorDescriptor, w as NativeIndicatorInfo, x as NativeIndicatorOutput, O as OVERRIDABLE_TOPBAR_IDS, P as ParsedSymbol, y as PreparedScript, z as RendererControl, A as RunIndicatorResult, G as SceneInspection, a as ScriptRun, H as ScriptRunCause, J as ScriptRunResult, S as ScriptingEngine, K as SidePanelButton, Q as SidePanelDescriptor, T as SidePanelHandle, U as SidePanelHeader, X as StatePersistenceHandler, Y as StrategyFill, Z as StrategyState, _ as StrategyTrade, $ as SymbolRankingHook, a0 as TypedEventBus, V as Vela, a1 as VelaDeps, a2 as VelaEventMap, a3 as VisibleBarRange, a4 as WidgetActionDescriptor, a5 as WidgetActionTarget, a6 as WidgetAttachment, W as WidgetContext, a7 as getNativeIndicator, a8 as legendActions, a9 as legendCallouts, aa as nativeIndicatorDescriptors, ab as nativeIndicatorTypes, ac as registerDefaultEngine, ad as registerLegendAction, ae as registerLegendCallout, af as registerNativeIndicator, ag as registerSidePanel, ah as registerStatePersistence, ai as registerSymbolRanking, aj as registerWidgetAction, ak as registerWidgetAttachment, al as resolveEngines, am as sidePanels, an as statePersistenceHandlers, ao as symbolRanking, ap as topbarActionOverride, aq as unregisterDefaultEngine, ar as unregisterLegendAction, as as unregisterLegendCallout, at as unregisterNativeIndicator, au as unregisterSidePanel, av as unregisterStatePersistence, aw as unregisterWidgetAction, ax as unregisterWidgetAttachment, ay as widgetActions, az as widgetAttachments } from './contributions-DpZeu7KP.cjs';
3
- import { D as Drawing, S as SerializedDrawing, U as Unsubscribe, L as LineStyle, P as PriceStyle, e as IChartRenderer, R as RendererCapabilities, f as RendererDisplayOptions, g as IndicatorRenderHandle, h as IndicatorStatus, c as VelaTheme, W as WallClock, O as OHLCV, i as Pane, j as PaneAction, k as MoveTarget, l as IndicatorModel, m as ScenePatch, I as InputValue, n as SymbolPickerFn, o as LegendActionView, p as LegendCalloutView, q as InputChangeEvent, T as ThemeName, C as CrosshairEvent, r as ClickEvent, A as AxisLongPressEvent, s as TimelineMark, t as MarkGroup, u as MarkClickEvent, a as VisibleRange, v as DataWindowReadout, w as IDrawingsRendererPort, x as Millis, y as SnapMode, z as DrawingTypeKey, B as ToolbarDefinition, M as MarketConfig } from './options-XVpfr9HV.cjs';
4
- export { E as AddIndicatorOptions, F as AnimationConfig, G as Background, H as BoxFontFamily, J as BoxHAlign, K as BoxTextSize, Q as BoxVAlign, X as CandleBarColor, Y as CandleSeries, Z as CandleStyle, _ as DataWindowGroup, $ as DataWindowOHLC, a0 as DataWindowRow, a1 as DirtyRange, a2 as DrawingBox, a3 as DrawingExtend, a4 as DrawingIntent, a5 as DrawingLabel, a6 as DrawingLine, a7 as DrawingLinefill, a8 as DrawingMode, a9 as DrawingPoint, aa as DrawingPolyline, ab as DrawingSeriesBar, ac as DrawingSeriesGateway, ad as DrawingSeriesState, ae as DrawingStyle, af as DrawingTable, ag as DrawingText, ah as DrawingXLoc, ai as DrawingsOption, aj as Fill, ak as FillGradientStop, al as IndicatorMeta, am as InputCondition, an as InputSchema, ao as InputType, ap as InputWhen, aq as IntroAnimation, ar as IntroConfig, as as IntroStyle, at as LabelStyle, au as LabelYLoc, av as LineLikeKind, aw as LineLikeSeries, ax as LineLikeStyle, ay as MarkContent, az as MarkContentSource, aA as MarkGlyph, aB as MarkPanelItem, aC as MarkShape, aD as MarkerPoint, aE as MarkerSeries, aF as MarketSnapshot, aG as MarketSwitch, aH as PaneAxis, aI as PaneAxisBand, aJ as PaneHint, aK as PaneKind, aL as PolylinePoint, aM as PriceLine, aN as Projector, aO as ProviderName, aP as RendererConstructor, aQ as Scene, aR as SchemaPatch, aS as SecondClock, aT as SeriesDisplay, aU as SeriesKind, aV as SeriesPoint, aW as SeriesSpec, aX as SeriesSurface, aY as SeriesValueDelta, aZ as SettingsField, a_ as SettingsSchema, a$ as SettingsVisibilityPolicy, b0 as TableCell, b1 as TableMerge, b2 as TablePosition, b3 as ToolbarGroupConfig, b4 as TradeExecution, b5 as ValuePatch, b as VelaOptions, V as VisibleRangePreset, b6 as buildToolbar, b7 as defaultToolbar, b8 as inputDeltas, b9 as inputVisible, ba as seriesInScale, bb as seriesShownOn } from './options-XVpfr9HV.cjs';
5
- import { M as MarketDataFeed, D as DataProvider, P as ProviderInfo, a as SymbolDescriptor, S as SymbolInfo, b as ProviderCapabilities, B as BarRange } from './DataProvider-RF1axuy1.cjs';
6
- export { A as ACCENT, a as ACCENT_BRIGHT, B as BEARISH, b as BULLISH, c as BarTransform, d as BasePaintingModulation, C as CATEGORICAL, e as CHIP_PLATE, f as CROSSHAIR, g as ChartTypeDefinition, h as ChartTypeSettingsInstance, i as ChartTypeSettingsSection, j as ChartTypeSettingsSubsection, D as DrawingTypeMeta, H as HIGHLIGHT, I as INFO, k as INVALID, l as IdentifiableKind, M as MARKER, N as NEUTRAL, m as NormalizedSettingsRow, R as RendererLayerArgs, n as RendererLayerDefinition, o as RendererLayerInstance, S as SERIES_LINE, p as SESSION_OFF, q as SESSION_POST, r as SESSION_PRE, s as SLATE, t as SLATE_DEEP, u as SeriesDataEngine, v as SeriesDataEngineHost, w as SettingsInlineControl, x as SettingsRowCondition, y as SettingsRowDescriptor, z as SettingsRowInlineNumber, E as SettingsRowSwatch, F as SettingsRowValueKey, G as SettingsRowWhen, J as SettingsRowWidth, K as SettingsSelectOption, L as SettingsValueRow, T as TRADE_EXIT, O as TRADE_LONG, P as TRADE_SHORT, V as VALID, W as WARNING, Q as categoricalColor, U as chartType, X as chartTypes, Y as createDrawing, Z as deserializeDrawing, _ as drawingTypes, $ as getDrawingType, a0 as normalizeSettingsRow, a1 as registerChartType, a2 as registerDrawingType, a3 as registerRendererDefaults, a4 as registerRendererLayer, a5 as rendererDefaults, a6 as rendererLayers, a7 as settingsRowValueKeys, a8 as stableSeriesId, a9 as tickerModifierIds, aa as unregisterChartType, ab as unregisterRendererDefaults, ac as unregisterRendererLayer } from './plugin-D07HD2GL.cjs';
1
+ import { D as DrawingsDocument, R as Resolved } from './contributions-DYtiRtES.cjs';
2
+ export { B as BarsChangeReason, C as CellStateContext, b as ContextSelect, c as DataControl, d as DrawingsControl, e as EngineAlert, f as EngineCapabilities, g as EngineContextSnapshot, h as EngineFactory, i as EngineWarning, j as ExecutionHandlers, k as ExecutionMarket, l as ExecutionRequest, m as ExecutionSession, E as ExternalIndicatorEntry, F as FetchSeries, n as IndicatorEventMap, I as IndicatorHandle, o as IndicatorSummary, L as LegendActionDescriptor, p as LegendCalloutContent, q as LegendCalloutDescriptor, r as LegendCalloutItem, s as LegendCalloutSpec, t as LegendIndicatorInfo, M as MarksControl, N as NativeIndicator, u as NativeIndicatorContext, v as NativeIndicatorDescriptor, w as NativeIndicatorInfo, x as NativeIndicatorOutput, O as OVERRIDABLE_TOPBAR_IDS, P as ParsedSymbol, y as PreparedScript, z as RendererControl, A as RunIndicatorResult, G as SceneInspection, a as ScriptRun, H as ScriptRunCause, J as ScriptRunResult, S as ScriptingEngine, K as SidePanelButton, Q as SidePanelDescriptor, T as SidePanelHandle, U as SidePanelHeader, X as StatePersistenceHandler, Y as StrategyFill, Z as StrategyState, _ as StrategyTrade, $ as SymbolRankingHook, a0 as TypedEventBus, V as Vela, a1 as VelaDeps, a2 as VelaEventMap, a3 as VisibleBarRange, a4 as WidgetActionDescriptor, a5 as WidgetActionTarget, a6 as WidgetAttachment, W as WidgetContext, a7 as getNativeIndicator, a8 as legendActions, a9 as legendCallouts, aa as nativeIndicatorDescriptors, ab as nativeIndicatorTypes, ac as registerDefaultEngine, ad as registerLegendAction, ae as registerLegendCallout, af as registerNativeIndicator, ag as registerSidePanel, ah as registerStatePersistence, ai as registerSymbolRanking, aj as registerWidgetAction, ak as registerWidgetAttachment, al as resolveEngines, am as sidePanels, an as statePersistenceHandlers, ao as symbolRanking, ap as topbarActionOverride, aq as unregisterDefaultEngine, ar as unregisterLegendAction, as as unregisterLegendCallout, at as unregisterNativeIndicator, au as unregisterSidePanel, av as unregisterStatePersistence, aw as unregisterWidgetAction, ax as unregisterWidgetAttachment, ay as widgetActions, az as widgetAttachments } from './contributions-DYtiRtES.cjs';
3
+ import { D as Drawing, S as SerializedDrawing, U as Unsubscribe, L as LineStyle, P as PriceStyle, e as IChartRenderer, R as RendererCapabilities, f as RendererDisplayOptions, g as IndicatorRenderHandle, h as IndicatorStatus, c as VelaTheme, W as WallClock, O as OHLCV, i as Pane, j as PaneAction, k as MoveTarget, l as IndicatorModel, m as ScenePatch, I as InputValue, n as SymbolPickerFn, o as LegendActionView, p as LegendCalloutView, q as InputChangeEvent, T as ThemeName, C as CrosshairEvent, r as ClickEvent, A as AxisLongPressEvent, s as TimelineMark, t as MarkGroup, u as MarkClickEvent, a as VisibleRange, v as DataWindowReadout, w as IDrawingsRendererPort, x as Millis, y as SnapMode, z as DrawingTypeKey, B as ToolbarDefinition, M as MarketConfig } from './options-DNBoMKkX.cjs';
4
+ export { E as AddIndicatorOptions, F as AnimationConfig, G as Background, H as BoxFontFamily, J as BoxHAlign, K as BoxTextSize, Q as BoxVAlign, X as CandleBarColor, Y as CandleSeries, Z as CandleStyle, _ as DataWindowGroup, $ as DataWindowOHLC, a0 as DataWindowRow, a1 as DirtyRange, a2 as DrawingBox, a3 as DrawingExtend, a4 as DrawingIntent, a5 as DrawingLabel, a6 as DrawingLine, a7 as DrawingLinefill, a8 as DrawingMode, a9 as DrawingPoint, aa as DrawingPolyline, ab as DrawingSeriesBar, ac as DrawingSeriesGateway, ad as DrawingSeriesState, ae as DrawingStyle, af as DrawingTable, ag as DrawingText, ah as DrawingXLoc, ai as DrawingsOption, aj as Fill, ak as FillGradientStop, al as IndicatorMeta, am as InputCondition, an as InputSchema, ao as InputType, ap as InputWhen, aq as IntroAnimation, ar as IntroConfig, as as IntroStyle, at as LabelStyle, au as LabelYLoc, av as LineLikeKind, aw as LineLikeSeries, ax as LineLikeStyle, ay as MarkContent, az as MarkContentSource, aA as MarkGlyph, aB as MarkPanelItem, aC as MarkShape, aD as MarkerPoint, aE as MarkerSeries, aF as MarketSnapshot, aG as MarketSwitch, aH as PaneAxis, aI as PaneAxisBand, aJ as PaneHint, aK as PaneKind, aL as PolylinePoint, aM as PriceLine, aN as Projector, aO as ProviderName, aP as RendererConstructor, aQ as Scene, aR as SchemaPatch, aS as SecondClock, aT as SeriesDisplay, aU as SeriesKind, aV as SeriesPoint, aW as SeriesSpec, aX as SeriesSurface, aY as SeriesValueDelta, aZ as SettingsField, a_ as SettingsSchema, a$ as SettingsVisibilityPolicy, b0 as TableCell, b1 as TableMerge, b2 as TablePosition, b3 as ToolbarGroupConfig, b4 as TradeExecution, b5 as ValuePatch, b as VelaOptions, V as VisibleRangePreset, b6 as buildToolbar, b7 as defaultToolbar, b8 as inputDeltas, b9 as inputVisible, ba as seriesInScale, bb as seriesShownOn } from './options-DNBoMKkX.cjs';
5
+ import { M as MarketDataFeed, D as DataProvider, P as ProviderInfo, a as SymbolDescriptor, S as SymbolInfo, b as ProviderCapabilities, B as BarRange } from './DataProvider-Dut6lXGM.cjs';
6
+ export { A as ACCENT, a as ACCENT_BRIGHT, B as BEARISH, b as BULLISH, c as BarTransform, d as BasePaintingModulation, C as CATEGORICAL, e as CHIP_PLATE, f as CROSSHAIR, g as ChartTypeDefinition, h as ChartTypeSettingsInstance, i as ChartTypeSettingsSection, j as ChartTypeSettingsSubsection, D as DrawingTypeMeta, H as HIGHLIGHT, I as INFO, k as INVALID, l as IdentifiableKind, M as MARKER, N as NEUTRAL, m as NormalizedSettingsRow, R as RendererLayerArgs, n as RendererLayerDefinition, o as RendererLayerInstance, S as SERIES_LINE, p as SESSION_OFF, q as SESSION_POST, r as SESSION_PRE, s as SLATE, t as SLATE_DEEP, u as SeriesDataEngine, v as SeriesDataEngineHost, w as SettingsInlineControl, x as SettingsRowCondition, y as SettingsRowDescriptor, z as SettingsRowInlineNumber, E as SettingsRowSwatch, F as SettingsRowValueKey, G as SettingsRowWhen, J as SettingsRowWidth, K as SettingsSelectOption, L as SettingsValueRow, T as TRADE_EXIT, O as TRADE_LONG, P as TRADE_SHORT, V as VALID, W as WARNING, Q as categoricalColor, U as chartType, X as chartTypes, Y as createDrawing, Z as deserializeDrawing, _ as drawingTypes, $ as getDrawingType, a0 as normalizeSettingsRow, a1 as registerChartType, a2 as registerDrawingType, a3 as registerRendererDefaults, a4 as registerRendererLayer, a5 as rendererDefaults, a6 as rendererLayers, a7 as settingsRowValueKeys, a8 as stableSeriesId, a9 as tickerModifierIds, aa as unregisterChartType, ab as unregisterRendererDefaults, ac as unregisterRendererLayer } from './plugin-DtkeQVAO.cjs';
7
7
  export { D as DEFAULT_PANEL_MAX_WIDTH, a as DEFAULT_PANEL_MIN_WIDTH, b as DEFAULT_PANEL_WIDTH, S as SidePanelOptions, c as clampPanelWidth } from './side-panel-HF0IAzwf.cjs';
8
8
  export { i as iconMarkup, r as registerIcon } from './icons-BZYbJXSV.cjs';
9
9
  export { a as KeyBindingDescriptor, R as ResolvedBinding } from './keymap-CGOz5F5f.cjs';
@@ -586,6 +586,13 @@ declare class NativeRenderer implements IChartRenderer {
586
586
  * canonical theme. */
587
587
  private syncThemeControl;
588
588
  private toggleSettingsDialog;
589
+ /**
590
+ * The document "Reset defaults" applies: every setting back to its first-run value,
591
+ * with two things that are NOT settings held or resolved here — the price style
592
+ * stays the one the user is looking at, and the timeline-mark groups (an additive
593
+ * merge, like the type bags) are named back to their host-declared visibility.
594
+ */
595
+ private factoryResetDocument;
589
596
  /** Close the in-chart dialogs (indicator settings + chart-settings gear). No-op when none are open. */
590
597
  closeDialogs(): void;
591
598
  /** Jump-back-to-latest button — same size/border chrome as the drawing-toolbar collapse toggle. */
@@ -772,6 +779,12 @@ declare class NativeRenderer implements IChartRenderer {
772
779
  onMarkClick(cb: (e: MarkClickEvent) => void): Unsubscribe;
773
780
  /** Every group the lane knows: the defined ones, then those marks name without a definition. */
774
781
  private markGroupsInUse;
782
+ /**
783
+ * The groups as the Events tab lists them: nested only under a DEFINED parent. The
784
+ * painter's visibility chain resolves parents against the defined groups alone, so a
785
+ * parent that marks merely name must not nest (and dim) a child the painter still shows.
786
+ */
787
+ private markGroupsForEventsTab;
775
788
  onViewportChange(cb: (range: VisibleRange) => void): Unsubscribe;
776
789
  getVisibleRange(): VisibleRange | null;
777
790
  setVisibleRange(range: VisibleRange): void;
package/dist/index.d.ts CHANGED
@@ -1,9 +1,9 @@
1
- import { D as DrawingsDocument, R as Resolved } from './contributions-CspPrMAJ.js';
2
- export { B as BarsChangeReason, C as CellStateContext, b as ContextSelect, c as DataControl, d as DrawingsControl, e as EngineAlert, f as EngineCapabilities, g as EngineContextSnapshot, h as EngineFactory, i as EngineWarning, j as ExecutionHandlers, k as ExecutionMarket, l as ExecutionRequest, m as ExecutionSession, E as ExternalIndicatorEntry, F as FetchSeries, n as IndicatorEventMap, I as IndicatorHandle, o as IndicatorSummary, L as LegendActionDescriptor, p as LegendCalloutContent, q as LegendCalloutDescriptor, r as LegendCalloutItem, s as LegendCalloutSpec, t as LegendIndicatorInfo, M as MarksControl, N as NativeIndicator, u as NativeIndicatorContext, v as NativeIndicatorDescriptor, w as NativeIndicatorInfo, x as NativeIndicatorOutput, O as OVERRIDABLE_TOPBAR_IDS, P as ParsedSymbol, y as PreparedScript, z as RendererControl, A as RunIndicatorResult, G as SceneInspection, a as ScriptRun, H as ScriptRunCause, J as ScriptRunResult, S as ScriptingEngine, K as SidePanelButton, Q as SidePanelDescriptor, T as SidePanelHandle, U as SidePanelHeader, X as StatePersistenceHandler, Y as StrategyFill, Z as StrategyState, _ as StrategyTrade, $ as SymbolRankingHook, a0 as TypedEventBus, V as Vela, a1 as VelaDeps, a2 as VelaEventMap, a3 as VisibleBarRange, a4 as WidgetActionDescriptor, a5 as WidgetActionTarget, a6 as WidgetAttachment, W as WidgetContext, a7 as getNativeIndicator, a8 as legendActions, a9 as legendCallouts, aa as nativeIndicatorDescriptors, ab as nativeIndicatorTypes, ac as registerDefaultEngine, ad as registerLegendAction, ae as registerLegendCallout, af as registerNativeIndicator, ag as registerSidePanel, ah as registerStatePersistence, ai as registerSymbolRanking, aj as registerWidgetAction, ak as registerWidgetAttachment, al as resolveEngines, am as sidePanels, an as statePersistenceHandlers, ao as symbolRanking, ap as topbarActionOverride, aq as unregisterDefaultEngine, ar as unregisterLegendAction, as as unregisterLegendCallout, at as unregisterNativeIndicator, au as unregisterSidePanel, av as unregisterStatePersistence, aw as unregisterWidgetAction, ax as unregisterWidgetAttachment, ay as widgetActions, az as widgetAttachments } from './contributions-CspPrMAJ.js';
3
- import { D as Drawing, S as SerializedDrawing, U as Unsubscribe, L as LineStyle, P as PriceStyle, e as IChartRenderer, R as RendererCapabilities, f as RendererDisplayOptions, g as IndicatorRenderHandle, h as IndicatorStatus, c as VelaTheme, W as WallClock, O as OHLCV, i as Pane, j as PaneAction, k as MoveTarget, l as IndicatorModel, m as ScenePatch, I as InputValue, n as SymbolPickerFn, o as LegendActionView, p as LegendCalloutView, q as InputChangeEvent, T as ThemeName, C as CrosshairEvent, r as ClickEvent, A as AxisLongPressEvent, s as TimelineMark, t as MarkGroup, u as MarkClickEvent, a as VisibleRange, v as DataWindowReadout, w as IDrawingsRendererPort, x as Millis, y as SnapMode, z as DrawingTypeKey, B as ToolbarDefinition, M as MarketConfig } from './options-XVpfr9HV.js';
4
- export { E as AddIndicatorOptions, F as AnimationConfig, G as Background, H as BoxFontFamily, J as BoxHAlign, K as BoxTextSize, Q as BoxVAlign, X as CandleBarColor, Y as CandleSeries, Z as CandleStyle, _ as DataWindowGroup, $ as DataWindowOHLC, a0 as DataWindowRow, a1 as DirtyRange, a2 as DrawingBox, a3 as DrawingExtend, a4 as DrawingIntent, a5 as DrawingLabel, a6 as DrawingLine, a7 as DrawingLinefill, a8 as DrawingMode, a9 as DrawingPoint, aa as DrawingPolyline, ab as DrawingSeriesBar, ac as DrawingSeriesGateway, ad as DrawingSeriesState, ae as DrawingStyle, af as DrawingTable, ag as DrawingText, ah as DrawingXLoc, ai as DrawingsOption, aj as Fill, ak as FillGradientStop, al as IndicatorMeta, am as InputCondition, an as InputSchema, ao as InputType, ap as InputWhen, aq as IntroAnimation, ar as IntroConfig, as as IntroStyle, at as LabelStyle, au as LabelYLoc, av as LineLikeKind, aw as LineLikeSeries, ax as LineLikeStyle, ay as MarkContent, az as MarkContentSource, aA as MarkGlyph, aB as MarkPanelItem, aC as MarkShape, aD as MarkerPoint, aE as MarkerSeries, aF as MarketSnapshot, aG as MarketSwitch, aH as PaneAxis, aI as PaneAxisBand, aJ as PaneHint, aK as PaneKind, aL as PolylinePoint, aM as PriceLine, aN as Projector, aO as ProviderName, aP as RendererConstructor, aQ as Scene, aR as SchemaPatch, aS as SecondClock, aT as SeriesDisplay, aU as SeriesKind, aV as SeriesPoint, aW as SeriesSpec, aX as SeriesSurface, aY as SeriesValueDelta, aZ as SettingsField, a_ as SettingsSchema, a$ as SettingsVisibilityPolicy, b0 as TableCell, b1 as TableMerge, b2 as TablePosition, b3 as ToolbarGroupConfig, b4 as TradeExecution, b5 as ValuePatch, b as VelaOptions, V as VisibleRangePreset, b6 as buildToolbar, b7 as defaultToolbar, b8 as inputDeltas, b9 as inputVisible, ba as seriesInScale, bb as seriesShownOn } from './options-XVpfr9HV.js';
5
- import { M as MarketDataFeed, D as DataProvider, P as ProviderInfo, a as SymbolDescriptor, S as SymbolInfo, b as ProviderCapabilities, B as BarRange } from './DataProvider-CVpN5sCq.js';
6
- export { A as ACCENT, a as ACCENT_BRIGHT, B as BEARISH, b as BULLISH, c as BarTransform, d as BasePaintingModulation, C as CATEGORICAL, e as CHIP_PLATE, f as CROSSHAIR, g as ChartTypeDefinition, h as ChartTypeSettingsInstance, i as ChartTypeSettingsSection, j as ChartTypeSettingsSubsection, D as DrawingTypeMeta, H as HIGHLIGHT, I as INFO, k as INVALID, l as IdentifiableKind, M as MARKER, N as NEUTRAL, m as NormalizedSettingsRow, R as RendererLayerArgs, n as RendererLayerDefinition, o as RendererLayerInstance, S as SERIES_LINE, p as SESSION_OFF, q as SESSION_POST, r as SESSION_PRE, s as SLATE, t as SLATE_DEEP, u as SeriesDataEngine, v as SeriesDataEngineHost, w as SettingsInlineControl, x as SettingsRowCondition, y as SettingsRowDescriptor, z as SettingsRowInlineNumber, E as SettingsRowSwatch, F as SettingsRowValueKey, G as SettingsRowWhen, J as SettingsRowWidth, K as SettingsSelectOption, L as SettingsValueRow, T as TRADE_EXIT, O as TRADE_LONG, P as TRADE_SHORT, V as VALID, W as WARNING, Q as categoricalColor, U as chartType, X as chartTypes, Y as createDrawing, Z as deserializeDrawing, _ as drawingTypes, $ as getDrawingType, a0 as normalizeSettingsRow, a1 as registerChartType, a2 as registerDrawingType, a3 as registerRendererDefaults, a4 as registerRendererLayer, a5 as rendererDefaults, a6 as rendererLayers, a7 as settingsRowValueKeys, a8 as stableSeriesId, a9 as tickerModifierIds, aa as unregisterChartType, ab as unregisterRendererDefaults, ac as unregisterRendererLayer } from './plugin-BoLOkblF.js';
1
+ import { D as DrawingsDocument, R as Resolved } from './contributions-CEkgJKTU.js';
2
+ export { B as BarsChangeReason, C as CellStateContext, b as ContextSelect, c as DataControl, d as DrawingsControl, e as EngineAlert, f as EngineCapabilities, g as EngineContextSnapshot, h as EngineFactory, i as EngineWarning, j as ExecutionHandlers, k as ExecutionMarket, l as ExecutionRequest, m as ExecutionSession, E as ExternalIndicatorEntry, F as FetchSeries, n as IndicatorEventMap, I as IndicatorHandle, o as IndicatorSummary, L as LegendActionDescriptor, p as LegendCalloutContent, q as LegendCalloutDescriptor, r as LegendCalloutItem, s as LegendCalloutSpec, t as LegendIndicatorInfo, M as MarksControl, N as NativeIndicator, u as NativeIndicatorContext, v as NativeIndicatorDescriptor, w as NativeIndicatorInfo, x as NativeIndicatorOutput, O as OVERRIDABLE_TOPBAR_IDS, P as ParsedSymbol, y as PreparedScript, z as RendererControl, A as RunIndicatorResult, G as SceneInspection, a as ScriptRun, H as ScriptRunCause, J as ScriptRunResult, S as ScriptingEngine, K as SidePanelButton, Q as SidePanelDescriptor, T as SidePanelHandle, U as SidePanelHeader, X as StatePersistenceHandler, Y as StrategyFill, Z as StrategyState, _ as StrategyTrade, $ as SymbolRankingHook, a0 as TypedEventBus, V as Vela, a1 as VelaDeps, a2 as VelaEventMap, a3 as VisibleBarRange, a4 as WidgetActionDescriptor, a5 as WidgetActionTarget, a6 as WidgetAttachment, W as WidgetContext, a7 as getNativeIndicator, a8 as legendActions, a9 as legendCallouts, aa as nativeIndicatorDescriptors, ab as nativeIndicatorTypes, ac as registerDefaultEngine, ad as registerLegendAction, ae as registerLegendCallout, af as registerNativeIndicator, ag as registerSidePanel, ah as registerStatePersistence, ai as registerSymbolRanking, aj as registerWidgetAction, ak as registerWidgetAttachment, al as resolveEngines, am as sidePanels, an as statePersistenceHandlers, ao as symbolRanking, ap as topbarActionOverride, aq as unregisterDefaultEngine, ar as unregisterLegendAction, as as unregisterLegendCallout, at as unregisterNativeIndicator, au as unregisterSidePanel, av as unregisterStatePersistence, aw as unregisterWidgetAction, ax as unregisterWidgetAttachment, ay as widgetActions, az as widgetAttachments } from './contributions-CEkgJKTU.js';
3
+ import { D as Drawing, S as SerializedDrawing, U as Unsubscribe, L as LineStyle, P as PriceStyle, e as IChartRenderer, R as RendererCapabilities, f as RendererDisplayOptions, g as IndicatorRenderHandle, h as IndicatorStatus, c as VelaTheme, W as WallClock, O as OHLCV, i as Pane, j as PaneAction, k as MoveTarget, l as IndicatorModel, m as ScenePatch, I as InputValue, n as SymbolPickerFn, o as LegendActionView, p as LegendCalloutView, q as InputChangeEvent, T as ThemeName, C as CrosshairEvent, r as ClickEvent, A as AxisLongPressEvent, s as TimelineMark, t as MarkGroup, u as MarkClickEvent, a as VisibleRange, v as DataWindowReadout, w as IDrawingsRendererPort, x as Millis, y as SnapMode, z as DrawingTypeKey, B as ToolbarDefinition, M as MarketConfig } from './options-DNBoMKkX.js';
4
+ export { E as AddIndicatorOptions, F as AnimationConfig, G as Background, H as BoxFontFamily, J as BoxHAlign, K as BoxTextSize, Q as BoxVAlign, X as CandleBarColor, Y as CandleSeries, Z as CandleStyle, _ as DataWindowGroup, $ as DataWindowOHLC, a0 as DataWindowRow, a1 as DirtyRange, a2 as DrawingBox, a3 as DrawingExtend, a4 as DrawingIntent, a5 as DrawingLabel, a6 as DrawingLine, a7 as DrawingLinefill, a8 as DrawingMode, a9 as DrawingPoint, aa as DrawingPolyline, ab as DrawingSeriesBar, ac as DrawingSeriesGateway, ad as DrawingSeriesState, ae as DrawingStyle, af as DrawingTable, ag as DrawingText, ah as DrawingXLoc, ai as DrawingsOption, aj as Fill, ak as FillGradientStop, al as IndicatorMeta, am as InputCondition, an as InputSchema, ao as InputType, ap as InputWhen, aq as IntroAnimation, ar as IntroConfig, as as IntroStyle, at as LabelStyle, au as LabelYLoc, av as LineLikeKind, aw as LineLikeSeries, ax as LineLikeStyle, ay as MarkContent, az as MarkContentSource, aA as MarkGlyph, aB as MarkPanelItem, aC as MarkShape, aD as MarkerPoint, aE as MarkerSeries, aF as MarketSnapshot, aG as MarketSwitch, aH as PaneAxis, aI as PaneAxisBand, aJ as PaneHint, aK as PaneKind, aL as PolylinePoint, aM as PriceLine, aN as Projector, aO as ProviderName, aP as RendererConstructor, aQ as Scene, aR as SchemaPatch, aS as SecondClock, aT as SeriesDisplay, aU as SeriesKind, aV as SeriesPoint, aW as SeriesSpec, aX as SeriesSurface, aY as SeriesValueDelta, aZ as SettingsField, a_ as SettingsSchema, a$ as SettingsVisibilityPolicy, b0 as TableCell, b1 as TableMerge, b2 as TablePosition, b3 as ToolbarGroupConfig, b4 as TradeExecution, b5 as ValuePatch, b as VelaOptions, V as VisibleRangePreset, b6 as buildToolbar, b7 as defaultToolbar, b8 as inputDeltas, b9 as inputVisible, ba as seriesInScale, bb as seriesShownOn } from './options-DNBoMKkX.js';
5
+ import { M as MarketDataFeed, D as DataProvider, P as ProviderInfo, a as SymbolDescriptor, S as SymbolInfo, b as ProviderCapabilities, B as BarRange } from './DataProvider-DLeFs1gE.js';
6
+ export { A as ACCENT, a as ACCENT_BRIGHT, B as BEARISH, b as BULLISH, c as BarTransform, d as BasePaintingModulation, C as CATEGORICAL, e as CHIP_PLATE, f as CROSSHAIR, g as ChartTypeDefinition, h as ChartTypeSettingsInstance, i as ChartTypeSettingsSection, j as ChartTypeSettingsSubsection, D as DrawingTypeMeta, H as HIGHLIGHT, I as INFO, k as INVALID, l as IdentifiableKind, M as MARKER, N as NEUTRAL, m as NormalizedSettingsRow, R as RendererLayerArgs, n as RendererLayerDefinition, o as RendererLayerInstance, S as SERIES_LINE, p as SESSION_OFF, q as SESSION_POST, r as SESSION_PRE, s as SLATE, t as SLATE_DEEP, u as SeriesDataEngine, v as SeriesDataEngineHost, w as SettingsInlineControl, x as SettingsRowCondition, y as SettingsRowDescriptor, z as SettingsRowInlineNumber, E as SettingsRowSwatch, F as SettingsRowValueKey, G as SettingsRowWhen, J as SettingsRowWidth, K as SettingsSelectOption, L as SettingsValueRow, T as TRADE_EXIT, O as TRADE_LONG, P as TRADE_SHORT, V as VALID, W as WARNING, Q as categoricalColor, U as chartType, X as chartTypes, Y as createDrawing, Z as deserializeDrawing, _ as drawingTypes, $ as getDrawingType, a0 as normalizeSettingsRow, a1 as registerChartType, a2 as registerDrawingType, a3 as registerRendererDefaults, a4 as registerRendererLayer, a5 as rendererDefaults, a6 as rendererLayers, a7 as settingsRowValueKeys, a8 as stableSeriesId, a9 as tickerModifierIds, aa as unregisterChartType, ab as unregisterRendererDefaults, ac as unregisterRendererLayer } from './plugin-CLn--oP6.js';
7
7
  export { D as DEFAULT_PANEL_MAX_WIDTH, a as DEFAULT_PANEL_MIN_WIDTH, b as DEFAULT_PANEL_WIDTH, S as SidePanelOptions, c as clampPanelWidth } from './side-panel-HF0IAzwf.js';
8
8
  export { i as iconMarkup, r as registerIcon } from './icons-BZYbJXSV.js';
9
9
  export { a as KeyBindingDescriptor, R as ResolvedBinding } from './keymap-CGOz5F5f.js';
@@ -586,6 +586,13 @@ declare class NativeRenderer implements IChartRenderer {
586
586
  * canonical theme. */
587
587
  private syncThemeControl;
588
588
  private toggleSettingsDialog;
589
+ /**
590
+ * The document "Reset defaults" applies: every setting back to its first-run value,
591
+ * with two things that are NOT settings held or resolved here — the price style
592
+ * stays the one the user is looking at, and the timeline-mark groups (an additive
593
+ * merge, like the type bags) are named back to their host-declared visibility.
594
+ */
595
+ private factoryResetDocument;
589
596
  /** Close the in-chart dialogs (indicator settings + chart-settings gear). No-op when none are open. */
590
597
  closeDialogs(): void;
591
598
  /** Jump-back-to-latest button — same size/border chrome as the drawing-toolbar collapse toggle. */
@@ -772,6 +779,12 @@ declare class NativeRenderer implements IChartRenderer {
772
779
  onMarkClick(cb: (e: MarkClickEvent) => void): Unsubscribe;
773
780
  /** Every group the lane knows: the defined ones, then those marks name without a definition. */
774
781
  private markGroupsInUse;
782
+ /**
783
+ * The groups as the Events tab lists them: nested only under a DEFINED parent. The
784
+ * painter's visibility chain resolves parents against the defined groups alone, so a
785
+ * parent that marks merely name must not nest (and dim) a child the painter still shows.
786
+ */
787
+ private markGroupsForEventsTab;
775
788
  onViewportChange(cb: (range: VisibleRange) => void): Unsubscribe;
776
789
  getVisibleRange(): VisibleRange | null;
777
790
  setVisibleRange(range: VisibleRange): void;
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import './chunk-JU4CWEBF.js';
2
- export { BarStore, CachingDataFeed, DARK_THEME, DataControl, DrawingStore, DrawingToolbar, DrawingsControl, LIGHT_THEME, MarksControl, MultiProviderFeed, NativeRenderer, RendererControl, SecondClock, TypedEventBus, Vela, buildToolbar, defaultToolbar, resolveTheme, sharedBarStore, timeframeToMs } from './chunk-DUURH3RN.js';
2
+ export { BarStore, CachingDataFeed, DARK_THEME, DataControl, DrawingStore, DrawingToolbar, DrawingsControl, LIGHT_THEME, MarksControl, MultiProviderFeed, NativeRenderer, RendererControl, SecondClock, TypedEventBus, Vela, buildToolbar, defaultToolbar, resolveTheme, sharedBarStore, timeframeToMs } from './chunk-MCLI6B3S.js';
3
3
  export { DEFAULT_PANEL_MAX_WIDTH, DEFAULT_PANEL_MIN_WIDTH, DEFAULT_PANEL_WIDTH, Drawing, OVERRIDABLE_TOPBAR_IDS, chartType, chartTypes, clampPanelWidth, createDrawing, deserializeDrawing, drawingTypes, getDrawingType, getNativeIndicator, inputDeltas, inputVisible, legendActions, legendCallouts, nativeIndicatorDescriptors, nativeIndicatorTypes, normalizeSettingsRow, registerChartType, registerDefaultEngine, registerDrawingType, registerLegendAction, registerLegendCallout, registerNativeIndicator, registerRendererDefaults, registerRendererLayer, registerSidePanel, registerStatePersistence, registerSymbolRanking, registerWidgetAction, registerWidgetAttachment, rendererDefaults, rendererLayers, resolveEngines, seriesInScale, seriesShownOn, settingsRowValueKeys, sidePanels, stableSeriesId, statePersistenceHandlers, symbolRanking, tickerModifierIds, topbarActionOverride, unregisterChartType, unregisterDefaultEngine, unregisterLegendAction, unregisterLegendCallout, unregisterNativeIndicator, unregisterRendererDefaults, unregisterRendererLayer, unregisterSidePanel, unregisterStatePersistence, unregisterWidgetAction, unregisterWidgetAttachment, widgetActions, widgetAttachments } from './chunk-BFA32GOU.js';
4
4
  import './chunk-BKHSQ4YM.js';
5
5
  export { ACCENT, ACCENT_BRIGHT, BEARISH, BULLISH, CATEGORICAL, CHIP_PLATE, CROSSHAIR, HIGHLIGHT, INFO, INVALID, MARKER, NEUTRAL, SERIES_LINE, SESSION_OFF, SESSION_POST, SESSION_PRE, SLATE, SLATE_DEEP, TRADE_EXIT, TRADE_LONG, TRADE_SHORT, VALID, WARNING, categoricalColor, iconMarkup, registerIcon } from './chunk-CAFCLMPF.js';
@@ -1321,6 +1321,14 @@ interface MarkGroup {
1321
1321
  label: string;
1322
1322
  /** Default visibility before the user toggles it (default true). A persisted choice wins. */
1323
1323
  visible?: boolean;
1324
+ /**
1325
+ * The id of the group this one nests under. A child's marks paint only while BOTH it
1326
+ * and its parent are visible; on the Events tab it lists indented beneath the parent
1327
+ * and dims while the parent is off, keeping its own choice for when the parent comes
1328
+ * back. Lets a host offer `News → Latest / All` or `Economic → High / Medium / Low`
1329
+ * as one master switch with sub-choices. A parent may hold marks of its own.
1330
+ */
1331
+ parent?: string;
1324
1332
  }
1325
1333
  /** The `mark:click` payload — every mark under the clicked glyph (a cluster lists them all). */
1326
1334
  interface MarkClickEvent {
@@ -1321,6 +1321,14 @@ interface MarkGroup {
1321
1321
  label: string;
1322
1322
  /** Default visibility before the user toggles it (default true). A persisted choice wins. */
1323
1323
  visible?: boolean;
1324
+ /**
1325
+ * The id of the group this one nests under. A child's marks paint only while BOTH it
1326
+ * and its parent are visible; on the Events tab it lists indented beneath the parent
1327
+ * and dims while the parent is off, keeping its own choice for when the parent comes
1328
+ * back. Lets a host offer `News → Latest / All` or `Economic → High / Medium / Low`
1329
+ * as one master switch with sub-choices. A parent may hold marks of its own.
1330
+ */
1331
+ parent?: string;
1324
1332
  }
1325
1333
  /** The `mark:click` payload — every mark under the clicked glyph (a cluster lists them all). */
1326
1334
  interface MarkClickEvent {