@luxalgo/vela 0.6.10 → 0.6.11

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 (41) hide show
  1. package/dist/{DataProvider-CWmp31dA.d.ts → DataProvider-BBf-jc6W.d.ts} +1 -1
  2. package/dist/{DataProvider-l_eLMly_.d.cts → DataProvider-p0TEyhlX.d.cts} +1 -1
  3. package/dist/{chunk-FFOP37FQ.js → chunk-73PEA4MU.js} +131 -33
  4. package/dist/{chunk-NMTQXNT4.js → chunk-IO3NYSQV.js} +65 -22
  5. package/dist/{chunk-4KZVZ7QQ.js → chunk-MTLJKZDZ.js} +9 -1
  6. package/dist/{contributions-BCz6Dr6a.d.ts → contributions-Bbe2R-mQ.d.ts} +16 -2
  7. package/dist/{contributions-D9vTzm5p.d.cts → contributions-CO01zWve.d.cts} +16 -2
  8. package/dist/index.cjs +139 -32
  9. package/dist/index.d.cts +12 -6
  10. package/dist/index.d.ts +12 -6
  11. package/dist/index.js +3 -3
  12. package/dist/{options-DSqHsQyN.d.cts → options-yp7sA96q.d.cts} +8 -1
  13. package/dist/{options-DSqHsQyN.d.ts → options-yp7sA96q.d.ts} +8 -1
  14. package/dist/{plugin-Bt8hLR8Z.d.cts → plugin-CkkH8QnX.d.cts} +3 -3
  15. package/dist/{plugin-CH7pfMrE.d.ts → plugin-DwxjM3Ni.d.ts} +3 -3
  16. package/dist/plugin.cjs +9 -0
  17. package/dist/plugin.d.cts +4 -4
  18. package/dist/plugin.d.ts +4 -4
  19. package/dist/plugin.js +2 -2
  20. package/dist/providers/binance.d.cts +2 -2
  21. package/dist/providers/binance.d.ts +2 -2
  22. package/dist/providers/coinbase.d.cts +2 -2
  23. package/dist/providers/coinbase.d.ts +2 -2
  24. package/dist/providers/hyperliquid.d.cts +2 -2
  25. package/dist/providers/hyperliquid.d.ts +2 -2
  26. package/dist/{statusline-5K7y4Ya2.d.ts → statusline-CHPDuKNp.d.ts} +13 -5
  27. package/dist/{statusline-TYLQmoeh.d.cts → statusline-DTHZUFqK.d.cts} +13 -5
  28. package/dist/ui.d.cts +1 -1
  29. package/dist/ui.d.ts +1 -1
  30. package/dist/vela.global.js +139 -32
  31. package/dist/vela.global.min.js +43 -43
  32. package/dist/widget.cjs +201 -52
  33. package/dist/widget.d.cts +6 -6
  34. package/dist/widget.d.ts +6 -6
  35. package/dist/widget.js +4 -4
  36. package/dist/workspace.cjs +201 -52
  37. package/dist/workspace.d.cts +20 -11
  38. package/dist/workspace.d.ts +20 -11
  39. package/dist/workspace.js +3 -3
  40. package/package.json +1 -1
  41. /package/dist/{chunk-AOGZBKUE.js → chunk-H26BEHF4.js} +0 -0
package/dist/widget.cjs CHANGED
@@ -16880,11 +16880,12 @@ async function resolveIndicators(config, fetchImpl = fetch) {
16880
16880
  }
16881
16881
  return out;
16882
16882
  }
16883
+ var ledgerEntryName = (e) => typeof e === "string" ? e : e.name;
16883
16884
  function indicatorLedger(i) {
16884
16885
  const natives = [...i.present];
16885
16886
  if (i.volumePending && !natives.includes("volume")) natives.push("volume");
16886
16887
  return {
16887
- manifest: i.manifestSettled ? [...i.instanceNames] : [...i.pendingManifest ?? i.instanceNames],
16888
+ manifest: i.manifestSettled ? [...i.instanceEntries] : [...i.pendingManifest ?? i.instanceEntries],
16888
16889
  natives
16889
16890
  };
16890
16891
  }
