:root{
  --bg:#0a1628; --bg-secondary:#0f1f38; --surface:#152a48; --surface-hover:#1a3358;
  --border:#22406b; --text:#e8f0fc; --text-secondary:#8ba3c7; --text-muted:#5a7196;
  --accent:#d4a574; --accent-hover:#e0b585; --primary:#4a7cc4; --primary-hover:#5a8dd4;
  --success:#4ade80; --danger:#f87171; --warning:#fbbf24;
}
*{margin:0;padding:0;box-sizing:border-box}
body{
  font-family:-apple-system,BlinkMacSystemFont,"Microsoft YaHei","PingFang SC",sans-serif;
  background:var(--bg);color:var(--text);min-height:100vh;overflow-x:hidden;font-size:14px;
}
a{color:var(--primary);text-decoration:none}
a:hover{color:var(--primary-hover)}

.topbar{
  background:var(--bg-secondary);border-bottom:1px solid var(--border);
  padding:14px 32px;display:flex;justify-content:space-between;align-items:center;
  box-shadow:0 2px 20px rgba(0,0,0,.15);flex-wrap:wrap;gap:12px;
}
.brand{display:flex;align-items:center;gap:14px}
.logo{
  width:42px;height:42px;background:linear-gradient(135deg,var(--primary),var(--accent));
  border-radius:10px;display:flex;align-items:center;justify-content:center;
  font-weight:700;font-size:20px;color:#fff;box-shadow:0 4px 12px rgba(74,124,196,.3);flex:none;
}
.brand-text h1{font-size:17px;font-weight:600;letter-spacing:.5px}
.brand-text p{font-size:10px;color:var(--text-muted);letter-spacing:2px;margin-top:2px}
.top-actions{display:flex;align-items:center;gap:14px}
.who{text-align:right;line-height:1.5}
.who b{font-size:14px}
.who span{display:block;font-size:11px;color:var(--text-muted)}
.badge{
  display:inline-block;padding:2px 8px;border-radius:20px;font-size:10px;
  border:1px solid var(--accent);color:var(--accent);margin-left:6px;vertical-align:middle;
}
main{padding:28px 32px;max-width:1500px;margin:0 auto}
.hero{margin-bottom:26px}
.hero h2{font-size:26px;font-weight:600;margin-bottom:6px}
.hero p{color:var(--text-secondary);font-size:13px}
.section-title{
  display:flex;align-items:center;gap:10px;margin:26px 0 14px;
  font-size:15px;font-weight:600;color:var(--text-secondary);
}
.section-title::after{content:"";flex:1;height:1px;background:var(--border)}

/* 卡片 */
.app-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:18px}
.app-card{
  background:var(--surface);border:1px solid var(--border);border-radius:14px;padding:22px;
  transition:all .25s cubic-bezier(.4,0,.2,1);position:relative;overflow:hidden;
  color:inherit;display:block;
}
.app-card::before{
  content:"";position:absolute;inset:0 auto 0 0;width:3px;
  background:linear-gradient(180deg,var(--primary),var(--accent));opacity:0;transition:opacity .25s;
}
.app-card:hover{
  transform:translateY(-3px);border-color:var(--primary);
  box-shadow:0 10px 30px rgba(0,0,0,.3);background:var(--surface-hover);
}
.app-card:hover::before{opacity:1}
.card-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:14px}
.card-icon{font-size:28px;line-height:1}
.card-status{font-size:10px;color:var(--success);display:flex;align-items:center;gap:5px}
.dot-mini{width:6px;height:6px;border-radius:50%;background:var(--success)}
.card-title{font-size:16px;font-weight:600;margin-bottom:7px}
.card-desc{font-size:12px;color:var(--text-secondary);line-height:1.65;min-height:40px}
.card-footer{
  display:flex;justify-content:space-between;align-items:center;
  margin-top:16px;padding-top:14px;border-top:1px solid var(--border);
}
.card-meta{display:flex;gap:8px;align-items:center}
.card-tag{
  font-size:10px;padding:2px 8px;border-radius:5px;
  background:rgba(74,124,196,.15);color:var(--primary);border:1px solid rgba(74,124,196,.3);
}
.card-tech{font-size:10px;color:var(--text-muted)}
.card-arrow{color:var(--accent);font-weight:600;font-size:12px}

