/* ========== 全局 ========== */
*,*::before,*::after{margin:0;padding:0;box-sizing:border-box}
html{font-size:16px;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}
body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;background:#f5f5f7;color:#1d1d1f;min-height:100vh;line-height:1.5}
button,input,textarea,select{font-family:inherit;font-size:16px;outline:none}
a{color:inherit;text-decoration:none}
img{max-width:100%}

/* ========== 导航栏 ========== */
header,.navbar{background:rgba(255,255,255,.9);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border-bottom:1px solid #e5e5ea;position:sticky;top:0;z-index:100}
header .inner,.nav-inner{max-width:960px;margin:0 auto;padding:0 20px;height:52px;display:flex;align-items:center;justify-content:space-between}
.brand,.nav-brand{font-size:16px;font-weight:600;color:#1d1d1f;display:flex;align-items:center;gap:8px}
.brand .dot{width:28px;height:28px;background:linear-gradient(135deg,#6366f1,#8b5cf6);border-radius:7px;display:flex;align-items:center;justify-content:center;color:#fff;font-size:13px;font-weight:700;flex-shrink:0}
.nav-right{display:flex;align-items:center;gap:8px;flex-shrink:0}
.nav-user{font-size:13px;color:#6b7280}
.user-pill{background:#f3f4f6;padding:5px 12px;border-radius:20px;font-size:13px;color:#1d1d1f;display:flex;align-items:center;gap:6px;white-space:nowrap}
.user-pill .pts{color:#6366f1;font-weight:600}

/* ========== 按钮 ========== */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:4px;height:34px;padding:0 14px;border:none;border-radius:8px;font-size:13px;font-weight:500;cursor:pointer;transition:all .15s}
.btn-primary{background:linear-gradient(135deg,#6366f1,#8b5cf6);color:#fff;border-radius:10px;font-size:15px;font-weight:600;box-shadow:0 2px 8px rgba(99,102,241,.25);width:100%;height:48px;margin-top:4px}
.btn-primary:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 4px 16px rgba(99,102,241,.35)}
.btn-primary:disabled{opacity:.5;cursor:not-allowed;transform:none}
.btn-ghost{background:#f3f4f6;color:#4b5563}
.btn-ghost:hover{background:#e5e7eb}
.btn-outline{background:transparent;border:1px solid #d1d5db;color:#4b5563}
.btn-outline:hover{background:#f9fafb}
.btn-sm{height:28px;padding:0 10px;font-size:12px;color:#6366f1;background:none;border:1px solid #6366f1;border-radius:5px;margin-left:6px;white-space:nowrap}
.btn-sm:hover{background:#6366f1;color:#fff}
.btn-block{width:100%}
.btn-danger{background:#ef4444;color:#fff}
.btn-danger:hover{background:#dc2626}
.btn-success{background:#10b981;color:#fff}
.btn-success:hover{background:#059669}

/* ========== 容器 ========== */
.container{max-width:960px;margin:0 auto;padding:20px 16px 60px}

/* ========== 页面标题 ========== */
.hero{text-align:center;margin-bottom:24px;padding:20px 0 0}
.hero .tag{display:inline-block;padding:5px 12px;background:#ede9fe;color:#6366f1;border-radius:20px;font-size:12px;font-weight:500;margin-bottom:10px}
.hero h1{font-size:26px;font-weight:700;color:#1d1d1f;letter-spacing:-.5px;line-height:1.3}
.hero h1 span{background:linear-gradient(135deg,#6366f1,#8b5cf6);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}

/* ========== 卡片 ========== */
.card{background:#fff;border-radius:16px;padding:24px;box-shadow:0 1px 3px rgba(0,0,0,.04);margin-bottom:16px}
.card-head{display:flex;align-items:center;gap:10px;margin-bottom:20px}
.card-head .icon{width:38px;height:38px;border-radius:10px;display:flex;align-items:center;justify-content:center;font-size:17px;flex-shrink:0}
.card-head .icon.purple{background:linear-gradient(135deg,#ede9fe,#ddd6fe);color:#6366f1}
.card-head .icon.green{background:linear-gradient(135deg,#d1fae5,#a7f3d0);color:#10b981}
.card-head h3{font-size:16px;font-weight:600;color:#1d1d1f;margin:0}
.card-head p{font-size:12px;color:#86868b;margin:2px 0 0}

/* ========== 主布局 ========== */
.main{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-bottom:16px}

/* ========== 表单 ========== */
.form-item{display:flex;flex-direction:column;gap:6px}
.form-item label{font-size:13px;font-weight:500;color:#374151}
.form-item .hint{font-size:12px;color:#9ca3af}
.field{margin-bottom:16px}
.field label{display:block;font-size:13px;color:#6b7280;margin-bottom:6px;font-weight:500}
.field input,.field textarea{width:100%;border:1.5px solid #e5e5ea;border-radius:10px;padding:10px 14px;font-size:14px;background:#fafafc;transition:all .15s;color:#1d1d1f}
.field input{height:42px}
.field textarea{min-height:80px;resize:vertical;line-height:1.5}
.field input:focus,.field textarea:focus{border-color:#6366f1;background:#fff;box-shadow:0 0 0 3px rgba(99,102,241,.1)}
input[type="text"],input[type="password"],input[type="number"]{height:40px;padding:0 12px;border:1.5px solid #e5e7eb;border-radius:8px;font-size:14px;background:#fff;transition:all .15s;width:100%;color:#1f2937}
input:focus{border-color:#6366f1;box-shadow:0 0 0 3px rgba(99,102,241,.1)}
.cost-tip{text-align:center;font-size:13px;color:#86868b;margin-top:10px}
.cost-tip strong{color:#6366f1;font-weight:700}

/* ========== 二维码 ========== */
.result-area{min-height:300px;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center}
.result-area .empty{opacity:.35}
.result-area .empty-icon{font-size:48px;margin-bottom:10px}
.result-area .empty-text{color:#86868b;font-size:13px;line-height:1.5}
.success-text{color:#10b981;font-size:14px;font-weight:500;margin-bottom:12px;text-align:center}
.qrcode-box{width:240px;margin:0 auto 12px;padding:16px;background:#fafafc;border-radius:14px;border:1px solid #f0f0f5}
.qrcode-box img{width:208px;height:208px;display:block;border-radius:6px;margin:0 auto}
.dl{display:inline-block;color:#6366f1;text-decoration:none;font-size:14px;font-weight:500;padding:6px 16px;border:1px solid #6366f1;border-radius:8px;background:#ede9fe}
.dl:hover{background:#ddd6fe}
.spinner{width:32px;height:32px;border:3px solid #e5e5ea;border-top-color:#6366f1;border-radius:50%;animation:spin .7s linear infinite;margin:0 auto}
@keyframes spin{to{transform:rotate(360deg)}}

/* ========== 表格 ========== */
.table-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch}
table{width:100%;border-collapse:collapse;font-size:13px}
thead th{text-align:left;padding:10px 12px;background:#fafbff;color:#6b7280;font-weight:500;border-bottom:1px solid #f0f0f0;white-space:nowrap}
thead th.text-right,tbody td.text-right{text-align:right}
tbody td{padding:12px;border-bottom:1px solid #f5f6fa;vertical-align:middle}
tbody tr:last-child td{border-bottom:none}
tbody tr:hover{background:#fafbff}
.row-actions{display:flex;gap:4px;flex-wrap:nowrap;align-items:center}
.row-actions .btn{height:26px;padding:0 8px;font-size:11px;border-radius:5px;white-space:nowrap}

/* ========== 认证页 ========== */
.auth-page{display:flex;align-items:center;justify-content:center;min-height:100vh;padding:20px;background:linear-gradient(135deg,#f5f3ff,#ede9fe)}
.auth-card{background:#fff;border-radius:20px;padding:40px 32px;width:380px;max-width:100%;box-shadow:0 16px 48px rgba(99,102,241,.12)}
.auth-form h2{font-size:20px;margin-bottom:4px}
.auth-sub{font-size:13px;color:#9ca3af;margin-bottom:20px}
.login-page{min-height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#f5f3ff,#ede9fe);padding:20px}
.login-card{background:#fff;border-radius:20px;padding:40px 32px;width:380px;max-width:100%;box-shadow:0 16px 48px rgba(99,102,241,.12)}
.login-logo{width:56px;height:56px;background:linear-gradient(135deg,#6366f1,#8b5cf6);border-radius:14px;margin:0 auto 16px;display:flex;align-items:center;justify-content:center;color:#fff;font-size:24px;font-weight:700}
.login-card h2{text-align:center;font-size:22px;font-weight:700;margin-bottom:4px;color:#1d1d1f}
.login-card .sub{text-align:center;color:#86868b;font-size:13px;margin-bottom:28px}
.login-card .err{color:#ef4444;text-align:center;margin-bottom:12px;font-size:13px;min-height:18px}
.login-card input{width:100%;height:44px;border:1.5px solid #e5e5ea;border-radius:10px;padding:0 14px;font-size:15px;margin-bottom:12px;background:#fafafc;transition:all .15s}
.login-card input:focus{border-color:#6366f1;background:#fff;box-shadow:0 0 0 3px rgba(99,102,241,.1)}
.login-card .login-btn{width:100%;height:46px;background:linear-gradient(135deg,#6366f1,#8b5cf6);color:#fff;border:none;border-radius:10px;font-size:15px;cursor:pointer;font-weight:600;margin-top:4px;box-shadow:0 4px 12px rgba(99,102,241,.25);transition:all .15s}
.login-card .login-btn:hover{transform:translateY(-1px);box-shadow:0 6px 20px rgba(99,102,241,.35)}
.login-card .tip{text-align:center;margin-top:16px;font-size:13px;color:#b0b0b5}
.login-card .link-btn{background:none;border:none;color:#6366f1;cursor:pointer;font-size:13px;font-weight:500}
.login-card .link-btn:hover{text-decoration:underline}

/* ========== Toast ========== */
.toast{position:fixed;top:60px;left:50%;transform:translateX(-50%);padding:10px 20px;background:#1d1d1f;color:#fff;border-radius:10px;z-index:9999;font-size:14px;box-shadow:0 8px 24px rgba(0,0,0,.2);animation:slideIn .25s;pointer-events:none}
.toast.success{background:#10b981}
.toast.error{background:#ef4444}
.toast.info{background:#1f2937}
@keyframes slideIn{from{opacity:0;transform:translate(-50%,-6px)}to{opacity:1;transform:translate(-50%,0)}}

/* ========== 管理端 ========== */
.tabs{display:flex;gap:4px;margin-bottom:16px;background:#fff;border-radius:10px;padding:4px}
.tab{flex:1;padding:10px;border:none;background:none;font-size:13px;color:#6b7280;cursor:pointer;border-radius:7px;transition:all .15s;font-weight:500}
.tab.active{background:linear-gradient(135deg,#6366f1,#8b5cf6);color:#fff}
.tab-panel[hidden]{display:none}
.stats-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:16px}
.stat-card{background:#fff;border-radius:12px;padding:16px;display:flex;align-items:center;gap:12px;box-shadow:0 1px 3px rgba(0,0,0,.04)}
.stat-icon{font-size:28px;flex-shrink:0}
.stat-body{min-width:0}
.stat-value{font-size:22px;font-weight:700;color:#1f2937;line-height:1.2}
.stat-label{font-size:12px;color:#9ca3af;margin-top:2px;white-space:nowrap}

/* ========== 模态框 ========== */
.modal-overlay{position:fixed;inset:0;background:rgba(0,0,0,.35);z-index:999;display:flex;align-items:center;justify-content:center;padding:20px}
.modal-overlay[hidden]{display:none}
.modal{background:#fff;border-radius:16px;padding:28px;width:380px;max-width:100%;box-shadow:0 16px 48px rgba(0,0,0,.15)}
.modal-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px}
.modal-header h3{font-size:16px;font-weight:600;margin:0}
.modal-close{width:30px;height:30px;border:none;background:#f3f4f6;border-radius:7px;font-size:16px;cursor:pointer;color:#6b7280;display:flex;align-items:center;justify-content:center}
.modal-close:hover{background:#e5e7eb}
.modal-body{display:flex;flex-direction:column;gap:12px}
.modal-body p{font-size:13px;color:#6b7280}
.modal input{width:100%;height:40px;border:1.5px solid #e5e5ea;border-radius:8px;padding:0 12px;font-size:14px;background:#fafafc;margin-bottom:4px}
.modal input:focus{border-color:#6366f1;background:#fff}
.modal .btns{display:flex;gap:8px;margin-top:4px}
.modal .btns button{flex:1;height:38px;border:none;border-radius:8px;font-size:14px;cursor:pointer;font-weight:500}
.modal .btns .ok{background:#6366f1;color:#fff}
.modal .btns .cancel{background:#f3f4f6;color:#666}
.radio-group{display:flex;flex-wrap:wrap;gap:12px}
.radio-group label{display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;font-weight:normal}

/* ========== 记录卡片 ========== */
.his{display:flex;align-items:center;gap:10px;padding:10px 12px;background:#fafafc;border-radius:8px;margin-bottom:8px;cursor:pointer;transition:background .1s}
.his:active,.his.active{background:#ede9fe}
.his img{width:38px;height:38px;border-radius:5px;border:1px solid #eee;flex-shrink:0;object-fit:contain}
.his .info{flex:1;min-width:0;overflow:hidden}
.his .info .t{font-size:13px;font-weight:600;color:#1d1d1f;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.his .info .m{font-size:12px;color:#86868b;margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.his .points{font-size:12px;color:#6366f1;font-weight:600;flex-shrink:0}
.his .del{color:#ef4444;font-size:11px;padding:3px 7px;border:1px solid #fecaca;border-radius:4px;background:#fff;flex-shrink:0;cursor:pointer}
.his .del:hover{background:#fef2f2}

/* ========== 系统配置卡片 ========== */
.config-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:14px}
.config-grid .card{padding:20px}
.config-grid .card-header{display:flex;align-items:center;gap:10px;margin-bottom:14px}
.config-grid .card-header .cfg-icon{width:36px;height:36px;border-radius:9px;display:flex;align-items:center;justify-content:center;font-size:16px;flex-shrink:0}
.config-grid .card-header h3{font-size:14px;font-weight:600;margin:0;color:#1d1d1f}
.config-grid .card-header p{font-size:11px;color:#9ca3af;margin:1px 0 0}
.config-grid input{width:100%;height:40px;border:1px solid #e5e7eb;border-radius:8px;padding:0 12px;font-size:14px;background:#fafafc}

/* ========== 移动端 ========== */
@media(max-width:768px){
  header .inner,.nav-inner{padding:0 14px;height:48px}
  .brand,.nav-brand{font-size:15px;gap:6px}
  .container{padding:14px 12px 60px}
  .hero h1{font-size:22px}
  .main{grid-template-columns:1fr;gap:12px}
  .card{padding:18px;border-radius:14px}
  .result-area{min-height:240px}
  .qrcode-box{width:200px;padding:12px}
  .qrcode-box img{width:176px;height:176px}
  .stats-grid{grid-template-columns:repeat(2,1fr);gap:8px}
  .stat-card{padding:12px;gap:8px}
  .stat-icon{font-size:22px}
  .stat-value{font-size:18px}
  .stat-label{font-size:11px}
  table{font-size:12px}
  thead th{padding:8px 6px;font-size:11px}
  tbody td{padding:8px 6px;font-size:11px}
  .config-grid{grid-template-columns:1fr}
  .login-card,.auth-card{padding:32px 22px}
  .his{padding:8px 10px;gap:8px}
  .his img{width:32px;height:32px}
  .btn-primary{height:44px}
}

@media(max-width:380px){
  .brand{font-size:13px}
  .hero h1{font-size:20px}
  .card{padding:14px}
  .qrcode-box{width:170px}
  .qrcode-box img{width:146px;height:146px}
  .stats-grid{gap:6px}
  .stat-card{padding:10px;gap:6px}
  .stat-value{font-size:16px}
}

/* ========== 动画 ========== */
@keyframes slideDown{from{opacity:0;transform:translate(-50%,-16px)}to{opacity:1;transform:translate(-50%,0)}}
@keyframes fadeIn{from{opacity:0}to{opacity:1}}