@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.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-0f3a76b5"]]), Gs = {
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 = { ...e };
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), this.dragStartY = e.clientY);
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, this.settings = {};
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 h = e === X.Main || e === X.All, g = e === X.Overlay || e === X.All;
12729
- if (h && 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)), g && s) {
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
- }, v = this.rendererPluginManager.render(r.id, _, e);
12767
- v.length > 0 && this.pluginHost.events.emit("renderer:error", {
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: v
12929
+ errors: b
12770
12930
  });
12771
12931
  }
12772
- let h = this.dom.xAxisCanvas.getContext("2d");
12773
- if (h) {
12932
+ let g = this.dom.xAxisCanvas.getContext("2d");
12933
+ if (g) {
12774
12934
  let e = {
12775
- ctx: h,
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: h,
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-43b6f5f6"]]), Qd = { class: "chart-wrapper" }, $d = {
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.indicators?.main;
15113
- if (e) for (let t of e) t.enabled && (V.value.includes(t.type) || V.value.push(t.type), t.params && (Ue.value[t.type] = t.params));
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
- } }), t.setRendererEnabled("ma", e.includes("MA")), t.getIndicatorScheduler().updateMAConfig({
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
- if (e === "MA" || e === "BOLL" || e === "EXPMA" || e === "ENE") {
15191
- t ? V.value.includes(e) || V.value.push(e) : V.value = V.value.filter((t) => t !== e);
15192
- return;
15193
- }
15194
- if (Ge.includes(e)) {
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 rt(e, t) {
15368
+ function nt(e, t) {
15226
15369
  if (Ue.value[e] = t, e === "MA" || e === "BOLL" || e === "EXPMA" || e === "ENE") {
15227
- e === "BOLL" && j.value?.getIndicatorScheduler().updateBOLLConfig(t), e === "EXPMA" && j.value?.getIndicatorScheduler().updateEXPMAConfig(t), e === "ENE" && j.value?.getIndicatorScheduler().updateENEConfig(t), nt(), L();
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 it(e) {
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 at = r(() => d.rightAxisWidth + d.priceLabelWidth), ot = N.computed.totalWidth;
15296
- function st() {
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 ct(e, t) {
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: st,
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: ct,
15331
- zoomIn: (e) => ct(ee.value + 1, e),
15332
- zoomOut: (e) => ct(ee.value - 1, 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(() => st());
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) => ct(ee.value + 1),
15530
- onZoomOut: c[2] ||= (e) => ct(ee.value - 1),
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(ot) + "px" })
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: at.value + "px" }),
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: rt,
15633
- onReorderSubIndicators: it
15775
+ onUpdateParams: nt,
15776
+ onReorderSubIndicators: rt
15634
15777
  }, null, 8, ["active-indicators", "indicator-params"])]));
15635
15778
  }
15636
- }), [["__scopeId", "data-v-59c0bc54"]]), nf = { install(e) {
15779
+ }), [["__scopeId", "data-v-b9893341"]]), nf = { install(e) {
15637
15780
  e.component("KLineChart", tf);
15638
15781
  } };
15639
15782
  //#endregion
@@ -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*/