@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/core/controller/interaction.d.ts +2 -0
- package/dist/core/renderers/crosshair.d.ts +2 -0
- package/dist/core/renderers/yAxis.d.ts +4 -0
- package/dist/core/theme/colors.d.ts +2 -2
- package/dist/index.cjs +3 -3
- package/dist/index.js +102 -62
- package/dist/klinechart.css +1 -1
- package/dist/plugin/rendererPluginManager.d.ts +0 -1
- package/dist/plugin/types.d.ts +1 -0
- package/dist/semantic/controller.d.ts +4 -0
- package/dist/utils/kLineDraw/axis.d.ts +2 -2
- package/package.json +1 -1
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: "
|
|
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
|
-
|
|
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
|
-
|
|
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("
|
|
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.
|
|
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
|
|
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
|
|
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,
|
|
10641
|
-
e.fillStyle = u, e.fillRect(n, r, i, a),
|
|
10642
|
-
let S = n +
|
|
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 (
|
|
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
|
-
|
|
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,
|
|
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
|
|
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
|
-
|
|
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
|
|
10703
|
-
function
|
|
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:
|
|
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),
|
|
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 &&
|
|
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
|
|
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
|
|
10759
|
-
n.save(), n.beginPath(), n.rect(0, 0, a, r.height), n.clip(), n.fillStyle = Ha.LINE;
|
|
10760
|
-
let
|
|
10761
|
-
if (
|
|
10762
|
-
let e = xs(0, a, Math.min(
|
|
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
|
|
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
|
|
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 >=
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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(
|
|
11150
|
-
axisWidth: n.rightAxisWidth,
|
|
11151
|
-
yPaddingPx: n.yPaddingPx
|
|
11152
|
-
|
|
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
|
-
|
|
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.
|
|
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",
|
|
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-
|
|
11258
|
-
e.component("KLineChart",
|
|
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,
|
|
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 };
|
package/dist/klinechart.css
CHANGED
|
@@ -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;
|
package/dist/plugin/types.d.ts
CHANGED
|
@@ -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;
|