*{box-sizing:border-box}body{margin:0;background:#f5f6f8;color:#222;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Microsoft YaHei",Arial,sans-serif}.topbar{height:56px;background:#15171c;color:#fff;display:flex;align-items:center;justify-content:space-between;padding:0 22px}.brand{font-weight:700}.topbar a{color:#fff;text-decoration:none;margin-left:18px;opacity:.88}.container{max-width:1180px;margin:24px auto;padding:0 18px}h1{margin:0 0 18px;font-size:26px}h2{font-size:18px;margin:0 0 14px}.panel,.card,.login-box{background:#fff;border:1px solid #e5e7eb;box-shadow:0 4px 14px rgba(20,20,20,.04);border-radius:12px}.panel{padding:18px;margin-bottom:18px}.cards{display:flex;gap:16px;margin-bottom:18px}.card{flex:1;padding:22px}.num{font-size:34px;font-weight:800;margin-bottom:6px}.label,.muted{color:#666}.ok{color:#0b8f45}.bad{color:#c62828}.alert{background:#fff0f0;color:#b00020;border:1px solid #ffd2d2;border-radius:8px;padding:10px;margin:12px 0}.login-box{max-width:420px;margin:90px auto;padding:28px}form label{display:block;margin-top:12px;margin-bottom:6px;font-weight:600}input,select{width:100%;height:40px;border:1px solid #ccd1d8;border-radius:8px;padding:0 10px;outline:none;background:#fff}button,.button{border:1px solid #cfd4dc;background:#fff;border-radius:8px;padding:9px 14px;cursor:pointer;text-decoration:none;color:#222;display:inline-block}button.primary,.primary-link{margin-top:16px;background:#111827;color:#fff;border-color:#111827}button.danger{color:#b00020;border-color:#f0b8c0}.inline-form{display:grid;grid-template-columns:120px 1fr 120px 1fr auto;align-items:end;gap:10px}.inline-form label{margin-top:0}table{width:100%;border-collapse:collapse;background:#fff}th,td{text-align:left;border-bottom:1px solid #eceff3;padding:11px 10px;vertical-align:middle}th{background:#fafafa;font-size:14px}.badge{border-radius:999px;padding:4px 9px;font-size:13px;background:#f4f4f4;display:inline-block}.badge.ok{background:#e8f6ed;color:#0b8f45}.badge.bad{background:#fff0f0;color:#b00020}.actions{display:flex;gap:8px}.actions form{margin:0}.empty{text-align:center;color:#777;padding:28px}.center{text-align:center}.qr{width:280px;height:280px;border:1px solid #ddd;border-radius:12px;padding:10px;background:#fff}.status{margin:18px auto;max-width:420px;padding:12px;border-radius:8px;font-weight:700}.status.pending{background:#fff8e1;color:#8a5a00}.status.success{background:#e8f6ed;color:#0b8f45}.status.failed{background:#fff0f0;color:#b00020}.details{max-width:900px;margin:12px auto;text-align:left}pre,.debug{white-space:pre-wrap;word-break:break-word;background:#111827;color:#e5e7eb;border-radius:8px;padding:12px;text-align:left;max-height:300px;overflow:auto}code.url{display:block;max-width:900px;margin:10px auto;word-break:break-all;background:#f1f2f4;padding:10px;border-radius:8px;text-align:left}.code-form{max-width:620px;margin:16px auto;text-align:left}@media(max-width:820px){.cards{flex-direction:column}.inline-form{display:block}.topbar{height:auto;padding:14px;display:block}.topbar nav{margin-top:10px}.topbar a{margin-left:0;margin-right:12px}}

/* 文件管理 */
.header{display:flex;justify-content:space-between;align-items:center;margin-bottom:24px}
.header h1{font-size:20px;color:#1a1a1a;margin:0}
.btn-sm{font-size:12px;padding:5px 12px;border-radius:5px;border:1px solid #e0e0e0;background:#fff;cursor:pointer;margin-right:4px;text-decoration:none;color:#222}
.btn-sm:hover{background:#f5f5f5}
.btn-sm.danger{color:#dc2626;border-color:#fecaca}
.btn-sm.danger:hover{background:#fef2f2}
.btn-sm.primary{color:#2563eb;border-color:#bfdbfe}
.modal{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.4);display:flex;align-items:center;justify-content:center;z-index:1000}
.modal-box{background:#fff;border-radius:12px;padding:30px;width:420px;max-width:90vw;max-height:80vh;overflow-y:auto}
.modal-box h3{margin-bottom:20px;font-size:18px}
.modal-box input,.modal-box select{width:100%;padding:10px;border:1px solid #e0e0e0;border-radius:6px;font-size:13px;margin-bottom:12px;outline:none}
.modal-btns{display:flex;gap:8px;justify-content:flex-end;margin-top:16px}
.modal-btns button{padding:8px 20px;border-radius:6px;border:none;cursor:pointer;font-size:13px}
.modal-btns .cancel{background:#f3f4f6;color:#666}
.modal-btns .confirm{background:#2563eb;color:#fff}
.spin{display:inline-block;width:20px;height:20px;border:2px solid #e0e0e0;border-top-color:#2563eb;border-radius:50%;animation:spin .6s linear infinite;vertical-align:middle;margin-right:6px}
@keyframes spin{to{transform:rotate(360deg)}}
.toast{position:fixed;top:20px;right:20px;padding:12px 20px;border-radius:8px;color:#fff;font-size:13px;z-index:2000;opacity:0;transition:opacity .3s}
.toast.show{opacity:1}
.toast.success{background:#16a34a}
.toast.error{background:#dc2626}
