leek-box-cli 0.2.0 → 0.3.0

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/README.md CHANGED
@@ -197,12 +197,37 @@ Windows 兼容说明: 读取配置时会自动去除记事本等编辑器写入
197
197
  | `pnpm dev` | 使用 tsx 运行源码 |
198
198
  | `pnpm build` | 使用 Vite 构建 `dist/cli.mjs` |
199
199
  | `pnpm preview` | 运行构建产物 |
200
+ | `pnpm mock` | 写入示例自选股, --reset 覆盖 |
200
201
  | `pnpm test` | 使用 Vitest 运行测试 |
201
202
  | `pnpm typecheck` | TypeScript 类型检查 |
202
203
  | `pnpm lint` | Lint 并自动修复 |
203
204
  | `pnpm lint:check` | 仅检查 Lint |
204
205
  | `pnpm fmt` | 格式化代码 |
205
206
  | `pnpm fmt:check` | 检查格式 |
207
+ | `pnpm release` | 交互式发布 (递增版本 + tag) |
208
+
209
+ ## 发布
210
+
211
+ 发布通过 `pnpm release` 完成, 这是基于 Ink 的交互式命令, 负责递增版本, 创建 release commit 和 tag:
212
+
213
+ ```bash
214
+ pnpm release
215
+ ```
216
+
217
+ 执行流程:
218
+
219
+ 1. 校验 `package.json` 无未提交改动, 并读取当前版本.
220
+ 2. 选择发布类型: `patch` (0.0.x), `minor` (0.x.0) 或 `major` (x.0.0); 使用 `↑`/`↓` + `enter`, 或直接按 `1`/`2`/`3`.
221
+ 3. 自动更新 `package.json` 的 `version`, 创建提交 `chore(release): vX.Y.Z` 和标签 `vX.Y.Z` (仅本地).
222
+ 4. 选择是否推送到远端: 默认为 `否, 仅保留本地`, 防止误推送; 选择 `是` 会把当前分支和标签一并推送到 `origin`.
223
+
224
+ 若此处未推送, 之后可手动推送:
225
+
226
+ ```bash
227
+ git push && git push origin vX.Y.Z
228
+ ```
229
+
230
+ 推送 `v*` 标签会触发 GitHub Actions (`.github/workflows/release.yml`): 校验标签与 `package.json` 版本一致, 依次执行 `fmt:check`, `lint:check`, `typecheck`, `test` 和 `build`, 创建 GitHub Release, 并在仓库配置了 `NPM_TOKEN` 时发布到 npm.
206
231
 
207
232
  ## 技术栈
208
233
 
package/dist/cli.mjs CHANGED
@@ -147,13 +147,13 @@ Read about how to prevent this error on https://github.com/vadimdemedes/ink/#isr
147
147
  `))},$p=(e,t)=>{Xp(e,t),Qp(t.flags,e)},em=e=>{console.error([`Unknown flag${e.length>1?`s`:``}`,...e].join(`
148
148
  `))},tm=e=>/^-(?:\d+|\d*\.\d+)(?:e[+-]?\d+)?$/i.test(e),nm=e=>{let t=e.filter(e=>typeof e==`string`&&e.length>1&&e.startsWith(`-`)&&!tm(e));t.length>0&&(em(t),n.exit(2))},rm=(e,t,n,r)=>{let i=t[e],a=!0;if(typeof i.isRequired==`function`&&(a=i.isRequired(n,r),typeof a!=`boolean`))throw TypeError(`Return value for isRequired callback should be of type boolean, but ${typeof a} was returned.`);return(n[e]===void 0||i.isMultiple&&n[e].length===0)&&a},im=e=>{console.error(`Missing required flag${e.length>1?`s`:``}`);for(let t of e)console.error(`\t${Hp(t.key)}${t.shortFlag?`, -${t.shortFlag}`:``}`)},am=(e,t)=>{let{isRequired:r}=e.inputOptions;if(r){if(typeof r==`function`){let e=r(t);if(typeof e!=`boolean`)throw TypeError(`Return value for isRequired callback should be of type boolean, but ${typeof e} was returned.`);if(!e)return}t.length===0&&(console.error(`Missing required input`),n.exit(2))}},om=(e,t,r)=>{let i=[];for(let n of Object.keys(e))e[n].isRequired&&rm(n,e,t,r)&&i.push({key:n,...e[n]});i.length>0&&(im(i),n.exit(2))},sm=e=>{if(!e.startsWith(`@`))return e;let t=e.indexOf(`/`);return t===-1?e:e.slice(t+1)},cm=e=>{if(!e||typeof e!=`object`)return``;let t=typeof e.name==`string`?e.name:``,n=sm(t),{bin:r}=e;return typeof r==`string`?n:r&&typeof r==`object`?Object.keys(r).at(0)??t:t},lm=(e,t)=>{console.error(e),console.error(`Available commands: ${t.join(`, `)}`)},um=(e,t,n,r)=>{if(!t.commands)return{command:void 0,input:e};if(e.length===0)return{command:void 0,input:[]};let i=String(e[0]);if(!t.commands.includes(i)){if(!t.allowUnknownFlags&&i.startsWith(`-`)){let r=t.argv.indexOf(`--`),a=!1;if(r!==-1&&(a=!Iu(t.argv.slice(0,r),n)._.map(String).includes(i)),!a){let t=e.findIndex(e=>typeof e!=`string`||!e.startsWith(`-`));nm(t===-1?e:e.slice(0,t))}}return lm(`Unknown command: ${i}`,t.commands),r(),{command:void 0,input:[]}}return{command:i,input:e.slice(1)}},dm=({pkg:e,getPackage:t,...r},i)=>{let a=Iu(r.argv,i),o=``;if(r.help&&(o=ud((r.help||``).replace(/\t+\n*$/,``)),o.includes(`
149
149
  `)&&(o=pd(o,r.helpIndent)),o=`\n${o}`),r.description!==!1){let{description:e}=r;e&&(e=o?pd(`\n${e}\n`,r.helpIndent):`\n${e}`,o=`${e}${o}`)}o+=`
