:root{
  --ink:#1b1f27; --sub:#6b7280; --line:#e5e7eb; --bg:#f5f6f8; --card:#fff;
  --brand:#1f3864; --brand2:#2f5597; --accent:#e8722c;
  --over:#d93025; --today:#e8a33d; --soon:#e5c07b; --warn:#7c8aa0; --ok:#2e9e5b;
}
*{box-sizing:border-box}
body{margin:0;font:14px/1.55 -apple-system,"PingFang SC","Microsoft YaHei",sans-serif;
     color:var(--ink);background:var(--bg)}
a{color:var(--brand2);text-decoration:none}
a:hover{text-decoration:underline}
h1,h2,h3{margin:0 0 12px;font-weight:600}
h1{font-size:20px}h2{font-size:16px}h3{font-size:14px;color:var(--sub)}

/* ---- 顶栏 ---- */
.topbar{background:var(--brand);color:#fff;display:flex;align-items:center;
        padding:0 18px;height:52px;gap:4px}
.topbar .logo{font-weight:700;font-size:15px;margin-right:20px;letter-spacing:.5px}
.topbar .logo span{color:var(--accent)}
.topbar a{color:#cdd7e8;padding:6px 11px;border-radius:6px;font-size:13.5px}
.topbar a:hover{background:rgba(255,255,255,.12);text-decoration:none;color:#fff}
.topbar a.on{background:rgba(255,255,255,.18);color:#fff;font-weight:600}
.topbar .right{margin-left:auto;display:flex;align-items:center;gap:12px;font-size:13px;color:#cdd7e8}
.topbar .right a{padding:4px 8px}
.wrap{padding:18px;max-width:1680px;margin:0 auto}
.wrap-bare{padding:0;max-width:none}

/* ---- 卡片 ---- */
.card{background:var(--card);border:1px solid var(--line);border-radius:10px;
      padding:16px;margin-bottom:16px}
.card.tight{padding:12px}
.grid{display:grid;gap:14px}
.g2{grid-template-columns:repeat(2,1fr)}
.g3{grid-template-columns:repeat(3,1fr)}
.g4{grid-template-columns:repeat(4,1fr)}
.g6{grid-template-columns:repeat(6,1fr)}
@media(max-width:1100px){.g4,.g6{grid-template-columns:repeat(2,1fr)}.g3{grid-template-columns:1fr}}

/* ---- 指标 ---- */
.kpi{background:#fff;border:1px solid var(--line);border-radius:10px;padding:12px 14px}
.kpi .v{font-size:24px;font-weight:700;line-height:1.2}
.kpi .k{color:var(--sub);font-size:12.5px;margin-top:2px}
.kpi.red .v{color:var(--over)}.kpi.amber .v{color:var(--today)}
.kpi.green .v{color:var(--ok)}.kpi.blue .v{color:var(--brand2)}

/* ---- 表格 ---- */
table{border-collapse:collapse;width:100%;font-size:13px}
th,td{border-bottom:1px solid var(--line);padding:7px 9px;text-align:left;vertical-align:top}
th{background:#f8f9fb;font-weight:600;color:#374151;position:sticky;top:0;z-index:1;
   white-space:nowrap;font-size:12.5px}
tbody tr:hover{background:#fafbfd}
td.num,th.num{text-align:right;font-variant-numeric:tabular-nums}
td.mid,th.mid{text-align:center}
.scroll{overflow:auto;max-height:70vh;border:1px solid var(--line);border-radius:8px;background:#fff}
.nowrap{white-space:nowrap}
.small{font-size:12.5px}
.sub{color:var(--sub)}
.mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12.5px}

/* ---- 红黄绿灯 ---- */
.light{display:inline-block;padding:1px 8px;border-radius:20px;font-size:12px;
       font-weight:600;white-space:nowrap;border:1px solid transparent}
.l-over{background:#fde8e6;color:var(--over);border-color:#f5c2bd}
.l-today{background:#fdf0d9;color:#a86a12;border-color:#f0d4a3}
.l-soon{background:#fdf8e3;color:#8a7513;border-color:#efe3b0}
.l-warn{background:#eef1f5;color:#5b6675;border-color:#dfe4ea}
.l-ok{background:#e7f6ed;color:var(--ok);border-color:#bfe6cd}
.dot{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:5px;
     vertical-align:middle}
.d-over{background:var(--over)}.d-today{background:var(--today)}
.d-soon{background:var(--soon)}.d-warn{background:var(--warn)}.d-ok{background:var(--ok)}

/* ---- 表单 ---- */
input,select,textarea{font:inherit;padding:5px 8px;border:1px solid var(--line);
      border-radius:6px;background:#fff;color:inherit;max-width:100%}
input:focus,select:focus,textarea:focus{outline:2px solid #cfdcf5;border-color:var(--brand2)}
input[type=text],input[type=password],input[type=date]{min-width:90px}
select.cell,input.cell{padding:3px 5px;font-size:12.5px;width:100%;min-width:76px;
      background:#fffdf5;border-color:#e6dcc0}
select.cell:hover,input.cell:hover{background:#fff8e6}
td.edited{background:#fffdf5}
button,.btn{font:inherit;padding:6px 14px;border-radius:7px;border:1px solid var(--line);
      background:#fff;cursor:pointer;color:var(--ink)}
button:hover,.btn:hover{background:#f3f5f9;text-decoration:none}
.btn-p{background:var(--brand);border-color:var(--brand);color:#fff}
.btn-p:hover{background:var(--brand2)}
.btn-a{background:var(--accent);border-color:var(--accent);color:#fff}
.btn-a:hover{filter:brightness(1.07)}
.btn-s{padding:3px 9px;font-size:12.5px}
.row{display:flex;gap:9px;align-items:center;flex-wrap:wrap}
.filters{display:flex;gap:9px;align-items:center;flex-wrap:wrap;
         background:#fff;border:1px solid var(--line);border-radius:10px;padding:11px 14px;
         margin-bottom:14px}
.filters label{font-size:12.5px;color:var(--sub)}

/* ---- 提示 ---- */
.flash{padding:9px 14px;border-radius:8px;margin-bottom:14px;font-size:13.5px}
.flash.ok{background:#e7f6ed;color:#1c6b3d;border:1px solid #bfe6cd}
.flash.err{background:#fde8e6;color:#a3231a;border:1px solid #f5c2bd}
.flash.info{background:#eef3fc;color:#26477f;border:1px solid #cfdcf5}
.flash.warn{background:#fdf0d9;color:#8a5a12;border:1px solid #f0d4a3}

/* ---- 登录 ---- */
.login-bg{min-height:100vh;display:flex;align-items:center;justify-content:center;
   background:linear-gradient(135deg,#1f3864,#2f5597 55%,#3d6bb3)}
.login-box{background:#fff;padding:34px 32px;border-radius:14px;width:368px;
   box-shadow:0 18px 50px rgba(0,0,0,.28)}
.login-box h1{font-size:19px;margin-bottom:4px}
.login-box .sub{margin-bottom:22px;font-size:13px}
.login-box input{width:100%;padding:10px 12px;margin-bottom:12px}
.login-box button{width:100%;padding:10px;font-size:15px}

/* ---- 附件 ---- */
.att{display:flex;align-items:center;gap:9px;padding:6px 0;border-bottom:1px dashed var(--line)}
.pill{display:inline-block;background:#eef1f5;border-radius:20px;padding:1px 9px;
      font-size:12px;color:#5b6675}
.tag{display:inline-block;background:#eef3fc;color:#26477f;border-radius:5px;
     padding:1px 7px;font-size:12px}
.tag.manual{background:#fff0e0;color:#a35a12}
.flash-row{animation:fr 1s ease-out}
@keyframes fr{0%{background:#fff6d8}100%{background:transparent}}
.empty{color:var(--sub);text-align:center;padding:34px 0;font-size:13.5px}

/* ---- 批量导入核对 ---- */
/* 整行标黄：批量核对页里用来把「疑似自有导入模板」的行从十几行里挑出来，
   一行一行找太费眼，而这类行误导会多出一条 ¥0 的重复单。 */
tr.bg-warn > td{background:#fffaf0}
table.batch td{vertical-align:middle}
table.batch input[type=checkbox]{width:16px;height:16px}
table.batch input,table.batch select{font-size:13px;padding:3px 6px}
.bar{height:7px;background:#eef1f5;border-radius:4px;overflow:hidden;min-width:70px}
.bar>i{display:block;height:100%;background:var(--ok)}
.bar.warn>i{background:var(--today)}
.bar.bad>i{background:var(--over)}
pre.log{background:#1b1f27;color:#d6e0ef;padding:12px;border-radius:8px;font-size:12px;
        max-height:340px;overflow:auto;margin:0;white-space:pre-wrap}
details summary{cursor:pointer;color:var(--brand2);font-size:13px}
