/* ===========================================================
   App 页面共享样式 — 深色科技风 TabLayout
   =========================================================== */
:root{
  --bg:#05040c;--surf:rgba(16,13,36,.82);--bor:rgba(120,80,240,.1);
  --tx:#e8e5f2;--mt:#8882a8;--vi:#8b5cf6;--am:#f59e0b;--cy:#06b6d4;
  --em:#10b981;--ro:#f43f5e;--r:14px;--rs:10px;
  --f:"SF Pro Display","PingFang SC","Microsoft YaHei",system-ui,sans-serif;
  --mo:"SF Mono","JetBrains Mono","Consolas",monospace;
}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:var(--f);background:var(--bg);color:var(--tx);min-height:100vh;-webkit-font-smoothing:antialiased}
/* 粒子背景 */
#bgCanvas{position:fixed;inset:0;z-index:0;pointer-events:none}
/* AppShell（布局统一定义见下方「右侧面板」区块，此处仅保留占位注释避免重复） */
/* 移动端隐藏侧边栏 */
@media(max-width:1023px){.app-sidebar{display:none}.app-right{display:none}.app-main{margin-left:0;margin-right:0;padding-bottom:100px}}
@media(max-width:768px){.card{padding:14px}.page-hdr{padding:10px 8px}}
/* PageHeader */
.page-hdr{position:sticky;top:0;z-index:40;height:56px;background:rgba(6,4,15,.88);backdrop-filter:blur(24px);border-bottom:1px solid rgba(120,80,240,.08);display:flex;align-items:center;padding:0 16px}
.page-hdr .ph-back{width:36px;height:36px;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;color:var(--mt);transition:all .2s;flex-shrink:0;text-decoration:none}
.page-hdr .ph-back:hover{background:rgba(255,255,255,.04);color:var(--tx)}
.page-hdr .ph-back svg{width:22px;height:22px}
.page-hdr .ph-title{flex:1;text-align:center;font-size:16px;font-weight:600;letter-spacing:.03em}
.page-hdr .ph-right{width:36px;flex-shrink:0}
/* 侧边栏 */
.side-logo{padding:0 20px 28px;display:flex;align-items:center;gap:12px}
.sl-icon{width:28px;height:28px;border:1.5px solid #8b5cf6;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;filter:drop-shadow(0 0 6px rgba(139,92,246,.4));position:relative}.sl-icon::after{content:"";display:block;width:0;height:0;border-top:7px solid transparent;border-bottom:7px solid transparent;border-left:13px solid #a78bfa;margin-left:3px}
.side-logo span{font-size:16px;font-weight:700;background:linear-gradient(135deg,#ddd8f0,#a78bfa);-webkit-background-clip:text;-webkit-text-fill-color:transparent}
.side-nav{padding:0 12px}
.side-item{display:flex;align-items:center;gap:12px;padding:12px 16px;border-radius:8px;cursor:pointer;font-size:15px;color:var(--mt);transition:all .2s;text-decoration:none;margin-bottom:2px}
.side-item:hover{background:rgba(255,255,255,.03);color:var(--tx)}
.side-item.active{background:rgba(139,92,246,.12);color:#c4b5fd;font-weight:600}
.side-item svg{width:20px;height:20px;flex-shrink:0}
.side-divider{height:1px;background:rgba(255,255,255,.04);margin:16px 20px}
.side-user{padding:0 20px;display:flex;align-items:center;gap:10px;font-size:13px;color:var(--mt)}
.side-user .su-avatar{width:32px;height:32px;border-radius:50%;background:rgba(139,92,246,.15);display:flex;align-items:center;justify-content:center;color:#c4b5fd;flex-shrink:0}
/* BottomTabBar */
.btm-bar{position:fixed;bottom:0;left:0;right:0;z-index:50;height:64px;background:rgba(6,4,15,.92);backdrop-filter:blur(24px);border-top:1px solid rgba(120,80,240,.08);display:flex;padding-bottom:env(safe-area-inset-bottom,0)}
.btm-tab{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;cursor:pointer;color:var(--mt);transition:all .2s;text-decoration:none;font-size:12px}
.btm-tab.active{color:#c4b5fd}
.btm-tab.active::after{content:'';position:absolute;top:0;width:20px;height:3px;border-radius:0 0 2px 2px;background:var(--vi)}
.btm-tab svg{width:26px;height:26px}
/* lg+ 隐藏底部导航 */
@media(min-width:1024px){.btm-bar{display:none}}
/* 卡片 */
.card{background:var(--surf);backdrop-filter:blur(30px);border:1px solid var(--bor);border-radius:var(--r);padding:24px;margin-bottom:14px}
.card-head{display:flex;align-items:center;gap:10px;margin-bottom:16px}
.card-head h3{font-size:15px;font-weight:600}
.card-head .ci{width:36px;height:36px;border-radius:8px;display:flex;align-items:center;justify-content:center;flex-shrink:0}
.card-head .ci svg{width:18px;height:18px}
.ci-v{background:rgba(139,92,246,.1);color:#c4b5fd}.ci-a{background:rgba(245,158,11,.1);color:#fcd34d}
.ci-c{background:rgba(6,182,212,.1);color:#67e8f9}.ci-e{background:rgba(16,185,129,.1);color:#6ee7b7}.ci-r{background:rgba(244,63,94,.1);color:#fda4af}
/* 按钮 */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:14px 32px;border-radius:12px;font-size:15px;font-weight:600;cursor:pointer;border:none;font-family:var(--f);letter-spacing:.04em;text-decoration:none;transition:all .3s}
.btn-primary{background:linear-gradient(135deg,#8b5cf6,#6d28d9);color:#fff;box-shadow:0 8px 28px rgba(139,92,246,.3)}.btn-primary:hover{transform:translateY(-2px);box-shadow:0 14px 36px rgba(139,92,246,.45)}
.btn-accent{background:linear-gradient(135deg,#f59e0b,#d97706);color:#171225;box-shadow:0 8px 28px rgba(245,158,11,.25)}.btn-accent:hover{transform:translateY(-2px);box-shadow:0 14px 36px rgba(245,158,11,.4)}
.btn-outline{background:rgba(255,255,255,.015);color:var(--tx);border:1px solid rgba(255,255,255,.1)}.btn-outline:hover{background:rgba(255,255,255,.04)}
.btn-danger{background:rgba(244,63,94,.08);color:#fda4af;border:1px solid rgba(244,63,94,.15)}.btn-danger:hover{background:rgba(244,63,94,.15)}
.btn-block{width:100%}.btn-xl{padding:18px;font-size:16px}.btn-sm{padding:10px 20px;font-size:12px;border-radius:20px}
/* 输入框 */
input,select,textarea{width:100%;padding:13px 16px;background:rgba(255,255,255,.02);border:1px solid rgba(255,255,255,.06);border-radius:var(--rs);color:var(--tx);font-size:14px;font-family:var(--f);outline:none;transition:border-color .2s}
input:focus,select:focus,textarea:focus{border-color:var(--vi)}
input::placeholder,textarea::placeholder{color:var(--mt)}
textarea{resize:vertical;min-height:80px}
select{cursor:pointer;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%238882a8' stroke-width='2'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 14px center;padding-right:40px}
/* 统计 */
.stat-row{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}
.stat-cell{text-align:center;padding:18px 10px;border-radius:var(--rs);background:rgba(255,255,255,.012);border:1px solid rgba(255,255,255,.02)}
.stat-cell .val{font-size:28px;font-weight:700;font-family:var(--mo);background:linear-gradient(180deg,#e0d8f0,#a78bfa);-webkit-background-clip:text;-webkit-text-fill-color:transparent}
.stat-cell .lbl{font-size:10px;color:var(--mt);margin-top:4px;letter-spacing:.06em;text-transform:uppercase}
/* 加载 */
.spinner{width:40px;height:40px;border:3px solid rgba(139,92,246,.06);border-top-color:var(--vi);border-radius:50%;animation:spin .7s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.status-load{text-align:center;color:var(--mt);padding:32px;display:flex;flex-direction:column;align-items:center;gap:12px;font-size:14px}
.skeleton{height:16px;border-radius:8px;background:rgba(255,255,255,.025);animation:shimmer 1.8s infinite;margin-bottom:12px}
.sk-w80{width:80%}.sk-w60{width:60%}
@keyframes shimmer{0%{background:rgba(255,255,255,.015)}50%{background:rgba(255,255,255,.04)}100%{background:rgba(255,255,255,.015)}}
.hidden{display:none!important}
.row{display:flex;gap:10px;flex-wrap:wrap;align-items:center}
.mt{margin-top:12px}.mb{margin-bottom:12px}
.tip{font-size:12px;color:var(--mt);margin-bottom:10px;line-height:1.6}
/* Toast */
.toast-ctr{position:fixed;top:76px;right:20px;z-index:300;display:flex;flex-direction:column;gap:8px}
.toast{padding:10px 20px;border-radius:8px;font-size:12px;animation:toastIn .3s ease;backdrop-filter:blur(20px);box-shadow:0 8px 24px rgba(0,0,0,.5)}
.toast.ok{background:rgba(16,185,129,.1);border:1px solid rgba(16,185,129,.15);color:#6ee7b7}
.toast.err{background:rgba(244,63,94,.1);border:1px solid rgba(244,63,94,.15);color:#fda4af}
.toast.inf{background:rgba(139,92,246,.1);border:1px solid rgba(139,92,246,.15);color:#c4b5fd}
@keyframes toastIn{from{opacity:0;transform:translateX(30px)}to{opacity:1;transform:translateX(0)}}
/* === 右侧面板 === */
.app-layout{display:flex;min-height:100vh}
.app-sidebar{width:220px;flex-shrink:0;background:rgba(6,4,15,.95);border-right:1px solid rgba(120,80,240,.08);padding:20px 0;position:fixed;top:0;left:0;bottom:0;z-index:50;overflow-y:auto}
.app-main{flex:1;margin-left:220px;margin-right:300px;padding-bottom:80px;min-width:0}
.app-right{width:300px;flex-shrink:0;position:fixed;top:0;right:0;bottom:0;z-index:45;overflow-y:auto;padding:72px 16px 24px;background:rgba(4,2,12,.6);border-left:1px solid rgba(120,80,240,.06)}
.app-right .rp-card{background:var(--surf);backdrop-filter:blur(30px);border:1px solid var(--bor);border-radius:var(--r);padding:18px;margin-bottom:12px}
.app-right .rp-card h4{font-size:13px;font-weight:700;color:var(--tx);margin-bottom:10px;display:flex;align-items:center;gap:8px}
.app-right .rp-card h4 .rp-icon{width:18px;height:18px;color:var(--vi)}
.app-right .rp-empty{text-align:center;color:var(--mt);font-size:12px;padding:20px 0}
.app-right .rp-tip{font-size:12px;color:var(--mt);line-height:1.7;padding:4px 0}
.app-right .rp-tip::before{content:"• ";color:var(--vi)}
.app-right .rp-item{display:flex;align-items:center;justify-content:space-between;padding:8px 0;border-bottom:1px solid rgba(255,255,255,.02);cursor:pointer;text-decoration:none;transition:all .15s}
.app-right .rp-item:hover{color:var(--tx)}
.app-right .rp-item .rp-date{font-size:11px;color:var(--mt);font-family:var(--mo)}
.app-right .rp-item .rp-score{font-size:18px;font-weight:700;font-family:var(--mo)}
.app-right .rp-score.good{color:var(--em)}.app-right .rp-score.ok{color:var(--am)}.app-right .rp-score.low{color:var(--ro)}

/* 报告页右侧：评分卡片吸顶 */
.app-right .rp-sticky{position:sticky;top:0;z-index:1}
.app-right .rp-bigscore{text-align:center;padding:12px 0}
.app-right .rp-bigscore .bs-num{font-size:48px;font-weight:800;font-family:var(--mo);line-height:1;background:linear-gradient(180deg,#f5f0ff,#a78bfa,#f59e0b);-webkit-background-clip:text;-webkit-text-fill-color:transparent}
.app-right .rp-bigscore .bs-label{font-size:10px;color:var(--mt);margin-top:4px;letter-spacing:.06em}
.app-right .rp-mini-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:8px}
.app-right .rp-mini-cell{text-align:center;padding:10px 6px;border-radius:8px;background:rgba(255,255,255,.015);border:1px solid rgba(255,255,255,.03)}
.app-right .rp-mini-cell .v{font-size:16px;font-weight:700;font-family:var(--mo)}
.app-right .rp-mini-cell .l{font-size:9px;color:var(--mt);margin-top:4px}

/* 移动端：隐藏右侧面板 */


/* 中等屏幕：右侧面板缩窄 */
@media(min-width:1024px) and (max-width:1350px){.app-right{width:240px}.app-main{margin-right:240px}}

/* === 移动端布局强制覆盖（放最后，确保覆盖上文所有 .app-main margin 定义）=== */
@media(max-width:1023px){
  .app-sidebar{display:none!important}
  .app-right{display:none!important}
  .app-main{margin-left:0!important;margin-right:0!important;padding-bottom:100px}
  .app-layout{min-height:auto}
}
@media(max-width:768px){
  .card{padding:14px!important}
  .page-hdr{padding:0 8px!important}
}
