/* ============================================================
   佳霖量化 · 客户端补充样式（登录屏 / 连接指示 / 占位 / 表格）
   基底样式沿用 app.css（从原型 v1 提取，保持视觉一致）
   ============================================================ */

/* ---------- 登录屏 ---------- */
.login{
  position:fixed; inset:0; z-index:100;
  display:flex; align-items:center; justify-content:center;
  background:var(--bg);
  background-image:
    radial-gradient(760px 420px at 50% 26%,rgba(34,211,238,.10),transparent 66%),
    radial-gradient(560px 320px at 84% 96%,rgba(167,139,250,.08),transparent 66%),
    linear-gradient(rgba(26,39,64,.34) 1px,transparent 1px),
    linear-gradient(90deg,rgba(26,39,64,.34) 1px,transparent 1px);
  background-size:auto,auto,36px 36px,36px 36px;
}
.login.hide{display:none}
.login-card{
  width:432px; padding:38px 40px 26px; border-radius:18px; position:relative;
  background:linear-gradient(180deg,rgba(14,22,34,.97),rgba(8,13,22,.99));
  border:1px solid var(--line2);
  box-shadow:0 0 0 1px rgba(34,211,238,.06),0 26px 70px rgba(0,0,0,.72),inset 0 0 40px rgba(34,211,238,.035);
}
.login-logo{width:212px; height:66px; margin:0 auto 10px}
.login-logo img{width:100%; height:100%; object-fit:contain; filter:drop-shadow(0 0 14px rgba(34,211,238,.28))}
.login-t1{text-align:center; font-size:22px; font-weight:700; letter-spacing:.5px; white-space:nowrap}
.login-t2{text-align:center; font-size:11px; color:var(--dim); letter-spacing:3.2px; margin:7px 0 26px}
.fld{margin-bottom:15px}
.fld label{display:block; font-size:13px; color:var(--mid); margin-bottom:7px; letter-spacing:.4px}
.inp{
  width:100%; height:48px; border-radius:10px; padding:0 15px; font-size:16px; color:var(--txt);
  background:linear-gradient(180deg,#0b1220,#080d16); border:1px solid var(--line2); outline:none;
  font-family:var(--sans); transition:.18s;
}
.inp::placeholder{color:var(--faint)}
.inp:focus{border-color:var(--cy); box-shadow:0 0 0 3px rgba(34,211,238,.14),inset 0 0 18px rgba(34,211,238,.06)}
.lg-row{display:flex; align-items:center; justify-content:space-between; margin:2px 0 18px}
.cb{display:flex; align-items:center; gap:9px; font-size:14px; color:var(--mid); cursor:pointer; user-select:none}
.cb i{width:17px; height:17px; border-radius:5px; border:1px solid var(--line2); background:#0a1220;
  display:inline-block; position:relative; transition:.15s}
.cb.on i{background:var(--cyBg); border-color:var(--cy)}
.cb.on i::after{content:""; position:absolute; left:5px; top:2px; width:5px; height:9px;
  border:2px solid var(--cy); border-top:0; border-left:0; transform:rotate(42deg)}
.lnk{font-size:13px; color:var(--cy); cursor:pointer; text-decoration:none; opacity:.9}
.lnk:hover{opacity:1; text-decoration:underline}
.btn{
  width:100%; height:52px; border-radius:11px; border:1px solid var(--cyBd); cursor:pointer;
  font:700 17px var(--sans); letter-spacing:4px; color:#eafcff;
  background:linear-gradient(180deg,rgba(34,211,238,.28),rgba(20,150,180,.16));
  box-shadow:0 0 26px rgba(34,211,238,.24),inset 0 0 20px rgba(34,211,238,.10); transition:.2s;
}
.btn:hover{transform:translateY(-1px); box-shadow:0 0 34px rgba(34,211,238,.42),inset 0 0 24px rgba(34,211,238,.18)}
.btn:disabled{opacity:.5; cursor:not-allowed; transform:none}
.lg-msg{min-height:20px; margin-top:12px; font-size:13px; text-align:center; color:var(--warn)}
.login-stat{
  display:flex; justify-content:center; gap:24px; font-size:13px; color:var(--mid);
  padding-top:16px; margin-top:6px; border-top:1px dashed var(--line);
}
.login-foot{
  position:absolute; left:0; right:0; bottom:16px; display:flex; justify-content:space-between;
  padding:0 26px; font-size:12px; color:var(--faint);
}
.dot{width:9px; height:9px; border-radius:50%; display:inline-block; margin-right:7px; vertical-align:middle; background:var(--faint)}
.dot.ok{background:var(--dn); box-shadow:0 0 9px var(--dn)}
.dot.bad{background:var(--up); box-shadow:0 0 9px var(--up)}
.dot.cy{background:var(--cy); box-shadow:0 0 9px var(--cy)}

/* ---------- 顶栏连接指示 ---------- */
.conn{
  margin-left:14px; display:flex; align-items:center; gap:2px;
  font-size:12.5px; color:var(--dim); padding:6px 12px; border-radius:8px;
  border:1px solid var(--line); background:#0a1018; white-space:nowrap;
}

/* ---------- 占位 ---------- */
.placeholder{
  padding:38px 24px; border:1px dashed var(--line2); border-radius:12px;
  color:var(--dim); font-size:14px; line-height:1.9; background:rgba(255,255,255,.012);
}

/* ---------- 信号表 ---------- */
.sigtable{overflow:auto; border:1px solid var(--line); border-radius:12px; background:var(--pnl)}
.sigtable table{width:100%; border-collapse:collapse; font-size:13.5px}
.sigtable th{
  position:sticky; top:0; text-align:left; padding:10px 14px; font-size:12.5px; color:var(--dim);
  background:#0c1420; border-bottom:1px solid var(--line); font-weight:700; letter-spacing:.5px; z-index:1;
}
.sigtable td{padding:9px 14px; border-bottom:1px solid #121b2b; color:var(--txt)}
.sigtable tr:last-child td{border-bottom:0}
.sigtable .mono{font-family:var(--mono); font-variant-numeric:tabular-nums}
.sigtable .empty{color:var(--dim); padding:26px; text-align:center}
.tag{padding:2px 9px; border-radius:999px; font-size:12px; font-weight:700; white-space:nowrap}
.tag.up{background:var(--upBg); color:var(--up); border:1px solid var(--upBd)}
.tag.dn{background:var(--dnBg); color:var(--dn); border:1px solid var(--dnBd)}
.tag.warn{background:var(--warnBg); color:var(--warn); border:1px solid var(--warnBd)}
.tag.cy{background:var(--cyBg); color:var(--cy); border:1px solid var(--cyBd)}

/* ---------- 设置卡片 ---------- */
.setwrap{display:flex; flex-direction:column; gap:16px; max-width:940px}
.setcard{border:1px solid var(--line); border-radius:12px; background:var(--pnl); padding:18px 20px}
.setcard h3{font-size:16px; font-weight:700; margin-bottom:12px; display:flex; align-items:center; gap:8px}
.setcard h3::before{content:"▍"; color:var(--cy)}
.setrow{display:flex; align-items:center; gap:14px; padding:9px 0; border-bottom:1px solid #121b2b; font-size:14px}
.setrow:last-child{border-bottom:0}
.setrow .k{width:150px; color:var(--dim); flex:0 0 auto}
.setrow .v{font-family:var(--mono); color:var(--txt); flex:1; word-break:break-all}
.setrow .act{flex:0 0 auto}
.btn.sm{width:auto; height:34px; padding:0 16px; font-size:13.5px; letter-spacing:1px; border-radius:8px}
.hint{font-size:12.5px; color:var(--dim); line-height:1.85; margin-top:10px}

/* ---------- 系统告警条（云端失联 / 重启） ---------- */
.sysbanner{display:flex; align-items:center; gap:10px; padding:9px 18px; font-size:14px; font-weight:600; letter-spacing:.4px}
.sysbanner[hidden]{display:none}
.sysbanner.bad{background:#3a1414; color:#ff9b9b; border-bottom:1px solid #7a2a2a}
.sysbanner.warn{background:#3a2f10; color:#ffd479; border-bottom:1px solid #7a6220}
.sb-led{width:9px; height:9px; border-radius:50%; background:currentColor; box-shadow:0 0 8px currentColor; animation:sbpulse 1s infinite}
@keyframes sbpulse{0%,100%{opacity:1}50%{opacity:.22}}
.sb-time{margin-left:auto; font-weight:400; opacity:.85; font-size:12px; font-family:var(--mono)}

/* ---------- 运行日志 / 事件流 ---------- */
.runlog{margin:10px 0 2px}
.rl-head{display:flex; align-items:center; justify-content:space-between; font-size:13px; color:var(--dim); margin:10px 0 6px; font-weight:600}
.rl-cnt{font-weight:400; opacity:.8; font-family:var(--mono)}
.rl-body{max-height:230px; overflow:auto; background:rgba(0,0,0,.30); border:1px solid var(--line); border-radius:8px; padding:10px 12px; font-family:var(--mono); font-size:12px; line-height:1.7; color:#b9c6d2; white-space:pre-wrap; word-break:break-all; margin:0}
.evlist{max-height:200px; overflow:auto; border:1px solid var(--line); border-radius:8px}
.ev{display:flex; gap:10px; padding:6px 10px; font-size:12px; border-bottom:1px solid #121b2b}
.ev:last-child{border-bottom:0}
.ev-t{font-family:var(--mono); color:var(--dim); flex:0 0 132px}
.ev-m{flex:1; word-break:break-all}
.ev.warn .ev-m{color:#ffd479}
.ev.bad .ev-m{color:#ff9b9b}
.empty{padding:14px; text-align:center; color:var(--dim); font-size:13px}

/* ---------- 数据页：健康度 / 一键补全 ---------- */
.databanner{cursor:pointer}
.databanner .sb-time{text-decoration:underline}
.dtcard{
  display:flex; align-items:center; gap:32px; flex-wrap:wrap;
  border:1px solid var(--line); border-radius:14px; background:var(--pnl);
  padding:22px 26px; margin-bottom:16px;
}
.dt-gauge{flex:0 0 auto; text-align:center; min-width:132px;
  border-right:1px solid var(--line); padding-right:28px}
.dt-big{font-size:46px; font-weight:800; line-height:1.05; font-family:var(--mono); letter-spacing:-1px}
.dt-big.ok{color:var(--dn)}
.dt-big.warn{color:var(--warn)}
.dt-big.bad{color:var(--up)}
.dt-lbl{font-size:12.5px; color:var(--dim); letter-spacing:2px; margin-top:6px}
.dt-stats{display:grid; grid-template-columns:repeat(2,minmax(150px,1fr)); gap:10px 34px; flex:1 1 320px}
.dts{display:flex; justify-content:space-between; gap:14px; font-size:14px; border-bottom:1px dashed #16202f; padding-bottom:7px}
.dts .k{color:var(--dim)}
.dts .v{font-family:var(--mono); font-weight:700}
.dt-act{flex:0 0 auto; min-width:224px; display:flex; flex-direction:column; gap:10px}
.dt-act .btn{height:46px; font-size:15px; letter-spacing:2px}
.dt-msg{font-size:12.5px; color:var(--dim); line-height:1.6; min-height:18px; text-align:center}
.dt-msg.ok{color:var(--dn)} .dt-msg.warn{color:var(--warn)} .dt-msg.bad{color:var(--up)}

.dtprog{border:1px solid var(--cyBd); border-radius:12px; background:rgba(34,211,238,.05); padding:14px 16px; margin-bottom:16px}
.dtp-head{display:flex; align-items:center; gap:10px; font-size:14px; font-weight:700; color:var(--cy); margin-bottom:10px}
.led{width:9px;height:9px;border-radius:50%;background:var(--cy);box-shadow:0 0 9px var(--cy);display:inline-block}
.led.pulse{animation:sbpulse 1s infinite}
.dtp-log{max-height:240px; overflow:auto; background:rgba(0,0,0,.34); border:1px solid var(--line); border-radius:8px; padding:10px 12px; margin:0; font-family:var(--mono); font-size:12px; line-height:1.7; color:#b9c6d2; white-space:pre-wrap; word-break:break-all}

.dtable{border:1px solid var(--line); border-radius:12px; background:var(--pnl); overflow:auto}
.dtable table{width:100%; border-collapse:collapse; font-size:13.5px}
.dtable th{position:sticky; top:0; text-align:left; padding:10px 14px; font-size:12.5px; color:var(--dim); background:#0c1420; border-bottom:1px solid var(--line); font-weight:700; letter-spacing:.5px; z-index:1}
.dtable td{padding:9px 14px; border-bottom:1px solid #121b2b}
.dtable tr:last-child td{border-bottom:0}
.dtable .mono{font-family:var(--mono); font-variant-numeric:tabular-nums}
.dtable .empty{color:var(--dim); padding:26px; text-align:center}
.st-dot{width:9px;height:9px;border-radius:50%;display:inline-block;margin-right:8px;vertical-align:middle}
.st-dot.ok{background:var(--dn);box-shadow:0 0 8px var(--dn)}
.st-dot.warn{background:var(--warn);box-shadow:0 0 8px var(--warn)}
.st-dot.bad{background:var(--up);box-shadow:0 0 8px var(--up)}
.miss-cell{font-family:var(--mono); font-size:12px; color:var(--dim); max-width:520px; word-break:break-all}
tr.row-miss td{background:rgba(255,120,120,.05)}
