:root{--bg:#0f1220;--card:#191d33;--ink:#e8ebf5;--mut:#9aa3c0;--bd:#2a2f4a;--acc:#5b8cff;--go:#28c76f;--stop:#ff5b5b;}
*{box-sizing:border-box}
body{margin:0;font-family:"PingFang SC","Microsoft YaHei",system-ui,sans-serif;background:var(--bg);color:var(--ink)}
.topbar{display:flex;align-items:center;gap:24px;padding:14px 22px;background:#12152a;border-bottom:1px solid var(--bd);position:sticky;top:0;z-index:10}
.brand{font-size:18px;font-weight:700}.brand span{color:var(--mut);font-size:13px;font-weight:400;margin-left:6px}
.topbar nav{display:flex;gap:6px;flex:1}
.topbar nav a{color:var(--mut);text-decoration:none;padding:8px 14px;border-radius:8px;font-size:14px}
.topbar nav a:hover{background:#222845;color:var(--ink)}
.topbar nav a.on{background:var(--acc);color:#fff}
.health{font-size:13px;color:var(--mut)}
.health.up{color:var(--go)}.health.down{color:var(--stop)}
.wrap{max-width:1200px;margin:22px auto;padding:0 18px}
.grid{display:grid;grid-template-columns:1fr 1fr;gap:18px}
@media(max-width:880px){.grid{grid-template-columns:1fr}}
.card{background:var(--card);border:1px solid var(--bd);border-radius:14px;padding:18px 20px}
.card h2{margin:0 0 14px;font-size:17px}
.card h3{margin:18px 0 8px;font-size:14px;color:var(--mut)}
.card h4{margin:0 0 6px;font-size:13px;color:var(--mut)}
label{display:block;margin:10px 0;font-size:13px;color:var(--mut)}
input,select,textarea{width:100%;margin-top:5px;padding:9px 11px;background:#10142a;border:1px solid var(--bd);border-radius:8px;color:var(--ink);font-size:14px;font-family:inherit}
textarea{resize:vertical}
.two{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.row{display:flex;gap:10px;margin-top:14px;flex-wrap:wrap}
.btn{appearance:none;border:0;border-radius:9px;padding:10px 18px;font-size:14px;font-weight:600;color:#fff;background:var(--acc);cursor:pointer}
.btn:hover{filter:brightness(1.08)}
.btn.ghost{background:#2a2f4a}.btn.go{background:var(--go)}.btn.stop{background:var(--stop)}
.hint{color:var(--mut);font-size:12.5px;line-height:1.6}.center{text-align:center}
code{background:#10142a;padding:2px 6px;border-radius:5px;color:#8fd0ff}
.status{margin:14px 0;padding:10px 12px;background:#10142a;border-radius:8px;font-size:14px}
.tbl{width:100%;border-collapse:collapse;font-size:13.5px}
.tbl th,.tbl td{text-align:left;padding:9px 8px;border-bottom:1px solid var(--bd)}
.tbl th{color:var(--mut);font-weight:500}
.pill{padding:2px 9px;border-radius:20px;font-size:12px}
.pill.ready,.pill.live{background:rgba(40,199,111,.16);color:#46e08c}
.pill.pending{background:rgba(91,140,255,.16);color:#8fb0ff}
.pill.failed,.pill.stopped{background:rgba(255,91,91,.16);color:#ff8b8b}
.del{color:var(--stop);cursor:pointer;background:none;border:0;font-size:13px}
.upmsg{display:inline-block;margin-left:10px;font-size:13px;color:var(--mut)}
/* ---- AI 配音 (IndexTTS) ---- */
.emo{margin:12px 0;border:1px solid var(--bd);border-radius:9px;padding:8px 12px}
.emo summary{cursor:pointer;font-size:13px;color:var(--mut)}
.emo-grid{display:grid;grid-template-columns:1fr 1fr;gap:6px 16px;margin:8px 0}
label.inline{display:flex;align-items:center;gap:8px;font-size:12.5px;color:var(--mut)}
label.inline input[type=range]{flex:1}
label.inline span{min-width:34px;text-align:right;font-variant-numeric:tabular-nums}
.preview{width:100%;max-height:440px;aspect-ratio:9/16;background:#000;border-radius:10px;margin:8px 0}
.thumb{width:38px;height:38px;object-fit:cover;border-radius:6px;vertical-align:middle;margin-right:8px;background:#10142a}
.mini-logs{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:8px}
.mini-logs ul,.loglist{list-style:none;margin:0;padding:0;max-height:260px;overflow:auto;font-size:13px}
.loglist{max-height:62vh}
.mini-logs li,.loglist li{padding:6px 8px;border-bottom:1px solid var(--bd);line-height:1.5}
.loglist .u{color:#8fb0ff}.loglist .t{color:var(--mut);font-size:11px;margin-right:6px}
.topbar nav .me{margin-left:auto;color:var(--ink);font-size:13px;padding:8px 6px;white-space:nowrap}
.topbar nav a.logout{color:var(--mut)}.topbar nav a.logout:hover{background:rgba(255,91,91,.16);color:#ff8b8b}
.login-foot a{color:#8fb0ff;text-decoration:none}.login-foot a:hover{text-decoration:underline}

/* ---- login ---- */
.login-body{min-height:100vh;margin:0;display:flex;align-items:center;justify-content:center;
  background:radial-gradient(1100px 600px at 20% -10%,#23306b 0%,transparent 55%),
             radial-gradient(900px 600px at 100% 110%,#3a2566 0%,transparent 50%),var(--bg)}
.login-wrap{width:100%;max-width:380px;padding:20px}
.login-card{background:linear-gradient(180deg,#1c2140,#171b30);border:1px solid var(--bd);
  border-radius:18px;padding:34px 30px 26px;box-shadow:0 24px 60px rgba(0,0,0,.45);text-align:center}
.login-logo{font-size:46px;line-height:1;margin-bottom:8px;filter:drop-shadow(0 6px 14px rgba(91,140,255,.5))}
.login-card h1{margin:6px 0 2px;font-size:21px;letter-spacing:.5px}
.login-sub{margin:0 0 20px;color:var(--mut);font-size:13px}
.login-card label{text-align:left;margin:13px 0;font-size:13px}
.login-card input{margin-top:6px;padding:11px 13px}
.login-card input:focus{outline:none;border-color:var(--acc);box-shadow:0 0 0 3px rgba(91,140,255,.18)}
.login-btn{width:100%;margin-top:18px;padding:12px;font-size:15px;letter-spacing:3px;
  background:linear-gradient(90deg,#5b8cff,#7b5bff)}
.login-err{background:rgba(255,91,91,.14);color:#ff9b9b;border:1px solid rgba(255,91,91,.3);
  border-radius:9px;padding:9px 12px;font-size:13px;margin-bottom:6px}
.login-foot{margin-top:18px;color:var(--mut);font-size:11.5px}