150
- `;let s=e=>{console.log(o),n.exit(typeof e==`number`?e:2)},c=()=>{console.log(r.version),n.exit(0)};a._.length===0&&r.argv.length===1&&(a.version===!0&&r.autoVersion?c():a.help===!0&&r.autoHelp&&s(0));let{command:l,input:u}=um(a._,r,i,s);if(delete a._,!r.allowUnknownFlags&&!r.commands){let e=u,t=r.argv.indexOf(`--`);t!==-1&&!Object.hasOwn(r.flags,`--`)&&(e=Iu(r.argv.slice(0,t),i)._),nm(e)}let d=ld(a,{exclude:[`--`,/^\w$/]}),f={...d};$p(d,r);for(let e of Object.values(r.flags)){if(Array.isArray(e.aliases))for(let t of e.aliases)delete d[t];delete d[e.shortFlag]}return om(r.flags,d,u),am(r,u),{input:u,command:l,flags:d,unnormalizedFlags:f,get pkg(){return t?t():e},help:o,showHelp:s,showVersion:c}},fm=(e,t={})=>{let r=Kp(e,t),i=dm(r,Yp(r));return n.title=cm(r.pkg),i},pm=e=>{let t,n=new Set,r=(e,r)=>{let i=typeof e==`function`?e(t):e;if(!Object.is(i,t)){let e=t;t=r??(typeof i!=`object`||!i)?i:Object.assign({},t,i),n.forEach(n=>n(t,e))}},i=()=>t,a={setState:r,getState:i,getInitialState:()=>o,subscribe:e=>(n.add(e),()=>n.delete(e))},o=t=e(r,i,a);return a},mm=(e=>e?pm(e):pm),hm=e=>e;function gm(e,t=hm){let n=U.useSyncExternalStore(e.subscribe,U.useCallback(()=>t(e.getState()),[e,t]),U.useCallback(()=>t(e.getInitialState()),[e,t]));return U.useDebugValue(n),n}var _m=e=>{let t=mm(e),n=e=>gm(t,e);return Object.assign(n,t),n},vm=(e=>e?_m(e):_m),ym=[`single`,`double`,`round`,`bold`,`singleDouble`,`doubleSingle`,`classic`,`arrow`],bm=[`red-up`,`green-up`],xm={"red-up":`涨红跌绿`,"green-up":`涨绿跌红`},Sm=`red-up`,Cm={classic:{label:`经典紫蓝`,primary:`magenta`,accent:`blue`,highlight:`cyan`,foreground:`white`},ocean:{label:`海洋青蓝`,primary:`cyan`,accent:`blue`,highlight:`cyan`,foreground:`white`},forest:{label:`森林绿`,primary:`green`,accent:`green`,highlight:`green`,foreground:`white`},sunset:{label:`日落黄红`,primary:`yellow`,accent:`red`,highlight:`yellow`,foreground:`white`},gray:{label:`低调灰`,primary:`gray`,accent:`gray`,highlight:`gray`,foreground:`white`}},wm=Object.keys(Cm),Tm={requestTimeoutMs:{min:1e3,max:6e4,step:1e3},minimumRequestDurationMs:{min:0,max:5e3,step:250},quotePollIntervalMs:{min:1e3,max:6e4,step:500},minuteChartPollIntervalMs:{min:5e3,max:3e5,step:5e3},klinePollIntervalMs:{min:3e4,max:18e5,step:3e4}},Em={themePreset:`classic`,trendColorMode:Sm,borderStyle:`round`,requestTimeoutMs:8e3,minimumRequestDurationMs:0,quotePollIntervalMs:5e3,minuteChartPollIntervalMs:3e4,klinePollIntervalMs:3e5},Dm=(e,t,n)=>Math.min(n,Math.max(t,Math.round(e))),Om=e=>{let t=Dm(e.requestTimeoutMs,Tm.requestTimeoutMs.min,Tm.requestTimeoutMs.max);return{...e,requestTimeoutMs:t,minimumRequestDurationMs:Math.min(t,Dm(e.minimumRequestDurationMs,Tm.minimumRequestDurationMs.min,Tm.minimumRequestDurationMs.max)),quotePollIntervalMs:Dm(e.quotePollIntervalMs,Tm.quotePollIntervalMs.min,Tm.quotePollIntervalMs.max),minuteChartPollIntervalMs:Dm(e.minuteChartPollIntervalMs,Tm.minuteChartPollIntervalMs.min,Tm.minuteChartPollIntervalMs.max),klinePollIntervalMs:Dm(e.klinePollIntervalMs,Tm.klinePollIntervalMs.min,Tm.klinePollIntervalMs.max)}},km=e=>({themePreset:e.themePreset,trendColorMode:e.trendColorMode,borderStyle:e.borderStyle,requestTimeoutMs:e.requestTimeoutMs,minimumRequestDurationMs:e.minimumRequestDurationMs,quotePollIntervalMs:e.quotePollIntervalMs,minuteChartPollIntervalMs:e.minuteChartPollIntervalMs,klinePollIntervalMs:e.klinePollIntervalMs}),Am=(e,t)=>e.themePreset===t.themePreset&&e.trendColorMode===t.trendColorMode&&e.borderStyle===t.borderStyle&&e.requestTimeoutMs===t.requestTimeoutMs&&e.minimumRequestDurationMs===t.minimumRequestDurationMs&&e.quotePollIntervalMs===t.quotePollIntervalMs&&e.minuteChartPollIntervalMs===t.minuteChartPollIntervalMs&&e.klinePollIntervalMs===t.klinePollIntervalMs,jm=(e,t)=>{let n={};return e.themePreset!==t.themePreset&&(n.themePreset=e.themePreset),e.trendColorMode!==t.trendColorMode&&(n.trendColorMode=e.trendColorMode),e.borderStyle!==t.borderStyle&&(n.borderStyle=e.borderStyle),e.requestTimeoutMs!==t.requestTimeoutMs&&(n.requestTimeoutMs=e.requestTimeoutMs),e.minimumRequestDurationMs!==t.minimumRequestDurationMs&&(n.minimumRequestDurationMs=e.minimumRequestDurationMs),e.quotePollIntervalMs!==t.quotePollIntervalMs&&(n.quotePollIntervalMs=e.quotePollIntervalMs),e.minuteChartPollIntervalMs!==t.minuteChartPollIntervalMs&&(n.minuteChartPollIntervalMs=e.minuteChartPollIntervalMs),e.klinePollIntervalMs!==t.klinePollIntervalMs&&(n.klinePollIntervalMs=e.klinePollIntervalMs),n},Mm=vm()(e=>({...Em,updateSettings:t=>e(e=>Om({...km(e),...t})),adjustNumericSetting:(t,n)=>e(e=>{let r=Tm[t],i=Dm(e[t]+r.step*n,r.min,r.max);return Om({...km(e),[t]:i})}),resetSettings:()=>e(Em),hydrateSettings:t=>e(Om(t))}));function Nm(){return Mm(e=>Cm[e.themePreset])}var Pm=vm()(e=>({open:!1,toggle:()=>e(e=>({open:!e.open})),close:()=>e({open:!1})})),Fm=e=>typeof e==`object`&&e?e:void 0,Im=(e,t)=>{let n=Number.parseFloat(e[t]??``);return Number.isFinite(n)?n:0},Lm=e=>{let t=Number.parseFloat(typeof e==`string`||typeof e==`number`?String(e):``);return Number.isFinite(t)?t:0},Rm=e=>{if(!Array.isArray(e))return[];let t=[];for(let n of e){if(typeof n!=`string`)continue;let[e=``,r=``,i=``]=n.split(` `);if(!/^(?:[01]\d|2[0-3])[0-5]\d$/.test(e)||e>`1500`)continue;let a=Number.parseFloat(r);if(!Number.isFinite(a)||a<=0)continue;let o=Number.parseFloat(i);t.push({time:e,price:a,volume:Number.isFinite(o)?o:0})}return t};function zm(e){let t=[];for(let n of e.split(`;`)){let e=/^v_([a-z]{2}\d{6})="([^"]*)"/.exec(n.trim());if(!e)continue;let r=e[2].split(`~`);if(r.length<50)continue;let i=r[1].trim();i&&t.push({code:e[1],name:i,current:Im(r,3),prevClose:Im(r,4),open:Im(r,5),high:Im(r,33),low:Im(r,34),change:Im(r,31),changePercent:Im(r,32),timestamp:r[30],volume:Im(r,36),turnover:Im(r,37),turnoverRate:Im(r,38),amplitude:Im(r,43),marketCap:Im(r,45),volumeRatio:Im(r,49)})}if(t.length===0)throw Error(`未查询到任何行情数据, 请检查股票代码`);return t}function Bm(e,t){return Rm(Fm(Fm(Fm(Fm(e)?.data)?.[t])?.data)?.data)}function Vm(e,t){let n=Fm(Fm(Fm(e)?.data)?.[t])?.data;return Array.isArray(n)?n.flatMap(e=>{let t=Fm(e),n=t?.date;if(typeof n!=`string`||!/^\d{8}$/.test(n))return[];let r=`${n.slice(0,4)}-${n.slice(4,6)}-${n.slice(6,8)}`,i=Lm(t?.prec);return[{sessionDate:r,points:Rm(t?.data).map(e=>({...e,sessionDate:r,prevClose:i}))}]}).sort((e,t)=>e.sessionDate.localeCompare(t.sessionDate)).slice(-5).flatMap(e=>e.points):[]}function Hm(e,t,n=`day`,r=`qfq`){let i=Fm(Fm(Fm(e)?.data)?.[t]),a=i?.[`${r}${n}`],o=Array.isArray(a)&&a.length>0?a:i?.[n];if(!Array.isArray(o))return[];let s=[];for(let e of o){if(!Array.isArray(e))continue;let[t,n,r,i,a,o]=e;if(typeof t!=`string`||!/^\d{4}-\d{2}-\d{2}$/.test(t))continue;let c=Lm(n),l=Lm(r),u=Lm(i),d=Lm(a),f=Lm(o);[c,l,u,d].some(e=>e<=0)||s.push({date:t,open:c,close:l,high:u,low:d,volume:Math.max(0,f)})}return s}var Um=(e,t)=>e<=0?Promise.resolve():t?.aborted?Promise.reject(t.reason):new Promise((n,r)=>{let i=setTimeout(()=>{t?.removeEventListener(`abort`,a),n()},e),a=()=>{clearTimeout(i),r(t?.reason)};t?.addEventListener(`abort`,a,{once:!0})}),Wm=async(e,t)=>{let{requestTimeoutMs:n,minimumRequestDurationMs:r}=Mm.getState(),i=AbortSignal.timeout(n),a=e?AbortSignal.any([e,i]):i,o=Date.now(),s=await t(a);return await Um(r-(Date.now()-o),e),s};function Gm(e){let t=e.trim().toUpperCase();if(t=t.replace(/\.(SH|SZ|BJ)$/,``),t=t.replace(/^(SH|SZ|BJ)/,``),!/^\d{6}$/.test(t))return;let n;if(t.startsWith(`6`)||t.startsWith(`5`))n=`sh`;else if(t.startsWith(`0`)||t.startsWith(`1`)||t.startsWith(`3`))n=`sz`;else if(t.startsWith(`4`)||t.startsWith(`8`)||t.startsWith(`92`))n=`bj`;else return;return`${n}${t}`}async function Km(e,t){return e.length===0?[]:Wm(t,async t=>{let n=await fetch(`https://qt.gtimg.cn/q=${e.join(`,`)}`,{signal:t});if(!n.ok)throw Error(`行情接口请求失败: HTTP ${n.status}`);let r=await n.arrayBuffer();return zm(new TextDecoder(`gbk`).decode(r))})}async function qm(e,t){return Wm(t,async t=>{let n=await fetch(`https://web.ifzq.gtimg.cn/appstock/app/minute/query?code=${e}`,{signal:t});if(!n.ok)throw Error(`分时接口请求失败: HTTP ${n.status}`);return Bm(await n.json(),e)})}async function Jm(e,t){return Wm(t,async t=>{let n=await fetch(`https://web.ifzq.gtimg.cn/appstock/app/day/query?code=${e}`,{signal:t});if(!n.ok)throw Error(`五日行情接口请求失败: HTTP ${n.status}`);return Vm(await n.json(),e)})}var Ym=e=>{let t=new Map;for(let n of[...e].sort((e,t)=>e.date.localeCompare(t.date))){let e=n.date.slice(0,4),r=t.get(e);if(!r){t.set(e,{...n});continue}r.date=n.date,r.close=n.close,r.high=Math.max(r.high,n.high),r.low=Math.min(r.low,n.low),r.volume+=n.volume}return[...t.values()]};async function Xm(e,t){return Wm(t.signal,async n=>{let r=t.period===`year`?`month`:t.period,i=t.period===`year`?`hfq`:`qfq`,a=t.period===`year`?t.barCount*12:t.barCount,o=encodeURIComponent(`${e},${r},,,${a},${i}`),s=await fetch(`https://web.ifzq.gtimg.cn/appstock/app/fqkline/get?param=${o}`,{signal:n});if(!s.ok)throw Error(`K 线行情接口请求失败: HTTP ${s.status}`);let c=Hm(await s.json(),e,r,i);return(t.period===`year`?Ym(c):c).slice(-t.barCount)})}function Zm(e){return e instanceof Error?e.message:String(e)}var Qm={day:{barCount:60},week:{barCount:60},month:{barCount:60},year:{barCount:30}},$m=`intraday`,eh=e=>e!==`intraday`&&e!==`five-day`,th={fetchIntraday:qm,fetchFiveDay:Jm,fetchHistorical:Xm};function nh(e=th){return vm()((t,n)=>({stock:void 0,period:$m,status:`loading`,points:[],open:(e,n)=>t({stock:{code:e,name:n},period:$m,status:`loading`,points:[],errorMessage:void 0}),close:()=>t({stock:void 0}),setPeriod:e=>{n().period!==e&&t({period:e,status:`loading`,points:[],errorMessage:void 0})},refreshChart:async(r,i,a)=>{try{let o;if(i===`intraday`)o=await e.fetchIntraday(r,a);else if(i===`five-day`)o=await e.fetchFiveDay?.(r,a);else if(eh(i)){let t=Qm[i];o=await e.fetchHistorical?.(r,{period:i,...t,signal:a})}if(!o)throw Error(`${i===`five-day`?`五日`:`K 线`}行情数据源不可用`);if(n().stock?.code!==r||n().period!==i||a?.aborted)return;t({status:`ready`,points:o,errorMessage:void 0})}catch(e){if(n().stock?.code!==r||n().period!==i||a?.aborted)return;t({status:`error`,errorMessage:Zm(e)})}}}))}var rh=nh();function ih(){let e=Pm(e=>e.open),t=rh(e=>e.stock!==void 0);return e||t}var ah=z((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.fragment`);function r(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.Fragment=n,e.jsx=r,e.jsxs=r})),Q=z(((e,t)=>{t.exports=ah()}))();function $({bright:e=!1,color:t,...n}){let r=ih(),i=Nm(),a=!e&&r;return(0,Q.jsx)(ml,{...n,color:t??i.foreground,dimColor:a})}function oh({title:e,bright:t=!1,top:n,left:r,right:i}){return(0,Q.jsxs)(pl,{position:`absolute`,top:n,left:r,right:i,children:[(0,Q.jsx)($,{bright:t,children:`|`}),e,(0,Q.jsx)($,{bright:t,children:`|`})]})}function sh(e){let{bright:t=!1,fullScreen:n,title:r,extra:i,footer:a,children:o}=e,{width:s,height:c,backgroundColor:l}=e,{columns:u,rows:d}=_u(),f=Mm(e=>e.borderStyle),p=Nm();return(0,Q.jsxs)(pl,{flexDirection:`column`,width:n?u:s,height:n?d:c,borderStyle:f,borderColor:p.primary,borderDimColor:t===!1,children:[r?(0,Q.jsx)(oh,{title:r,bright:t,top:-1,left:1}):void 0,i?(0,Q.jsx)(oh,{title:i,bright:t,top:-1,right:1}):void 0,(0,Q.jsx)(pl,{flexGrow:1,flexDirection:`column`,padding:1,backgroundColor:l,children:o}),a]})}var ch=new Intl.DateTimeFormat(`en-CA`,{timeZone:`Asia/Shanghai`,year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`,hour12:!1});function lh(e,t){let n=ch.formatToParts(e),r=e=>n.find(t=>t.type===e)?.value??``,i=`${r(`year`)}-${r(`month`)}-${r(`day`)}`,a=`${r(`hour`)}:${r(`minute`)}`;switch(t){case`date-time`:return`${i} ${a}:${r(`second`)}`;case`date`:return i;case`time`:return`${a}:${r(`second`)}`;case`hour-minute`:return a}}var uh={"date-time":1e3,date:6e4,time:1e3,"hour-minute":6e4};function dh(e){let[t,n]=(0,U.useState)(()=>new Date);return(0,U.useEffect)(()=>{let t=setInterval(()=>n(new Date),uh[e]);return()=>clearInterval(t)},[e]),lh(t,e)}function fh(e){let{hint:t,bright:n=!1}=e,r=dh(`date-time`),i=Nm();return(0,Q.jsxs)(pl,{justifyContent:`space-between`,paddingX:1,backgroundColor:n?i.accent:`gray`,children:[(0,Q.jsx)(pl,{flexShrink:0,children:t&&(0,Q.jsx)($,{bright:n,color:`white`,children:t})}),(0,Q.jsx)(pl,{flexShrink:0,children:(0,Q.jsx)($,{bright:n,color:`white`,children:r})})]})}function ph(e){let{title:t,extra:n,width:r,children:i}=e,{rows:a,columns:o}=_u();return(0,Q.jsx)(pl,{position:`absolute`,top:0,left:0,width:o,height:a,flexDirection:`column`,alignItems:`center`,justifyContent:`center`,children:(0,Q.jsx)(sh,{bright:!0,title:t,extra:n,width:r,backgroundColor:`black`,footer:(0,Q.jsx)(fh,{bright:!0}),children:i})})}var mh=[{type:`theme`,label:`主题色系`,description:`界面配色`},{type:`trendColor`,label:`涨跌颜色`,description:`选择涨绿或跌绿`},{type:`border`,label:`卡片边框`,description:`边框样式`},{type:`numeric`,label:`请求超时`,description:`单次请求最长等待`,setting:`requestTimeoutMs`},{type:`numeric`,label:`请求最短耗时`,description:`避免加载闪烁`,setting:`minimumRequestDurationMs`},{type:`numeric`,label:`看板刷新间隔`,description:`自选股票看板自动刷新频率`,setting:`quotePollIntervalMs`},{type:`numeric`,label:`分时图刷新间隔`,description:`分时与五日图自动刷新频率`,setting:`minuteChartPollIntervalMs`},{type:`numeric`,label:`K 线刷新间隔`,description:`日/周/月/年 K 线自动刷新频率`,setting:`klinePollIntervalMs`}],hh=(e,t,n)=>e[(e.indexOf(t)+n+e.length)%e.length]??t,gh=e=>e===0?`关闭`:e<1e3?`${e} ms`:e%6e4==0?`${e/6e4} 分钟`:e%1e3==0?`${e/1e3} 秒`:`${(e/1e3).toFixed(2)} 秒`;function _h(){let[e,t]=(0,U.useState)(0),n=ih(),r=Mm(),i=t=>{let n=mh[e];n&&(n.type===`theme`?r.updateSettings({themePreset:hh(wm,r.themePreset,t)}):n.type===`trendColor`?r.updateSettings({trendColorMode:hh(bm,r.trendColorMode,t)}):n.type===`border`?r.updateSettings({borderStyle:hh(ym,r.borderStyle,t)}):r.adjustNumericSetting(n.setting,t))};mu((e,n)=>{n.ctrl||(n.upArrow?t(e=>(e-1+mh.length)%mh.length):n.downArrow?t(e=>(e+1)%mh.length):n.leftArrow?i(-1):n.rightArrow||n.return?i(1):e===`d`&&r.resetSettings())},{isActive:!n});let a=mh.map((t,n)=>({label:t.label,description:t.description,selected:n===e,value:t.type===`theme`?Cm[r.themePreset].label:t.type===`trendColor`?xm[r.trendColorMode]:t.type===`border`?r.borderStyle:gh(r[t.setting])}));return{overlayOpen:n,appearanceRows:a.slice(0,3),requestRows:a.slice(3)}}function vh({rows:e,highlight:t}){return e.map(e=>(0,Q.jsxs)(pl,{justifyContent:`space-between`,children:[(0,Q.jsxs)($,{color:e.selected?`black`:void 0,backgroundColor:e.selected?t:void 0,children:[e.selected?`› `:` `,e.label,(0,Q.jsxs)($,{color:`gray`,backgroundColor:e.selected?t:void 0,children:[`(`,e.description,`)`]})]}),(0,Q.jsx)($,{color:e.selected?t:`gray`,children:e.value})]},e.label))}function yh({title:e,hint:t}){let n=Nm(),{overlayOpen:r,appearanceRows:i,requestRows:a}=_h();return(0,Q.jsxs)(sh,{fullScreen:!0,bright:!r,title:(0,Q.jsx)($,{color:n.primary,children:e}),footer:(0,Q.jsx)(fh,{hint:t,bright:!r}),children:[(0,Q.jsx)($,{color:n.primary,children:`外观`}),(0,Q.jsx)(vh,{rows:i,highlight:n.highlight}),(0,Q.jsxs)(pl,{marginTop:1,flexDirection:`column`,children:[(0,Q.jsx)($,{color:n.primary,children:`请求与刷新`}),(0,Q.jsx)(vh,{rows:a,highlight:n.highlight})]}),(0,Q.jsx)(pl,{marginTop:1,flexDirection:`column`,children:(0,Q.jsx)($,{color:`gray`,children:`请求最短耗时用于避免加载状态闪烁, 且不会超过请求超时.`})})]})}var bh=vm()(e=>({screen:`stock-list`,goTo:t=>e({screen:t})})),xh={error:`red`,warning:`yellow`,success:`green`};function Sh({tone:e,msg:t}){return(0,Q.jsx)($,{bold:!0,color:xh[e],children:t})}function Ch({prompt:e,onSubmit:t,placeholder:n}){let r=ih(),[i,a]=(0,U.useState)(``),[o,s]=(0,U.useState)(!1);return mu((e,n)=>{o||(n.return?(s(!0),t(i)):n.backspace||n.delete?a(e=>e.slice(0,-1)):!n.ctrl&&!n.meta&&e&&a(t=>t+e))},{isActive:!r&&!o}),(0,Q.jsx)(pl,{children:(0,Q.jsxs)($,{children:[e,o?(0,Q.jsx)($,{color:`green`,children:i}):(0,Q.jsxs)($,{children:[i,(0,Q.jsx)($,{color:`gray`,children:`█`}),!i&&n?n:void 0]})]})})}function wh({tone:e,msg:t,to:n,onReturn:r}){let i=bh(e=>e.goTo);return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(Sh,{tone:e,msg:t}),(0,Q.jsx)(ql,{}),(0,Q.jsx)(Ch,{prompt:`按 Enter 返回操作页...`,onSubmit:()=>{r?.(),i(n)}})]})}var Th=e=>e>0?e.toFixed(2):`--`,Eh=e=>`${e>0?`+`:``}${e.toFixed(2)}`,Dh=e=>`${e>0?`+`:``}${e.toFixed(2)}%`,Oh=(e,t=Sm)=>e===0?`gray`:e>0==(t===`green-up`)?`green`:`red`,kh=e=>e>=1e4?`${(e/1e4).toFixed(1)}万手`:e>0?`${Math.round(e)}手`:`--`,Ah=e=>e>=1e4?`${(e/1e4).toFixed(2)}亿`:e>0?`${e.toFixed(1)}万`:`--`,jh=e=>e>0?`${e.toFixed(2)}%`:`--`,Mh=e=>e>0?e.toFixed(2):`--`,Nh=e=>e>0?`${e.toFixed(2)}亿`:`--`,Ph=/^(?:sh|sz|bj)\d{6}$/,Fh=(e,t)=>{if(typeof e!=`object`||!e)throw Error(`第 ${t+1} 项不是对象`);let n=e;if(typeof n.code!=`string`||!Ph.test(n.code))throw Error(`第 ${t+1} 项 code 无效`);if(typeof n.name!=`string`||n.name.trim()===``)throw Error(`第 ${t+1} 项 name 无效`);if(typeof n.addedAt!=`string`||!Number.isFinite(Date.parse(n.addedAt)))throw Error(`第 ${t+1} 项 addedAt 无效`);return{code:n.code,name:n.name,addedAt:n.addedAt}};function Ih(e){if(!Array.isArray(e))throw Error(`stocks 不是数组`);let t=e.map(Fh),n=new Set;for(let[e,r]of t.entries()){if(n.has(r.code))throw Error(`第 ${e+1} 项 code 重复: ${r.code}`);n.add(r.code)}return t}var Lh=25,Rh=2e3,zh=3e4,Bh=e=>typeof e==`object`&&!!e&&!Array.isArray(e),Vh=e=>{if(typeof e!=`string`||!wm.includes(e))throw Error(`theme.preset 无效`);return e},Hh=e=>{if(e===void 0)return Sm;if(typeof e!=`string`||!bm.includes(e))throw Error(`theme.trendColorMode 无效`);return e},Uh=(e,t,n)=>{if(typeof e!=`number`||!Number.isInteger(e)||e<n.min||e>n.max)throw Error(`${t} 无效`);return e};function Wh(e){if(!Bh(e))throw Error(`顶层数据不是对象`);let t=e.theme;if(!Bh(t))throw Error(`theme 无效`);let n=t.borderStyle;if(typeof n!=`string`||!ym.includes(n))throw Error(`theme.borderStyle 无效`);let r=e.request;if(!Bh(r))throw Error(`request 无效`);let i=Uh(r.timeoutMs,`request.timeoutMs`,Tm.requestTimeoutMs),a=Uh(r.minimumDurationMs,`request.minimumDurationMs`,Tm.minimumRequestDurationMs);if(a>i)throw Error(`request.minimumDurationMs 不能大于 request.timeoutMs`);return{theme:{preset:Vh(t.preset),trendColorMode:Hh(t.trendColorMode),borderStyle:n},request:{timeoutMs:i,minimumDurationMs:a,quotePollIntervalMs:Uh(r.quotePollIntervalMs,`request.quotePollIntervalMs`,Tm.quotePollIntervalMs),minuteChartPollIntervalMs:Uh(r.minuteChartPollIntervalMs,`request.minuteChartPollIntervalMs`,Tm.minuteChartPollIntervalMs),klinePollIntervalMs:Uh(r.klinePollIntervalMs,`request.klinePollIntervalMs`,Tm.klinePollIntervalMs)},stocks:Ih(e.stocks)}}function Gh(e){return{themePreset:e.theme.preset,trendColorMode:e.theme.trendColorMode,borderStyle:e.theme.borderStyle,requestTimeoutMs:e.request.timeoutMs,minimumRequestDurationMs:e.request.minimumDurationMs,quotePollIntervalMs:e.request.quotePollIntervalMs,minuteChartPollIntervalMs:e.request.minuteChartPollIntervalMs,klinePollIntervalMs:e.request.klinePollIntervalMs}}var Kh=[{code:`sz002156`,name:`富通微电`},{code:`sh600584`,name:`长电科技`},{code:`sh688825`,name:`长鑫科技`}],qh=()=>{let e=new Date().toISOString();return Kh.map(t=>({...t,addedAt:e}))},Jh=(e,t)=>({theme:{preset:e.themePreset,trendColorMode:e.trendColorMode,borderStyle:e.borderStyle},request:{timeoutMs:e.requestTimeoutMs,minimumDurationMs:e.minimumRequestDurationMs,quotePollIntervalMs:e.quotePollIntervalMs,minuteChartPollIntervalMs:e.minuteChartPollIntervalMs,klinePollIntervalMs:e.klinePollIntervalMs},stocks:t}),Yh=()=>{let e=n.env.XDG_CONFIG_HOME;if(e)return C(e,`leek-box-cli`);if(n.platform===`win32`){let e=n.env.APPDATA;if(e)return C(e,`leek-box-cli`)}return C(c(),`.config`,`leek-box-cli`)};function Xh(){return C(Yh(),`settings.json`)}var Zh=e=>e.charCodeAt(0)===65279?e.slice(1):e,Qh=async e=>{try{return JSON.parse(Zh(await A(e,`utf8`)))}catch(e){if(e.code===`ENOENT`)return;throw e}},$h=async()=>{let e=Xh();try{let t=await Qh(e);return t===void 0?void 0:Wh(t)}catch(t){let n=t instanceof Error?t.message:String(t);throw Error(`设置文件损坏: ${e} (${n})`)}},eg=async e=>{let t=Wh(e),r=Xh();await k(S(r),{recursive:!0});let i=`${r}.${n.pid}.${D()}.tmp`;try{await P(i,`${JSON.stringify(t,null,2)}\n`,`utf8`),await j(i,r)}finally{await M(i,{force:!0})}},tg=e=>new Promise(t=>setTimeout(t,e)),ng=e=>{try{return n.kill(e,0),!0}catch(e){return e.code!==`ESRCH`}},rg=async e=>{let t;try{t=await A(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return!0;throw e}let n=!1;try{let e=JSON.parse(t);if(!Bh(e)||typeof e.token!=`string`||typeof e.pid!=`number`||!Number.isInteger(e.pid)||e.pid<=0||typeof e.createdAt!=`number`||!Number.isFinite(e.createdAt))throw Error(`lock metadata 无效`);n=!ng(e.pid)||Date.now()-e.createdAt>=zh}catch{try{let t=await N(e);n=Date.now()-t.mtimeMs>=Rh}catch(e){if(e.code===`ENOENT`)return!0;throw e}}if(!n)return!1;try{return await A(e,`utf8`)===t&&(await M(e),!0)}catch(e){if(e.code===`ENOENT`)return!0;throw e}},ig=async(e,t)=>{let r=`${e}.${n.pid}.${D()}.tmp`;try{await P(r,t,{encoding:`utf8`,flag:`wx`}),await O(r,e)}finally{await M(r,{force:!0})}};async function ag(e){let t=Xh(),r=`${t}.lock`,i=D(),a=JSON.stringify({token:i,pid:n.pid,createdAt:Date.now()});await k(S(t),{recursive:!0});let o=Date.now(),s=!1;for(;!s;)try{await ig(r,a),s=!0}catch(e){if(e.code!==`EEXIST`)throw e;if(await rg(r))continue;if(Date.now()-o>=Rh)throw Error(`设置文件正被其他进程占用, 请稍后重试`);await tg(Lh)}let c;try{c={ok:!0,value:await e()}}catch(e){c={ok:!1,error:e}}let l;try{await A(r,`utf8`)===a&&await M(r)}catch(e){e.code!==`ENOENT`&&(l=e)}if(!c.ok)throw c.error;if(l)throw l;return c.value}var og=async()=>{let e=await $h();if(e)return e;let t=Jh(Em,qh());return await eg(t),t};async function sg(){return await $h()??ag(og)}var cg=sg;async function lg(e){await ag(async()=>{let t=await og();await eg(Jh({...Gh(t),...e},t.stocks))})}async function ug(){return(await cg()).stocks}async function dg(e){let t=Ih(e);return ag(async()=>{let e=await og(),n=new Set(e.stocks.map(e=>e.code)),r=t.filter(e=>!n.has(e.code));return r.length>0&&await eg({...e,stocks:[...e.stocks,...r]}),r.length})}async function fg(e){let t=new Set(e);return t.size===0?0:ag(async()=>{let e=await og(),n=e.stocks.filter(e=>!t.has(e.code)),r=e.stocks.length-n.length;return r>0&&await eg({...e,stocks:n}),r})}function pg(e){let t=e.trim();if(t===`y`||t===`Y`)return`y`;if(t===`n`||t===`N`)return`n`}var mg=`错误: 必须选择 y (是) 或 n (否).`,hg={stocksAdd:dg,fetchQuotes:Km,normalizeCode:Gm,now:()=>new Date().toISOString()},gg={error:void 0,resetToken:0},_g=e=>{e(e=>({codeInput:{error:`无法识别股票代码, 请用英文逗号分隔 6 位股票代码.`,resetToken:e.codeInput.resetToken+1}}))};function vg(e=hg){let t=0,n=e=>e!==t;return vm()((r,i)=>({step:{type:`input-code`},codeInput:gg,confirmInput:gg,reset:()=>{t+=1,r({step:{type:`input-code`},codeInput:gg,confirmInput:gg})},handleCodeInput:async i=>{let a=t,o=i.split(`,`).map(e=>e.trim());if(o.length===0||o.some(e=>e===``)){_g(r);return}let s=o.map(t=>e.normalizeCode(t));if(s.some(e=>e===void 0)){_g(r);return}let c=[...new Set(s)];r(e=>({codeInput:{error:void 0,resetToken:e.codeInput.resetToken+1}})),r({step:{type:`checking`,codes:c}});try{let t=await e.fetchQuotes(c);if(n(a))return;let i=new Map(t.map(e=>[e.code,e])),o=c.filter(e=>!i.has(e));if(o.length>0){r({step:{type:`error`,message:`未找到股票代码: ${o.join(`, `)}.`}});return}r({step:{type:`confirm`,entries:c.map(e=>{let t=i.get(e);return{code:e,name:t.name,current:t.current}})}})}catch(e){n(a)||r({step:{type:`error`,message:Zm(e)}})}},handleConfirm:async a=>{let o=pg(a);if(!o){r(e=>({confirmInput:{error:mg,resetToken:e.confirmInput.resetToken+1}}));return}if(r(e=>({confirmInput:{error:void 0,resetToken:e.confirmInput.resetToken+1}})),o===`n`){r({step:{type:`done`,message:`已取消.`}});return}let s=t,c=i().step;if(c.type===`confirm`){r({step:{type:`saving`,entries:c.entries}});try{let t=e.now(),i=await e.stocksAdd(c.entries.map(e=>({code:e.code,name:e.name,addedAt:t})));if(n(s))return;if(i===0){r({step:{type:`already-exists`,entries:c.entries}});return}r({step:{type:`done`,message:`已添加 ${i} 个股票, ${c.entries.length-i} 个已在自选股中.`}})}catch(e){n(s)||r({step:{type:`error`,message:`写入自选股失败: ${Zm(e)}`}})}}}}))}var yg=vg();function bg(){let e=yg(e=>e.step),t=yg(e=>e.codeInput),n=yg(e=>e.confirmInput),r=yg(e=>e.handleCodeInput),i=yg(e=>e.handleConfirm),a=yg(e=>e.reset);return(0,U.useEffect)(()=>{a()},[a]),{step:e,codeInput:t,confirmInput:n,handleCodeInput:r,handleConfirm:i,reset:a}}function xg({title:e,hint:t}){let n=ih(),r=Nm(),{step:i,codeInput:a,confirmInput:o,handleCodeInput:s,handleConfirm:c,reset:l}=bg(),u;switch(i.type){case`input-code`:u=(0,Q.jsxs)(Q.Fragment,{children:[a.error&&(0,Q.jsx)($,{color:`red`,children:a.error}),(0,Q.jsx)(Ch,{prompt:`请输入股票代码, 用英文逗号分隔: `,placeholder:(0,Q.jsx)($,{color:`gray`,children:`支持 600000, sh600000, 600000.SH 等写法`}),onSubmit:s},`code-${a.resetToken}`)]});break;case`checking`:u=(0,Q.jsxs)($,{color:`cyan`,children:[`正在验证股票代码: `,i.codes.join(`, `),`...`]});break;case`confirm`:u=(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)($,{color:`cyan`,children:`找到以下股票:`}),i.entries.map(e=>(0,Q.jsxs)($,{children:[e.name,` (`,e.code,`), 现价 `,Th(e.current)]},e.code)),o.error&&(0,Q.jsx)($,{color:`red`,children:o.error}),(0,Q.jsx)(Ch,{prompt:`确认添加到自选股? (y/n): `,onSubmit:c},`confirm-${o.resetToken}`)]});break;case`saving`:u=(0,Q.jsxs)($,{color:`cyan`,children:[`正在添加 `,i.entries.length,` 个股票...`]});break;case`already-exists`:u=(0,Q.jsx)(wh,{tone:`warning`,msg:`${i.entries.map(e=>`${e.name} (${e.code})`).join(`, `)} 已在自选股中.`,to:`stock-add`,onReturn:l});break;case`done`:u=(0,Q.jsx)(wh,{tone:`success`,msg:i.message,to:`stock-add`,onReturn:l});break;case`error`:u=(0,Q.jsx)(wh,{tone:`error`,msg:i.message,to:`stock-add`,onReturn:l})}return(0,Q.jsx)(sh,{fullScreen:!0,bright:!n,title:(0,Q.jsx)($,{color:r.primary,children:e}),footer:(0,Q.jsx)(fh,{hint:t,bright:!n}),children:u})}function Sg(e){let{segments:t,selected:n,bright:r=!1}=e;return(0,Q.jsx)($,{bright:r,inverse:n,children:t.map((e,t)=>(0,Q.jsx)($,{bright:r,color:e.color,children:e.text},t))})}var Cg=(e,t)=>e+` `.repeat(Math.max(0,t.width-Nt(e))),wg=e=>e.map((t,n)=>({...t,text:n<e.length-1?`${t.text} `:t.text})),Tg=new Map([{key:`code`,kind:`code`,title:`代码`,width:9,render:e=>e.code},{key:`name`,kind:`name`,title:`名称`,width:9,render:e=>e.name},{key:`current`,kind:`value`,title:`现价`,width:8,render:e=>Th(e.current),color:(e,t)=>Oh(e.change,t)},{key:`changePercent`,kind:`changePercent`,title:`涨跌幅`,width:9,render:e=>Dh(e.changePercent),color:(e,t)=>Oh(e.changePercent,t),suspendedText:`停牌`},{key:`change`,kind:`value`,title:`涨跌额`,width:8,render:e=>Eh(e.change),color:(e,t)=>Oh(e.change,t)},{key:`open`,kind:`value`,title:`今开`,width:7,render:e=>Th(e.open)},{key:`prevClose`,kind:`value`,title:`昨收`,width:7,render:e=>Th(e.prevClose)},{key:`high`,kind:`value`,title:`最高`,width:7,render:e=>Th(e.high)},{key:`low`,kind:`value`,title:`最低`,width:7,render:e=>Th(e.low)},{key:`volume`,kind:`value`,title:`成交量`,width:11,render:e=>kh(e.volume)},{key:`turnover`,kind:`value`,title:`成交额`,width:9,render:e=>Ah(e.turnover)},{key:`turnoverRate`,kind:`value`,title:`换手率`,width:7,render:e=>jh(e.turnoverRate)},{key:`amplitude`,kind:`value`,title:`振幅`,width:7,render:e=>jh(e.amplitude)},{key:`volumeRatio`,kind:`value`,title:`量比`,width:7,render:e=>Mh(e.volumeRatio)},{key:`marketCap`,kind:`value`,title:`总市值`,width:10,render:e=>Nh(e.marketCap)}].map(e=>[e.key,e])),Eg=e=>wg(e.map(e=>({text:Cg(e.title,e),color:`gray`}))),Dg=(e,t,n=Sm)=>{let r=t.current<=0;return wg(e.map(e=>({text:Cg(r?e.suspendedText??`--`:e.render(t),e),color:r||!e.color?`gray`:e.color(t,n)})))},Og=(e,t,n)=>wg(e.map(e=>({text:Cg(e.kind===`code`?t:e.kind===`name`?n:e.kind===`changePercent`?`无数据`:`--`,e),color:`gray`}))),kg=[`name`,`code`,`current`,`changePercent`,`change`,`open`,`high`,`low`,`volume`,`turnover`,`turnoverRate`,`marketCap`],Ag=[`open`,`prevClose`,`high`,`low`,`volume`,`turnover`,`turnoverRate`,`amplitude`,`volumeRatio`,`marketCap`],jg=kg.reduce((e,t)=>{let n=Tg.get(t);return n&&e.push(n),e},[]),Mg=Ag.reduce((e,t)=>{let n=Tg.get(t);return n&&e.push(n),e},[]),Ng=()=>jg.reduce((e,t)=>e+t.width,0)+(jg.length-1),Pg=()=>Mg.reduce((e,t)=>e+t.width,0)+(Mg.length-1);function Fg(e,{enabled:t=!0,intervalMs:n,restartKey:r,onError:i}){let a=(0,U.useRef)(e),o=(0,U.useRef)(n),s=(0,U.useRef)(i),c=(0,U.useRef)({});(0,U.useEffect)(()=>{a.current=e,o.current=n,s.current=i},[e,n,i]);let l=(0,U.useCallback)(()=>c.current.refresh?.(),[]);return(0,U.useEffect)(()=>{if(!t){c.current={};return}let e=!0,n=!1,r,i,l=()=>{r&&=(clearTimeout(r),void 0)},u=(t=o.current)=>{!e||n||r||(r=setTimeout(()=>{r=void 0,f()},t))},d=async()=>{if(!e||n)return;let t=Date.now();n=!0,i=new AbortController;let r=i;try{await a.current(r.signal)}catch(e){r.signal.aborted||s.current?.(e)}finally{i===r&&(i=void 0),n=!1,u(Math.max(0,o.current-(Date.now()-t)))}},f=()=>void d();return c.current={refresh:()=>{n||(l(),f())},reschedule:()=>{n||(l(),u())}},f(),()=>{e=!1,c.current={},l(),i?.abort()}},[t,r]),(0,U.useEffect)(()=>{c.current.reschedule?.()},[n]),{refresh:l}}var Ig={fetchQuotes:Km,loadStocks:ug},Lg=(e,t)=>Math.min(Math.max(e,0),t-1),Rg=(e,t,n,r,i)=>{let a=Lg(t+e,n),o=Math.max(0,n-i);return e===1&&a>=r+i?Math.min(a-i+1,o):e===-1&&a<r?a:Math.min(r,o)},zg=(e,t)=>{if(!t)return 0;let n=e.findIndex(e=>e.code===t);return n<0?0:n},Bg=(e,t)=>e.code===t.code&&e.name===t.name&&e.current===t.current&&e.prevClose===t.prevClose&&e.open===t.open&&e.high===t.high&&e.low===t.low&&e.change===t.change&&e.changePercent===t.changePercent&&e.timestamp===t.timestamp&&e.volume===t.volume&&e.turnover===t.turnover&&e.turnoverRate===t.turnoverRate&&e.amplitude===t.amplitude&&e.marketCap===t.marketCap&&e.volumeRatio===t.volumeRatio;function Vg(e=Ig){return vm()((t,n)=>({step:{type:`loading`},selectedCode:void 0,scrollOffset:0,refreshQuotes:async n=>{try{let r=await e.loadStocks();if(n?.aborted)return;if(r.length===0){t({step:{type:`empty`},selectedCode:void 0,scrollOffset:0});return}let i=await e.fetchQuotes(r.map(e=>e.code),n);if(n?.aborted)return;t(e=>{let t=e.step.type===`table`?e.step.rows:[],n=new Map(t.filter(e=>e.kind===`quote`).map(e=>[e.code,e.quote])),a=new Map(i.map(e=>{let t=n.get(e.code);return[e.code,t&&Bg(t,e)?t:e]})),o=r.map(e=>{let t=a.get(e.code);return t?{kind:`quote`,code:e.code,name:t.name,quote:t}:{kind:`missing`,code:e.code,name:e.name}}),s=zg(t,e.selectedCode),c=e.selectedCode?o.findIndex(t=>t.code===e.selectedCode):-1,l=c>=0?c:Lg(s,o.length),u=Math.max(0,s-e.scrollOffset);return{step:{type:`table`,rows:o},selectedCode:o[l]?.code,scrollOffset:Math.max(0,l-u)}})}catch(e){if(n?.aborted)return;let r=Zm(e);t(e=>e.step.type===`table`?{step:{...e.step,errorLine:r}}:{step:{type:`error`,message:r}})}},moveSelection:(e,r)=>{let{step:i,selectedCode:a,scrollOffset:o}=n();if(i.type!==`table`||i.rows.length===0)return;let s=zg(i.rows,a),c=Lg(s+e,i.rows.length);t({selectedCode:i.rows[c]?.code,scrollOffset:Rg(e,s,i.rows.length,o,r)})}}))}var Hg=Vg(),Ug=(e,t,n)=>{if(e<=n)return{start:0,end:e};let r=e-n,i=Math.min(Math.max(t,0),r);return{start:i,end:i+n}};function Wg(){let e=(0,U.useRef)(null),t=bu(e),n=Hg(e=>e.step),r=Hg(e=>e.selectedCode),i=Hg(e=>e.scrollOffset),a=Mm(e=>e.quotePollIntervalMs),o=Hg(e=>e.moveSelection),s=ih(),c=t.hasMeasured?Math.max(1,Math.floor(t.height)):1,l=n.type===`table`?Ug(n.rows.length,i,c):{start:0,end:0};(0,U.useEffect)(()=>{Hg.setState({step:{type:`loading`}})},[]);let{refresh:u}=Fg(e=>Hg.getState().refreshQuotes(e),{intervalMs:a});return mu((e,t)=>{if(!t.ctrl){if(t.upArrow)o(-1,c);else if(t.downArrow)o(1,c);else if(t.return){let e=Hg.getState();if(e.step.type!==`table`||!e.selectedCode)return;let t=e.step.rows.find(t=>t.code===e.selectedCode);t&&rh.getState().open(t.code,t.name)}else e===`r`&&u()}},{isActive:!s}),{rowsRef:e,step:n,selectedCode:r,window:l}}function Gg({title:e,hint:t}){let n=ih(),r=Nm(),i=Mm(e=>e.trendColorMode),{rowsRef:a,step:o,selectedCode:s,window:c}=Wg(),l;switch(o.type){case`loading`:l=(0,Q.jsx)($,{color:`cyan`,children:`正在获取行情数据...`});break;case`empty`:l=(0,Q.jsx)($,{color:`yellow`,children:`自选股为空, 按 esc 打开菜单添加自选股.`});break;case`error`:l=(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)($,{color:`red`,children:o.message}),(0,Q.jsx)($,{color:`gray`,children:`行情接口异常, 稍后自动重试`})]});break;case`table`:l=(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(Sg,{segments:Eg(jg)}),(0,Q.jsx)(pl,{ref:a,flexDirection:`column`,flexGrow:1,overflow:`hidden`,children:o.rows.slice(c.start,c.end).map(e=>(0,Q.jsx)(Sg,{segments:e.kind===`quote`?Dg(jg,e.quote,i):Og(jg,e.code,e.name),selected:e.code===s},e.code))}),o.errorLine?(0,Q.jsxs)($,{color:`yellow`,children:[`刷新失败: `,o.errorLine,`, 稍后自动重试`]}):void 0]})}return(0,Q.jsx)(sh,{fullScreen:!0,bright:!n,title:(0,Q.jsx)($,{color:r.primary,children:e}),footer:(0,Q.jsx)(fh,{hint:t,bright:!n}),children:l})}var Kg={loadStocks:ug,stocksRemove:fg},qg={error:void 0,resetToken:0};function Jg(e=Kg){let t=0,n=e=>e!==t;return vm()((r,i)=>({step:{type:`loading`},indexInput:qg,confirmInput:qg,loadEntries:async()=>{let i=++t;r({step:{type:`loading`},indexInput:qg,confirmInput:qg});try{let t=await e.loadStocks();if(n(i))return;r({step:t.length===0?{type:`error`,message:`自选股为空, 请先添加股票.`}:{type:`select`,entries:t}})}catch(e){n(i)||r({step:{type:`error`,message:Zm(e)}})}},handleChoice:e=>{let t=i().step;if(t.type!==`select`)return;let n=e.split(`,`).map(e=>e.trim()),a=n.map(e=>Number(e));if(n.length===0||n.some(e=>e===``)||a.some(e=>!Number.isInteger(e)||e<1||e>t.entries.length)){r(e=>({indexInput:{error:`无效的序号, 请输入 1-${t.entries.length}, 用英文逗号分隔.`,resetToken:e.indexInput.resetToken+1}}));return}let o=[...new Set(a)].map(e=>t.entries[e-1]);r(e=>({indexInput:{error:void 0,resetToken:e.indexInput.resetToken+1}})),r({step:{type:`confirm`,entries:o}})},handleConfirm:async a=>{let o=pg(a);if(!o){r(e=>({confirmInput:{error:mg,resetToken:e.confirmInput.resetToken+1}}));return}if(r(e=>({confirmInput:{error:void 0,resetToken:e.confirmInput.resetToken+1}})),o===`n`){r({step:{type:`done`,message:`已取消.`}});return}let s=t,c=i().step;if(c.type===`confirm`){r({step:{type:`removing`,entries:c.entries}});try{let t=await e.stocksRemove(c.entries.map(e=>e.code));if(n(s))return;if(t===0){r({step:{type:`error`,message:`所选 ${c.entries.length} 个条目已不在自选股中.`}});return}r({step:{type:`done`,message:`已删除 ${t} 个股票, ${c.entries.length-t} 个条目已不在自选股中.`}})}catch(e){n(s)||r({step:{type:`error`,message:`删除失败: ${Zm(e)}`}})}}}}))}var Yg=Jg();function Xg(){let e=Yg(e=>e.step),t=Yg(e=>e.indexInput),n=Yg(e=>e.confirmInput),r=Yg(e=>e.handleChoice),i=Yg(e=>e.handleConfirm),a=Yg(e=>e.loadEntries);return(0,U.useEffect)(()=>{a()},[a]),{step:e,indexInput:t,confirmInput:n,handleChoice:r,handleConfirm:i,loadEntries:a}}function Zg({title:e,hint:t}){let n=ih(),r=Nm(),{step:i,indexInput:a,confirmInput:o,handleChoice:s,handleConfirm:c,loadEntries:l}=Xg(),u;switch(i.type){case`loading`:u=(0,Q.jsx)($,{color:`cyan`,children:`正在加载自选股...`});break;case`select`:u=(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)($,{color:`gray`,children:`自选股列表:`}),i.entries.map((e,t)=>(0,Q.jsxs)($,{children:[t+1,`) `,e.name,` (`,e.code,`) `,(0,Q.jsxs)($,{color:`gray`,children:[`(`,e.addedAt.slice(0,10),`)`]})]},e.code)),a.error&&(0,Q.jsx)($,{color:`red`,children:a.error}),(0,Q.jsx)(ql,{}),(0,Q.jsx)(Ch,{prompt:`请输入要删除的序号, 用英文逗号分隔: `,onSubmit:s})]});break;case`confirm`:u=(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)($,{color:`yellow`,children:`确定删除以下股票?`}),i.entries.map(e=>(0,Q.jsxs)($,{children:[e.name,` (`,e.code,`)`]},e.code)),o.error&&(0,Q.jsx)($,{color:`red`,children:o.error}),(0,Q.jsx)(Ch,{prompt:`确认删除? (y/n): `,onSubmit:c},`confirm-${o.resetToken}`)]});break;case`removing`:u=(0,Q.jsxs)($,{color:`cyan`,children:[`正在删除 `,i.entries.length,` 个股票...`]});break;case`done`:u=(0,Q.jsx)(wh,{tone:`success`,msg:i.message,to:`stock-remove`,onReturn:l});break;case`error`:u=(0,Q.jsx)(wh,{tone:`error`,msg:i.message,to:`stock-remove`,onReturn:l})}return(0,Q.jsx)(sh,{fullScreen:!0,bright:!n,title:(0,Q.jsx)($,{color:r.primary,children:e}),footer:(0,Q.jsx)(fh,{hint:t,bright:!n}),children:u})}var Qg={"stock-list":{Component:Gg,title:`自选股票看板`,description:`自选股票看板 (默认, 自动刷新)`,hint:`菜单(esc) 刷新(r) 选择(↑/↓) 详情(enter) 退出(q)`,menuLabel:`自选股票看板`},"stock-add":{Component:xg,title:`添加自选股`,description:`添加自选股`,hint:`菜单(esc) 退出(q)`,menuLabel:`添加自选股`},"stock-remove":{Component:Zg,title:`删除自选股`,description:`删除自选股`,hint:`菜单(esc) 退出(q)`,menuLabel:`删除自选股`},settings:{Component:yh,title:`设置`,description:`配置主题, 涨跌颜色与请求参数`,hint:`菜单(esc) 选择(↑/↓) 调整(←/→/enter) 默认值(d) 退出(q)`,menuLabel:`设置`}},$g=Object.keys(Qg),e_=e=>e!==void 0&&Object.hasOwn(Qg,e),t_=e=>e_(e)?e:`stock-list`,n_=[...Object.entries(Qg).map(([e,t],n)=>({label:`${n+1}) ${t.menuLabel}`,screen:e})),{label:`${Object.keys(Qg).length+1}) 退出程序`,screen:void 0}],r_=45;function i_(){let e=bh(e=>e.goTo),t=Pm(e=>e.close),{exit:n}=hu(),[r,i]=(0,U.useState)(0),a=r=>{r.screen?(t(),e(r.screen)):n()};return mu((e,t)=>{if(t.upArrow)i(e=>(e+n_.length-1)%n_.length);else if(t.downArrow)i(e=>(e+1)%n_.length);else if(t.return)a(n_[r]);else if(/^[1-9]$/.test(e)){let t=Number(e)-1,n=n_[t];if(!n)return;i(t),a(n)}}),{width:r_,menuItems:n_,highlight:r}}function a_(){let{highlight:e,width:t,menuItems:n}=i_(),r=Nm();return(0,Q.jsx)(ph,{title:(0,Q.jsx)($,{bright:!0,color:r.primary,children:`菜单`}),width:t,children:n.map((t,n)=>(0,Q.jsxs)($,{bright:!0,color:n===e?`black`:void 0,backgroundColor:n===e?r.highlight:void 0,children:[n===e?`> `:` `,t.label]},t.label))})}var o_=e=>{if(!/^\d{4}$/.test(e))return;let t=Number(e.slice(0,2))*60+Number(e.slice(2))-570;return t<0?0:t>120?t-90:t},s_=(e,t)=>{if(t<=0)return[];let n=Array.from({length:t},()=>({sum:0,count:0,minPrice:0,maxPrice:0,lastPrice:0,volume:0})),r=-1,i=0;for(let a of e){let e=o_(a.time);if(e===void 0)continue;let o=Math.min(t-1,Math.floor(e/240*t)),s=n[o];s.sum+=a.price,s.count+=1,s.minPrice=s.count===1?a.price:Math.min(s.minPrice,a.price),s.maxPrice=s.count===1?a.price:Math.max(s.maxPrice,a.price),s.lastPrice=a.price,s.volume+=Math.max(0,a.volume-i),i=a.volume,r=Math.max(r,o)}let a=[],o=0;for(let e=0;e<t;e++){let t=n[e];t.count>0?(o=t.lastPrice,a.push({avgPrice:t.sum/t.count,maxPrice:t.maxPrice,minPrice:t.minPrice,lastPrice:t.lastPrice,volume:t.volume})):e<r?a.push({avgPrice:o,maxPrice:o,minPrice:o,lastPrice:o,volume:0}):a.push({avgPrice:0,maxPrice:0,minPrice:0,lastPrice:0,volume:0})}return a},c_=e=>`date`in e,l_=e=>`sessionDate`in e,u_=e=>!c_(e)&&!l_(e),d_=(e,t)=>{let n=new Map;for(let t of e){let e=n.get(t.sessionDate)??[];e.push(t),n.set(t.sessionDate,e)}let r=[...n.entries()].sort(([e],[t])=>e.localeCompare(t));if(r.length===0)return Array.from({length:t},()=>({avgPrice:0,maxPrice:0,minPrice:0,lastPrice:0,volume:0}));let i=[];for(let e=0;e<r.length;e++){let n=Math.floor(e/r.length*t),a=Math.floor((e+1)/r.length*t)-n;if(a<=0)continue;let o=r[e][1].sort((e,t)=>e.time.localeCompare(t.time));i.push(...s_(o,a))}return i},f_=(e,t)=>e.length===0?Array.from({length:t},()=>({avgPrice:0,maxPrice:0,minPrice:0,lastPrice:0,volume:0})):Array.from({length:t},(n,r)=>{let i=t<=1?0:r/(t-1)*(e.length-1),a=e[Math.floor(i)],o=e[Math.min(Math.ceil(i),e.length-1)],s=i-Math.floor(i),c=a.close+(o.close-a.close)*s,l=e[Math.round(i)];return{avgPrice:c,maxPrice:Math.max(a.high,o.high),minPrice:Math.min(a.low,o.low),lastPrice:c,volume:l.volume}}),p_=(e,t)=>t<3?1<<t+e*3:1<<6+e,m_=e=>String.fromCharCode(10240+e),h_=e=>{let{points:t,period:n,prevClose:r,width:i,priceHeight:a,volumeHeight:o,trendColorMode:s=Sm}=e,c=t.filter(u_),l=t.filter(l_),u=t.filter(c_),d=n===`intraday`,f=n===`five-day`,p=d?s_(c,i):f?d_(l,i):f_(u,i),m=d?r:f?l[0]?.prevClose:u[0]?.close,h=d?r:void 0,g=1/0,_=-1/0;for(let e of p)e.avgPrice<=0||(g=Math.min(g,e.minPrice),_=Math.max(_,e.maxPrice));h!==void 0&&(g=Math.min(g,h),_=Math.max(_,h)),Number.isFinite(g)||(g=0,_=1),_===g&&(_+=1);let v=a*4,y=i*2,b=e=>Math.round((_-e)/(_-g)*(v-1)),x=(e,t)=>t===void 0?`gray`:Oh(e-t,s),S=x(p.map(e=>e.lastPrice).filter(e=>e>0).at(-1)??0,m),C=p.map((e,t)=>{if(d)return S;if(e.lastPrice<=0)return`gray`;let n=p[t+1]?.lastPrice;if(n!==void 0&&n>0)return x(n,e.lastPrice);let r=p[t-1]?.lastPrice;return x(e.lastPrice,r!==void 0&&r>0?r:void 0)}),w=Array.from({length:a+o+1},()=>Array.from({length:i},()=>({ch:` `,color:void 0}))),T=Array.from({length:a},()=>new Uint16Array(i)),E=-1;for(let e=0;e<i;e++)p[e].avgPrice>0&&(E=e);let D;for(let e=0;e<y;e++){let t=e/2;if(t>E){D=void 0;continue}let n=p[Math.floor(t)];if(n.avgPrice<=0){D=void 0;continue}let r=p[Math.min(Math.floor(t)+1,i-1)],a=b(r.avgPrice>0?n.lastPrice+(r.lastPrice-n.lastPrice)*(t-Math.floor(t)):n.lastPrice),o=Math.floor(e/2),s=T[Math.floor(a/4)];if(s[o]=s[o]|p_(e%2,a%4),D!==void 0){let t=Math.min(D,a),n=Math.max(D,a);for(let r=t+1;r<n;r++){let t=T[Math.floor(r/4)];t[o]=t[o]|p_(e%2,r%4)}}D=a}let O=Array.from({length:a},()=>new Uint16Array(i));if(h!==void 0){let e=b(h),t=Math.floor(e/4);for(let n=0;n<y;n++){if(n%3==2)continue;let r=Math.floor(n/2);if(T[t][r]!==0)continue;let i=O[t];i[r]=i[r]|p_(n%2,e%4)}}for(let e=0;e<a;e++)for(let t=0;t<i;t++){let n=T[e][t]|O[e][t];n!==0&&(w[e][t]={ch:m_(n),color:T[e][t]===0?`gray`:C[t]})}let k=Array.from({length:o},()=>new Uint16Array(i)),A=Math.max(...p.map(e=>e.volume),0);for(let e=0;e<i;e++){let t=p[e];if(t.volume<=0||A<=0)continue;let n=o*4,r=Math.max(1,Math.round(t.volume/A*n));for(let t=n-r;t<n;t++){let n=k[Math.floor(t/4)];n[e]=n[e]|p_(0,t%4)|p_(1,t%4)}}let j=Array.from({length:i},()=>void 0),M=m;for(let e=0;e<i;e++){let t=p[e];t.lastPrice<=0||(j[e]=M===void 0?`gray`:Oh(t.lastPrice-M,s),M=t.lastPrice)}for(let e=0;e<o;e++)for(let t=0;t<i;t++){let n=k[e][t];n!==0&&(w[a+e][t]={ch:m_(n),color:j[t]})}let N=[],P=(e,t)=>Math.max(0,Math.min(i-t.length,e-Math.floor(t.length/2)));if(d)N.push({col:0,labelCol:0,label:`09:30`},{col:Math.floor(i/2),labelCol:Math.max(0,Math.floor((i-11)/2)),label:`11:30/13:00`},{col:i-1,labelCol:Math.max(0,i-5),label:`15:00`});else if(f&&l.length>0){let e=[...new Set(l.map(e=>e.sessionDate))].sort();for(let t=0;t<e.length;t++){let n=Math.min(i-1,Math.floor((t+.5)/e.length*i)),r=e[t].slice(5);N.push({col:n,labelCol:P(n,r),label:r})}}else if(u.length>0){let e=e=>n===`year`?e.date.slice(0,4):n===`month`?e.date.slice(0,7):n===`week`?e.date.slice(2):e.date.slice(5),t=e(u[0]),r=e(u[Math.floor((u.length-1)/2)]),a=e(u.at(-1));N.push({col:0,labelCol:0,label:t},{col:Math.floor(i/2),labelCol:Math.max(0,Math.floor((i-r.length)/2)),label:r},{col:i-1,labelCol:Math.max(0,i-a.length),label:a})}for(let{col:e}of N)for(let t=0;t<a+o;t++)w[t][e].ch===` `&&(w[t][e]={ch:`┊`,color:`gray`});let F=w[a+o],I=(e,t)=>{for(let n=0;n<t.length&&e+n<i;n++)F[e+n]={ch:t[n],color:`gray`}};for(let e of N)I(e.labelCol,e.label);return w},g_=9,__=4;function v_({points:e,period:t,prevClose:n,width:r,priceHeight:i=g_,volumeHeight:a=__,bright:o=!1,trendColorMode:s}){let c=h_({points:e,period:t,prevClose:n,width:r,priceHeight:i,volumeHeight:a,trendColorMode:s});return(0,Q.jsx)(pl,{flexDirection:`column`,children:c.map((e,t)=>{let n=[];for(let t of e){let e=n.at(-1);e&&e.color===t.color?e.text+=t.ch:n.push({text:t.ch,color:t.color})}return(0,Q.jsx)($,{bright:o,children:n.map((e,t)=>(0,Q.jsx)($,{bright:o,color:e.color,children:e.text},t))},t)})})}var y_=new Map([[`sh`,`沪`],[`sz`,`深`],[`bj`,`北`]]);function b_({code:e,bright:t=!1}){let n=e.slice(0,2).toLowerCase(),r=y_.get(n);if(r)return(0,Q.jsx)($,{bright:t,color:`white`,backgroundColor:`red`,children:r})}var x_=[{key:`1`,value:`intraday`,label:`分时`},{key:`2`,value:`five-day`,label:`五日`},{key:`3`,value:`day`,label:`日K`},{key:`4`,value:`week`,label:`周K`},{key:`5`,value:`month`,label:`月K`},{key:`6`,value:`year`,label:`年K`}];function S_(){let e=rh(e=>e.stock),t=rh(e=>e.period),n=rh(e=>e.status),r=rh(e=>e.points),i=rh(e=>e.errorMessage),a=Mm(e=>e.minuteChartPollIntervalMs),o=Mm(e=>e.klinePollIntervalMs),s=Pm(e=>e.open),c=Hg(t=>{if(t.step.type!==`table`)return;let n=t.step.rows.find(t=>t.code===e?.code);return n?.kind===`quote`?n.quote:void 0});if(mu((e,t)=>{if(t.ctrl)return;let n=x_.find(t=>t.key===e);n&&rh.getState().setPeriod(n.value)},{isActive:e!==void 0&&!s}),Fg(async n=>{e&&await rh.getState().refreshChart(e.code,t,n)},{enabled:e!==void 0,intervalMs:t===`intraday`||t===`five-day`?a:o,restartKey:e?`${e.code}:${t}`:void 0}),e)return{stock:e,quote:c,suspended:c?c.current<=0:!1,period:t,status:n,points:r,errorMessage:i}}var C_=Pg()+4+6,w_=C_-4;function T_(){let e=Mm(e=>e.trendColorMode),t=S_();if(!t)return;let{stock:n,quote:r,suspended:i,period:a,status:o,points:s,errorMessage:c}=t,l=x_.find(e=>e.value===a)?.label??``;return(0,Q.jsxs)(ph,{title:(0,Q.jsxs)($,{bright:!0,children:[(0,Q.jsx)(b_,{code:n.code,bright:!0}),(0,Q.jsx)($,{children:` `}),(0,Q.jsx)($,{bright:!0,children:n.name}),(0,Q.jsx)($,{children:` `}),(0,Q.jsx)($,{bright:!0,color:`gray`,children:n.code}),(0,Q.jsx)($,{children:` `}),(0,Q.jsx)($,{bright:!0,color:!r||i?`gray`:Oh(r.change,e),children:r?Th(r.current):`--`}),(0,Q.jsx)($,{children:` `}),(0,Q.jsx)($,{bright:!0,color:!r||i?`gray`:Oh(r.changePercent,e),children:r?i?`停牌`:Dh(r.changePercent):`--`}),(0,Q.jsx)($,{children:` `}),(0,Q.jsx)($,{bright:!0,color:!r||i?`gray`:Oh(r.change,e),children:r?Eh(r.change):`--`})]}),extra:(0,Q.jsx)($,{bright:!0,children:x_.map((e,t)=>(0,Q.jsxs)($,{bright:!0,color:e.value===a?`cyan`:`gray`,children:[t>0?` `:``,`[`,e.key,`]`,e.label]},e.value))}),width:C_,children:[(0,Q.jsxs)(pl,{flexDirection:`column`,children:[(0,Q.jsx)(Sg,{bright:!0,segments:Eg(Mg)}),(0,Q.jsx)(Sg,{bright:!0,segments:r?Dg(Mg,r,e):Og(Mg,n.code,n.name)})]}),(0,Q.jsx)(pl,{marginTop:1,height:14,children:o===`loading`?(0,Q.jsxs)($,{bright:!0,color:`gray`,children:[`正在获取`,l,`行情...`]}):o===`error`?(0,Q.jsx)($,{bright:!0,color:`red`,children:c}):s.length===0?(0,Q.jsxs)($,{bright:!0,color:`gray`,children:[`暂无`,l,`行情数据`]}):(0,Q.jsx)(v_,{bright:!0,points:s,period:a,prevClose:r?.prevClose,trendColorMode:e,width:w_})})]})}var E_=Ng()+4;function D_({children:e}){let{columns:t,rows:n}=_u(),r=t>=E_,i=n>=26;return r&&i?e:(0,Q.jsxs)(pl,{width:t,height:n,flexDirection:`column`,alignItems:`center`,justifyContent:`center`,children:[(0,Q.jsx)($,{color:`yellow`,children:`终端尺寸过小:`}),(0,Q.jsxs)(pl,{children:[(0,Q.jsx)($,{color:r?`green`:`red`,children:`宽度 = ${t}`}),(0,Q.jsx)($,{children:` `}),(0,Q.jsx)($,{color:i?`green`:`red`,children:`高度 = ${n}`})]}),(0,Q.jsx)(pl,{height:1}),(0,Q.jsx)($,{color:`gray`,children:`所需最小尺寸:`}),(0,Q.jsx)($,{color:`gray`,children:`宽度 = ${E_} 高度 = 26`})]})}function O_(){let{exit:e}=hu(),t=ih(),n=bh(e=>e.screen),r=Pm(e=>e.open),i=Pm(e=>e.toggle),a=rh(e=>e.stock),o=rh(e=>e.close),s=Qg[n];return mu((n,r)=>{r.escape?a?o():i():n===`q`&&!t&&e()}),(0,Q.jsxs)(D_,{children:[(0,Q.jsx)(s.Component,{title:s.title,hint:s.hint}),r&&(0,Q.jsx)(a_,{}),a&&(0,Q.jsx)(T_,{})]})}var k_=100,A_=e=>Object.keys(e).length>0;async function j_(e){let t=await sg();Mm.getState().hydrateSettings(Gh(t));let n={},r,i,a=Promise.resolve(),o=async()=>{if(!A_(n))return;let t=n;n={};try{await lg(t),r=void 0}catch(i){n={...t,...n},r=i;try{e(i)}catch{}}},s=()=>(i&&=(clearTimeout(i),void 0),a=a.then(o),a),c=()=>{i&&clearTimeout(i),i=setTimeout(()=>{i=void 0,s()},k_)},l=Mm.subscribe((e,t)=>{Am(e,t)||(n={...n,...jm(e,t)},c())}),u,d=async()=>(l(),await s(),r&&A_(n)&&await o(),r===void 0);return{stop:()=>u??=d()}}var M_=`用法
150
+ `;let s=e=>{console.log(o),n.exit(typeof e==`number`?e:2)},c=()=>{console.log(r.version),n.exit(0)};a._.length===0&&r.argv.length===1&&(a.version===!0&&r.autoVersion?c():a.help===!0&&r.autoHelp&&s(0));let{command:l,input:u}=um(a._,r,i,s);if(delete a._,!r.allowUnknownFlags&&!r.commands){let e=u,t=r.argv.indexOf(`--`);t!==-1&&!Object.hasOwn(r.flags,`--`)&&(e=Iu(r.argv.slice(0,t),i)._),nm(e)}let d=ld(a,{exclude:[`--`,/^\w$/]}),f={...d};$p(d,r);for(let e of Object.values(r.flags)){if(Array.isArray(e.aliases))for(let t of e.aliases)delete d[t];delete d[e.shortFlag]}return om(r.flags,d,u),am(r,u),{input:u,command:l,flags:d,unnormalizedFlags:f,get pkg(){return t?t():e},help:o,showHelp:s,showVersion:c}},fm=(e,t={})=>{let r=Kp(e,t),i=dm(r,Yp(r));return n.title=cm(r.pkg),i},pm=e=>{let t,n=new Set,r=(e,r)=>{let i=typeof e==`function`?e(t):e;if(!Object.is(i,t)){let e=t;t=r??(typeof i!=`object`||!i)?i:Object.assign({},t,i),n.forEach(n=>n(t,e))}},i=()=>t,a={setState:r,getState:i,getInitialState:()=>o,subscribe:e=>(n.add(e),()=>n.delete(e))},o=t=e(r,i,a);return a},mm=(e=>e?pm(e):pm),hm=e=>e;function gm(e,t=hm){let n=U.useSyncExternalStore(e.subscribe,U.useCallback(()=>t(e.getState()),[e,t]),U.useCallback(()=>t(e.getInitialState()),[e,t]));return U.useDebugValue(n),n}var _m=e=>{let t=mm(e),n=e=>gm(t,e);return Object.assign(n,t),n},vm=(e=>e?_m(e):_m),ym=[`single`,`double`,`round`,`bold`,`singleDouble`,`doubleSingle`,`classic`,`arrow`],bm=[`red-up`,`green-up`],xm={"red-up":`涨红跌绿`,"green-up":`涨绿跌红`},Sm=`red-up`,Cm={classic:{label:`经典紫蓝`,primary:`magenta`,accent:`blue`,highlight:`cyan`,foreground:`white`},ocean:{label:`海洋青蓝`,primary:`cyan`,accent:`blue`,highlight:`cyan`,foreground:`white`},forest:{label:`森林绿`,primary:`green`,accent:`green`,highlight:`green`,foreground:`white`},sunset:{label:`日落黄红`,primary:`yellow`,accent:`red`,highlight:`yellow`,foreground:`white`},gray:{label:`低调灰`,primary:`gray`,accent:`gray`,highlight:`gray`,foreground:`white`}},wm=Object.keys(Cm),Tm={requestTimeoutMs:{min:1e3,max:6e4,step:1e3},minimumRequestDurationMs:{min:0,max:5e3,step:250},quotePollIntervalMs:{min:1e3,max:6e4,step:500},minuteChartPollIntervalMs:{min:5e3,max:3e5,step:5e3},klinePollIntervalMs:{min:3e4,max:18e5,step:3e4}},Em={themePreset:`classic`,trendColorMode:Sm,borderStyle:`round`,requestTimeoutMs:8e3,minimumRequestDurationMs:0,quotePollIntervalMs:5e3,minuteChartPollIntervalMs:3e4,klinePollIntervalMs:3e5},Dm=(e,t,n)=>Math.min(n,Math.max(t,Math.round(e))),Om=e=>{let t=Dm(e.requestTimeoutMs,Tm.requestTimeoutMs.min,Tm.requestTimeoutMs.max);return{...e,requestTimeoutMs:t,minimumRequestDurationMs:Math.min(t,Dm(e.minimumRequestDurationMs,Tm.minimumRequestDurationMs.min,Tm.minimumRequestDurationMs.max)),quotePollIntervalMs:Dm(e.quotePollIntervalMs,Tm.quotePollIntervalMs.min,Tm.quotePollIntervalMs.max),minuteChartPollIntervalMs:Dm(e.minuteChartPollIntervalMs,Tm.minuteChartPollIntervalMs.min,Tm.minuteChartPollIntervalMs.max),klinePollIntervalMs:Dm(e.klinePollIntervalMs,Tm.klinePollIntervalMs.min,Tm.klinePollIntervalMs.max)}},km=e=>({themePreset:e.themePreset,trendColorMode:e.trendColorMode,borderStyle:e.borderStyle,requestTimeoutMs:e.requestTimeoutMs,minimumRequestDurationMs:e.minimumRequestDurationMs,quotePollIntervalMs:e.quotePollIntervalMs,minuteChartPollIntervalMs:e.minuteChartPollIntervalMs,klinePollIntervalMs:e.klinePollIntervalMs}),Am=(e,t)=>e.themePreset===t.themePreset&&e.trendColorMode===t.trendColorMode&&e.borderStyle===t.borderStyle&&e.requestTimeoutMs===t.requestTimeoutMs&&e.minimumRequestDurationMs===t.minimumRequestDurationMs&&e.quotePollIntervalMs===t.quotePollIntervalMs&&e.minuteChartPollIntervalMs===t.minuteChartPollIntervalMs&&e.klinePollIntervalMs===t.klinePollIntervalMs,jm=(e,t)=>{let n={};return e.themePreset!==t.themePreset&&(n.themePreset=e.themePreset),e.trendColorMode!==t.trendColorMode&&(n.trendColorMode=e.trendColorMode),e.borderStyle!==t.borderStyle&&(n.borderStyle=e.borderStyle),e.requestTimeoutMs!==t.requestTimeoutMs&&(n.requestTimeoutMs=e.requestTimeoutMs),e.minimumRequestDurationMs!==t.minimumRequestDurationMs&&(n.minimumRequestDurationMs=e.minimumRequestDurationMs),e.quotePollIntervalMs!==t.quotePollIntervalMs&&(n.quotePollIntervalMs=e.quotePollIntervalMs),e.minuteChartPollIntervalMs!==t.minuteChartPollIntervalMs&&(n.minuteChartPollIntervalMs=e.minuteChartPollIntervalMs),e.klinePollIntervalMs!==t.klinePollIntervalMs&&(n.klinePollIntervalMs=e.klinePollIntervalMs),n},Mm=vm()(e=>({...Em,updateSettings:t=>e(e=>Om({...km(e),...t})),adjustNumericSetting:(t,n)=>e(e=>{let r=Tm[t],i=Dm(e[t]+r.step*n,r.min,r.max);return Om({...km(e),[t]:i})}),resetSettings:()=>e(Em),hydrateSettings:t=>e(Om(t))}));function Nm(){return Mm(e=>Cm[e.themePreset])}var Pm=vm()(e=>({open:!1,toggle:()=>e(e=>({open:!e.open})),close:()=>e({open:!1})}));function Fm(e){return e instanceof Error?e.message:String(e)}var Im=/^(?:sh|sz|bj)\d{6}$/,Lm=(e,t)=>{if(typeof e!=`object`||!e)throw Error(`第 ${t+1} 项不是对象`);let n=e;if(typeof n.code!=`string`||!Im.test(n.code))throw Error(`第 ${t+1} 项 code 无效`);if(typeof n.name!=`string`||n.name.trim()===``)throw Error(`第 ${t+1} 项 name 无效`);if(typeof n.addedAt!=`string`||!Number.isFinite(Date.parse(n.addedAt)))throw Error(`第 ${t+1} 项 addedAt 无效`);return{code:n.code,name:n.name,addedAt:n.addedAt}};function Rm(e){if(!Array.isArray(e))throw Error(`stocks 不是数组`);let t=e.map(Lm),n=new Set;for(let[e,r]of t.entries()){if(n.has(r.code))throw Error(`第 ${e+1} 项 code 重复: ${r.code}`);n.add(r.code)}return t}var zm=25,Bm=2e3,Vm=3e4,Hm=e=>typeof e==`object`&&!!e&&!Array.isArray(e),Um=e=>{if(typeof e!=`string`||!wm.includes(e))throw Error(`theme.preset 无效`);return e},Wm=e=>{if(e===void 0)return Sm;if(typeof e!=`string`||!bm.includes(e))throw Error(`theme.trendColorMode 无效`);return e},Gm=(e,t,n)=>{if(typeof e!=`number`||!Number.isInteger(e)||e<n.min||e>n.max)throw Error(`${t} 无效`);return e};function Km(e){if(!Hm(e))throw Error(`顶层数据不是对象`);let t=e.theme;if(!Hm(t))throw Error(`theme 无效`);let n=t.borderStyle;if(typeof n!=`string`||!ym.includes(n))throw Error(`theme.borderStyle 无效`);let r=e.request;if(!Hm(r))throw Error(`request 无效`);let i=Gm(r.timeoutMs,`request.timeoutMs`,Tm.requestTimeoutMs),a=Gm(r.minimumDurationMs,`request.minimumDurationMs`,Tm.minimumRequestDurationMs);if(a>i)throw Error(`request.minimumDurationMs 不能大于 request.timeoutMs`);return{theme:{preset:Um(t.preset),trendColorMode:Wm(t.trendColorMode),borderStyle:n},request:{timeoutMs:i,minimumDurationMs:a,quotePollIntervalMs:Gm(r.quotePollIntervalMs,`request.quotePollIntervalMs`,Tm.quotePollIntervalMs),minuteChartPollIntervalMs:Gm(r.minuteChartPollIntervalMs,`request.minuteChartPollIntervalMs`,Tm.minuteChartPollIntervalMs),klinePollIntervalMs:Gm(r.klinePollIntervalMs,`request.klinePollIntervalMs`,Tm.klinePollIntervalMs)},stocks:Rm(e.stocks)}}function qm(e){return{themePreset:e.theme.preset,trendColorMode:e.theme.trendColorMode,borderStyle:e.theme.borderStyle,requestTimeoutMs:e.request.timeoutMs,minimumRequestDurationMs:e.request.minimumDurationMs,quotePollIntervalMs:e.request.quotePollIntervalMs,minuteChartPollIntervalMs:e.request.minuteChartPollIntervalMs,klinePollIntervalMs:e.request.klinePollIntervalMs}}var Jm=[{code:`sz002156`,name:`富通微电`},{code:`sh600584`,name:`长电科技`},{code:`sh688825`,name:`长鑫科技`}],Ym=()=>{let e=new Date().toISOString();return Jm.map(t=>({...t,addedAt:e}))},Xm=(e,t)=>({theme:{preset:e.themePreset,trendColorMode:e.trendColorMode,borderStyle:e.borderStyle},request:{timeoutMs:e.requestTimeoutMs,minimumDurationMs:e.minimumRequestDurationMs,quotePollIntervalMs:e.quotePollIntervalMs,minuteChartPollIntervalMs:e.minuteChartPollIntervalMs,klinePollIntervalMs:e.klinePollIntervalMs},stocks:t}),Zm=()=>{let e=n.env.XDG_CONFIG_HOME;if(e)return C(e,`leek-box-cli`);if(n.platform===`win32`){let e=n.env.APPDATA;if(e)return C(e,`leek-box-cli`)}return C(c(),`.config`,`leek-box-cli`)};function Qm(){return C(Zm(),`settings.json`)}var $m=e=>e.charCodeAt(0)===65279?e.slice(1):e,eh=async e=>{try{return JSON.parse($m(await A(e,`utf8`)))}catch(e){if(e.code===`ENOENT`)return;throw e}},th=async()=>{let e=Qm();try{let t=await eh(e);return t===void 0?void 0:Km(t)}catch(t){let n=t instanceof Error?t.message:String(t);throw Error(`设置文件损坏: ${e} (${n})`)}},nh=async e=>{let t=Km(e),r=Qm();await k(S(r),{recursive:!0});let i=`${r}.${n.pid}.${D()}.tmp`;try{await P(i,`${JSON.stringify(t,null,2)}\n`,`utf8`),await j(i,r)}finally{await M(i,{force:!0})}},rh=e=>new Promise(t=>setTimeout(t,e)),ih=e=>{try{return n.kill(e,0),!0}catch(e){return e.code!==`ESRCH`}},ah=async e=>{let t;try{t=await A(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return!0;throw e}let n=!1;try{let e=JSON.parse(t);if(!Hm(e)||typeof e.token!=`string`||typeof e.pid!=`number`||!Number.isInteger(e.pid)||e.pid<=0||typeof e.createdAt!=`number`||!Number.isFinite(e.createdAt))throw Error(`lock metadata 无效`);n=!ih(e.pid)||Date.now()-e.createdAt>=Vm}catch{try{let t=await N(e);n=Date.now()-t.mtimeMs>=Bm}catch(e){if(e.code===`ENOENT`)return!0;throw e}}if(!n)return!1;try{return await A(e,`utf8`)===t&&(await M(e),!0)}catch(e){if(e.code===`ENOENT`)return!0;throw e}},oh=async(e,t)=>{let r=`${e}.${n.pid}.${D()}.tmp`;try{await P(r,t,{encoding:`utf8`,flag:`wx`}),await O(r,e)}finally{await M(r,{force:!0})}};async function sh(e){let t=Qm(),r=`${t}.lock`,i=D(),a=JSON.stringify({token:i,pid:n.pid,createdAt:Date.now()});await k(S(t),{recursive:!0});let o=Date.now(),s=!1;for(;!s;)try{await oh(r,a),s=!0}catch(e){if(e.code!==`EEXIST`)throw e;if(await ah(r))continue;if(Date.now()-o>=Bm)throw Error(`设置文件正被其他进程占用, 请稍后重试`);await rh(zm)}let c;try{c={ok:!0,value:await e()}}catch(e){c={ok:!1,error:e}}let l;try{await A(r,`utf8`)===a&&await M(r)}catch(e){e.code!==`ENOENT`&&(l=e)}if(!c.ok)throw c.error;if(l)throw l;return c.value}var ch=async()=>{let e=await th();if(e)return e;let t=Xm(Em,Ym());return await nh(t),t};async function lh(){return await th()??sh(ch)}var uh=lh;async function dh(e){await sh(async()=>{let t=await ch();await nh(Xm({...qm(t),...e},t.stocks))})}async function fh(){return(await uh()).stocks}async function ph(e){let t=Rm(e);return sh(async()=>{let e=await ch(),n=new Set(e.stocks.map(e=>e.code)),r=t.filter(e=>!n.has(e.code));return r.length>0&&await nh({...e,stocks:[...e.stocks,...r]}),r.length})}async function mh(e){let t=new Set(e);return t.size===0?0:sh(async()=>{let e=await ch(),n=e.stocks.filter(e=>!t.has(e.code)),r=e.stocks.length-n.length;return r>0&&await nh({...e,stocks:n}),r})}var hh={loadStocks:fh};function gh(e=hh){return vm()(t=>({entries:[],errorMessage:void 0,resetToken:0,loadEntries:async()=>{t({errorMessage:void 0});try{t({entries:await e.loadStocks()})}catch(e){t({entries:[],errorMessage:Fm(e)})}},removeByCodes:e=>{let n=new Set(e);t(e=>({entries:e.entries.filter(e=>!n.has(e.code)),resetToken:e.resetToken+1}))},resetSelection:()=>t(e=>({resetToken:e.resetToken+1}))}))}var _h=gh(),vh=e=>e.type===`confirm`,yh=e=>e.type===`confirm`||e.type===`removing`||e.type===`done`||e.type===`error`,bh={stocksRemove:mh,commitRemoval:e=>_h.getState().removeByCodes(e),resetSelection:()=>_h.getState().resetSelection()};function xh(e=bh){return vm()((t,n)=>({step:{type:`idle`},targets:[],open:e=>{n().step.type===`idle`&&e.length!==0&&t({step:{type:`confirm`},targets:e})},confirmDelete:async()=>{if(n().step.type!==`confirm`)return;let r=n().targets.map(e=>e.code),i=r.length;t({step:{type:`removing`}});try{let n=await e.stocksRemove(r);if(n===0){t({step:{type:`error`,message:`所选 ${i} 个条目已不在自选股中.`}});return}e.commitRemoval(r);let a=i-n;if(a>0){t({step:{type:`done`,message:`已删除 ${n} 个股票, ${a} 个条目已不在自选股中.`},targets:[]});return}t({step:{type:`idle`},targets:[]})}catch(e){t({step:{type:`error`,message:`删除失败: ${Fm(e)}`}})}},cancel:()=>{n().step.type===`confirm`&&(t({step:{type:`idle`},targets:[]}),e.resetSelection())},dismiss:()=>{(n().step.type===`done`||n().step.type===`error`)&&t({step:{type:`idle`},targets:[]})}}))}var Sh=xh(),Ch=e=>typeof e==`object`&&e?e:void 0,wh=(e,t)=>{let n=Number.parseFloat(e[t]??``);return Number.isFinite(n)?n:0},Th=e=>{let t=Number.parseFloat(typeof e==`string`||typeof e==`number`?String(e):``);return Number.isFinite(t)?t:0},Eh=e=>{if(!Array.isArray(e))return[];let t=[];for(let n of e){if(typeof n!=`string`)continue;let[e=``,r=``,i=``]=n.split(` `);if(!/^(?:[01]\d|2[0-3])[0-5]\d$/.test(e)||e>`1500`)continue;let a=Number.parseFloat(r);if(!Number.isFinite(a)||a<=0)continue;let o=Number.parseFloat(i);t.push({time:e,price:a,volume:Number.isFinite(o)?o:0})}return t};function Dh(e){let t=[];for(let n of e.split(`;`)){let e=/^v_([a-z]{2}\d{6})="([^"]*)"/.exec(n.trim());if(!e)continue;let r=e[2].split(`~`);if(r.length<50)continue;let i=r[1].trim();i&&t.push({code:e[1],name:i,current:wh(r,3),prevClose:wh(r,4),open:wh(r,5),high:wh(r,33),low:wh(r,34),change:wh(r,31),changePercent:wh(r,32),timestamp:r[30],volume:wh(r,36),turnover:wh(r,37),turnoverRate:wh(r,38),amplitude:wh(r,43),marketCap:wh(r,45),volumeRatio:wh(r,49)})}if(t.length===0)throw Error(`未查询到任何行情数据, 请检查股票代码`);return t}function Oh(e,t){return Eh(Ch(Ch(Ch(Ch(e)?.data)?.[t])?.data)?.data)}function kh(e,t){let n=Ch(Ch(Ch(e)?.data)?.[t])?.data;return Array.isArray(n)?n.flatMap(e=>{let t=Ch(e),n=t?.date;if(typeof n!=`string`||!/^\d{8}$/.test(n))return[];let r=`${n.slice(0,4)}-${n.slice(4,6)}-${n.slice(6,8)}`,i=Th(t?.prec);return[{sessionDate:r,points:Eh(t?.data).map(e=>({...e,sessionDate:r,prevClose:i}))}]}).sort((e,t)=>e.sessionDate.localeCompare(t.sessionDate)).slice(-5).flatMap(e=>e.points):[]}function Ah(e,t,n=`day`,r=`qfq`){let i=Ch(Ch(Ch(e)?.data)?.[t]),a=i?.[`${r}${n}`],o=Array.isArray(a)&&a.length>0?a:i?.[n];if(!Array.isArray(o))return[];let s=[];for(let e of o){if(!Array.isArray(e))continue;let[t,n,r,i,a,o]=e;if(typeof t!=`string`||!/^\d{4}-\d{2}-\d{2}$/.test(t))continue;let c=Th(n),l=Th(r),u=Th(i),d=Th(a),f=Th(o);[c,l,u,d].some(e=>e<=0)||s.push({date:t,open:c,close:l,high:u,low:d,volume:Math.max(0,f)})}return s}var jh=(e,t)=>e<=0?Promise.resolve():t?.aborted?Promise.reject(t.reason):new Promise((n,r)=>{let i=setTimeout(()=>{t?.removeEventListener(`abort`,a),n()},e),a=()=>{clearTimeout(i),r(t?.reason)};t?.addEventListener(`abort`,a,{once:!0})}),Mh=async(e,t)=>{let{requestTimeoutMs:n,minimumRequestDurationMs:r}=Mm.getState(),i=AbortSignal.timeout(n),a=e?AbortSignal.any([e,i]):i,o=Date.now(),s=await t(a);return await jh(r-(Date.now()-o),e),s};function Nh(e){let t=e.trim().toUpperCase();if(t=t.replace(/\.(SH|SZ|BJ)$/,``),t=t.replace(/^(SH|SZ|BJ)/,``),!/^\d{6}$/.test(t))return;let n;if(t.startsWith(`6`)||t.startsWith(`5`))n=`sh`;else if(t.startsWith(`0`)||t.startsWith(`1`)||t.startsWith(`3`))n=`sz`;else if(t.startsWith(`4`)||t.startsWith(`8`)||t.startsWith(`92`))n=`bj`;else return;return`${n}${t}`}async function Ph(e,t){return e.length===0?[]:Mh(t,async t=>{let n=await fetch(`https://qt.gtimg.cn/q=${e.join(`,`)}`,{signal:t});if(!n.ok)throw Error(`行情接口请求失败: HTTP ${n.status}`);let r=await n.arrayBuffer();return Dh(new TextDecoder(`gbk`).decode(r))})}async function Fh(e,t){return Mh(t,async t=>{let n=await fetch(`https://web.ifzq.gtimg.cn/appstock/app/minute/query?code=${e}`,{signal:t});if(!n.ok)throw Error(`分时接口请求失败: HTTP ${n.status}`);return Oh(await n.json(),e)})}async function Ih(e,t){return Mh(t,async t=>{let n=await fetch(`https://web.ifzq.gtimg.cn/appstock/app/day/query?code=${e}`,{signal:t});if(!n.ok)throw Error(`五日行情接口请求失败: HTTP ${n.status}`);return kh(await n.json(),e)})}var Lh=e=>{let t=new Map;for(let n of[...e].sort((e,t)=>e.date.localeCompare(t.date))){let e=n.date.slice(0,4),r=t.get(e);if(!r){t.set(e,{...n});continue}r.date=n.date,r.close=n.close,r.high=Math.max(r.high,n.high),r.low=Math.min(r.low,n.low),r.volume+=n.volume}return[...t.values()]};async function Rh(e,t){return Mh(t.signal,async n=>{let r=t.period===`year`?`month`:t.period,i=t.period===`year`?`hfq`:`qfq`,a=t.period===`year`?t.barCount*12:t.barCount,o=encodeURIComponent(`${e},${r},,,${a},${i}`),s=await fetch(`https://web.ifzq.gtimg.cn/appstock/app/fqkline/get?param=${o}`,{signal:n});if(!s.ok)throw Error(`K 线行情接口请求失败: HTTP ${s.status}`);let c=Ah(await s.json(),e,r,i);return(t.period===`year`?Lh(c):c).slice(-t.barCount)})}var zh={day:{barCount:60},week:{barCount:60},month:{barCount:60},year:{barCount:30}},Bh=`intraday`,Vh=e=>e!==`intraday`&&e!==`five-day`,Hh={fetchIntraday:Fh,fetchFiveDay:Ih,fetchHistorical:Rh};function Uh(e=Hh){return vm()((t,n)=>({stock:void 0,period:Bh,status:`loading`,points:[],open:(e,n)=>t({stock:{code:e,name:n},period:Bh,status:`loading`,points:[],errorMessage:void 0}),close:()=>t({stock:void 0}),setPeriod:e=>{n().period!==e&&t({period:e,status:`loading`,points:[],errorMessage:void 0})},refreshChart:async(r,i,a)=>{try{let o;if(i===`intraday`)o=await e.fetchIntraday(r,a);else if(i===`five-day`)o=await e.fetchFiveDay?.(r,a);else if(Vh(i)){let t=zh[i];o=await e.fetchHistorical?.(r,{period:i,...t,signal:a})}if(!o)throw Error(`${i===`five-day`?`五日`:`K 线`}行情数据源不可用`);if(n().stock?.code!==r||n().period!==i||a?.aborted)return;t({status:`ready`,points:o,errorMessage:void 0})}catch(e){if(n().stock?.code!==r||n().period!==i||a?.aborted)return;t({status:`error`,errorMessage:Fm(e)})}}}))}var Wh=Uh();function Gh(){let e=Pm(e=>e.open),t=Wh(e=>e.stock!==void 0),n=Sh(e=>yh(e.step));return{overlayOpen:e||t||n,dialogMenuOpen:e,dialogStockDetailOpen:t,dialogRemoveConfirmOpen:n}}var Kh=z((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.fragment`);function r(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.Fragment=n,e.jsx=r,e.jsxs=r})),Q=z(((e,t)=>{t.exports=Kh()}))();function $({bright:e=!1,color:t,...n}){let{overlayOpen:r}=Gh(),i=Nm(),a=!e&&r;return(0,Q.jsx)(ml,{...n,color:t??i.foreground,dimColor:a})}function qh({title:e,bright:t=!1,top:n,left:r,right:i}){return(0,Q.jsxs)(pl,{position:`absolute`,top:n,left:r,right:i,children:[(0,Q.jsx)($,{bright:t,children:`|`}),e,(0,Q.jsx)($,{bright:t,children:`|`})]})}function Jh(e){let{bright:t=!1,fullScreen:n,title:r,extra:i,footer:a,children:o}=e,{width:s,height:c,backgroundColor:l}=e,{columns:u,rows:d}=_u(),f=Mm(e=>e.borderStyle),p=Nm();return(0,Q.jsxs)(pl,{flexDirection:`column`,width:n?u:s,height:n?d:c,borderStyle:f,borderColor:p.primary,borderDimColor:t===!1,children:[r?(0,Q.jsx)(qh,{title:r,bright:t,top:-1,left:1}):void 0,i?(0,Q.jsx)(qh,{title:i,bright:t,top:-1,right:1}):void 0,(0,Q.jsx)(pl,{flexGrow:1,flexDirection:`column`,padding:1,backgroundColor:l,children:o}),a]})}var Yh=new Intl.DateTimeFormat(`en-CA`,{timeZone:`Asia/Shanghai`,year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`,hour12:!1});function Xh(e,t){let n=Yh.formatToParts(e),r=e=>n.find(t=>t.type===e)?.value??``,i=`${r(`year`)}-${r(`month`)}-${r(`day`)}`,a=`${r(`hour`)}:${r(`minute`)}`;switch(t){case`date-time`:return`${i} ${a}:${r(`second`)}`;case`date`:return i;case`time`:return`${a}:${r(`second`)}`;case`hour-minute`:return a}}var Zh={"date-time":1e3,date:6e4,time:1e3,"hour-minute":6e4};function Qh(e){let[t,n]=(0,U.useState)(()=>new Date);return(0,U.useEffect)(()=>{let t=setInterval(()=>n(new Date),Zh[e]);return()=>clearInterval(t)},[e]),Xh(t,e)}function $h(e){let{hint:t,bright:n=!1}=e,r=Qh(`date-time`),i=Nm();return(0,Q.jsxs)(pl,{justifyContent:`space-between`,paddingX:1,backgroundColor:n?i.accent:`gray`,children:[(0,Q.jsx)(pl,{flexShrink:0,children:t&&(0,Q.jsx)($,{bright:n,color:`white`,children:t})}),(0,Q.jsx)(pl,{flexShrink:0,children:(0,Q.jsx)($,{bright:n,color:`white`,children:r})})]})}function eg(e){let{title:t,extra:n,hint:r,width:i,children:a}=e,{rows:o,columns:s}=_u();return(0,Q.jsx)(pl,{position:`absolute`,top:0,left:0,width:s,height:o,flexDirection:`column`,alignItems:`center`,justifyContent:`center`,children:(0,Q.jsx)(Jh,{bright:!0,title:t,extra:n,width:i,backgroundColor:`black`,footer:(0,Q.jsx)($h,{hint:r,bright:!0}),children:a})})}var tg=[{type:`theme`,label:`主题色系`,description:`界面配色`},{type:`trendColor`,label:`涨跌颜色`,description:`选择涨绿或跌绿`},{type:`border`,label:`卡片边框`,description:`边框样式`},{type:`numeric`,label:`请求超时`,description:`单次请求最长等待`,setting:`requestTimeoutMs`},{type:`numeric`,label:`请求最短耗时`,description:`避免加载闪烁`,setting:`minimumRequestDurationMs`},{type:`numeric`,label:`看板刷新间隔`,description:`自选股票看板自动刷新频率`,setting:`quotePollIntervalMs`},{type:`numeric`,label:`分时图刷新间隔`,description:`分时与五日图自动刷新频率`,setting:`minuteChartPollIntervalMs`},{type:`numeric`,label:`K 线刷新间隔`,description:`日/周/月/年 K 线自动刷新频率`,setting:`klinePollIntervalMs`}],ng=(e,t,n)=>e[(e.indexOf(t)+n+e.length)%e.length]??t,rg=e=>e===0?`关闭`:e<1e3?`${e} ms`:e%6e4==0?`${e/6e4} 分钟`:e%1e3==0?`${e/1e3} 秒`:`${(e/1e3).toFixed(2)} 秒`;function ig(){let[e,t]=(0,U.useState)(0),{overlayOpen:n}=Gh(),r=Mm(),i=t=>{let n=tg[e];n&&(n.type===`theme`?r.updateSettings({themePreset:ng(wm,r.themePreset,t)}):n.type===`trendColor`?r.updateSettings({trendColorMode:ng(bm,r.trendColorMode,t)}):n.type===`border`?r.updateSettings({borderStyle:ng(ym,r.borderStyle,t)}):r.adjustNumericSetting(n.setting,t))};mu((e,n)=>{n.ctrl||(n.upArrow?t(e=>(e-1+tg.length)%tg.length):n.downArrow?t(e=>(e+1)%tg.length):n.leftArrow?i(-1):n.rightArrow||n.return?i(1):e===`d`&&r.resetSettings())},{isActive:!n});let a=tg.map((t,n)=>({label:t.label,description:t.description,selected:n===e,value:t.type===`theme`?Cm[r.themePreset].label:t.type===`trendColor`?xm[r.trendColorMode]:t.type===`border`?r.borderStyle:rg(r[t.setting])}));return{overlayOpen:n,appearanceRows:a.slice(0,3),requestRows:a.slice(3)}}function ag({rows:e,highlight:t}){return e.map(e=>(0,Q.jsxs)(pl,{justifyContent:`space-between`,children:[(0,Q.jsxs)($,{color:e.selected?`black`:void 0,backgroundColor:e.selected?t:void 0,children:[e.selected?`› `:` `,e.label,(0,Q.jsxs)($,{color:`gray`,backgroundColor:e.selected?t:void 0,children:[`(`,e.description,`)`]})]}),(0,Q.jsx)($,{color:e.selected?t:`gray`,children:e.value})]},e.label))}function og({title:e,hint:t}){let n=Nm(),{overlayOpen:r,appearanceRows:i,requestRows:a}=ig();return(0,Q.jsxs)(Jh,{fullScreen:!0,bright:!r,title:(0,Q.jsx)($,{color:n.primary,children:e}),footer:(0,Q.jsx)($h,{hint:t,bright:!r}),children:[(0,Q.jsx)($,{color:n.primary,children:`外观`}),(0,Q.jsx)(ag,{rows:i,highlight:n.highlight}),(0,Q.jsxs)(pl,{marginTop:1,flexDirection:`column`,children:[(0,Q.jsx)($,{color:n.primary,children:`请求与刷新`}),(0,Q.jsx)(ag,{rows:a,highlight:n.highlight})]}),(0,Q.jsx)(pl,{marginTop:1,flexDirection:`column`,children:(0,Q.jsx)($,{color:`gray`,children:`请求最短耗时用于避免加载状态闪烁, 且不会超过请求超时.`})})]})}var sg=vm()(e=>({screen:`stock-list`,goTo:t=>e({screen:t})})),cg={error:`red`,warning:`yellow`,success:`green`};function lg({tone:e,msg:t}){return(0,Q.jsx)($,{bold:!0,color:cg[e],children:t})}function ug({prompt:e,onSubmit:t,placeholder:n}){let{overlayOpen:r}=Gh(),[i,a]=(0,U.useState)(``),[o,s]=(0,U.useState)(!1);return mu((e,n)=>{o||(n.return?(s(!0),t(i)):n.backspace||n.delete?a(e=>e.slice(0,-1)):!n.ctrl&&!n.meta&&e&&a(t=>t+e))},{isActive:!r&&!o}),(0,Q.jsx)(pl,{children:(0,Q.jsxs)($,{children:[e,o?(0,Q.jsx)($,{color:`green`,children:i}):(0,Q.jsxs)($,{children:[i,(0,Q.jsx)($,{color:`gray`,children:`█`}),!i&&n?n:void 0]})]})})}function dg({tone:e,msg:t,to:n,onReturn:r}){let i=sg(e=>e.goTo);return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(lg,{tone:e,msg:t}),(0,Q.jsx)(ql,{}),(0,Q.jsx)(ug,{prompt:`按 Enter 返回操作页...`,onSubmit:()=>{r?.(),i(n)}})]})}var fg=e=>e>0?e.toFixed(2):`--`,pg=e=>`${e>0?`+`:``}${e.toFixed(2)}`,mg=e=>`${e>0?`+`:``}${e.toFixed(2)}%`,hg=(e,t=Sm)=>e===0?`gray`:e>0==(t===`green-up`)?`green`:`red`,gg=e=>e>=1e4?`${(e/1e4).toFixed(1)}万手`:e>0?`${Math.round(e)}手`:`--`,_g=e=>e>=1e4?`${(e/1e4).toFixed(2)}亿`:e>0?`${e.toFixed(1)}万`:`--`,vg=e=>e>0?`${e.toFixed(2)}%`:`--`,yg=e=>e>0?e.toFixed(2):`--`,bg=e=>e>0?`${e.toFixed(2)}亿`:`--`;function xg(e){let t=e.trim();if(t===`y`||t===`Y`)return`y`;if(t===`n`||t===`N`)return`n`}var Sg=`错误: 必须选择 y (是) 或 n (否).`,Cg=e=>e.type===`input-code`,wg=e=>e.type===`confirm`,Tg=e=>e.type===`already-exists`||e.type===`done`||e.type===`error`,Eg={stocksAdd:ph,fetchQuotes:Ph,normalizeCode:Nh,now:()=>new Date().toISOString()},Dg={error:void 0,resetToken:0},Og=`无法识别股票代码, 请用英文逗号分隔 6 位股票代码.`;function kg(e=Eg){let t=0,n=e=>e!==t;return vm()((r,i)=>{let a=()=>r(e=>({codeInput:{error:Og,resetToken:e.codeInput.resetToken+1}}));return{step:{type:`input-code`},codeInput:Dg,confirmInput:Dg,reset:()=>{t+=1,r({step:{type:`input-code`},codeInput:Dg,confirmInput:Dg})},handleCodeInput:async o=>{if(!Cg(i().step))return;let s=t,c=o.split(`,`).map(e=>e.trim());if(c.length===0||c.some(e=>e===``)){a();return}let l=c.map(t=>e.normalizeCode(t));if(l.some(e=>e===void 0)){a();return}let u=[...new Set(l)];r(e=>({codeInput:{error:void 0,resetToken:e.codeInput.resetToken+1}})),r({step:{type:`checking`,codes:u}});try{let t=await e.fetchQuotes(u);if(n(s))return;let i=new Map(t.map(e=>[e.code,e])),a=u.filter(e=>!i.has(e));if(a.length>0){r({step:{type:`error`,message:`未找到股票代码: ${a.join(`, `)}.`}});return}r({step:{type:`confirm`,entries:u.map(e=>{let t=i.get(e);return{code:e,name:t.name,current:t.current}})}})}catch(e){n(s)||r({step:{type:`error`,message:Fm(e)}})}},handleConfirm:async a=>{let o=xg(a);if(!o){r(e=>({confirmInput:{error:Sg,resetToken:e.confirmInput.resetToken+1}}));return}if(r(e=>({confirmInput:{error:void 0,resetToken:e.confirmInput.resetToken+1}})),o===`n`){r({step:{type:`done`,message:`已取消.`}});return}let s=t,c=i().step;if(wg(c)){r({step:{type:`saving`,entries:c.entries}});try{let t=e.now(),i=await e.stocksAdd(c.entries.map(e=>({code:e.code,name:e.name,addedAt:t})));if(n(s))return;if(i===0){r({step:{type:`already-exists`,entries:c.entries}});return}r({step:{type:`done`,message:`已添加 ${i} 个股票, ${c.entries.length-i} 个已在自选股中.`}})}catch(e){n(s)||r({step:{type:`error`,message:`写入自选股失败: ${Fm(e)}`}})}}}}})}var Ag=kg();function jg(){let e=Ag(e=>e.step),t=Ag(e=>e.codeInput),n=Ag(e=>e.confirmInput),r=Ag(e=>e.handleCodeInput),i=Ag(e=>e.handleConfirm),a=Ag(e=>e.reset);return(0,U.useEffect)(()=>{a()},[a]),{step:e,codeInput:t,confirmInput:n,handleCodeInput:r,handleConfirm:i,reset:a}}function Mg({title:e,hint:t}){let{overlayOpen:n}=Gh(),r=Nm(),{step:i,codeInput:a,confirmInput:o,handleCodeInput:s,handleConfirm:c,reset:l}=jg(),u;if(Tg(i))u=(0,Q.jsx)(dg,{tone:i.type===`already-exists`?`warning`:i.type===`done`?`success`:`error`,msg:i.type===`already-exists`?`${i.entries.map(e=>`${e.name} (${e.code})`).join(`, `)} 已在自选股中.`:i.message,to:`stock-add`,onReturn:l});else switch(i.type){case`input-code`:u=(0,Q.jsxs)(Q.Fragment,{children:[a.error&&(0,Q.jsx)($,{color:`red`,children:a.error}),(0,Q.jsx)(ug,{prompt:`请输入股票代码, 用英文逗号分隔: `,placeholder:(0,Q.jsx)($,{color:`gray`,children:`支持 600000, sh600000, 600000.SH 等写法`}),onSubmit:s},`code-${a.resetToken}`)]});break;case`checking`:u=(0,Q.jsxs)($,{color:`cyan`,children:[`正在验证股票代码: `,i.codes.join(`, `),`...`]});break;case`confirm`:u=(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)($,{color:`cyan`,children:`找到以下股票:`}),i.entries.map(e=>(0,Q.jsxs)($,{children:[e.name,` (`,e.code,`), 现价 `,fg(e.current)]},e.code)),o.error&&(0,Q.jsx)($,{color:`red`,children:o.error}),(0,Q.jsx)(ug,{prompt:`确认添加到自选股? (y/n): `,onSubmit:c},`confirm-${o.resetToken}`)]});break;case`saving`:u=(0,Q.jsxs)($,{color:`cyan`,children:[`正在添加 `,i.entries.length,` 个股票...`]})}return(0,Q.jsx)(Jh,{fullScreen:!0,bright:!n,title:(0,Q.jsx)($,{color:r.primary,children:e}),footer:(0,Q.jsx)($h,{hint:t,bright:!n}),children:u})}function Ng(e){let{segments:t,selected:n,bright:r=!1}=e;return(0,Q.jsx)($,{bright:r,inverse:n,children:t.map((e,t)=>(0,Q.jsx)($,{bright:r,color:e.color,children:e.text},t))})}var Pg=(e,t)=>e+` `.repeat(Math.max(0,t.width-Nt(e))),Fg=e=>e.map((t,n)=>({...t,text:n<e.length-1?`${t.text} `:t.text})),Ig=new Map([{key:`code`,kind:`code`,title:`代码`,width:9,render:e=>e.code},{key:`name`,kind:`name`,title:`名称`,width:9,render:e=>e.name},{key:`current`,kind:`value`,title:`现价`,width:8,render:e=>fg(e.current),color:(e,t)=>hg(e.change,t)},{key:`changePercent`,kind:`changePercent`,title:`涨跌幅`,width:9,render:e=>mg(e.changePercent),color:(e,t)=>hg(e.changePercent,t),suspendedText:`停牌`},{key:`change`,kind:`value`,title:`涨跌额`,width:8,render:e=>pg(e.change),color:(e,t)=>hg(e.change,t)},{key:`open`,kind:`value`,title:`今开`,width:7,render:e=>fg(e.open)},{key:`prevClose`,kind:`value`,title:`昨收`,width:7,render:e=>fg(e.prevClose)},{key:`high`,kind:`value`,title:`最高`,width:7,render:e=>fg(e.high)},{key:`low`,kind:`value`,title:`最低`,width:7,render:e=>fg(e.low)},{key:`volume`,kind:`value`,title:`成交量`,width:11,render:e=>gg(e.volume)},{key:`turnover`,kind:`value`,title:`成交额`,width:9,render:e=>_g(e.turnover)},{key:`turnoverRate`,kind:`value`,title:`换手率`,width:7,render:e=>vg(e.turnoverRate)},{key:`amplitude`,kind:`value`,title:`振幅`,width:7,render:e=>vg(e.amplitude)},{key:`volumeRatio`,kind:`value`,title:`量比`,width:7,render:e=>yg(e.volumeRatio)},{key:`marketCap`,kind:`value`,title:`总市值`,width:10,render:e=>bg(e.marketCap)}].map(e=>[e.key,e])),Lg=e=>Fg(e.map(e=>({text:Pg(e.title,e),color:`gray`}))),Rg=(e,t,n=Sm)=>{let r=t.current<=0;return Fg(e.map(e=>({text:Pg(r?e.suspendedText??`--`:e.render(t),e),color:r||!e.color?`gray`:e.color(t,n)})))},zg=(e,t,n)=>Fg(e.map(e=>({text:Pg(e.kind===`code`?t:e.kind===`name`?n:e.kind===`changePercent`?`无数据`:`--`,e),color:`gray`}))),Bg=[`name`,`code`,`current`,`changePercent`,`change`,`open`,`high`,`low`,`volume`,`turnover`,`turnoverRate`,`marketCap`],Vg=[`open`,`prevClose`,`high`,`low`,`volume`,`turnover`,`turnoverRate`,`amplitude`,`volumeRatio`,`marketCap`],Hg=Bg.reduce((e,t)=>{let n=Ig.get(t);return n&&e.push(n),e},[]),Ug=Vg.reduce((e,t)=>{let n=Ig.get(t);return n&&e.push(n),e},[]),Wg=()=>Hg.reduce((e,t)=>e+t.width,0)+(Hg.length-1),Gg=()=>Ug.reduce((e,t)=>e+t.width,0)+(Ug.length-1);function Kg(e,{enabled:t=!0,intervalMs:n,restartKey:r,onError:i}){let a=(0,U.useRef)(e),o=(0,U.useRef)(n),s=(0,U.useRef)(i),c=(0,U.useRef)({});(0,U.useEffect)(()=>{a.current=e,o.current=n,s.current=i},[e,n,i]);let l=(0,U.useCallback)(()=>c.current.refresh?.(),[]);return(0,U.useEffect)(()=>{if(!t){c.current={};return}let e=!0,n=!1,r,i,l=()=>{r&&=(clearTimeout(r),void 0)},u=(t=o.current)=>{!e||n||r||(r=setTimeout(()=>{r=void 0,f()},t))},d=async()=>{if(!e||n)return;let t=Date.now();n=!0,i=new AbortController;let r=i;try{await a.current(r.signal)}catch(e){r.signal.aborted||s.current?.(e)}finally{i===r&&(i=void 0),n=!1,u(Math.max(0,o.current-(Date.now()-t)))}},f=()=>void d();return c.current={refresh:()=>{n||(l(),f())},reschedule:()=>{n||(l(),u())}},f(),()=>{e=!1,c.current={},l(),i?.abort()}},[t,r]),(0,U.useEffect)(()=>{c.current.reschedule?.()},[n]),{refresh:l}}var qg={fetchQuotes:Ph,loadStocks:fh},Jg=(e,t)=>Math.min(Math.max(e,0),t-1),Yg=(e,t,n,r,i)=>{let a=Jg(t+e,n),o=Math.max(0,n-i);return e===1&&a>=r+i?Math.min(a-i+1,o):e===-1&&a<r?a:Math.min(r,o)},Xg=(e,t)=>{if(!t)return 0;let n=e.findIndex(e=>e.code===t);return n<0?0:n},Zg=(e,t)=>e.code===t.code&&e.name===t.name&&e.current===t.current&&e.prevClose===t.prevClose&&e.open===t.open&&e.high===t.high&&e.low===t.low&&e.change===t.change&&e.changePercent===t.changePercent&&e.timestamp===t.timestamp&&e.volume===t.volume&&e.turnover===t.turnover&&e.turnoverRate===t.turnoverRate&&e.amplitude===t.amplitude&&e.marketCap===t.marketCap&&e.volumeRatio===t.volumeRatio;function Qg(e=qg){return vm()((t,n)=>({step:{type:`loading`},selectedCode:void 0,scrollOffset:0,refreshQuotes:async n=>{try{let r=await e.loadStocks();if(n?.aborted)return;if(r.length===0){t({step:{type:`empty`},selectedCode:void 0,scrollOffset:0});return}let i=await e.fetchQuotes(r.map(e=>e.code),n);if(n?.aborted)return;t(e=>{let t=e.step.type===`table`?e.step.rows:[],n=new Map(t.filter(e=>e.kind===`quote`).map(e=>[e.code,e.quote])),a=new Map(i.map(e=>{let t=n.get(e.code);return[e.code,t&&Zg(t,e)?t:e]})),o=r.map(e=>{let t=a.get(e.code);return t?{kind:`quote`,code:e.code,name:t.name,quote:t}:{kind:`missing`,code:e.code,name:e.name}}),s=Xg(t,e.selectedCode),c=e.selectedCode?o.findIndex(t=>t.code===e.selectedCode):-1,l=c>=0?c:Jg(s,o.length),u=Math.max(0,s-e.scrollOffset);return{step:{type:`table`,rows:o},selectedCode:o[l]?.code,scrollOffset:Math.max(0,l-u)}})}catch(e){if(n?.aborted)return;let r=Fm(e);t(e=>e.step.type===`table`?{step:{...e.step,errorLine:r}}:{step:{type:`error`,message:r}})}},moveSelection:(e,r)=>{let{step:i,selectedCode:a,scrollOffset:o}=n();if(i.type!==`table`||i.rows.length===0)return;let s=Xg(i.rows,a),c=Jg(s+e,i.rows.length);t({selectedCode:i.rows[c]?.code,scrollOffset:Yg(e,s,i.rows.length,o,r)})}}))}var $g=Qg(),e_=(e,t,n)=>{if(e<=n)return{start:0,end:e};let r=e-n,i=Math.min(Math.max(t,0),r);return{start:i,end:i+n}};function t_(){let e=(0,U.useRef)(null),t=bu(e),n=$g(e=>e.step),r=$g(e=>e.selectedCode),i=$g(e=>e.scrollOffset),a=Mm(e=>e.quotePollIntervalMs),o=$g(e=>e.moveSelection),{overlayOpen:s}=Gh(),c=t.hasMeasured?Math.max(1,Math.floor(t.height)):1,l=n.type===`table`?e_(n.rows.length,i,c):{start:0,end:0};(0,U.useEffect)(()=>{$g.setState({step:{type:`loading`}})},[]);let{refresh:u}=Kg(e=>$g.getState().refreshQuotes(e),{intervalMs:a});return mu((e,t)=>{if(!t.ctrl){if(t.upArrow)o(-1,c);else if(t.downArrow)o(1,c);else if(t.return){let e=$g.getState();if(e.step.type!==`table`||!e.selectedCode)return;let t=e.step.rows.find(t=>t.code===e.selectedCode);t&&Wh.getState().open(t.code,t.name)}else e===`r`&&u()}},{isActive:!s}),{rowsRef:e,step:n,selectedCode:r,window:l}}function n_({title:e,hint:t}){let{overlayOpen:n}=Gh(),r=Nm(),i=Mm(e=>e.trendColorMode),{rowsRef:a,step:o,selectedCode:s,window:c}=t_(),l;switch(o.type){case`loading`:l=(0,Q.jsx)($,{color:`cyan`,children:`正在获取行情数据...`});break;case`empty`:l=(0,Q.jsx)($,{color:`yellow`,children:`自选股为空, 按 esc 打开菜单添加自选股.`});break;case`error`:l=(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)($,{color:`red`,children:o.message}),(0,Q.jsx)($,{color:`gray`,children:`行情接口异常, 稍后自动重试`})]});break;case`table`:l=(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(Ng,{segments:Lg(Hg)}),(0,Q.jsx)(pl,{ref:a,flexDirection:`column`,flexGrow:1,overflow:`hidden`,children:o.rows.slice(c.start,c.end).map(e=>(0,Q.jsx)(Ng,{segments:e.kind===`quote`?Rg(Hg,e.quote,i):zg(Hg,e.code,e.name),selected:e.code===s},e.code))}),o.errorLine?(0,Q.jsxs)($,{color:`yellow`,children:[`刷新失败: `,o.errorLine,`, 稍后自动重试`]}):void 0]})}return(0,Q.jsx)(Jh,{fullScreen:!0,bright:!n,title:(0,Q.jsx)($,{color:r.primary,children:e}),footer:(0,Q.jsx)($h,{hint:t,bright:!n}),children:l})}function r_(e){return(0,Q.jsx)(pl,{flexGrow:1,flexBasis:0,minWidth:0,...e})}function i_({label:e,hint:t,selected:n,cursor:r}){let i=Nm();return(0,Q.jsx)(r_,{children:(0,Q.jsxs)($,{inverse:r,wrap:`truncate-end`,children:[(0,Q.jsxs)($,{color:n?i.primary:void 0,children:[n?`[x] `:`[ ] `,e]}),t?(0,Q.jsxs)($,{color:`gray`,children:[` (`,t,`)`]}):void 0]})})}function a_(e,t=3){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}function o_(e,t,n){if(t<=0)return 0;let r=Math.min(Math.max(e,0),t-1),i=r%3;return n===`left`?i>0?r-1:r:n===`right`?i<2&&r+1<t?r+1:r:n===`up`?r-3>=0?r-3:r:r+3<t?r+3:r}function s_(e,t,n,r){let i=Math.max(0,t-r),a=Math.floor(Math.max(e,0)/3),o=Math.min(Math.max(n,0),i);return a<o?o=a:a>=o+r&&(o=a-r+1),Math.min(Math.max(o,0),i)}function c_(e,t,n){if(e<=n)return{start:0,end:e};let r=e-n,i=Math.min(Math.max(t,0),r);return{start:i,end:i+n}}function l_({items:e,getKey:t,isActive:n,onSubmit:r}){let i=(0,U.useRef)(null),a=bu(i),[o,s]=(0,U.useState)(0),[c,l]=(0,U.useState)(0),[u,d]=(0,U.useState)(()=>new Set),f=e.length,p=a.hasMeasured?Math.max(1,Math.floor(a.height)):1,m=Math.ceil(f/3),h=c_(m,c,p);return mu((n,i)=>{if(!i.ctrl){if(i.leftArrow||i.rightArrow||i.upArrow||i.downArrow){let e=i.leftArrow?`left`:i.rightArrow?`right`:i.upArrow?`up`:`down`,t=o_(o,f,e);s(t),l(s_(t,m,c,Math.max(1,p)))}else if(n===` `){let n=e[o];if(!n)return;let r=t(n);d(e=>{let t=new Set(e);return t.has(r)?t.delete(r):t.add(r),t})}else if(i.return){let n=e.filter(e=>u.has(t(e)));n.length>0&&r(n)}}},{isActive:n}),{gridRef:i,cursor:o,selectedKeys:u,visibleRange:h}}function u_(e){let{items:t,getKey:n,getLabel:r,getHint:i,isActive:a,onSubmit:o}=e,{gridRef:s,cursor:c,selectedKeys:l,visibleRange:u}=l_({items:t,getKey:n,isActive:a,onSubmit:o}),d=a_(t);return(0,Q.jsx)(pl,{ref:s,flexDirection:`column`,flexGrow:1,overflow:`hidden`,children:d.slice(u.start,u.end).map((e,t)=>{let o=u.start+t;return(0,Q.jsx)(pl,{columnGap:2,children:Array.from({length:3},(t,s)=>{let u=e[s];if(!u)return(0,Q.jsx)(r_,{},`empty-${s}`);let d=o*3+s,f=n(u);return(0,Q.jsx)(i_,{label:r(u),hint:i?.(u),selected:l.has(f),cursor:a&&d===c},f)})},o)})})}function d_(){let e=_h(e=>e.entries),t=_h(e=>e.errorMessage),n=_h(e=>e.resetToken),r=_h(e=>e.loadEntries),i=Sh(e=>e.open);return(0,U.useEffect)(()=>{r()},[r]),{entries:e,errorMessage:t,resetToken:n,open:i}}function f_({title:e,hint:t}){let{overlayOpen:n}=Gh(),r=Nm(),{entries:i,errorMessage:a,resetToken:o,open:s}=d_(),c;return c=i.length===0?a?(0,Q.jsx)($,{color:`red`,children:a}):(0,Q.jsx)($,{color:`yellow`,children:`自选股为空, 按 esc 打开菜单添加自选股.`}):(0,Q.jsx)(u_,{items:i,getKey:e=>e.code,getLabel:e=>e.name,getHint:e=>e.code,isActive:!n,onSubmit:s},o),(0,Q.jsx)(Jh,{fullScreen:!0,bright:!n,title:(0,Q.jsx)($,{color:r.primary,children:e}),footer:(0,Q.jsx)($h,{hint:t,bright:!n}),children:c})}var p_={"stock-list":{Component:n_,title:`自选股票看板`,description:`自选股票看板 (默认, 自动刷新)`,hint:`菜单(esc) 刷新(r) 选择(↑/↓) 详情(enter) 退出(q)`,menuLabel:`自选股票看板`},"stock-add":{Component:Mg,title:`添加自选股`,description:`添加自选股`,hint:`菜单(esc) 退出(q)`,menuLabel:`添加自选股`},"stock-remove":{Component:f_,title:`删除自选股`,description:`删除自选股`,hint:`菜单(esc) 移动(↑/↓/←/→) 选择(空格) 删除(enter) 退出(q)`,menuLabel:`删除自选股`},settings:{Component:og,title:`设置`,description:`配置主题, 涨跌颜色与请求参数`,hint:`菜单(esc) 选择(↑/↓) 调整(←/→/enter) 默认值(d) 退出(q)`,menuLabel:`设置`}},m_=Object.keys(p_),h_=e=>e!==void 0&&Object.hasOwn(p_,e),g_=e=>h_(e)?e:`stock-list`,__=[...Object.entries(p_).map(([e,t],n)=>({label:`${n+1}) ${t.menuLabel}`,screen:e})),{label:`${Object.keys(p_).length+1}) 退出程序`,screen:void 0}],v_=45;function y_(){let e=sg(e=>e.goTo),t=Pm(e=>e.close),{exit:n}=hu(),[r,i]=(0,U.useState)(0),a=r=>{r.screen?(t(),e(r.screen)):n()};return mu((e,t)=>{if(t.upArrow)i(e=>(e+__.length-1)%__.length);else if(t.downArrow)i(e=>(e+1)%__.length);else if(t.return)a(__[r]);else if(/^[1-9]$/.test(e)){let t=Number(e)-1,n=__[t];if(!n)return;i(t),a(n)}}),{width:v_,menuItems:__,highlight:r}}function b_(){let{highlight:e,width:t,menuItems:n}=y_(),r=Nm();return(0,Q.jsx)(eg,{title:(0,Q.jsx)($,{bright:!0,color:r.primary,children:`菜单`}),width:t,children:n.map((t,n)=>(0,Q.jsxs)($,{bright:!0,color:n===e?`black`:void 0,backgroundColor:n===e?r.highlight:void 0,children:[n===e?`> `:` `,t.label]},t.label))})}function x_(){let e=Sh(e=>e.step),t=Sh(e=>e.targets);if(mu((e,t)=>{if(t.ctrl)return;let n=Sh.getState();e===`y`||e===`Y`?n.confirmDelete():(e===`n`||e===`N`)&&n.cancel()},{isActive:vh(e)}),yh(e))return{stage:e.type,entries:t,message:e.type===`done`||e.type===`error`?e.message:void 0}}var S_=`取消(esc/n) 确定(y)`,C_=`关闭(esc)`,w_=60,T_=22;function E_(){let e=Nm(),{columns:t}=_u(),n=x_();if(!n)return;let{stage:r,entries:i,message:a}=n,o=i.length,s=r===`error`,c=r===`done`,l=s?`删除失败`:c?`删除完成`:r===`removing`?`正在删除 ${o} 个股票...`:`确定删除选中的 ${o} 个股票?`,u=s||c?a:i.map(e=>`${e.name} (${e.code})`).join(`, `),d=r===`confirm`?S_:s||c?C_:void 0,f=Math.max(Nt(l),Math.min(Nt(u??``),w_),Nt(d??``)+T_,24),p=Math.min(Math.max(t-2,1),f+4+6);return(0,Q.jsx)(eg,{title:(0,Q.jsx)($,{bright:!0,color:s?`red`:e.primary,children:l}),hint:d,width:p,children:(0,Q.jsx)($,{bright:!0,color:s?`red`:c?e.primary:`gray`,children:u})})}var D_=e=>{if(!/^\d{4}$/.test(e))return;let t=Number(e.slice(0,2))*60+Number(e.slice(2))-570;return t<0?0:t>120?t-90:t},O_=(e,t)=>{if(t<=0)return[];let n=Array.from({length:t},()=>({sum:0,count:0,minPrice:0,maxPrice:0,lastPrice:0,volume:0})),r=-1,i=0;for(let a of e){let e=D_(a.time);if(e===void 0)continue;let o=Math.min(t-1,Math.floor(e/240*t)),s=n[o];s.sum+=a.price,s.count+=1,s.minPrice=s.count===1?a.price:Math.min(s.minPrice,a.price),s.maxPrice=s.count===1?a.price:Math.max(s.maxPrice,a.price),s.lastPrice=a.price,s.volume+=Math.max(0,a.volume-i),i=a.volume,r=Math.max(r,o)}let a=[],o=0;for(let e=0;e<t;e++){let t=n[e];t.count>0?(o=t.lastPrice,a.push({avgPrice:t.sum/t.count,maxPrice:t.maxPrice,minPrice:t.minPrice,lastPrice:t.lastPrice,volume:t.volume})):e<r?a.push({avgPrice:o,maxPrice:o,minPrice:o,lastPrice:o,volume:0}):a.push({avgPrice:0,maxPrice:0,minPrice:0,lastPrice:0,volume:0})}return a},k_=e=>`date`in e,A_=e=>`sessionDate`in e,j_=e=>!k_(e)&&!A_(e),M_=(e,t)=>{let n=new Map;for(let t of e){let e=n.get(t.sessionDate)??[];e.push(t),n.set(t.sessionDate,e)}let r=[...n.entries()].sort(([e],[t])=>e.localeCompare(t));if(r.length===0)return Array.from({length:t},()=>({avgPrice:0,maxPrice:0,minPrice:0,lastPrice:0,volume:0}));let i=[];for(let e=0;e<r.length;e++){let n=Math.floor(e/r.length*t),a=Math.floor((e+1)/r.length*t)-n;if(a<=0)continue;let o=r[e][1].sort((e,t)=>e.time.localeCompare(t.time));i.push(...O_(o,a))}return i},N_=(e,t)=>e.length===0?Array.from({length:t},()=>({avgPrice:0,maxPrice:0,minPrice:0,lastPrice:0,volume:0})):Array.from({length:t},(n,r)=>{let i=t<=1?0:r/(t-1)*(e.length-1),a=e[Math.floor(i)],o=e[Math.min(Math.ceil(i),e.length-1)],s=i-Math.floor(i),c=a.close+(o.close-a.close)*s,l=e[Math.round(i)];return{avgPrice:c,maxPrice:Math.max(a.high,o.high),minPrice:Math.min(a.low,o.low),lastPrice:c,volume:l.volume}}),P_=(e,t)=>t<3?1<<t+e*3:1<<6+e,F_=e=>String.fromCharCode(10240+e),I_=e=>{let{points:t,period:n,prevClose:r,width:i,priceHeight:a,volumeHeight:o,trendColorMode:s=Sm}=e,c=t.filter(j_),l=t.filter(A_),u=t.filter(k_),d=n===`intraday`,f=n===`five-day`,p=d?O_(c,i):f?M_(l,i):N_(u,i),m=d?r:f?l[0]?.prevClose:u[0]?.close,h=d?r:void 0,g=1/0,_=-1/0;for(let e of p)e.avgPrice<=0||(g=Math.min(g,e.minPrice),_=Math.max(_,e.maxPrice));h!==void 0&&(g=Math.min(g,h),_=Math.max(_,h)),Number.isFinite(g)||(g=0,_=1),_===g&&(_+=1);let v=a*4,y=i*2,b=e=>Math.round((_-e)/(_-g)*(v-1)),x=(e,t)=>t===void 0?`gray`:hg(e-t,s),S=x(p.map(e=>e.lastPrice).filter(e=>e>0).at(-1)??0,m),C=p.map((e,t)=>{if(d)return S;if(e.lastPrice<=0)return`gray`;let n=p[t+1]?.lastPrice;if(n!==void 0&&n>0)return x(n,e.lastPrice);let r=p[t-1]?.lastPrice;return x(e.lastPrice,r!==void 0&&r>0?r:void 0)}),w=Array.from({length:a+o+1},()=>Array.from({length:i},()=>({ch:` `,color:void 0}))),T=Array.from({length:a},()=>new Uint16Array(i)),E=-1;for(let e=0;e<i;e++)p[e].avgPrice>0&&(E=e);let D;for(let e=0;e<y;e++){let t=e/2;if(t>E){D=void 0;continue}let n=p[Math.floor(t)];if(n.avgPrice<=0){D=void 0;continue}let r=p[Math.min(Math.floor(t)+1,i-1)],a=b(r.avgPrice>0?n.lastPrice+(r.lastPrice-n.lastPrice)*(t-Math.floor(t)):n.lastPrice),o=Math.floor(e/2),s=T[Math.floor(a/4)];if(s[o]=s[o]|P_(e%2,a%4),D!==void 0){let t=Math.min(D,a),n=Math.max(D,a);for(let r=t+1;r<n;r++){let t=T[Math.floor(r/4)];t[o]=t[o]|P_(e%2,r%4)}}D=a}let O=Array.from({length:a},()=>new Uint16Array(i));if(h!==void 0){let e=b(h),t=Math.floor(e/4);for(let n=0;n<y;n++){if(n%3==2)continue;let r=Math.floor(n/2);if(T[t][r]!==0)continue;let i=O[t];i[r]=i[r]|P_(n%2,e%4)}}for(let e=0;e<a;e++)for(let t=0;t<i;t++){let n=T[e][t]|O[e][t];n!==0&&(w[e][t]={ch:F_(n),color:T[e][t]===0?`gray`:C[t]})}let k=Array.from({length:o},()=>new Uint16Array(i)),A=Math.max(...p.map(e=>e.volume),0);for(let e=0;e<i;e++){let t=p[e];if(t.volume<=0||A<=0)continue;let n=o*4,r=Math.max(1,Math.round(t.volume/A*n));for(let t=n-r;t<n;t++){let n=k[Math.floor(t/4)];n[e]=n[e]|P_(0,t%4)|P_(1,t%4)}}let j=Array.from({length:i},()=>void 0),M=m;for(let e=0;e<i;e++){let t=p[e];t.lastPrice<=0||(j[e]=M===void 0?`gray`:hg(t.lastPrice-M,s),M=t.lastPrice)}for(let e=0;e<o;e++)for(let t=0;t<i;t++){let n=k[e][t];n!==0&&(w[a+e][t]={ch:F_(n),color:j[t]})}let N=[],P=(e,t)=>Math.max(0,Math.min(i-t.length,e-Math.floor(t.length/2)));if(d)N.push({col:0,labelCol:0,label:`09:30`},{col:Math.floor(i/2),labelCol:Math.max(0,Math.floor((i-11)/2)),label:`11:30/13:00`},{col:i-1,labelCol:Math.max(0,i-5),label:`15:00`});else if(f&&l.length>0){let e=[...new Set(l.map(e=>e.sessionDate))].sort();for(let t=0;t<e.length;t++){let n=Math.min(i-1,Math.floor((t+.5)/e.length*i)),r=e[t].slice(5);N.push({col:n,labelCol:P(n,r),label:r})}}else if(u.length>0){let e=e=>n===`year`?e.date.slice(0,4):n===`month`?e.date.slice(0,7):n===`week`?e.date.slice(2):e.date.slice(5),t=e(u[0]),r=e(u[Math.floor((u.length-1)/2)]),a=e(u.at(-1));N.push({col:0,labelCol:0,label:t},{col:Math.floor(i/2),labelCol:Math.max(0,Math.floor((i-r.length)/2)),label:r},{col:i-1,labelCol:Math.max(0,i-a.length),label:a})}for(let{col:e}of N)for(let t=0;t<a+o;t++)w[t][e].ch===` `&&(w[t][e]={ch:`┊`,color:`gray`});let F=w[a+o],I=(e,t)=>{for(let n=0;n<t.length&&e+n<i;n++)F[e+n]={ch:t[n],color:`gray`}};for(let e of N)I(e.labelCol,e.label);return w},L_=9,R_=4;function z_({points:e,period:t,prevClose:n,width:r,priceHeight:i=L_,volumeHeight:a=R_,bright:o=!1,trendColorMode:s}){let c=I_({points:e,period:t,prevClose:n,width:r,priceHeight:i,volumeHeight:a,trendColorMode:s});return(0,Q.jsx)(pl,{flexDirection:`column`,children:c.map((e,t)=>{let n=[];for(let t of e){let e=n.at(-1);e&&e.color===t.color?e.text+=t.ch:n.push({text:t.ch,color:t.color})}return(0,Q.jsx)($,{bright:o,children:n.map((e,t)=>(0,Q.jsx)($,{bright:o,color:e.color,children:e.text},t))},t)})})}var B_=new Map([[`sh`,`沪`],[`sz`,`深`],[`bj`,`北`]]);function V_({code:e,bright:t=!1}){let n=e.slice(0,2).toLowerCase(),r=B_.get(n);if(r)return(0,Q.jsx)($,{bright:t,color:`white`,backgroundColor:`red`,children:r})}var H_=[{key:`1`,value:`intraday`,label:`分时`},{key:`2`,value:`five-day`,label:`五日`},{key:`3`,value:`day`,label:`日K`},{key:`4`,value:`week`,label:`周K`},{key:`5`,value:`month`,label:`月K`},{key:`6`,value:`year`,label:`年K`}];function U_(){let e=Wh(e=>e.stock),t=Wh(e=>e.period),n=Wh(e=>e.status),r=Wh(e=>e.points),i=Wh(e=>e.errorMessage),a=Mm(e=>e.minuteChartPollIntervalMs),o=Mm(e=>e.klinePollIntervalMs),s=Pm(e=>e.open),c=$g(t=>{if(t.step.type!==`table`)return;let n=t.step.rows.find(t=>t.code===e?.code);return n?.kind===`quote`?n.quote:void 0});if(mu((e,t)=>{if(t.ctrl)return;let n=H_.find(t=>t.key===e);n&&Wh.getState().setPeriod(n.value)},{isActive:e!==void 0&&!s}),Kg(async n=>{e&&await Wh.getState().refreshChart(e.code,t,n)},{enabled:e!==void 0,intervalMs:t===`intraday`||t===`five-day`?a:o,restartKey:e?`${e.code}:${t}`:void 0}),e)return{stock:e,quote:c,suspended:c?c.current<=0:!1,period:t,status:n,points:r,errorMessage:i}}var W_=Gg()+4+6,G_=W_-4;function K_(){let e=Mm(e=>e.trendColorMode),t=U_();if(!t)return;let{stock:n,quote:r,suspended:i,period:a,status:o,points:s,errorMessage:c}=t,l=H_.find(e=>e.value===a)?.label??``;return(0,Q.jsxs)(eg,{title:(0,Q.jsxs)($,{bright:!0,children:[(0,Q.jsx)(V_,{code:n.code,bright:!0}),(0,Q.jsx)($,{children:` `}),(0,Q.jsx)($,{bright:!0,children:n.name}),(0,Q.jsx)($,{children:` `}),(0,Q.jsx)($,{bright:!0,color:`gray`,children:n.code}),(0,Q.jsx)($,{children:` `}),(0,Q.jsx)($,{bright:!0,color:!r||i?`gray`:hg(r.change,e),children:r?fg(r.current):`--`}),(0,Q.jsx)($,{children:` `}),(0,Q.jsx)($,{bright:!0,color:!r||i?`gray`:hg(r.changePercent,e),children:r?i?`停牌`:mg(r.changePercent):`--`}),(0,Q.jsx)($,{children:` `}),(0,Q.jsx)($,{bright:!0,color:!r||i?`gray`:hg(r.change,e),children:r?pg(r.change):`--`})]}),extra:(0,Q.jsx)($,{bright:!0,children:H_.map((e,t)=>(0,Q.jsxs)($,{bright:!0,color:e.value===a?`cyan`:`gray`,children:[t>0?` `:``,`[`,e.key,`]`,e.label]},e.value))}),width:W_,children:[(0,Q.jsxs)(pl,{flexDirection:`column`,children:[(0,Q.jsx)(Ng,{bright:!0,segments:Lg(Ug)}),(0,Q.jsx)(Ng,{bright:!0,segments:r?Rg(Ug,r,e):zg(Ug,n.code,n.name)})]}),(0,Q.jsx)(pl,{marginTop:1,height:14,children:o===`loading`?(0,Q.jsxs)($,{bright:!0,color:`gray`,children:[`正在获取`,l,`行情...`]}):o===`error`?(0,Q.jsx)($,{bright:!0,color:`red`,children:c}):s.length===0?(0,Q.jsxs)($,{bright:!0,color:`gray`,children:[`暂无`,l,`行情数据`]}):(0,Q.jsx)(z_,{bright:!0,points:s,period:a,prevClose:r?.prevClose,trendColorMode:e,width:G_})})]})}var q_=Wg()+4;function J_({children:e}){let{columns:t,rows:n}=_u(),r=t>=q_,i=n>=26;return r&&i?e:(0,Q.jsxs)(pl,{width:t,height:n,flexDirection:`column`,alignItems:`center`,justifyContent:`center`,children:[(0,Q.jsx)($,{color:`yellow`,children:`终端尺寸过小:`}),(0,Q.jsxs)(pl,{children:[(0,Q.jsx)($,{color:r?`green`:`red`,children:`宽度 = ${t}`}),(0,Q.jsx)($,{children:` `}),(0,Q.jsx)($,{color:i?`green`:`red`,children:`高度 = ${n}`})]}),(0,Q.jsx)(pl,{height:1}),(0,Q.jsx)($,{color:`gray`,children:`所需最小尺寸:`}),(0,Q.jsx)($,{color:`gray`,children:`宽度 = ${q_} 高度 = 26`})]})}function Y_(){let{exit:e}=hu(),{overlayOpen:t,dialogMenuOpen:n,dialogStockDetailOpen:r,dialogRemoveConfirmOpen:i}=Gh(),a=p_[sg(e=>e.screen)];return mu((n,i)=>{if(i.escape){if(r){Wh.getState().close();return}let e=Sh.getState().step;if(e.type===`confirm`){Sh.getState().cancel();return}if(e.type===`done`||e.type===`error`){Sh.getState().dismiss();return}if(yh(e))return;Pm.getState().toggle();return}n===`q`&&!t&&e()}),(0,Q.jsxs)(J_,{children:[(0,Q.jsx)(a.Component,{title:a.title,hint:a.hint}),n&&(0,Q.jsx)(b_,{}),r&&(0,Q.jsx)(K_,{}),i&&(0,Q.jsx)(E_,{})]})}var X_=100,Z_=e=>Object.keys(e).length>0;async function Q_(e){let t=await lh();Mm.getState().hydrateSettings(qm(t));let n={},r,i,a=Promise.resolve(),o=async()=>{if(!Z_(n))return;let t=n;n={};try{await dh(t),r=void 0}catch(i){n={...t,...n},r=i;try{e(i)}catch{}}},s=()=>(i&&=(clearTimeout(i),void 0),a=a.then(o),a),c=()=>{i&&clearTimeout(i),i=setTimeout(()=>{i=void 0,s()},X_)},l=Mm.subscribe((e,t)=>{Am(e,t)||(n={...n,...jm(e,t)},c())}),u,d=async()=>(l(),await s(),r&&Z_(n)&&await o(),r===void 0);return{stop:()=>u??=d()}}var $_=`用法
151
151
  $ leek-box-cli [command]