@@ -17818,7 +17819,17 @@ function sanitizeCell(raw) {
17818
17819
  if (c.drawings != null && typeof c.drawings === "object") out.drawings = c.drawings;
17819
17820
  const ind = c.indicators;
17820
17821
  if (ind != null && typeof ind === "object") {
17821
- const manifest = Array.isArray(ind.manifest) ? ind.manifest.filter((n) => typeof n === "string") : [];
17822
+ const manifest = Array.isArray(ind.manifest) ? ind.manifest.flatMap((n) => {
17823
+ if (typeof n === "string") return [n];
17824
+ if (n != null && typeof n === "object" && typeof n.name === "string") {
17825
+ const e = n;
17826
+ const bag = (v) => v != null && typeof v === "object" && !Array.isArray(v) ? v : void 0;
17827
+ const inputs = bag(e.inputs);
17828
+ const props = bag(e.props);
17829
+ return [inputs || props ? { name: e.name, ...inputs ? { inputs } : {}, ...props ? { props } : {} } : e.name];
17830
+ }
17831
+ return [];
17832
+ }) : [];
17822
17833
  const natives = Array.isArray(ind.natives) ? ind.natives.filter((n) => typeof n === "string") : [];
17823
17834
  out.indicators = { manifest, natives };
17824
17835
  }
@@ -18003,6 +18014,12 @@ var IndicatorHandleImpl = class {
18003
18014
  get visible() {
18004
18015
  return this.visibleState;
18005
18016
  }
18017
+ inputValues() {
18018
+ return this.controller.inputValuesOf(this.id);
18019
+ }
18020
+ propValues() {
18021
+ return this.controller.propValuesOf(this.id);
18022
+ }
18006
18023
  setInput(key, value) {
18007
18024
  this.controller.applyInputs(this.id, { [key]: value });
18008
18025
  }
@@ -18142,6 +18159,7 @@ var RUN_EMIT_THROTTLE_MS = 1e3;
18142
18159
  var PREVIEW_BARS = 300;
18143
18160
  var SINGLE_LOAD_BARS = 5e3;
18144
18161
  var CHUNK_BARS = 1e4;
18162
+ var FIRST_PAINT_BARS = 100;
18145
18163
  var GAP_FACTOR = 1.5;
18146
18164
  var HEAL_COOLDOWN_MS = 5e3;
18147
18165
  var EngineOrchestrator = class _EngineOrchestrator {
@@ -18411,6 +18429,7 @@ var EngineOrchestrator = class _EngineOrchestrator {
18411
18429
  let painted = false;
18412
18430
  const paint = (bars, final) => {
18413
18431
  if (this.generation !== gen || !final && bars.length === 0) return;
18432
+ if (!painted && !final && bars.length < Math.min(requested, FIRST_PAINT_BARS)) return;
18414
18433
  this.setBarSeries(bars, painted ? { preserveView: true } : void 0);
18415
18434
  if (!painted && bars.length > 0) {
18416
18435
  painted = true;
@@ -19041,6 +19060,15 @@ var EngineOrchestrator = class _EngineOrchestrator {
19041
19060
  record.pendingCause = "inputs";
19042
19061
  if (record.session) record.session.update(record.inputValues);
19043
19062
  else if (record.native && !record.hidden) record.native.instance.setInputs(record.inputValues);
19063
+ this.events.emit("indicator:inputs", { id });
19064
+ }
19065
+ /** IndicatorController: the CURRENT stored input values (defaults merged with edits). */
19066
+ inputValuesOf(id) {
19067
+ return { ...this.registry.get(id)?.inputValues };
19068
+ }
19069
+ /** IndicatorController: the CURRENT declaration-prop overrides. */
19070
+ propValuesOf(id) {
19071
+ return { ...this.registry.get(id)?.propValues };
19044
19072
  }
19045
19073
  /** IndicatorController: re-run an indicator with merged declaration-prop overrides.
19046
19074
  * Same lifecycle as {@link applyInputs} — a prop change replays the whole script.
@@ -19054,6 +19082,7 @@ var EngineOrchestrator = class _EngineOrchestrator {
19054
19082
  if (!record.hidden) this.setLoading(record, true);
19055
19083
  record.pendingCause = "inputs";
19056
19084
  record.session.update(record.inputValues, record.propValues);
19085
+ this.events.emit("indicator:inputs", { id });
19057
19086
  }
19058
19087
  /** IndicatorController: tear down an indicator and (if now empty) its pane. */
19059
19088
  /** Live handles of every indicator on the chart (script + native), insertion order. */
@@ -20275,6 +20304,14 @@ function inputVisible(when, values) {
20275
20304
  const conds = Array.isArray(when) ? when : [when];
20276
20305
  return conds.every((c) => c.anyOf ? c.anyOf.some((x) => x === values[c.key]) : values[c.key] === c.equals);
20277
20306
  }
20307
+ function inputDeltas(schema, values) {
20308
+ const out = {};
20309
+ for (const s of schema) {
20310
+ const v = values[s.key];
20311
+ if (v !== void 0 && JSON.stringify(v) !== JSON.stringify(s.defval)) out[s.key] = v;
20312
+ }
20313
+ return Object.keys(out).length > 0 ? out : void 0;
20314
+ }
20278
20315
 
20279
20316
  // src/renderers/shared/IndicatorInputsDialog.ts
20280
20317
  var PROPS_TAB = "Properties";
@@ -23862,6 +23899,7 @@ var DOUBLE_TAP_MS = 350;
23862
23899
  var DOUBLE_TAP_SLOP = 30;
23863
23900
  var TIME_SCALE_K = 4e-3;
23864
23901
  var WHEEL_ZOOM_K = 4e-3;
23902
+ var WHEEL_PRICE_DRAG_PX = 0.25;
23865
23903
  function wheelZoomAnchor(coords, cursorX, rightEdge) {
23866
23904
  if (rightEdge) return { logical: coords.rightEdgeLogical, x: coords.width };
23867
23905
  return { logical: coords.xToLogical(cursorX), x: cursorX };
@@ -23992,7 +24030,7 @@ var InputController = class {
23992
24030
  this.capture(e.pointerId);
23993
24031
  return;
23994
24032
  }
23995
- if (e.shiftKey && this.regionAt(x, y) === "data" && this.deps.drawingsMeasureStart?.(x, y)) {
24033
+ if (e.shiftKey && this.regionAt(x, y) === "data" && this.deps.drawingsMeasureStart?.(x, y, this.snapMode(e))) {
23996
24034
  this.region = "drawing";
23997
24035
  this.capture(e.pointerId);
23998
24036
  return;
@@ -24106,7 +24144,7 @@ var InputController = class {
24106
24144
  const wasTouch = e.pointerType === "touch";
24107
24145
  const tapRelease = this.dragging && !this.moved && (!wasTouch || Math.hypot(x - this.startX, y - this.startY) <= TOUCH_TAP_SLOP);
24108
24146
  if (this.dragging && this.region === "drawing") {
24109
- this.deps.drawingsPointerUp?.(x, y);
24147
+ this.deps.drawingsPointerUp?.(x, y, this.snapMode(e));
24110
24148
  } else if (tapRelease && this.region === "data") {
24111
24149
  this.deps.onClick(x, y);
24112
24150
  } else if (this.dragging && this.region === "data") {
@@ -24127,7 +24165,7 @@ var InputController = class {
24127
24165
  if (e.pointerType === "touch") this.touches.delete(e.pointerId);
24128
24166
  this.cancelLongPress();
24129
24167
  if (!this.dragging) return;
24130
- if (this.region === "drawing" && !Number.isNaN(this.cursorX)) this.deps.drawingsPointerUp?.(this.cursorX, this.cursorY);
24168
+ if (this.region === "drawing" && !Number.isNaN(this.cursorX)) this.deps.drawingsPointerUp?.(this.cursorX, this.cursorY, this.snapMode(e));
24131
24169
  if (this.region === "crosshair" || e.pointerType === "touch") this.deps.onPointerMove(null, null);
24132
24170
  this.endGesture(e);
24133
24171
  };
@@ -24143,6 +24181,12 @@ var InputController = class {
24143
24181
  this.onWheel = (e) => {
24144
24182
  e.preventDefault();
24145
24183
  this.deps.drawingsClearTransient?.();
24184
+ const { x, y } = this.local(e);
24185
+ if (this.regionAt(x, y) === "price" && e.deltaY !== 0) {
24186
+ this.deps.beginPriceScale(x, y);
24187
+ this.deps.priceScaleBy(e.deltaY * WHEEL_PRICE_DRAG_PX);
24188
+ return;
24189
+ }
24146
24190
  const coords = this.deps.getCoords();
24147
24191
  const vp = coords.getViewport();
24148
24192
  const pan = wheelPanDelta(e.deltaX, e.deltaY, e.shiftKey);
@@ -24150,9 +24194,8 @@ var InputController = class {
24150
24194
  this.deps.apply({ barSpacing: vp.barSpacing, rightOffset: wheelPanRightOffset(vp.rightOffset, pan, coords.pxPerBar()) });
24151
24195
  return;
24152
24196
  }
24153
- const cursorX = this.local(e).x;
24154
24197
  const rightEdge = this.rightEdgeZoom && !(e.ctrlKey || e.metaKey);
24155
- const anchor = wheelZoomAnchor(coords, cursorX, rightEdge);
24198
+ const anchor = wheelZoomAnchor(coords, x, rightEdge);
24156
24199
  const target = clampBarSpacing(vp.barSpacing * Math.exp(-e.deltaY * WHEEL_ZOOM_K));
24157
24200
  this.deps.zoomTo(target, anchor.logical, anchor.x);
24158
24201
  };
@@ -25634,6 +25677,15 @@ function drawingSetEmpty(s) {
25634
25677
  function fontSizePx(size) {
25635
25678
  return size === "auto" ? 12 : namedFontSize(size);
25636
25679
  }
25680
+ function lineCoversWindow(a, b, extend, lo, hi) {
25681
+ const minX = Math.min(a, b);
25682
+ const maxX = Math.max(a, b);
25683
+ if (a === b) return a >= lo && a <= hi;
25684
+ if (extend === "both") return true;
25685
+ if (extend === "left") return maxX >= lo;
25686
+ if (extend === "right") return minX <= hi;
25687
+ return maxX >= lo && minX <= hi;
25688
+ }
25637
25689
  var DrawingSceneRenderer = class {
25638
25690
  constructor(deps, set = EMPTY_DRAWING_SET) {
25639
25691
  this.deps = deps;
@@ -25698,7 +25750,7 @@ var DrawingSceneRenderer = class {
25698
25750
  };
25699
25751
  for (const ln of this.set.lines) {
25700
25752
  if (ln.invisible) continue;
25701
- if (!visible(this.logicalOf(ln.xloc, ln.x1), this.logicalOf(ln.xloc, ln.x2), ln.extend)) continue;
25753
+ if (!lineCoversWindow(this.logicalOf(ln.xloc, ln.x1), this.logicalOf(ln.xloc, ln.x2), ln.extend, lo, hi)) continue;
25702
25754
  fold(ln.y1);
25703
25755
  fold(ln.y2);
25704
25756
  }
@@ -29548,6 +29600,22 @@ var DrawingInteraction = class {
29548
29600
  this.snapAt = changed ? { point: snapped, paneId } : null;
29549
29601
  return snapped;
29550
29602
  }
29603
+ /**
29604
+ * Resolve a cursor pixel through the magnet and return the snapped pixel — the same
29605
+ * conversion drawing placement uses. Updates the snap-ring marker. The measure
29606
+ * ruler goes through this so its endpoints follow weak/strong/Ctrl magnet too.
29607
+ */
29608
+ snapCursor(x, y, mode) {
29609
+ const proj = this.deps.projector();
29610
+ const paneId = proj.paneIdAtY(y) ?? "price";
29611
+ const point = this.resolve(x, y, paneId, mode);
29612
+ const sy = proj.yOf(point.price, paneId);
29613
+ return { x: proj.xOf(point.time), y: sy ?? y };
29614
+ }
29615
+ /** Drop the snap-ring marker (a transient mode ended without going through `up`). */
29616
+ clearSnapMarker() {
29617
+ this.snapAt = null;
29618
+ }
29551
29619
  /** Resolve a pixel to a data point with the segment angle locked to 45° steps around
29552
29620
  * `pivot` (Shift held on a line tool). Works in PIXEL space — the user reasons about
29553
29621
  * the angle they see, not about time/price units. The magnet is bypassed: snapping
@@ -30953,30 +31021,39 @@ var MeasureOverlay = class {
30953
31021
  isFinished() {
30954
31022
  return this.state === "finished";
30955
31023
  }
30956
- /** A press: begin the measurement, or finish it on the second click. */
30957
- down(x, y) {
31024
+ /** A press: begin the measurement, or finish it on the second click.
31025
+ * `x,y` are the raw cursor (drag-slop vs click-move-click). `gx,gy` are the
31026
+ * graphic endpoints — magnet-snapped when the magnet is on, else the same as `x,y`. */
31027
+ down(x, y, gx = x, gy = y) {
30958
31028
  if (this.state === "measuring") {
30959
- this.end = { x, y };
31029
+ this.end = { x: gx, y: gy };
30960
31030
  this.state = "finished";
30961
31031
  return;
30962
31032
  }
30963
- this.start = { x, y };
30964
- this.end = { x, y };
31033
+ this.start = { x: gx, y: gy };
31034
+ this.end = { x: gx, y: gy };
30965
31035
  this.pressX = x;
30966
31036
  this.pressY = y;
30967
31037
  this.state = "measuring";
30968
31038
  }
31039
+ /** Size the in-progress ruler. `x,y` are the graphic (magnet-snapped) cursor. */
30969
31040
  move(x, y) {
30970
31041
  if (this.state === "measuring") this.end = { x, y };
30971
31042
  }
30972
31043
  /** A release: finish if the press was actually dragged (press-drag-release), else wait
30973
- * for the second click (click-move-click). */
30974
- up(x, y) {
31044
+ * for the second click (click-move-click). `x,y` are the raw cursor (slop); `gx,gy`
31045
+ * are the graphic end (magnet-snapped when the magnet is on). */
31046
+ up(x, y, gx = x, gy = y) {
30975
31047
  if (this.state === "measuring" && Math.hypot(x - this.pressX, y - this.pressY) > DRAG_SLOP4) {
30976
- this.end = { x, y };
31048
+ this.end = { x: gx, y: gy };
30977
31049
  this.state = "finished";
30978
31050
  }
30979
31051
  }
31052
+ /** Current graphic endpoints in media pixels, or null when idle. */
31053
+ points() {
31054
+ if (!this.start || !this.end) return null;
31055
+ return { start: this.start, end: this.end };
31056
+ }
30980
31057
  clear() {
30981
31058
  this.state = "idle";
30982
31059
  this.start = null;
@@ -31353,11 +31430,13 @@ var UserDrawingController = class {
31353
31430
  }
31354
31431
  /** Shift+press on the empty plot: arm the measure ruler AND start it at (x, y) in one
31355
31432
  * gesture — the equivalent of clicking the toolbar's Measure button, then pressing.
31356
- * Returns false when a mode/tool is already active (the normal press path owns it). */
31357
- beginMeasureAt(x, y) {
31433
+ * `snap` is the effective magnet (sticky mode, or Ctrl/Cmd-forced strong). Returns
31434
+ * false when a mode/tool is already active (the normal press path owns it). */
31435
+ beginMeasureAt(x, y, snap = "off") {
31358
31436
  if (this.measureMode || this.eraserMode || this.activeTool != null) return false;
31359
31437
  this.withModeIntent(() => this.toggleMeasure());
31360
- this.measure.down(x, y);
31438
+ const g = this.interaction.snapCursor(x, y, snap);
31439
+ this.measure.down(x, y, g.x, g.y);
31361
31440
  this.render();
31362
31441
  return true;
31363
31442
  }
@@ -31379,7 +31458,8 @@ var UserDrawingController = class {
31379
31458
  return;
31380
31459
  }
31381
31460
  if (this.measureMode) {
31382
- this.measure.down(x, y);
31461
+ const g = this.interaction.snapCursor(x, y, snap);
31462
+ this.measure.down(x, y, g.x, g.y);
31383
31463
  if (this.measure.isFinished()) this.withModeIntent(() => this.exitMeasure(false));
31384
31464
  this.render();
31385
31465
  return;
@@ -31392,7 +31472,8 @@ var UserDrawingController = class {
31392
31472
  return;
31393
31473
  }
31394
31474
  if (this.measureMode) {
31395
- this.measure.move(x, y);
31475
+ const g = this.interaction.snapCursor(x, y, snap);
31476
+ this.measure.move(g.x, g.y);
31396
31477
  this.render();
31397
31478
  return;
31398
31479
  }
@@ -31410,13 +31491,14 @@ var UserDrawingController = class {
31410
31491
  this.render();
31411
31492
  }
31412
31493
  }
31413
- pointerUp(x, y) {
31494
+ pointerUp(x, y, snap = "off") {
31414
31495
  if (this.eraserMode) {
31415
31496
  this.erasing = false;
31416
31497
  return;
31417
31498
  }
31418
31499
  if (this.measureMode) {
31419
- this.measure.up(x, y);
31500
+ const g = this.interaction.snapCursor(x, y, snap);
31501
+ this.measure.up(x, y, g.x, g.y);
31420
31502
  if (this.measure.isFinished()) this.withModeIntent(() => this.exitMeasure(false));
31421
31503
  this.render();
31422
31504
  return;
@@ -31461,6 +31543,7 @@ var UserDrawingController = class {
31461
31543
  /** Leave ruler mode. `clearGraphic` keeps a just-finished measurement on screen (false). */
31462
31544
  exitMeasure(clearGraphic = true) {
31463
31545
  this.measureMode = false;
31546
+ this.interaction.clearSnapMarker();
31464
31547
  if (clearGraphic) this.measure.clear();
31465
31548
  this.toolbar.setMeasureActive(false);
31466
31549
  this.render();
@@ -31601,15 +31684,28 @@ var UserDrawingController = class {
31601
31684
  if (this.eraserMode) return "pointer";
31602
31685
  return this.interaction.cursorAt(x, y);
31603
31686
  }
31604
- /** Right-click while placing: cancel the in-progress drawing and revert to the
31605
- * pointer the gesture is an explicit escape, so it disarms even in
31606
- * stay-in-drawing-mode (where Escape would leave the tool armed). Returns whether
31607
- * the press was consumed; false lets the host's context menu open normally. */
31687
+ /** Right-click: an explicit escape back to the pointer. Cancels an in-progress
31688
+ * placement or measurement, and also plain-disarms an armed-but-idle drawing
31689
+ * tool or the eraser — so a right-click ALWAYS reverts to the pointer, even in
31690
+ * stay-in-drawing-mode (where Escape would leave a drawing tool armed).
31691
+ * Persistent toggles (magnet, stay-mode, favorites) are untouched. Returns
31692
+ * whether the press was consumed; false lets the host's context menu open
31693
+ * normally. */
31608
31694
  cancelPlacement() {
31609
- if (!this.interaction.isPlacing()) return false;
31610
- this.interaction.cancel();
31611
- if (this.activeTool != null) this.emit({ kind: "arm", type: null });
31612
- return true;
31695
+ if (this.measureMode || this.eraserMode) {
31696
+ this.withModeIntent(() => this.measureMode ? this.exitMeasure() : this.exitEraser());
31697
+ return true;
31698
+ }
31699
+ if (this.interaction.isPlacing()) {
31700
+ this.interaction.cancel();
31701
+ if (this.activeTool != null) this.emit({ kind: "arm", type: null });
31702
+ return true;
31703
+ }
31704
+ if (this.activeTool != null) {
31705
+ this.emit({ kind: "arm", type: null });
31706
+ return true;
31707
+ }
31708
+ return false;
31613
31709
  }
31614
31710
  /** Double-click over a drawing → suppress the chart's view reset (single-click already
31615
31711
  * opens settings). Returns true only when a drawing is under the cursor. */
@@ -31635,6 +31731,10 @@ var UserDrawingController = class {
31635
31731
  return true;
31636
31732
  }
31637
31733
  if (this.interaction.cancel()) return true;
31734
+ if (this.measureMode) {
31735
+ this.withModeIntent(() => this.exitMeasure());
31736
+ return true;
31737
+ }
31638
31738
  if (this.selectedIds.size) {
31639
31739
  this.clearSelection();
31640
31740
  return true;
@@ -34059,13 +34159,13 @@ var NativeRenderer = class {
34059
34159
  resetView: () => this.resetView(),
34060
34160
  // User drawings claim a gesture before pan when armed / over a drawing.
34061
34161
  drawingsClaim: (x, y) => this.userDrawings?.claim(x, y) ?? false,
34062
- drawingsMeasureStart: (x, y) => this.userDrawings?.beginMeasureAt(x, y) ?? false,
34162
+ drawingsMeasureStart: (x, y, snap) => this.userDrawings?.beginMeasureAt(x, y, snap) ?? false,
34063
34163
  drawingsDeleteAt: (x, y) => this.userDrawings?.deleteAt(x, y) ?? false,
34064
34164
  drawingsCancelPlacement: () => this.userDrawings?.cancelPlacement() ?? false,
34065
34165
  drawingsSnapMode: () => this.snapMode,
34066
34166
  drawingsPointerDown: (x, y, snap, shift) => this.userDrawings?.pointerDown(x, y, snap, shift),
34067
34167
  drawingsPointerMove: (x, y, snap, shift) => this.userDrawings?.pointerMove(x, y, snap, shift),
34068
- drawingsPointerUp: (x, y) => this.userDrawings?.pointerUp(x, y),
34168
+ drawingsPointerUp: (x, y, snap) => this.userDrawings?.pointerUp(x, y, snap),
34069
34169
  drawingsCursor: (x, y) => this.userDrawings?.cursorAt(x, y) ?? null,
34070
34170
  drawingsDblClick: (x, y) => this.userDrawings?.dblClick(x, y) ?? false,
34071
34171
  drawingsClearTransient: () => this.userDrawings?.clearTransient()
@@ -34380,7 +34480,8 @@ var NativeRenderer = class {
34380
34480
  }
34381
34481
  const skipFit = opts?.preserveView === true && this.didInitialFit;
34382
34482
  if (this.coords.width > 0 && !skipFit) {
34383
- this.fitContent();
34483
+ if (this.didInitialFit) this.reframeKeepZoom();
34484
+ else this.fitContent();
34384
34485
  this.didInitialFit = true;
34385
34486
  }
34386
34487
  if (!this.introPlayed && this.bars.length > 0) {
@@ -35028,6 +35129,7 @@ var NativeRenderer = class {
35028
35129
  this.scaleDragHeight = res.height;
35029
35130
  this.scaleDragStart = { ...res.holder.scale };
35030
35131
  res.holder.manualScale = { ...res.holder.scale };
35132
+ this.axisScaleButtons?.reposition();
35031
35133
  this.scheduler.invalidate(4 /* Full */);
35032
35134
  }
35033
35135
  /** Rescale the grabbed scale around its center by the total drag (down ⇒ zoom out). */
@@ -35059,6 +35161,7 @@ var NativeRenderer = class {
35059
35161
  const res = this.resolveScaleHolder(x, y);
35060
35162
  if (!res) return;
35061
35163
  res.holder.manualScale = null;
35164
+ this.axisScaleButtons?.reposition();
35062
35165
  this.scheduler.invalidate(4 /* Full */);
35063
35166
  }
35064
35167
  /**
@@ -35696,6 +35799,20 @@ var NativeRenderer = class {
35696
35799
  this.coords.setViewport(v);
35697
35800
  this.targetBarSpacing = v.barSpacing;
35698
35801
  }
35802
+ /** Re-frame after a series replacement (a symbol/timeframe switch): keep the user's
35803
+ * zoom (bar spacing), re-anchor the newest bars at the default right offset.
35804
+ * `clampViewport`'s fit-all-bars floor deliberately does NOT apply — a progressive
35805
+ * head may still be backfilling toward the previous depth, and raising the spacing
35806
+ * to its temporary bar count would lose the zoom this exists to keep. */
35807
+ reframeKeepZoom() {
35808
+ this.animator?.stop();
35809
+ this.panVelocity = 0;
35810
+ for (const pane of this.scene.panes.values()) pane.manualScale = null;
35811
+ for (const sl of this.scene.indicatorScales.values()) sl.manualScale = null;
35812
+ const v = { barSpacing: clampBarSpacing(this.coords.getViewport().barSpacing), rightOffset: defaultViewport().rightOffset };
35813
+ this.coords.setViewport(v);
35814
+ this.targetBarSpacing = v.barSpacing;
35815
+ }
35699
35816
  paneBoundsFor(paneId) {
35700
35817
  const p = this.scene.panes.get(paneId);
35701
35818
  return { top: p?.bounds.top ?? 0, height: p?.bounds.height ?? 0, rightAxis: this.rightAxisW };
@@ -37397,6 +37514,7 @@ var TIME_AXIS_H2 = 22;
37397
37514
  var CONTROLS_BOTTOM_PX = TIME_AXIS_H2 + 12;
37398
37515
  var CLUSTER_H2 = 24;
37399
37516
  var CLUSTER_PILL2 = "rgba(0,0,0,0.65)";
37517
+ var CLUSTER_LEFT_CSS = "calc((100% + var(--vela-toolbar-gutter, 0px) - var(--vela-scale-gutter, 0px)) / 2)";
37400
37518
  var STYLE_ID26 = "vela-cell-controls";
37401
37519
  var CSS23 = `
37402
37520
  .vela-cc-btn{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;padding:0;border:none;border-radius:var(--vela-radius-sm);background:transparent;line-height:0;font-size:12px;color:var(--vela-fg-muted);cursor:pointer;}
@@ -37406,8 +37524,11 @@ var CSS23 = `
37406
37524
  .vela-cc-grip{cursor:grab;touch-action:none;}
37407
37525
  .vela-cc-grip:active{cursor:grabbing;}
37408
37526
  `;
37409
- function nearBottomCenter(x, y, width, height, proximityPx = CELL_CONTROLS_PROXIMITY_PX) {
37410
- const cx = width / 2;
37527
+ function plotCenterX(width, toolbarGutter = 0, scaleGutter = 0) {
37528
+ return (width + toolbarGutter - scaleGutter) / 2;
37529
+ }
37530
+ function nearBottomCenter(x, y, width, height, proximityPx = CELL_CONTROLS_PROXIMITY_PX, gutters = {}) {
37531
+ const cx = plotCenterX(width, gutters.toolbar ?? 0, gutters.scale ?? 0);
37411
37532
  const cy = height - CONTROLS_BOTTOM_PX - CLUSTER_H2 / 2;
37412
37533
  return Math.hypot(x - cx, y - cy) <= proximityPx;
37413
37534
  }
@@ -37426,7 +37547,7 @@ var CellControls = class {
37426
37547
  if (this.suspended) return;
37427
37548
  if (this.dragging) return;
37428
37549
  const rect = this.host.getBoundingClientRect();
37429
- this.setNear(nearBottomCenter(e.clientX - rect.left, e.clientY - rect.top, rect.width, rect.height));
37550
+ this.setNear(nearBottomCenter(e.clientX - rect.left, e.clientY - rect.top, rect.width, rect.height, CELL_CONTROLS_PROXIMITY_PX, this.hostGutters()));
37430
37551
  };
37431
37552
  this.onHostLeave = () => {
37432
37553
  if (this.dragging) return;
@@ -37437,7 +37558,7 @@ var CellControls = class {
37437
37558
  this.root = host.ownerDocument.createElement("div");
37438
37559
  Object.assign(this.root.style, {
37439
37560
  position: "absolute",
37440
- left: "50%",
37561
+ left: CLUSTER_LEFT_CSS,
37441
37562
  bottom: `${CONTROLS_BOTTOM_PX}px`,
37442
37563
  transform: "translateX(-50%)",
37443
37564
  zIndex: "6",
@@ -37537,6 +37658,16 @@ var CellControls = class {
37537
37658
  this.suspended = on;
37538
37659
  if (on) this.setNear(false);
37539
37660
  }
37661
+ /** Live renderer gutters on the cell host (0 when unpublished — a test stub). */
37662
+ hostGutters() {
37663
+ const view = this.host.ownerDocument.defaultView;
37664
+ if (!view) return { toolbar: 0, scale: 0 };
37665
+ const cs = view.getComputedStyle(this.host);
37666
+ return {
37667
+ toolbar: Number.parseFloat(cs.getPropertyValue("--vela-toolbar-gutter")) || 0,
37668
+ scale: Number.parseFloat(cs.getPropertyValue("--vela-scale-gutter")) || 0
37669
+ };
37670
+ }
37540
37671
  setNear(near) {
37541
37672
  if (near === this.near) return;
37542
37673
  this.near = near;
@@ -37777,6 +37908,12 @@ function cellDrawings(opt) {
37777
37908
  if (opt === true || opt == null) return { toolbar: false };
37778
37909
  return { ...opt, toolbar: false };
37779
37910
  }
37911
+ function instanceDeltas(handle) {
37912
+ if (!handle) return void 0;
37913
+ const inputs = inputDeltas(handle.inputs, handle.inputValues());
37914
+ const props = inputDeltas(handle.props, handle.propValues());
37915
+ return inputs || props ? { ...inputs ? { inputs } : {}, ...props ? { props } : {} } : void 0;
37916
+ }
37780
37917
  var ChartCell = class {
37781
37918
  constructor(id, gridHost, seed, deps) {
37782
37919
  this.id = id;
@@ -37952,6 +38089,7 @@ var ChartCell = class {
37952
38089
  this.syncPresentNatives();
37953
38090
  this.refreshNativeCatalog();
37954
38091
  });
38092
+ this.inner.on("indicator:inputs", () => this.deps.onStateDirty());
37955
38093
  this.inner.on("indicator:removed", ({ id: id2 }) => {
37956
38094
  if (this.destroyed) return;
37957
38095
  const idx = this.instances.findIndex((it) => it.handle?.id === id2);
@@ -37960,7 +38098,7 @@ var ChartCell = class {
37960
38098
  this.instances.splice(idx, 1);
37961
38099
  this.history.push({
37962
38100
  undo: () => {
37963
- snapshot.handle = this.addToChart(snapshot.entry);
38101
+ snapshot.handle = this.addToChart(snapshot.entry, snapshot.values);
37964
38102
  this.instances.push(snapshot);
37965
38103
  this.deps.onIndicatorsChanged(this.id);
37966
38104
  },
@@ -38349,9 +38487,9 @@ var ChartCell = class {
38349
38487
  this.manifest = list;
38350
38488
  if (this.pendingManifestNames) {
38351
38489
  if (list.length === 0) return;
38352
- for (const name of this.pendingManifestNames) {
38353
- const entry = list.find((e) => e.name === name);
38354
- if (entry) this.addManifestInstance(entry, { record: false });
38490
+ for (const led of this.pendingManifestNames) {
38491
+ const entry = list.find((e) => e.name === ledgerEntryName(led));
38492
+ if (entry) this.addManifestInstance(entry, { record: false, ...typeof led === "object" ? { inputs: led.inputs, props: led.props } : {} });
38355
38493
  }
38356
38494
  this.pendingManifestNames = null;
38357
38495
  return;
@@ -38381,9 +38519,9 @@ var ChartCell = class {
38381
38519
  }
38382
38520
  for (const it of [...this.instances]) this.dropInstance(it);
38383
38521
  if (this.manifest.length > 0) {
38384
- for (const name of led.manifest) {
38385
- const entry = this.manifest.find((e) => e.name === name);
38386
- if (entry) this.addManifestInstance(entry, { record: false });
38522
+ for (const item of led.manifest) {
38523
+ const entry = this.manifest.find((e) => e.name === ledgerEntryName(item));
38524
+ if (entry) this.addManifestInstance(entry, { record: false, ...typeof item === "object" ? { inputs: item.inputs, props: item.props } : {} });
38387
38525
  }
38388
38526
  this.pendingManifestNames = null;
38389
38527
  } else if (!this.deps.manifestSettled()) {
@@ -38432,12 +38570,13 @@ var ChartCell = class {
38432
38570
  * a persistence handler's `restore` runs silently, a user-driven call records.
38433
38571
  */
38434
38572
  addExternalIndicator(entry) {
38435
- this.addManifestInstance({ ...entry, enabled: true }, { external: true });
38573
+ this.addManifestInstance({ ...entry, enabled: true }, { external: true, ...entry.inputs ? { inputs: entry.inputs } : {}, ...entry.props ? { props: entry.props } : {} });
38436
38574
  }
38437
38575
  /** Add ONE instance of a manifest entry (repeatable — duplicates are legitimate). */
38438
38576
  addManifestInstance(entry, opts = {}) {
38439
38577
  if (this.destroyed) return;
38440
- const it = { entry, handle: this.addToChart(entry), ...opts.external ? { external: true } : {} };
38578
+ const values = opts.inputs || opts.props ? { inputs: opts.inputs, props: opts.props } : void 0;
38579
+ const it = { entry, handle: this.addToChart(entry, values), ...opts.external ? { external: true } : {}, ...values ? { values } : {} };
38441
38580
  this.instances.push(it);
38442
38581
  this.deps.onIndicatorsChanged(this.id);
38443
38582
  if (opts.record === false) return;
@@ -38445,7 +38584,7 @@ var ChartCell = class {
38445
38584
  this.history.push({
38446
38585
  undo: () => this.dropInstance(snapshot),
38447
38586
  redo: () => {
38448
- snapshot.handle = this.addToChart(snapshot.entry);
38587
+ snapshot.handle = this.addToChart(snapshot.entry, snapshot.values);
38449
38588
  this.instances.push(snapshot);
38450
38589
  this.deps.onIndicatorsChanged(this.id);
38451
38590
  }
@@ -38458,7 +38597,7 @@ var ChartCell = class {
38458
38597
  const snapshot = it;
38459
38598
  this.history.push({
38460
38599
  undo: () => {
38461
- snapshot.handle = this.addToChart(snapshot.entry);
38600
+ snapshot.handle = this.addToChart(snapshot.entry, snapshot.values);
38462
38601
  this.instances.push(snapshot);
38463
38602
  this.deps.onIndicatorsChanged(this.id);
38464
38603
  },
@@ -38468,6 +38607,9 @@ var ChartCell = class {
38468
38607
  dropInstance(it) {
38469
38608
  const idx = this.instances.indexOf(it);
38470
38609
  if (idx >= 0) this.instances.splice(idx, 1);
38610
+ const captured = instanceDeltas(it.handle);
38611
+ if (captured) it.values = captured;
38612
+ else delete it.values;
38471
38613
  try {
38472
38614
  it.handle?.remove();
38473
38615
  } catch {
@@ -38510,9 +38652,13 @@ var ChartCell = class {
38510
38652
  this.deps.onIndicatorsChanged(this.id);
38511
38653
  });
38512
38654
  }
38513
- addToChart(entry) {
38655
+ addToChart(entry, values) {
38514
38656
  try {
38515
- return this.inner?.addIndicator(entry.script, entry.language !== void 0 ? { language: entry.language } : void 0) ?? null;
38657
+ return this.inner?.addIndicator(entry.script, {
38658
+ ...entry.language !== void 0 ? { language: entry.language } : {},
38659
+ ...values?.inputs ? { inputs: values.inputs } : {},
38660
+ ...values?.props ? { props: values.props } : {}
38661
+ }) ?? null;
38516
38662
  } catch (err) {
38517
38663
  console.warn(`[vela] indicator "${entry.name}" failed to add:`, err);
38518
38664
  return null;
@@ -38626,7 +38772,10 @@ var ChartCell = class {
38626
38772
  // manifest — their plugin persists them via the `ext` seam instead.
38627
38773
  indicators: indicatorLedger({
38628
38774
  present: this.inner ? this.inner.presentNativeIndicators() : [],
38629
- instanceNames: this.instances.filter((it) => !it.external).map((it) => it.entry.name),
38775
+ instanceEntries: this.instances.filter((it) => !it.external).map((it) => {
38776
+ const d = it.handle ? instanceDeltas(it.handle) : it.values;
38777
+ return d ? { name: it.entry.name, ...d } : it.entry.name;
38778
+ }),
38630
38779
  pendingManifest: this.pendingManifestNames,
38631
38780
  manifestSettled: this.deps.manifestSettled(),
38632
38781
  volumePending: this.volumeMayBePending && this.volumeIntent
package/dist/widget.d.cts CHANGED
@@ -1,10 +1,10 @@
1
- import { V as Vela, W as WidgetContext, K as SidePanelButton } from './contributions-D9vTzm5p.cjs';
2
- export { C as CellStateContext, az as DEFAULT_PANEL_ORDER, E as ExternalIndicatorEntry, O as OVERRIDABLE_TOPBAR_IDS, M as SidePanelDescriptor, Q as SidePanelHandle, U as StatePersistenceHandler, _ as SymbolRankingHook, a3 as WidgetActionDescriptor, a4 as WidgetActionTarget, a5 as WidgetAttachment, af as registerSidePanel, ag as registerStatePersistence, ah as registerSymbolRanking, ai as registerWidgetAction, aj as registerWidgetAttachment, al as sidePanels, am as statePersistenceHandlers, an as symbolRanking, ao as topbarActionOverride, at as unregisterSidePanel, au as unregisterStatePersistence, av as unregisterWidgetAction, aw as unregisterWidgetAttachment, ax as widgetActions, ay as widgetAttachments } from './contributions-D9vTzm5p.cjs';
3
- import { b as VelaOptions, d as MarketSession, T as ThemeName, c as VelaTheme, s as DataWindowReadout } from './options-DSqHsQyN.cjs';
4
- import { c as VelaShellOptions, W as WidgetHistory, b as RangePreset, f as WorkspaceState, j as TopbarComposition, P as PanelsState } from './statusline-TYLQmoeh.cjs';
5
- export { B as Bottombar, k as BottombarOptions, C as CellState, g as ChartState, I as IndicatorLoader, l as IndicatorManifest, m as IndicatorManifestEntry, n as RANGE_PRESETS, R as ResolvedIndicator, o as ResolvedTopbarComposition, p as Statusline, q as TOPBAR_BUILTIN_IDS, r as TOPBAR_DEFAULT_LEFT, t as TOPBAR_DEFAULT_RIGHT, V as VelaStorage, u as WidgetStorage, h as decodeState, i as encodeState, v as localStorageAdapter, w as pinnedTopbarActionIds, x as resolveIndicators, y as resolveTopbarComposition, s as sanitizeState, z as topbarHas } from './statusline-TYLQmoeh.cjs';
1
+ import { V as Vela, W as WidgetContext, K as SidePanelButton } from './contributions-CO01zWve.cjs';
2
+ export { C as CellStateContext, az as DEFAULT_PANEL_ORDER, E as ExternalIndicatorEntry, O as OVERRIDABLE_TOPBAR_IDS, M as SidePanelDescriptor, Q as SidePanelHandle, U as StatePersistenceHandler, _ as SymbolRankingHook, a3 as WidgetActionDescriptor, a4 as WidgetActionTarget, a5 as WidgetAttachment, af as registerSidePanel, ag as registerStatePersistence, ah as registerSymbolRanking, ai as registerWidgetAction, aj as registerWidgetAttachment, al as sidePanels, am as statePersistenceHandlers, an as symbolRanking, ao as topbarActionOverride, at as unregisterSidePanel, au as unregisterStatePersistence, av as unregisterWidgetAction, aw as unregisterWidgetAttachment, ax as widgetActions, ay as widgetAttachments } from './contributions-CO01zWve.cjs';
3
+ import { b as VelaOptions, d as MarketSession, T as ThemeName, c as VelaTheme, s as DataWindowReadout } from './options-yp7sA96q.cjs';
4
+ import { c as VelaShellOptions, W as WidgetHistory, b as RangePreset, f as WorkspaceState, j as TopbarComposition, P as PanelsState } from './statusline-DTHZUFqK.cjs';
5
+ export { B as Bottombar, k as BottombarOptions, C as CellState, g as ChartState, I as IndicatorLoader, l as IndicatorManifest, m as IndicatorManifestEntry, n as RANGE_PRESETS, R as ResolvedIndicator, o as ResolvedTopbarComposition, p as Statusline, q as TOPBAR_BUILTIN_IDS, r as TOPBAR_DEFAULT_LEFT, t as TOPBAR_DEFAULT_RIGHT, V as VelaStorage, u as WidgetStorage, h as decodeState, i as encodeState, v as localStorageAdapter, w as pinnedTopbarActionIds, x as resolveIndicators, y as resolveTopbarComposition, s as sanitizeState, z as topbarHas } from './statusline-DTHZUFqK.cjs';
6
6
  import { K as KeymapManager } from './keymap-CGOz5F5f.cjs';
7
- import { a as SymbolDescriptor } from './DataProvider-l_eLMly_.cjs';
7
+ import { a as SymbolDescriptor } from './DataProvider-p0TEyhlX.cjs';
8
8
  import { d as SidePanel } from './side-panel-CT9ZwIGz.cjs';
9
9
  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-CT9ZwIGz.cjs';
10
10
 
package/dist/widget.d.ts CHANGED
@@ -1,10 +1,10 @@
1
- import { V as Vela, W as WidgetContext, K as SidePanelButton } from './contributions-BCz6Dr6a.js';
2
- export { C as CellStateContext, az as DEFAULT_PANEL_ORDER, E as ExternalIndicatorEntry, O as OVERRIDABLE_TOPBAR_IDS, M as SidePanelDescriptor, Q as SidePanelHandle, U as StatePersistenceHandler, _ as SymbolRankingHook, a3 as WidgetActionDescriptor, a4 as WidgetActionTarget, a5 as WidgetAttachment, af as registerSidePanel, ag as registerStatePersistence, ah as registerSymbolRanking, ai as registerWidgetAction, aj as registerWidgetAttachment, al as sidePanels, am as statePersistenceHandlers, an as symbolRanking, ao as topbarActionOverride, at as unregisterSidePanel, au as unregisterStatePersistence, av as unregisterWidgetAction, aw as unregisterWidgetAttachment, ax as widgetActions, ay as widgetAttachments } from './contributions-BCz6Dr6a.js';
3
- import { b as VelaOptions, d as MarketSession, T as ThemeName, c as VelaTheme, s as DataWindowReadout } from './options-DSqHsQyN.js';
4
- import { c as VelaShellOptions, W as WidgetHistory, b as RangePreset, f as WorkspaceState, j as TopbarComposition, P as PanelsState } from './statusline-5K7y4Ya2.js';
5
- export { B as Bottombar, k as BottombarOptions, C as CellState, g as ChartState, I as IndicatorLoader, l as IndicatorManifest, m as IndicatorManifestEntry, n as RANGE_PRESETS, R as ResolvedIndicator, o as ResolvedTopbarComposition, p as Statusline, q as TOPBAR_BUILTIN_IDS, r as TOPBAR_DEFAULT_LEFT, t as TOPBAR_DEFAULT_RIGHT, V as VelaStorage, u as WidgetStorage, h as decodeState, i as encodeState, v as localStorageAdapter, w as pinnedTopbarActionIds, x as resolveIndicators, y as resolveTopbarComposition, s as sanitizeState, z as topbarHas } from './statusline-5K7y4Ya2.js';
1
+ import { V as Vela, W as WidgetContext, K as SidePanelButton } from './contributions-Bbe2R-mQ.js';
2
+ export { C as CellStateContext, az as DEFAULT_PANEL_ORDER, E as ExternalIndicatorEntry, O as OVERRIDABLE_TOPBAR_IDS, M as SidePanelDescriptor, Q as SidePanelHandle, U as StatePersistenceHandler, _ as SymbolRankingHook, a3 as WidgetActionDescriptor, a4 as WidgetActionTarget, a5 as WidgetAttachment, af as registerSidePanel, ag as registerStatePersistence, ah as registerSymbolRanking, ai as registerWidgetAction, aj as registerWidgetAttachment, al as sidePanels, am as statePersistenceHandlers, an as symbolRanking, ao as topbarActionOverride, at as unregisterSidePanel, au as unregisterStatePersistence, av as unregisterWidgetAction, aw as unregisterWidgetAttachment, ax as widgetActions, ay as widgetAttachments } from './contributions-Bbe2R-mQ.js';
3
+ import { b as VelaOptions, d as MarketSession, T as ThemeName, c as VelaTheme, s as DataWindowReadout } from './options-yp7sA96q.js';
4
+ import { c as VelaShellOptions, W as WidgetHistory, b as RangePreset, f as WorkspaceState, j as TopbarComposition, P as PanelsState } from './statusline-CHPDuKNp.js';
5
+ export { B as Bottombar, k as BottombarOptions, C as CellState, g as ChartState, I as IndicatorLoader, l as IndicatorManifest, m as IndicatorManifestEntry, n as RANGE_PRESETS, R as ResolvedIndicator, o as ResolvedTopbarComposition, p as Statusline, q as TOPBAR_BUILTIN_IDS, r as TOPBAR_DEFAULT_LEFT, t as TOPBAR_DEFAULT_RIGHT, V as VelaStorage, u as WidgetStorage, h as decodeState, i as encodeState, v as localStorageAdapter, w as pinnedTopbarActionIds, x as resolveIndicators, y as resolveTopbarComposition, s as sanitizeState, z as topbarHas } from './statusline-CHPDuKNp.js';
6
6
  import { K as KeymapManager } from './keymap-CGOz5F5f.js';
7
- import { a as SymbolDescriptor } from './DataProvider-CWmp31dA.js';
7
+ import { a as SymbolDescriptor } from './DataProvider-BBf-jc6W.js';
8
8
  import { d as SidePanel } from './side-panel-CT9ZwIGz.js';
9
9
  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-CT9ZwIGz.js';
10
10