:root{--p:#E8734A;--pl:#F4A261;--bg:#FFF8F2;--sub:#8B7355;--border:#f0ddd0;--card:#fff;--c-primary-rgb:232,115,74}
[data-theme=rose]{--p:#D4687A;--pl:#E8929F;--bg:#FFF5F6;--border:#f0d0d6;--c-primary-rgb:212,104,122}
[data-theme=mint]{--p:#4CA889;--pl:#7BC4AD;--bg:#F2FBF7;--border:#c8e8d8;--c-primary-rgb:76,168,137}
[data-theme=lavender]{--p:#8B6DB5;--pl:#A98FCC;--bg:#F8F4FF;--border:#ddd0f0;--c-primary-rgb:139,109,181}

/* 节日主题 */
[data-festival=newyear]{--p:#FF1493;--pl:#FF69B4;--bg:#FFF0FA;--border:#FFB6D9;--c-primary-rgb:255,20,147}
[data-festival=valentine]{--p:#FF1493;--pl:#FF69B4;--bg:#FFF0F5;--border:#FFB6D9;--c-primary-rgb:255,20,147}
[data-festival=womensday]{--p:#FF69B4;--pl:#FFB6D9;--bg:#FFF0F5;--border:#FFD1E3;--c-primary-rgb:255,105,180}
[data-festival=qingming]{--p:#6B8E23;--pl:#9ACD32;--bg:#F5FFF0;--border:#D0E8B0;--c-primary-rgb:107,142,35}
[data-festival=labor]{--p:#FF6B35;--pl:#FFA07A;--bg:#FFF5EE;--border:#FFD4B8;--c-primary-rgb:255,107,53}
[data-festival=youth]{--p:#4169E1;--pl:#6495ED;--bg:#F0F8FF;--border:#B0D4FF;--c-primary-rgb:65,105,225}
[data-festival=children]{--p:#FFD700;--pl:#FFE55C;--bg:#FFFACD;--border:#FFE97F;--c-primary-rgb:255,215,0}
[data-festival=qixi]{--p:#9370DB;--pl:#BA55D3;--bg:#F8F0FF;--border:#E0C8FF;--c-primary-rgb:147,112,219}
[data-festival=teacher]{--p:#FF8C00;--pl:#FFA500;--bg:#FFF8DC;--border:#FFD98E;--c-primary-rgb:255,140,0}
[data-festival=national]{--p:#DC143C;--pl:#FF6347;--bg:#FFF0F0;--border:#FFB6C1;--c-primary-rgb:220,20,60}
[data-festival=christmas]{--p:#228B22;--pl:#32CD32;--bg:#F0FFF0;--border:#98FB98;--c-primary-rgb:34,139,34}
[data-festival=springfestival]{--p:#DC143C;--pl:#FF4500;--bg:#FFF5F0;--border:#FFD0C0;--c-primary-rgb:220,20,60}
[data-festival=lantern]{--p:#FF6347;--pl:#FF7F50;--bg:#FFF8F0;--border:#FFD8C0;--c-primary-rgb:255,99,71}
[data-festival=dragonboat]{--p:#20B2AA;--pl:#48D1CC;--bg:#F0FFFF;--border:#B0E8E8;--c-primary-rgb:32,178,170}
[data-festival=midautumn]{--p:#FFD700;--pl:#FFA500;--bg:#FFFAF0;--border:#FFE4B5;--c-primary-rgb:255,215,0}

/* 节日装饰 - 元旦 */
[data-festival=newyear] body::before{content:'🎊';position:fixed;top:10%;right:10%;font-size:70px;opacity:0.15;animation:rotate 15s linear infinite}
[data-festival=newyear] body::after{content:'🎉';position:fixed;bottom:12%;left:8%;font-size:65px;opacity:0.15;animation:rotate 18s linear infinite reverse}

/* 节日装饰 - 情人节 */
[data-festival=valentine] body::before{content:'💝';position:fixed;top:8%;left:8%;font-size:65px;opacity:0.15;animation:float 6s ease-in-out infinite}
[data-festival=valentine] body::after{content:'💕';position:fixed;bottom:10%;right:10%;font-size:70px;opacity:0.15;animation:float 7s ease-in-out infinite 1s}

/* 节日装饰 - 妇女节（花朵） */
[data-festival=womensday] body::before{content:'🌸';position:fixed;top:10%;left:5%;font-size:60px;opacity:0.15;z-index:0;animation:float 6s ease-in-out infinite}
[data-festival=womensday] body::after{content:'🌺';position:fixed;bottom:15%;right:8%;font-size:70px;opacity:0.15;z-index:0;animation:float 7s ease-in-out infinite 1s}

/* 节日装饰 - 清明节 */
[data-festival=qingming] body::before{content:'🌿';position:fixed;top:12%;left:8%;font-size:70px;opacity:0.12;animation:float 8s ease-in-out infinite}
[data-festival=qingming] body::after{content:'🕊️';position:fixed;bottom:10%;right:10%;font-size:65px;opacity:0.12;animation:float 9s ease-in-out infinite 2s}

/* 节日装饰 - 劳动节 */
[data-festival=labor] body::before{content:'🎉';position:fixed;top:8%;right:10%;font-size:50px;opacity:0.12;animation:rotate 20s linear infinite}
[data-festival=labor] body::after{content:'🎊';position:fixed;bottom:10%;left:8%;font-size:55px;opacity:0.12;animation:rotate 25s linear infinite reverse}

/* 节日装饰 - 青年节 */
[data-festival=youth] body::before{content:'🎓';position:fixed;top:12%;left:8%;font-size:65px;opacity:0.1;animation:float 8s ease-in-out infinite}
[data-festival=youth] body::after{content:'📚';position:fixed;bottom:12%;right:10%;font-size:60px;opacity:0.1;animation:float 9s ease-in-out infinite 2s}

/* 节日装饰 - 儿童节 */
[data-festival=children] body::before{content:'🎈';position:fixed;top:5%;left:10%;font-size:70px;opacity:0.15;animation:bounce 3s ease-in-out infinite}
[data-festival=children] body::after{content:'🎨';position:fixed;bottom:8%;right:12%;font-size:65px;opacity:0.15;animation:bounce 3.5s ease-in-out infinite 0.5s}

/* 节日装饰 - 七夕节 */
[data-festival=qixi] body::before{content:'💫';position:fixed;top:8%;left:10%;font-size:70px;opacity:0.15;animation:sparkle 2s ease-in-out infinite}
[data-festival=qixi] body::after{content:'🌟';position:fixed;bottom:10%;right:8%;font-size:65px;opacity:0.15;animation:sparkle 2.5s ease-in-out infinite 0.5s}

/* 节日装饰 - 教师节 */
[data-festival=teacher] body::before{content:'🌻';position:fixed;top:10%;right:8%;font-size:75px;opacity:0.12;animation:float 7s ease-in-out infinite}
[data-festival=teacher] body::after{content:'📖';position:fixed;bottom:10%;left:10%;font-size:60px;opacity:0.12;animation:float 8s ease-in-out infinite 1.5s}

/* 节日装饰 - 国庆节 */
[data-festival=national] body::before{content:'🇨🇳';position:fixed;top:8%;left:5%;font-size:80px;opacity:0.15;animation:wave 4s ease-in-out infinite}
[data-festival=national] body::after{content:'🎆';position:fixed;bottom:10%;right:8%;font-size:70px;opacity:0.15;animation:sparkle 2s ease-in-out infinite}

/* 节日装饰 - 圣诞节 */
[data-festival=christmas] body::before{content:'🎄';position:fixed;top:5%;left:8%;font-size:85px;opacity:0.12;animation:float 6s ease-in-out infinite}
[data-festival=christmas] body::after{content:'⛄';position:fixed;bottom:8%;right:10%;font-size:75px;opacity:0.12;animation:float 7s ease-in-out infinite 1s}

/* 节日装饰 - 春节 */
[data-festival=springfestival] body::before{content:'🧧';position:fixed;top:8%;left:8%;font-size:80px;opacity:0.15;animation:float 5s ease-in-out infinite}
[data-festival=springfestival] body::after{content:'🎆';position:fixed;bottom:10%;right:10%;font-size:75px;opacity:0.15;animation:sparkle 2s ease-in-out infinite}

/* 节日装饰 - 元宵节 */
[data-festival=lantern] body::before{content:'🏮';position:fixed;top:10%;left:10%;font-size:75px;opacity:0.15;animation:float 6s ease-in-out infinite}
[data-festival=lantern] body::after{content:'🎊';position:fixed;bottom:8%;right:8%;font-size:70px;opacity:0.15;animation:float 7s ease-in-out infinite 1s}

/* 节日装饰 - 端午节 */
[data-festival=dragonboat] body::before{content:'🐉';position:fixed;top:10%;left:8%;font-size:80px;opacity:0.12;animation:wave 5s ease-in-out infinite}
[data-festival=dragonboat] body::after{content:'🚣';position:fixed;bottom:10%;right:10%;font-size:70px;opacity:0.12;animation:float 7s ease-in-out infinite 1.5s}

/* 节日装饰 - 中秋节 */
[data-festival=midautumn] body::before{content:'🥮';position:fixed;top:8%;left:10%;font-size:75px;opacity:0.15;animation:float 6s ease-in-out infinite}
[data-festival=midautumn] body::after{content:'🌕';position:fixed;bottom:10%;right:8%;font-size:80px;opacity:0.15;animation:float 8s ease-in-out infinite 2s}

/* 节日祝福横幅 */
.festival-banner{background:linear-gradient(135deg,var(--p),var(--pl));color:#fff;padding:12px 20px;text-align:center;font-size:16px;font-weight:600;box-shadow:0 2px 8px rgba(0,0,0,0.15);position:relative;overflow:hidden}
.festival-banner::before{content:'';position:absolute;top:-50%;left:-50%;width:200%;height:200%;background:linear-gradient(45deg,transparent,rgba(255,255,255,0.2),transparent);animation:shine 3s infinite}
.festival-banner .icon{font-size:20px;margin-right:8px;animation:bounce 2s ease-in-out infinite}

/* 动画效果 */
@keyframes float{0%,100%{transform:translateY(0)}50%{transform:translateY(-20px)}}
@keyframes bounce{0%,100%{transform:translateY(0)}50%{transform:translateY(-15px)}}
@keyframes rotate{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}
@keyframes wave{0%,100%{transform:rotate(0deg)}25%{transform:rotate(-10deg)}75%{transform:rotate(10deg)}}
@keyframes sparkle{0%,100%{opacity:0.15;transform:scale(1)}50%{opacity:0.25;transform:scale(1.1)}}
@keyframes shine{0%{transform:translateX(-100%)}100%{transform:translateX(100%)}}

*{margin:0;padding:0;box-sizing:border-box}
[v-cloak]{display:none!important}
@font-face {
  font-family: 'FZLanTing';
  src: url('/static/fonts/FZLanTing.ttf') format('truetype');
  font-weight: normal;
  font-style: normal;
  font-display: swap;
}

body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei',sans-serif;background:var(--bg);color:#333;font-size:15px;overflow-x:hidden}
/* 登录 */
.pg-login{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:24px;background:linear-gradient(160deg,#FFF5EE,#FFE8D6 50%,#FFDAB9)}
.lcard{width:100%;max-width:380px;background:#fff;border-radius:24px;padding:40px 28px 32px;box-shadow:0 8px 40px rgba(200,140,80,.15);text-align:center}
.lcard h1{font-size:24px;font-weight:700;margin:8px 0 4px}
.lcard .sub{color:var(--sub);font-size:13px;margin-bottom:28px}
.logo{font-size:52px}
.author-mark{display:flex;text-align:center;color:var(--sub)}
.author-mark-copy{display:flex;flex-direction:column;gap:5px;min-width:0}
.author-mark-label{color:var(--p);font-size:10px;font-weight:800;letter-spacing:.18em;line-height:1;text-transform:uppercase}
.author-mark-text{color:#51483f;font-size:13px;font-weight:650;line-height:1.45;white-space:normal;word-break:break-word}
.author-mark-login{justify-content:center;margin:0 auto 22px;padding:12px 0 0;border-top:1px solid var(--border)}
.fw{display:flex;align-items:center;background:#FFF8F2;border-radius:12px;padding:0 14px;height:50px;margin-bottom:12px;border:1.5px solid var(--border);transition:border-color .2s}
.fw:focus-within{border-color:var(--p)}
.fw .ic{font-size:18px;margin-right:10px;opacity:.7}
.fw input{flex:1;border:none;outline:none;background:transparent;font-size:16px;color:#333;height:100%}
.fw input::placeholder{color:#c4a98a}
.rcb{display:flex;align-items:center;gap:8px;margin:0 0 18px 2px;font-size:14px;color:var(--sub);cursor:pointer}
.rcb input{width:18px;height:18px;accent-color:var(--p)}
/* 手动验证码兜底行：整体比普通输入行窄，保证贴边不溢出；点击图片可换一张 */
.cap-row{display:flex;gap:10px;align-items:center;margin-bottom:12px}
.cap-row .fw.cap-input{flex:1;margin-bottom:0;min-width:0}
.cap-row .fw.cap-input input{font-size:16px;letter-spacing:2px}
.cap-img{flex:none;width:112px;height:52px;border-radius:10px;border:1.5px solid var(--border);cursor:pointer;object-fit:contain;background:#fff}
.cap-img:active{opacity:.7}
.lbtn{width:100%;height:50px;border:none;border-radius:25px;background:linear-gradient(135deg,var(--p),var(--pl));color:#fff;font-size:17px;font-weight:600;cursor:pointer;transition:opacity .2s;display:flex;align-items:center;justify-content:center}
.lbtn:active{opacity:.85}.lbtn:disabled{opacity:.55;cursor:wait}
.lbtn .lb-dots{display:inline-flex;margin-left:3px;align-items:flex-end}
.lbtn .lb-dots i{width:4px;height:4px;margin:0 1.5px;border-radius:50%;background:#fff;animation:lbjump 1.15s infinite ease-in-out}
.lbtn .lb-dots i:nth-child(2){animation-delay:.16s}
.lbtn .lb-dots i:nth-child(3){animation-delay:.32s}
@keyframes lbjump{0%,55%,100%{transform:translateY(0);opacity:.5}28%{transform:translateY(-4px);opacity:1}}
.lerr{color:#E25555;font-size:13px;min-height:20px;margin-top:12px}
/* 导航栏 */
.navbar{height:50px;display:flex;align-items:center;justify-content:space-between;padding:0 16px;background:linear-gradient(135deg,var(--p),var(--pl));color:#fff;font-weight:600;font-size:17px;position:sticky;top:0;z-index:10}
.navbar button{background:none;border:none;color:#fff;font-size:14px;cursor:pointer;padding:6px 10px}
.stats-badge{font-size:11px;font-weight:700;background:rgba(255,255,255,0.95);padding:4px 10px;border-radius:12px;box-shadow:0 2px 8px rgba(0,0,0,0.15);white-space:nowrap;color:#333;position:relative;overflow:hidden}
.stats-num{font-size:13px;font-weight:800;animation:colorChange 3s ease-in-out infinite;position:relative;z-index:1}
@keyframes colorChange{0%,100%{color:#E8734A}33%{color:#D4687A}66%{color:#4CA889}}

/* 节日徽章装饰 */
[data-festival=newyear] .stats-badge::before{content:'🎊';position:absolute;right:8px;top:50%;transform:translateY(-50%);font-size:40px;opacity:0.25;z-index:0}
[data-festival=valentine] .stats-badge::before{content:'💝';position:absolute;right:8px;top:50%;transform:translateY(-50%);font-size:40px;opacity:0.25;z-index:0}
[data-festival=womensday] .stats-badge::before{content:'🌸';position:absolute;right:8px;top:50%;transform:translateY(-50%);font-size:40px;opacity:0.25;z-index:0}
[data-festival=qingming] .stats-badge::before{content:'🌿';position:absolute;right:8px;top:50%;transform:translateY(-50%);font-size:40px;opacity:0.25;z-index:0}
[data-festival=labor] .stats-badge::before{content:'🎉';position:absolute;right:8px;top:50%;transform:translateY(-50%);font-size:40px;opacity:0.25;z-index:0}
[data-festival=youth] .stats-badge::before{content:'🎓';position:absolute;right:8px;top:50%;transform:translateY(-50%);font-size:40px;opacity:0.25;z-index:0}
[data-festival=children] .stats-badge::before{content:'🎈';position:absolute;right:8px;top:50%;transform:translateY(-50%);font-size:40px;opacity:0.25;z-index:0}
[data-festival=qixi] .stats-badge::before{content:'💫';position:absolute;right:8px;top:50%;transform:translateY(-50%);font-size:40px;opacity:0.25;z-index:0}
[data-festival=teacher] .stats-badge::before{content:'🌻';position:absolute;right:8px;top:50%;transform:translateY(-50%);font-size:40px;opacity:0.25;z-index:0}
[data-festival=national] .stats-badge::before{content:'🇨🇳';position:absolute;right:8px;top:50%;transform:translateY(-50%);font-size:40px;opacity:0.25;z-index:0}
[data-festival=christmas] .stats-badge::before{content:'🎄';position:absolute;right:8px;top:50%;transform:translateY(-50%);font-size:40px;opacity:0.25;z-index:0}
[data-festival=springfestival] .stats-badge::before{content:'🧧';position:absolute;right:8px;top:50%;transform:translateY(-50%);font-size:40px;opacity:0.25;z-index:0}
[data-festival=lantern] .stats-badge::before{content:'🏮';position:absolute;right:8px;top:50%;transform:translateY(-50%);font-size:40px;opacity:0.25;z-index:0}
[data-festival=dragonboat] .stats-badge::before{content:'🐉';position:absolute;right:8px;top:50%;transform:translateY(-50%);font-size:40px;opacity:0.25;z-index:0}
[data-festival=midautumn] .stats-badge::before{content:'🥮';position:absolute;right:8px;top:50%;transform:translateY(-50%);font-size:40px;opacity:0.25;z-index:0}
/* 奖学金徽章样式 */
.award-badge{padding:16px;border-radius:12px;text-align:center;position:relative;overflow:hidden;box-shadow:0 4px 15px rgba(0,0,0,0.15)}
.award-badge::before{content:'';position:absolute;top:-50%;left:-50%;width:200%;height:200%;background:linear-gradient(45deg,transparent,rgba(255,255,255,0.3),transparent);animation:shine 3s infinite;pointer-events:none}
.award-badge::after{content:'';position:absolute;top:0;left:0;right:0;bottom:0;background:radial-gradient(circle at 20% 50%,rgba(255,255,255,0.4) 0%,transparent 50%);pointer-events:none}
.award-text{font-size:20px;font-weight:800;position:relative;z-index:1;text-shadow:0 2px 4px rgba(0,0,0,0.2);letter-spacing:1px}
.award-badge[data-award*="一等"]{background:linear-gradient(135deg,#FFD700,#FFF4A3,#FFD700,#FFA500,#FFD700);color:#8B4513;box-shadow:0 4px 20px rgba(255,215,0,0.4),inset 0 1px 0 rgba(255,255,255,0.5)}
.award-badge[data-award*="二等"]{background:linear-gradient(135deg,#A8A8A8,#FFFFFF,#C8C8C8,#F5F5F5,#A8A8A8);color:#1A1A1A;border:2px solid #909090;box-shadow:0 4px 20px rgba(0,0,0,0.25),inset 0 1px 0 rgba(255,255,255,0.6)}
.award-badge[data-award*="三等"]{background:linear-gradient(135deg,#CD7F32,#E6A85C,#CD7F32,#B8860B,#CD7F32);color:#3E2723;box-shadow:0 4px 20px rgba(205,127,50,0.4),inset 0 1px 0 rgba(255,255,255,0.3)}
/* 候选奖学金样式 - 灰暗无反光 */
.award-badge[data-award*="候选"]{background:#D0D0D0;color:#666;box-shadow:0 2px 8px rgba(0,0,0,0.1)}
.award-badge[data-award*="候选"]::before,.award-badge[data-award*="候选"]::after{display:none}
.award-badge[data-award*="候选"] .award-text{text-shadow:none}
/* 其他奖项 */
.award-badge:not([data-award*="一等"]):not([data-award*="二等"]):not([data-award*="三等"]):not([data-award*="候选"]){background:#E0E0E0;color:#666;box-shadow:0 2px 8px rgba(0,0,0,0.1)}
@keyframes shine{0%{transform:translateX(-100%) translateY(-100%) rotate(45deg)}100%{transform:translateX(100%) translateY(100%) rotate(45deg)}}
/* 粒子效果 */
.award-badge[data-award*="一等"]::after,.award-badge[data-award*="二等"]::after,.award-badge[data-award*="三等"]::after{background:radial-gradient(circle,rgba(255,255,255,0.8) 1px,transparent 1px);background-size:20px 20px;animation:particles 20s linear infinite;opacity:0.3}
@keyframes particles{0%{background-position:0 0}100%{background-position:100px 100px}}
/* 底部Tab */
.tabbar{position:fixed;bottom:0;left:0;right:0;height:calc(56px + env(safe-area-inset-bottom,0px));padding-bottom:env(safe-area-inset-bottom,0px);display:flex;background:#fff;border-top:1px solid var(--border);z-index:100}
.tabbar .ti{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;background:none;border:none;color:#bbb;cursor:pointer;font-size:10px;font-weight:600;transition:color .2s,transform .15s;padding:0;-webkit-tap-highlight-color:transparent}
.tabbar .ti.act{color:var(--p)}
.tabbar .ti .tico{display:block;width:22px;height:22px;transition:transform .2s}
.tabbar .ti.act .tico{transform:scale(1.08)}
.tabbar .ti:active .tico{transform:scale(.92)}
/* 内容 */
.content{padding:12px 14px 80px;min-height:calc(100vh - 50px);overflow-y:auto;-webkit-overflow-scrolling:touch}
.hide{display:none!important}
.profile-tabs{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;padding:2px 0 6px}
.capsule-tabs{padding:2px 0 6px}
.profile-tab-btn,.capsule-btn{min-width:0;height:40px;padding:0 15px;border-radius:999px;border:1.5px solid var(--border);background:#fff;color:var(--sub);font-size:13px;font-weight:700;cursor:pointer;transition:all .2s}
.profile-tab-btn{display:flex;align-items:center;justify-content:center;gap:6px;width:100%}
.profile-tab-btn .ico{font-size:14px;line-height:1}
.profile-tab-btn.act,.capsule-btn.act{border-color:var(--p);background:linear-gradient(135deg,var(--p),var(--pl));color:#fff;box-shadow:0 8px 20px rgba(232,115,74,.18)}
.capsule-tabs.wrap-tabs{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;padding:2px 0 8px}
.capsule-tabs.wrap-tabs .capsule-btn{width:100%;height:38px;padding:0 10px;border-radius:14px;font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* 学期筛选器：只用「综测分总体统计」。整行可点，点开走已有底部弹窗，避免原生 select 的丑陋与跨端差异 */
.sem-filter{display:flex;align-items:center;margin:0 0 12px}
.sem-filter-btn{flex:1;display:flex;align-items:center;gap:8px;min-width:0;height:42px;padding:0 14px;border:1.5px solid var(--border);border-radius:12px;background:linear-gradient(180deg,#FFFDFA,#FFF6EE);cursor:pointer;text-align:left;transition:border-color .2s,box-shadow .2s}
.sem-filter-btn:active{transform:scale(.99)}
.sem-filter-btn .sf-label{flex:none;font-size:11px;font-weight:700;letter-spacing:1px;color:#B08A6A;background:#FDF0E2;border-radius:6px;padding:3px 7px}
.sem-filter-btn .sf-value{flex:1;min-width:0;font-size:14px;font-weight:600;color:#4A3B2F;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sem-filter-btn .sf-caret{flex:none;font-size:11px;color:#C0A48C}
/* 加载遮罩：切学期时立刻盖住旧数据并给出明确反馈，避免「看起来没反应」 */
.load-veil{position:relative;margin:0 0 12px;padding:34px 16px;border:1.5px dashed #EFDFCC;border-radius:14px;background:linear-gradient(180deg,#FFFDF9,#FFF8F1);text-align:center}
.load-veil .lv-spin{width:26px;height:26px;margin:0 auto 12px;border:2.5px solid #F3E3D0;border-top-color:var(--p);border-radius:50%;animation:lv-spin .8s linear infinite}
.load-veil .lv-text{font-size:14px;font-weight:600;color:#6B5942}
.load-veil .lv-sub{font-size:11.5px;color:#A6917C;margin-top:6px;line-height:1.6}
@keyframes lv-spin{to{transform:rotate(360deg)}}
.profile-panel{margin-top:6px}
.section-lead{display:flex;justify-content:space-between;align-items:flex-end;gap:12px;margin-bottom:12px}
.section-lead .meta{font-size:12px;color:#999;text-align:right;line-height:1.5;max-width:180px}
.section-actions{display:flex;align-items:center;gap:10px}
.section-refresh{height:34px;padding:0 14px;border:none;border-radius:999px;background:#fff;color:var(--p);font-size:12px;font-weight:700;box-shadow:0 4px 14px rgba(200,150,100,.08);cursor:pointer;white-space:nowrap}
.section-refresh:disabled{color:#c2a995;cursor:not-allowed;box-shadow:none;background:#f8f1ea}
.soft-card{background:linear-gradient(135deg,#fff,#fffaf6);border:1px solid #f5e6da;border-radius:16px;padding:14px 16px;box-shadow:0 4px 14px rgba(200,150,100,.06)}
.soft-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin-bottom:12px}
.soft-metric{background:#fff;border:1px solid #f5ebe0;border-radius:14px;padding:12px 14px}
.soft-metric .label{font-size:12px;color:var(--sub);margin-bottom:6px}
.soft-metric .value{font-size:18px;font-weight:800;color:#333}
.evaluation-toolbar{display:flex;gap:10px;align-items:center;justify-content:space-between;margin-bottom:10px}
.evaluation-toolbar .hint{font-size:12px;color:var(--sub);line-height:1.5}
@media (max-width:380px){
  .soft-grid{grid-template-columns:1fr}
  .profile-tab-btn{font-size:12px;gap:4px;padding:0 10px}
  .capsule-tabs.wrap-tabs .capsule-btn{font-size:11px}
}
@media (min-width:680px){
  .capsule-tabs.wrap-tabs{grid-template-columns:repeat(4,minmax(0,1fr))}
}
/* 今日 */
.th{display:flex;justify-content:space-between;align-items:center;margin-bottom:14px}
.th .d{font-size:16px;font-weight:700;color:#333}
.th .w{font-size:12px;color:#8B7355;background:#fff3eb;padding:3px 12px;border-radius:20px}
.cc{background:var(--card);border-radius:16px;padding:16px;margin-bottom:12px;box-shadow:0 2px 12px rgba(200,150,100,.1);border-left:4px solid var(--p);transition:transform .1s}
.cc:active{transform:scale(.98)}
.cc.past{opacity:.5}.cc.now{border-left-color:#4CAF50;background:linear-gradient(135deg,#f5fff5,#fff)}
.cc .top{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:8px}
.cc .nm{font-size:17px;font-weight:700;color:#333}
.cc .badge{font-size:11px;padding:2px 10px;border-radius:20px;font-weight:600;white-space:nowrap}
.bnow{background:#DEF7DE;color:#2D7D2D}.bnext{background:#FFF3DE;color:#B87D20}.bpast{background:#f0f0f0;color:#666}
.cc .row{display:flex;align-items:center;gap:6px;font-size:13px;color:#666;margin-top:5px}
.empty{text-align:center;padding:60px 20px;color:#8B7355}.empty .ei{font-size:52px;margin-bottom:10px}
/* 课表快照提示条：学校连不通时如实标注数据来自缓存，学生随时知道新鲜度 */
.snap-bar{display:flex;align-items:center;gap:9px;background:linear-gradient(135deg,#FFF8E8,#FFF1D6);border:1px solid #F0DCB4;border-radius:12px;padding:10px 12px;margin-bottom:12px}
.snap-bar .snap-ic{font-size:16px;flex:none;opacity:.85}
.snap-bar .snap-tx{flex:1;min-width:0}
.snap-bar .snap-t1{font-size:12.5px;font-weight:700;color:#8A6415;line-height:1.4}
.snap-bar .snap-t2{font-size:11.5px;color:#A08447;line-height:1.5;margin-top:2px}
.snap-bar .snap-t2 b{color:#7C5A0C;font-weight:700}
.snap-bar .snap-btn{flex:none;border:1px solid #E3C98F;background:#fff;color:#8A6415;font-size:11.5px;font-weight:600;padding:5px 11px;border-radius:8px;cursor:pointer}
.snap-bar .snap-btn:active{opacity:.7}
/* 该周无缓存：诚实空态 + 一键切回有缓存的周，绝不拿别的周冒充 */
.snap-miss{text-align:center;padding:40px 22px;margin-bottom:12px;background:#FFFDF8;border:1px dashed #E8D9BC;border-radius:14px;color:#8B7355}
.snap-miss .sm-ic{font-size:44px;margin-bottom:12px;opacity:.85}
.snap-miss .sm-t1{font-size:16px;font-weight:700;color:#6B5942}
.snap-miss .sm-t2{font-size:12.5px;line-height:1.7;margin-top:8px;color:#A08D75}
.snap-miss .sm-t3{font-size:12px;margin-top:10px;color:#8A6415;background:#FFF6E4;display:inline-block;padding:5px 12px;border-radius:8px}
.snap-miss .sm-btn{margin-top:14px;border:none;background:linear-gradient(135deg,var(--p),var(--pl));color:#fff;font-size:13px;font-weight:600;padding:9px 22px;border-radius:20px;cursor:pointer}
.snap-miss .sm-btn:active{opacity:.8}
/* 周课表 */
.wsel{display:flex;gap:8px;margin-bottom:12px}
.wsel select{flex:1;height:44px;border:1.5px solid var(--border);border-radius:10px;padding:0 10px;font-size:15px;background:#fff;color:#333;outline:none;appearance:auto;-webkit-appearance:menulist;touch-action:manipulation;position:relative;z-index:5}
.wsel .selbtn:first-child{flex:2;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.wsel .selbtn:last-child{flex:1;font-size:14px;white-space:nowrap}
.wt{width:100%;border-collapse:separate;border-spacing:2px;font-size:10px;table-layout:fixed}
.wt th{padding:6px 0;font-weight:700;font-size:11px;color:#8B7355;background:#fff3eb;border-radius:6px;text-align:center}
.wt th.td{background:var(--p);color:#fff}
.wt th.plbl{width:42px;font-size:9px;color:#999;font-weight:600}
.wt td{height:38px;padding:0 2px;border-radius:5px;text-align:center;vertical-align:middle;background:#fff;border:1px solid #f5ebe0;font-size:9px;position:relative;color:#333}
.wt td.plbl{border:none;background:#fff8f2;color:#666;font-weight:500;font-size:7px;text-align:center;width:42px;line-height:1.2;padding:2px;border-radius:4px;position:relative;z-index:2}
.wt td.sep{height:6px;border:none;background:transparent;padding:0}
.wt td.course{color:#fff;font-weight:600;border:none;line-height:1.3;cursor:pointer;border-radius:6px;padding:6px 2px;z-index:1;touch-action:manipulation;-webkit-user-select:none;user-select:none}
/* 设置 */
.ss{background:#fff;border-radius:16px;margin-bottom:14px;padding:16px;box-shadow:0 2px 8px rgba(200,150,100,.08)}
.ss h3{font-size:12px;color:#8B7355;margin-bottom:10px;text-transform:uppercase;letter-spacing:1px}
.sr{display:flex;justify-content:space-between;align-items:center;padding:10px 0;border-bottom:1px solid #f5ebe0;font-size:14px;color:#333}
.sr:last-of-type{border-bottom:none}.sv{color:#666;font-size:13px}
.author-mark-settings{margin-top:12px;padding:14px 2px 2px;border-top:1px solid #f5ebe0;text-align:left}
.author-mark-settings .author-mark-text{font-size:13px}
.pr{display:flex;align-items:center;gap:6px;padding:4px 0;font-size:12px;color:#333}
.pr label{width:42px;font-weight:600;color:#666;flex-shrink:0}
.pr input[type=time],.time-input{flex:1;height:32px;border:1px solid var(--border);border-radius:6px;padding:0 6px;font-size:14px;background:#fff8f2;text-align:center;color:#333;appearance:auto;-webkit-appearance:auto;pointer-events:auto;user-select:auto}
.sbtn{width:100%;height:40px;border:1.5px solid var(--p);border-radius:20px;background:transparent;color:var(--p);font-size:14px;font-weight:600;cursor:pointer;margin-top:10px}
.sbtn.danger{border-color:#E25555;color:#E25555}
.sbtn.text.danger-lite{color:#E25555}
.sbtn.text{border:none;color:#666;font-size:12px;height:32px}
.setting-fw{margin-bottom:10px;height:46px}
.campus-hint{font-size:13px;color:#666;line-height:1.7;margin-bottom:12px;background:#FFF8F2;border:1px solid #F5E6DA;border-radius:12px;padding:12px 14px}
.campus-hint code{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;color:var(--p);font-size:12px}
.campus-inline-meta{display:flex;justify-content:space-between;align-items:center;padding:8px 0;color:#666;font-size:12px;border-bottom:1px dashed #f3e2d4}
.campus-inline-meta:last-of-type{border-bottom:none}
.campus-status{margin-top:12px;padding:12px 14px;border-radius:12px;font-size:13px;line-height:1.7;border:1px solid #f5e6da;background:#FFF8F2;color:#8B7355}
.campus-status.info{background:#FFF8F2;border-color:#F5E6DA;color:#8B7355}
.campus-status.success{background:#F2FBF7;border-color:#C8E8D8;color:#2E7D60}
.campus-status.error{background:#FFF4F4;border-color:#FFD7D7;color:#C45757}
.campus-tip-minor{margin-top:10px;padding:10px 12px;border:1px solid #f3b0b0;border-radius:10px;background:#fff1f1;font-size:12px;line-height:1.8;color:#c62828;font-weight:600;word-break:break-all}
.campus-tip-minor a{color:#b71c1c;text-decoration:underline}
.dots{display:flex;gap:14px;padding:8px 0}
.dot{width:36px;height:36px;border-radius:50%;border:3px solid transparent;cursor:pointer}
.dot.act{border-color:#555}
/* 自定义选择器 */
.selbtn{flex:1;height:44px;border:1.5px solid var(--border);border-radius:10px;padding:0 10px;font-size:14px;background:#fff;color:#333;outline:none;text-align:left;display:flex;justify-content:space-between;align-items:center}
.picker-box{background:#fff;border-radius:16px;width:100%;max-width:320px;display:flex;flex-direction:column;animation:popIn .25s;overflow:hidden}
.picker-title{padding:16px;text-align:center;font-weight:700;font-size:16px;background:#fdfcfb;border-bottom:1px solid #eee;color:#333}
.picker-cols{display:flex;height:220px;position:relative;background:#fff}
.picker-heads{display:flex;background:#fff;border-bottom:1px solid #f2ece7}
.picker-heads span{flex:1;text-align:center;padding:7px 0;font-size:11.5px;font-weight:600;color:#b9aca2;letter-spacing:.08em}
.picker-cols-split .picker-list+.picker-list{border-left:1px solid #f4efeb}
.picker-more{padding:8px 12px 0;text-align:center;background:#fff}
.picker-more span{display:inline-block;padding:4px 10px;font-size:12px;color:var(--p);cursor:pointer;-webkit-tap-highlight-color:transparent}
.picker-more span:active{opacity:.6}
.picker-sel-bg{position:absolute;top:50%;left:0;right:0;height:44px;margin-top:-22px;background:#FFF8F2;border-top:1px solid var(--p);border-bottom:1px solid var(--p);pointer-events:none;opacity:0.3;z-index:1}
.picker-list{flex:1;overflow-y:auto;scroll-behavior:smooth;padding:88px 0;position:relative;z-index:2;-webkit-overflow-scrolling:touch}
.picker-list::-webkit-scrollbar{display:none}
.picker-item{height:44px;line-height:44px;text-align:center;font-size:16px;color:#666;transition:all .2s;cursor:pointer}
.picker-item.act{color:var(--p);font-weight:700;font-size:18px;transform:scale(1.1)}
.picker-footer{padding:12px;background:#fdfcfb;border-top:1px solid #eee}
.modal-mask{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.4);z-index:99;display:flex;align-items:center;justify-content:center;padding:20px}
.modal-box{background:#fff;border-radius:20px;padding:24px;width:100%;max-width:320px;max-height:calc(100vh - 40px);overflow-y:auto;box-shadow:0 10px 40px rgba(0,0,0,.2);animation:popIn .25s;-webkit-overflow-scrolling:touch}
.modal-box .mc-name{font-size:18px;font-weight:700;margin-bottom:12px;padding-bottom:10px;border-bottom:2px solid var(--border);color:#333}
.modal-box .mc-row{display:flex;align-items:center;gap:8px;font-size:14px;color:#666;padding:6px 0}
.modal-box .mc-row span:first-child{font-size:16px;width:22px;text-align:center}
.modal-close{width:100%;height:42px;border:none;border-radius:21px;background:linear-gradient(135deg,var(--p),var(--pl));color:#fff;font-size:15px;font-weight:600;cursor:pointer;margin-top:16px}
@keyframes fadeIn{from{opacity:0}to{opacity:1}}
@keyframes popIn{from{transform:scale(.9);opacity:0}to{transform:scale(1);opacity:1}}
/* 公告弹窗 */
.announcement-box{background:#fff;border-radius:20px;width:90%;max-width:480px;box-shadow:0 10px 40px rgba(0,0,0,.2);overflow:hidden;transform:scale(.8);opacity:0;transition:all .3s cubic-bezier(.34,1.56,.64,1)}
.announcement-box.show{transform:scale(1);opacity:1}
.announcement-header{background:linear-gradient(135deg,var(--p),var(--pl));padding:20px;display:flex;align-items:center;gap:12px;position:relative}
.announcement-icon{font-size:28px;animation:bounce 2s infinite}
.announcement-title{flex:1;font-size:18px;font-weight:700;color:#fff;line-height:1.4}
.announcement-close{background:rgba(255,255,255,.2);border:none;color:#fff;width:32px;height:32px;border-radius:50%;font-size:18px;cursor:pointer;transition:background .2s}
.announcement-close:hover{background:rgba(255,255,255,.3)}
.announcement-content{padding:24px;max-height:400px;overflow-y:auto;-webkit-overflow-scrolling:touch}
.announcement-content pre{margin:0;white-space:pre-wrap;word-wrap:break-word;font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei',sans-serif;font-size:15px;line-height:1.8;color:#333}
.announcement-footer{padding:16px 24px;background:#FFF8F2;border-top:1px solid var(--border);display:flex;flex-direction:column;gap:12px}
.announcement-date{font-size:12px;color:#999;text-align:center}
.announcement-tip{font-size:12px;color:#E8734A;text-align:center;font-weight:600}
.announcement-checkbox{display:flex;align-items:center;gap:8px;font-size:14px;color:#666;cursor:pointer;justify-content:center}
.announcement-checkbox input{width:18px;height:18px;accent-color:var(--p);cursor:pointer}
.announcement-btn{width:100%;height:44px;border:none;border-radius:22px;background:linear-gradient(135deg,var(--p),var(--pl));color:#fff;font-size:16px;font-weight:600;cursor:pointer;transition:opacity .2s}
.announcement-close:disabled,.announcement-btn:disabled{opacity:.5;cursor:not-allowed}
.announcement-btn:active{opacity:.85}
@keyframes bounce{0%,100%{transform:translateY(0)}50%{transform:translateY(-5px)}}
/* 声明弹窗 */
.disclaimer-box{background:#fff;border-radius:20px;width:90%;max-width:480px;box-shadow:0 10px 40px rgba(255,100,100,.3);overflow:hidden;transform:scale(.8);opacity:0;transition:all .3s cubic-bezier(.34,1.56,.64,1);border:3px solid #FFE0E0}
.disclaimer-box.show{transform:scale(1);opacity:1}
.disclaimer-header{background:linear-gradient(135deg,#FF6B6B,#E25555);padding:20px;display:flex;align-items:center;gap:12px;position:relative}
.disclaimer-icon{font-size:32px;animation:shake 1s infinite}
.disclaimer-title{flex:1;font-size:18px;font-weight:700;color:#fff;line-height:1.4}
.disclaimer-content{padding:24px;max-height:400px;overflow-y:auto;-webkit-overflow-scrolling:touch;background:linear-gradient(135deg,#FFF5F5,#FFF0F0)}
.disclaimer-content pre{margin:0;white-space:pre-wrap;word-wrap:break-word;font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei',sans-serif;font-size:14px;line-height:1.8;color:#333}
.disclaimer-footer{padding:16px 24px;background:#FFF8F2;border-top:2px solid #FFE0E0}
.disclaimer-btn{width:100%;height:48px;border:none;border-radius:24px;background:linear-gradient(135deg,#4CA889,#7BC4AD);color:#fff;font-size:16px;font-weight:700;cursor:pointer;transition:all .2s;box-shadow:0 4px 12px rgba(76,168,137,.3)}
.disclaimer-btn:disabled{background:#ccc;cursor:not-allowed;box-shadow:none}
.disclaimer-btn:not(:disabled):active{transform:scale(.98)}
@keyframes shake{0%,100%{transform:rotate(0deg)}25%{transform:rotate(-5deg)}75%{transform:rotate(5deg)}}

/* 抽奖引导横幅 - 悬浮胶囊 */
.lottery-guide-banner{position:fixed;top:16px;left:50%;transform:translateX(-50%);z-index:9990;width:calc(100% - 32px);max-width:400px;padding:12px 16px;padding-top:max(12px,env(safe-area-inset-top));background:linear-gradient(135deg,#429DE2 0%,#5DA8E8 50%,#7BBDF2 100%);border-radius:16px;cursor:pointer;overflow:visible;box-shadow:0 6px 24px rgba(66,157,226,.4);animation:guideSlideIn .5s cubic-bezier(.34,1.56,.64,1)}
.lottery-guide-banner::after{content:'';position:absolute;top:0;left:0;right:0;bottom:0;border-radius:16px;box-shadow:inset 0 1px 0 rgba(255,255,255,.3);pointer-events:none}
.lottery-guide-inner{display:flex;align-items:center;gap:12px;position:relative;z-index:1}
.lottery-guide-icon{font-size:28px;flex-shrink:0;filter:drop-shadow(0 2px 4px rgba(0,0,0,.1))}
.lottery-guide-text{flex:1;min-width:0}
.lottery-guide-title{font-size:14px;font-weight:700;color:#fff;line-height:1.4;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-shadow:0 1px 2px rgba(0,0,0,.1)}
.lottery-guide-sub{font-size:11px;color:rgba(255,255,255,.9);margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.lottery-guide-go{flex-shrink:0;background:#fff;color:#429DE2;font-size:12px;font-weight:700;padding:6px 14px;border-radius:20px;white-space:nowrap;box-shadow:0 2px 8px rgba(0,0,0,.1);transition:transform .2s}
.lottery-guide-go:active{transform:scale(.95)}
.lottery-guide-close{position:absolute;top:-8px;right:-8px;background:#fff;border:none;color:#999;font-size:12px;cursor:pointer;z-index:10;width:24px;height:24px;line-height:24px;text-align:center;border-radius:50%;padding:0;box-shadow:0 2px 8px rgba(0,0,0,.15);display:flex;align-items:center;justify-content:center}
@keyframes guideSlideIn{from{opacity:0;transform:translateX(-50%) translateY(-30px) scale(.95)}to{opacity:1;transform:translateX(-50%) translateY(0) scale(1)}}

/* 社区讨论 */
.community-topic-card{cursor:pointer;transition:box-shadow .2s;margin:0 0 10px}
.community-topic-card:active{box-shadow:0 2px 8px rgba(0,0,0,.08)}
.community-avatar{width:36px;height:36px;border-radius:50%;background:linear-gradient(135deg,var(--p),var(--pl));display:flex;align-items:center;justify-content:center;font-size:16px;color:#fff;flex-shrink:0}
.community-tag{font-size:10px;font-weight:600;padding:2px 8px;border-radius:10px;white-space:nowrap}
.community-tag.tag-chat{background:#E8F4FD;color:#2B7BB9}
.community-tag.tag-study{background:#DEF7DE;color:#2D7D2D}
.community-tag.tag-life{background:#FFF3DE;color:#B8860B}
.community-tag.tag-help{background:#FFF0F0;color:#E25555}
.community-detail-modal{position:fixed;bottom:0;left:0;right:0;top:0;background:#fff;display:flex;flex-direction:column;z-index:200;will-change:transform;backface-visibility:hidden;animation:sheetUp .58s cubic-bezier(.32,.72,0,1) both}
@keyframes sheetUp{from{transform:translate3d(0,100%,0)}to{transform:translate3d(0,0,0)}}
@keyframes sheetUpCentered{from{transform:translate3d(-50%,100%,0)}to{transform:translate3d(-50%,0,0)}}
@media(min-width:680px){.community-detail-modal{left:50%;right:auto;width:500px;transform:translate3d(-50%,0,0);border-radius:16px 16px 0 0;top:60px;animation-name:sheetUpCentered}}
@media(prefers-reduced-motion:reduce){.community-detail-modal,.modal-mask,.modal-box{animation-duration:.01ms!important}}
