/* 设计 token 复刻自 dashboard frontend/style.css（仓隔离不共享 CSS，各维护一份；dashboard 改 token 时需手动同步） */
:root{
  --primary:#2563EB; --primary-hover:#1D4ED8; --primary-light:#EFF6FF;
  --green:#10B981; --green-light:#ECFDF5;
  --red:#EF4444; --red-light:#FEF2F2;
  --amber:#D97706; --amber-light:#FFFBEB;
  --ink:#1F2937; --sub:#6B7280; --muted:#9CA3AF;
  --line:#E5E7EB; --bg-alt:#F9FAFB; --bg:#F3F4F6; --card:#FFFFFF;
  --shadow:0 1px 3px rgba(16,24,40,.06),0 1px 2px rgba(16,24,40,.04);
  --shadow-h:0 8px 24px rgba(16,24,40,.12);
}
*{box-sizing:border-box;margin:0;padding:0}
body{font-family:-apple-system,"PingFang SC","Microsoft YaHei",system-ui,sans-serif;
  background:var(--bg);color:var(--ink);line-height:1.5;-webkit-font-smoothing:antialiased}

/* ── 口令门 ── */
.gate{position:fixed;inset:0;background:var(--bg);display:flex;align-items:center;justify-content:center;z-index:100}
.gate[hidden]{display:none}  /* 覆盖 .gate 的 display:flex，确保 hidden 属性能真正隐藏口令门 */
.gate-box{background:var(--card);border:1px solid var(--line);border-radius:16px;box-shadow:var(--shadow-h);
  padding:36px 32px;width:340px;text-align:center}
.gate-icon{font-size:32px;line-height:1}
.gate-box h2{font-size:20px;font-weight:700;margin-top:12px}
.gate-sub{font-size:13px;color:var(--sub);margin-top:6px;margin-bottom:18px}
.gate-box input{width:100%;font:inherit;font-size:15px;border:1px solid var(--line);border-radius:10px;
  padding:11px 14px;outline:none;text-align:center;letter-spacing:2px}
.gate-box input:focus{border-color:var(--primary);box-shadow:0 0 0 2px rgba(37,99,235,.15)}
.gate-box button{width:100%;margin-top:12px;font:inherit;font-size:15px;font-weight:600;color:#fff;
  background:var(--primary);border:none;border-radius:10px;padding:11px;cursor:pointer;transition:.15s}
.gate-box button:hover{background:var(--primary-hover)}
.gate-box button:disabled{opacity:.55;cursor:not-allowed}
.gate-box button:disabled:hover{background:var(--primary)}
.gate-box input:disabled{background:var(--bg-alt);cursor:not-allowed}
.gate-err{color:var(--red);font-size:13px;margin-top:10px}

/* ── 上传页主体 ── */
.wrap{max-width:613px;margin:0 auto;padding:24px 28px 64px}
header{margin-bottom:18px}
h1{font-size:22px;font-weight:700;letter-spacing:-.3px}
h1 .tag{font-size:11px;font-weight:600;color:#fff;background:var(--primary);
  padding:2px 8px;border-radius:6px;vertical-align:middle;margin-left:8px}
.sub{color:var(--sub);font-size:13px;margin-top:6px}

.notice{margin-top:14px;font-size:13px;color:#92400E;background:var(--amber-light);
  border:1px solid #FDE68A;border-radius:10px;padding:11px 14px;line-height:1.65}

.dropzone{background:var(--card);border:2px dashed var(--line);border-radius:16px;
  padding:48px 24px;text-align:center;cursor:pointer;transition:all .15s;box-shadow:var(--shadow);margin-top:16px}
.dropzone:hover{border-color:var(--primary);background:var(--primary-light)}
.dropzone.dragover{border-color:var(--primary);background:var(--primary-light);transform:scale(1.005)}
.dz-icon{font-size:34px;color:var(--primary);font-weight:700;line-height:1}
.dz-text{font-size:15px;font-weight:600;margin-top:14px}
.dz-link{color:var(--primary)}
.dz-hint{font-size:12px;color:var(--muted);margin-top:6px}

.summary{margin-top:18px;padding:12px 16px;border-radius:12px;font-size:14px;
  font-weight:600;border:1px solid var(--line);background:var(--card);box-shadow:var(--shadow)}
.summary.ok{background:var(--green-light);border-color:#A7F3D0;color:#047857}
.summary.partial{background:var(--amber-light);border-color:#FDE68A;color:#B45309}
.summary.fail{background:var(--red-light);border-color:#FECACA;color:#B91C1C}

.filelist-wrap{margin-top:18px;background:var(--card);border:1px solid var(--line);
  border-radius:14px;box-shadow:var(--shadow);overflow:hidden}
.filelist{width:100%;border-collapse:collapse;font-size:13px}
.filelist thead th{text-align:left;padding:11px 14px;background:var(--bg-alt);
  color:var(--sub);font-weight:600;border-bottom:1px solid var(--line);font-size:12px}
.filelist tbody td{padding:11px 14px;border-bottom:1px solid var(--line);vertical-align:middle}
.filelist tbody tr:last-child td{border-bottom:none}
.col-name{width:42%}.col-ch{width:64px}.col-status{width:150px}.col-progress{width:auto}
.fname{font-weight:500;word-break:break-all}
.badge{display:inline-block;font-size:11px;font-weight:700;padding:2px 8px;border-radius:6px;
  background:var(--primary-light);color:var(--primary)}
.badge.na{background:var(--bg);color:var(--muted)}
.status{display:inline-flex;align-items:center;gap:6px;font-weight:600;font-size:12px}
.status .dot{width:7px;height:7px;border-radius:50%;background:var(--muted)}
.status.waiting{color:var(--sub)}
.status.uploading{color:var(--primary)}
.status.uploading .dot{background:var(--primary);animation:pulse 1s infinite}
.status.success{color:#047857}.status.success .dot{background:var(--green)}
.status.error{color:#B91C1C;cursor:pointer}.status.error .dot{background:var(--red)}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.35}}
.bar{height:8px;border-radius:6px;background:var(--bg);overflow:hidden;min-width:90px}
.bar-fill{height:100%;width:0;background:var(--primary);border-radius:6px;transition:width .2s}
.bar-fill.done{background:var(--green)}.bar-fill.err{background:var(--red)}
.progress-cell{display:flex;align-items:center;gap:10px}
.pct{font-size:11px;color:var(--sub);min-width:34px;text-align:right}
.err-detail{margin-top:6px;font-size:12px;color:var(--red);background:var(--red-light);
  border-radius:8px;padding:8px 10px;display:none}
.err-detail.show{display:block}
