@363045841yyt/klinechart 0.2.12 → 0.2.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -6821,7 +6821,8 @@ function aa(e) {
6821
6821
  priceToY: (t) => e.yAxis.priceToY(t),
6822
6822
  yToPrice: (t) => e.yAxis.yToPrice(t),
6823
6823
  getPaddingTop: () => e.yAxis.getPaddingTop(),
6824
- getPaddingBottom: () => e.yAxis.getPaddingBottom()
6824
+ getPaddingBottom: () => e.yAxis.getPaddingBottom(),
6825
+ getPriceOffset: () => e.yAxis.getPriceOffset()
6825
6826
  },
6826
6827
  priceRange: e.priceRange
6827
6828
  };
@@ -7378,7 +7379,7 @@ var Da = {
7378
7379
  KST: "rgba(69, 112, 249, 1)",
7379
7380
  SIGNAL: "rgba(255, 152, 0, 1)"
7380
7381
  }, Ba = {
7381
- FAST: "#FFD700",
7382
+ FAST: "rgba(255, 152, 0, 1)",
7382
7383
  SLOW: "rgba(69, 112, 249, 1)"
7383
7384
  }, Va = {
7384
7385
  UPPER: "rgba(214, 10, 34, 1)",
@@ -8369,6 +8370,7 @@ var fs = class {
8369
8370
  isTouchSession = !1;
8370
8371
  crosshairPos = null;
8371
8372
  crosshairIndex = null;
8373
+ crosshairPrice = null;
8372
8374
  hoveredIndex = null;
8373
8375
  activePaneId = null;
8374
8376
  tooltipPos = {
@@ -8487,7 +8489,7 @@ var fs = class {
8487
8489
  this.onCustomMarkerClickCallback = e;
8488
8490
  }
8489
8491
  clearHover() {
8490
- this.crosshairPos = null, this.crosshairIndex = null, this.hoveredIndex = null, this.activePaneId = null, this.hoveredMarkerId !== null && (this.hoveredMarkerId = null, this.onMarkerHoverCallback && this.onMarkerHoverCallback(null)), this.hoveredCustomMarker !== null && (this.hoveredCustomMarker = null, this.onCustomMarkerHoverCallback && this.onCustomMarkerHoverCallback(null));
8492
+ this.crosshairPos = null, this.crosshairIndex = null, this.crosshairPrice = null, this.hoveredIndex = null, this.activePaneId = null, this.hoveredMarkerId !== null && (this.hoveredMarkerId = null, this.onMarkerHoverCallback && this.onMarkerHoverCallback(null)), this.hoveredCustomMarker !== null && (this.hoveredCustomMarker = null, this.onCustomMarkerHoverCallback && this.onCustomMarkerHoverCallback(null));
8491
8493
  }
8492
8494
  updateHover(e) {
8493
8495
  this.updateHoverFromPoint(e.clientX, e.clientY);
@@ -8529,11 +8531,14 @@ var fs = class {
8529
8531
  if (this.activePaneId = C?.id || null, x >= 0 && x < (S?.length ?? 0)) {
8530
8532
  this.crosshairIndex = x;
8531
8533
  let e = this.kLinePositions[b] + (this.kWidthPx - 1) / 2 / f - d;
8532
- this.crosshairPos = {
8534
+ if (this.crosshairPos = {
8533
8535
  x: Math.min(Math.max(e, 0), l),
8534
8536
  y: Math.min(Math.max(a, 0), u)
8535
- };
8536
- } else this.crosshairIndex = null, this.crosshairPos = null;
8537
+ }, C) {
8538
+ let e = a - C.top;
8539
+ this.crosshairPrice = C.yAxis.yToPrice(e);
8540
+ } else this.crosshairPrice = null;
8541
+ } else this.crosshairIndex = null, this.crosshairPos = null, this.crosshairPrice = null;
8537
8542
  let w = typeof this.crosshairIndex == "number" ? S[this.crosshairIndex] : void 0;
8538
8543
  if (!w || !C || C.id !== "main") {
8539
8544
  this.hoveredIndex = null;
@@ -8552,7 +8557,7 @@ var fs = class {
8552
8557
  };
8553
8558
  }
8554
8559
  reset() {
8555
- this.isDragging = !1, this.dragStartX = 0, this.dragStartY = 0, this.scrollStartX = 0, this.activePaneIdOnDrag = null, this.isTouchSession = !1, this.crosshairPos = null, this.crosshairIndex = null, this.hoveredIndex = null, this.activePaneId = null, this.hoveredMarkerId = null, this.clickedMarkerId = null, this.hoveredMarkerData = null, this.clickedMarkerData = null, this.kLinePositions = null, this.visibleRange = null, this.kWidthPx = null;
8560
+ this.isDragging = !1, this.dragStartX = 0, this.dragStartY = 0, this.scrollStartX = 0, this.activePaneIdOnDrag = null, this.isTouchSession = !1, this.crosshairPos = null, this.crosshairIndex = null, this.crosshairPrice = null, this.hoveredIndex = null, this.activePaneId = null, this.hoveredMarkerId = null, this.clickedMarkerId = null, this.hoveredMarkerData = null, this.clickedMarkerData = null, this.kLinePositions = null, this.visibleRange = null, this.kWidthPx = null;
8556
8561
  }
8557
8562
  }, hs = class {
8558
8563
  dom;
@@ -8911,7 +8916,7 @@ function As(e = {}) {
8911
8916
  if (u.length < 2) return;
8912
8917
  let d = o(u);
8913
8918
  t.save(), t.translate(-a, 0);
8914
- let f = i.start, p = Math.min(i.end, u.length), m = (e, r) => {
8919
+ let f = i.start, p = Math.min(i.end, u.length), m = Ba.FAST, h = Ba.SLOW, g = (e, r) => {
8915
8920
  t.strokeStyle = r, t.lineWidth = 1, t.lineJoin = "round", t.lineCap = "round", t.beginPath();
8916
8921
  let a = !0;
8917
8922
  for (let r = f; r < p; r++) {
@@ -8922,7 +8927,7 @@ function As(e = {}) {
8922
8927
  }
8923
8928
  t.stroke();
8924
8929
  };
8925
- m("fast", "#FFD700"), m("slow", "rgba(69, 112, 249, 1)"), t.restore();
8930
+ g("fast", m), g("slow", h), t.restore();
8926
8931
  },
8927
8932
  onDataUpdate() {
8928
8933
  n = null;
@@ -9130,7 +9135,7 @@ function Fs(e) {
9130
9135
  value: Ps(a, o, 60)
9131
9136
  }), r.length > 0) {
9132
9137
  let i = 12, a = t.yPaddingPx / 2 + 12 + e * 18;
9133
- n.fillStyle = X.NEUTRAL, n.fillText("均线", i, a), i += n.measureText("均线").width + 10;
9138
+ n.fillStyle = X.NEUTRAL, n.fillText("MA", i, a), i += n.measureText("MA").width + 10;
9134
9139
  for (let e of r) {
9135
9140
  let t = typeof e.value == "number" ? ` ${e.value.toFixed(2)}` : "", r = `${e.label}${t}`;
9136
9141
  n.fillStyle = e.color, n.fillText(r, i, a), i += n.measureText(r).width + 10;
@@ -10295,17 +10300,14 @@ var vc = class e {
10295
10300
  let e = this.getContentWidth(), n = Math.max(0, e - t.clientWidth);
10296
10301
  t.scrollLeft > n && (t.scrollLeft = n);
10297
10302
  }
10298
- this.rendererPluginManager.notifyDataUpdate(this.data, {
10299
- start: 0,
10300
- end: this.data.length
10301
- }), this.interaction.reset(), this.scheduleDraw();
10303
+ this.interaction.reset(), this.scheduleDraw();
10302
10304
  }
10303
10305
  getData() {
10304
10306
  return this.data;
10305
10307
  }
10306
10308
  getContentWidth() {
10307
10309
  let e = this.data?.length ?? 0, t = this.viewport?.dpr || window.devicePixelRatio || 1, { startXPx: n, unitPx: r } = ls(this.opt.kWidth, this.opt.kGap, t);
10308
- return (n + e * r) / t + (this.opt.rightAxisWidth + (this.opt.priceLabelWidth || 60));
10310
+ return (n + e * r) / t;
10309
10311
  }
10310
10312
  resize() {
10311
10313
  let e = this.computeViewport();
@@ -10634,32 +10636,47 @@ function Ac(e, t, n, r, i, a) {
10634
10636
  let o = t - n || 1, s = (e - n) / o;
10635
10637
  return i + Math.max(1, r - i - a) * (1 - s);
10636
10638
  }
10639
+ function jc(e, t, n, r, i, a) {
10640
+ let o = t - n || 1, s = Math.max(1, r - i - a);
10641
+ return n + (1 - (Math.min(Math.max(e, i), i + s) - i) / s) * o;
10642
+ }
10637
10643
  //#endregion
10638
10644
  //#region src/utils/kLineDraw/axis.ts
10639
- function jc(e, t) {
10640
- let { x: n, y: r, width: i, height: a, priceRange: o, yPaddingPx: s = 0, dpr: c, ticks: l = 10, bgColor: u = Oa.TRANSPARENT, textColor: d = Da.SECONDARY, lineColor: f = ka.DARK, fontSize: p = 16, paddingX: m = 12, drawLeftBorder: h = !0, drawTickLines: g = !0 } = t, _ = Math.max(0, Math.min(s, Math.floor(a / 2) - 1)), { maxPrice: v, minPrice: y } = o, b = v - y, x = b === 0 ? 0 : b / (Math.max(2, l) - 1);
10641
- e.fillStyle = u, e.fillRect(n, r, i, a), h && (e.strokeStyle = f, e.lineWidth = 1, e.beginPath(), e.moveTo(Q(n, c), r), e.lineTo(Q(n, c), r + a), e.stroke()), e.font = `${p}px -apple-system,BlinkMacSystemFont,Trebuchet MS,Roboto,Ubuntu,sans-serif`, e.textBaseline = "middle", e.textAlign = "left";
10642
- let S = n + m;
10645
+ function Mc(e, t) {
10646
+ let { x: n, y: r, width: i, height: a, priceRange: o, yPaddingPx: s = 0, dpr: c, ticks: l = 10, bgColor: u = Oa.TRANSPARENT, textColor: d = Da.SECONDARY, lineColor: f = ka.DARK, fontSize: p = 16, drawLeftBorder: m = !0, drawTickLines: h = !0, priceOffset: g = 0 } = t, _ = Math.max(0, Math.min(s, Math.floor(a / 2) - 1)), { maxPrice: v, minPrice: y } = o, b = v - y, x = b === 0 ? 0 : b / (Math.max(2, l) - 1);
10647
+ e.fillStyle = u, e.fillRect(n, r, i, a), m && (e.strokeStyle = f, e.lineWidth = 1, e.beginPath(), e.moveTo(Q(n, c), r), e.lineTo(Q(n, c), r + a), e.stroke()), e.font = `${p}px -apple-system,BlinkMacSystemFont,Trebuchet MS,Roboto,Ubuntu,sans-serif`, e.textBaseline = "middle", e.textAlign = "center";
10648
+ let S = n + i / 2;
10643
10649
  for (let t = 0; t < Math.max(2, l); t++) {
10644
10650
  let i = b === 0 ? v : v - x * t, o = Math.round(Ac(i, v, y, a, _, _) + r);
10645
- if (g) {
10651
+ if (h) {
10646
10652
  e.strokeStyle = f, e.beginPath();
10647
10653
  let t = Q(o, c);
10648
10654
  e.moveTo(n, t), e.lineTo(n + 4, t), e.stroke();
10649
10655
  }
10650
- e.fillStyle = d, e.fillText(i.toFixed(2), Z(S, c), Z(o, c));
10656
+ let s = i + g;
10657
+ e.fillStyle = d, e.fillText(s.toFixed(2), Z(S, c), Z(o, c));
10651
10658
  }
10652
10659
  }
10653
- function Mc(e, t) {
10654
- let { x: n, y: r, width: i, height: a, crosshairX: o, timestamp: s, dpr: c, bgColor: l = Oa.WHITE, textColor: u = Da.PRIMARY, fontSize: d = 16, paddingX: f = 8, paddingY: p = 4 } = t, m = Ta(s);
10655
- e.save(), e.font = `${d}px -apple-system,BlinkMacSystemFont,Trebuchet MS,Roboto,Ubuntu,sans-serif`, e.textBaseline = "middle", e.textAlign = "center";
10656
- let h = Math.round(e.measureText(m).width), g = Math.min(i, h + f * 2), _ = Math.min(a, d + p * 2), v = Math.min(Math.max(o, n + g / 2), n + i - g / 2), y = r + a / 2, b = v - g / 2;
10657
- y - _ / 2, e.fillStyle = l, e.fillRect(Z(b, c), 0, Z(g, c), Z(_, c)), e.fillStyle = u, e.fillText(m, Z(v, c), Z(y, c)), e.restore();
10658
- }
10659
10660
  function Nc(e, t) {
10660
- let { x: n, y: r, width: i, height: a, data: o, scrollLeft: s, kWidth: c, kGap: l, startIndex: u, endIndex: d, dpr: f, bgColor: p = Oa.TRANSPARENT, textColor: m = Da.SECONDARY, lineColor: h = ka.DARK, fontSize: g = 16, paddingX: _ = 8, drawTopBorder: v = !0, drawBottomBorder: y = !0 } = t, b = Math.round(c * f), x = b % 2 == 0 ? b + 1 : b, S = Math.round(l * f), C = x + S, w = S, T = C / f, E = w / f, D = x / f;
10661
+ let { x: n, y: r, width: i, height: a, crosshairX: o, timestamp: s, dpr: c, fontSize: l = 16, paddingX: u = 8 } = t, d = Ta(s);
10662
+ e.save(), e.font = `${l}px -apple-system,BlinkMacSystemFont,Trebuchet MS,Roboto,Ubuntu,sans-serif`, e.textBaseline = "middle", e.textAlign = "center";
10663
+ let f = Math.round(e.measureText(d).width), p = Math.min(i, f + u * 2), m = a, h = Math.min(Math.max(o, n + p / 2), n + i - p / 2), g = r + a / 2, _ = h - p / 2, v = r;
10664
+ e.fillStyle = "rgba(0, 0, 0, 0.8)", e.fillRect(Z(_, c), Z(v, c), Z(p, c), Z(m, c)), e.fillStyle = "#ffffff", e.fillText(d, Z(h, c), Z(g, c)), e.restore();
10665
+ }
10666
+ function Pc(e, t) {
10667
+ let { x: n, y: r, width: i, height: a, crosshairY: o, priceRange: s, yPaddingPx: c = 0, dpr: l, fontSize: u = 16 } = t, d = Math.max(0, Math.min(c, Math.floor(a / 2) - 1)), { maxPrice: f, minPrice: p } = s, m = jc(o - r, f, p, a, d, d).toFixed(2);
10668
+ e.save(), e.font = `${u}px -apple-system,BlinkMacSystemFont,Trebuchet MS,Roboto,Ubuntu,sans-serif`, e.textBaseline = "middle", e.textAlign = "center";
10669
+ let h = u + 4, g = i, _ = Math.min(Math.max(o, r + h / 2), r + a - h / 2), v = _ - h / 2;
10670
+ e.fillStyle = "rgba(0, 0, 0, 0.8)";
10671
+ let y = Z(n, l), b = Z(v, l), x = Z(g, l), S = Z(h, l);
10672
+ e.fillRect(y, b, x, S);
10673
+ let C = n + i / 2;
10674
+ e.fillStyle = "#ffffff", e.fillText(m, Z(C, l), Z(_, l)), e.restore();
10675
+ }
10676
+ function Fc(e, t) {
10677
+ let { x: n, y: r, width: i, height: a, data: o, scrollLeft: s, kWidth: c, kGap: l, startIndex: u, endIndex: d, dpr: f, bgColor: p = Oa.TRANSPARENT, textColor: m = Da.SECONDARY, lineColor: h = ka.DARK, fontSize: g = 12, paddingX: _ = 8, drawTopBorder: v = !0, drawBottomBorder: y = !0 } = t, b = Math.round(c * f), x = b % 2 == 0 ? b + 1 : b, S = Math.round(l * f), C = x + S, w = S, T = C / f, E = w / f, D = x / f;
10661
10678
  e.fillStyle = p, e.fillRect(n, r, i, a), v && (e.strokeStyle = h, e.lineWidth = 1, e.beginPath(), e.moveTo(n, Q(r, f)), e.lineTo(n + i, Q(r, f)), e.stroke()), y && (e.strokeStyle = h, e.lineWidth = 1, e.beginPath(), e.moveTo(n, Q(r + a, f)), e.lineTo(n + i, Q(r + a, f)), e.stroke()), e.textAlign = "center", e.textBaseline = "middle";
10662
- let O = r + a / 2, k = Ea(o).filter((e) => e >= u && e < d);
10679
+ let O = r + a / 2 + 1, k = Ea(o).filter((e) => e >= u && e < d);
10663
10680
  for (let t of k) {
10664
10681
  let n = o[t];
10665
10682
  if (!n) continue;
@@ -10672,7 +10689,7 @@ function Nc(e, t) {
10672
10689
  }
10673
10690
  //#endregion
10674
10691
  //#region src/core/renderers/yAxis.ts
10675
- function Pc(e) {
10692
+ function Ic(e) {
10676
10693
  return {
10677
10694
  name: "yAxis",
10678
10695
  version: "1.0.0",
@@ -10682,7 +10699,7 @@ function Pc(e) {
10682
10699
  priority: Y.SYSTEM_YAXIS,
10683
10700
  draw(t) {
10684
10701
  let { ctx: n, pane: r, dpr: i, yAxisCtx: a } = t, o = a || n, s = Tc(r.height, r.id === "main");
10685
- jc(o, {
10702
+ Mc(o, {
10686
10703
  x: 0,
10687
10704
  y: r.top,
10688
10705
  width: e.axisWidth,
@@ -10692,26 +10709,40 @@ function Pc(e) {
10692
10709
  dpr: i,
10693
10710
  ticks: s,
10694
10711
  drawLeftBorder: !1,
10695
- drawTickLines: !1
10712
+ drawTickLines: !1,
10713
+ priceOffset: r.yAxis.getPriceOffset(),
10714
+ fontSize: 12
10715
+ });
10716
+ let c = e.getCrosshair?.();
10717
+ c && c.price !== null && Pc(o, {
10718
+ x: 2,
10719
+ y: r.top,
10720
+ width: e.axisWidth,
10721
+ height: r.height,
10722
+ crosshairY: c.y,
10723
+ priceRange: r.priceRange,
10724
+ yPaddingPx: e.yPaddingPx,
10725
+ dpr: i,
10726
+ fontSize: 12
10696
10727
  });
10697
10728
  }
10698
10729
  };
10699
10730
  }
10700
10731
  //#endregion
10701
10732
  //#region src/core/renderers/timeAxis.ts
10702
- var Fc = Symbol("time-axis");
10703
- function Ic(e) {
10733
+ var Lc = Symbol("time-axis");
10734
+ function Rc(e) {
10704
10735
  return {
10705
10736
  name: "timeAxis",
10706
10737
  version: "1.0.0",
10707
10738
  description: "时间轴渲染器",
10708
10739
  debugName: "时间轴",
10709
- paneId: Fc,
10740
+ paneId: Lc,
10710
10741
  priority: Y.SYSTEM_XAXIS,
10711
10742
  isSystem: !0,
10712
10743
  draw(t) {
10713
10744
  let { ctx: n, data: r, range: i, scrollLeft: a, kWidth: o, kGap: s, dpr: c, paneWidth: l } = t, u = r, d = n, f = l, p = e.height;
10714
- d.setTransform(1, 0, 0, 1, 0, 0), d.scale(c, c), d.clearRect(0, 0, f, p), Nc(d, {
10745
+ d.setTransform(1, 0, 0, 1, 0, 0), d.scale(c, c), d.clearRect(0, 0, f, p), Fc(d, {
10715
10746
  x: 0,
10716
10747
  y: 0,
10717
10748
  width: f,
@@ -10729,14 +10760,15 @@ function Ic(e) {
10729
10760
  let m = e.getCrosshair?.();
10730
10761
  if (m && typeof m.index == "number") {
10731
10762
  let e = u[m.index];
10732
- e && Mc(d, {
10763
+ e && Nc(d, {
10733
10764
  x: 0,
10734
10765
  y: 0,
10735
10766
  width: f,
10736
10767
  height: p,
10737
10768
  crosshairX: m.x,
10738
10769
  timestamp: e.timestamp,
10739
- dpr: c
10770
+ dpr: c,
10771
+ fontSize: 12
10740
10772
  });
10741
10773
  }
10742
10774
  }
@@ -10744,7 +10776,7 @@ function Ic(e) {
10744
10776
  }
10745
10777
  //#endregion
10746
10778
  //#region src/core/renderers/crosshair.ts
10747
- function Lc(e) {
10779
+ function zc(e) {
10748
10780
  return {
10749
10781
  name: "crosshair",
10750
10782
  version: "1.0.0",
@@ -10755,11 +10787,11 @@ function Lc(e) {
10755
10787
  draw(t) {
10756
10788
  let { ctx: n, pane: r, dpr: i, paneWidth: a } = t, o = e.getCrosshairState();
10757
10789
  if (o.isDragging || !o.pos) return;
10758
- let { x: s, y: c } = o.pos, l = r.id === o.activePaneId, u = l ? c - r.top : -1;
10759
- n.save(), n.beginPath(), n.rect(0, 0, a, r.height), n.clip(), n.fillStyle = Ha.LINE;
10760
- let d = bs(s, 0, r.height, i);
10761
- if (d && n.fillRect(d.x, d.y, d.width, d.height), l && u >= 0) {
10762
- let e = xs(0, a, Math.min(u, r.height - 1 / i), i);
10790
+ let { x: s } = o.pos, c = r.id === o.activePaneId, l = -1;
10791
+ c && o.price !== null && (l = r.yAxis.priceToY(o.price)), n.save(), n.beginPath(), n.rect(0, 0, a, r.height), n.clip(), n.fillStyle = Ha.LINE;
10792
+ let u = bs(s, 0, r.height, i);
10793
+ if (u && n.fillRect(u.x, u.y, u.width, u.height), c && l >= 0) {
10794
+ let e = xs(0, a, Math.min(l, r.height - 1 / i), i);
10763
10795
  e && n.fillRect(e.x, e.y, e.width, e.height);
10764
10796
  }
10765
10797
  n.restore();
@@ -10768,7 +10800,7 @@ function Lc(e) {
10768
10800
  }
10769
10801
  //#endregion
10770
10802
  //#region src/core/renderers/paneTitle.ts
10771
- function Rc(e) {
10803
+ function Bc(e) {
10772
10804
  let t = { ...e };
10773
10805
  return {
10774
10806
  name: `paneTitle_${e.paneId}`,
@@ -10809,7 +10841,7 @@ function Rc(e) {
10809
10841
  }
10810
10842
  //#endregion
10811
10843
  //#region src/components/KLineChart.vue?vue&type=script&setup=true&lang.ts
10812
- var zc = { class: "chart-wrapper" }, Bc = 4, Vc = /* @__PURE__ */ ho(/* @__PURE__ */ u({
10844
+ var Vc = { class: "chart-wrapper" }, Hc = 4, Uc = /* @__PURE__ */ ho(/* @__PURE__ */ u({
10813
10845
  __name: "KLineChart",
10814
10846
  props: {
10815
10847
  semanticConfig: {},
@@ -10950,11 +10982,11 @@ var zc = { class: "chart-wrapper" }, Bc = 4, Vc = /* @__PURE__ */ ho(/* @__PURE_
10950
10982
  }
10951
10983
  }
10952
10984
  function pe(e = "VOLUME", t) {
10953
- if (z.value.length >= Bc) return !1;
10985
+ if (z.value.length >= Hc) return !1;
10954
10986
  let n = `sub_${e}`;
10955
10987
  if (z.value.some((e) => e.id === n)) return !0;
10956
10988
  if (!C.value?.createSubPane(e, t ?? fe(e))) return !1;
10957
- let r = Rc({
10989
+ let r = Bc({
10958
10990
  paneId: n,
10959
10991
  title: e,
10960
10992
  getTitleInfo: () => ye(n)
@@ -11006,7 +11038,7 @@ var zc = { class: "chart-wrapper" }, Bc = 4, Vc = /* @__PURE__ */ ho(/* @__PURE_
11006
11038
  let e = C.value?.getSubPaneIndicators() ?? [];
11007
11039
  z.value = [];
11008
11040
  for (let t of e) {
11009
- let e = `sub_${t}`, n = Rc({
11041
+ let e = `sub_${t}`, n = Bc({
11010
11042
  paneId: e,
11011
11043
  title: t,
11012
11044
  getTitleInfo: () => ye(e)
@@ -11025,7 +11057,7 @@ var zc = { class: "chart-wrapper" }, Bc = 4, Vc = /* @__PURE__ */ ho(/* @__PURE_
11025
11057
  if (!n) return;
11026
11058
  let r = n.indicatorId;
11027
11059
  C.value?.removeRenderer(n.paneTitleRendererName), C.value?.removeSubPane(r), C.value?.createSubPane(t, fe(t));
11028
- let i = `sub_${t}`, a = Rc({
11060
+ let i = `sub_${t}`, a = Bc({
11029
11061
  paneId: i,
11030
11062
  title: t,
11031
11063
  getTitleInfo: () => ye(i)
@@ -11146,17 +11178,25 @@ var zc = { class: "chart-wrapper" }, Bc = 4, Vc = /* @__PURE__ */ ho(/* @__PURE_
11146
11178
  ma20: !0,
11147
11179
  ma30: !0,
11148
11180
  ma60: !0
11149
- })), a.useRenderer(Es()), a.setRendererEnabled("boll", !1), a.useRenderer(As()), a.setRendererEnabled("expma", !1), a.useRenderer(Ns()), a.setRendererEnabled("ene", !1), a.useRenderer(Cc()), a.useRenderer(Dc()), a.useRenderer(va()), a.useRenderer(Pc({
11150
- axisWidth: n.rightAxisWidth,
11151
- yPaddingPx: n.yPaddingPx
11152
- })), a.useRenderer(Fs({ yPaddingPx: n.yPaddingPx })), a.useRenderer(Lc({ getCrosshairState: () => ({
11181
+ })), a.useRenderer(Es()), a.setRendererEnabled("boll", !1), a.useRenderer(As()), a.setRendererEnabled("expma", !1), a.useRenderer(Ns()), a.setRendererEnabled("ene", !1), a.useRenderer(Cc()), a.useRenderer(Dc()), a.useRenderer(va()), a.useRenderer(Ic({
11182
+ axisWidth: n.rightAxisWidth + n.priceLabelWidth,
11183
+ yPaddingPx: n.yPaddingPx,
11184
+ getCrosshair: () => {
11185
+ let e = a.interaction.crosshairPos, t = a.interaction.crosshairPrice;
11186
+ return e && t !== null ? {
11187
+ y: e.y,
11188
+ price: t
11189
+ } : null;
11190
+ }
11191
+ })), a.useRenderer(Fs({ yPaddingPx: n.yPaddingPx })), a.useRenderer(zc({ getCrosshairState: () => ({
11153
11192
  pos: a.interaction.crosshairPos,
11154
11193
  activePaneId: a.interaction.activePaneId,
11155
- isDragging: a.interaction.isDraggingState()
11156
- }) })), a.useRenderer(Ic({
11194
+ isDragging: a.interaction.isDraggingState(),
11195
+ price: a.interaction.crosshairPrice
11196
+ }) })), a.useRenderer(Rc({
11157
11197
  height: n.bottomAxisHeight,
11158
11198
  getCrosshair: () => {
11159
- let e = a.interaction.crosshairPos, t = a.interaction.hoveredIndex;
11199
+ let e = a.interaction.crosshairPos, t = a.interaction.crosshairIndex;
11160
11200
  return e && t !== null ? {
11161
11201
  x: e.x,
11162
11202
  index: t
@@ -11200,7 +11240,7 @@ var zc = { class: "chart-wrapper" }, Bc = 4, Vc = /* @__PURE__ */ ho(/* @__PURE_
11200
11240
  let t = await w.value?.applyConfig(e);
11201
11241
  t && !t.success && console.error("Semantic config apply failed:", t.errors);
11202
11242
  }
11203
- }, { deep: !0 }), (e, t) => (g(), o("div", zc, [s("div", {
11243
+ }, { deep: !0 }), (e, t) => (g(), o("div", Vc, [s("div", {
11204
11244
  class: f(["chart-container", { "is-dragging": j.value }]),
11205
11245
  ref_key: "containerRef",
11206
11246
  ref: v,
@@ -11226,7 +11266,7 @@ var zc = { class: "chart-wrapper" }, Bc = 4, Vc = /* @__PURE__ */ ho(/* @__PURE_
11226
11266
  class: "x-axis-corner right-axis-corner",
11227
11267
  style: p({
11228
11268
  height: n.bottomAxisHeight + "px",
11229
- width: n.rightAxisWidth + n.priceLabelWidth + "px"
11269
+ width: n.rightAxisWidth + n.priceLabelWidth - 1 + "px"
11230
11270
  })
11231
11271
  }, null, 4),
11232
11272
  P.value ? (g(), i(go, {
@@ -11254,8 +11294,8 @@ var zc = { class: "chart-wrapper" }, Bc = 4, Vc = /* @__PURE__ */ ho(/* @__PURE_
11254
11294
  onUpdateParams: xe
11255
11295
  }, null, 8, ["active-indicators", "indicator-params"])]));
11256
11296
  }
11257
- }), [["__scopeId", "data-v-f07a030f"]]), Hc = { install(e) {
11258
- e.component("KLineChart", Vc);
11297
+ }), [["__scopeId", "data-v-4083a7b9"]]), Wc = { install(e) {
11298
+ e.component("KLineChart", Uc);
11259
11299
  } };
11260
11300
  //#endregion
11261
- export { la as ConfigManager, F as EventBus, oa as GLOBAL_PANE_ID, ca as HookSystem, Vc as KLineChart, Hc as KMapPlugin, ua as PluginHostImpl, sa as PluginRegistry, ia as PluginState, Y as RENDERER_PRIORITY, pa as RendererPluginManager, da as createPluginHost, aa as wrapPaneInfo };
11301
+ export { la as ConfigManager, F as EventBus, oa as GLOBAL_PANE_ID, ca as HookSystem, Uc as KLineChart, Wc as KMapPlugin, ua as PluginHostImpl, sa as PluginRegistry, ia as PluginState, Y as RENDERER_PRIORITY, pa as RendererPluginManager, da as createPluginHost, aa as wrapPaneInfo };
@@ -1,2 +1,2 @@
1
- .kline-tooltip[data-v-95daa55c]{z-index:10;color:#000000c7;pointer-events:none;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);background:#ffffffeb;border:1px solid #0000001f;border-radius:8px;min-width:200px;max-width:260px;padding:10px 12px;font-size:12px;line-height:1.4;position:absolute;box-shadow:0 6px 18px #0000001f}.kline-tooltip__title[data-v-95daa55c]{justify-content:space-between;gap:10px;margin-bottom:6px;font-weight:600;display:flex}.kline-tooltip__grid[data-v-95daa55c]{grid-template-columns:1fr;gap:2px;display:grid}.kline-tooltip__grid .row[data-v-95daa55c]{justify-content:space-between;gap:10px;display:flex}.kline-tooltip__grid .row span[data-v-95daa55c]:first-child{color:#0000008f}.marker-tooltip[data-v-dd43da4f]{z-index:10;color:#000000c7;pointer-events:none;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);background:#ffffffeb;border:1px solid #0000001f;border-radius:8px;min-width:180px;max-width:260px;padding:10px 12px;font-size:12px;line-height:1.4;position:absolute;box-shadow:0 6px 18px #0000001f}.marker-tooltip__title[data-v-dd43da4f]{justify-content:space-between;gap:10px;margin-bottom:6px;font-weight:600;display:flex}.marker-tooltip__content[data-v-dd43da4f]{grid-template-columns:1fr;gap:2px;display:grid}.marker-tooltip__content .row[data-v-dd43da4f]{justify-content:space-between;gap:10px;display:flex}.marker-tooltip__content .row span[data-v-dd43da4f]:first-child{color:#0000008f}.params-overlay[data-v-730f2212]{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:1000;background:#0000004d;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.indicator-params[data-v-730f2212]{background:#fff;border:1px solid #e0e0e0;border-radius:12px;width:90vw;min-width:340px;max-width:420px;overflow:hidden;box-shadow:0 8px 40px #00000026}.params-header[data-v-730f2212]{background:#f8f8f8;border-bottom:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:16px 20px;display:flex}.header-left[data-v-730f2212]{align-items:baseline;gap:8px;display:flex}.header-right[data-v-730f2212]{align-items:center;gap:8px;display:flex}.params-title[data-v-730f2212]{color:#1a1a1a;letter-spacing:.2px;font-size:14px;font-weight:600}.params-subtitle[data-v-730f2212]{color:#999;font-size:11px}.toggle-desc-btn[data-v-730f2212]{cursor:pointer;color:#888;background:#fff;border:1px solid #e0e0e0;border-radius:6px;justify-content:center;align-items:center;width:28px;height:28px;padding:0;transition:all .2s;display:flex}.toggle-desc-btn[data-v-730f2212]:hover{color:#555;background:#f0f0f0;border-color:#ccc}.toggle-desc-btn.active[data-v-730f2212]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.toggle-desc-btn svg[data-v-730f2212]{width:14px;height:14px}.params-close[data-v-730f2212]{cursor:pointer;color:#888;background:#fff;border:1px solid #e0e0e0;border-radius:6px;justify-content:center;align-items:center;width:26px;height:26px;padding:0;transition:background .15s,color .15s,border-color .15s;display:flex}.params-close[data-v-730f2212]:hover{color:#333;background:#f0f0f0;border-color:#ccc}.params-close svg[data-v-730f2212]{width:13px;height:13px}.indicator-description[data-v-730f2212]{background:#f0f7ff;border-bottom:1px solid #d6e8f5;padding:12px 20px}.indicator-description p[data-v-730f2212]{color:#2c5282;margin:0;font-size:12px;line-height:1.6}.params-body[data-v-730f2212]{flex-direction:column;gap:10px;padding:16px 20px;display:flex}.param-item[data-v-730f2212]{background:#f8f8f8;border:1px solid #e8e8e8;border-radius:8px;padding:10px 14px;transition:border-color .2s}.param-item[data-v-730f2212]:has(.param-input:focus){border-color:#bbb}.param-item.has-desc[data-v-730f2212]{padding:10px 14px 8px}.param-header[data-v-730f2212]{justify-content:space-between;align-items:center;gap:16px;display:flex}.param-label[data-v-730f2212]{flex-direction:column;gap:3px;display:flex}.param-label-text[data-v-730f2212]{color:#333;font-size:13px;font-weight:500}.param-range[data-v-730f2212]{color:#999;font-size:11px}.param-description[data-v-730f2212]{color:#666;border-top:1px dashed #e0e0e0;margin-top:8px;padding-top:8px;font-size:11px;line-height:1.5}.input-wrapper[data-v-730f2212]{background:#fff;border:1px solid #d0d0d0;border-radius:7px;align-items:stretch;height:32px;transition:border-color .2s;display:flex;overflow:hidden}.input-wrapper[data-v-730f2212]:focus-within{border-color:#999}.stepper-btn[data-v-730f2212]{cursor:pointer;color:#666;background:#f0f0f0;border:none;flex-shrink:0;justify-content:center;align-items:center;width:28px;font-size:15px;font-weight:400;line-height:1;transition:background .15s,color .15s;display:flex}.stepper-btn[data-v-730f2212]:hover:not(:disabled){color:#333;background:#e0e0e0}.stepper-btn[data-v-730f2212]:disabled{color:#ccc;cursor:not-allowed}.param-input[data-v-730f2212]{text-align:center;color:#1a1a1a;appearance:textfield;background:0 0;border:none;border-left:1px solid #e8e8e8;border-right:1px solid #e8e8e8;width:60px;font-size:13px;font-weight:600}.param-input[data-v-730f2212]::-webkit-inner-spin-button{-webkit-appearance:none}.param-input[data-v-730f2212]::-webkit-outer-spin-button{-webkit-appearance:none}.param-input[data-v-730f2212]:focus{outline:none}.params-footer[data-v-730f2212]{background:#f8f8f8;border-top:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:12px 20px;display:flex}.footer-right[data-v-730f2212]{gap:8px;display:flex}.params-btn[data-v-730f2212]{cursor:pointer;border:1px solid #0000;border-radius:7px;align-items:center;gap:5px;padding:6px 14px;font-size:13px;font-weight:500;line-height:1.4;transition:all .15s;display:flex}.params-btn svg[data-v-730f2212]{flex-shrink:0;width:12px;height:12px}.params-btn.reset[data-v-730f2212]{color:#666;background:0 0;border-color:#d0d0d0}.params-btn.reset[data-v-730f2212]:hover{color:#e74c3c;background:#e74c3c14;border-color:#c0392b}.params-btn.cancel[data-v-730f2212]{color:#666;background:0 0;border-color:#d0d0d0}.params-btn.cancel[data-v-730f2212]:hover{color:#333;background:#f0f0f0;border-color:#bbb}.params-btn.confirm[data-v-730f2212]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.params-btn.confirm[data-v-730f2212]:hover{background:#333;border-color:#333;transform:translateY(-1px);box-shadow:0 2px 10px #00000026}.params-btn.confirm[data-v-730f2212]:active{box-shadow:none;transform:translateY(0)}.overlay-enter-active[data-v-730f2212],.overlay-leave-active[data-v-730f2212]{transition:opacity .2s}.overlay-enter-from[data-v-730f2212],.overlay-leave-to[data-v-730f2212]{opacity:0}.modal-enter-active[data-v-730f2212]{transition:all .22s cubic-bezier(.34,1.56,.64,1)}.modal-leave-active[data-v-730f2212]{transition:all .16s ease-in}.modal-enter-from[data-v-730f2212]{opacity:0;transform:scale(.88)translateY(-16px)}.modal-leave-to[data-v-730f2212]{opacity:0;transform:scale(.94)translateY(8px)}.slide-enter-active[data-v-730f2212],.slide-leave-active[data-v-730f2212]{transition:all .2s;overflow:hidden}.slide-enter-from[data-v-730f2212],.slide-leave-to[data-v-730f2212]{opacity:0;max-height:0;margin-top:0;padding-top:0;padding-bottom:0}.indicator-selector[data-v-aad3b750]{width:80%;margin:20px;position:relative}.indicator-scroll-container[data-v-aad3b750]{scrollbar-width:none;-webkit-overflow-scrolling:touch;text-align:center;width:100%;overflow:auto hidden}.indicator-scroll-container[data-v-aad3b750]::-webkit-scrollbar{display:none}.indicator-list[data-v-aad3b750]{gap:8px;margin:0 auto;padding:2px;display:inline-flex}.indicator-item[data-v-aad3b750]{align-items:center;gap:4px;display:flex}.indicator-btn-wrapper[data-v-aad3b750]{position:relative}.indicator-btn[data-v-aad3b750]{color:#666;cursor:pointer;white-space:nowrap;background:#fff;border:1px solid #e0e0e0;border-radius:16px;flex-shrink:0;justify-content:center;align-items:center;gap:4px;padding:6px 16px;font-size:13px;font-weight:500;transition:all .3s;display:flex;position:relative;overflow:hidden}.indicator-btn[data-v-aad3b750]:hover:not(.hovering){color:#333;background:#f8f8f8;border-color:#ccc}.indicator-btn.active[data-v-aad3b750]{color:#1a1a1a;background:#f8f8f8;border-color:#1a1a1a}.indicator-btn.active[data-v-aad3b750]:hover:not(.hovering){background:#f0f0f0;border-color:#333}.btn-content[data-v-aad3b750]{z-index:1;position:relative}.param-hint[data-v-aad3b750]{opacity:.85;font-size:11px}.hover-overlay[data-v-aad3b750]{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:2;background:#ffffffd9;border-radius:16px;justify-content:center;align-items:center;gap:4px;display:flex;position:absolute;inset:0}.action-btn[data-v-aad3b750]{color:#666;cursor:pointer;background:0 0;border:none;border-radius:50%;justify-content:center;align-items:center;width:24px;height:24px;padding:0;transition:all .2s;display:flex}.action-btn[data-v-aad3b750]:hover{color:#333;background:#0000000f}.settings-btn[data-v-aad3b750]:hover{color:#1a1a1a}.remove-btn[data-v-aad3b750]:hover{color:#ff4d4f}.divider[data-v-aad3b750]{background:#e0e0e0;width:1px;height:14px}.add-btn[data-v-aad3b750]{color:#999;cursor:pointer;background:0 0;border:1px dashed #d9d9d9;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:32px;height:32px;padding:0;transition:all .3s;display:flex}.add-btn[data-v-aad3b750]:hover{color:#1a1a1a;background:#1a1a1a0a;border-color:#1a1a1a}.add-menu[data-v-aad3b750]{white-space:nowrap;z-index:9999;background:#fff;border-radius:8px;padding:8px 0;position:fixed;transform:translate(-50%);box-shadow:0 6px 16px #00000014,0 3px 6px -4px #0000001f,0 9px 28px 8px #0000000d}.menu-section[data-v-aad3b750]{padding:4px 0}.menu-section[data-v-aad3b750]:not(:last-child){border-bottom:1px solid #f0f0f0}.menu-title[data-v-aad3b750]{color:#999;padding:4px 16px;font-size:12px;font-weight:500}.menu-items[data-v-aad3b750]{flex-direction:column;gap:2px;display:flex}.menu-item[data-v-aad3b750]{text-align:left;color:#333;cursor:pointer;background:0 0;border:none;align-items:center;gap:8px;width:100%;padding:8px 16px;font-size:13px;transition:background .2s;display:flex}.menu-item[data-v-aad3b750]:hover:not(.disabled){background:#f5f5f5}.menu-item.disabled[data-v-aad3b750]{color:#999;cursor:not-allowed}.menu-item .param-hint[data-v-aad3b750]{color:#999;font-size:11px}.active-tag[data-v-aad3b750]{color:#1a1a1a;align-items:center;margin-left:auto;display:flex}.fade-enter-active[data-v-aad3b750],.fade-leave-active[data-v-aad3b750]{transition:opacity .2s}.fade-enter-from[data-v-aad3b750],.fade-leave-to[data-v-aad3b750]{opacity:0}.slide-enter-active[data-v-aad3b750],.slide-leave-active[data-v-aad3b750]{transition:all .2s}.slide-enter-from[data-v-aad3b750],.slide-leave-to[data-v-aad3b750]{opacity:0;transform:translate(-50%)translateY(8px)}.chart-wrapper[data-v-f07a030f]{--kmap-height:var(--kmap-chart-height,100%);--kmap-width:var(--kmap-chart-width,100%);width:var(--kmap-width);height:var(--kmap-height);flex-direction:column;justify-content:center;align-items:center;min-height:300px;display:flex}.chart-container[data-v-f07a030f]{scrollbar-width:none;-ms-overflow-style:none;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;touch-action:none;width:95%;height:85%;min-height:255px;position:relative;overflow:auto hidden}.chart-container[data-v-f07a030f]::-webkit-scrollbar{display:none}.chart-container[data-v-f07a030f]:hover{cursor:grab}.chart-container[data-v-f07a030f]:active{cursor:grabbing}.scroll-content[data-v-f07a030f]{height:100%;min-height:inherit;position:relative}.canvas-layer[data-v-f07a030f]{pointer-events:none;position:sticky;top:0;left:0}.plot-canvas{display:block;position:absolute;top:0;left:0}.main,.sub{border-top:1px solid #e0e0e0;border-left:1px solid #e0e0e0;border-right:1px solid #e0e0e0}.right-axis{border-top:1px solid #e0e0e0;border-right:1px solid #e0e0e0;display:block;position:absolute;right:0}.x-axis-canvas{z-index:10;display:block;position:absolute;bottom:0;left:0}.bottom-axis{border:1px solid #e0e0e0}.right-axis-corner{border-top:1px solid #e0e0e0;border-bottom:1px solid #e0e0e0;border-right:1px solid #e0e0e0}.x-axis-corner{z-index:10;display:block;position:absolute;bottom:0;right:0}
1
+ .kline-tooltip[data-v-95daa55c]{z-index:10;color:#000000c7;pointer-events:none;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);background:#ffffffeb;border:1px solid #0000001f;border-radius:8px;min-width:200px;max-width:260px;padding:10px 12px;font-size:12px;line-height:1.4;position:absolute;box-shadow:0 6px 18px #0000001f}.kline-tooltip__title[data-v-95daa55c]{justify-content:space-between;gap:10px;margin-bottom:6px;font-weight:600;display:flex}.kline-tooltip__grid[data-v-95daa55c]{grid-template-columns:1fr;gap:2px;display:grid}.kline-tooltip__grid .row[data-v-95daa55c]{justify-content:space-between;gap:10px;display:flex}.kline-tooltip__grid .row span[data-v-95daa55c]:first-child{color:#0000008f}.marker-tooltip[data-v-dd43da4f]{z-index:10;color:#000000c7;pointer-events:none;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);background:#ffffffeb;border:1px solid #0000001f;border-radius:8px;min-width:180px;max-width:260px;padding:10px 12px;font-size:12px;line-height:1.4;position:absolute;box-shadow:0 6px 18px #0000001f}.marker-tooltip__title[data-v-dd43da4f]{justify-content:space-between;gap:10px;margin-bottom:6px;font-weight:600;display:flex}.marker-tooltip__content[data-v-dd43da4f]{grid-template-columns:1fr;gap:2px;display:grid}.marker-tooltip__content .row[data-v-dd43da4f]{justify-content:space-between;gap:10px;display:flex}.marker-tooltip__content .row span[data-v-dd43da4f]:first-child{color:#0000008f}.params-overlay[data-v-730f2212]{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:1000;background:#0000004d;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.indicator-params[data-v-730f2212]{background:#fff;border:1px solid #e0e0e0;border-radius:12px;width:90vw;min-width:340px;max-width:420px;overflow:hidden;box-shadow:0 8px 40px #00000026}.params-header[data-v-730f2212]{background:#f8f8f8;border-bottom:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:16px 20px;display:flex}.header-left[data-v-730f2212]{align-items:baseline;gap:8px;display:flex}.header-right[data-v-730f2212]{align-items:center;gap:8px;display:flex}.params-title[data-v-730f2212]{color:#1a1a1a;letter-spacing:.2px;font-size:14px;font-weight:600}.params-subtitle[data-v-730f2212]{color:#999;font-size:11px}.toggle-desc-btn[data-v-730f2212]{cursor:pointer;color:#888;background:#fff;border:1px solid #e0e0e0;border-radius:6px;justify-content:center;align-items:center;width:28px;height:28px;padding:0;transition:all .2s;display:flex}.toggle-desc-btn[data-v-730f2212]:hover{color:#555;background:#f0f0f0;border-color:#ccc}.toggle-desc-btn.active[data-v-730f2212]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.toggle-desc-btn svg[data-v-730f2212]{width:14px;height:14px}.params-close[data-v-730f2212]{cursor:pointer;color:#888;background:#fff;border:1px solid #e0e0e0;border-radius:6px;justify-content:center;align-items:center;width:26px;height:26px;padding:0;transition:background .15s,color .15s,border-color .15s;display:flex}.params-close[data-v-730f2212]:hover{color:#333;background:#f0f0f0;border-color:#ccc}.params-close svg[data-v-730f2212]{width:13px;height:13px}.indicator-description[data-v-730f2212]{background:#f0f7ff;border-bottom:1px solid #d6e8f5;padding:12px 20px}.indicator-description p[data-v-730f2212]{color:#2c5282;margin:0;font-size:12px;line-height:1.6}.params-body[data-v-730f2212]{flex-direction:column;gap:10px;padding:16px 20px;display:flex}.param-item[data-v-730f2212]{background:#f8f8f8;border:1px solid #e8e8e8;border-radius:8px;padding:10px 14px;transition:border-color .2s}.param-item[data-v-730f2212]:has(.param-input:focus){border-color:#bbb}.param-item.has-desc[data-v-730f2212]{padding:10px 14px 8px}.param-header[data-v-730f2212]{justify-content:space-between;align-items:center;gap:16px;display:flex}.param-label[data-v-730f2212]{flex-direction:column;gap:3px;display:flex}.param-label-text[data-v-730f2212]{color:#333;font-size:13px;font-weight:500}.param-range[data-v-730f2212]{color:#999;font-size:11px}.param-description[data-v-730f2212]{color:#666;border-top:1px dashed #e0e0e0;margin-top:8px;padding-top:8px;font-size:11px;line-height:1.5}.input-wrapper[data-v-730f2212]{background:#fff;border:1px solid #d0d0d0;border-radius:7px;align-items:stretch;height:32px;transition:border-color .2s;display:flex;overflow:hidden}.input-wrapper[data-v-730f2212]:focus-within{border-color:#999}.stepper-btn[data-v-730f2212]{cursor:pointer;color:#666;background:#f0f0f0;border:none;flex-shrink:0;justify-content:center;align-items:center;width:28px;font-size:15px;font-weight:400;line-height:1;transition:background .15s,color .15s;display:flex}.stepper-btn[data-v-730f2212]:hover:not(:disabled){color:#333;background:#e0e0e0}.stepper-btn[data-v-730f2212]:disabled{color:#ccc;cursor:not-allowed}.param-input[data-v-730f2212]{text-align:center;color:#1a1a1a;appearance:textfield;background:0 0;border:none;border-left:1px solid #e8e8e8;border-right:1px solid #e8e8e8;width:60px;font-size:13px;font-weight:600}.param-input[data-v-730f2212]::-webkit-inner-spin-button{-webkit-appearance:none}.param-input[data-v-730f2212]::-webkit-outer-spin-button{-webkit-appearance:none}.param-input[data-v-730f2212]:focus{outline:none}.params-footer[data-v-730f2212]{background:#f8f8f8;border-top:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:12px 20px;display:flex}.footer-right[data-v-730f2212]{gap:8px;display:flex}.params-btn[data-v-730f2212]{cursor:pointer;border:1px solid #0000;border-radius:7px;align-items:center;gap:5px;padding:6px 14px;font-size:13px;font-weight:500;line-height:1.4;transition:all .15s;display:flex}.params-btn svg[data-v-730f2212]{flex-shrink:0;width:12px;height:12px}.params-btn.reset[data-v-730f2212]{color:#666;background:0 0;border-color:#d0d0d0}.params-btn.reset[data-v-730f2212]:hover{color:#e74c3c;background:#e74c3c14;border-color:#c0392b}.params-btn.cancel[data-v-730f2212]{color:#666;background:0 0;border-color:#d0d0d0}.params-btn.cancel[data-v-730f2212]:hover{color:#333;background:#f0f0f0;border-color:#bbb}.params-btn.confirm[data-v-730f2212]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.params-btn.confirm[data-v-730f2212]:hover{background:#333;border-color:#333;transform:translateY(-1px);box-shadow:0 2px 10px #00000026}.params-btn.confirm[data-v-730f2212]:active{box-shadow:none;transform:translateY(0)}.overlay-enter-active[data-v-730f2212],.overlay-leave-active[data-v-730f2212]{transition:opacity .2s}.overlay-enter-from[data-v-730f2212],.overlay-leave-to[data-v-730f2212]{opacity:0}.modal-enter-active[data-v-730f2212]{transition:all .22s cubic-bezier(.34,1.56,.64,1)}.modal-leave-active[data-v-730f2212]{transition:all .16s ease-in}.modal-enter-from[data-v-730f2212]{opacity:0;transform:scale(.88)translateY(-16px)}.modal-leave-to[data-v-730f2212]{opacity:0;transform:scale(.94)translateY(8px)}.slide-enter-active[data-v-730f2212],.slide-leave-active[data-v-730f2212]{transition:all .2s;overflow:hidden}.slide-enter-from[data-v-730f2212],.slide-leave-to[data-v-730f2212]{opacity:0;max-height:0;margin-top:0;padding-top:0;padding-bottom:0}.indicator-selector[data-v-aad3b750]{width:80%;margin:20px;position:relative}.indicator-scroll-container[data-v-aad3b750]{scrollbar-width:none;-webkit-overflow-scrolling:touch;text-align:center;width:100%;overflow:auto hidden}.indicator-scroll-container[data-v-aad3b750]::-webkit-scrollbar{display:none}.indicator-list[data-v-aad3b750]{gap:8px;margin:0 auto;padding:2px;display:inline-flex}.indicator-item[data-v-aad3b750]{align-items:center;gap:4px;display:flex}.indicator-btn-wrapper[data-v-aad3b750]{position:relative}.indicator-btn[data-v-aad3b750]{color:#666;cursor:pointer;white-space:nowrap;background:#fff;border:1px solid #e0e0e0;border-radius:16px;flex-shrink:0;justify-content:center;align-items:center;gap:4px;padding:6px 16px;font-size:13px;font-weight:500;transition:all .3s;display:flex;position:relative;overflow:hidden}.indicator-btn[data-v-aad3b750]:hover:not(.hovering){color:#333;background:#f8f8f8;border-color:#ccc}.indicator-btn.active[data-v-aad3b750]{color:#1a1a1a;background:#f8f8f8;border-color:#1a1a1a}.indicator-btn.active[data-v-aad3b750]:hover:not(.hovering){background:#f0f0f0;border-color:#333}.btn-content[data-v-aad3b750]{z-index:1;position:relative}.param-hint[data-v-aad3b750]{opacity:.85;font-size:11px}.hover-overlay[data-v-aad3b750]{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:2;background:#ffffffd9;border-radius:16px;justify-content:center;align-items:center;gap:4px;display:flex;position:absolute;inset:0}.action-btn[data-v-aad3b750]{color:#666;cursor:pointer;background:0 0;border:none;border-radius:50%;justify-content:center;align-items:center;width:24px;height:24px;padding:0;transition:all .2s;display:flex}.action-btn[data-v-aad3b750]:hover{color:#333;background:#0000000f}.settings-btn[data-v-aad3b750]:hover{color:#1a1a1a}.remove-btn[data-v-aad3b750]:hover{color:#ff4d4f}.divider[data-v-aad3b750]{background:#e0e0e0;width:1px;height:14px}.add-btn[data-v-aad3b750]{color:#999;cursor:pointer;background:0 0;border:1px dashed #d9d9d9;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:32px;height:32px;padding:0;transition:all .3s;display:flex}.add-btn[data-v-aad3b750]:hover{color:#1a1a1a;background:#1a1a1a0a;border-color:#1a1a1a}.add-menu[data-v-aad3b750]{white-space:nowrap;z-index:9999;background:#fff;border-radius:8px;padding:8px 0;position:fixed;transform:translate(-50%);box-shadow:0 6px 16px #00000014,0 3px 6px -4px #0000001f,0 9px 28px 8px #0000000d}.menu-section[data-v-aad3b750]{padding:4px 0}.menu-section[data-v-aad3b750]:not(:last-child){border-bottom:1px solid #f0f0f0}.menu-title[data-v-aad3b750]{color:#999;padding:4px 16px;font-size:12px;font-weight:500}.menu-items[data-v-aad3b750]{flex-direction:column;gap:2px;display:flex}.menu-item[data-v-aad3b750]{text-align:left;color:#333;cursor:pointer;background:0 0;border:none;align-items:center;gap:8px;width:100%;padding:8px 16px;font-size:13px;transition:background .2s;display:flex}.menu-item[data-v-aad3b750]:hover:not(.disabled){background:#f5f5f5}.menu-item.disabled[data-v-aad3b750]{color:#999;cursor:not-allowed}.menu-item .param-hint[data-v-aad3b750]{color:#999;font-size:11px}.active-tag[data-v-aad3b750]{color:#1a1a1a;align-items:center;margin-left:auto;display:flex}.fade-enter-active[data-v-aad3b750],.fade-leave-active[data-v-aad3b750]{transition:opacity .2s}.fade-enter-from[data-v-aad3b750],.fade-leave-to[data-v-aad3b750]{opacity:0}.slide-enter-active[data-v-aad3b750],.slide-leave-active[data-v-aad3b750]{transition:all .2s}.slide-enter-from[data-v-aad3b750],.slide-leave-to[data-v-aad3b750]{opacity:0;transform:translate(-50%)translateY(8px)}.chart-wrapper[data-v-4083a7b9]{--kmap-height:var(--kmap-chart-height,100%);--kmap-width:var(--kmap-chart-width,100%);width:var(--kmap-width);height:var(--kmap-height);flex-direction:column;justify-content:center;align-items:center;min-height:300px;display:flex}.chart-container[data-v-4083a7b9]{scrollbar-width:none;-ms-overflow-style:none;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;touch-action:none;width:95%;height:85%;min-height:255px;position:relative;overflow:auto hidden}.chart-container[data-v-4083a7b9]::-webkit-scrollbar{display:none}.chart-container[data-v-4083a7b9]:hover{cursor:grab}.chart-container[data-v-4083a7b9]:active{cursor:grabbing}.scroll-content[data-v-4083a7b9]{height:100%;min-height:inherit;position:relative}.canvas-layer[data-v-4083a7b9]{pointer-events:none;position:sticky;top:0;left:0}.plot-canvas{display:block;position:absolute;top:0;left:0}.main,.sub{border-top:1px solid #e0e0e0;border-left:1px solid #e0e0e0;border-right:1px solid #e0e0e0}.right-axis{border-top:1px solid #e0e0e0;border-right:1px solid #e0e0e0;display:block;position:absolute;right:1px}.x-axis-canvas{z-index:10;display:block;position:absolute;bottom:1px;left:0}.bottom-axis{border-bottom:1px solid #e0e0e0;border-left:1px solid #e0e0e0;border-right:1px solid #e0e0e0}.right-axis-corner{box-sizing:border-box;border-bottom:1px solid #e0e0e0;border-left:1px solid #e0e0e0;border-right:1px solid #e0e0e0;bottom:1px}.x-axis-corner{z-index:10;display:block;position:absolute;bottom:1px;right:1px}
2
2
  /*$vite$:1*/
@@ -63,7 +63,6 @@ export declare class RendererPluginManager {
63
63
  getAllPlugins(): RendererPlugin[];
64
64
  /** 获取指定渲染器 */
65
65
  getPlugin<T extends RendererPlugin = RendererPlugin>(name: string): T | undefined;
66
- /** 通知数据更新(跳过禁用的插件) */
67
66
  notifyDataUpdate(data: unknown[], range: {
68
67
  start: number;
69
68
  end: number;
@@ -79,6 +79,7 @@ export interface PaneInfo {
79
79
  yToPrice(y: number): number;
80
80
  getPaddingTop(): number;
81
81
  getPaddingBottom(): number;
82
+ getPriceOffset(): number;
82
83
  };
83
84
  priceRange: {
84
85
  maxPrice: number;
@@ -19,6 +19,10 @@ export declare class SemanticChartController {
19
19
  * 取消订阅
20
20
  */
21
21
  off(event: SemanticEventType, handler: (data?: unknown) => void): void;
22
+ /**
23
+ * 应用语义化 UI 配置
24
+ * @param config 语义化配置
25
+ */
22
26
  private doApplyConfig;
23
27
  private applyIndicators;
24
28
  private applyMAIndicator;
@@ -20,6 +20,8 @@ export interface PriceAxisOptions {
20
20
  drawLeftBorder?: boolean;
21
21
  /** 是否绘制刻度短线(默认 true) */
22
22
  drawTickLines?: boolean;
23
+ /** 价格偏移量(用于价格轴平移时同步显示) */
24
+ priceOffset?: number;
23
25
  }
24
26
  /** 右侧价格轴(固定,不随 translate/scroll 变化) */
25
27
  export declare function drawPriceAxis(ctx: CanvasRenderingContext2D, opts: PriceAxisOptions): void;
@@ -88,8 +90,6 @@ export interface CrosshairPriceLabelOptions {
88
90
  textColor?: string;
89
91
  fontSize?: number;
90
92
  paddingX?: number;
91
- /** 最新价,用于计算涨跌幅 */
92
- lastPrice?: number;
93
93
  }
94
94
  export interface CrosshairTimeLabelOptions {
95
95
  x: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@363045841yyt/klinechart",
3
- "version": "0.2.12",
3
+ "version": "0.2.13",
4
4
  "type": "module",
5
5
  "engines": {
6
6
  "node": "^20.19.0 || >=22.12.0"