152
152
 
153
153
  命令
154
- ${Object.entries(Qg).map(([e,t])=>` ${e.padEnd(13)}${t.description}`).join(`
154
+ ${Object.entries(p_).map(([e,t])=>` ${e.padEnd(13)}${t.description}`).join(`
155
155
  `)}
156
156
 
157
157
  选项
158
158
  -v, --version 查看版本
159
- -h, --help 查看帮助`,N_=fm(M_,{importMeta:import.meta,commands:$g,description:!1,autoHelp:!1,helpIndent:0,flags:{help:{type:`boolean`,shortFlag:`h`},version:{type:`boolean`,shortFlag:`v`}}});N_.flags.help&&(console.log(M_),n.exit(0));var P_=async()=>{let e=await j_(e=>{let t=e instanceof Error?e.message:String(e);console.error(`设置保存失败: ${t}`)});try{bh.setState({screen:t_(N_.command)}),await Wl((0,Q.jsx)(O_,{}),{alternateScreen:!0,concurrent:!0}).waitUntilExit()}finally{await e.stop()||(n.exitCode=1)}};try{await P_()}catch(e){let t=e instanceof Error?e.message:String(e);console.error(`运行失败: ${t}`),n.exitCode=1}export{};
159
+ -h, --help 查看帮助`,ev=fm($_,{importMeta:import.meta,commands:m_,description:!1,autoHelp:!1,helpIndent:0,flags:{help:{type:`boolean`,shortFlag:`h`},version:{type:`boolean`,shortFlag:`v`}}});ev.flags.help&&(console.log($_),n.exit(0));var tv=async()=>{let e=await Q_(e=>{let t=e instanceof Error?e.message:String(e);console.error(`设置保存失败: ${t}`)});try{sg.setState({screen:g_(ev.command)}),await Wl((0,Q.jsx)(Y_,{}),{alternateScreen:!0,concurrent:!0}).waitUntilExit()}finally{await e.stop()||(n.exitCode=1)}};try{await tv()}catch(e){let t=e instanceof Error?e.message:String(e);console.error(`运行失败: ${t}`),n.exitCode=1}export{};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leek-box-cli",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "韭菜盒子, 终端股票自选股看板, 基于 Ink 构建的交互式 CLI 工具",
5
5
  "keywords": [
6
6
  "a股",
@@ -67,5 +67,5 @@
67
67
  "node": "^22.19.0 || >=24.0.0",
68
68
  "pnpm": ">=11.0.0"
69
69
  },
70
- "packageManager": "pnpm@12.0.0"
70
+ "packageManager": "pnpm@12.1.0"
71
71
  }