/* 按钮 */
.btn{
  display:inline-flex;align-items:center;gap:6px;padding:8px 16px;border-radius:8px;
  border:1px solid var(--border);background:var(--surface);color:var(--text);
  font-size:13px;cursor:pointer;font-family:inherit;transition:all .18s;
}
.btn:hover{border-color:var(--primary);background:var(--surface-hover);color:var(--text)}
.btn.primary{background:var(--primary);border-color:var(--primary);color:#fff}
.btn.primary:hover{background:var(--primary-hover)}
.btn.danger{border-color:rgba(248,113,113,.4);color:var(--danger)}
.btn.danger:hover{background:rgba(248,113,113,.12);border-color:var(--danger)}
.btn.sm{padding:5px 11px;font-size:12px}

/* 表单 */
label{display:block;font-size:12px;color:var(--text-secondary);margin-bottom:6px}
input[type=text],input[type=password],input[type=tel],input[type=search],textarea,select{
  width:100%;padding:10px 12px;border-radius:8px;border:1px solid var(--border);
  background:var(--bg-secondary);color:var(--text);font-size:14px;font-family:inherit;
}
input:focus,textarea:focus,select:focus{outline:none;border-color:var(--primary)}
.field{margin-bottom:16px}
.hint{font-size:11px;color:var(--text-muted);margin-top:5px;line-height:1.5}

/* 登录页 */
.login-wrap{
  min-height:100vh;display:flex;align-items:center;justify-content:center;
  padding:calc(20px + env(safe-area-inset-top)) calc(20px + env(safe-area-inset-right))
          calc(20px + env(safe-area-inset-bottom)) calc(20px + env(safe-area-inset-left));
}
.login-box{
  width:100%;max-width:390px;background:var(--surface);border:1px solid var(--border);
  border-radius:16px;padding:34px 30px;box-shadow:0 20px 60px rgba(0,0,0,.45);
}
.login-head{text-align:center;margin-bottom:26px}
.login-head .logo{width:54px;height:54px;font-size:26px;margin:0 auto 14px}
.login-head h1{font-size:19px;font-weight:600}
.login-head p{font-size:11px;color:var(--text-muted);letter-spacing:2px;margin-top:5px}

/* 记住我：手机上要够大才好点，故整行可点 */
.remember{
  display:flex;align-items:center;gap:9px;margin:0 0 18px;padding:4px 0;
  font-size:13px;color:var(--text-secondary);cursor:pointer;user-select:none;
  -webkit-tap-highlight-color:transparent;
}
.remember input[type=checkbox]{
  width:17px;height:17px;flex:none;margin:0;accent-color:var(--primary);cursor:pointer;
}
.remember span{margin:0}

/* 提示条 */
.alert{padding:11px 14px;border-radius:9px;font-size:13px;margin-bottom:16px;line-height:1.6}
.alert.err{background:rgba(248,113,113,.12);border:1px solid rgba(248,113,113,.35);color:#fca5a5}
.alert.ok{background:rgba(74,222,128,.1);border:1px solid rgba(74,222,128,.32);color:#86efac}
.alert.warn{background:rgba(251,191,36,.1);border:1px solid rgba(251,191,36,.32);color:#fcd34d}
.alert.info{background:rgba(74,124,196,.12);border:1px solid rgba(74,124,196,.32);color:#93b8e8}

/* 表格 */
.panel{background:var(--surface);border:1px solid var(--border);border-radius:14px;overflow:hidden}
.panel-head{
  padding:15px 20px;border-bottom:1px solid var(--border);display:flex;
  justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap;
}
.panel-head h3{font-size:15px;font-weight:600}
.panel-body{padding:20px}
.table-scroll{overflow-x:auto}
table{width:100%;border-collapse:collapse;font-size:13px}
th,td{padding:11px 14px;text-align:left;border-bottom:1px solid var(--border);vertical-align:middle}
th{
  font-size:11px;color:var(--text-muted);font-weight:600;text-transform:uppercase;
  letter-spacing:.5px;background:var(--bg-secondary);white-space:nowrap;
}
tbody tr:hover{background:var(--surface-hover)}
tbody tr:last-child td{border-bottom:none}
.nowrap{white-space:nowrap}
.muted{color:var(--text-muted);font-size:12px}
.mono{font-family:Consolas,"Courier New",monospace;font-size:12px}

/* 权限勾选 */
.perm-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:9px}
.perm-item{
  display:flex;align-items:center;gap:9px;padding:9px 11px;border-radius:8px;
  border:1px solid var(--border);background:var(--bg-secondary);cursor:pointer;font-size:13px;
}
.perm-item:hover{border-color:var(--primary)}
.perm-item input{width:15px;height:15px;accent-color:var(--primary);cursor:pointer;flex:none}
.perm-item.on{border-color:var(--primary);background:rgba(74,124,196,.1)}
.perm-item .pi{font-size:15px}

/* 状态点 */
.st{display:inline-flex;align-items:center;gap:6px;font-size:12px;white-space:nowrap}
.st .d{width:7px;height:7px;border-radius:50%}
.st.on .d{background:var(--success)}
.st.on{color:var(--success)}
.st.off .d{background:var(--text-muted)}
.st.off{color:var(--text-muted)}

/* 弹层 */
.mask{
  position:fixed;inset:0;background:rgba(5,12,24,.78);z-index:100;
  display:none;align-items:flex-start;justify-content:center;padding:40px 20px;overflow:auto;
}
.mask.show{display:flex}
.dlg{
  width:100%;max-width:640px;background:var(--surface);border:1px solid var(--border);
  border-radius:14px;box-shadow:0 24px 70px rgba(0,0,0,.55);
}
.dlg-head{padding:17px 22px;border-bottom:1px solid var(--border);display:flex;justify-content:space-between}
.dlg-head h3{font-size:15px}
.dlg-body{padding:22px}
.dlg-foot{padding:15px 22px;border-top:1px solid var(--border);display:flex;justify-content:flex-end;gap:10px}
.x{background:none;border:none;color:var(--text-muted);font-size:20px;cursor:pointer;line-height:1}
.x:hover{color:var(--text)}

.empty{padding:44px 20px;text-align:center;color:var(--text-muted);font-size:13px}
.stat-row{display:flex;gap:26px;flex-wrap:wrap;margin-bottom:20px}
.stat{background:var(--surface);border:1px solid var(--border);border-radius:11px;padding:14px 20px;min-width:110px}
.stat b{display:block;font-size:22px;font-weight:600;margin-bottom:3px}
.stat span{font-size:11px;color:var(--text-muted)}
/* 有待补的数据时把这块标黄 —— 缺手机号会影响跨系统认人，要显眼 */
.stat.warn{border-color:rgba(251,191,36,.42);background:rgba(251,191,36,.07)}
.stat.warn b{color:var(--warning)}
/* 备用手机号的一行：输入框 + 删除按钮。一个人可以登记多个号 */
.ph-row{display:flex;gap:8px;align-items:center;margin-top:7px}
.ph-row input{flex:1}
.ph-row .btn{flex:0 0 auto}

footer{
  text-align:center;padding:26px;color:var(--text-muted);font-size:11px;
  border-top:1px solid var(--border);margin-top:40px;
}
@media(max-width:640px){
  .topbar{padding:12px 16px}
  main{padding:20px 16px}
  .who{display:none}
  th,td{padding:9px 10px}
}
