kline-charts-react 0.0.2 → 0.0.3

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.
@@ -1 +1 @@
1
- ._container_119o2_1{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;min-height:200px;gap:12px}._spinner_119o2_11{display:flex;gap:6px}._dot_119o2_16{width:8px;height:8px;background-color:#1890ff;border-radius:50%;animation:_bounce_119o2_1 .6s infinite alternate}._dot_119o2_16:nth-child(2){animation-delay:.2s}._dot_119o2_16:nth-child(3){animation-delay:.4s}@keyframes _bounce_119o2_1{0%{transform:translateY(0);opacity:.4}to{transform:translateY(-10px);opacity:1}}._text_119o2_43{color:#999;font-size:13px}._container_1xu4v_1{display:flex;align-items:center;gap:16px;padding:8px 12px;border-bottom:1px solid var(--kline-border-color, #e8e8e8);background:var(--kline-bg-color, #fff)}._group_1xu4v_10{display:flex;gap:4px}._button_1xu4v_15{padding:4px 10px;font-size:13px;color:var(--kline-text-color, #333);background:transparent;border:none;border-radius:4px;cursor:pointer;transition:all .2s}._button_1xu4v_15:hover{background:var(--kline-hover-bg, #f5f5f5)}._button_1xu4v_15._active_1xu4v_30{color:#fff;background:var(--kline-active-color, #1890ff)}._container_1fbmi_1{display:flex;align-items:center;gap:8px;padding:8px 12px;border-top:1px solid var(--kline-border-color, #e8e8e8);background:var(--kline-bg-color, #fff);flex-wrap:wrap}._button_1fbmi_11{padding:4px 12px;font-size:12px;color:var(--kline-text-secondary, #666);background:var(--kline-tag-bg, #f0f0f0);border:1px solid transparent;border-radius:4px;cursor:pointer;transition:all .2s}._button_1fbmi_11:hover{border-color:var(--kline-active-color, #1890ff);color:var(--kline-active-color, #1890ff)}._button_1fbmi_11._active_1fbmi_27{color:var(--kline-active-color, #1890ff);background:#1890ff1a;border-color:var(--kline-active-color, #1890ff)}._divider_1fbmi_33{width:1px;height:20px;background:var(--kline-border-color, #e8e8e8);margin:0 4px}._container_2tswg_1{display:flex;align-items:center;gap:4px;padding:6px 12px;background:var(--kline-bg-color, #fff);border-bottom:1px solid var(--kline-border-color, #e8e8e8)}._group_2tswg_10{display:flex;align-items:center;gap:2px}._divider_2tswg_16{width:1px;height:16px;margin:0 8px;background:var(--kline-border-color, #e8e8e8)}._spacer_2tswg_23{flex:1}._iconButton_2tswg_27{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;color:var(--kline-text-color, #333);background:transparent;border:none;border-radius:4px;cursor:pointer;transition:all .2s}._iconButton_2tswg_27:hover:not(:disabled){background:var(--kline-hover-bg, #f5f5f5)}._iconButton_2tswg_27:disabled{color:var(--kline-text-disabled, #ccc);cursor:not-allowed}._textButton_2tswg_51{padding:4px 8px;font-size:12px;color:var(--kline-text-secondary, #666);background:transparent;border:none;border-radius:4px;cursor:pointer;transition:all .2s}._textButton_2tswg_51:hover{background:var(--kline-hover-bg, #f5f5f5);color:var(--kline-text-color, #333)}._textButton_2tswg_51._active_2tswg_67{color:var(--kline-active-color, #1890ff);background:#1890ff1a}._container_1vdme_1{display:flex;align-items:center;gap:16px;padding:4px 8px;font-size:12px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;flex-wrap:wrap}._group_1vdme_11{display:flex;align-items:center;gap:12px;flex-wrap:wrap}._item_1vdme_18{font-weight:500;white-space:nowrap}._title_p093j_1{position:absolute;left:8px;z-index:10;display:flex;align-items:center;gap:8px;font-size:11px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;pointer-events:none;background:var(--kline-bg-color, rgba(255, 255, 255, .9));padding:2px 6px;border-radius:2px}._label_p093j_16{font-weight:600;color:var(--kline-text-color, #333)}._value_p093j_21{color:var(--kline-text-secondary, #666)}._container_o8wlo_1{display:flex;flex-direction:column;background:var(--kline-bg-color, #fff);border:1px solid var(--kline-border-color, #e8e8e8);border-radius:4px;overflow:hidden;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif}._fullscreen_o8wlo_12{position:fixed;top:0;left:0;right:0;bottom:0;z-index:9999;border-radius:0;border:none}._chartWrapper_o8wlo_23{flex:1;position:relative;min-height:200px}._chart_o8wlo_23{width:100%;height:100%}._error_o8wlo_34{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);display:flex;flex-direction:column;align-items:center;gap:12px;color:var(--kline-text-secondary, #999);font-size:14px}._error_o8wlo_34 button{padding:6px 16px;font-size:13px;color:#fff;background:var(--kline-active-color, #1890ff);border:none;border-radius:4px;cursor:pointer;transition:opacity .2s}._error_o8wlo_34 button:hover{opacity:.85}._timelineToolbar_o8wlo_63{display:flex;align-items:center;gap:12px;padding:8px 12px;border-bottom:1px solid var(--kline-border-color, #e8e8e8)}._timelineLabel_o8wlo_71{font-size:14px;font-weight:500;color:var(--kline-text-color, #333)}._refreshButton_o8wlo_77,._fullscreenButton_o8wlo_78{padding:4px 12px;font-size:12px;color:var(--kline-text-color, #333);background:var(--kline-tag-bg, #f0f0f0);border:1px solid var(--kline-border-color, #e8e8e8);border-radius:4px;cursor:pointer;transition:all .2s}._refreshButton_o8wlo_77:hover,._fullscreenButton_o8wlo_78:hover{background:var(--kline-hover-bg, #f5f5f5)}._refreshButton_o8wlo_77:disabled{opacity:.5;cursor:not-allowed}._refreshButton_o8wlo_77:not(:disabled):hover{border-color:var(--kline-active-color, #1890ff);color:var(--kline-active-color, #1890ff)}._fullscreenButton_o8wlo_78:hover{border-color:var(--kline-active-color, #1890ff);color:var(--kline-active-color, #1890ff)}:root{--kline-bg-color: #ffffff;--kline-text-color: #333333;--kline-text-secondary: #999999;--kline-border-color: #e8e8e8;--kline-active-color: #1890ff;--kline-hover-bg: #f5f5f5;--kline-tag-bg: #f0f0f0;--kline-text-disabled: #cccccc;--kline-up-color: #f5222d;--kline-down-color: #52c41a}.kline-dark{--kline-bg-color: #1a1a1a;--kline-text-color: #d1d1d1;--kline-text-secondary: #666666;--kline-border-color: #333333;--kline-hover-bg: #2a2a2a;--kline-tag-bg: #2a2a2a;--kline-text-disabled: #444444}
1
+ ._container_119o2_1{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;min-height:200px;gap:12px}._spinner_119o2_11{display:flex;gap:6px}._dot_119o2_16{width:8px;height:8px;background-color:#1890ff;border-radius:50%;animation:_bounce_119o2_1 .6s infinite alternate}._dot_119o2_16:nth-child(2){animation-delay:.2s}._dot_119o2_16:nth-child(3){animation-delay:.4s}@keyframes _bounce_119o2_1{0%{transform:translateY(0);opacity:.4}to{transform:translateY(-10px);opacity:1}}._text_119o2_43{color:#999;font-size:13px}._container_1xu4v_1{display:flex;align-items:center;gap:16px;padding:8px 12px;border-bottom:1px solid var(--kline-border-color, #e8e8e8);background:var(--kline-bg-color, #fff)}._group_1xu4v_10{display:flex;gap:4px}._button_1xu4v_15{padding:4px 10px;font-size:13px;color:var(--kline-text-color, #333);background:transparent;border:none;border-radius:4px;cursor:pointer;transition:all .2s}._button_1xu4v_15:hover{background:var(--kline-hover-bg, #f5f5f5)}._button_1xu4v_15._active_1xu4v_30{color:#fff;background:var(--kline-active-color, #1890ff)}._container_1fbmi_1{display:flex;align-items:center;gap:8px;padding:8px 12px;border-top:1px solid var(--kline-border-color, #e8e8e8);background:var(--kline-bg-color, #fff);flex-wrap:wrap}._button_1fbmi_11{padding:4px 12px;font-size:12px;color:var(--kline-text-secondary, #666);background:var(--kline-tag-bg, #f0f0f0);border:1px solid transparent;border-radius:4px;cursor:pointer;transition:all .2s}._button_1fbmi_11:hover{border-color:var(--kline-active-color, #1890ff);color:var(--kline-active-color, #1890ff)}._button_1fbmi_11._active_1fbmi_27{color:var(--kline-active-color, #1890ff);background:#1890ff1a;border-color:var(--kline-active-color, #1890ff)}._divider_1fbmi_33{width:1px;height:20px;background:var(--kline-border-color, #e8e8e8);margin:0 4px}._container_2tswg_1{display:flex;align-items:center;gap:4px;padding:6px 12px;background:var(--kline-bg-color, #fff);border-bottom:1px solid var(--kline-border-color, #e8e8e8)}._group_2tswg_10{display:flex;align-items:center;gap:2px}._divider_2tswg_16{width:1px;height:16px;margin:0 8px;background:var(--kline-border-color, #e8e8e8)}._spacer_2tswg_23{flex:1}._iconButton_2tswg_27{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;color:var(--kline-text-color, #333);background:transparent;border:none;border-radius:4px;cursor:pointer;transition:all .2s}._iconButton_2tswg_27:hover:not(:disabled){background:var(--kline-hover-bg, #f5f5f5)}._iconButton_2tswg_27:disabled{color:var(--kline-text-disabled, #ccc);cursor:not-allowed}._textButton_2tswg_51{padding:4px 8px;font-size:12px;color:var(--kline-text-secondary, #666);background:transparent;border:none;border-radius:4px;cursor:pointer;transition:all .2s}._textButton_2tswg_51:hover{background:var(--kline-hover-bg, #f5f5f5);color:var(--kline-text-color, #333)}._textButton_2tswg_51._active_2tswg_67{color:var(--kline-active-color, #1890ff);background:#1890ff1a}._container_1vdme_1{display:flex;align-items:center;gap:16px;padding:4px 8px;font-size:12px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;flex-wrap:wrap}._group_1vdme_11{display:flex;align-items:center;gap:12px;flex-wrap:wrap}._item_1vdme_18{font-weight:500;white-space:nowrap}._title_p093j_1{position:absolute;left:8px;z-index:10;display:flex;align-items:center;gap:8px;font-size:11px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;pointer-events:none;background:var(--kline-bg-color, rgba(255, 255, 255, .9));padding:2px 6px;border-radius:2px}._label_p093j_16{font-weight:600;color:var(--kline-text-color, #333)}._value_p093j_21{color:var(--kline-text-secondary, #666)}._container_o8wlo_1{display:flex;flex-direction:column;background:var(--kline-bg-color, #fff);border:1px solid var(--kline-border-color, #e8e8e8);border-radius:4px;overflow:hidden;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif}._fullscreen_o8wlo_12{position:fixed;top:0;left:0;right:0;bottom:0;z-index:9999;border-radius:0;border:none}._chartWrapper_o8wlo_23{flex:1;position:relative;min-height:200px}._chart_o8wlo_23{width:100%;height:100%}._error_o8wlo_34{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);display:flex;flex-direction:column;align-items:center;gap:12px;color:var(--kline-text-secondary, #999);font-size:14px}._error_o8wlo_34 button{padding:6px 16px;font-size:13px;color:#fff;background:var(--kline-active-color, #1890ff);border:none;border-radius:4px;cursor:pointer;transition:opacity .2s}._error_o8wlo_34 button:hover{opacity:.85}._timelineToolbar_o8wlo_63{display:flex;align-items:center;gap:12px;padding:8px 12px;border-bottom:1px solid var(--kline-border-color, #e8e8e8)}._timelineLabel_o8wlo_71{font-size:14px;font-weight:500;color:var(--kline-text-color, #333)}._refreshButton_o8wlo_77,._fullscreenButton_o8wlo_78{padding:4px 12px;font-size:12px;color:var(--kline-text-color, #333);background:var(--kline-tag-bg, #f0f0f0);border:1px solid var(--kline-border-color, #e8e8e8);border-radius:4px;cursor:pointer;transition:all .2s}._refreshButton_o8wlo_77:hover,._fullscreenButton_o8wlo_78:hover{background:var(--kline-hover-bg, #f5f5f5)}._refreshButton_o8wlo_77:disabled{opacity:.5;cursor:not-allowed}._refreshButton_o8wlo_77:not(:disabled):hover{border-color:var(--kline-active-color, #1890ff);color:var(--kline-active-color, #1890ff)}._fullscreenButton_o8wlo_78:hover{border-color:var(--kline-active-color, #1890ff);color:var(--kline-active-color, #1890ff)}:root{--kline-bg-color: #ffffff;--kline-text-color: #333333;--kline-text-secondary: #999999;--kline-border-color: #e8e8e8;--kline-active-color: #1890ff;--kline-hover-bg: #f5f5f5;--kline-tag-bg: #f0f0f0;--kline-text-disabled: #cccccc;--kline-up-color: #f5222d;--kline-down-color: #52c41a}.kline-dark{--kline-bg-color: #1a1a1a;--kline-text-color: #d1d1d1;--kline-text-secondary: #666666;--kline-border-color: #333333;--kline-hover-bg: #2a2a2a;--kline-tag-bg: #2a2a2a;--kline-text-disabled: #444444}._container_1906n_1{display:flex;align-items:center;gap:12px;padding:4px 8px;font-size:12px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;flex-wrap:wrap}._item_1906n_11{font-weight:500;white-space:nowrap}
@@ -1,5 +1,7 @@
1
1
  import { CSSProperties } from 'react';
2
2
  import { EChartsOption } from 'echarts';
3
+ import { EChartsType } from 'echarts/core';
4
+ import { RequestClientOptions } from 'stock-sdk';
3
5
  import { KlineData, TimelineData } from './data';
4
6
  import { ThemeConfig } from './theme';
5
7
  /**
@@ -173,15 +175,6 @@ export interface AutoRefreshOptions {
173
175
  intervalMs?: number;
174
176
  onlyTradingTime?: boolean;
175
177
  }
176
- /**
177
- * 时间轴配置
178
- */
179
- export type TimeAxisOptions = {
180
- mode: 'trading';
181
- sessionCompression?: boolean;
182
- } | {
183
- mode: 'continuous';
184
- };
185
178
  /**
186
179
  * ECharts Option 合并配置
187
180
  */
@@ -189,6 +182,13 @@ export interface EChartsOptionMergeOptions {
189
182
  mode?: 'safeMerge' | 'replace';
190
183
  replaceMerge?: string[];
191
184
  }
185
+ /**
186
+ * 当前可见范围
187
+ */
188
+ export interface VisibleRange {
189
+ start: number;
190
+ end: number;
191
+ }
192
192
  /**
193
193
  * 面板配置
194
194
  */
@@ -197,14 +197,7 @@ export interface PaneConfig {
197
197
  height?: number | string;
198
198
  indicators: IndicatorType[];
199
199
  }
200
- /**
201
- * SDK 配置
202
- */
203
- export interface SDKOptions {
204
- baseUrl?: string;
205
- timeout?: number;
206
- headers?: Record<string, string>;
207
- }
200
+ export type SDKOptions = RequestClientOptions;
208
201
  /**
209
202
  * KLineChart 组件 Props
210
203
  */
@@ -213,18 +206,24 @@ export interface KLineChartProps {
213
206
  symbol: string;
214
207
  /** 市场类型 */
215
208
  market?: MarketType;
216
- /** K 线周期 */
209
+ /** K 线周期(受控) */
217
210
  period?: PeriodType;
218
- /** 复权类型 */
211
+ /** 非受控模式下的默认周期 */
212
+ defaultPeriod?: PeriodType;
213
+ /** 复权类型(受控) */
219
214
  adjust?: AdjustType;
215
+ /** 非受控模式下的默认复权类型 */
216
+ defaultAdjust?: AdjustType;
220
217
  /** 图表高度 */
221
218
  height?: number | string;
222
219
  /** 图表宽度 */
223
220
  width?: number | string;
224
221
  /** 主题 */
225
222
  theme?: 'light' | 'dark' | ThemeConfig;
226
- /** 启用的技术指标 */
223
+ /** 启用的技术指标(受控) */
227
224
  indicators?: IndicatorType[];
225
+ /** 非受控模式下默认启用的技术指标 */
226
+ defaultIndicators?: IndicatorType[];
228
227
  /** 指标参数配置 */
229
228
  indicatorOptions?: IndicatorOptions;
230
229
  /** 是否显示工具栏 */
@@ -241,6 +240,12 @@ export interface KLineChartProps {
241
240
  onDataLoad?: (data: KlineData[]) => void;
242
241
  /** 周期切换回调 */
243
242
  onPeriodChange?: (period: PeriodType) => void;
243
+ /** 复权切换回调 */
244
+ onAdjustChange?: (adjust: AdjustType) => void;
245
+ /** 指标切换回调 */
246
+ onIndicatorsChange?: (indicators: IndicatorType[]) => void;
247
+ /** 可见范围变化回调 */
248
+ onVisibleRangeChange?: (range: VisibleRange) => void;
244
249
  /** 错误回调 */
245
250
  onError?: (error: Error) => void;
246
251
  /** 数据源提供者 */
@@ -251,8 +256,6 @@ export interface KLineChartProps {
251
256
  requestOptions?: RequestOptions;
252
257
  /** 自动刷新配置 */
253
258
  autoRefresh?: boolean | AutoRefreshOptions;
254
- /** 时间轴配置 */
255
- timeAxis?: TimeAxisOptions;
256
259
  /** 自定义 ECharts 配置 */
257
260
  echartsOption?: EChartsOption;
258
261
  /** ECharts Option 合并策略 */
@@ -270,10 +273,12 @@ export interface KLineChartProps {
270
273
  export interface KLineChartRef {
271
274
  refresh(): Promise<void>;
272
275
  setPeriod(period: PeriodType): void;
276
+ setAdjust(adjust: AdjustType): void;
273
277
  setIndicators(indicators: IndicatorType[]): void;
274
278
  zoomTo(start: number, end: number): void;
275
279
  resetZoom(): void;
276
- getEchartsInstance(): unknown | null;
280
+ getVisibleRange(): VisibleRange;
281
+ getEchartsInstance(): EChartsType | null;
277
282
  exportImage(type?: 'png' | 'jpeg'): string;
278
283
  getData(): KlineData[];
279
284
  }
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./SubPaneTitle-BAu9MdQQ.cjs"),l=require("react/jsx-runtime"),m=require("react"),d="_container_1906n_1",f="_item_1906n_11",u={container:d,item:f},b={ma5:"#f5a623",ma10:"#2196f3",ma20:"#e91e63",ma30:"#4caf50",ma60:"#9c27b0",ma120:"#00bcd4",ma250:"#ff5722"};function p(r){return r==null?"--":r.toFixed(2)}function S({data:r,hoverIndex:o}){const a=m.useMemo(()=>{const e=o??r.length-1,n=r[e];return!n||!n.ma?null:n},[r,o]);if(!a||!a.ma)return null;const s=Object.keys(a.ma).filter(e=>{var n,i;return e.startsWith("ma")&&((n=a.ma)==null?void 0:n[e])!==null&&((i=a.ma)==null?void 0:i[e])!==void 0});return s.length===0?null:l.jsx("div",{className:u.container,children:s.map(e=>{var c;const n=(c=a.ma)==null?void 0:c[e],i=b[e]??"#999";return l.jsxs("span",{className:u.item,style:{color:i},children:[e.toUpperCase(),": ",p(n)]},e)})})}exports.IndicatorDisplay=t.IndicatorDisplay;exports.IndicatorSelector=t.IndicatorSelector;exports.Loading=t.Loading;exports.PeriodSelector=t.PeriodSelector;exports.SubPaneTitle=t.SubPaneTitle;exports.Toolbar=t.Toolbar;exports.useEcharts=t.useEcharts;exports.useKlineData=t.useKlineData;exports.useZoomHistory=t.useZoomHistory;exports.MADisplay=S;
@@ -0,0 +1,2 @@
1
+ export { useKlineData, useEcharts, useZoomHistory } from './hooks';
2
+ export { Loading, PeriodSelector, IndicatorSelector, Toolbar, MADisplay, IndicatorDisplay, SubPaneTitle, } from './components';
@@ -0,0 +1,53 @@
1
+ import { I as P, h as g, L as j, P as y, S as L, T as M, b as O, u as T, c as A } from "./SubPaneTitle-B2y5WQqq.js";
2
+ import { jsx as m, jsxs as l } from "react/jsx-runtime";
3
+ import { useMemo as u } from "react";
4
+ const f = "_container_1906n_1", p = "_item_1906n_11", c = {
5
+ container: f,
6
+ item: p
7
+ }, d = {
8
+ ma5: "#f5a623",
9
+ ma10: "#2196f3",
10
+ ma20: "#e91e63",
11
+ ma30: "#4caf50",
12
+ ma60: "#9c27b0",
13
+ ma120: "#00bcd4",
14
+ ma250: "#ff5722"
15
+ };
16
+ function _(n) {
17
+ return n == null ? "--" : n.toFixed(2);
18
+ }
19
+ function x({ data: n, hoverIndex: r }) {
20
+ const s = u(() => {
21
+ const t = r ?? n.length - 1, a = n[t];
22
+ return !a || !a.ma ? null : a;
23
+ }, [n, r]);
24
+ if (!s || !s.ma)
25
+ return null;
26
+ const o = Object.keys(s.ma).filter(
27
+ (t) => {
28
+ var a, e;
29
+ return t.startsWith("ma") && ((a = s.ma) == null ? void 0 : a[t]) !== null && ((e = s.ma) == null ? void 0 : e[t]) !== void 0;
30
+ }
31
+ );
32
+ return o.length === 0 ? null : /* @__PURE__ */ m("div", { className: c.container, children: o.map((t) => {
33
+ var i;
34
+ const a = (i = s.ma) == null ? void 0 : i[t], e = d[t] ?? "#999";
35
+ return /* @__PURE__ */ l("span", { className: c.item, style: { color: e }, children: [
36
+ t.toUpperCase(),
37
+ ": ",
38
+ _(a)
39
+ ] }, t);
40
+ }) });
41
+ }
42
+ export {
43
+ P as IndicatorDisplay,
44
+ g as IndicatorSelector,
45
+ j as Loading,
46
+ x as MADisplay,
47
+ y as PeriodSelector,
48
+ L as SubPaneTitle,
49
+ M as Toolbar,
50
+ O as useEcharts,
51
+ T as useKlineData,
52
+ A as useZoomHistory
53
+ };
@@ -0,0 +1,7 @@
1
+ interface UseControllableValueParams<T> {
2
+ value: T | undefined;
3
+ defaultValue: T;
4
+ onChange?: (value: T) => void;
5
+ }
6
+ export declare function useControllableValue<T>({ value, defaultValue, onChange, }: UseControllableValueParams<T>): readonly [T, (nextValue: T) => void];
7
+ export {};
@@ -44,13 +44,7 @@ export interface TooltipData {
44
44
  turnoverRate?: number | null;
45
45
  amplitude?: number | null;
46
46
  indicators?: string[];
47
- ma?: {
48
- ma5?: number | null;
49
- ma10?: number | null;
50
- ma20?: number | null;
51
- ma30?: number | null;
52
- ma60?: number | null;
53
- };
47
+ ma?: Record<string, number | null | undefined>;
54
48
  boll?: {
55
49
  upper: number | null;
56
50
  mid: number | null;
@@ -75,20 +69,9 @@ export interface TooltipData {
75
69
  d: number | null;
76
70
  j: number | null;
77
71
  };
78
- rsi?: {
79
- rsi6?: number | null;
80
- rsi12?: number | null;
81
- rsi24?: number | null;
82
- };
83
- wr?: {
84
- wr6?: number | null;
85
- wr10?: number | null;
86
- };
87
- bias?: {
88
- bias6?: number | null;
89
- bias12?: number | null;
90
- bias24?: number | null;
91
- };
72
+ rsi?: Record<string, number | null | undefined>;
73
+ wr?: Record<string, number | null | undefined>;
74
+ bias?: Record<string, number | null | undefined>;
92
75
  cci?: {
93
76
  cci: number | null;
94
77
  };
@@ -0,0 +1,7 @@
1
+ import { BIASOptions, MAOptions, RSIOptions, WROptions } from '../types';
2
+ export declare function getMAPeriods(options?: MAOptions | boolean): number[];
3
+ export declare function getRSIPeriods(options?: RSIOptions | boolean): number[];
4
+ export declare function getWRPeriods(options?: WROptions | boolean): number[];
5
+ export declare function getBIASPeriods(options?: BIASOptions | boolean): number[];
6
+ export declare function getMetricEntries(record: Record<string, number | null | undefined> | undefined, prefix: string): Array<[string, number | null | undefined]>;
7
+ export declare function formatMetricLabel(key: string): string;
@@ -0,0 +1,2 @@
1
+ import { MarketType } from '../types';
2
+ export declare function isMarketTradingTime(market: MarketType, date?: Date): boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kline-charts-react",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "description": "Professional stock K-line chart React component with built-in data source, powered by ECharts and stock-sdk",
5
5
  "author": "chengzuopeng",
6
6
  "license": "MIT",
@@ -14,6 +14,11 @@
14
14
  "import": "./dist/index.js",
15
15
  "require": "./dist/index.cjs"
16
16
  },
17
+ "./unstable": {
18
+ "types": "./dist/unstable.d.ts",
19
+ "import": "./dist/unstable.js",
20
+ "require": "./dist/unstable.cjs"
21
+ },
17
22
  "./style.css": "./dist/kline-charts-react.css"
18
23
  },
19
24
  "files": [
@@ -29,7 +34,11 @@
29
34
  "build": "tsc -b && vite build",
30
35
  "build:lib": "tsc -b && vite build",
31
36
  "build:playground": "yarn --cwd playground build",
37
+ "typecheck": "tsc --noEmit -p tsconfig.json && tsc --noEmit -p playground/tsconfig.json",
32
38
  "lint": "eslint .",
39
+ "test": "vitest",
40
+ "test:run": "vitest run",
41
+ "pack:check": "npm pack --dry-run",
33
42
  "preview": "yarn --cwd playground preview",
34
43
  "prepublishOnly": "yarn build"
35
44
  },
@@ -50,19 +59,29 @@
50
59
  }
51
60
  },
52
61
  "dependencies": {
53
- "stock-sdk": "^1.6.1"
62
+ "stock-sdk": "^1.8.0"
54
63
  },
55
64
  "devDependencies": {
65
+ "@eslint/js": "^9.39.1",
66
+ "@testing-library/dom": "^10.4.1",
67
+ "@testing-library/jest-dom": "^6.9.1",
68
+ "@testing-library/react": "^16.3.0",
56
69
  "@types/node": "^22.0.0",
57
70
  "@types/react": "^18.3.18",
58
71
  "@types/react-dom": "^18.3.5",
59
72
  "@vitejs/plugin-react": "^4.3.4",
73
+ "echarts": "^5.5.0",
60
74
  "eslint": "^9.17.0",
75
+ "eslint-plugin-react-hooks": "^7.0.1",
76
+ "globals": "^16.4.0",
77
+ "jsdom": "^27.0.1",
61
78
  "react": "^18.3.1",
62
79
  "react-dom": "^18.3.1",
63
80
  "typescript": "~5.6.2",
81
+ "typescript-eslint": "^8.46.2",
64
82
  "vite": "^6.0.5",
65
- "vite-plugin-dts": "^4.4.0"
83
+ "vite-plugin-dts": "^4.4.0",
84
+ "vitest": "^3.2.4"
66
85
  },
67
86
  "keywords": [
68
87
  "kline",
@@ -86,12 +105,12 @@
86
105
  ],
87
106
  "repository": {
88
107
  "type": "git",
89
- "url": "https://github.com/chengzuopeng/kline-charts.git"
108
+ "url": "https://github.com/chengzuopeng/kline-charts-react.git"
90
109
  },
91
110
  "bugs": {
92
- "url": "https://github.com/chengzuopeng/kline-charts/issues"
111
+ "url": "https://github.com/chengzuopeng/kline-charts-react/issues"
93
112
  },
94
- "homepage": "https://github.com/chengzuopeng/kline-charts#readme",
113
+ "homepage": "https://github.com/chengzuopeng/kline-charts-react#readme",
95
114
  "engines": {
96
115
  "node": ">=18.0.0"
97
116
  },
package/dist/index.umd.js DELETED
@@ -1,7 +0,0 @@
1
- (function(k,g){typeof exports=="object"&&typeof module<"u"?g(exports,require("react/jsx-runtime"),require("react"),require("stock-sdk"),require("echarts/core"),require("echarts/charts"),require("echarts/components"),require("echarts/renderers")):typeof define=="function"&&define.amd?define(["exports","react/jsx-runtime","react","stock-sdk","echarts/core","echarts/charts","echarts/components","echarts/renderers"],g):(k=typeof globalThis<"u"?globalThis:k||self,g(k.KLineCharts={},k.jsxRuntime,k.React,k.StockSDK,k.echarts,k.echarts,k.echarts,k.echarts))})(this,(function(k,g,x,_n,Dn,he,ee,Ln){"use strict";var ft=Object.defineProperty;var mt=(k,g,x)=>g in k?ft(k,g,{enumerable:!0,configurable:!0,writable:!0,value:x}):k[g]=x;var Ke=(k,g,x)=>mt(k,typeof g!="symbol"?g+"":g,x);function Nn(e){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const t in e)if(t!=="default"){const l=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(n,t,l.get?l:{enumerable:!0,get:()=>e[t]})}}return n.default=e,Object.freeze(n)}const Ee=Nn(Dn),xe={backgroundColor:"#ffffff",textColor:"#333333",textColorSecondary:"#999999",gridLineColor:"#e0e0e0",upColor:"#f5222d",downColor:"#52c41a",maColors:["#f5a623","#1890ff","#722ed1","#13c2c2","#eb2f96","#faad14","#a0d911"],volumeUpColor:"#f5222d",volumeDownColor:"#52c41a",crosshairColor:"#999999",tooltipBgColor:"rgba(255,255,255,0.96)",tooltipBorderColor:"#e0e0e0",splitLineColor:"#f0f0f0",areaColor:"rgba(24,144,255,0.1)",activeColor:"#1890ff",bollColors:["#faad14","#1890ff","#722ed1"],kcColors:["#52c41a","#13c2c2","#eb2f96"]},ze={backgroundColor:"#1a1a1a",textColor:"#d1d1d1",textColorSecondary:"#666666",gridLineColor:"#333333",upColor:"#f5222d",downColor:"#52c41a",maColors:["#f5a623","#1890ff","#722ed1","#13c2c2","#eb2f96","#faad14","#a0d911"],volumeUpColor:"#f5222d",volumeDownColor:"#52c41a",crosshairColor:"#666666",tooltipBgColor:"rgba(30,30,30,0.96)",tooltipBorderColor:"#333333",splitLineColor:"#2a2a2a",areaColor:"rgba(24,144,255,0.15)",activeColor:"#1890ff",bollColors:["#faad14","#1890ff","#722ed1"],kcColors:["#52c41a","#13c2c2","#eb2f96"]};function He(e){return typeof e=="string"?e==="dark"?ze:xe:{...xe,...e}}function ne(e,n){const t=[];let l=0,a=0;for(let i=0;i<e.length;i++){const c=e[i];if(c!=null&&(l+=c,a++),i>=n){const o=e[i-n];o!=null&&(l-=o,a--)}i>=n-1&&a===n?t.push(l/n):t.push(null)}return t}function G(e,n){const t=[],l=2/(n+1);let a=null;for(let i=0;i<e.length;i++){const c=e[i];if(c==null){t.push(a);continue}a===null?a=c:a=c*l+a*(1-l),t.push(a)}return t}function Ve(e,n){const t=[],l=Array.from({length:n},(i,c)=>c+1),a=l.reduce((i,c)=>i+c,0);for(let i=0;i<e.length;i++){if(i<n-1){t.push(null);continue}let c=0,o=0;for(let r=0;r<n;r++){const s=e[i-n+1+r],d=l[r];s!=null&&d!==void 0&&(c+=s*d,o++)}o===n?t.push(c/a):t.push(null)}return t}function Fe(e,n={}){const{periods:t=[5,10,20,30,60],type:l="sma"}=n,a={};for(const c of t){const o=`ma${c}`;switch(l){case"ema":a[o]=G(e,c);break;case"wma":a[o]=Ve(e,c);break;default:a[o]=ne(e,c)}}const i=[];for(let c=0;c<e.length;c++){const o={};for(const r of Object.keys(a)){const s=a[r];o[r]=s!==void 0?s[c]??null:null}i.push(o)}return i}function Ue(e,n={}){const{short:t=12,long:l=26,signal:a=9}=n,i=G(e,t),c=G(e,l),o=[];for(let d=0;d<e.length;d++){const h=i[d],f=c[d];h!=null&&f!==null&&f!==void 0?o.push(h-f):o.push(null)}const r=G(o,a),s=[];for(let d=0;d<e.length;d++){const h=o[d]??null,f=r[d]??null;s.push({dif:h,dea:f,macd:h!==null&&f!==null?(h-f)*2:null})}return s}function We(e,n={}){const{period:t=20,stdDev:l=2}=n,a=ne(e,t),i=[];for(let c=0;c<e.length;c++){const o=a[c];if(o==null||c<t-1){i.push({mid:null,upper:null,lower:null,bandwidth:null});continue}let r=0,s=0;for(let d=c-t+1;d<=c;d++){const h=e[d];h!=null&&(r+=Math.pow(h-o,2),s++)}if(s===t){const d=Math.sqrt(r/t),h=o+l*d,f=o-l*d;i.push({mid:o,upper:h,lower:f,bandwidth:o!==0?(h-f)/o*100:null})}else i.push({mid:o,upper:null,lower:null,bandwidth:null})}return i}function Re(e,n={}){const{period:t=9,kPeriod:l=3,dPeriod:a=3}=n,i=[];let c=50,o=50;for(let r=0;r<e.length;r++){if(r<t-1){i.push({k:null,d:null,j:null});continue}let s=-1/0,d=1/0;for(let v=r-t+1;v<=r;v++){const p=e[v];p!==void 0&&p.high!==null&&p.high!==void 0&&(s=Math.max(s,p.high)),p!==void 0&&p.low!==null&&p.low!==void 0&&(d=Math.min(d,p.low))}const h=e[r],f=h!==void 0?h.close:null;if(f==null||s===-1/0||d===1/0){i.push({k:null,d:null,j:null});continue}const m=s===d?50:(f-d)/(s-d)*100,u=(c*(l-1)+m)/l,C=(o*(a-1)+u)/a,w=3*u-2*C;i.push({k:u,d:C,j:w}),c=u,o=C}return i}function qe(e,n={}){const{periods:t=[6,12,24]}=n,l={};for(const i of t){const c=`rsi${i}`,o=[];let r=0,s=0;for(let d=0;d<e.length;d++){const h=e[d],f=e[d-1];if(d===0||h===null||h===void 0||f===null||f===void 0){o.push(null);continue}const m=h-f,u=m>0?m:0,C=m<0?-m:0;if(d<i)r+=u,s+=C,o.push(null);else if(d===i){r=(r+u)/i,s=(s+C)/i;const w=s===0?100:r/s;o.push(100-100/(1+w))}else{r=(r*(i-1)+u)/i,s=(s*(i-1)+C)/i;const w=s===0?100:r/s;o.push(100-100/(1+w))}}l[c]=o}const a=[];for(let i=0;i<e.length;i++){const c={};for(const o of Object.keys(l)){const r=l[o];c[o]=r!==void 0?r[i]??null:null}a.push(c)}return a}function Ze(e,n={}){const{periods:t=[6,10]}=n,l={};for(const i of t){const c=`wr${i}`,o=[];for(let r=0;r<e.length;r++){if(r<i-1){o.push(null);continue}let s=-1/0,d=1/0;for(let m=r-i+1;m<=r;m++){const u=e[m];u!==void 0&&u.high!==null&&u.high!==void 0&&(s=Math.max(s,u.high)),u!==void 0&&u.low!==null&&u.low!==void 0&&(d=Math.min(d,u.low))}const h=e[r],f=h!==void 0?h.close:null;f==null||s===d?o.push(null):o.push((s-f)/(s-d)*-100)}l[c]=o}const a=[];for(let i=0;i<e.length;i++){const c={};for(const o of Object.keys(l)){const r=l[o];c[o]=r!==void 0?r[i]??null:null}a.push(c)}return a}function Ye(e,n={}){const{periods:t=[6,12,24]}=n,l={};for(const i of t){const c=`bias${i}`,o=ne(e,i),r=[];for(let s=0;s<e.length;s++){const d=e[s],h=o[s];d==null||h===null||h===void 0||h===0?r.push(null):r.push((d-h)/h*100)}l[c]=r}const a=[];for(let i=0;i<e.length;i++){const c={};for(const o of Object.keys(l)){const r=l[o];c[o]=r!==void 0?r[i]??null:null}a.push(c)}return a}function Ge(e,n={}){const{period:t=14}=n,l=e.map(c=>c.high===null||c.low===null||c.close===null?null:(c.high+c.low+c.close)/3),a=ne(l,t),i=[];for(let c=0;c<e.length;c++){const o=l[c],r=a[c];if(c<t-1||o===null||o===void 0||r===null||r===void 0){i.push({cci:null});continue}let s=0,d=0;for(let f=c-t+1;f<=c;f++){const m=l[f];m!=null&&(s+=Math.abs(m-r),d++)}const h=d>0?s/d:0;h===0?i.push({cci:0}):i.push({cci:(o-r)/(.015*h)})}return i}function Ce(e,n={}){const{period:t=14}=n,l=[],a=[];for(let i=0;i<e.length;i++){const c=e[i];if(c===void 0||c.high===null||c.low===null||c.close===null){a.push(null),l.push({tr:null,atr:null});continue}let o;if(i===0)o=c.high-c.low;else{const r=e[i-1],s=r!==void 0?r.close:null;s==null?o=c.high-c.low:o=Math.max(c.high-c.low,Math.abs(c.high-s),Math.abs(c.low-s))}if(a.push(o),i<t-1)l.push({tr:o,atr:null});else if(i===t-1){let r=0;for(let s=0;s<t;s++)r+=a[s]??0;l.push({tr:o,atr:r/t})}else{const r=l[i-1],s=r!==void 0?r.atr:null;s==null?l.push({tr:o,atr:null}):l.push({tr:o,atr:(s*(t-1)+o)/t})}}return l}function Je(e,n={}){const{maPeriod:t=30}=n,l=[];let a=0;for(let o=0;o<e.length;o++){const r=e[o];if(r===void 0||r.close===null||r.volume===null||r.volume===void 0){l.push({obv:null,obvMa:null});continue}if(o===0)a=r.volume;else{const s=e[o-1],d=s!==void 0?s.close:null;d==null?a=r.volume:r.close>d?a+=r.volume:r.close<d&&(a-=r.volume)}l.push({obv:a,obvMa:null})}const i=l.map(o=>o.obv),c=ne(i,t);for(let o=0;o<l.length;o++){const r=l[o];r!==void 0&&(r.obvMa=c[o]??null)}return l}function Xe(e,n={}){const{period:t=12,signalPeriod:l=6}=n,a=[];for(let o=0;o<e.length;o++){const r=e[o],s=e[o-t];o<t||r===null||r===void 0||s===null||s===void 0||s===0?a.push(null):a.push((r-s)/s*100)}const i=G(a,l),c=[];for(let o=0;o<e.length;o++)c.push({roc:a[o]??null,signal:i[o]??null});return c}function Qe(e,n={}){const{period:t=14,adxPeriod:l=14}=n,a=[],i=[],c=[],o=[];for(let r=0;r<e.length;r++){const s=e[r];if(s===void 0||s.high===null||s.low===null||s.close===null){a.push({pdi:null,mdi:null,adx:null,adxr:null});continue}let d;if(r===0)d=s.high-s.low;else{const y=e[r-1],S=y!==void 0?y.close:null;S==null?d=s.high-s.low:d=Math.max(s.high-s.low,Math.abs(s.high-S),Math.abs(s.low-S))}if(i.push(d),r===0)c.push(0),o.push(0);else{const y=e[r-1];if(y===void 0||y.high===null||y.low===null)c.push(0),o.push(0);else{const S=s.high-y.high,_=y.low-s.low,P=S>_&&S>0?S:0,Z=_>S&&_>0?_:0;c.push(P),o.push(Z)}}if(r<t-1){a.push({pdi:null,mdi:null,adx:null,adxr:null});continue}let h=0,f=0,m=0;for(let y=r-t+1;y<=r;y++)h+=i[y]??0,f+=c[y]??0,m+=o[y]??0;const u=h>0?f/h*100:0,C=h>0?m/h*100:0,w=u+C,v=w>0?Math.abs(u-C)/w*100:0;let p=null;if(r>=t-1+l-1){let y=0;for(let S=r-l+1;S<=r;S++){if(a[S]===void 0)continue;let P=0,Z=0,j=0;for(let U=S-t+1;U<=S;U++)P+=i[U]??0,Z+=c[U]??0,j+=o[U]??0;const K=P>0?Z/P*100:0,F=P>0?j/P*100:0,J=K+F,T=J>0?Math.abs(K-F)/J*100:0;y+=T}y+=v,p=y/l}let I=null;if(p!==null&&r>=t-1+l-1+l){const y=a[r-l];y!==void 0&&y.adx!==null&&(I=(p+y.adx)/2)}a.push({pdi:u,mdi:C,adx:p,adxr:I})}return a}function en(e,n={}){var d,h;const{afStart:t=.02,afIncrement:l=.02,afMax:a=.2}=n,i=[];if(e.length===0)return i;let c=1,o=((d=e[0])==null?void 0:d.low)??0,r=((h=e[0])==null?void 0:h.high)??0,s=t;for(let f=0;f<e.length;f++){const m=e[f];if(m===void 0||m.high===null||m.low===null){i.push({sar:null,trend:null,ep:null,af:null});continue}if(f===0){i.push({sar:m.low,trend:1,ep:m.high,af:t}),o=m.low,r=m.high,c=1,s=t;continue}const u=o;if(o=u+s*(r-u),c===1){const C=e[f-1],w=e[f-2];C!==void 0&&C.low!==null&&(o=Math.min(o,C.low)),w!==void 0&&w.low!==null&&(o=Math.min(o,w.low)),m.low<o?(c=-1,o=r,r=m.low,s=t):m.high>r&&(r=m.high,s=Math.min(s+l,a))}else{const C=e[f-1],w=e[f-2];C!==void 0&&C.high!==null&&(o=Math.max(o,C.high)),w!==void 0&&w.high!==null&&(o=Math.max(o,w.high)),m.high>o?(c=1,o=r,r=m.high,s=t):m.low<r&&(r=m.low,s=Math.min(s+l,a))}i.push({sar:o,trend:c,ep:r,af:s})}return i}function nn(e,n={}){var s;const{emaPeriod:t=20,atrPeriod:l=10,multiplier:a=2}=n,i=e.map(d=>d.close),c=G(i,t),o=Ce(e,{period:l}),r=[];for(let d=0;d<e.length;d++){const h=c[d],f=(s=o[d])==null?void 0:s.atr;if(h==null||f===null||f===void 0){r.push({mid:null,upper:null,lower:null,width:null});continue}const m=h+a*f,u=h-a*f,C=h!==0?(m-u)/h*100:null;r.push({mid:h,upper:m,lower:u,width:C})}return r}const Tn={enabled:!0,ttl:300*1e3,maxSize:100};function jn(e){switch(e){case"timeline":case"timeline5":return 30*1e3;case"1":case"5":case"15":case"30":case"60":return 120*1e3;case"daily":case"weekly":case"monthly":default:return 600*1e3}}class te{constructor(n={}){Ke(this,"cache",new Map);Ke(this,"config");this.config={...Tn,...n}}static buildKey(n){return Object.entries(n).filter(([,t])=>t!==void 0).sort(([t],[l])=>t.localeCompare(l)).map(([t,l])=>`${t}:${String(l)}`).join("|")}get(n){if(!this.config.enabled)return;const t=this.cache.get(n);if(!t)return;const l=t.ttl??this.config.ttl;if(Date.now()-t.timestamp>l){this.cache.delete(n);return}return t.data}set(n,t,l){if(this.config.enabled){if(this.cache.size>=this.config.maxSize&&(this.cleanup(),this.cache.size>=this.config.maxSize)){const a=this.cache.keys().next().value;a&&this.cache.delete(a)}this.cache.set(n,{data:t,timestamp:Date.now(),ttl:l})}}cleanup(){const n=Date.now();for(const[t,l]of this.cache.entries()){const a=l.ttl??this.config.ttl;n-l.timestamp>a&&this.cache.delete(t)}}delete(n){return this.cache.delete(n)}clear(){this.cache.clear()}size(){return this.cache.size}}new te;const ce=new te,we=new Map,Bn=150;function Pn(e){const n=new _n.StockSDK(e);return{getKline:async t=>{const{symbol:l,market:a,period:i,adjust:c}=t;if(i==="timeline"){const s=await n.getTodayTimeline(l);return s.data.map(d=>({date:`${s.date.slice(0,4)}-${s.date.slice(4,6)}-${s.date.slice(6,8)} ${d.time}`,open:d.price,close:d.price,high:d.price,low:d.price,volume:d.volume,amount:d.amount}))}if(i==="timeline5"){const s=new Date,d=new Date;d.setDate(d.getDate()-7);const h=m=>{const u=m.getFullYear(),C=String(m.getMonth()+1).padStart(2,"0"),w=String(m.getDate()).padStart(2,"0");return`${u}-${C}-${w}`};return(await n.getMinuteKline(l,{period:"1",startDate:h(d),endDate:h(s)})).map(m=>({date:"time"in m?m.time:"",open:m.open,close:m.close,high:m.high,low:m.low,volume:m.volume,amount:m.amount}))}if(["1","5","15","30","60"].includes(i)){let d=(await n.getMinuteKline(l,{period:i,adjust:c||"qfq"})).map(h=>({date:"time"in h?h.time:"",open:h.open,close:h.close,high:h.high,low:h.low,volume:h.volume,amount:h.amount,changePercent:"changePercent"in h?h.changePercent:void 0,change:"change"in h?h.change:void 0,amplitude:"amplitude"in h?h.amplitude:void 0,turnoverRate:"turnoverRate"in h?h.turnoverRate:void 0}));if(i==="1"&&d.length>0){const h=d[d.length-1].date.split(" ")[0];d=d.filter(f=>f.date.startsWith(h))}return d}const r={daily:"daily",weekly:"weekly",monthly:"monthly"}[i]??"daily";switch(a){case"HK":return await n.getHKHistoryKline(l,{period:r,adjust:c||"qfq"});case"US":return await n.getUSHistoryKline(l,{period:r,adjust:c||"qfq"});default:return await n.getHistoryKline(l,{period:r,adjust:c||"qfq"})}},getTimeline:async t=>(await n.getTodayTimeline(t.symbol)).data}}function On(e,n,t={}){if(e.length===0)return[];const l=e.map(I=>I.close),a=e.map(I=>({open:I.open,high:I.high,low:I.low,close:I.close,volume:I.volume})),i=n.includes("ma")?Fe(l,typeof t.ma=="object"?t.ma:{}):null,c=n.includes("macd")?Ue(l,typeof t.macd=="object"?t.macd:{}):null,o=n.includes("boll")?We(l,typeof t.boll=="object"?t.boll:{}):null,r=n.includes("kdj")?Re(a,typeof t.kdj=="object"?t.kdj:{}):null,s=n.includes("rsi")?qe(l,typeof t.rsi=="object"?t.rsi:{}):null,d=n.includes("wr")?Ze(a,typeof t.wr=="object"?t.wr:{}):null,h=n.includes("bias")?Ye(l,typeof t.bias=="object"?t.bias:{}):null,f=n.includes("cci")?Ge(a,typeof t.cci=="object"?t.cci:{}):null,m=n.includes("atr")?Ce(a,typeof t.atr=="object"?t.atr:{}):null,u=n.includes("obv")?Je(a,typeof t.obv=="object"?t.obv:{}):null,C=n.includes("roc")?Xe(l,typeof t.roc=="object"?t.roc:{}):null,w=n.includes("dmi")?Qe(a,typeof t.dmi=="object"?t.dmi:{}):null,v=n.includes("sar")?en(a,typeof t.sar=="object"?t.sar:{}):null,p=n.includes("kc")?nn(a,typeof t.kc=="object"?t.kc:{}):null;return e.map((I,y)=>({...I,ma:i==null?void 0:i[y],macd:c==null?void 0:c[y],boll:o==null?void 0:o[y],kdj:r==null?void 0:r[y],rsi:s==null?void 0:s[y],wr:d==null?void 0:d[y],bias:h==null?void 0:h[y],cci:f==null?void 0:f[y],atr:m==null?void 0:m[y],obv:u==null?void 0:u[y],roc:C==null?void 0:C[y],dmi:w==null?void 0:w[y],sar:v==null?void 0:v[y],kc:p==null?void 0:p[y]}))}function tn(e){const{symbol:n,market:t,period:l,adjust:a,dataProvider:i,sdkOptions:c,requestOptions:o,indicatorOptions:r,indicators:s=["ma","volume","macd"]}=e,[d,h]=x.useState([]),[f,m]=x.useState([]),[u,C]=x.useState(!1),[w,v]=x.useState(null),p=x.useRef(null),I=x.useRef(null),y=x.useRef(null),S=x.useCallback(()=>i||(y.current||(y.current=Pn(c)),y.current),[i,c]),_=x.useCallback(async()=>{(o==null?void 0:o.abortOnChange)!==!1&&p.current&&p.current.abort();const j=new AbortController;p.current=j,C(!0),v(null);try{const K=S(),F=te.buildKey({symbol:n,market:t,period:l,adjust:a}),J=ce.get(F);if(J&&(o==null?void 0:o.dedupe)!==!1){if(h(J),C(!1),l==="timeline"){const H=te.buildKey({symbol:n,market:t,type:"timeline"}),X=ce.get(H);X&&m(X)}return}const T=we.get(F);if(T){try{const H=await T;j.signal.aborted||h(H)}catch{}finally{j.signal.aborted||C(!1)}return}const U=K.getKline({symbol:n,market:t,period:l,adjust:a},j.signal);we.set(F,U);try{const H=await U;if(j.signal.aborted)return;const X=jn(l);if(ce.set(F,H,X),h(H),l==="timeline"&&K.getTimeline){const z=await K.getTimeline({symbol:n,market:t},j.signal);if(!j.signal.aborted){const $e=te.buildKey({symbol:n,market:t,type:"timeline"});ce.set($e,z,X),m(z)}}}finally{we.delete(F)}}catch(K){if(K.name==="AbortError")return;v(K)}finally{j.signal.aborted||C(!1)}},[n,t,l,a,S,o]),P=x.useCallback(async()=>{const j=te.buildKey({symbol:n,market:t,period:l,adjust:a});ce.delete(j),await _()},[n,t,l,a,_]);return x.useEffect(()=>{I.current&&clearTimeout(I.current);const j=(o==null?void 0:o.debounceMs)??Bn;return I.current=setTimeout(_,j),()=>{I.current&&clearTimeout(I.current),p.current&&p.current.abort()}},[n,t,l,a,_,o==null?void 0:o.debounceMs]),{data:x.useMemo(()=>On(d,s,r),[d,s,r]),timelineData:f,loading:u,error:w,refresh:P}}Ee.use([he.CandlestickChart,he.LineChart,he.BarChart,he.ScatterChart,ee.TitleComponent,ee.TooltipComponent,ee.GridComponent,ee.DataZoomComponent,ee.LegendComponent,ee.AxisPointerComponent,Ln.CanvasRenderer]);function on(){const e=x.useRef(null),n=x.useRef(null);x.useEffect(()=>{if(!e.current)return;n.current=Ee.init(e.current);const o=new ResizeObserver(()=>{var r;(r=n.current)==null||r.resize()});return o.observe(e.current),()=>{var r;o.disconnect(),(r=n.current)==null||r.dispose(),n.current=null}},[]);const t=x.useCallback((o,r,s=!1)=>{var h;let d;typeof r=="boolean"?d={notMerge:r,lazyUpdate:s}:d=r??{},(h=n.current)==null||h.setOption(o,d)},[]),l=x.useCallback(()=>{var o;(o=n.current)==null||o.resize()},[]),a=x.useCallback(()=>{var o;(o=n.current)==null||o.dispose(),n.current=null},[]),i=x.useCallback(o=>n.current?n.current.getDataURL({type:(o==null?void 0:o.type)??"png",pixelRatio:(o==null?void 0:o.pixelRatio)??2,backgroundColor:(o==null?void 0:o.backgroundColor)??"#fff"}):"",[]),c=x.useCallback((o,r)=>{const s=n.current;return s?(s.on(o,r),()=>{s.off(o,r)}):()=>{}},[]);return{chartRef:e,chartInstance:n.current,setOption:t,resize:l,dispose:a,getDataURL:i,bindEvent:c}}const Kn={start:70,end:100},En=50;function ln(e=Kn){const n=x.useRef([e]),t=x.useRef(0),[,l]=x.useState({}),a=n.current[t.current]??e,i=x.useCallback(s=>{t.current<n.current.length-1&&(n.current=n.current.slice(0,t.current+1)),n.current.length>=En&&(n.current=n.current.slice(1)),n.current.push(s),t.current=n.current.length-1,l({})},[]),c=x.useCallback(()=>t.current>0?(t.current--,l({}),n.current[t.current]??null):null,[]),o=x.useCallback(()=>t.current<n.current.length-1?(t.current++,l({}),n.current[t.current]??null):null,[]),r=x.useCallback((s=e)=>{n.current=[s],t.current=0,l({})},[e]);return{canUndo:t.current>0,canRedo:t.current<n.current.length-1,currentState:a,pushState:i,undo:c,redo:o,reset:r}}function rn(e,n=2){return e==null||isNaN(e)?"--":e.toLocaleString("zh-CN",{minimumFractionDigits:n,maximumFractionDigits:n})}function b(e){return rn(e,2)}function sn(e){return e==null||isNaN(e)?"--":`${e>0?"+":""}${e.toFixed(2)}%`}function cn(e){return e==null||isNaN(e)?"--":`${e>0?"+":""}${e.toFixed(2)}`}function ae(e,n){return Number.isInteger(e)?e.toString():e.toFixed(n).replace(/\.?0+$/,"")}function V(e){return e==null||isNaN(e)?"--":e>=1e8?`${ae(e/1e8,2)}亿`:e>=1e4?`${ae(e/1e4,2)}万`:e.toFixed(0)}function an(e){return e==null||isNaN(e)?"--":e>=1e8?`${ae(e/1e8,2)}亿`:e>=1e4?`${ae(e/1e4,2)}万`:ae(e,2)}function zn(e,n="YYYY-MM-DD"){const t=typeof e=="string"?new Date(e):e;if(isNaN(t.getTime()))return e;const l=t.getFullYear(),a=String(t.getMonth()+1).padStart(2,"0"),i=String(t.getDate()).padStart(2,"0"),c=String(t.getHours()).padStart(2,"0"),o=String(t.getMinutes()).padStart(2,"0");return n.replace("YYYY",String(l)).replace("MM",a).replace("DD",i).replace("HH",c).replace("mm",o)}function un(e){const n=[`<div style="font-weight:bold;margin-bottom:4px">${e.date}</div>`,`<div>开盘: <span style="font-weight:500">${b(e.open)}</span></div>`,`<div>最高: <span style="font-weight:500">${b(e.high)}</span></div>`,`<div>最低: <span style="font-weight:500">${b(e.low)}</span></div>`,`<div>收盘: <span style="font-weight:500">${b(e.close)}</span></div>`];if(e.change!==void 0&&e.changePercent!==void 0){const a=e.change!==null&&e.change>0?"#f5222d":e.change!==null&&e.change<0?"#52c41a":"inherit";n.push(`<div>涨跌: <span style="color:${a};font-weight:500">${cn(e.change)} (${sn(e.changePercent)})</span></div>`)}e.volume!==void 0&&n.push(`<div>成交量: ${V(e.volume)}</div>`),e.amount!==void 0&&n.push(`<div>成交额: ${an(e.amount)}</div>`),e.turnoverRate!==void 0&&e.turnoverRate!==null&&n.push(`<div>换手率: ${e.turnoverRate.toFixed(2)}%</div>`),e.amplitude!==void 0&&e.amplitude!==null&&n.push(`<div>振幅: ${e.amplitude.toFixed(2)}%</div>`);const t=e.indicators??[];let l=!1;if(t.includes("ma")&&e.ma&&(l?n.push(`<div>MA: ${b(e.ma.ma5)} / ${b(e.ma.ma10)} / ${b(e.ma.ma20)}</div>`):(n.push(`<div style="margin-top:4px;border-top:1px solid #eee;padding-top:4px">MA: ${b(e.ma.ma5)} / ${b(e.ma.ma10)} / ${b(e.ma.ma20)}</div>`),l=!0)),t.includes("boll")&&e.boll&&(l?n.push(`<div>BOLL: 上 ${b(e.boll.upper)} 中 ${b(e.boll.mid)} 下 ${b(e.boll.lower)}</div>`):(n.push(`<div style="margin-top:4px;border-top:1px solid #eee;padding-top:4px">BOLL: 上 ${b(e.boll.upper)} 中 ${b(e.boll.mid)} 下 ${b(e.boll.lower)}</div>`),l=!0)),t.includes("sar")&&e.sar){const a=e.sar.trend===1?"↑":"↓";l?n.push(`<div>SAR: ${b(e.sar.sar)} ${a}</div>`):(n.push(`<div style="margin-top:4px;border-top:1px solid #eee;padding-top:4px">SAR: ${b(e.sar.sar)} ${a}</div>`),l=!0)}return t.includes("kc")&&e.kc&&(l?n.push(`<div>KC: 上 ${b(e.kc.upper)} 中 ${b(e.kc.mid)} 下 ${b(e.kc.lower)}</div>`):(n.push(`<div style="margin-top:4px;border-top:1px solid #eee;padding-top:4px">KC: 上 ${b(e.kc.upper)} 中 ${b(e.kc.mid)} 下 ${b(e.kc.lower)}</div>`),l=!0)),t.includes("macd")&&e.macd&&(l?n.push(`<div>MACD: DIF ${b(e.macd.dif)} DEA ${b(e.macd.dea)} MACD ${b(e.macd.macd)}</div>`):(n.push(`<div style="margin-top:4px;border-top:1px solid #eee;padding-top:4px">MACD: DIF ${b(e.macd.dif)} DEA ${b(e.macd.dea)} MACD ${b(e.macd.macd)}</div>`),l=!0)),t.includes("kdj")&&e.kdj&&n.push(`<div>KDJ: K ${b(e.kdj.k)} D ${b(e.kdj.d)} J ${b(e.kdj.j)}</div>`),t.includes("rsi")&&e.rsi&&n.push(`<div>RSI: ${b(e.rsi.rsi6)} / ${b(e.rsi.rsi12)} / ${b(e.rsi.rsi24)}</div>`),t.includes("wr")&&e.wr&&n.push(`<div>WR: ${b(e.wr.wr6)} / ${b(e.wr.wr10)}</div>`),t.includes("bias")&&e.bias&&n.push(`<div>BIAS: ${b(e.bias.bias6)} / ${b(e.bias.bias12)} / ${b(e.bias.bias24)}</div>`),t.includes("cci")&&e.cci&&n.push(`<div>CCI: ${b(e.cci.cci)}</div>`),t.includes("atr")&&e.atr&&n.push(`<div>ATR: ${b(e.atr.atr)}</div>`),t.includes("obv")&&e.obv&&n.push(`<div>OBV: ${V(e.obv.obv)} MA ${V(e.obv.obvMa)}</div>`),t.includes("roc")&&e.roc&&n.push(`<div>ROC: ${b(e.roc.roc)} SIGNAL ${b(e.roc.signal)}</div>`),t.includes("dmi")&&e.dmi&&n.push(`<div>DMI: +DI ${b(e.dmi.pdi)} -DI ${b(e.dmi.mdi)} ADX ${b(e.dmi.adx)}</div>`),n.join("")}const Ie=["ma","boll","sar","kc"],dn="kline-zoom-inside",hn="kline-zoom-slider";function ue(e,n){return Number.isInteger(e)?e.toString():e.toFixed(n).replace(/\.?0+$/,"")}function Hn(e,n){return n.includes("volume")?V(e):Math.abs(e)>=100||Math.abs(e)>=10||Math.abs(e)>=1||Math.abs(e)>=.01?ue(e,2):ue(e,4)}function fn(e,n={}){const t=Math.min(Math.max(n.maxSubPanes??3,0),3),l=e.filter(s=>!Ie.includes(s));if(t===0)return[{id:"main",height:"95%",indicators:Ie.filter(s=>e.includes(s))}];const a=l.length,i=Math.min(a,t),o=i===0?{main:"95%",sub:"0%"}:i===1?{main:"78%",sub:"18%"}:i===2?{main:"65%",sub:"15%"}:{main:"55%",sub:"13%"},r=[{id:"main",height:o.main,indicators:Ie.filter(s=>e.includes(s))}];return l.slice(0,t).forEach((s,d)=>{r.push({id:`sub_${s}_${d}`,height:o.sub,indicators:[s]})}),r}const Se={gap:25,topMargin:50,bottomMargin:55,leftMargin:60,rightMargin:60};function mn(e,n){const t=[],{gap:l,topMargin:a,bottomMargin:i}=Se,c=n-a-i-(e.length-1)*l;let o=0;const r=[];for(const f of e)if(typeof f.height=="string"&&f.height.endsWith("%")){const m=parseFloat(f.height)/100;r.push(m),o+=m}else typeof f.height=="number"?(r.push(f.height/c),o+=f.height/c):r.push(0);const s=r.filter(f=>f===0).length;if(s>0&&o<1){const f=(1-o)/s;for(let m=0;m<r.length;m++)r[m]===0&&(r[m]=f)}const d=r.reduce((f,m)=>f+m,0);for(let f=0;f<r.length;f++)r[f]=r[f]/d*c;let h=a;for(let f=0;f<e.length;f++)t.push({id:e[f].id,left:Se.leftMargin,right:Se.rightMargin,top:h,height:r[f]}),h+=r[f]+l;return t}function Vn(e){const{data:n,theme:t,indicators:l,panes:a=fn(l),containerHeight:i=500,indicatorOptions:c}=e,o=typeof(c==null?void 0:c.ma)=="object"?c.ma:void 0,r=(o==null?void 0:o.periods)??[5,10,20,30,60];if(n.length===0)return{title:{text:"暂无数据",left:"center",top:"center",textStyle:{color:t.textColorSecondary}}};const s=mn(a,i),d=n.map(u=>u.date),h=n.map(u=>u.close),f={animation:!1,backgroundColor:t.backgroundColor,title:{text:"",show:!1},tooltip:{trigger:"axis",axisPointer:{type:"cross",crossStyle:{color:t.crosshairColor},lineStyle:{color:t.crosshairColor,type:"dashed"}},backgroundColor:t.tooltipBgColor,borderColor:t.tooltipBorderColor,textStyle:{color:t.textColor,fontSize:12},formatter:u=>{if(!Array.isArray(u)||u.length===0)return"";const C=u[0].dataIndex,w=n[C];return w?un({date:w.date,open:w.open,high:w.high,low:w.low,close:w.close,volume:w.volume,amount:w.amount,change:w.change,changePercent:w.changePercent,turnoverRate:w.turnoverRate,amplitude:w.amplitude,indicators:l,ma:w.ma,boll:w.boll,sar:w.sar,kc:w.kc,macd:w.macd,kdj:w.kdj,rsi:w.rsi,wr:w.wr,bias:w.bias,cci:w.cci,atr:w.atr,obv:w.obv,roc:w.roc,dmi:w.dmi}):""}},axisPointer:{link:[{xAxisIndex:"all"}]},grid:s.map(u=>({left:u.left,right:u.right,top:u.top,height:u.height})),xAxis:s.map((u,C)=>({type:"category",data:d,gridIndex:C,axisLine:{lineStyle:{color:t.gridLineColor}},axisTick:{show:!1},axisLabel:{show:C===s.length-1,color:t.textColorSecondary,fontSize:11},splitLine:{show:!1},boundaryGap:!0,min:"dataMin",max:"dataMax"})),yAxis:s.map((u,C)=>({type:"value",gridIndex:C,position:"right",axisLine:{show:!1},axisTick:{show:!1},axisLabel:{color:t.textColorSecondary,fontSize:11,formatter:w=>Hn(w,u.id)},splitLine:{lineStyle:{color:t.splitLineColor,type:"dashed"}},splitNumber:u.id==="main"?3:2,scale:u.id!=="volume"&&!u.id.includes("volume")})),dataZoom:[{id:dn,type:"inside",xAxisIndex:s.map((u,C)=>C),minValueSpan:10},{id:hn,type:"slider",xAxisIndex:s.map((u,C)=>C),bottom:8,height:20,borderColor:t.gridLineColor,fillerColor:"rgba(24,144,255,0.1)",handleStyle:{color:t.activeColor},textStyle:{color:t.textColorSecondary}}],series:[]},m=[];for(let u=0;u<a.length;u++){const C=a[u];if(s[u].id==="main"&&m.push({type:"candlestick",name:"K线",xAxisIndex:u,yAxisIndex:u,data:n.map(v=>[v.open,v.close,v.low,v.high]),itemStyle:{color:t.upColor,color0:t.downColor,borderColor:t.upColor,borderColor0:t.downColor}}),C.indicators.includes("ma")&&r.forEach((v,p)=>{const I=`ma${v}`,y=n.map(S=>{var _;return((_=S.ma)==null?void 0:_[I])??null});m.push({type:"line",name:`MA${v}`,xAxisIndex:u,yAxisIndex:u,data:y,smooth:!0,symbol:"none",lineStyle:{width:1,color:t.maColors[p]??t.maColors[0]}})}),C.indicators.includes("boll")){const[v,p,I]=t.bollColors;m.push({type:"line",name:"BOLL上轨",xAxisIndex:u,yAxisIndex:u,data:n.map(y=>{var S;return((S=y.boll)==null?void 0:S.upper)??null}),smooth:!0,symbol:"none",lineStyle:{width:1,color:v}},{type:"line",name:"BOLL中轨",xAxisIndex:u,yAxisIndex:u,data:n.map(y=>{var S;return((S=y.boll)==null?void 0:S.mid)??null}),smooth:!0,symbol:"none",lineStyle:{width:1,color:p}},{type:"line",name:"BOLL下轨",xAxisIndex:u,yAxisIndex:u,data:n.map(y=>{var S;return((S=y.boll)==null?void 0:S.lower)??null}),smooth:!0,symbol:"none",lineStyle:{width:1,color:I}})}if(C.indicators.includes("volume")&&m.push({type:"bar",name:"成交量",xAxisIndex:u,yAxisIndex:u,data:n.map((v,p)=>{const I=p>0?h[p-1]:v.open,y=(v.close??0)>=(I??0);return{value:v.volume,itemStyle:{color:y?t.volumeUpColor:t.volumeDownColor}}})}),C.indicators.includes("macd")&&m.push({type:"bar",name:"MACD",xAxisIndex:u,yAxisIndex:u,data:n.map(v=>{var p,I;return{value:((p=v.macd)==null?void 0:p.macd)??null,itemStyle:{color:(((I=v.macd)==null?void 0:I.macd)??0)>=0?t.upColor:t.downColor}}})},{type:"line",name:"DIF",xAxisIndex:u,yAxisIndex:u,data:n.map(v=>{var p;return((p=v.macd)==null?void 0:p.dif)??null}),symbol:"none",lineStyle:{width:1,color:"#1890ff"}},{type:"line",name:"DEA",xAxisIndex:u,yAxisIndex:u,data:n.map(v=>{var p;return((p=v.macd)==null?void 0:p.dea)??null}),symbol:"none",lineStyle:{width:1,color:"#faad14"}}),C.indicators.includes("kdj")&&m.push({type:"line",name:"K",xAxisIndex:u,yAxisIndex:u,data:n.map(v=>{var p;return((p=v.kdj)==null?void 0:p.k)??null}),symbol:"none",lineStyle:{width:1,color:"#1890ff"}},{type:"line",name:"D",xAxisIndex:u,yAxisIndex:u,data:n.map(v=>{var p;return((p=v.kdj)==null?void 0:p.d)??null}),symbol:"none",lineStyle:{width:1,color:"#faad14"}},{type:"line",name:"J",xAxisIndex:u,yAxisIndex:u,data:n.map(v=>{var p;return((p=v.kdj)==null?void 0:p.j)??null}),symbol:"none",lineStyle:{width:1,color:"#722ed1"}}),C.indicators.includes("rsi")&&[6,12,24].forEach((p,I)=>{m.push({type:"line",name:`RSI${p}`,xAxisIndex:u,yAxisIndex:u,data:n.map(y=>{var S;return((S=y.rsi)==null?void 0:S[`rsi${p}`])??null}),symbol:"none",lineStyle:{width:1,color:t.maColors[I]??"#1890ff"}})}),C.indicators.includes("wr")&&[6,10].forEach((p,I)=>{m.push({type:"line",name:`WR${p}`,xAxisIndex:u,yAxisIndex:u,data:n.map(y=>{var S;return((S=y.wr)==null?void 0:S[`wr${p}`])??null}),symbol:"none",lineStyle:{width:1,color:t.maColors[I]??"#1890ff"}})}),C.indicators.includes("bias")&&[6,12,24].forEach((p,I)=>{m.push({type:"line",name:`BIAS${p}`,xAxisIndex:u,yAxisIndex:u,data:n.map(y=>{var S;return((S=y.bias)==null?void 0:S[`bias${p}`])??null}),symbol:"none",lineStyle:{width:1,color:t.maColors[I]??"#1890ff"}})}),C.indicators.includes("cci")&&m.push({type:"line",name:"CCI",xAxisIndex:u,yAxisIndex:u,data:n.map(v=>{var p;return((p=v.cci)==null?void 0:p.cci)??null}),symbol:"none",lineStyle:{width:1,color:"#1890ff"}}),C.indicators.includes("atr")&&m.push({type:"line",name:"ATR",xAxisIndex:u,yAxisIndex:u,data:n.map(v=>{var p;return((p=v.atr)==null?void 0:p.atr)??null}),symbol:"none",lineStyle:{width:1,color:"#1890ff"}}),C.indicators.includes("obv")&&m.push({type:"line",name:"OBV",xAxisIndex:u,yAxisIndex:u,data:n.map(v=>{var p;return((p=v.obv)==null?void 0:p.obv)??null}),symbol:"none",lineStyle:{width:1,color:"#1890ff"}},{type:"line",name:"OBV_MA",xAxisIndex:u,yAxisIndex:u,data:n.map(v=>{var p;return((p=v.obv)==null?void 0:p.obvMa)??null}),symbol:"none",lineStyle:{width:1,color:"#faad14"}}),C.indicators.includes("roc")&&m.push({type:"line",name:"ROC",xAxisIndex:u,yAxisIndex:u,data:n.map(v=>{var p;return((p=v.roc)==null?void 0:p.roc)??null}),symbol:"none",lineStyle:{width:1,color:"#1890ff"}},{type:"line",name:"ROC_MA",xAxisIndex:u,yAxisIndex:u,data:n.map(v=>{var p;return((p=v.roc)==null?void 0:p.signal)??null}),symbol:"none",lineStyle:{width:1,color:"#faad14"}}),C.indicators.includes("dmi")&&m.push({type:"line",name:"+DI",xAxisIndex:u,yAxisIndex:u,data:n.map(v=>{var p;return((p=v.dmi)==null?void 0:p.pdi)??null}),symbol:"none",lineStyle:{width:1,color:t.upColor}},{type:"line",name:"-DI",xAxisIndex:u,yAxisIndex:u,data:n.map(v=>{var p;return((p=v.dmi)==null?void 0:p.mdi)??null}),symbol:"none",lineStyle:{width:1,color:t.downColor}},{type:"line",name:"ADX",xAxisIndex:u,yAxisIndex:u,data:n.map(v=>{var p;return((p=v.dmi)==null?void 0:p.adx)??null}),symbol:"none",lineStyle:{width:1,color:"#1890ff"}},{type:"line",name:"ADXR",xAxisIndex:u,yAxisIndex:u,data:n.map(v=>{var p;return((p=v.dmi)==null?void 0:p.adxr)??null}),symbol:"none",lineStyle:{width:1,color:"#722ed1",type:"dashed"}}),C.indicators.includes("sar")&&m.push({type:"scatter",name:"SAR",xAxisIndex:u,yAxisIndex:u,data:n.map(v=>{var p,I;return{value:((p=v.sar)==null?void 0:p.sar)??null,itemStyle:{color:((I=v.sar)==null?void 0:I.trend)===1?t.upColor:t.downColor}}}),symbol:"circle",symbolSize:4}),C.indicators.includes("kc")){const[v,p,I]=t.kcColors;m.push({type:"line",name:"KC上轨",xAxisIndex:u,yAxisIndex:u,data:n.map(y=>{var S;return((S=y.kc)==null?void 0:S.upper)??null}),smooth:!0,symbol:"none",lineStyle:{width:1,color:v}},{type:"line",name:"KC中轨",xAxisIndex:u,yAxisIndex:u,data:n.map(y=>{var S;return((S=y.kc)==null?void 0:S.mid)??null}),smooth:!0,symbol:"none",lineStyle:{width:1,color:p}},{type:"line",name:"KC下轨",xAxisIndex:u,yAxisIndex:u,data:n.map(y=>{var S;return((S=y.kc)==null?void 0:S.lower)??null}),smooth:!0,symbol:"none",lineStyle:{width:1,color:I}})}}return f.series=m,f}function Fn(e,n,t="safeMerge"){if(!n)return e;if(t==="replace")return n;const l={...e};for(const a of Object.keys(n)){const i=n[a];i!==void 0&&(Array.isArray(i)?l[a]=i:typeof i=="object"&&i!==null?l[a]={...l[a],...i}:l[a]=i)}return l}function pn(e,n){if(e.startsWith("rgba"))return e.replace(/,\s*[\d.]+\)$/,`, ${n})`);if(e.startsWith("rgb("))return e.replace("rgb(","rgba(").replace(")",`, ${n})`);let t=e.replace("#","");t.length===3&&(t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]);const l=parseInt(t.slice(0,2),16),a=parseInt(t.slice(2,4),16),i=parseInt(t.slice(4,6),16);return`rgba(${l}, ${a}, ${i}, ${n})`}function Un(e){const{data:n,theme:t,prevClose:l,containerHeight:a=500}=e;if(n.length===0)return{title:{text:"暂无分时数据",left:"center",top:"center",textStyle:{color:t.textColorSecondary}}};const i=n.map(I=>I.time),c=n.map(I=>I.price),o=n.map(I=>I.avgPrice),r=n.map((I,y)=>{var _;const S=y>0?((_=n[y-1])==null?void 0:_.volume)??0:0;return I.volume-S}),s=c.filter(I=>I>0),d=s.length>0?Math.min(...s):0,h=s.length>0?Math.max(...s):0,m=(h-d)*.1||1,u=c[c.length-1]??0,C=l?u>=l?t.upColor:t.downColor:t.activeColor,w=Math.max(60,a*.15),v=a-w-100;return{animation:!1,backgroundColor:t.backgroundColor,tooltip:{trigger:"axis",axisPointer:{type:"cross",crossStyle:{color:t.crosshairColor},lineStyle:{color:t.crosshairColor,type:"dashed"}},backgroundColor:t.tooltipBgColor,borderColor:t.tooltipBorderColor,textStyle:{color:t.textColor,fontSize:12},formatter:I=>{if(!Array.isArray(I)||I.length===0)return"";const y=I[0].dataIndex,S=n[y];if(!S)return"";const _=l?((S.price-l)/l*100).toFixed(2):"--",P=l&&S.price>=l?t.upColor:t.downColor;return`
2
- <div style="font-weight:bold;margin-bottom:4px">${S.time}</div>
3
- <div>价格: <span style="color:${P};font-weight:500">${b(S.price)}</span></div>
4
- <div>均价: ${b(S.avgPrice)}</div>
5
- <div>涨跌: <span style="color:${P}">${_}%</span></div>
6
- <div>成交量: ${V(S.volume)}</div>
7
- `}},axisPointer:{link:[{xAxisIndex:"all"}]},grid:[{left:60,right:60,top:40,height:v},{left:60,right:60,top:v+70,height:w}],xAxis:[{type:"category",data:i,gridIndex:0,axisLine:{lineStyle:{color:t.gridLineColor}},axisTick:{show:!1},axisLabel:{show:!1},splitLine:{show:!1},boundaryGap:!1},{type:"category",data:i,gridIndex:1,axisLine:{lineStyle:{color:t.gridLineColor}},axisTick:{show:!1},axisLabel:{color:t.textColorSecondary,fontSize:11,formatter:I=>I},splitLine:{show:!1},boundaryGap:!1}],yAxis:[{type:"value",gridIndex:0,position:"right",axisLine:{show:!1},axisTick:{show:!1},axisLabel:{color:t.textColorSecondary,fontSize:11,formatter:I=>b(I)},splitLine:{lineStyle:{color:t.splitLineColor,type:"dashed"}},min:d-m,max:h+m},{type:"value",gridIndex:1,position:"right",axisLine:{show:!1},axisTick:{show:!1},axisLabel:{color:t.textColorSecondary,fontSize:11,formatter:I=>V(I)},splitLine:{lineStyle:{color:t.splitLineColor,type:"dashed"}}}],series:[{type:"line",name:"价格",xAxisIndex:0,yAxisIndex:0,data:c,symbol:"none",lineStyle:{width:1.5,color:C},areaStyle:{color:{type:"linear",x:0,y:0,x2:0,y2:1,colorStops:[{offset:0,color:pn(C,.3)},{offset:1,color:pn(C,.05)}]}}},{type:"line",name:"均价",xAxisIndex:0,yAxisIndex:0,data:o,symbol:"none",lineStyle:{width:1,color:"#faad14",type:"dashed"}},...l?[{type:"line",name:"昨收",xAxisIndex:0,yAxisIndex:0,data:i.map(()=>l),symbol:"none",lineStyle:{width:1,color:t.textColorSecondary,type:"dotted"}}]:[],{type:"bar",name:"成交量",xAxisIndex:1,yAxisIndex:1,data:r.map((I,y)=>{const S=c[y]??0,_=y>0?c[y-1]??S:l??S;return{value:I,itemStyle:{color:S>=_?t.volumeUpColor:t.volumeDownColor}}})}]}}const oe={container:"_container_119o2_1",spinner:"_spinner_119o2_11",dot:"_dot_119o2_16",text:"_text_119o2_43"};function gn({text:e="加载中..."}){return g.jsxs("div",{className:oe.container,children:[g.jsxs("div",{className:oe.spinner,children:[g.jsx("div",{className:oe.dot}),g.jsx("div",{className:oe.dot}),g.jsx("div",{className:oe.dot})]}),g.jsx("span",{className:oe.text,children:e})]})}const fe={container:"_container_1xu4v_1",group:"_group_1xu4v_10",button:"_button_1xu4v_15",active:"_active_1xu4v_30"},Wn=[{label:"分时",periods:[{value:"timeline",label:"分时"},{value:"timeline5",label:"五日"}]},{label:"周期",periods:[{value:"daily",label:"日K"},{value:"weekly",label:"周K"},{value:"monthly",label:"月K"}]},{label:"分钟",periods:[{value:"1",label:"1分"},{value:"5",label:"5分"},{value:"15",label:"15分"},{value:"30",label:"30分"},{value:"60",label:"60分"}]}];function bn({value:e,onChange:n}){return g.jsx("div",{className:fe.container,children:Wn.map(t=>g.jsx("div",{className:fe.group,children:t.periods.map(l=>g.jsx("button",{type:"button",className:`${fe.button} ${e===l.value?fe.active:""}`,onClick:()=>n(l.value),children:l.label},l.value))},t.label))})}const le={container:"_container_1fbmi_1",button:"_button_1fbmi_11",active:"_active_1fbmi_27",divider:"_divider_1fbmi_33"},vn=[{value:"ma",label:"MA",group:"main"},{value:"boll",label:"BOLL",group:"main"},{value:"sar",label:"SAR",group:"main"},{value:"kc",label:"KC",group:"main"}],Rn=[{value:"volume",label:"成交量",group:"sub"},{value:"macd",label:"MACD",group:"sub"},{value:"kdj",label:"KDJ",group:"sub"},{value:"rsi",label:"RSI",group:"sub"},{value:"wr",label:"WR",group:"sub"},{value:"bias",label:"BIAS",group:"sub"},{value:"cci",label:"CCI",group:"sub"},{value:"atr",label:"ATR",group:"sub"},{value:"obv",label:"OBV",group:"sub"},{value:"roc",label:"ROC",group:"sub"},{value:"dmi",label:"DMI",group:"sub"}];function Ae(e){return vn.find(t=>t.value===e)?"main":"sub"}function yn({value:e,onChange:n,maxSubPanes:t=3,maxMainIndicators:l=2}){const a=i=>{const c=Ae(i);if(e.includes(i))n(e.filter(o=>o!==i));else if(c==="main"){const o=e.filter(r=>Ae(r)==="main");if(o.length>=l){const r=o[o.length-1],s=e.filter(d=>d!==r);n([...s,i])}else n([...e,i])}else{const o=e.filter(r=>Ae(r)==="sub");if(o.length>=t){const r=o[o.length-1],s=e.filter(d=>d!==r);n([...s,i])}else n([...e,i])}};return g.jsxs("div",{className:le.container,children:[vn.map(i=>g.jsx("button",{type:"button",className:`${le.button} ${e.includes(i.value)?le.active:""}`,onClick:()=>a(i.value),children:i.label},i.value)),g.jsx("div",{className:le.divider}),Rn.map(i=>g.jsx("button",{type:"button",className:`${le.button} ${e.includes(i.value)?le.active:""}`,onClick:()=>a(i.value),children:i.label},i.value))]})}const N={container:"_container_2tswg_1",group:"_group_2tswg_10",divider:"_divider_2tswg_16",spacer:"_spacer_2tswg_23",iconButton:"_iconButton_2tswg_27",textButton:"_textButton_2tswg_51",active:"_active_2tswg_67"},qn=[{value:"",label:"不复权"},{value:"qfq",label:"前复权"},{value:"hfq",label:"后复权"}];function xn({adjust:e,onAdjustChange:n,canUndo:t,canRedo:l,onUndo:a,onRedo:i,onZoomIn:c,onZoomOut:o,onPanLeft:r,onPanRight:s,onReset:d,onFullscreen:h}){return g.jsxs("div",{className:N.container,children:[g.jsxs("div",{className:N.group,children:[g.jsx("button",{type:"button",className:N.iconButton,onClick:a,disabled:!t,title:"撤销",children:g.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor",children:g.jsx("path",{d:"M12.5 8c-2.65 0-5.05.99-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z"})})}),g.jsx("button",{type:"button",className:N.iconButton,onClick:i,disabled:!l,title:"重做",children:g.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor",children:g.jsx("path",{d:"M18.4 10.6C16.55 8.99 14.15 8 11.5 8c-4.65 0-8.58 3.03-9.96 7.22L3.9 16c1.05-3.19 4.05-5.5 7.6-5.5 1.95 0 3.73.72 5.12 1.88L13 16h9V7l-3.6 3.6z"})})})]}),g.jsx("div",{className:N.divider}),g.jsxs("div",{className:N.group,children:[g.jsx("button",{type:"button",className:N.iconButton,onClick:c,title:"放大",children:g.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor",children:g.jsx("path",{d:"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"})})}),g.jsx("button",{type:"button",className:N.iconButton,onClick:o,title:"缩小",children:g.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor",children:g.jsx("path",{d:"M19 13H5v-2h14v2z"})})})]}),g.jsx("div",{className:N.divider}),g.jsxs("div",{className:N.group,children:[g.jsx("button",{type:"button",className:N.iconButton,onClick:r,title:"向左",children:g.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor",children:g.jsx("path",{d:"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"})})}),g.jsx("button",{type:"button",className:N.iconButton,onClick:s,title:"向右",children:g.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor",children:g.jsx("path",{d:"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"})})})]}),g.jsx("div",{className:N.divider}),g.jsx("div",{className:N.group,children:g.jsx("button",{type:"button",className:N.textButton,onClick:d,title:"重置",children:"重置"})}),g.jsx("div",{className:N.spacer}),g.jsx("div",{className:N.group,children:qn.map(f=>g.jsx("button",{type:"button",className:`${N.textButton} ${e===f.value?N.active:""}`,onClick:()=>n(f.value),children:f.label},f.value))}),h&&g.jsxs(g.Fragment,{children:[g.jsx("div",{className:N.divider}),g.jsx("button",{type:"button",className:N.iconButton,onClick:h,title:"全屏",children:g.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor",children:g.jsx("path",{d:"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"})})})]})]})}const E={container:"_container_1vdme_1",group:"_group_1vdme_11",item:"_item_1vdme_18"};function Zn({data:e,indicators:n,hoverIndex:t,theme:l}){const a=l.maColors,i=l.bollColors,c=l.kcColors,o=x.useMemo(()=>{const f=t??e.length-1,m=e[f];return m||null},[e,t]);if(!o)return null;const r=n.includes("ma"),s=n.includes("boll"),d=n.includes("sar"),h=n.includes("kc");return!r&&!s&&!d&&!h?null:g.jsxs("div",{className:E.container,children:[r&&o.ma&&g.jsx("div",{className:E.group,children:Object.keys(o.ma).filter(f=>{var m,u;return f.startsWith("ma")&&((m=o.ma)==null?void 0:m[f])!==null&&((u=o.ma)==null?void 0:u[f])!==void 0}).map((f,m)=>{var w;const u=(w=o.ma)==null?void 0:w[f],C=a[m]??"#999";return g.jsxs("span",{className:E.item,style:{color:C},children:[f.toUpperCase(),": ",b(u)]},f)})}),s&&o.boll&&g.jsxs("div",{className:E.group,children:[g.jsxs("span",{className:E.item,style:{color:i[0]},children:["UPPER: ",b(o.boll.upper)]}),g.jsxs("span",{className:E.item,style:{color:i[1]},children:["MID: ",b(o.boll.mid)]}),g.jsxs("span",{className:E.item,style:{color:i[2]},children:["LOWER: ",b(o.boll.lower)]})]}),d&&o.sar&&g.jsx("div",{className:E.group,children:g.jsxs("span",{className:E.item,style:{color:o.sar.trend===1?l.upColor:l.downColor},children:["SAR: ",b(o.sar.sar)," ",o.sar.trend===1?"↑":"↓"]})}),h&&o.kc&&g.jsxs("div",{className:E.group,children:[g.jsxs("span",{className:E.item,style:{color:c[0]},children:["KC上: ",b(o.kc.upper)]}),g.jsxs("span",{className:E.item,style:{color:c[1]},children:["KC中: ",b(o.kc.mid)]}),g.jsxs("span",{className:E.item,style:{color:c[2]},children:["KC下: ",b(o.kc.lower)]})]})]})}const ke={title:"_title_p093j_1",label:"_label_p093j_16",value:"_value_p093j_21"},Yn={ma:"MA",boll:"BOLL",sar:"SAR",kc:"KC",volume:"成交量",macd:"MACD",kdj:"KDJ",rsi:"RSI",wr:"WR",bias:"BIAS",cci:"CCI",atr:"ATR",obv:"OBV",roc:"ROC",dmi:"DMI"};function Gn(e,n){if(!n)return"";switch(e){case"volume":return`VOL: ${V(n.volume)}`;case"macd":return n.macd?`DIF: ${b(n.macd.dif)} DEA: ${b(n.macd.dea)} MACD: ${b(n.macd.macd)}`:"";case"kdj":return n.kdj?`K: ${b(n.kdj.k)} D: ${b(n.kdj.d)} J: ${b(n.kdj.j)}`:"";case"rsi":return n.rsi?`RSI6: ${b(n.rsi.rsi6)} RSI12: ${b(n.rsi.rsi12)} RSI24: ${b(n.rsi.rsi24)}`:"";case"wr":return n.wr?`WR6: ${b(n.wr.wr6)} WR10: ${b(n.wr.wr10)}`:"";case"bias":return n.bias?`BIAS6: ${b(n.bias.bias6)} BIAS12: ${b(n.bias.bias12)} BIAS24: ${b(n.bias.bias24)}`:"";case"cci":return n.cci?`CCI: ${b(n.cci.cci)}`:"";case"atr":return n.atr?`ATR: ${b(n.atr.atr)}`:"";case"obv":return n.obv?`OBV: ${V(n.obv.obv)} MA: ${V(n.obv.obvMa)}`:"";case"roc":return n.roc?`ROC: ${b(n.roc.roc)} SIGNAL: ${b(n.roc.signal)}`:"";case"dmi":return n.dmi?`+DI: ${b(n.dmi.pdi)} -DI: ${b(n.dmi.mdi)} ADX: ${b(n.dmi.adx)}`:"";case"sar":return n.sar?`SAR: ${b(n.sar.sar)} ${n.sar.trend===1?"↑":"↓"}`:"";case"kc":return n.kc?`上: ${b(n.kc.upper)} 中: ${b(n.kc.mid)} 下: ${b(n.kc.lower)}`:"";default:return""}}function Jn(e,n){return mn(e,n).map(l=>({top:l.top,height:l.height}))}function Xn({panes:e,data:n,hoverIndex:t,containerHeight:l}){const a=t??n.length-1,i=n[a],c=x.useMemo(()=>Jn(e,l),[e,l]),o=e.slice(1),r=c.slice(1);return o.length===0?null:g.jsx(g.Fragment,{children:o.map((s,d)=>{const h=s.indicators[0];if(!h)return null;const f=Yn[h]||h.toUpperCase(),m=Gn(h,i),u=r[d];return g.jsxs("div",{className:ke.title,style:{top:(u==null?void 0:u.top)??0},children:[g.jsx("span",{className:ke.label,children:f}),m&&g.jsx("span",{className:ke.value,children:m})]},s.id)})})}const R={container:"_container_o8wlo_1",fullscreen:"_fullscreen_o8wlo_12",chartWrapper:"_chartWrapper_o8wlo_23",chart:"_chart_o8wlo_23",error:"_error_o8wlo_34",timelineToolbar:"_timelineToolbar_o8wlo_63",timelineLabel:"_timelineLabel_o8wlo_71",refreshButton:"_refreshButton_o8wlo_77",fullscreenButton:"_fullscreenButton_o8wlo_78"};function q(e){return e==="timeline"||e==="timeline5"}function Qn(){const e=new Date,n=e.getDay();if(n===0||n===6)return!1;const t=e.getHours(),l=e.getMinutes(),a=t*60+l;return a>=570&&a<=690||a>=780&&a<=900}const et=x.forwardRef(function(n,t){const{symbol:l,market:a="A",period:i="daily",adjust:c="qfq",height:o=500,width:r="100%",theme:s="light",indicators:d=["ma","volume","macd"],indicatorOptions:h,showToolbar:f=!0,showPeriodSelector:m=!0,showIndicatorSelector:u=!0,maxSubPanes:C=3,visibleCount:w=60,onDataLoad:v,onPeriodChange:p,onError:I,dataProvider:y,sdkOptions:S,requestOptions:_,autoRefresh:P,panes:Z,echartsOption:j,echartsOptionMerge:K,className:F,style:J}=n,[T,U]=x.useState(i),[H,X]=x.useState(c),[z,$e]=x.useState(d),[Me,_e]=x.useState(!1),[Cn,wn]=x.useState(null),De=x.useRef(null),re=x.useRef(null),W=x.useMemo(()=>He(s),[s]),Le=x.useMemo(()=>Z??fn(z,{maxSubPanes:C}),[Z,z,C]),{data:D,timelineData:me,loading:pe,error:de,refresh:ie}=tn({symbol:l,market:a,period:T,adjust:H,dataProvider:y,sdkOptions:S,requestOptions:_,indicatorOptions:h,indicators:z}),{chartRef:ge,setOption:be,getDataURL:In,bindEvent:Ne}=on(),{canUndo:nt,canRedo:tt,currentState:Y,pushState:Sn,undo:An,redo:kn,reset:se}=ln(),[ve,ot]=x.useState(500);x.useEffect(()=>{const A=ge.current;if(!A)return;const $=()=>{const M=A.offsetHeight;M>0&&ot(M)};$();const L=new ResizeObserver($);return L.observe(A),()=>L.disconnect()},[]);const Te=x.useMemo(()=>P?P===!0?{intervalMs:5e3,onlyTradingTime:!0}:P:null,[P]);x.useEffect(()=>{if(re.current&&(clearInterval(re.current),re.current=null),!Te||!q(T))return;const{intervalMs:A=5e3,onlyTradingTime:$=!0}=Te;return re.current=setInterval(()=>{$&&!Qn()||ie()},A),()=>{re.current&&clearInterval(re.current)}},[Te,T,ie]),x.useEffect(()=>{const A=Ne("mousemove",L=>{const M=L;(M==null?void 0:M.dataIndex)!==void 0&&wn(M.dataIndex)}),$=Ne("mouseout",()=>{wn(null)});return()=>{A(),$()}},[Ne]),x.useEffect(()=>{var L;if(D.length===0&&!pe)return;let A;if(q(T)&&me.length>0){const M=D.length>0?((L=D[0])==null?void 0:L.close)??void 0:void 0;A=Un({data:me,theme:W,prevClose:M??void 0,containerHeight:ve})}else A=Vn({data:D,theme:W,indicators:z,panes:Le,containerHeight:ve,indicatorOptions:h});const $=Fn(A,j,K==null?void 0:K.mode);be($,{replaceMerge:["series","xAxis","yAxis","grid","title"]})},[D,me,W,z,Le,w,ve,j,K,be,pe,T]),x.useEffect(()=>{D.length>0&&v&&v(D)},[D,v]),x.useEffect(()=>{de&&I&&I(de)},[de,I]);const je=x.useCallback(A=>{U(A),se(),p==null||p(A)},[p,se]),lt=x.useCallback(A=>{X(A)},[]),Be=x.useCallback(A=>{$e(A)},[]),B=x.useCallback((A,$,L=!0)=>{const M=Math.max(0,Math.min(100,A)),O=Math.max(M,Math.min(100,$));be({dataZoom:[{id:dn,start:M,end:O},{id:hn,start:M,end:O}]}),L&&Sn({start:M,end:O})},[be,Sn]),ye=x.useCallback(A=>A<=0?{start:0,end:100}:{start:Math.max(0,(A-w)/A*100),end:100},[w]),rt=x.useCallback(()=>{const{start:A,end:$}=Y,L=$-A,M=Math.max(L*.6,5),O=(A+$)/2,Q=Math.max(0,O-M/2),Oe=Math.min(100,O+M/2);B(Q,Oe)},[B,Y]),it=x.useCallback(()=>{const{start:A,end:$}=Y,L=$-A,M=Math.min(L*1.5,100),O=(A+$)/2,Q=Math.max(0,O-M/2),Oe=Math.min(100,O+M/2);B(Q,Oe)},[B,Y]),st=x.useCallback(()=>{const{start:A,end:$}=Y,L=$-A,M=L*.2,O=Math.max(0,A-M),Q=O+L;B(O,Q)},[B,Y]),ct=x.useCallback(()=>{const{start:A,end:$}=Y,L=$-A,M=L*.2,O=Math.min(100,$+M),Q=O-L;B(Q,O)},[B,Y]),at=x.useCallback(()=>{const A=An();A&&B(A.start,A.end,!1)},[An,B]),ut=x.useCallback(()=>{const A=kn();A&&B(A.start,A.end,!1)},[kn,B]),Pe=x.useCallback(()=>{const{start:A,end:$}=ye(D.length);B(A,$,!1),se({start:A,end:$})},[D.length,ye,B,se]),$n=x.useCallback(()=>{De.current&&(document.fullscreenElement?document.exitFullscreen().then(()=>{_e(!1)}).catch(()=>{}):De.current.requestFullscreen().then(()=>{_e(!0)}).catch(()=>{}))},[]);x.useEffect(()=>{const A=()=>{_e(!!document.fullscreenElement)};return document.addEventListener("fullscreenchange",A),()=>{document.removeEventListener("fullscreenchange",A)}},[]),x.useImperativeHandle(t,()=>({refresh:ie,setPeriod:je,setIndicators:Be,zoomTo:(A,$)=>{B(A,$)},resetZoom:Pe,getEchartsInstance:()=>ge.current,exportImage:A=>In({type:A}),getData:()=>D}),[ie,je,Be,Pe,B,ge,In,D]);const Mn=x.useRef("");x.useEffect(()=>{if(q(T)||D.length===0)return;const A=`${l}_${T}_${H}`;if(A===Mn.current)return;Mn.current=A;const{start:$,end:L}=ye(D.length);B($,L,!1),se({start:$,end:L})},[l,T,H,D.length,ye,B,se]);const dt=x.useMemo(()=>({"--kline-bg-color":W.backgroundColor,"--kline-text-color":W.textColor,"--kline-text-secondary":W.textColorSecondary,"--kline-border-color":W.gridLineColor,"--kline-active-color":W.activeColor,"--kline-hover-bg":s==="dark"?"#2a2a2a":"#f5f5f5","--kline-tag-bg":s==="dark"?"#2a2a2a":"#f0f0f0","--kline-text-disabled":s==="dark"?"#444":"#ccc"}),[W,s]),ht=(z.includes("ma")||z.includes("boll"))&&!q(T)&&D.length>0;return g.jsxs("div",{ref:De,className:`${R.container} ${Me?R.fullscreen:""} ${F??""}`,style:{...dt,width:r,height:Me?"100vh":o,...J},children:[m&&g.jsx(bn,{value:T,onChange:je}),f&&!q(T)&&g.jsx(xn,{adjust:H,onAdjustChange:lt,canUndo:nt,canRedo:tt,onUndo:at,onRedo:ut,onZoomIn:rt,onZoomOut:it,onPanLeft:st,onPanRight:ct,onReset:Pe,onFullscreen:$n}),f&&q(T)&&g.jsxs("div",{className:R.timelineToolbar,children:[g.jsx("span",{className:R.timelineLabel,children:"分时走势"}),g.jsx("button",{type:"button",className:R.refreshButton,onClick:ie,disabled:pe,children:"刷新"}),g.jsx("button",{type:"button",className:R.fullscreenButton,onClick:$n,children:Me?"退出全屏":"全屏"})]}),ht&&g.jsx(Zn,{data:D,indicators:z,hoverIndex:Cn,theme:W}),g.jsxs("div",{className:R.chartWrapper,children:[pe&&D.length===0&&g.jsx(gn,{}),de&&D.length===0&&g.jsxs("div",{className:R.error,children:[g.jsxs("span",{children:["加载失败:",de.message]}),g.jsx("button",{type:"button",onClick:ie,children:"重试"})]}),g.jsx("div",{ref:ge,className:R.chart,style:{visibility:D.length>0||me.length>0?"visible":"hidden"}}),!q(T)&&D.length>0&&g.jsx(Xn,{panes:Le,data:D,hoverIndex:Cn,containerHeight:ve})]}),u&&!q(T)&&g.jsx(yn,{value:z,onChange:Be})]})});k.IndicatorSelector=yn,k.KLineChart=et,k.Loading=gn,k.PeriodSelector=bn,k.Toolbar=xn,k.calcATR=Ce,k.calcBIAS=Ye,k.calcBOLL=We,k.calcCCI=Ge,k.calcDMI=Qe,k.calcEMA=G,k.calcKC=nn,k.calcKDJ=Re,k.calcMA=Fe,k.calcMACD=Ue,k.calcOBV=Je,k.calcROC=Xe,k.calcRSI=qe,k.calcSAR=en,k.calcSMA=ne,k.calcWMA=Ve,k.calcWR=Ze,k.darkTheme=ze,k.formatAmount=an,k.formatChange=cn,k.formatDate=zn,k.formatKlineTooltip=un,k.formatNumber=rn,k.formatPercent=sn,k.formatPrice=b,k.formatVolume=V,k.getTheme=He,k.lightTheme=xe,k.useEcharts=on,k.useKlineData=tn,k.useZoomHistory=ln,Object.defineProperty(k,Symbol.toStringTag,{value:"Module"})}));