:root{
  --bg:#0B0B0B; --panel:#141414; --card:#1B1B1B; --border:#303030;
  --text:#E8E8E8; --sub:#9C9C9C; --accent:#FFFFFF; --accent2:#EAEAEA;
  --warn:#D8A93C; --danger:#E0685B; --bubble-in:#1E1E1E; --bubble-out:#2F2F2F;
  --btn-fg:#0B0B0B;
}
*{box-sizing:border-box}
body{margin:0;background:var(--bg);color:var(--text);
  font-family:"Microsoft YaHei UI","Microsoft YaHei",system-ui,sans-serif;font-size:13px}
a{color:var(--accent2);text-decoration:none}
button{font-family:inherit;font-size:13px;cursor:pointer}
.btn{background:var(--card);border:1px solid var(--border);color:var(--text);border-radius:8px;padding:6px 14px}
.btn:hover{border-color:var(--accent);color:var(--accent2)}
.btn.primary{background:var(--accent);border:none;color:var(--btn-fg);font-weight:600}
.btn.primary:hover{background:var(--accent2)}
.btn.mini{padding:3px 9px;font-size:12px;border-radius:6px}
.btn.danger{color:var(--danger);border-color:#4a2724}
input,textarea,select{background:var(--card);border:1px solid var(--border);color:var(--text);
  border-radius:7px;padding:6px 8px;font-family:inherit;font-size:13px;width:100%}
input:focus,textarea:focus,select:focus{outline:none;border-color:var(--accent)}
textarea{resize:vertical}
.card{background:var(--panel);border:1px solid var(--border);border-radius:10px}
.tag{display:inline-block;padding:1px 8px;border-radius:9px;border:1px solid var(--border);
  background:var(--card);color:var(--sub);font-size:12px}
.tag.on{color:var(--accent2);border-color:var(--accent)}
.tag.warn{color:var(--warn);border-color:#4a3a1f}
.tag.bad{color:var(--danger);border-color:#4a2724}
.muted{color:var(--sub)}
h1,h2,h3{margin:0}
h1{font-size:19px}
h2{font-size:15px;color:var(--accent2)}
table{width:100%;border-collapse:collapse}
th,td{padding:7px 9px;border-bottom:1px solid var(--border);text-align:left;font-size:13px;vertical-align:middle}
th{color:var(--sub);font-weight:500;background:var(--card)}
tr:hover td{background:rgba(255,255,255,.04)}
.hidden{display:none!important}

/* ---------- 鐧诲綍 ---------- */
.login-wrap{min-height:100vh;display:flex;align-items:center;justify-content:center}
.login-card{width:360px;padding:28px;background:var(--panel);border:1px solid var(--border);border-radius:14px}
.login-card h1{margin-bottom:4px}
.login-card .muted{margin-bottom:18px;display:block}
.login-card label{display:block;margin:12px 0 6px;color:var(--sub)}
.login-card .btn{width:100%;margin-top:18px;padding:9px}
.err{color:var(--danger);margin-top:10px;min-height:18px}

/* ---------- 鎺у埗鍙?---------- */
.topbar{display:flex;align-items:center;gap:14px;padding:10px 18px;background:var(--panel);
  border-bottom:1px solid var(--border);position:sticky;top:0;z-index:20}
.topbar .brand{font-weight:600;font-size:16px}
.topbar .spacer{flex:1}
.tabs{display:flex;gap:6px;padding:10px 18px 0}
.tab{padding:8px 16px;border-radius:8px;border:1px solid transparent;color:var(--sub);background:transparent}
.tab.active{background:var(--bubble-out);color:var(--text);font-weight:600;border-color:var(--border)}
.view{padding:14px 18px 24px}
.grid2{display:grid;grid-template-columns:300px 1fr;gap:14px}
.grid3{display:grid;grid-template-columns:260px 1fr;gap:14px}
.list{max-height:calc(100vh - 210px);overflow:auto}
.list-item{padding:9px 11px;border-bottom:1px solid var(--border);cursor:pointer}
.list-item:hover{background:var(--card)}
.list-item.active{background:var(--bubble-out)}
.list-item .name{font-weight:600}
.list-item .meta{color:var(--sub);font-size:12px;margin-top:2px}
.chat-col{display:flex;flex-direction:column;height:calc(100vh - 190px)}
.chat-head{display:flex;gap:10px;align-items:center;padding:8px 10px;border-bottom:1px solid var(--border);flex-wrap:wrap}
.msgs{flex:1;overflow:auto;padding:12px;display:flex;flex-direction:column;gap:6px}
.bubble-row{display:flex}
.bubble-row.out{justify-content:flex-end}
.bubble{max-width:560px;background:var(--bubble-in);border-radius:10px;padding:8px 11px;white-space:pre-wrap;word-break:break-word}
.bubble.out{background:var(--bubble-out)}
.bubble .meta{color:var(--sub);font-size:11px;margin-top:4px}
.chat-input{display:flex;gap:8px;padding:10px;border-top:1px solid var(--border)}
.chat-input textarea{height:70px}
.form-grid{display:grid;grid-template-columns:170px 1fr;gap:8px 12px;align-items:center}
.form-grid label{color:var(--sub)}
.section{margin:14px 0;padding:14px;background:var(--panel);border:1px solid var(--border);border-radius:10px}
.section h2{margin-bottom:10px}
.row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.stat{display:flex;gap:12px;flex-wrap:wrap}
.stat .box{flex:1;min-width:140px;padding:12px 14px;background:var(--panel);border:1px solid var(--border);border-radius:10px}
.stat .num{font-size:22px;font-weight:600;color:var(--accent2)}
.stat .lbl{color:var(--sub);font-size:12px;margin-top:2px}
.modal{position:fixed;inset:0;background:rgba(0,0,0,.6);display:flex;align-items:center;justify-content:center;z-index:50}
.modal .box{width:420px;max-width:92vw;padding:18px;background:var(--panel);border:1px solid var(--border);border-radius:12px}
.modal .box .row{justify-content:flex-end;margin-top:16px}
.toast{position:fixed;right:18px;bottom:18px;background:var(--card);border:1px solid var(--accent);
  color:var(--text);padding:9px 14px;border-radius:8px;z-index:60;opacity:0;transition:.2s}
.toast.show{opacity:1}
.codes{font-family:Consolas,monospace;background:var(--card);border:1px solid var(--border);
  border-radius:8px;padding:10px;white-space:pre-wrap;max-height:240px;overflow:auto}

/* ---------- 娴呰壊锛堢畝鍗曞弽鑹诧級 ---------- */
html[data-theme="light"]{
  --bg:#F4F8F6; --panel:#FFFFFF; --card:#E9F1EE; --border:#C8DAD4;
  --text:#16241F; --sub:#5C736B; --accent:#17936F; --accent2:#0F7A5C;
  --warn:#A9761A; --danger:#C04437; --bubble-in:#E3EFEA; --bubble-out:#CFE7DF;
}
html[data-theme="light"] .btn.danger{border-color:#E2B6B0}
html[data-theme="light"] .tag.warn{border-color:#E3CDA5}
html[data-theme="light"] .tag.bad{border-color:#E2B6B0}
html[data-theme="light"] tr:hover td{background:rgba(23,147,111,.06)}
html[data-theme="light"] .modal{background:rgba(20,35,30,.45)}

/* 平台统一 AI 时输入框锁定：灰掉，避免客户误以为能改 */
input:disabled, select:disabled, textarea:disabled { opacity: .55; cursor: not-allowed; }
.btn:disabled { opacity: .5; cursor: not-allowed; }
