/* ================= 基础变量 ================= */
:root{
  --bg:#0d1117;
  --bg-soft:#131a23;
  --card:#161d27;
  --card-2:#1b2430;
  --line:#232e3d;
  --line-soft:#1d2733;
  --txt:#e6edf3;
  --txt-dim:#8b98a9;
  --txt-mute:#5f6d7e;
  --acc:#4f9cff;
  --acc-2:#7c5cff;
  --ok:#2ecc8f;
  --warn:#f5a524;
  --bad:#f2545b;
  --c-fund:#f5a524;
  --c-stock:#4f9cff;
  --c-deposit:#2ecc8f;
  --radius:14px;
  --radius-sm:9px;
  --shadow:0 8px 28px rgba(0,0,0,.35);
}

*{box-sizing:border-box;margin:0;padding:0}
/* hidden 属性优先于任何 display 设置（避免 flex/grid 覆盖 [hidden]） */
[hidden]{display:none !important}
html,body{height:100%;-webkit-text-size-adjust:100%;text-size-adjust:100%}
body{
  font-family:"Segoe UI","Microsoft YaHei","PingFang SC",system-ui,-apple-system,sans-serif;
  background:var(--bg);color:var(--txt);font-size:14px;-webkit-font-smoothing:antialiased;
}
::-webkit-scrollbar{width:9px;height:9px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-thumb{background:#2a3543;border-radius:6px}
::-webkit-scrollbar-thumb:hover{background:#3a4757}

.app{display:flex;min-height:100vh;width:100%;overflow-x:hidden}

/* ================= 侧边栏 ================= */
.sidebar{
  width:236px;flex:0 0 236px;
  background:linear-gradient(180deg,#121923 0%,#0f151d 100%);
  border-right:1px solid var(--line-soft);
  display:flex;flex-direction:column;
  position:sticky;top:0;height:100vh;
}
.brand{display:flex;align-items:center;gap:11px;padding:20px 18px;border-bottom:1px solid var(--line-soft)}
.brand-logo{
  width:36px;height:36px;border-radius:10px;flex:0 0 36px;
  background:linear-gradient(135deg,var(--c-stock),var(--acc-2));
  display:grid;place-items:center;font-size:18px;color:#fff;
  box-shadow:0 4px 14px rgba(79,156,255,.32);
}
.brand-text{display:flex;flex-direction:column;line-height:1.35}
.brand-text strong{font-size:15px;letter-spacing:.3px}
.brand-text span{font-size:11px;color:var(--txt-mute)}

.nav{flex:1;padding:16px 12px;overflow-y:auto}
.nav-group{
  font-size:10.5px;text-transform:uppercase;letter-spacing:1.2px;
  color:var(--txt-mute);padding:16px 10px 7px;font-weight:700;
}
.nav-item{
  display:flex;align-items:center;gap:10px;padding:9px 11px;border-radius:var(--radius-sm);
  color:var(--txt-dim);cursor:pointer;font-size:13.5px;transition:.16s;margin-bottom:2px;user-select:none;
}
.nav-item:hover{background:#1a2432;color:var(--txt)}
.nav-item.active{background:linear-gradient(90deg,rgba(79,156,255,.18),rgba(79,156,255,.02));color:#fff;box-shadow:inset 2px 0 0 var(--acc)}
.ni-icon{width:17px;text-align:center;font-size:13px;opacity:.9}

.sidebar-foot{
  border-top:1px solid var(--line-soft);padding:13px 18px;
  display:flex;align-items:center;gap:10px;
}
.sidebar-foot small{display:block;font-size:10.5px;color:var(--txt-mute)}
.sidebar-foot strong{font-size:12px;color:var(--txt-dim);font-weight:600}
.sync-dot{width:8px;height:8px;border-radius:50%;background:var(--txt-mute);box-shadow:0 0 0 3px rgba(139,152,169,.14);flex:0 0 8px}
.sync-dot.ok{background:var(--ok);box-shadow:0 0 0 3px rgba(46,204,143,.16)}
.sync-dot.err{background:var(--bad);box-shadow:0 0 0 3px rgba(242,84,91,.16)}
/* 刷新中：呼吸动画 */
.sync-dot.busy{background:var(--acc);box-shadow:0 0 0 3px rgba(79,156,255,.18);animation:syncPulse .9s ease-in-out infinite}
@keyframes syncPulse{0%,100%{opacity:1}50%{opacity:.35}}

/* ================= 主区 ================= */
.main{flex:1 1 0;min-width:0;display:flex;flex-direction:column;overflow-x:hidden}
.topbar{
  display:flex;align-items:flex-end;justify-content:space-between;gap:18px;
  padding:20px 28px 16px;border-bottom:1px solid var(--line-soft);
  background:rgba(13,17,23,.9);backdrop-filter:blur(10px);
  position:sticky;top:0;z-index:20;
}
.topbar-left{min-width:0}
.topbar h1{font-size:20px;font-weight:650;letter-spacing:.2px}
.topbar p{font-size:12.5px;color:var(--txt-mute);margin-top:4px}
.topbar-right{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.menu-toggle{
  display:none;width:34px;height:34px;flex:0 0 34px;
  background:var(--card);border:1px solid var(--line);border-radius:9px;
  color:var(--txt-dim);font-size:15px;cursor:pointer;align-self:center;
}

.range-switch{display:flex;background:var(--card);border:1px solid var(--line);border-radius:10px;padding:3px;gap:2px}
.range-switch button{
  border:0;background:transparent;color:var(--txt-dim);padding:6px 14px;border-radius:7px;
  cursor:pointer;font-size:13px;font-family:inherit;transition:.15s;
}
.range-switch button:hover{color:var(--txt)}
.range-switch button.active{background:linear-gradient(135deg,var(--acc),var(--acc-2));color:#fff;font-weight:600;box-shadow:0 3px 10px rgba(79,156,255,.28)}

.range-picker{display:flex;align-items:center;gap:6px}
.range-sep{color:var(--txt-mute);font-size:12px}
.input{
  background:#0e141c;border:1px solid var(--line);color:var(--txt);
  padding:6px 10px;border-radius:8px;font-size:12.5px;font-family:inherit;color-scheme:dark;
}
.input:focus{outline:none;border-color:var(--acc)}
.range-picker .input{width:132px}
.select{cursor:pointer}

.btn{
  border:1px solid var(--line);background:var(--card-2);color:var(--txt-dim);
  padding:7px 13px;border-radius:8px;cursor:pointer;font-size:12.5px;
  font-family:inherit;transition:.15s;white-space:nowrap;
}
.btn:hover{border-color:#33455c;color:var(--txt)}
.btn-primary{background:linear-gradient(135deg,var(--acc),var(--acc-2));border-color:transparent;color:#fff;font-weight:600}
.btn-primary:hover{opacity:.9;color:#fff}
.btn-ghost{background:transparent}
.btn-danger{border-color:rgba(242,84,91,.4);color:var(--bad)}
.btn-danger:hover{background:rgba(242,84,91,.1);color:var(--bad)}
.btn:disabled{opacity:.4;cursor:not-allowed}
.btn-sm{padding:4px 9px;font-size:11.5px}
.spin-target{display:inline-block}
.spin-target.busy{animation:spin .9s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}

/* ================= 提示条 ================= */
.alert-bar{
  margin:0;padding:9px 28px;font-size:12.5px;
  background:rgba(245,165,36,.12);border-bottom:1px solid rgba(245,165,36,.28);color:#f8c471;
}
.alert-bar[hidden]{display:none}
.alert-bar.error{background:rgba(242,84,91,.12);border-bottom-color:rgba(242,84,91,.3);color:#f79196}
.alert-bar.ok{background:rgba(46,204,143,.1);border-bottom-color:rgba(46,204,143,.25);color:#6fdcaa}

/* ================= 视图 ================= */
.views{padding:22px 28px 44px;flex:1;min-width:0;overflow-x:hidden}
.view{display:none;animation:fade .28s ease;min-width:0}
.view.active{display:block}
@keyframes fade{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}

/* ================= KPI ================= */
.kpi-grid{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:14px;margin-bottom:18px}
.kpi{
  background:var(--card);border:1px solid var(--line);border-radius:var(--radius);
  padding:16px 18px;position:relative;overflow:hidden;
}
.kpi::after{content:"";position:absolute;inset:0 0 auto 0;height:2px;background:linear-gradient(90deg,var(--acc),var(--acc-2));opacity:.65}
.kpi-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:9px;gap:8px}
.kpi-label{font-size:12.5px;color:var(--txt-dim);font-weight:500}
.kpi-badge{font-size:11px;padding:2px 8px;border-radius:20px;font-weight:650;font-variant-numeric:tabular-nums;white-space:nowrap}
.kpi-badge.up{background:rgba(46,204,143,.14);color:var(--ok)}
.kpi-badge.down{background:rgba(242,84,91,.14);color:var(--bad)}
.kpi-badge.flat{background:rgba(139,152,169,.14);color:var(--txt-dim)}
.kpi-value{font-size:24px;font-weight:680;letter-spacing:-.4px;font-variant-numeric:tabular-nums}
.kpi-foot{font-size:11.5px;color:var(--txt-mute);margin-top:6px}

/* 可点击的 KPI（累计盈亏 -> 持仓明细） */
.kpi-clickable{cursor:pointer;transition:border-color .15s,transform .15s,box-shadow .15s}
.kpi-clickable:hover{border-color:var(--acc);transform:translateY(-1px);
  box-shadow:0 6px 20px rgba(0,0,0,.22)}
.kpi-clickable:focus-visible{outline:2px solid var(--acc);outline-offset:2px}
.kpi-link{
  margin-top:10px;font-size:11.5px;color:var(--acc);font-weight:600;
  opacity:0;transition:opacity .15s;
}
.kpi-clickable:hover .kpi-link,.kpi-clickable:focus-visible .kpi-link{opacity:1}
@media(hover:none){
  .kpi-link{opacity:1}
}

/* 回溯口径标签 */
.h3-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.badge-hb{
  display:inline-block;margin-left:8px;vertical-align:middle;
  font-size:10.5px;font-weight:600;letter-spacing:0;
  padding:2px 8px;border-radius:20px;
  background:rgba(245,165,36,.16);color:#f5a524;
  border:1px solid rgba(245,165,36,.35);
}

/* 基金穿透分析 */
#fbTable{min-width:0}
#fbTable th,#fbTable td{padding:9px 10px}
.fb-tgt-inline{display:block;font-size:10px;color:var(--acc);margin-top:2px}
.fbcard{cursor:default;margin-bottom:7px}
.fbcard .hc-mid{flex-wrap:wrap;row-gap:2px}
.fbcard .hc-sub{flex:0 0 auto}
.fbcard .hc-pnl{flex:1 1 auto;min-width:0;text-align:right;line-height:1.6;
  font-weight:500;font-size:11px;white-space:normal}
.fb-bars{display:flex;flex-direction:column;gap:9px;justify-content:center;padding:6px 2px}
.fb-row{display:grid;grid-template-columns:52px 1fr 66px 92px;align-items:center;gap:10px;
  font-size:12px;font-variant-numeric:tabular-nums}
.fb-key{display:flex;align-items:center;gap:6px;color:var(--txt-dim);white-space:nowrap}
.fb-key i{width:9px;height:9px;border-radius:3px;flex-shrink:0}
.fb-track{height:9px;border-radius:5px;background:var(--card-2);overflow:hidden;position:relative}
.fb-fill{display:block;height:100%;border-radius:5px;transition:width .35s ease}
.fb-pct{text-align:right;font-weight:650;color:var(--txt)}
.fb-amt{text-align:right;color:var(--txt-mute)}
.fb-formula{margin:14px 0 10px;padding:10px 12px;border-radius:9px;
  background:var(--card-2);border:1px solid var(--line-soft);font-size:11.5px;line-height:1.7;color:var(--txt-dim)}
.fb-formula b{color:var(--txt)}
.fb-tgt{display:block;font-size:10.5px;color:var(--acc);margin-top:2px}
@media(max-width:680px){
  .fb-row{grid-template-columns:44px 1fr 58px;}
  .fb-amt{display:none}
}

/* 「计入总资产」开关 */
.table th.center,.table td.center{text-align:center}
/* 录入表单里的勾选项 */
.check-line{
  display:flex;align-items:center;gap:8px;margin:6px 0 2px;
  font-size:12px;color:var(--txt-dim);cursor:pointer;line-height:1.5;
}
/* 同时是 .field 时要覆盖掉「纵向排列」 */
.field.check-line{
  flex-direction:row;align-items:center;justify-content:flex-start;
  grid-column:1/-1;gap:8px;margin:2px 0;
}
.field.check-line span{font-size:12px;color:var(--txt-dim);white-space:nowrap}
.check-line input{accent-color:var(--acc);width:15px;height:15px;flex-shrink:0;cursor:pointer}
/* 「独立持仓」徽标 */
.sep-badge{background:rgba(124,92,255,.16);color:#a48cff;border:1px solid rgba(124,92,255,.35)}
.switch{position:relative;display:inline-block;width:34px;height:18px;vertical-align:middle;cursor:pointer}
.switch input{position:absolute;opacity:0;width:0;height:0}
.switch-slider{
  position:absolute;inset:0;border-radius:20px;background:#2a3543;
  transition:background .18s;border:1px solid var(--line-soft);
}
.switch-slider::before{
  content:"";position:absolute;left:2px;top:1.5px;width:13px;height:13px;
  border-radius:50%;background:#8b98a9;transition:transform .18s,background .18s;
}
.switch input:checked + .switch-slider{background:rgba(46,204,143,.28);border-color:rgba(46,204,143,.5)}
.switch input:checked + .switch-slider::before{transform:translateX(16px);background:#2ecc8f}
.switch input:disabled + .switch-slider{opacity:.5;cursor:wait}
/* 未计入的行整体压暗 */
.table tr.row-inactive td{opacity:.45}
.table tr.row-inactive:hover td{opacity:.7}
/* 刚切换「计入」的行：短暂高亮，方便找到它 */
@keyframes rowFlash{0%{background:rgba(79,156,255,.22)}100%{background:transparent}}
.table tr.row-flash td{animation:rowFlash 1.5s ease-out}

/* 手机端持仓卡片列表 */
.hcard-list{display:none}
.hcard{
  background:var(--card-2);border:1px solid var(--line-soft);border-radius:11px;
  padding:10px 12px;margin-bottom:8px;cursor:pointer;
  font-variant-numeric:tabular-nums;transition:border-color .15s;
}
.hcard:active{border-color:var(--acc)}
.hcard .hc-top{display:flex;justify-content:space-between;align-items:baseline;gap:10px}
.hcard .hc-name{font-size:13.5px;font-weight:600;color:var(--txt);min-width:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.hcard .hc-value{font-size:14px;font-weight:700;color:var(--txt);flex-shrink:0}
.hcard .hc-mid{display:flex;justify-content:space-between;align-items:baseline;
  gap:10px;margin-top:5px;font-size:11.5px}
.hcard .hc-sub{color:var(--txt-mute);min-width:0;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.hcard .hc-pnl{flex-shrink:0;font-weight:600}
.hcard .hc-bot{display:flex;justify-content:space-between;align-items:center;
  gap:10px;margin-top:7px;font-size:11px;color:var(--txt-mute)}
.hcard .hc-cat{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.hcard.row-inactive{opacity:.5}

@media(max-width:760px){
  #holdingsTable{display:none}
  #fbTable{display:none}
  .hcard-list{display:block}
  /* KPI 改 2×2，避免横向滚动 + 文案被截断 */
  .kpi-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
  .kpi{padding:13px 14px}
  .kpi:last-child{grid-column:auto}
  .kpi-value{font-size:19px}
  .kpi-label{font-size:11.5px}
  .kpi-foot{font-size:10.5px;line-height:1.45}
  .kpi-badge{font-size:10px;padding:2px 6px}
}

/* 可折叠卡片（目标比例设置） */
.card-collapsible .card-toggle{cursor:pointer;user-select:none;display:flex;align-items:center;gap:6px}
.card-collapsible .ct-arrow{font-size:11px;color:var(--txt-mute);transition:transform .15s}
.card-collapsible .card-body{overflow:hidden}
.card-collapsible.collapsed .card-body{display:none}
.card-collapsible.collapsed .card-head{margin-bottom:0}

/* 单只基金目标占比 */
.target-sec-title{
  margin:18px 0 10px;padding-top:14px;border-top:1px solid var(--line-soft);
  font-size:12.5px;font-weight:600;color:var(--txt);
}
.target-funds{display:flex;flex-direction:column;gap:6px}
.tf-item{
  display:grid;grid-template-columns:1fr 88px 96px 62px;align-items:center;gap:10px;
  background:var(--card-2);border:1px solid var(--line-soft);border-radius:9px;
  padding:7px 11px;font-size:12px;font-variant-numeric:tabular-nums;
}
.tf-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--txt)}
.tf-cur{color:var(--txt-mute);text-align:right;white-space:nowrap}
.tf-input{display:flex;align-items:center;gap:4px}
.tf-input .input{padding:4px 7px;font-size:12px;text-align:right}
.tf-diff{text-align:right;white-space:nowrap;font-weight:600}
@media(max-width:680px){
  .tf-item{grid-template-columns:1fr auto;row-gap:3px;padding:9px 11px}
  .tf-name{grid-column:1/-1;font-weight:600;white-space:normal}
  .tf-cur{grid-column:1;text-align:left}
  .tf-diff{grid-column:1;text-align:left;font-size:11px}
  .tf-input{grid-column:2;grid-row:2/4;justify-self:end;align-self:center}
}

/* 存款概览 */
.dep-cards{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
@media(max-width:760px){ .dep-cards{grid-template-columns:1fr} }
.dep-card{
  background:var(--card-2);border:1px solid var(--line-soft);border-radius:11px;
  padding:11px 13px;font-variant-numeric:tabular-nums;
}
.dep-card .dc-top{display:flex;justify-content:space-between;align-items:baseline;gap:10px}
.dep-card .dc-name{font-size:13.5px;font-weight:600;color:var(--txt);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dep-card .dc-bal{font-size:15px;font-weight:700;color:#22d3ee;flex-shrink:0}
.dep-card .dc-mid{display:flex;justify-content:space-between;align-items:baseline;
  gap:10px;margin-top:5px;font-size:11.5px;color:var(--txt-mute)}
.dep-card .dc-delta{flex-shrink:0;font-weight:600}
.dep-card .dc-bot{display:flex;justify-content:space-between;align-items:baseline;
  gap:10px;margin-top:6px;font-size:11px;color:var(--txt-dim)}
.dep-card.row-inactive{opacity:.5}

/* KPI 详情抽屉 */
.kpi-detail-stats{margin-bottom:12px}
.kds-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
.kds-item{
  background:var(--card-2);border:1px solid var(--line-soft);border-radius:9px;
  padding:9px 11px;display:flex;flex-direction:column;gap:3px;min-width:0;
}
.kds-k{font-size:11px;color:var(--txt-mute)}
.kds-v{font-size:15px;font-weight:650;color:var(--txt);
  font-variant-numeric:tabular-nums;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.kds-bar{display:block;height:7px;border-radius:4px;background:var(--card);overflow:hidden}
.kds-bar span{display:block;height:100%;border-radius:4px;min-width:2px}
#kpiSheet .trades-chart{margin-bottom:12px}
#kpiSheet .trades-chart canvas{height:200px}
/* 详情表只有 3~4 列，不需要 720px 的最小宽度 */
#kpiTable{min-width:0}
#kpiTable th,#kpiTable td{padding:8px 8px}
#kpiTable th:first-child,#kpiTable td:first-child{padding-left:2px}
#kpiTable th:last-child,#kpiTable td:last-child{padding-right:2px}
#kpiTable .kds-bar{display:block;height:7px;border-radius:4px;background:var(--card);overflow:hidden;min-width:60px}
#kpiTable .kds-bar span{display:block;height:100%;border-radius:4px;min-width:2px}
@media(max-width:680px){
  /* 手机端收起「成本→市值」「力度」两列，避免横向滚动 */
  #kpiTable[data-kind="pnl"] th:nth-child(4),
  #kpiTable[data-kind="pnl"] td:nth-child(4),
  #kpiTable[data-kind="pnl"] th:nth-child(5),
  #kpiTable[data-kind="pnl"] td:nth-child(5){display:none}
  /* 固定布局 + 名称省略号，长名字不再把表格撑宽 */
  #kpiTable{table-layout:fixed;width:100%}
  #kpiTable th:first-child,#kpiTable td:first-child{
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  }
  #kpiTable th:nth-child(2),#kpiTable td:nth-child(2){width:92px}
  #kpiTable th:nth-child(3),#kpiTable td:nth-child(3){width:74px}
}

/* 持仓明细表尾汇总行 */
.table tfoot td{
  background:var(--card-2);border-top:1px solid var(--line);
  font-variant-numeric:tabular-nums;padding-top:11px;padding-bottom:11px;
}
.table tfoot .sum-label{font-size:12px;color:var(--txt-dim);white-space:nowrap}
.table tfoot .sum-label b{color:var(--txt);font-weight:700}
.table tfoot .sum-strong{font-weight:700;color:var(--txt)}

/* 迷你走势图：折线始终显示，悬停时出现圆点 */
.spark{cursor:crosshair;overflow:visible}
.spark .spark-dot{pointer-events:none;transition:r .12s}

/* 次要文字 */
.muted{color:var(--txt-mute)}
.card-sub-hint{margin-top:4px;color:var(--acc);font-size:11.5px}

/* ================= 卡片 ================= */
.grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-bottom:16px}
.grid-2>*{min-width:0}
.card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:18px;box-shadow:var(--shadow);min-width:0;overflow:hidden}
.card-head{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;margin-bottom:16px;flex-wrap:wrap}
.card-head-right{display:flex;align-items:center;gap:14px;flex-wrap:wrap;justify-content:flex-end}
.card-head h3{font-size:14.5px;font-weight:620}
.card-sub{font-size:11.5px;color:var(--txt-mute);margin-top:3px}

/* 图表内嵌的粒度切换（迷你按钮组） */
.mini-range{
  display:flex;background:var(--card-2);border:1px solid var(--line);
  border-radius:8px;padding:2px;gap:1px;
}
.mini-range button{
  border:0;background:transparent;color:var(--txt-mute);
  padding:4px 11px;border-radius:6px;cursor:pointer;
  font-size:12px;font-family:inherit;transition:.14s;min-width:30px;
}
.mini-range button:hover{color:var(--txt)}
.mini-range button.active{
  background:linear-gradient(135deg,var(--acc),var(--acc-2));
  color:#fff;font-weight:600;
}

.chart-wrap{position:relative;height:260px;width:100%;overflow:hidden}
.chart-donut{height:300px}
.chart-tall{height:340px}
canvas{display:block;width:100%;height:100%}

.legend{display:flex;flex-wrap:wrap;gap:12px;align-items:center}
.legend-item{display:flex;align-items:center;gap:6px;font-size:11.5px;color:var(--txt-dim);cursor:pointer;transition:.15s;user-select:none}
.legend-item.off{opacity:.35}
.legend-dot{width:9px;height:9px;border-radius:3px;flex:0 0 9px}

/* ================= 表格 ================= */
.table-wrap{overflow-x:auto;margin:0 -18px;padding:0 18px}
.table{width:100%;border-collapse:collapse;font-size:12.5px;min-width:720px}
.table th{
  text-align:left;padding:9px 11px;color:var(--txt-mute);font-weight:600;font-size:11px;
  text-transform:uppercase;letter-spacing:.6px;border-bottom:1px solid var(--line);white-space:nowrap;
}
.table td{padding:10px 11px;border-bottom:1px solid var(--line-soft);color:var(--txt-dim);white-space:nowrap}
.table tbody tr:hover{background:#1a2330}
.table tbody tr:last-child td{border-bottom:0}
.table .num{text-align:right;font-variant-numeric:tabular-nums}
.table td.num{color:var(--txt)}
.table .name{color:var(--txt);font-weight:520}
.table .link{cursor:pointer;color:var(--acc)}
.table .link:hover{text-decoration:underline}
.table .empty{text-align:center;padding:26px;color:var(--txt-mute)}

.tag{display:inline-flex;align-items:center;gap:5px;padding:2px 9px;border-radius:20px;font-size:11px;font-weight:600}
.tag i{width:6px;height:6px;border-radius:50%;display:block}
.code{font-family:"Cascadia Code",Consolas,monospace;font-size:11.5px;color:var(--txt-mute)}

.delta-up{color:var(--ok);font-weight:600}
.delta-down{color:var(--bad);font-weight:600}
.delta-flat{color:var(--txt-mute)}

/* ================= 表单 ================= */
.settings-body{display:flex;flex-direction:column;gap:12px}
.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.field{display:flex;flex-direction:column;gap:5px}
.field[hidden]{display:none}
.field span{font-size:11.5px;color:var(--txt-dim)}
.field span i{color:var(--bad);font-style:normal}
.field-wide{grid-column:1/-1}
.field .input{width:100%;padding:8px 11px;font-size:13px}
.btn-row{display:flex;flex-direction:row;gap:9px;flex-wrap:wrap;align-items:center}
.field-wide.btn-row{margin-top:4px}
.hint{font-size:11.5px;color:var(--txt-mute)}
.hint.ok{color:var(--ok)}
.hint.err{color:var(--bad)}
.hint.warn{color:var(--warn)}

.search-box{display:flex;gap:8px}
.search-box .input{flex:1;padding:8px 12px;font-size:13px}
.search-results{max-height:330px;overflow-y:auto;display:flex;flex-direction:column;gap:6px}
.search-item{
  display:flex;align-items:center;gap:10px;padding:9px 12px;
  background:var(--card-2);border:1px solid var(--line-soft);border-radius:9px;cursor:pointer;transition:.14s;
}
.search-item:hover{border-color:var(--acc);background:#1c2735}
.search-item .si-name{font-size:13px;color:var(--txt);font-weight:520;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.search-item .si-meta{font-size:11px;color:var(--txt-mute)}
.search-item .si-cat{font-size:10.5px;padding:1px 7px;border-radius:20px;background:rgba(79,156,255,.14);color:var(--acc)}

.textarea{
  width:100%;min-height:200px;background:#0e141c;color:#c7d3e0;
  border:1px solid var(--line);border-radius:10px;padding:12px;
  font-family:"Cascadia Code",Consolas,monospace;font-size:12px;line-height:1.6;resize:vertical;
}
.textarea:focus{outline:none;border-color:var(--acc)}

.doc{font-size:12.5px;color:var(--txt-dim);line-height:1.75}
.doc h4{color:var(--acc);font-size:12.5px;margin:12px 0 4px;font-weight:650}
.doc h4:first-child{margin-top:0}
.doc ul{list-style:none;margin-top:4px}
.doc li{padding-left:13px;position:relative;margin-bottom:3px}
.doc li::before{content:"›";position:absolute;left:2px;color:var(--txt-mute)}
.doc code{background:#0e141c;border:1px solid var(--line);padding:1px 6px;border-radius:5px;font-size:11.5px;color:#7fd3e8}
.doc .kv{display:flex;justify-content:space-between;gap:10px;padding:5px 0;border-bottom:1px solid var(--line-soft)}
.doc .kv:last-child{border-bottom:0}
.doc .kv b{color:var(--txt);font-weight:600}

/* ================= 再平衡 ================= */
.rebalance-list{display:flex;flex-direction:column;gap:11px}
.rb-item{
  background:var(--card-2);border:1px solid var(--line-soft);border-radius:11px;padding:13px 15px;
  display:flex;flex-direction:column;gap:9px;
}
.rb-head{display:flex;align-items:center;gap:9px}
.rb-name{font-size:13.5px;color:var(--txt);font-weight:600;flex:1}
.rb-badge{padding:2px 9px;border-radius:20px;font-size:11px;font-weight:650}
.rb-over{background:rgba(242,84,91,.14);color:var(--bad)}
.rb-under{background:rgba(79,156,255,.14);color:var(--acc)}
.rb-even{background:rgba(46,204,143,.14);color:var(--ok)}
.rb-bar{display:flex;height:9px;border-radius:5px;overflow:hidden;background:#1b2430;position:relative}
.rb-cur{background:var(--acc)}
.rb-target{background:var(--ok);opacity:.85}
.rb-legend{display:flex;justify-content:space-between;font-size:11px;color:var(--txt-mute)}
.rb-advice{font-size:11.5px;color:var(--txt-dim);padding-top:2px;border-top:1px solid var(--line-soft)}

.target-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}
.target-item{background:var(--card-2);border:1px solid var(--line-soft);border-radius:11px;padding:14px}
.target-item .ti-head{display:flex;align-items:center;gap:8px;margin-bottom:10px}
.target-item .ti-name{font-size:13.5px;color:var(--txt);font-weight:600;flex:1}
.target-item .ti-val{display:flex;align-items:center;gap:8px}
.target-item .ti-val input{
  width:74px;background:#0e141c;border:1px solid var(--line);color:var(--txt);
  padding:6px 9px;border-radius:8px;font-size:13px;font-family:inherit;text-align:right;
}
.target-item .ti-val input:focus{outline:none;border-color:var(--acc)}
.target-item .ti-cur{font-size:11.5px;color:var(--txt-mute);margin-top:8px}

/* ================= Tooltip / Loading ================= */
.tooltip{
  position:fixed;pointer-events:none;z-index:100;
  background:rgba(10,14,20,.97);border:1px solid var(--line);
  border-radius:9px;padding:9px 12px;font-size:12px;color:var(--txt);
  opacity:0;transition:opacity .12s;max-width:280px;box-shadow:0 8px 26px rgba(0,0,0,.5);
}
.tooltip.show{opacity:1}
.tt-title{font-weight:650;margin-bottom:5px;font-size:12.5px}
.tt-row{display:flex;align-items:center;gap:10px;justify-content:space-between;color:var(--txt-dim)}
.tt-row .tt-k{color:var(--txt-mute);font-size:11.5px}
.tt-row .tt-v{font-variant-numeric:tabular-nums;font-weight:600;color:var(--txt)}
.tt-sep{height:1px;background:var(--line);margin:6px 0}

.loading{
  position:fixed;inset:0;z-index:200;background:rgba(8,11,16,.55);
  display:flex;align-items:center;justify-content:center;gap:12px;
  font-size:13px;color:var(--txt-dim);backdrop-filter:blur(2px);
}
.loading[hidden]{display:none}
.spinner{
  width:26px;height:26px;border:2.5px solid rgba(255,255,255,.14);
  border-top-color:var(--acc);border-radius:50%;animation:spin .8s linear infinite;
}

/* ================= 存款更新 ================= */
.dep-update-head{display:flex;align-items:flex-end;gap:10px;flex-wrap:wrap}
.dep-list{display:flex;flex-direction:column;gap:10px}
.dep-item{
  background:var(--card-2);border:1px solid var(--line-soft);
  border-radius:12px;padding:13px 15px;
  display:flex;align-items:center;gap:14px;flex-wrap:wrap;
}
.dep-item .di-info{flex:1;min-width:170px}
.dep-item .di-name{font-size:13.5px;color:var(--txt);font-weight:560}
.dep-item .di-sub{font-size:11.5px;color:var(--txt-mute);margin-top:3px}
.dep-item .di-input{display:flex;align-items:center;gap:7px}
.dep-item .di-input input{
  width:150px;background:#0e141c;border:1px solid var(--line);color:var(--txt);
  padding:9px 11px;border-radius:9px;font-size:15px;font-family:inherit;text-align:right;
}
.dep-item .di-input input:focus{outline:none;border-color:var(--acc)}
.dep-item .di-input span{font-size:12px;color:var(--txt-mute)}
.dep-item .di-delta{font-size:12px;min-width:96px;text-align:right;font-variant-numeric:tabular-nums}
.dep-empty{text-align:center;padding:26px;color:var(--txt-mute);font-size:13px}
.dep-empty b{display:block;color:var(--txt-dim);margin-bottom:6px;font-size:14px}

/* ================= 交易明细 / 卖出 ================= */
.expander{
  display:inline-block;width:13px;color:var(--txt-mute);
  transition:transform .15s;user-select:none;
}
.trade-badge{
  background:rgba(79,156,255,.16);color:var(--acc);font-size:10px;
  padding:1px 6px;border-radius:20px;margin-left:4px;font-weight:600;
}
.trade-detail td{
  background:#131a23;padding:0 !important;border-bottom:1px solid var(--line-soft);
}
.trade-list{padding:9px 14px 11px;display:flex;flex-direction:column;gap:5px}
.trade-row{
  display:flex;align-items:center;gap:12px;font-size:11.5px;
  color:var(--txt-dim);flex-wrap:wrap;
}
.tr-date{color:var(--txt-mute);font-variant-numeric:tabular-nums;min-width:78px}
.tr-tag{
  padding:1px 7px;border-radius:5px;font-size:10.5px;font-weight:600;min-width:34px;text-align:center;
}
.tr-buy{background:rgba(46,204,143,.14);color:var(--ok)}
.tr-sell{background:rgba(242,84,91,.14);color:var(--bad)}
.tr-qty{font-variant-numeric:tabular-nums;min-width:82px}
.tr-amt{font-variant-numeric:tabular-nums;min-width:92px;font-weight:600}
.tr-px{color:var(--txt-mute);font-variant-numeric:tabular-nums}

.sell-info{
  background:var(--card-2);border:1px solid var(--line-soft);border-radius:10px;
  padding:11px 13px;display:flex;flex-direction:column;gap:5px;
}
.si-row{display:flex;justify-content:space-between;gap:12px;font-size:12px;color:var(--txt-mute)}
.si-row b{color:var(--txt);font-weight:600;font-variant-numeric:tabular-nums}
.si-row .si-now{color:var(--acc);font-size:13px}

/* ================= 移动端底部导航 ================= */
.tabbar{display:none}

/* ================= 快速记一笔抽屉 ================= */
.sheet-mask{
  position:fixed;inset:0;z-index:120;background:rgba(6,9,14,.62);
  backdrop-filter:blur(2px);animation:fadeIn .2s ease;
}
.sheet-mask[hidden]{display:none}
@keyframes fadeIn{from{opacity:0}to{opacity:1}}

.sheet{
  position:fixed;left:0;right:0;bottom:0;z-index:130;
  background:var(--card);border-radius:20px 20px 0 0;
  border-top:1px solid var(--line);
  box-shadow:0 -12px 40px rgba(0,0,0,.6);
  max-height:88vh;display:flex;flex-direction:column;
  animation:sheetUp .28s cubic-bezier(.32,.72,0,1);
}
.sheet[hidden]{display:none}
@keyframes sheetUp{from{transform:translateY(100%)}to{transform:translateY(0)}}

.sheet-grip{width:38px;height:4px;border-radius:3px;background:#333f4f;margin:9px auto 0;flex:0 0 auto}
.sheet-head{
  display:flex;align-items:center;justify-content:space-between;
  padding:12px 18px 10px;flex:0 0 auto;
}
.sheet-head h3{font-size:16px;font-weight:650}
.sheet-close{
  width:30px;height:30px;border-radius:50%;border:0;background:var(--card-2);
  color:var(--txt-dim);font-size:14px;cursor:pointer;line-height:1;
}
.sheet-close:hover{color:var(--txt)}
.sheet-body{padding:0 18px 20px;overflow-y:auto;-webkit-overflow-scrolling:touch}

.qs-tabs{
  display:flex;gap:4px;background:var(--card-2);padding:3px;border-radius:10px;margin-bottom:14px;
}
.qs-tab{
  flex:1;border:0;background:transparent;color:var(--txt-dim);
  padding:8px;border-radius:8px;font-size:13.5px;cursor:pointer;font-family:inherit;
}
.qs-tab.active{background:linear-gradient(135deg,var(--acc),var(--acc-2));color:#fff;font-weight:600}

.qs-form{display:flex;flex-direction:column;gap:12px}
.qs-form[hidden]{display:none}
.qs-search{display:flex;gap:8px}
.qs-search .input{flex:1;padding:10px 12px;font-size:15px}
.qs-results{max-height:240px;overflow-y:auto;display:flex;flex-direction:column;gap:6px}
.qs-results:empty{display:none}
.qs-item{
  display:flex;align-items:center;gap:10px;padding:11px 13px;
  background:var(--card-2);border:1px solid var(--line-soft);border-radius:10px;cursor:pointer;
}
.qs-item:active{background:#1f2a38}
.qs-item .qi-name{flex:1;font-size:14px;color:var(--txt);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.qs-item .qi-code{font-size:11.5px;color:var(--txt-mute);font-family:"Cascadia Code",Consolas,monospace}

.qs-picked{
  background:var(--card-2);border:1px solid var(--line);border-radius:12px;padding:14px;
  display:flex;flex-direction:column;gap:12px;
}
.qs-picked[hidden]{display:none}
.qp-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.qp-name{font-size:14.5px;color:var(--txt);font-weight:600}
.qp-code{font-size:11.5px;color:var(--txt-mute);font-family:"Cascadia Code",Consolas,monospace}
.qp-clear{margin-left:auto;border:0;background:transparent;color:var(--acc);font-size:12.5px;cursor:pointer;font-family:inherit;padding:0}

.qs-field{display:flex;flex-direction:column;gap:5px}
.qs-field>span{font-size:12px;color:var(--txt-dim)}
.qs-field .input{
  width:100%;padding:11px 13px;font-size:16px; /* 16px 防 iOS 缩放 */
  border-radius:10px;
}
.qs-grid3{display:grid;grid-template-columns:repeat(3,1fr);gap:9px}
.qs-dep-list{display:flex;flex-direction:column}
.qs-dep-list:empty{display:none}
.qs-submit{
  width:100%;padding:13px;font-size:15px;border-radius:11px;margin-top:2px;
}
.qs-msg{font-size:12.5px;color:var(--txt-mute);min-height:17px}
.qs-msg.ok{color:var(--ok)}
.qs-msg.err{color:var(--bad)}
.qs-msg.warn{color:var(--warn)}

/* 存款录入 */
.qs-section-title{
  font-size:11.5px;color:var(--txt-mute);font-weight:600;letter-spacing:.4px;
  margin-top:2px;
}
.qs-mode{display:flex;gap:8px}
.qs-radio{
  flex:1;display:flex;align-items:center;gap:7px;
  background:var(--card-2);border:1px solid var(--line-soft);border-radius:10px;
  padding:11px 12px;cursor:pointer;font-size:13px;color:var(--txt-dim);
  transition:.15s;
}
.qs-radio:hover{border-color:#33455c}
.qs-radio input{accent-color:var(--acc);width:15px;height:15px;margin:0}
.qs-radio:has(input:checked){
  border-color:var(--acc);color:var(--txt);
  background:linear-gradient(135deg,rgba(79,156,255,.14),rgba(124,92,255,.06));
}
.qs-note{
  font-size:11.5px;color:var(--txt-mute);line-height:1.6;
  padding:9px 11px;background:var(--card-2);border-radius:9px;
  border-left:2px solid var(--line);
}
.qs-field>span i{color:var(--bad);font-style:normal}

/* ================= 响应式 ================= */
@media(max-width:1240px){
  .kpi-grid{grid-template-columns:repeat(3,minmax(0,1fr))}
  .grid-2{grid-template-columns:1fr}
  .target-grid{grid-template-columns:1fr}
}

/* ---------- 平板 ---------- */
@media(max-width:900px){
  /* 侧边栏改为抽屉：必须彻底移出文档流，否则会撑出横向滚动条 */
  .sidebar{
    position:fixed;top:0;left:0;bottom:0;width:236px;flex:0 0 236px;
    transform:translateX(-100%);transition:transform .25s ease;
    z-index:60;box-shadow:0 0 40px rgba(0,0,0,.6);
    visibility:hidden;
  }
  .sidebar.open{transform:none;visibility:visible}
  .menu-toggle{display:block;position:absolute;left:16px;top:16px}
  .topbar-left{padding-left:44px}
  .form-grid{grid-template-columns:1fr}
  /* 主区占满，不再被侧边栏挤占 */
  .main{width:100%;flex:1 1 100%;min-width:0}
}

/* ---------- 手机 ---------- */
@media(max-width:680px){
  body{padding-bottom:env(safe-area-inset-bottom)}
  .app{padding-bottom:calc(58px + env(safe-area-inset-bottom))}

  /* 顶栏精简 */
  .topbar{
    position:sticky;top:0;padding:12px 14px 10px;
    flex-direction:row;align-items:center;gap:10px;
  }
  .topbar-left{padding-left:42px;flex:1;min-width:0}
  .topbar h1{font-size:17px}
  .topbar p{display:none}
  .topbar-right{flex:0 0 auto;gap:8px}
  /* 顶栏只保留刷新按钮，其余移到底部 */
  .topbar-right .range-switch,
  .topbar-right .range-picker{display:none}
  #refreshBtn{padding:8px 12px;font-size:12.5px}

  .views{padding:12px 12px 20px}
  .card{padding:14px;border-radius:12px}
  .card-head{margin-bottom:12px}

  /* KPI：2×2 网格（横向滑动会切掉半张卡片，且文字被截断） */
  .kpi-grid{
    display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;
    margin:0 0 14px;padding:0;overflow:visible;
  }
  .kpi{
    border-radius:12px;padding:11px 12px;min-width:0;
  }
  .kpi-head{gap:6px;margin-bottom:6px}
  .kpi-value{font-size:18px}
  .kpi-label{font-size:11px;white-space:nowrap}
  .kpi-foot{font-size:10px;line-height:1.4;margin-top:4px;
    display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
  .kpi-badge{font-size:9.5px;padding:1px 5px}
  .kpi-link{display:none}
  /* 5 张卡片：最后一张撑满一行，避免单独占半行 */
  .kpi:last-child{grid-column:1/-1}

  /* 图表更高 */
  .chart-wrap{height:230px}
  .chart-tall{height:270px}
  .chart-donut{height:250px}

  /* 表格横向滚动 + 首列粘附 */
  .table-wrap{margin:0 -14px;padding:0 14px;-webkit-overflow-scrolling:touch}
  .table{min-width:640px}
  .table th:first-child,
  .table td:first-child{
    position:sticky;left:0;background:var(--card);
    box-shadow:1px 0 0 var(--line-soft);
  }
  .table tbody tr:hover td:first-child{background:#1a2330}
  .table td:first-child{background:var(--card)}

  /* 底部导航 */
  .tabbar{
    display:flex;position:fixed;left:0;right:0;bottom:0;z-index:100;
    background:rgba(19,26,35,.97);backdrop-filter:blur(14px);
    border-top:1px solid var(--line);
    padding:6px 4px calc(6px + env(safe-area-inset-bottom));
  }
  .tab-item{
    flex:1;background:transparent;border:0;cursor:pointer;
    display:flex;flex-direction:column;align-items:center;gap:2px;
    padding:4px 2px;color:var(--txt-mute);font-family:inherit;
  }
  .ti-ico{font-size:19px;line-height:1.1}
  .ti-txt{font-size:10.5px;font-weight:500}
  .tab-item.active{color:var(--acc)}
  /* 记一笔 主按钮 */
  .tab-main{position:relative}
  .tab-main .ti-ico{
    width:42px;height:42px;border-radius:14px;
    background:linear-gradient(135deg,var(--acc),var(--acc-2));
    color:#fff;display:grid;place-items:center;font-size:22px;
    box-shadow:0 4px 14px rgba(79,156,255,.4);margin-top:-14px;
  }
  .tab-main .ti-txt{margin-top:1px}

  /* 移动端：录入持仓页改用抽屉，把原表单隐藏 */
  #view-manage .grid-2{display:block}
  #view-manage .grid-2 > .card:first-child{display:none}  /* 隐藏大搜索框 */
  #view-manage .grid-2 > .card:last-child{display:none}  /* 隐藏桌面表单 */
  #view-manage .mobile-hint{display:block}
  #view-manage .manage-mobile{display:block}

  /* 顶部按钮在手机上走抽屉 */
  .qs-open-m{display:inline-flex}
}

/* 移动端专用块（桌面隐藏） */
.mobile-hint,.manage-mobile,.desktop-only{display:none}
.mobile-hint[hidden],.manage-mobile[hidden],.desktop-only[hidden]{display:none}
@media(max-width:680px){
  .desktop-only{display:none}
  .mobile-hint{
    display:block;text-align:center;padding:30px 20px;
    color:var(--txt-dim);font-size:13.5px;line-height:1.8;
  }
  .manage-mobile{display:block}
  .m-cta{
    display:inline-flex;align-items:center;gap:6px;
    background:linear-gradient(135deg,var(--acc),var(--acc-2));color:#fff;
    border:0;border-radius:11px;padding:12px 22px;font-size:15px;font-weight:600;
    font-family:inherit;cursor:pointer;margin-bottom:14px;
  }
  .m-list{display:flex;flex-direction:column;gap:8px}
  .m-item{
    display:flex;align-items:center;gap:11px;padding:13px 15px;
    background:var(--card-2);border:1px solid var(--line-soft);border-radius:12px;
  }
  .m-item .mi-name{flex:1;font-size:14.5px;color:var(--txt);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .m-item .mi-cat{font-size:11px;color:var(--txt-mute)}
  .m-item .mi-val{font-size:14px;color:var(--txt);font-variant-numeric:tabular-nums}
  .m-item .mi-pnl{font-size:12px;font-variant-numeric:tabular-nums}
  .m-del{
    border:0;background:transparent;color:var(--bad);font-size:12px;
    cursor:pointer;font-family:inherit;padding:4px 6px;
  }
}

/* ================= 截图导入 ================= */
.dropzone{
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;
  padding:26px 18px;border:1.5px dashed #2c3a4d;border-radius:14px;
  background:#141b25;cursor:pointer;text-align:center;transition:.15s;
}
.dropzone:hover,.dropzone.over{border-color:var(--acc);background:#17202c}
.dropzone:focus-visible{outline:none;border-color:var(--acc)}
.dropzone.busy{opacity:.55;pointer-events:none}
.dropzone .dz-icon{font-size:22px;color:var(--acc);line-height:1}
.dropzone strong{font-size:13.5px;color:var(--txt);font-weight:600}
.dropzone span{font-size:11.5px;color:var(--txt-mute)}

.import-table{min-width:880px}
.import-table td{padding:5px 6px}
.import-table .input{
  padding:5px 7px;font-size:12px;border-radius:6px;background:#121a24;
  width:100%;min-width:0;height:30px;
}
.import-table .i-name{min-width:180px}
.import-table .i-code{font-family:"Cascadia Code",Consolas,monospace;letter-spacing:.4px}
.import-table .i-code[data-need]{border-color:rgba(245,165,36,.5)}
.import-table .i-num{text-align:right;font-variant-numeric:tabular-nums}
.import-table tr.bad td{background:rgba(242,84,91,.055)}
.i-del{
  border:0;background:transparent;color:var(--txt-mute);font-size:13px;
  cursor:pointer;font-family:inherit;padding:4px 6px;border-radius:6px;
}
.i-del:hover{color:var(--bad);background:rgba(242,84,91,.1)}
.i-flag{font-size:10.5px;padding:1px 7px;border-radius:20px;font-weight:600;white-space:nowrap}
.i-flag.ok{background:rgba(46,204,143,.14);color:var(--ok)}
.i-flag.warn{background:rgba(245,165,36,.16);color:var(--warn)}
.i-flag.err{background:rgba(242,84,91,.14);color:var(--bad)}

.import-result{
  margin-top:14px;border:1px solid var(--line-soft);border-radius:11px;
  background:var(--card-2);padding:12px 14px;font-size:12.5px;color:var(--txt-dim);
  display:flex;flex-direction:column;gap:5px;
}
.import-result[hidden]{display:none}
.import-result b{color:var(--txt)}
.import-result .ir-err{color:var(--bad)}
.import-result .ir-skip{color:var(--txt-mute)}
.import-result .ir-warn{color:var(--warn)}

/* ================= 交易记录抽屉 ================= */
.trades-meta{
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  font-size:12px;color:var(--txt-mute);margin-bottom:12px;
}
.trades-meta .tm-pill{
  padding:2px 9px;border-radius:20px;background:var(--card-2);
  border:1px solid var(--line-soft);color:var(--txt-dim);
}
.trades-meta .tm-pill i{width:6px;height:6px;border-radius:50%;display:inline-block;margin-right:5px}
.trades-sum{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin-bottom:14px}
.ts-cell{
  background:var(--card-2);border:1px solid var(--line-soft);border-radius:10px;
  padding:9px 11px;min-width:0;
}
.ts-cell span{display:block;font-size:10.5px;color:var(--txt-mute);margin-bottom:3px}
.ts-cell b{font-size:13.5px;font-weight:620;font-variant-numeric:tabular-nums;white-space:nowrap}
.trades-list{display:flex;flex-direction:column;gap:6px;max-height:44vh;overflow-y:auto}
.trades-list:empty{display:none}
.trades-list .tr-item{
  display:grid;grid-template-columns:86px 44px minmax(0,1fr) auto;gap:9px;
  align-items:center;padding:8px 10px;background:#141b25;
  border:1px solid var(--line-soft);border-radius:9px;font-size:12px;
}
.trades-list .tr-item .ti-date{color:var(--txt-mute);font-variant-numeric:tabular-nums}
.trades-list .tr-item .ti-qty{color:var(--txt-dim);font-variant-numeric:tabular-nums;white-space:nowrap}
.trades-list .tr-item .ti-amt{color:var(--txt);font-weight:600;font-variant-numeric:tabular-nums;white-space:nowrap;text-align:right}
.trades-list .tr-item .ti-note{
  grid-column:1/-1;font-size:11px;color:var(--txt-mute);
  margin-top:-2px;
}
.trades-actions{display:flex;gap:9px;margin-top:16px;flex-wrap:wrap}
.trades-actions .btn{flex:1;min-width:120px}

@media(max-width:680px){
  .trades-sum{grid-template-columns:repeat(2,minmax(0,1fr))}
  .trades-list .tr-item{grid-template-columns:78px 40px minmax(0,1fr) auto;gap:7px;font-size:11.5px}
  .trades-actions .btn{flex:1 1 46%}
  .dropzone{padding:22px 14px}
  #view-import .card-head .btn-row{width:100%}
  #view-import .card-head .btn-row .btn{flex:1}
}

/* 导入行：手机端用卡片，桌面用表格 */
.import-cards{display:none}
.imp-card{
  border:1px solid var(--line-soft);border-radius:12px;background:#141b25;
  padding:11px 12px;display:flex;flex-direction:column;gap:8px;
}
.imp-card.bad{border-color:rgba(242,84,91,.42);background:rgba(242,84,91,.05)}
.imp-card .ic-top{display:flex;align-items:center;gap:8px}
.imp-card .ic-top select{width:104px;flex:0 0 auto;height:32px;padding:4px 8px;font-size:12.5px}
.imp-card .ic-top .i-del{margin-left:auto}
.imp-card .ic-name{font-size:13.5px;height:34px}
.imp-card .ic-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.ic-f{display:flex;flex-direction:column;gap:4px;min-width:0}
.ic-f>span{font-size:10.5px;color:var(--txt-mute)}
.ic-f .input{height:32px;font-size:12.5px;padding:4px 8px}
.import-cards .empty{text-align:center;padding:22px;color:var(--txt-mute);font-size:12.5px}

@media(max-width:680px){
  #importTableWrap{display:none}
  .import-cards{display:flex;flex-direction:column;gap:9px}
}

/* 交易记录抽屉：列表可滚动，操作按钮始终贴底 */
#tradesSheet{max-height:82vh}
#tradesSheet .sheet-body{display:flex;flex-direction:column;min-height:0}
#tradesSheet .trades-list{flex:1 1 auto;min-height:60px;max-height:none}
#tradesSheet .trades-actions{
  position:sticky;bottom:0;background:var(--card);
  border-top:1px solid var(--line-soft);padding:10px 0 2px;margin-top:12px;
}

/* 单个成本价（仅首次录入生效） */
.form-grid .hint.field-wide{margin:-4px 0 2px;line-height:1.6}
.input:disabled{opacity:.5;cursor:not-allowed;background:#131a23}
.qs-note.warn{color:var(--warn)}
.qs-note{line-height:1.6}

/* 交易抽屉里的走势图 */
.trades-chart{
  background:var(--card-2);border:1px solid var(--line-soft);border-radius:11px;
  padding:10px 12px 8px;margin-bottom:12px;
}
.trades-chart .tc-head{
  display:flex;justify-content:space-between;align-items:center;gap:10px;
  font-size:11px;color:var(--txt-mute);margin-bottom:6px;
}
.trades-chart .tc-head span:last-child{font-variant-numeric:tabular-nums;text-align:right}
.trades-chart .tc-mode{margin-bottom:8px;flex-wrap:wrap}
.trades-chart .tc-view{margin:0;flex-shrink:0}
.trades-chart .tc-view button{padding:3px 9px;font-size:11px}
.trades-chart .tc-kline{margin-bottom:8px;flex-wrap:wrap}
.trades-chart .tc-kline button{padding:3px 9px;font-size:11px}
.trades-chart .tc-kline .tc-adjust{margin-left:auto;color:var(--txt-mute)}
.trades-chart .tc-kline .tc-adjust.active{color:var(--acc)}
.trades-chart canvas{width:100%;height:220px;display:block}
.trades-chart.expanded canvas{height:340px}
@media(max-width:680px){
  .trades-chart canvas{height:180px}
  .trades-chart.expanded canvas{height:300px}
  .trades-chart .tc-head{flex-wrap:wrap}
  .trades-chart .tc-mode{order:-1;width:100%}
  .trades-chart .tc-kline{order:-1;width:100%}
}

/* 修改持仓弹窗 */
.edit-sec{margin:14px 0 4px}
.edit-sec-title{
  display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;
  font-size:12px;font-weight:600;color:var(--txt);margin-bottom:8px;
  padding-bottom:6px;border-bottom:1px solid var(--line-soft);
}
.edit-sec-tip{font-size:11px;font-weight:400;color:var(--txt-mute)}
.edit-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.edit-grid .qs-field{margin:0}
@media(max-width:560px){
  .edit-grid{grid-template-columns:1fr}
}
.edit-trades{display:flex;flex-direction:column;gap:6px}
.edit-trade{
  display:flex;align-items:center;gap:10px;width:100%;
  background:var(--card-2);border:1px solid var(--line-soft);border-radius:9px;
  padding:8px 10px;cursor:pointer;text-align:left;color:var(--txt);
  font-size:12px;font-variant-numeric:tabular-nums;transition:.15s;
}
.edit-trade:hover{border-color:var(--line)}
.edit-trade.active{border-color:var(--acc);background:rgba(79,156,255,.08)}
.edit-trade .et-date{color:var(--txt-mute);min-width:78px}
.edit-trade .et-qty{flex:1}
.edit-trade .et-amt{color:var(--txt);font-weight:600}
.edit-fx{
  display:flex;align-items:center;gap:8px;margin-top:10px;
  font-size:12px;color:var(--txt-mute);cursor:pointer;
}
.edit-fx input{accent-color:var(--acc);width:15px;height:15px;cursor:pointer}
.edit-fx b{color:var(--txt)}
.edit-quick{display:flex;gap:8px;margin-top:10px;flex-wrap:wrap}
.edit-quick .btn{font-size:11.5px;padding:5px 10px}

/* ================= 登录页 ================= */
.auth-gate{
  position:fixed;inset:0;z-index:2000;display:flex;align-items:center;justify-content:center;
  background:radial-gradient(1200px 600px at 50% -10%, #182436 0%, var(--bg) 60%);
  padding:20px;
}
.auth-card{
  width:100%;max-width:360px;background:var(--card);border:1px solid var(--line);
  border-radius:18px;padding:28px 26px 22px;box-shadow:var(--shadow);text-align:center;
}
.auth-logo{
  width:52px;height:52px;margin:0 auto 12px;border-radius:15px;
  display:flex;align-items:center;justify-content:center;
  font-size:26px;color:#fff;
  background:linear-gradient(135deg,var(--acc),var(--acc-2));
  box-shadow:0 8px 22px rgba(79,156,255,.28);
}
.auth-card h2{font-size:20px;letter-spacing:.5px}
.auth-sub{color:var(--txt-dim);font-size:12.5px;margin:7px 0 20px}
.auth-card .field{text-align:left;margin-bottom:12px}
.auth-msg{min-height:17px;margin:2px 0 10px;font-size:12px}
.auth-btn{width:100%;padding:10px;font-size:14px}
.auth-foot{margin-top:16px;font-size:11.5px;color:var(--txt-mute)}
.auth-switch{
  margin-top:14px;font-size:12.5px;color:var(--txt-dim);
  display:flex;align-items:center;justify-content:center;gap:6px;
}
.auth-link{
  border:0;background:transparent;color:var(--acc);font-size:12.5px;
  cursor:pointer;padding:2px 4px;border-radius:4px;
}
.auth-link:hover{text-decoration:underline}

/* ================= 侧边栏当前用户 ================= */
.sidebar-user{
  margin:10px 12px 0;padding:9px 10px;border:1px solid var(--line-soft);
  border-radius:11px;background:var(--card-2);display:flex;align-items:center;gap:9px;
}
.su-avatar{
  width:30px;height:30px;border-radius:50%;flex:0 0 30px;display:flex;
  align-items:center;justify-content:center;font-weight:700;font-size:13px;
  background:linear-gradient(135deg,var(--acc),var(--acc-2));color:#fff;
}
.su-info{flex:1;min-width:0;display:flex;flex-direction:column;line-height:1.3}
.su-info strong{font-size:12.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.su-info small{font-size:10.5px;color:var(--txt-mute)}
.su-logout{
  border:0;background:transparent;color:var(--txt-dim);font-size:11.5px;
  cursor:pointer;padding:4px 6px;border-radius:6px;transition:.15s;
}
.su-logout:hover{background:rgba(242,84,91,.12);color:var(--bad)}

/* ================= 用户管理 ================= */
.user-self{margin-bottom:4px}
.us-title{font-size:12px;font-weight:600;color:var(--txt);margin-bottom:8px}
.user-form{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
.user-form .input{flex:1;min-width:150px}
.user-form .chk{
  display:flex;align-items:center;gap:6px;font-size:12px;
  color:var(--txt-dim);white-space:nowrap;cursor:pointer;
}
.user-form .chk input{accent-color:var(--acc);width:15px;height:15px}
.user-table{margin-top:8px}
.user-table .role-admin{color:var(--warn)}
.user-table .ut-name{font-weight:600}
@media(max-width:760px){
  .auth-card{padding:24px 20px 18px}
  .user-form{flex-direction:column;align-items:stretch}
  .user-form .btn{width:100%}
  .user-form .chk{justify-content:flex-start}
}

/* ================= AI 持仓分析 ================= */
.ai-fab{
  position:fixed;right:22px;bottom:22px;z-index:1300;
  display:flex;align-items:center;gap:7px;
  padding:11px 16px;border:0;border-radius:999px;cursor:pointer;
  color:#fff;font-size:13px;font-weight:700;letter-spacing:.5px;
  background:linear-gradient(135deg,#4f9cff,#7c5cff);
  box-shadow:0 10px 26px rgba(79,156,255,.42);
  transition:transform .15s,box-shadow .15s;
}
.ai-fab:hover{transform:translateY(-1px);box-shadow:0 14px 30px rgba(79,156,255,.5)}
.ai-fab-star{font-size:15px}

.ai-panel{
  position:fixed;right:22px;bottom:84px;z-index:1400;
  width:392px;max-width:calc(100vw - 32px);
  height:min(620px,calc(100vh - 132px));
  display:flex;flex-direction:column;overflow:hidden;
  background:var(--card);border:1px solid var(--line);
  border-radius:16px;box-shadow:0 18px 54px rgba(0,0,0,.55);
}
.ai-head{
  display:flex;align-items:center;justify-content:space-between;gap:10px;
  padding:13px 14px;border-bottom:1px solid var(--line-soft);
  background:linear-gradient(180deg,rgba(79,156,255,.08),transparent);
}
.ai-title{display:flex;align-items:center;gap:9px;min-width:0}
.ai-title strong{display:block;font-size:13.5px}
.ai-title small{display:block;font-size:10.5px;color:var(--txt-mute);margin-top:2px}
.ai-orb{
  width:32px;height:32px;flex:0 0 32px;border-radius:10px;
  display:flex;align-items:center;justify-content:center;
  font-size:16px;color:#fff;background:linear-gradient(135deg,#4f9cff,#7c5cff);
  box-shadow:0 6px 18px rgba(79,156,255,.35);
}
.ai-head-btns{display:flex;gap:4px}
.ai-icon{
  width:28px;height:28px;border:0;border-radius:8px;cursor:pointer;
  background:transparent;color:var(--txt-dim);font-size:14px;line-height:1;
}
.ai-icon:hover{background:rgba(255,255,255,.07);color:var(--txt)}

.ai-body{
  flex:1;overflow-y:auto;padding:14px 14px 6px;
  scroll-behavior:smooth;
}
.ai-welcome{text-align:center;padding:26px 14px 18px;color:var(--txt-dim)}
.ai-welcome-orb{
  width:46px;height:46px;margin:0 auto 12px;border-radius:14px;
  display:flex;align-items:center;justify-content:center;font-size:22px;color:#fff;
  background:linear-gradient(135deg,#4f9cff,#7c5cff);
  box-shadow:0 10px 26px rgba(79,156,255,.35);
}
.ai-welcome b{display:block;font-size:14px;color:var(--txt);margin-bottom:6px}
.ai-welcome p{font-size:11.5px;line-height:1.65;max-width:280px;margin:0 auto}

.ai-msg{display:flex;flex-direction:column;gap:4px;margin-bottom:12px;max-width:94%}
.ai-msg.user{margin-left:auto;align-items:flex-end}
.ai-msg .ai-who{font-size:10px;color:var(--txt-mute);padding:0 4px}
.ai-msg .ai-text{
  padding:9px 12px;border-radius:12px;font-size:13px;line-height:1.68;
  white-space:pre-wrap;word-break:break-word;
}
.ai-msg.assistant .ai-text{
  background:var(--card-2);border:1px solid var(--line-soft);
  border-top-left-radius:4px;color:var(--txt);
}
.ai-msg.user .ai-text{
  background:linear-gradient(135deg,rgba(79,156,255,.24),rgba(124,92,255,.24));
  border:1px solid rgba(79,156,255,.32);border-top-right-radius:4px;
}
.ai-msg.error .ai-text{border-color:rgba(242,84,91,.45);color:#ffb8bb}
.ai-msg .ai-text strong{color:#fff;font-weight:600}
.ai-msg .ai-text code{
  font-family:ui-monospace,Consolas,monospace;font-size:12px;
  background:rgba(255,255,255,.07);border-radius:4px;padding:1px 4px;
}
.ai-msg .ai-h2{font-size:14px;font-weight:600;color:#fff;margin:6px 0 4px}
.ai-msg .ai-h3{font-size:13px;font-weight:600;color:#fff;margin:5px 0 3px}
.ai-msg .ai-li{display:block;padding-left:12px;text-indent:-10px}

/* 待确认的录入卡片 */
.ai-action{
  max-width:94%;margin:2px 0 12px;padding:11px 12px;
  border:1px solid rgba(79,156,255,.38);border-radius:12px;
  background:rgba(79,156,255,.07);
}
.ai-action .aa-head{
  display:flex;align-items:center;gap:7px;margin-bottom:8px;
  font-size:12.5px;font-weight:600;color:var(--txt);
}
.ai-action .aa-badge{
  font-size:10px;font-weight:600;color:var(--acc);
  background:rgba(79,156,255,.14);border:1px solid rgba(79,156,255,.3);
  border-radius:999px;padding:2px 7px;
}
.ai-action .aa-row{
  display:flex;justify-content:space-between;gap:12px;
  font-size:12px;padding:3px 0;color:var(--txt-dim);
}
.ai-action .aa-row b{color:var(--txt);font-weight:600;text-align:right;word-break:break-all}
.ai-action .aa-check{
  display:flex;align-items:center;gap:6px;margin-top:8px;
  font-size:11.5px;color:var(--txt-dim);cursor:pointer;
}
.ai-action .aa-check input{accent-color:var(--acc);width:15px;height:15px}
.ai-action .aa-btns{display:flex;gap:8px;margin-top:10px;align-items:center}
.ai-action .aa-btns .btn{flex:1;justify-content:center;padding:6px 10px;font-size:12px}
.ai-action.done{border-color:rgba(46,204,143,.4);background:rgba(46,204,143,.07)}
.ai-action.canceled{opacity:.5}
.ai-done{color:var(--ok);font-size:12px;font-weight:600;line-height:1.4}
.ai-action .aa-err{color:var(--bad);font-size:11.5px;margin-top:7px}
.ai-typing .ai-text{display:flex;gap:5px;align-items:center;min-height:38px}
.ai-typing .ai-text span{
  width:6px;height:6px;border-radius:50%;background:var(--txt-dim);
  animation:aiBlink 1.2s infinite ease-in-out;
}
.ai-typing .ai-text span:nth-child(2){animation-delay:.18s}
.ai-typing .ai-text span:nth-child(3){animation-delay:.36s}
@keyframes aiBlink{0%,80%,100%{opacity:.25;transform:translateY(0)}40%{opacity:1;transform:translateY(-3px)}}

.ai-setup{
  padding:12px 14px;border-top:1px solid var(--line-soft);
  background:var(--bg-soft);display:flex;flex-direction:column;gap:8px;
}
.ai-setup-title{font-size:12px;font-weight:600;color:var(--txt)}
.ai-setup-row{display:flex;gap:8px}
.ai-setup-row #aiModel{width:132px;flex:0 0 132px}
.ai-setup .input{font-size:12px;padding:8px 10px}
.ai-setup .hint{font-size:10.5px;margin:0}

.ai-chips{
  display:flex;gap:6px;overflow-x:auto;padding:8px 14px 9px;
  border-top:1px solid var(--line-soft);scrollbar-width:none;
}
.ai-chips::-webkit-scrollbar{display:none}
.ai-chips button{
  white-space:nowrap;flex:0 0 auto;cursor:pointer;
  padding:6px 10px;border-radius:999px;font-size:11px;
  background:var(--card-2);border:1px solid var(--line);
  color:var(--txt-dim);transition:.15s;
}
.ai-chips button:hover{border-color:var(--acc);color:var(--txt)}

.ai-input{display:flex;gap:8px;padding:10px 12px;border-top:1px solid var(--line-soft)}
.ai-input textarea{
  flex:1;resize:none;min-height:38px;max-height:110px;
  background:var(--card-2);border:1px solid var(--line);border-radius:10px;
  color:var(--txt);padding:9px 10px;font:inherit;font-size:13px;line-height:1.5;outline:none;
}
.ai-input textarea:focus{border-color:var(--acc);box-shadow:0 0 0 3px rgba(79,156,255,.1)}
.ai-input textarea:disabled{opacity:.5}
.ai-input .btn{flex:0 0 auto;align-self:flex-end;height:38px;padding:0 14px}
.ai-foot{
  text-align:center;font-size:10px;color:var(--txt-mute);
  padding:0 10px 9px;background:var(--card);
}

/* ================= 手机端输入框防自动放大 =================
   iOS Safari 在聚焦 font-size < 16px 的输入框时，会把整个页面放大。
   手机端统一把可输入控件调到 16px，关闭对话框后页面就不会保持放大状态。 */
@media(max-width:680px){
  .ai-fab{right:14px;bottom:78px;padding:10px 14px}
  .ai-panel{
    left:0;right:0;bottom:0;width:auto;max-width:none;
    height:100dvh;max-height:100dvh;border-radius:0;border:0;
  }
  .ai-head{padding-top:max(13px,env(safe-area-inset-top))}
  .ai-input{padding-bottom:max(10px,env(safe-area-inset-bottom))}
  .ai-foot{padding-bottom:max(9px,env(safe-area-inset-bottom))}
}
@media(max-width:1024px){
  input:not([type="checkbox"]):not([type="radio"]),
  select,
  textarea,
  .input,
  .textarea{
    font-size:16px !important;
  }
  button, .btn, .nav-item, .tab-item, .ai-chips button{
    touch-action:manipulation;
  }
}

/* ================= 买入 / 卖出 ================= */
.hold-actions{display:flex;gap:4px;justify-content:flex-end}
.hold-actions .btn{padding:4px 7px;font-size:11px}
.btn-trade-buy{color:var(--ok);border-color:rgba(46,204,143,.35)}
.btn-trade-buy:hover{background:rgba(46,204,143,.1);border-color:var(--ok)}
.btn-trade-sell{color:var(--bad);border-color:rgba(242,84,91,.35)}
.btn-trade-sell:hover{background:rgba(242,84,91,.1);border-color:var(--bad)}
.hcard .hc-actions{
  display:flex;gap:6px;margin-top:8px;padding-top:8px;
  border-top:1px dashed var(--line-soft);
}
.hcard .hc-actions .btn{
  flex:1;justify-content:center;padding:5px 8px;font-size:11px;
}

/* 持仓表：操作列固定在右侧，避免横向滚动时看不到买入/卖出 */
#holdingsTable th:last-child,
#holdingsTable tbody tr:not(.trade-detail) td:last-child{
  position:sticky;right:0;z-index:2;background:var(--card);
  box-shadow:-10px 0 14px -10px rgba(0,0,0,.75);
}
#holdingsTable tbody tr:not(.trade-detail):hover td:last-child{background:#1a2330}
