@363045841yyt/klinechart 0.6.1 → 0.6.2
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.cjs +6 -6
- package/dist/index.js +224 -81
- package/dist/klinechart.css +1 -1
- package/dist/src/core/chart.d.ts +69 -0
- package/dist/src/core/indicators/scheduler.d.ts +15 -0
- package/dist/src/core/layout/pane.d.ts +5 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -7621,8 +7621,8 @@ var za = class {
|
|
|
7621
7621
|
addRenderer(e) {
|
|
7622
7622
|
this.renderers.push(e);
|
|
7623
7623
|
}
|
|
7624
|
-
updateRange(e, t) {
|
|
7625
|
-
this.priceRange = ja(e, t.start, t.end), this.yAxis.setRange(this.priceRange);
|
|
7624
|
+
updateRange(e, t, n) {
|
|
7625
|
+
this.priceRange = ja(e, t.start, t.end), n && Number.isFinite(n.min) && Number.isFinite(n.max) && (this.priceRange.minPrice = Math.min(this.priceRange.minPrice, n.min), this.priceRange.maxPrice = Math.max(this.priceRange.maxPrice, n.max)), this.yAxis.setRange(this.priceRange);
|
|
7626
7626
|
}
|
|
7627
7627
|
}, Ba = Symbol("renderer:global-cache"), Va = class {
|
|
7628
7628
|
plugins = /* @__PURE__ */ new Map();
|
|
@@ -8956,7 +8956,7 @@ var rs = { class: "params-header" }, is = { class: "header-left" }, as = { class
|
|
|
8956
8956
|
])) : a("", !0)
|
|
8957
8957
|
]));
|
|
8958
8958
|
}
|
|
8959
|
-
}), [["__scopeId", "data-v-
|
|
8959
|
+
}), [["__scopeId", "data-v-f3fbebbd"]]), Gs = {
|
|
8960
8960
|
viewBox: "0 0 24 24",
|
|
8961
8961
|
width: "1.2em",
|
|
8962
8962
|
height: "1.2em"
|
|
@@ -9103,7 +9103,8 @@ var qs = f({
|
|
|
9103
9103
|
this.onPinchZoomCallback = e;
|
|
9104
9104
|
}
|
|
9105
9105
|
updateSettings(e) {
|
|
9106
|
-
this.settings
|
|
9106
|
+
let t = this.settings.disableMainPaneVerticalScroll;
|
|
9107
|
+
this.settings = { ...e }, !t && this.settings.disableMainPaneVerticalScroll && this.chart.resetPriceOffset("main");
|
|
9107
9108
|
}
|
|
9108
9109
|
getInteractionSnapshot() {
|
|
9109
9110
|
return {
|
|
@@ -9203,7 +9204,7 @@ var qs = f({
|
|
|
9203
9204
|
let n = this.dragStartX - e.clientX;
|
|
9204
9205
|
this.applyPanScroll(t, this.scrollStartX + n);
|
|
9205
9206
|
let r = e.clientY - this.dragStartY;
|
|
9206
|
-
r !== 0 && this.activePaneIdOnDrag === "main" && (this.settings.disableMainPaneVerticalScroll || this.chart.translatePrice(this.activePaneIdOnDrag, r)
|
|
9207
|
+
this.dragStartY = e.clientY, r !== 0 && this.activePaneIdOnDrag === "main" && (this.settings.disableMainPaneVerticalScroll || this.chart.translatePrice(this.activePaneIdOnDrag, r));
|
|
9207
9208
|
}
|
|
9208
9209
|
return;
|
|
9209
9210
|
}
|
|
@@ -9377,7 +9378,7 @@ var qs = f({
|
|
|
9377
9378
|
};
|
|
9378
9379
|
}
|
|
9379
9380
|
reset() {
|
|
9380
|
-
this.isDragging = !1, this.dragMode = "none", this.dragStartX = 0, this.dragStartY = 0, this.scrollStartX = 0, this.activePaneIdOnDrag = null, this.clearSeparatorState(), this.isTouchSession = !1, this.activePointers.clear(), this.isPinching = !1, this.lastPinchDistance = 0, 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.hoveredCustomMarker = null, this.kLinePositions = null, this.visibleRange = null, this.kWidthPx = null
|
|
9381
|
+
this.isDragging = !1, this.dragMode = "none", this.dragStartX = 0, this.dragStartY = 0, this.scrollStartX = 0, this.activePaneIdOnDrag = null, this.clearSeparatorState(), this.isTouchSession = !1, this.activePointers.clear(), this.isPinching = !1, this.lastPinchDistance = 0, 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.hoveredCustomMarker = null, this.kLinePositions = null, this.visibleRange = null, this.kWidthPx = null;
|
|
9381
9382
|
}
|
|
9382
9383
|
getCrosshairIndex() {
|
|
9383
9384
|
return this.crosshairIndex;
|
|
@@ -9842,9 +9843,13 @@ var _c = (e, t) => `indicator:${e}:${t}`, vc = _c("ma", "main"), yc = _c("boll",
|
|
|
9842
9843
|
dirtyWmsrState = !0;
|
|
9843
9844
|
dirtyKstState = !0;
|
|
9844
9845
|
dirtyFastkState = !0;
|
|
9846
|
+
activeMainIndicators = /* @__PURE__ */ new Set();
|
|
9845
9847
|
setPluginHost(e) {
|
|
9846
9848
|
this.pluginHost = e;
|
|
9847
9849
|
}
|
|
9850
|
+
setActiveMainIndicators(e) {
|
|
9851
|
+
this.activeMainIndicators = new Set(e.map((e) => e.toLowerCase()));
|
|
9852
|
+
}
|
|
9848
9853
|
update(e, t) {
|
|
9849
9854
|
this.currentData = e, this.visibleRange = t, this.dirtyData = !0, this.computeIfDirty();
|
|
9850
9855
|
}
|
|
@@ -10122,6 +10127,29 @@ var _c = (e, t) => `indicator:${e}:${t}`, vc = _c("ma", "main"), yc = _c("boll",
|
|
|
10122
10127
|
}
|
|
10123
10128
|
this.dirtyData = !1, this.dirtyRange = !1, this.dirtyBollConfig = !1, this.dirtyExpmaConfig = !1, this.dirtyEneConfig = !1, this.dirtyRsiConfig = !1, this.dirtyCciConfig = !1, this.dirtyStochConfig = !1, this.dirtyMomConfig = !1, this.dirtyWmsrConfig = !1, this.dirtyKstConfig = !1, this.dirtyFastkConfig = !1, this.dirtyRsiState = !1, this.dirtyCciState = !1, this.dirtyStochState = !1, this.dirtyMomState = !1, this.dirtyWmsrState = !1, this.dirtyKstState = !1, this.dirtyFastkState = !1;
|
|
10124
10129
|
}
|
|
10130
|
+
getMainIndicatorPriceRange() {
|
|
10131
|
+
let e = Infinity, t = -Infinity, { start: n, end: r } = this.visibleRange;
|
|
10132
|
+
if (this.activeMainIndicators.has("ma") && Object.keys(this.cachedSeries).length > 0) for (let i of Object.values(this.cachedSeries)) for (let a = n; a < r && a < i.length; a++) {
|
|
10133
|
+
let n = i[a];
|
|
10134
|
+
n !== void 0 && (e = Math.min(e, n), t = Math.max(t, n));
|
|
10135
|
+
}
|
|
10136
|
+
if (this.activeMainIndicators.has("boll") && this.cachedBollSeries.length > 0) for (let i = n; i < r && i < this.cachedBollSeries.length; i++) {
|
|
10137
|
+
let n = this.cachedBollSeries[i];
|
|
10138
|
+
n && (e = Math.min(e, n.upper, n.middle, n.lower), t = Math.max(t, n.upper, n.middle, n.lower));
|
|
10139
|
+
}
|
|
10140
|
+
if (this.activeMainIndicators.has("expma") && this.cachedExpmaSeries.length > 0) for (let i = n; i < r && i < this.cachedExpmaSeries.length; i++) {
|
|
10141
|
+
let n = this.cachedExpmaSeries[i];
|
|
10142
|
+
n && (e = Math.min(e, n.fast, n.slow), t = Math.max(t, n.fast, n.slow));
|
|
10143
|
+
}
|
|
10144
|
+
if (this.activeMainIndicators.has("ene") && this.cachedEneSeries.length > 0) for (let i = n; i < r && i < this.cachedEneSeries.length; i++) {
|
|
10145
|
+
let n = this.cachedEneSeries[i];
|
|
10146
|
+
n && (e = Math.min(e, n.upper, n.middle, n.lower), t = Math.max(t, n.upper, n.middle, n.lower));
|
|
10147
|
+
}
|
|
10148
|
+
return !Number.isFinite(e) || !Number.isFinite(t) ? null : {
|
|
10149
|
+
min: e,
|
|
10150
|
+
max: t
|
|
10151
|
+
};
|
|
10152
|
+
}
|
|
10125
10153
|
};
|
|
10126
10154
|
//#endregion
|
|
10127
10155
|
//#region src/core/renderers/subVolume.ts
|
|
@@ -12624,6 +12652,136 @@ var Ll = class e {
|
|
|
12624
12652
|
start: 0,
|
|
12625
12653
|
end: 0
|
|
12626
12654
|
};
|
|
12655
|
+
activeMainIndicators = /* @__PURE__ */ new Set();
|
|
12656
|
+
mainIndicatorParams = {
|
|
12657
|
+
MA: {
|
|
12658
|
+
ma5: !0,
|
|
12659
|
+
ma10: !0,
|
|
12660
|
+
ma20: !0,
|
|
12661
|
+
ma30: !0,
|
|
12662
|
+
ma60: !0
|
|
12663
|
+
},
|
|
12664
|
+
BOLL: {
|
|
12665
|
+
period: 20,
|
|
12666
|
+
multiplier: 2,
|
|
12667
|
+
showUpper: !0,
|
|
12668
|
+
showMiddle: !0,
|
|
12669
|
+
showLower: !0,
|
|
12670
|
+
showBand: !0
|
|
12671
|
+
},
|
|
12672
|
+
EXPMA: {
|
|
12673
|
+
fastPeriod: 12,
|
|
12674
|
+
slowPeriod: 50
|
|
12675
|
+
},
|
|
12676
|
+
ENE: {
|
|
12677
|
+
period: 10,
|
|
12678
|
+
deviation: 11
|
|
12679
|
+
}
|
|
12680
|
+
};
|
|
12681
|
+
enableMainIndicator(e, t) {
|
|
12682
|
+
let n = e.toUpperCase();
|
|
12683
|
+
return [
|
|
12684
|
+
"MA",
|
|
12685
|
+
"BOLL",
|
|
12686
|
+
"EXPMA",
|
|
12687
|
+
"ENE"
|
|
12688
|
+
].includes(n) ? this.activeMainIndicators.has(n) ? (t && (this.mainIndicatorParams[n] = {
|
|
12689
|
+
...this.mainIndicatorParams[n],
|
|
12690
|
+
...t
|
|
12691
|
+
}, this.updateIndicatorSchedulerConfig(n)), !0) : (this.activeMainIndicators.add(n), t && (this.mainIndicatorParams[n] = {
|
|
12692
|
+
...this.mainIndicatorParams[n],
|
|
12693
|
+
...t
|
|
12694
|
+
}), this.enableMainIndicatorRenderer(n), this.updateIndicatorSchedulerConfig(n), this.scheduleDraw(), !0) : (console.warn(`[Chart] 未知的主图指标: ${e}`), !1);
|
|
12695
|
+
}
|
|
12696
|
+
disableMainIndicator(e) {
|
|
12697
|
+
let t = e.toUpperCase();
|
|
12698
|
+
return this.activeMainIndicators.has(t) ? (this.activeMainIndicators.delete(t), this.disableMainIndicatorRenderer(t), this.updateIndicatorSchedulerConfig(t), this.scheduleDraw(), !0) : !1;
|
|
12699
|
+
}
|
|
12700
|
+
toggleMainIndicator(e, t) {
|
|
12701
|
+
t ? this.enableMainIndicator(e) : this.disableMainIndicator(e);
|
|
12702
|
+
}
|
|
12703
|
+
getActiveMainIndicators() {
|
|
12704
|
+
return Array.from(this.activeMainIndicators);
|
|
12705
|
+
}
|
|
12706
|
+
isMainIndicatorActive(e) {
|
|
12707
|
+
return this.activeMainIndicators.has(e.toUpperCase());
|
|
12708
|
+
}
|
|
12709
|
+
updateMainIndicatorParams(e, t) {
|
|
12710
|
+
let n = e.toUpperCase();
|
|
12711
|
+
this.mainIndicatorParams[n] || (this.mainIndicatorParams[n] = {}), this.mainIndicatorParams[n] = {
|
|
12712
|
+
...this.mainIndicatorParams[n],
|
|
12713
|
+
...t
|
|
12714
|
+
};
|
|
12715
|
+
let r = n.toLowerCase(), i = this.getRenderer(r);
|
|
12716
|
+
i && i.setConfig && i.setConfig(this.mainIndicatorParams[n]), this.updateIndicatorSchedulerConfig(n), this.scheduleDraw();
|
|
12717
|
+
}
|
|
12718
|
+
getMainIndicatorParams(e) {
|
|
12719
|
+
return this.mainIndicatorParams[e.toUpperCase()] ?? null;
|
|
12720
|
+
}
|
|
12721
|
+
clearMainIndicators() {
|
|
12722
|
+
for (let e of this.activeMainIndicators) this.disableMainIndicatorRenderer(e);
|
|
12723
|
+
this.activeMainIndicators.clear(), this.scheduleDraw();
|
|
12724
|
+
}
|
|
12725
|
+
enableMainIndicatorRenderer(e) {
|
|
12726
|
+
let t = {
|
|
12727
|
+
MA: () => {
|
|
12728
|
+
this.getRenderer("ma") || this.useRenderer(Fc()), this.setRendererEnabled("ma", !0);
|
|
12729
|
+
},
|
|
12730
|
+
BOLL: () => {
|
|
12731
|
+
this.getRenderer("boll") || this.useRenderer(Ic()), this.setRendererEnabled("boll", !0);
|
|
12732
|
+
},
|
|
12733
|
+
EXPMA: () => {
|
|
12734
|
+
this.getRenderer("expma") || this.useRenderer(Lc()), this.setRendererEnabled("expma", !0);
|
|
12735
|
+
},
|
|
12736
|
+
ENE: () => {
|
|
12737
|
+
this.getRenderer("ene") || this.useRenderer(Rc()), this.setRendererEnabled("ene", !0);
|
|
12738
|
+
}
|
|
12739
|
+
}[e];
|
|
12740
|
+
t && t(), this.getRenderer("mainIndicatorLegend") || this.useRenderer(Gc({ yPaddingPx: this.opt.yPaddingPx }));
|
|
12741
|
+
}
|
|
12742
|
+
disableMainIndicatorRenderer(e) {
|
|
12743
|
+
let t = {
|
|
12744
|
+
MA: "ma",
|
|
12745
|
+
BOLL: "boll",
|
|
12746
|
+
EXPMA: "expma",
|
|
12747
|
+
ENE: "ene"
|
|
12748
|
+
}[e];
|
|
12749
|
+
t && this.setRendererEnabled(t, !1);
|
|
12750
|
+
}
|
|
12751
|
+
updateIndicatorSchedulerConfig(e) {
|
|
12752
|
+
let t = this.activeMainIndicators.has(e), n = this.mainIndicatorParams[e];
|
|
12753
|
+
switch (e) {
|
|
12754
|
+
case "MA":
|
|
12755
|
+
this.indicatorScheduler.updateMAConfig({
|
|
12756
|
+
ma5: t,
|
|
12757
|
+
ma10: t,
|
|
12758
|
+
ma20: t,
|
|
12759
|
+
ma30: t,
|
|
12760
|
+
ma60: t
|
|
12761
|
+
});
|
|
12762
|
+
break;
|
|
12763
|
+
case "BOLL":
|
|
12764
|
+
t ? this.indicatorScheduler.updateBOLLConfig(n) : this.indicatorScheduler.updateBOLLConfig({
|
|
12765
|
+
...n,
|
|
12766
|
+
showUpper: !1,
|
|
12767
|
+
showMiddle: !1,
|
|
12768
|
+
showLower: !1,
|
|
12769
|
+
showBand: !1
|
|
12770
|
+
});
|
|
12771
|
+
break;
|
|
12772
|
+
case "EXPMA":
|
|
12773
|
+
t && this.indicatorScheduler.updateEXPMAConfig(n);
|
|
12774
|
+
break;
|
|
12775
|
+
case "ENE":
|
|
12776
|
+
t && this.indicatorScheduler.updateENEConfig(n);
|
|
12777
|
+
break;
|
|
12778
|
+
}
|
|
12779
|
+
}
|
|
12780
|
+
setActiveMainIndicators(e) {
|
|
12781
|
+
let t = new Set(e.map((e) => e.toUpperCase())), n = new Set(this.activeMainIndicators);
|
|
12782
|
+
for (let e of n) t.has(e) || this.disableMainIndicator(e);
|
|
12783
|
+
for (let e of t) n.has(e) || this.enableMainIndicator(e);
|
|
12784
|
+
}
|
|
12627
12785
|
constructor(e, t) {
|
|
12628
12786
|
this.dom = e;
|
|
12629
12787
|
let { kWidth: n, kGap: r, ...i } = t;
|
|
@@ -12722,11 +12880,13 @@ var Ll = class e {
|
|
|
12722
12880
|
let { kWidthPx: u } = ka(this.opt.kWidth, this.opt.kGap, t.dpr);
|
|
12723
12881
|
this.interaction.setKLinePositions(a, i, u);
|
|
12724
12882
|
let d = [], f = [], p = [], m = [];
|
|
12883
|
+
this.indicatorScheduler.setActiveMainIndicators(Array.from(this.activeMainIndicators));
|
|
12884
|
+
let h = this.indicatorScheduler.getMainIndicatorPriceRange();
|
|
12725
12885
|
for (let n of this.paneRenderers) {
|
|
12726
|
-
let r = n.getPane(), o = n.getDom().mainCanvas.getContext("2d"), s = n.getDom().overlayCanvas.getContext("2d"), u = n.getDom().yAxisCanvas.getContext("2d");
|
|
12727
|
-
r.updateRange(this.data, i);
|
|
12728
|
-
let
|
|
12729
|
-
if (
|
|
12886
|
+
let r = n.getPane(), o = n.getDom().mainCanvas.getContext("2d"), s = n.getDom().overlayCanvas.getContext("2d"), u = n.getDom().yAxisCanvas.getContext("2d"), g = r.role === "price" ? h : null;
|
|
12887
|
+
r.updateRange(this.data, i, g);
|
|
12888
|
+
let _ = e === X.Main || e === X.All, v = e === X.Overlay || e === X.All;
|
|
12889
|
+
if (_ && o && (o.setTransform(1, 0, 0, 1, 0, 0), o.scale(t.dpr, t.dpr), o.clearRect(0, 0, t.plotWidth + 1, r.height + 2 / t.dpr)), v && s) {
|
|
12730
12890
|
let e = s.canvas.width / t.dpr;
|
|
12731
12891
|
s.setTransform(1, 0, 0, 1, 0, 0), s.scale(t.dpr, t.dpr), s.clearRect(0, 0, e + 1, r.height + 2 / t.dpr);
|
|
12732
12892
|
}
|
|
@@ -12734,7 +12894,7 @@ var Ll = class e {
|
|
|
12734
12894
|
let e = u.canvas.width / t.dpr;
|
|
12735
12895
|
u.setTransform(1, 0, 0, 1, 0, 0), u.scale(t.dpr, t.dpr), u.clearRect(0, 0, e, r.height + 2 / t.dpr);
|
|
12736
12896
|
}
|
|
12737
|
-
let
|
|
12897
|
+
let y = {
|
|
12738
12898
|
ctx: o,
|
|
12739
12899
|
overlayCtx: s ?? void 0,
|
|
12740
12900
|
pane: ba(r),
|
|
@@ -12763,16 +12923,16 @@ var Ll = class e {
|
|
|
12763
12923
|
xAxisLabels: f,
|
|
12764
12924
|
yAxisRanges: p,
|
|
12765
12925
|
xAxisRanges: m
|
|
12766
|
-
},
|
|
12767
|
-
|
|
12926
|
+
}, b = this.rendererPluginManager.render(r.id, y, e);
|
|
12927
|
+
b.length > 0 && this.pluginHost.events.emit("renderer:error", {
|
|
12768
12928
|
paneId: r.id,
|
|
12769
|
-
errors:
|
|
12929
|
+
errors: b
|
|
12770
12930
|
});
|
|
12771
12931
|
}
|
|
12772
|
-
let
|
|
12773
|
-
if (
|
|
12932
|
+
let g = this.dom.xAxisCanvas.getContext("2d");
|
|
12933
|
+
if (g) {
|
|
12774
12934
|
let e = {
|
|
12775
|
-
ctx:
|
|
12935
|
+
ctx: g,
|
|
12776
12936
|
pane: {
|
|
12777
12937
|
id: "xAxis",
|
|
12778
12938
|
role: "auxiliary",
|
|
@@ -12811,7 +12971,7 @@ var Ll = class e {
|
|
|
12811
12971
|
kLinePositions: a,
|
|
12812
12972
|
kLineCenters: c,
|
|
12813
12973
|
kBarRects: l,
|
|
12814
|
-
xAxisCtx:
|
|
12974
|
+
xAxisCtx: g,
|
|
12815
12975
|
viewport: {
|
|
12816
12976
|
scrollLeft: t.scrollLeft,
|
|
12817
12977
|
plotWidth: t.plotWidth,
|
|
@@ -13055,6 +13215,10 @@ var Ll = class e {
|
|
|
13055
13215
|
let i = r.yAxis.deltaYToPriceOffset(t), a = r.yAxis.getPriceOffset();
|
|
13056
13216
|
r.yAxis.setPriceOffset(a + i), this.scheduleDraw();
|
|
13057
13217
|
}
|
|
13218
|
+
resetPriceOffset(e) {
|
|
13219
|
+
let t = this.paneRenderers.find((t) => t.getPane().id === e);
|
|
13220
|
+
t && (t.getPane().yAxis.resetPriceOffset(), this.scheduleDraw());
|
|
13221
|
+
}
|
|
13058
13222
|
scalePrice(e, t) {
|
|
13059
13223
|
let n = this.paneRenderers.find((t) => t.getPane().id === e);
|
|
13060
13224
|
if (!n) return;
|
|
@@ -14475,7 +14639,7 @@ var Pd = f({
|
|
|
14475
14639
|
},
|
|
14476
14640
|
{
|
|
14477
14641
|
key: "disableMainPaneVerticalScroll",
|
|
14478
|
-
label: "
|
|
14642
|
+
label: "主图纵轴刻度自适应调整",
|
|
14479
14643
|
type: "boolean",
|
|
14480
14644
|
default: !1,
|
|
14481
14645
|
group: "experimental"
|
|
@@ -14805,7 +14969,7 @@ var Pd = f({
|
|
|
14805
14969
|
_: 1
|
|
14806
14970
|
})], 8, ["to"]))], 64));
|
|
14807
14971
|
}
|
|
14808
|
-
}), [["__scopeId", "data-v-
|
|
14972
|
+
}), [["__scopeId", "data-v-f47a57b0"]]), Qd = { class: "chart-wrapper" }, $d = {
|
|
14809
14973
|
class: "pane-separator-layer",
|
|
14810
14974
|
"aria-hidden": "true"
|
|
14811
14975
|
}, ef = 4, tf = /* @__PURE__ */ Jo(/* @__PURE__ */ u({
|
|
@@ -15109,8 +15273,10 @@ var Pd = f({
|
|
|
15109
15273
|
j.value?.clearSubPanes(), H.value = [], V.value = V.value.filter((e) => !Ge.includes(e));
|
|
15110
15274
|
}
|
|
15111
15275
|
function Ze() {
|
|
15112
|
-
let e = d.semanticConfig.
|
|
15113
|
-
if (
|
|
15276
|
+
let e = d.semanticConfig, t = j.value;
|
|
15277
|
+
if (!t) return;
|
|
15278
|
+
let n = e.indicators?.main;
|
|
15279
|
+
if (n) for (let e of n) e.enabled && (V.value.includes(e.type) || V.value.push(e.type), e.params && (Ue.value[e.type] = e.params), t.enableMainIndicator(e.type, e.params));
|
|
15114
15280
|
}
|
|
15115
15281
|
D([V, Ue], ([e]) => {
|
|
15116
15282
|
let t = j.value;
|
|
@@ -15131,13 +15297,7 @@ var Pd = f({
|
|
|
15131
15297
|
enabled: e.includes("ENE"),
|
|
15132
15298
|
params: Ue.value.ENE || {}
|
|
15133
15299
|
}
|
|
15134
|
-
} }),
|
|
15135
|
-
ma5: e.includes("MA"),
|
|
15136
|
-
ma10: e.includes("MA"),
|
|
15137
|
-
ma20: e.includes("MA"),
|
|
15138
|
-
ma30: e.includes("MA"),
|
|
15139
|
-
ma60: e.includes("MA")
|
|
15140
|
-
}), t.setRendererEnabled("boll", e.includes("BOLL")), t.setRendererEnabled("expma", e.includes("EXPMA")), t.setRendererEnabled("ene", e.includes("ENE")), L());
|
|
15300
|
+
} }), L());
|
|
15141
15301
|
}, { deep: !0 });
|
|
15142
15302
|
function Qe() {
|
|
15143
15303
|
let e = j.value?.getSubPaneIndicators() ?? [];
|
|
@@ -15187,44 +15347,27 @@ var Pd = f({
|
|
|
15187
15347
|
return r.getTitleInfo(n, be.value, i);
|
|
15188
15348
|
}
|
|
15189
15349
|
function tt(e, t) {
|
|
15190
|
-
|
|
15191
|
-
|
|
15192
|
-
|
|
15193
|
-
|
|
15194
|
-
|
|
15195
|
-
if (t) {
|
|
15196
|
-
if (V.value.includes(e) || V.value.push(e), H.value.find((t) => t.indicatorId === e)) return;
|
|
15197
|
-
if (!Je(e)) {
|
|
15198
|
-
let t = H.value[H.value.length - 1];
|
|
15199
|
-
t && $e(t.id, e);
|
|
15200
|
-
}
|
|
15201
|
-
} else V.value = V.value.filter((t) => t !== e), H.value.filter((t) => t.indicatorId === e).forEach((e) => Ye(e.id));
|
|
15202
|
-
L();
|
|
15203
|
-
}
|
|
15204
|
-
}
|
|
15205
|
-
function nt() {
|
|
15206
|
-
j.value?.updateRendererConfig("mainIndicatorLegend", { indicators: {
|
|
15207
|
-
MA: {
|
|
15208
|
-
enabled: V.value.includes("MA"),
|
|
15209
|
-
params: Ue.value.MA || {}
|
|
15210
|
-
},
|
|
15211
|
-
BOLL: {
|
|
15212
|
-
enabled: V.value.includes("BOLL"),
|
|
15213
|
-
params: Ue.value.BOLL || {}
|
|
15214
|
-
},
|
|
15215
|
-
EXPMA: {
|
|
15216
|
-
enabled: V.value.includes("EXPMA"),
|
|
15217
|
-
params: Ue.value.EXPMA || {}
|
|
15218
|
-
},
|
|
15219
|
-
ENE: {
|
|
15220
|
-
enabled: V.value.includes("ENE"),
|
|
15221
|
-
params: Ue.value.ENE || {}
|
|
15350
|
+
let n = j.value;
|
|
15351
|
+
if (n) {
|
|
15352
|
+
if (e === "MA" || e === "BOLL" || e === "EXPMA" || e === "ENE") {
|
|
15353
|
+
n.toggleMainIndicator(e, t), t ? V.value.includes(e) || V.value.push(e) : V.value = V.value.filter((t) => t !== e);
|
|
15354
|
+
return;
|
|
15222
15355
|
}
|
|
15223
|
-
|
|
15356
|
+
if (Ge.includes(e)) {
|
|
15357
|
+
if (t) {
|
|
15358
|
+
if (V.value.includes(e) || V.value.push(e), H.value.find((t) => t.indicatorId === e)) return;
|
|
15359
|
+
if (!Je(e)) {
|
|
15360
|
+
let t = H.value[H.value.length - 1];
|
|
15361
|
+
t && $e(t.id, e);
|
|
15362
|
+
}
|
|
15363
|
+
} else V.value = V.value.filter((t) => t !== e), H.value.filter((t) => t.indicatorId === e).forEach((e) => Ye(e.id));
|
|
15364
|
+
L();
|
|
15365
|
+
}
|
|
15366
|
+
}
|
|
15224
15367
|
}
|
|
15225
|
-
function
|
|
15368
|
+
function nt(e, t) {
|
|
15226
15369
|
if (Ue.value[e] = t, e === "MA" || e === "BOLL" || e === "EXPMA" || e === "ENE") {
|
|
15227
|
-
|
|
15370
|
+
j.value?.updateMainIndicatorParams(e, t), L();
|
|
15228
15371
|
return;
|
|
15229
15372
|
}
|
|
15230
15373
|
if (e === "RSI") {
|
|
@@ -15273,7 +15416,7 @@ var Pd = f({
|
|
|
15273
15416
|
e.params = { ...t }, j.value?.updateRendererConfig(e.rendererName, t);
|
|
15274
15417
|
}), L();
|
|
15275
15418
|
}
|
|
15276
|
-
function
|
|
15419
|
+
function rt(e) {
|
|
15277
15420
|
if (!e.length || H.value.length <= 1) return;
|
|
15278
15421
|
let t = e.filter((e) => Ge.includes(e));
|
|
15279
15422
|
if (!t.length) return;
|
|
@@ -15292,8 +15435,8 @@ var Pd = f({
|
|
|
15292
15435
|
let c = j.value;
|
|
15293
15436
|
c && c.updatePaneLayout(Ke());
|
|
15294
15437
|
}
|
|
15295
|
-
let
|
|
15296
|
-
function
|
|
15438
|
+
let it = r(() => d.rightAxisWidth + d.priceLabelWidth), at = N.computed.totalWidth;
|
|
15439
|
+
function ot() {
|
|
15297
15440
|
let e = E.value, t = j.value;
|
|
15298
15441
|
if (!e || !t) return;
|
|
15299
15442
|
let n = t.getData()?.length ?? 0;
|
|
@@ -15301,7 +15444,7 @@ var Pd = f({
|
|
|
15301
15444
|
let r = t.getCurrentDpr(), { unitPx: i, startXPx: a } = ka(te.value, P.value, r), o = (a + n * i) / r, s = Math.max(0, e.scrollWidth - e.clientWidth), c = Math.min(s, Math.max(0, o - e.clientWidth));
|
|
15302
15445
|
e.scrollLeft = Math.round(c * r) / r, L();
|
|
15303
15446
|
}
|
|
15304
|
-
function
|
|
15447
|
+
function st(e, t) {
|
|
15305
15448
|
let n = j.value, r = E.value;
|
|
15306
15449
|
if (!n || !r) return;
|
|
15307
15450
|
let i = n.getCurrentDpr(), a = Hl(e, t ?? (n.getViewport()?.plotWidth ?? r.clientWidth) / 2, r.scrollLeft, ee.value, te.value, P.value, {
|
|
@@ -15319,7 +15462,7 @@ var Pd = f({
|
|
|
15319
15462
|
}
|
|
15320
15463
|
return c({
|
|
15321
15464
|
scheduleRender: L,
|
|
15322
|
-
scrollToRight:
|
|
15465
|
+
scrollToRight: ot,
|
|
15323
15466
|
addSubPane: Je,
|
|
15324
15467
|
removeSubPane: Ye,
|
|
15325
15468
|
switchSubIndicator: $e,
|
|
@@ -15327,9 +15470,9 @@ var Pd = f({
|
|
|
15327
15470
|
get plugin() {
|
|
15328
15471
|
return j.value?.plugin;
|
|
15329
15472
|
},
|
|
15330
|
-
zoomToLevel:
|
|
15331
|
-
zoomIn: (e) =>
|
|
15332
|
-
zoomOut: (e) =>
|
|
15473
|
+
zoomToLevel: st,
|
|
15474
|
+
zoomIn: (e) => st(ee.value + 1, e),
|
|
15475
|
+
zoomOut: (e) => st(ee.value - 1, e),
|
|
15333
15476
|
getZoomLevel: () => ee.value,
|
|
15334
15477
|
getZoomLevelCount: () => j.value?.getZoomLevelCount() ?? 10
|
|
15335
15478
|
}), g(() => {
|
|
@@ -15374,7 +15517,7 @@ var Pd = f({
|
|
|
15374
15517
|
zoomLevels: d.zoomLevels,
|
|
15375
15518
|
initialZoomLevel: d.initialZoomLevel
|
|
15376
15519
|
});
|
|
15377
|
-
a.useRenderer(nu()), a.useRenderer(su()), a.useRenderer(Fc()), a.useRenderer(Ic()), a.setRendererEnabled("boll", !1), a.useRenderer(Lc()), a.setRendererEnabled("expma", !1), a.useRenderer(Rc()), a.setRendererEnabled("ene", !1), a.useRenderer(ql()), a.useRenderer(ru()), a.useRenderer(mo());
|
|
15520
|
+
a.useRenderer(nu()), a.useRenderer(su()), a.useRenderer(Fc()), a.setRendererEnabled("ma", !1), a.useRenderer(Ic()), a.setRendererEnabled("boll", !1), a.useRenderer(Lc()), a.setRendererEnabled("expma", !1), a.useRenderer(Rc()), a.setRendererEnabled("ene", !1), a.useRenderer(ql()), a.useRenderer(ru()), a.useRenderer(mo());
|
|
15378
15521
|
let o = d.rightAxisWidth + d.priceLabelWidth, s = () => {
|
|
15379
15522
|
let e = a.interaction.crosshairPos, t = a.interaction.crosshairPrice, n = a.interaction.activePaneId;
|
|
15380
15523
|
return e && t !== null ? {
|
|
@@ -15496,7 +15639,7 @@ var Pd = f({
|
|
|
15496
15639
|
}), z.value = a.interaction.getInteractionSnapshot(), N.actions.setViewportDpr(a.getCurrentDpr()), a.resize(), M.value = new ia(a), M.value.on("config:error", (e) => {
|
|
15497
15640
|
console.error("Semantic config error:", e);
|
|
15498
15641
|
}), M.value.on("config:ready", () => {
|
|
15499
|
-
N.actions.setDataLength(a.getData()?.length ?? 0), N.actions.bumpDataVersion(), Ze(), Qe(), p(() =>
|
|
15642
|
+
N.actions.setDataLength(a.getData()?.length ?? 0), N.actions.bumpDataVersion(), Ze(), Qe(), p(() => ot());
|
|
15500
15643
|
}), M.value.applyConfig(d.semanticConfig).then((e) => {
|
|
15501
15644
|
e && !e.success && console.error("Semantic config apply failed:", e.errors);
|
|
15502
15645
|
}), a.__onWheel = i;
|
|
@@ -15526,8 +15669,8 @@ var Pd = f({
|
|
|
15526
15669
|
"is-fullscreen": n.isFullscreen,
|
|
15527
15670
|
onSelectTool: je,
|
|
15528
15671
|
onToggleFullscreen: c[0] ||= (e) => r.$emit("toggleFullscreen"),
|
|
15529
|
-
onZoomIn: c[1] ||= (e) =>
|
|
15530
|
-
onZoomOut: c[2] ||= (e) =>
|
|
15672
|
+
onZoomIn: c[1] ||= (e) => st(ee.value + 1),
|
|
15673
|
+
onZoomOut: c[2] ||= (e) => st(ee.value - 1),
|
|
15531
15674
|
onSettingsChange: re
|
|
15532
15675
|
}, null, 8, ["is-fullscreen"]), s("div", {
|
|
15533
15676
|
class: "chart-main",
|
|
@@ -15555,7 +15698,7 @@ var Pd = f({
|
|
|
15555
15698
|
onPointerleave: Le
|
|
15556
15699
|
}, [s("div", {
|
|
15557
15700
|
class: "scroll-content",
|
|
15558
|
-
style: h({ width: T(
|
|
15701
|
+
style: h({ width: T(at) + "px" })
|
|
15559
15702
|
}, [s("div", {
|
|
15560
15703
|
class: "canvas-layer",
|
|
15561
15704
|
ref_key: "canvasLayerRef",
|
|
@@ -15619,7 +15762,7 @@ var Pd = f({
|
|
|
15619
15762
|
class: "right-axis-host",
|
|
15620
15763
|
ref_key: "rightAxisLayerRef",
|
|
15621
15764
|
ref: w,
|
|
15622
|
-
style: h({ width:
|
|
15765
|
+
style: h({ width: it.value + "px" }),
|
|
15623
15766
|
onPointerdown: Re,
|
|
15624
15767
|
onPointermove: ze,
|
|
15625
15768
|
onPointerup: Be,
|
|
@@ -15629,11 +15772,11 @@ var Pd = f({
|
|
|
15629
15772
|
"active-indicators": V.value,
|
|
15630
15773
|
"indicator-params": Ue.value,
|
|
15631
15774
|
onToggle: tt,
|
|
15632
|
-
onUpdateParams:
|
|
15633
|
-
onReorderSubIndicators:
|
|
15775
|
+
onUpdateParams: nt,
|
|
15776
|
+
onReorderSubIndicators: rt
|
|
15634
15777
|
}, null, 8, ["active-indicators", "indicator-params"])]));
|
|
15635
15778
|
}
|
|
15636
|
-
}), [["__scopeId", "data-v-
|
|
15779
|
+
}), [["__scopeId", "data-v-b9893341"]]), nf = { install(e) {
|
|
15637
15780
|
e.component("KLineChart", tf);
|
|
15638
15781
|
} };
|
|
15639
15782
|
//#endregion
|
package/dist/klinechart.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
.kline-tooltip[data-v-d0fe85e6]{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-d0fe85e6]{justify-content:space-between;gap:10px;margin-bottom:6px;font-weight:600;display:flex}.kline-tooltip__grid[data-v-d0fe85e6]{grid-template-columns:1fr;gap:2px;display:grid}.kline-tooltip__grid .row[data-v-d0fe85e6]{justify-content:space-between;gap:10px;display:flex}.kline-tooltip__grid .row span[data-v-d0fe85e6]:first-child{color:#0000008f}@supports (anchor-name:--kmap-anchor) and (position-anchor:--kmap-anchor){.kline-tooltip.use-anchor[data-v-d0fe85e6]{position-anchor:--kline-tooltip-anchor;left:anchor(left);top:anchor(top);position:absolute}.kline-tooltip.use-anchor.anchor-right-bottom[data-v-d0fe85e6]{transform:translate(14px,14px)}.kline-tooltip.use-anchor.anchor-left-bottom[data-v-d0fe85e6]{transform:translate(calc(-100% - 14px),14px)}}.marker-tooltip[data-v-5574cc25]{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-5574cc25]{justify-content:space-between;gap:10px;margin-bottom:6px;font-weight:600;display:flex}.marker-tooltip__content[data-v-5574cc25]{grid-template-columns:1fr;gap:2px;display:grid}.marker-tooltip__content .row[data-v-5574cc25]{justify-content:space-between;gap:10px;display:flex}.marker-tooltip__content .row span[data-v-5574cc25]:first-child{color:#0000008f}@supports (anchor-name:--kmap-anchor) and (position-anchor:--kmap-anchor){.marker-tooltip.use-anchor[data-v-5574cc25]{position-anchor:--marker-tooltip-anchor;left:anchor(left);top:anchor(top);position:absolute}.marker-tooltip.use-anchor.anchor-right-bottom[data-v-5574cc25]{transform:translate(12px,12px)}.marker-tooltip.use-anchor.anchor-left-bottom[data-v-5574cc25]{transform:translate(calc(-100% - 12px),12px)}}.params-overlay[data-v-bb1d1eb3]{-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-bb1d1eb3]{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-bb1d1eb3]{background:#f8f8f8;border-bottom:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:16px 20px;display:flex}.header-left[data-v-bb1d1eb3]{align-items:baseline;gap:8px;display:flex}.header-right[data-v-bb1d1eb3]{align-items:center;gap:8px;display:flex}.params-title[data-v-bb1d1eb3]{color:#1a1a1a;letter-spacing:.2px;font-size:14px;font-weight:600}.params-subtitle[data-v-bb1d1eb3]{color:#999;font-size:11px}.toggle-desc-btn[data-v-bb1d1eb3]{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-bb1d1eb3]:hover{color:#555;background:#f0f0f0;border-color:#ccc}.toggle-desc-btn.active[data-v-bb1d1eb3]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.toggle-desc-btn svg[data-v-bb1d1eb3]{width:14px;height:14px}.params-close[data-v-bb1d1eb3]{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:background .15s,color .15s,border-color .15s;display:flex}.params-close[data-v-bb1d1eb3]:hover{color:#333;background:#f0f0f0;border-color:#ccc}.params-close svg[data-v-bb1d1eb3]{width:14px;height:14px}.indicator-description[data-v-bb1d1eb3]{background:#f0f7ff;border-bottom:1px solid #d6e8f5;padding:12px 20px}.indicator-description p[data-v-bb1d1eb3]{color:#2c5282;margin:0;font-size:12px;line-height:1.6}.params-body[data-v-bb1d1eb3]{flex-direction:column;gap:10px;padding:16px 20px;display:flex}.param-item[data-v-bb1d1eb3]{background:#f8f8f8;border:1px solid #e8e8e8;border-radius:8px;padding:10px 14px;transition:border-color .2s}.param-item[data-v-bb1d1eb3]:has(.param-input:focus){border-color:#bbb}.param-item.has-desc[data-v-bb1d1eb3]{padding:10px 14px 8px}.param-header[data-v-bb1d1eb3]{justify-content:space-between;align-items:center;gap:16px;display:flex}.param-label[data-v-bb1d1eb3]{flex-direction:column;gap:3px;display:flex}.param-label-text[data-v-bb1d1eb3]{color:#333;font-size:13px;font-weight:500}.param-range[data-v-bb1d1eb3]{color:#999;font-size:11px}.param-description[data-v-bb1d1eb3]{color:#666;border-top:1px dashed #e0e0e0;margin-top:8px;padding-top:8px;font-size:11px;line-height:1.5}.input-wrapper[data-v-bb1d1eb3]{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-bb1d1eb3]:focus-within{border-color:#999}.stepper-btn[data-v-bb1d1eb3]{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-bb1d1eb3]:hover:not(:disabled){color:#333;background:#e0e0e0}.stepper-btn[data-v-bb1d1eb3]:disabled{color:#ccc;cursor:not-allowed}.param-input[data-v-bb1d1eb3]{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-bb1d1eb3]::-webkit-inner-spin-button{-webkit-appearance:none}.param-input[data-v-bb1d1eb3]::-webkit-outer-spin-button{-webkit-appearance:none}.param-input[data-v-bb1d1eb3]:focus{outline:none}.params-footer[data-v-bb1d1eb3]{background:#f8f8f8;border-top:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:12px 20px;display:flex}.footer-right[data-v-bb1d1eb3]{gap:8px;display:flex}.params-btn[data-v-bb1d1eb3]{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-bb1d1eb3]{flex-shrink:0;width:12px;height:12px}.params-btn.reset[data-v-bb1d1eb3]{color:#666;background:0 0;border-color:#d0d0d0}.params-btn.reset[data-v-bb1d1eb3]:hover{color:#e74c3c;background:#e74c3c14;border-color:#c0392b}.params-btn.cancel[data-v-bb1d1eb3]{color:#666;background:0 0;border-color:#d0d0d0}.params-btn.cancel[data-v-bb1d1eb3]:hover{color:#333;background:#f0f0f0;border-color:#bbb}.params-btn.confirm[data-v-bb1d1eb3]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.params-btn.confirm[data-v-bb1d1eb3]:hover{background:#333;border-color:#333;transform:translateY(-1px);box-shadow:0 2px 10px #00000026}.params-btn.confirm[data-v-bb1d1eb3]:active{box-shadow:none;transform:translateY(0)}.overlay-enter-active[data-v-bb1d1eb3],.overlay-leave-active[data-v-bb1d1eb3]{transition:opacity .2s}.overlay-enter-from[data-v-bb1d1eb3],.overlay-leave-to[data-v-bb1d1eb3]{opacity:0}.modal-enter-active[data-v-bb1d1eb3]{transition:all .22s cubic-bezier(.34,1.56,.64,1)}.modal-leave-active[data-v-bb1d1eb3]{transition:all .16s ease-in}.modal-enter-from[data-v-bb1d1eb3]{opacity:0;transform:scale(.88)translateY(-16px)}.modal-leave-to[data-v-bb1d1eb3]{opacity:0;transform:scale(.94)translateY(8px)}.slide-enter-active[data-v-bb1d1eb3],.slide-leave-active[data-v-bb1d1eb3]{transition:all .2s;overflow:hidden}.slide-enter-from[data-v-bb1d1eb3],.slide-leave-to[data-v-bb1d1eb3]{opacity:0;max-height:0;margin-top:0;padding-top:0;padding-bottom:0}.indicator-selector[data-v-0f3a76b5]{width:80%;margin:20px;position:relative}.indicator-scroll-container[data-v-0f3a76b5]{scrollbar-width:none;-webkit-overflow-scrolling:touch;text-align:center;width:100%;overflow:auto hidden}.indicator-scroll-container[data-v-0f3a76b5]::-webkit-scrollbar{display:none}.indicator-list[data-v-0f3a76b5]{gap:8px;margin:0 auto;padding:2px;display:inline-flex}.indicator-divider[data-v-0f3a76b5]{background:#d9d9d9;align-self:center;width:1px;height:20px}.indicator-item[data-v-0f3a76b5]{align-items:center;gap:4px;display:flex}.indicator-item.draggable[data-v-0f3a76b5],.indicator-item.draggable .indicator-btn[data-v-0f3a76b5],.indicator-item.draggable[data-v-0f3a76b5]:hover,.indicator-item.draggable:hover .indicator-btn[data-v-0f3a76b5]{cursor:move}.indicator-item.is-dragging[data-v-0f3a76b5]{opacity:.6}.indicator-item.drag-over .indicator-btn[data-v-0f3a76b5]{border-color:#1a1a1a;box-shadow:0 0 0 2px #1a1a1a1f}.indicator-btn-wrapper[data-v-0f3a76b5]{position:relative}.indicator-btn[data-v-0f3a76b5]{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-0f3a76b5]:hover:not(.hovering){color:#333;background:#f8f8f8;border-color:#ccc}.indicator-btn.active[data-v-0f3a76b5]{color:#1a1a1a;background:#f8f8f8;border-color:#1a1a1a}.indicator-btn.active[data-v-0f3a76b5]:hover:not(.hovering){background:#f0f0f0;border-color:#333}.btn-content[data-v-0f3a76b5]{z-index:1;position:relative}.param-hint[data-v-0f3a76b5]{opacity:.85;font-size:11px}.hover-overlay[data-v-0f3a76b5]{-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-0f3a76b5]{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-0f3a76b5]:hover{color:#333;background:#0000000f}.settings-btn[data-v-0f3a76b5]:hover{color:#1a1a1a}.remove-btn[data-v-0f3a76b5]:hover{color:#ff4d4f}.divider[data-v-0f3a76b5]{background:#e0e0e0;width:1px;height:14px}.add-btn[data-v-0f3a76b5]{anchor-name:--indicator-add-btn;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-0f3a76b5]:hover{color:#1a1a1a;background:#1a1a1a0a;border-color:#1a1a1a}.add-menu[data-v-0f3a76b5]{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}@supports (anchor-name:--kmap-anchor) and (position-anchor:--kmap-anchor){.add-menu.use-anchor[data-v-0f3a76b5]{position-anchor:--indicator-add-btn;left:anchor(center);top:anchor(top);max-width:calc(100vw - 16px);position:fixed;transform:translate(-50%,calc(-100% - 8px))}}.menu-section[data-v-0f3a76b5]{padding:4px 0}.menu-section[data-v-0f3a76b5]:not(:last-child){border-bottom:1px solid #f0f0f0}.menu-title[data-v-0f3a76b5]{color:#999;padding:4px 16px;font-size:12px;font-weight:500}.menu-items[data-v-0f3a76b5]{flex-direction:column;gap:2px;display:flex}.menu-item[data-v-0f3a76b5]{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-0f3a76b5]:hover:not(.disabled){background:#f5f5f5}.menu-item.disabled[data-v-0f3a76b5]{color:#999;cursor:not-allowed}.menu-item .param-hint[data-v-0f3a76b5]{color:#999;font-size:11px}.active-tag[data-v-0f3a76b5]{color:#1a1a1a;align-items:center;margin-left:auto;display:flex}.fade-enter-active[data-v-0f3a76b5],.fade-leave-active[data-v-0f3a76b5]{transition:opacity .2s}.fade-enter-from[data-v-0f3a76b5],.fade-leave-to[data-v-0f3a76b5]{opacity:0}.slide-enter-active[data-v-0f3a76b5],.slide-leave-active[data-v-0f3a76b5]{transition:all .2s}.slide-enter-from[data-v-0f3a76b5],.slide-leave-to[data-v-0f3a76b5]{opacity:0;transform:translate(-50%)translateY(8px)}.drawing-style-toolbar[data-v-92699cb2]{-webkit-backdrop-filter:blur(8px);z-index:100;-webkit-user-select:none;user-select:none;pointer-events:auto;background:#fafbfce0;border:1px solid #e5e7eb;border-radius:6px;align-items:center;gap:6px;height:32px;padding:4px 8px;display:flex;position:absolute;top:8px;left:50%;transform:translate(-50%);box-shadow:0 1px 3px #0000000f}.toolbar-item[data-v-92699cb2]{justify-content:center;align-items:center;display:inline-flex}.color-item[data-v-92699cb2]{width:24px;height:24px;position:relative}.color-swatch[data-v-92699cb2]{cursor:pointer;border:1px solid #d1d5db;border-radius:4px;width:100%;height:100%;display:block}.color-input[data-v-92699cb2]{opacity:0;cursor:pointer;width:100%;height:100%;position:absolute;inset:0}.toolbar-select[data-v-92699cb2]{color:#374151;cursor:pointer;background:#fff;border:1px solid #d1d5db;border-radius:4px;outline:none;height:24px;padding:0 4px;font-size:12px}.toolbar-select[data-v-92699cb2]:hover{border-color:#9ca3af}.toolbar-btn[data-v-92699cb2]{color:#6b7280;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:4px;justify-content:center;align-items:center;width:24px;height:24px;padding:0;transition:border-color .15s,background .15s,color .15s;display:inline-flex}.toolbar-btn[data-v-92699cb2]:hover{color:#374151;background:#f3f4f6;border-color:#d1d5db}.delete-btn[data-v-92699cb2]:hover{color:#dc2626;background:#fef2f2;border-color:#fca5a5}.delete-icon[data-v-92699cb2]{width:14px;height:14px}.left-toolbar[data-v-43b6f5f6]{box-sizing:border-box;-webkit-user-select:none;user-select:none;background:#fafbfc;border:1px solid #e5e7eb;border-radius:6px;flex-direction:column;flex:0 0 40px;align-items:center;gap:6px;padding:8px 5px;display:flex;box-shadow:0 1px 3px #0000000f}.left-toolbar__group[data-v-43b6f5f6]{flex-direction:column;gap:4px;display:flex}.left-toolbar__divider[data-v-43b6f5f6]{background:#e5e7eb;width:18px;height:1px}.left-toolbar__button[data-v-43b6f5f6]{color:#6b7280;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:4px;justify-content:center;align-items:center;width:28px;height:28px;padding:0;transition:border-color .15s,background .15s,color .15s;display:inline-flex;position:relative}.left-toolbar__button[data-v-43b6f5f6]:hover{color:#374151;background:#f3f4f6;border-color:#d1d5db}.left-toolbar__button.active[data-v-43b6f5f6]{color:#1f2937;background:#e5e7eb;border-color:#9ca3af}.left-toolbar__button[data-v-43b6f5f6]:focus-visible{border-color:#6b7280;outline:none}.tool-icon[data-v-43b6f5f6]{width:16px;height:16px}.corner-indicator[data-v-43b6f5f6]{cursor:pointer;width:8px;height:8px;position:absolute;bottom:0;right:0;overflow:hidden}.corner-indicator[data-v-43b6f5f6]:after{content:"";opacity:.45;border-bottom:5px solid;border-left:5px solid #0000;width:0;height:0;transition:opacity .15s;position:absolute;bottom:0;right:0}.left-toolbar__button:hover .corner-indicator[data-v-43b6f5f6]:after,.left-toolbar__button.active .corner-indicator[data-v-43b6f5f6]:after{opacity:.7}.corner-indicator.open[data-v-43b6f5f6]:after{opacity:.8}.tool-dropdown[data-v-43b6f5f6]{-webkit-backdrop-filter:blur(8px);box-sizing:border-box;z-index:100;background:#fafbfcd1;border:1px solid #e5e7eb;border-radius:6px;flex-direction:row;align-items:center;gap:4px;height:40px;padding:0 5px;display:flex;position:absolute;top:50%;left:calc(100% + 13px);transform:translateY(-50%);box-shadow:0 1px 3px #0000000f}.tool-item[data-v-43b6f5f6]{position:relative}.dropdown-enter-active[data-v-43b6f5f6],.dropdown-leave-active[data-v-43b6f5f6]{transition:opacity .15s,transform .15s}.dropdown-enter-from[data-v-43b6f5f6],.dropdown-leave-to[data-v-43b6f5f6]{opacity:0;transform:translateY(-50%)translate(-6px)}@media (width<=768px),(height<=640px){.left-toolbar[data-v-43b6f5f6]{border-radius:5px;flex-basis:36px;gap:5px;padding:6px 4px}.left-toolbar__group[data-v-43b6f5f6]{gap:3px}.left-toolbar__button[data-v-43b6f5f6]{border-radius:3px;width:26px;height:26px}.left-toolbar__divider[data-v-43b6f5f6]{width:16px}.corner-indicator[data-v-43b6f5f6]{width:7px;height:7px}.corner-indicator[data-v-43b6f5f6]:after{border-bottom-width:4px;border-left-width:4px}.tool-dropdown[data-v-43b6f5f6]{height:36px}}.settings-overlay[data-v-43b6f5f6]{-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}.settings-modal[data-v-43b6f5f6]{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}.settings-header[data-v-43b6f5f6]{background:#f8f8f8;border-bottom:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:16px 20px;display:flex}.header-left[data-v-43b6f5f6]{align-items:baseline;gap:8px;display:flex}.header-right[data-v-43b6f5f6]{align-items:center;gap:8px;display:flex}.settings-title[data-v-43b6f5f6]{color:#1a1a1a;letter-spacing:.2px;font-size:14px;font-weight:600}.settings-subtitle[data-v-43b6f5f6]{color:#999;font-size:11px}.settings-close[data-v-43b6f5f6]{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:background .15s,color .15s,border-color .15s;display:flex}.settings-close[data-v-43b6f5f6]:hover{color:#333;background:#f0f0f0;border-color:#ccc}.settings-close svg[data-v-43b6f5f6]{width:14px;height:14px}.settings-body[data-v-43b6f5f6]{flex-direction:column;gap:10px;padding:16px 20px;display:flex}.settings-item[data-v-43b6f5f6]{background:#f8f8f8;border:1px solid #e8e8e8;border-radius:8px;padding:8px 12px}.settings-label[data-v-43b6f5f6]{color:#333;cursor:pointer;justify-content:space-between;align-items:center;font-size:13px;display:flex}.settings-checkbox[data-v-43b6f5f6]{cursor:pointer;accent-color:#1a1a1a;width:16px;height:16px}.settings-section-divider[data-v-43b6f5f6]{align-items:center;gap:8px;margin-top:4px;display:flex}.settings-section-divider[data-v-43b6f5f6]:before,.settings-section-divider[data-v-43b6f5f6]:after{content:"";border-top:1px solid #e0e0e0;flex:1}.settings-section-label[data-v-43b6f5f6]{color:#999;white-space:nowrap;font-size:11px}.settings-item.experimental[data-v-43b6f5f6]{background:#fdf8f3;border-color:#f0e0d0}.settings-footer[data-v-43b6f5f6]{background:#f8f8f8;border-top:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:12px 20px;display:flex}.footer-right[data-v-43b6f5f6]{gap:8px;display:flex}.settings-btn[data-v-43b6f5f6]{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}.settings-btn svg[data-v-43b6f5f6]{flex-shrink:0;width:12px;height:12px}.settings-btn.reset[data-v-43b6f5f6]{color:#666;background:0 0;border-color:#d0d0d0}.settings-btn.reset[data-v-43b6f5f6]:hover{color:#e74c3c;background:#e74c3c14;border-color:#c0392b}.settings-btn.cancel[data-v-43b6f5f6]{color:#666;background:0 0;border-color:#d0d0d0}.settings-btn.cancel[data-v-43b6f5f6]:hover{color:#333;background:#f0f0f0;border-color:#bbb}.settings-btn.confirm[data-v-43b6f5f6]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.settings-btn.confirm[data-v-43b6f5f6]:hover{background:#333;border-color:#333;transform:translateY(-1px);box-shadow:0 2px 10px #00000026}.settings-btn.confirm[data-v-43b6f5f6]:active{box-shadow:none;transform:translateY(0)}.chart-wrapper[data-v-59c0bc54]{--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-stage[data-v-59c0bc54]{align-items:stretch;gap:8px;width:95%;height:85%;min-height:255px;display:flex}.chart-main[data-v-59c0bc54]{flex:auto;align-items:stretch;gap:0;min-width:0;height:100%;display:flex;position:relative}.pane-separator-layer[data-v-59c0bc54]{pointer-events:none;z-index:20;position:absolute;inset:0}.pane-separator-line[data-v-59c0bc54]{opacity:1;box-sizing:border-box;border-top:1px solid #e5e7eb;height:0;transition:border-top-color .12s,border-top-width .12s,margin-top .12s,opacity .12s;position:absolute;left:0;right:0}.pane-separator-line.is-active[data-v-59c0bc54]{border-top-width:2px;border-top-color:#3b82f6;margin-top:-1px}.chart-stage.is-resizing-pane[data-v-59c0bc54],.chart-stage.is-hovering-pane-separator[data-v-59c0bc54]{cursor:ns-resize}.chart-stage.is-hovering-kline[data-v-59c0bc54]{cursor:pointer}.chart-stage.is-hovering-right-axis[data-v-59c0bc54]{cursor:ns-resize}.chart-stage.is-dragging[data-v-59c0bc54]{cursor:grabbing}.chart-container[data-v-59c0bc54]{height:100%;min-height:inherit;scrollbar-width:none;-ms-overflow-style:none;box-sizing:border-box;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;touch-action:none;background:#fff;border:1px solid #e5e7eb;border-right:0;border-radius:6px 0 0 6px;flex:auto;position:relative;overflow:auto hidden}.chart-container[data-v-59c0bc54]::-webkit-scrollbar{display:none}.chart-container[data-v-59c0bc54]:hover{cursor:crosshair}.chart-stage.is-resizing-pane .chart-container[data-v-59c0bc54],.chart-stage.is-hovering-pane-separator .chart-container[data-v-59c0bc54]{cursor:ns-resize}.chart-stage.is-hovering-kline .chart-container[data-v-59c0bc54]{cursor:pointer}.chart-stage.is-dragging .chart-container[data-v-59c0bc54]{cursor:grabbing}.right-axis-host[data-v-59c0bc54]{height:100%;min-height:inherit;box-sizing:border-box;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;touch-action:none;background:#fff;border:1px solid #e5e7eb;border-top-right-radius:6px;border-bottom-right-radius:6px;flex:none;position:relative;overflow:visible}.scroll-content[data-v-59c0bc54]{height:100%;min-height:inherit;position:relative}.canvas-layer[data-v-59c0bc54]{pointer-events:none;position:sticky;top:0;left:0}.tooltip-layer[data-v-59c0bc54]{pointer-events:none;z-index:30;position:absolute;inset:0}.tooltip-anchor[data-v-59c0bc54]{pointer-events:none;width:1px;height:1px;position:absolute}.tooltip-anchor.kline-tooltip-anchor.use-anchor[data-v-59c0bc54]{anchor-name:--kline-tooltip-anchor}.tooltip-anchor.marker-tooltip-anchor.use-anchor[data-v-59c0bc54]{anchor-name:--marker-tooltip-anchor}@media (width<=768px),(height<=640px){.chart-stage[data-v-59c0bc54]{gap:6px}}.plot-canvas{display:block;position:absolute;top:0;left:0}.right-axis{display:block;position:absolute;left:0}.x-axis-canvas{z-index:10;display:block;position:absolute;bottom:0;left:0}.right-axis{z-index:15}
|
|
1
|
+
.kline-tooltip[data-v-d0fe85e6]{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-d0fe85e6]{justify-content:space-between;gap:10px;margin-bottom:6px;font-weight:600;display:flex}.kline-tooltip__grid[data-v-d0fe85e6]{grid-template-columns:1fr;gap:2px;display:grid}.kline-tooltip__grid .row[data-v-d0fe85e6]{justify-content:space-between;gap:10px;display:flex}.kline-tooltip__grid .row span[data-v-d0fe85e6]:first-child{color:#0000008f}@supports (anchor-name:--kmap-anchor) and (position-anchor:--kmap-anchor){.kline-tooltip.use-anchor[data-v-d0fe85e6]{position-anchor:--kline-tooltip-anchor;left:anchor(left);top:anchor(top);position:absolute}.kline-tooltip.use-anchor.anchor-right-bottom[data-v-d0fe85e6]{transform:translate(14px,14px)}.kline-tooltip.use-anchor.anchor-left-bottom[data-v-d0fe85e6]{transform:translate(calc(-100% - 14px),14px)}}.marker-tooltip[data-v-5574cc25]{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-5574cc25]{justify-content:space-between;gap:10px;margin-bottom:6px;font-weight:600;display:flex}.marker-tooltip__content[data-v-5574cc25]{grid-template-columns:1fr;gap:2px;display:grid}.marker-tooltip__content .row[data-v-5574cc25]{justify-content:space-between;gap:10px;display:flex}.marker-tooltip__content .row span[data-v-5574cc25]:first-child{color:#0000008f}@supports (anchor-name:--kmap-anchor) and (position-anchor:--kmap-anchor){.marker-tooltip.use-anchor[data-v-5574cc25]{position-anchor:--marker-tooltip-anchor;left:anchor(left);top:anchor(top);position:absolute}.marker-tooltip.use-anchor.anchor-right-bottom[data-v-5574cc25]{transform:translate(12px,12px)}.marker-tooltip.use-anchor.anchor-left-bottom[data-v-5574cc25]{transform:translate(calc(-100% - 12px),12px)}}.params-overlay[data-v-bb1d1eb3]{-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-bb1d1eb3]{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-bb1d1eb3]{background:#f8f8f8;border-bottom:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:16px 20px;display:flex}.header-left[data-v-bb1d1eb3]{align-items:baseline;gap:8px;display:flex}.header-right[data-v-bb1d1eb3]{align-items:center;gap:8px;display:flex}.params-title[data-v-bb1d1eb3]{color:#1a1a1a;letter-spacing:.2px;font-size:14px;font-weight:600}.params-subtitle[data-v-bb1d1eb3]{color:#999;font-size:11px}.toggle-desc-btn[data-v-bb1d1eb3]{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-bb1d1eb3]:hover{color:#555;background:#f0f0f0;border-color:#ccc}.toggle-desc-btn.active[data-v-bb1d1eb3]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.toggle-desc-btn svg[data-v-bb1d1eb3]{width:14px;height:14px}.params-close[data-v-bb1d1eb3]{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:background .15s,color .15s,border-color .15s;display:flex}.params-close[data-v-bb1d1eb3]:hover{color:#333;background:#f0f0f0;border-color:#ccc}.params-close svg[data-v-bb1d1eb3]{width:14px;height:14px}.indicator-description[data-v-bb1d1eb3]{background:#f0f7ff;border-bottom:1px solid #d6e8f5;padding:12px 20px}.indicator-description p[data-v-bb1d1eb3]{color:#2c5282;margin:0;font-size:12px;line-height:1.6}.params-body[data-v-bb1d1eb3]{flex-direction:column;gap:10px;padding:16px 20px;display:flex}.param-item[data-v-bb1d1eb3]{background:#f8f8f8;border:1px solid #e8e8e8;border-radius:8px;padding:10px 14px;transition:border-color .2s}.param-item[data-v-bb1d1eb3]:has(.param-input:focus){border-color:#bbb}.param-item.has-desc[data-v-bb1d1eb3]{padding:10px 14px 8px}.param-header[data-v-bb1d1eb3]{justify-content:space-between;align-items:center;gap:16px;display:flex}.param-label[data-v-bb1d1eb3]{flex-direction:column;gap:3px;display:flex}.param-label-text[data-v-bb1d1eb3]{color:#333;font-size:13px;font-weight:500}.param-range[data-v-bb1d1eb3]{color:#999;font-size:11px}.param-description[data-v-bb1d1eb3]{color:#666;border-top:1px dashed #e0e0e0;margin-top:8px;padding-top:8px;font-size:11px;line-height:1.5}.input-wrapper[data-v-bb1d1eb3]{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-bb1d1eb3]:focus-within{border-color:#999}.stepper-btn[data-v-bb1d1eb3]{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-bb1d1eb3]:hover:not(:disabled){color:#333;background:#e0e0e0}.stepper-btn[data-v-bb1d1eb3]:disabled{color:#ccc;cursor:not-allowed}.param-input[data-v-bb1d1eb3]{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-bb1d1eb3]::-webkit-inner-spin-button{-webkit-appearance:none}.param-input[data-v-bb1d1eb3]::-webkit-outer-spin-button{-webkit-appearance:none}.param-input[data-v-bb1d1eb3]:focus{outline:none}.params-footer[data-v-bb1d1eb3]{background:#f8f8f8;border-top:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:12px 20px;display:flex}.footer-right[data-v-bb1d1eb3]{gap:8px;display:flex}.params-btn[data-v-bb1d1eb3]{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-bb1d1eb3]{flex-shrink:0;width:12px;height:12px}.params-btn.reset[data-v-bb1d1eb3]{color:#666;background:0 0;border-color:#d0d0d0}.params-btn.reset[data-v-bb1d1eb3]:hover{color:#e74c3c;background:#e74c3c14;border-color:#c0392b}.params-btn.cancel[data-v-bb1d1eb3]{color:#666;background:0 0;border-color:#d0d0d0}.params-btn.cancel[data-v-bb1d1eb3]:hover{color:#333;background:#f0f0f0;border-color:#bbb}.params-btn.confirm[data-v-bb1d1eb3]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.params-btn.confirm[data-v-bb1d1eb3]:hover{background:#333;border-color:#333;transform:translateY(-1px);box-shadow:0 2px 10px #00000026}.params-btn.confirm[data-v-bb1d1eb3]:active{box-shadow:none;transform:translateY(0)}.overlay-enter-active[data-v-bb1d1eb3],.overlay-leave-active[data-v-bb1d1eb3]{transition:opacity .2s}.overlay-enter-from[data-v-bb1d1eb3],.overlay-leave-to[data-v-bb1d1eb3]{opacity:0}.modal-enter-active[data-v-bb1d1eb3]{transition:all .22s cubic-bezier(.34,1.56,.64,1)}.modal-leave-active[data-v-bb1d1eb3]{transition:all .16s ease-in}.modal-enter-from[data-v-bb1d1eb3]{opacity:0;transform:scale(.88)translateY(-16px)}.modal-leave-to[data-v-bb1d1eb3]{opacity:0;transform:scale(.94)translateY(8px)}.slide-enter-active[data-v-bb1d1eb3],.slide-leave-active[data-v-bb1d1eb3]{transition:all .2s;overflow:hidden}.slide-enter-from[data-v-bb1d1eb3],.slide-leave-to[data-v-bb1d1eb3]{opacity:0;max-height:0;margin-top:0;padding-top:0;padding-bottom:0}.indicator-selector[data-v-f3fbebbd]{width:80%;margin:20px;position:relative}.indicator-scroll-container[data-v-f3fbebbd]{scrollbar-width:none;-webkit-overflow-scrolling:touch;text-align:center;width:100%;overflow:auto hidden}.indicator-scroll-container[data-v-f3fbebbd]::-webkit-scrollbar{display:none}.indicator-list[data-v-f3fbebbd]{gap:8px;margin:0 auto;padding:2px;display:inline-flex}.indicator-divider[data-v-f3fbebbd]{background:#d9d9d9;align-self:center;width:1px;height:20px}.indicator-item[data-v-f3fbebbd]{align-items:center;gap:4px;display:flex}.indicator-item.draggable[data-v-f3fbebbd],.indicator-item.draggable .indicator-btn[data-v-f3fbebbd],.indicator-item.draggable[data-v-f3fbebbd]:hover,.indicator-item.draggable:hover .indicator-btn[data-v-f3fbebbd]{cursor:move}.indicator-item.is-dragging[data-v-f3fbebbd]{opacity:.6}.indicator-item.drag-over .indicator-btn[data-v-f3fbebbd]{border-color:#1a1a1a;box-shadow:0 0 0 2px #1a1a1a1f}.indicator-btn-wrapper[data-v-f3fbebbd]{position:relative}.indicator-btn[data-v-f3fbebbd]{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-f3fbebbd]:hover:not(.hovering){color:#333;background:#f8f8f8;border-color:#ccc}.indicator-btn.active[data-v-f3fbebbd]{color:#1a1a1a;background:#f8f8f8;border-color:#1a1a1a}.indicator-btn.active[data-v-f3fbebbd]:hover:not(.hovering){background:#f0f0f0;border-color:#333}.btn-content[data-v-f3fbebbd]{z-index:1;position:relative}.param-hint[data-v-f3fbebbd]{opacity:.85;font-size:11px}.hover-overlay[data-v-f3fbebbd]{-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-f3fbebbd]{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-f3fbebbd]:hover{color:#333;background:#0000000f}.settings-btn[data-v-f3fbebbd]:hover{color:#1a1a1a}.remove-btn[data-v-f3fbebbd]:hover{color:#ff4d4f}.divider[data-v-f3fbebbd]{background:#e0e0e0;width:1px;height:14px}.add-btn[data-v-f3fbebbd]{anchor-name:--indicator-add-btn;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-f3fbebbd]:hover{color:#1a1a1a;background:#1a1a1a0a;border-color:#1a1a1a}.add-menu[data-v-f3fbebbd]{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}@supports (anchor-name:--kmap-anchor) and (position-anchor:--kmap-anchor){.add-menu.use-anchor[data-v-f3fbebbd]{position-anchor:--indicator-add-btn;left:anchor(center);top:anchor(top);max-width:calc(100vw - 16px);position:fixed;transform:translate(-50%,calc(-100% - 8px))}}.menu-section[data-v-f3fbebbd]{padding:4px 0}.menu-section[data-v-f3fbebbd]:not(:last-child){border-bottom:1px solid #f0f0f0}.menu-title[data-v-f3fbebbd]{color:#999;padding:4px 16px;font-size:12px;font-weight:500}.menu-items[data-v-f3fbebbd]{flex-direction:column;gap:2px;display:flex}.menu-item[data-v-f3fbebbd]{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-f3fbebbd]:hover:not(.disabled){background:#f5f5f5}.menu-item.disabled[data-v-f3fbebbd]{color:#999;cursor:not-allowed}.menu-item .param-hint[data-v-f3fbebbd]{color:#999;font-size:11px}.active-tag[data-v-f3fbebbd]{color:#1a1a1a;align-items:center;margin-left:auto;display:flex}.fade-enter-active[data-v-f3fbebbd],.fade-leave-active[data-v-f3fbebbd]{transition:opacity .2s}.fade-enter-from[data-v-f3fbebbd],.fade-leave-to[data-v-f3fbebbd]{opacity:0}.slide-enter-active[data-v-f3fbebbd],.slide-leave-active[data-v-f3fbebbd]{transition:all .2s}.slide-enter-from[data-v-f3fbebbd],.slide-leave-to[data-v-f3fbebbd]{opacity:0;transform:translate(-50%)translateY(8px)}.drawing-style-toolbar[data-v-92699cb2]{-webkit-backdrop-filter:blur(8px);z-index:100;-webkit-user-select:none;user-select:none;pointer-events:auto;background:#fafbfce0;border:1px solid #e5e7eb;border-radius:6px;align-items:center;gap:6px;height:32px;padding:4px 8px;display:flex;position:absolute;top:8px;left:50%;transform:translate(-50%);box-shadow:0 1px 3px #0000000f}.toolbar-item[data-v-92699cb2]{justify-content:center;align-items:center;display:inline-flex}.color-item[data-v-92699cb2]{width:24px;height:24px;position:relative}.color-swatch[data-v-92699cb2]{cursor:pointer;border:1px solid #d1d5db;border-radius:4px;width:100%;height:100%;display:block}.color-input[data-v-92699cb2]{opacity:0;cursor:pointer;width:100%;height:100%;position:absolute;inset:0}.toolbar-select[data-v-92699cb2]{color:#374151;cursor:pointer;background:#fff;border:1px solid #d1d5db;border-radius:4px;outline:none;height:24px;padding:0 4px;font-size:12px}.toolbar-select[data-v-92699cb2]:hover{border-color:#9ca3af}.toolbar-btn[data-v-92699cb2]{color:#6b7280;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:4px;justify-content:center;align-items:center;width:24px;height:24px;padding:0;transition:border-color .15s,background .15s,color .15s;display:inline-flex}.toolbar-btn[data-v-92699cb2]:hover{color:#374151;background:#f3f4f6;border-color:#d1d5db}.delete-btn[data-v-92699cb2]:hover{color:#dc2626;background:#fef2f2;border-color:#fca5a5}.delete-icon[data-v-92699cb2]{width:14px;height:14px}.left-toolbar[data-v-f47a57b0]{box-sizing:border-box;-webkit-user-select:none;user-select:none;background:#fafbfc;border:1px solid #e5e7eb;border-radius:6px;flex-direction:column;flex:0 0 40px;align-items:center;gap:6px;padding:8px 5px;display:flex;box-shadow:0 1px 3px #0000000f}.left-toolbar__group[data-v-f47a57b0]{flex-direction:column;gap:4px;display:flex}.left-toolbar__divider[data-v-f47a57b0]{background:#e5e7eb;width:18px;height:1px}.left-toolbar__button[data-v-f47a57b0]{color:#6b7280;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:4px;justify-content:center;align-items:center;width:28px;height:28px;padding:0;transition:border-color .15s,background .15s,color .15s;display:inline-flex;position:relative}.left-toolbar__button[data-v-f47a57b0]:hover{color:#374151;background:#f3f4f6;border-color:#d1d5db}.left-toolbar__button.active[data-v-f47a57b0]{color:#1f2937;background:#e5e7eb;border-color:#9ca3af}.left-toolbar__button[data-v-f47a57b0]:focus-visible{border-color:#6b7280;outline:none}.tool-icon[data-v-f47a57b0]{width:16px;height:16px}.corner-indicator[data-v-f47a57b0]{cursor:pointer;width:8px;height:8px;position:absolute;bottom:0;right:0;overflow:hidden}.corner-indicator[data-v-f47a57b0]:after{content:"";opacity:.45;border-bottom:5px solid;border-left:5px solid #0000;width:0;height:0;transition:opacity .15s;position:absolute;bottom:0;right:0}.left-toolbar__button:hover .corner-indicator[data-v-f47a57b0]:after,.left-toolbar__button.active .corner-indicator[data-v-f47a57b0]:after{opacity:.7}.corner-indicator.open[data-v-f47a57b0]:after{opacity:.8}.tool-dropdown[data-v-f47a57b0]{-webkit-backdrop-filter:blur(8px);box-sizing:border-box;z-index:100;background:#fafbfcd1;border:1px solid #e5e7eb;border-radius:6px;flex-direction:row;align-items:center;gap:4px;height:40px;padding:0 5px;display:flex;position:absolute;top:50%;left:calc(100% + 13px);transform:translateY(-50%);box-shadow:0 1px 3px #0000000f}.tool-item[data-v-f47a57b0]{position:relative}.dropdown-enter-active[data-v-f47a57b0],.dropdown-leave-active[data-v-f47a57b0]{transition:opacity .15s,transform .15s}.dropdown-enter-from[data-v-f47a57b0],.dropdown-leave-to[data-v-f47a57b0]{opacity:0;transform:translateY(-50%)translate(-6px)}@media (width<=768px),(height<=640px){.left-toolbar[data-v-f47a57b0]{border-radius:5px;flex-basis:36px;gap:5px;padding:6px 4px}.left-toolbar__group[data-v-f47a57b0]{gap:3px}.left-toolbar__button[data-v-f47a57b0]{border-radius:3px;width:26px;height:26px}.left-toolbar__divider[data-v-f47a57b0]{width:16px}.corner-indicator[data-v-f47a57b0]{width:7px;height:7px}.corner-indicator[data-v-f47a57b0]:after{border-bottom-width:4px;border-left-width:4px}.tool-dropdown[data-v-f47a57b0]{height:36px}}.settings-overlay[data-v-f47a57b0]{-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}.settings-modal[data-v-f47a57b0]{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}.settings-header[data-v-f47a57b0]{background:#f8f8f8;border-bottom:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:16px 20px;display:flex}.header-left[data-v-f47a57b0]{align-items:baseline;gap:8px;display:flex}.header-right[data-v-f47a57b0]{align-items:center;gap:8px;display:flex}.settings-title[data-v-f47a57b0]{color:#1a1a1a;letter-spacing:.2px;font-size:14px;font-weight:600}.settings-subtitle[data-v-f47a57b0]{color:#999;font-size:11px}.settings-close[data-v-f47a57b0]{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:background .15s,color .15s,border-color .15s;display:flex}.settings-close[data-v-f47a57b0]:hover{color:#333;background:#f0f0f0;border-color:#ccc}.settings-close svg[data-v-f47a57b0]{width:14px;height:14px}.settings-body[data-v-f47a57b0]{flex-direction:column;gap:10px;padding:16px 20px;display:flex}.settings-item[data-v-f47a57b0]{background:#f8f8f8;border:1px solid #e8e8e8;border-radius:8px;padding:8px 12px}.settings-label[data-v-f47a57b0]{color:#333;cursor:pointer;justify-content:space-between;align-items:center;font-size:13px;display:flex}.settings-checkbox[data-v-f47a57b0]{cursor:pointer;accent-color:#1a1a1a;width:16px;height:16px}.settings-section-divider[data-v-f47a57b0]{align-items:center;gap:8px;margin-top:4px;display:flex}.settings-section-divider[data-v-f47a57b0]:before,.settings-section-divider[data-v-f47a57b0]:after{content:"";border-top:1px solid #e0e0e0;flex:1}.settings-section-label[data-v-f47a57b0]{color:#999;white-space:nowrap;font-size:11px}.settings-item.experimental[data-v-f47a57b0]{background:#fdf8f3;border-color:#f0e0d0}.settings-footer[data-v-f47a57b0]{background:#f8f8f8;border-top:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:12px 20px;display:flex}.footer-right[data-v-f47a57b0]{gap:8px;display:flex}.settings-btn[data-v-f47a57b0]{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}.settings-btn svg[data-v-f47a57b0]{flex-shrink:0;width:12px;height:12px}.settings-btn.reset[data-v-f47a57b0]{color:#666;background:0 0;border-color:#d0d0d0}.settings-btn.reset[data-v-f47a57b0]:hover{color:#e74c3c;background:#e74c3c14;border-color:#c0392b}.settings-btn.cancel[data-v-f47a57b0]{color:#666;background:0 0;border-color:#d0d0d0}.settings-btn.cancel[data-v-f47a57b0]:hover{color:#333;background:#f0f0f0;border-color:#bbb}.settings-btn.confirm[data-v-f47a57b0]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.settings-btn.confirm[data-v-f47a57b0]:hover{background:#333;border-color:#333;transform:translateY(-1px);box-shadow:0 2px 10px #00000026}.settings-btn.confirm[data-v-f47a57b0]:active{box-shadow:none;transform:translateY(0)}.chart-wrapper[data-v-b9893341]{--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-stage[data-v-b9893341]{align-items:stretch;gap:8px;width:95%;height:85%;min-height:255px;display:flex}.chart-main[data-v-b9893341]{flex:auto;align-items:stretch;gap:0;min-width:0;height:100%;display:flex;position:relative}.pane-separator-layer[data-v-b9893341]{pointer-events:none;z-index:20;position:absolute;inset:0}.pane-separator-line[data-v-b9893341]{opacity:1;box-sizing:border-box;border-top:1px solid #e5e7eb;height:0;transition:border-top-color .12s,border-top-width .12s,margin-top .12s,opacity .12s;position:absolute;left:0;right:0}.pane-separator-line.is-active[data-v-b9893341]{border-top-width:2px;border-top-color:#3b82f6;margin-top:-1px}.chart-stage.is-resizing-pane[data-v-b9893341],.chart-stage.is-hovering-pane-separator[data-v-b9893341]{cursor:ns-resize}.chart-stage.is-hovering-kline[data-v-b9893341]{cursor:pointer}.chart-stage.is-hovering-right-axis[data-v-b9893341]{cursor:ns-resize}.chart-stage.is-dragging[data-v-b9893341]{cursor:grabbing}.chart-container[data-v-b9893341]{height:100%;min-height:inherit;scrollbar-width:none;-ms-overflow-style:none;box-sizing:border-box;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;touch-action:none;background:#fff;border:1px solid #e5e7eb;border-right:0;border-radius:6px 0 0 6px;flex:auto;position:relative;overflow:auto hidden}.chart-container[data-v-b9893341]::-webkit-scrollbar{display:none}.chart-container[data-v-b9893341]:hover{cursor:crosshair}.chart-stage.is-resizing-pane .chart-container[data-v-b9893341],.chart-stage.is-hovering-pane-separator .chart-container[data-v-b9893341]{cursor:ns-resize}.chart-stage.is-hovering-kline .chart-container[data-v-b9893341]{cursor:pointer}.chart-stage.is-dragging .chart-container[data-v-b9893341]{cursor:grabbing}.right-axis-host[data-v-b9893341]{height:100%;min-height:inherit;box-sizing:border-box;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;touch-action:none;background:#fff;border:1px solid #e5e7eb;border-top-right-radius:6px;border-bottom-right-radius:6px;flex:none;position:relative;overflow:visible}.scroll-content[data-v-b9893341]{height:100%;min-height:inherit;position:relative}.canvas-layer[data-v-b9893341]{pointer-events:none;position:sticky;top:0;left:0}.tooltip-layer[data-v-b9893341]{pointer-events:none;z-index:30;position:absolute;inset:0}.tooltip-anchor[data-v-b9893341]{pointer-events:none;width:1px;height:1px;position:absolute}.tooltip-anchor.kline-tooltip-anchor.use-anchor[data-v-b9893341]{anchor-name:--kline-tooltip-anchor}.tooltip-anchor.marker-tooltip-anchor.use-anchor[data-v-b9893341]{anchor-name:--marker-tooltip-anchor}@media (width<=768px),(height<=640px){.chart-stage[data-v-b9893341]{gap:6px}}.plot-canvas{display:block;position:absolute;top:0;left:0}.right-axis{display:block;position:absolute;left:0}.x-axis-canvas{z-index:10;display:block;position:absolute;bottom:0;left:0}.right-axis{z-index:15}
|
|
2
2
|
/*$vite$:1*/
|