:root{--ink:#173c3b;--deep:#113332;--cream:#f5f0e7;--paper:#fffdf8;--orange:#e86f51;--orange-dark:#bc5037;--gold:#e9b844;--muted:#78918a;--line:#dce5db;--shadow:0 16px 50px rgba(23,60,59,.10)}
*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:var(--cream);color:var(--ink);font-family:'DM Sans','Noto Sans SC',sans-serif;font-size:15px}.app-shell{max-width:1440px;margin:auto;min-height:100vh;overflow:hidden;background:var(--cream)}button,input{font:inherit}button{cursor:pointer;border:0;color:inherit}.topbar{height:88px;padding:0 5.5%;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid rgba(23,60,59,.08);background:rgba(245,240,231,.9);position:relative;z-index:2}.brand-lockup{display:flex;align-items:center;gap:13px}.brand-mark{width:32px;height:32px;border-radius:10px;background:var(--orange);color:#fff;display:grid;place-items:center;font-size:19px;box-shadow:4px 4px 0 rgba(232,111,81,.22)}.eyebrow,.section-kicker,.modal-kicker{margin:0;font-size:10px;font-weight:700;letter-spacing:.16em;color:var(--muted)}.eyebrow span{color:var(--orange);padding:0 5px}.brand-lockup h1{font-family:'Bricolage Grotesque','Noto Sans SC',sans-serif;font-size:20px;margin:4px 0 0;letter-spacing:-.04em}.brand-lockup h1 span{font-family:'Noto Sans SC',sans-serif;color:var(--muted);font-size:11px;font-weight:500;letter-spacing:0;margin-left:6px}.top-actions{display:flex;gap:20px;align-items:center}.date-chip{font-size:12px;color:var(--muted);display:flex;gap:8px;align-items:center}.dot,.legend-dot{display:inline-block;width:7px;height:7px;border-radius:50%;background:#70bc88;box-shadow:0 0 0 4px rgba(112,188,136,.16)}.teacher-chip{display:flex;align-items:center;gap:9px;font-size:12px;font-weight:600;background:transparent}.avatar{width:31px;height:31px;display:grid;place-items:center;border-radius:50%;background:#efc890;color:#8c5736;font-weight:700}.chevron{font-size:18px;color:var(--muted)}main{padding:42px 5.5% 30px}.hero-panel{height:350px;background:var(--deep);border-radius:26px;position:relative;overflow:hidden;display:flex;color:var(--paper);box-shadow:var(--shadow)}.hero-panel:before{content:'';position:absolute;inset:0;background:radial-gradient(circle at 70% 10%,rgba(232,111,81,.19),transparent 27%),linear-gradient(110deg,transparent 0 54%,rgba(255,255,255,.028) 54% 54.2%,transparent 54.2% 100%);pointer-events:none}.hero-copy{padding:48px 0 40px 7%;position:relative;z-index:1}.hero-copy h2{font-family:'Bricolage Grotesque','Noto Sans SC',sans-serif;font-size:46px;line-height:1.12;letter-spacing:-.055em;margin:21px 0 12px;font-weight:700}.hero-copy h2 em{font-style:normal;color:#f5bd6c}.hero-copy p{color:#aac1b8;margin:0;font-size:13px}.hero-copy p strong{color:#ffcc74;font-size:17px}.hero-actions{display:flex;align-items:center;gap:20px;margin-top:28px}.primary-button{background:var(--orange);color:white;border-radius:8px;padding:13px 17px;font-weight:700;font-size:12px;display:inline-flex;align-items:center;justify-content:center;gap:16px;transition:.2s;box-shadow:0 8px 20px rgba(232,111,81,.25)}.primary-button:hover{background:#f48665;transform:translateY(-2px)}.primary-button .arrow{font-size:16px;font-weight:400}.text-button{background:transparent;color:var(--paper);font-size:12px;font-weight:700;padding:8px 0}.text-button span{color:#f2b85f;margin-left:6px;font-size:17px}.hero-visual{position:absolute;right:9%;top:0;width:440px;height:100%}.sun-disc{position:absolute;width:248px;height:248px;border-radius:50%;background:#e9b844;top:44px;left:77px;box-shadow:0 0 0 14px rgba(233,184,68,.1)}.orbit{position:absolute;border:1px solid rgba(242,196,107,.45);border-radius:50%;transform:rotate(-25deg)}.orbit-one{width:390px;height:160px;top:85px;left:6px}.orbit-two{width:290px;height:130px;top:124px;left:57px;border-color:rgba(255,255,255,.15)}.hero-pet{position:absolute;top:123px;left:102px;color:var(--deep);font-size:48px;font-weight:900;letter-spacing:-10px;transform:rotate(-7deg);text-shadow:2px 2px 0 rgba(255,255,255,.16)}.hero-spark{position:absolute;color:#f7d77d;font-size:20px}.spark-a{top:72px;right:62px}.spark-b{top:240px;left:50px;color:#f18a67}.spark-c{bottom:35px;right:105px}.hero-note{position:absolute;right:0;bottom:27px;background:#f7f0e2;color:var(--ink);padding:13px 18px;border-radius:10px 10px 3px 10px;box-shadow:8px 8px 0 rgba(0,0,0,.1);transform:rotate(3deg);width:130px}.hero-note:before{content:'';position:absolute;left:-6px;bottom:0;border-style:solid;border-width:0 0 11px 11px;border-color:transparent transparent #f7f0e2 transparent}.hero-note span,.hero-note small{display:block;font-size:10px;color:var(--muted);font-weight:700}.hero-note strong{display:block;font-size:26px;line-height:1.05;margin:5px 0;font-family:'Bricolage Grotesque'}.hero-note strong span{display:inline;font-size:11px;margin-left:3px}.wall-toolbar{display:flex;justify-content:space-between;align-items:end;padding:48px 0 21px}.section-kicker span{letter-spacing:.03em;margin-left:10px;color:var(--orange)}.wall-toolbar h2{margin:10px 0 0;font-family:'Bricolage Grotesque','Noto Sans SC';font-size:25px;letter-spacing:-.04em}.title-spark{color:var(--orange);font-size:16px;vertical-align:top;margin-left:6px}.toolbar-right{display:flex;align-items:center;gap:32px}.legend{font-size:11px;color:var(--muted);display:flex;align-items:center;gap:8px}.legend b{color:var(--ink)}.sort-control{display:flex;align-items:center;gap:16px;font-size:11px;color:var(--muted);border-bottom:1px solid var(--line);padding-bottom:8px}.sort-control button{background:transparent;color:var(--muted);font-size:11px;padding:0}.sort-control button.sort-active{color:var(--ink);font-weight:700}.sort-control button span{font-size:14px;margin-left:3px;color:var(--orange)}.student-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:16px}.student-card{background:var(--paper);border:1px solid rgba(23,60,59,.07);border-radius:15px;padding:14px 14px 13px;position:relative;min-height:310px;display:flex;flex-direction:column;overflow:hidden;transition:.25s}.student-card:hover{transform:translateY(-4px);box-shadow:var(--shadow);border-color:rgba(232,111,81,.25)}.student-card.checked{background:linear-gradient(145deg,#fffdf8,#f8f6eb)}.card-top{display:flex;justify-content:space-between;align-items:center;position:relative;z-index:1}.student-number{font-size:10px;color:#a5b5ad;font-weight:700;letter-spacing:.06em}.check-badge{background:#dceee1;color:#4a9869;font-size:9px;font-weight:700;padding:5px 7px;border-radius:20px}.check-badge.pending{background:#f4eee3;color:#b49c70}.pet-stage{height:154px;display:grid;place-items:center;position:relative}.pet-stage:after{content:'';position:absolute;width:114px;height:20px;bottom:17px;border-radius:50%;background:rgba(23,60,59,.06);filter:blur(1px)}.pet-face{position:relative;z-index:1;font-size:61px;letter-spacing:-15px;transform:rotate(-5deg);filter:drop-shadow(4px 6px 0 rgba(23,60,59,.08));transition:.3s}.student-card:hover .pet-face{transform:rotate(3deg) scale(1.08)}.card-meta{display:flex;justify-content:space-between;align-items:end;border-bottom:1px solid var(--line);padding-bottom:11px}.student-name{font-size:16px;font-weight:700;letter-spacing:-.03em}.streak{font-size:11px;color:var(--orange);font-weight:700}.level-row{position:absolute;left:50%;top:126px;transform:translateX(-50%) rotate(-3deg);z-index:2;white-space:nowrap;font-family:'Bricolage Grotesque';font-weight:700;font-size:19px;color:var(--gold);-webkit-text-stroke:1px #a96e26;text-shadow:0 2px 0 #fff4b2,0 4px 10px rgba(175,116,32,.3)}.level-row small{font-family:'DM Sans';font-size:8px;letter-spacing:.08em;-webkit-text-stroke:0;color:#9d752f;text-shadow:none;margin-left:4px}.progress-wrap{margin:10px 0 11px}.progress-label{display:flex;justify-content:space-between;font-size:9px;color:var(--muted);margin-bottom:5px}.progress-label b{color:var(--ink)}.progress-track{height:4px;border-radius:5px;background:#e8eee6;overflow:hidden}.progress-fill{height:100%;background:linear-gradient(90deg,#eab844,#f08b5d);border-radius:5px}.checkin-button{width:100%;padding:9px;border-radius:7px;background:var(--ink);color:#fff;font-size:10px;font-weight:700;transition:.2s;margin-top:auto}.checkin-button:hover{background:var(--orange)}.checkin-button.done{background:#e3eee3;color:#609271}.card-tag{position:absolute;left:14px;top:39px;background:#f7e6c6;color:#ac7c32;font-size:8px;font-weight:700;padding:4px 6px;border-radius:4px}.student-card:nth-child(3n) .card-tag{background:#e5ebdf;color:#688c6d}.student-card:nth-child(4n) .card-tag{background:#f3dfdb;color:#bf6953}.bottom-cta{border:1px dashed #b8cdbf;border-radius:15px;display:flex;align-items:center;gap:15px;padding:19px 23px;margin-top:16px;color:var(--muted)}.cta-icon{width:31px;height:31px;border-radius:50%;background:#e3eee3;color:#609271;display:grid;place-items:center;font-size:21px}.bottom-cta strong{display:block;color:var(--ink);font-size:12px}.bottom-cta span{font-size:10px}.outline-button{margin-left:auto;padding:10px 14px;background:transparent;border:1px solid #b8cdbf;border-radius:7px;color:var(--ink);font-size:11px;font-weight:700}.outline-button span{font-size:16px;margin-left:8px;color:var(--orange)}.footer{display:flex;justify-content:space-between;padding:25px 5.5%;font-size:10px;color:#91a59c}.footer b{color:var(--orange)}.footer i{font-style:normal;color:var(--gold);margin-left:7px}.modal-backdrop{position:fixed;inset:0;background:rgba(10,35,32,.67);backdrop-filter:blur(5px);display:none;align-items:center;justify-content:center;z-index:20;padding:20px}.modal-backdrop.open{display:flex;animation:fadeIn .2s}.modal{background:var(--paper);border-radius:18px;position:relative;padding:32px;box-shadow:0 24px 80px rgba(0,0,0,.25);animation:popIn .25s;width:min(100%,430px)}.modal-close{position:absolute;right:17px;top:14px;background:#eff1e9;color:var(--muted);width:27px;height:27px;border-radius:50%;font-size:18px;line-height:1}.modal-pet{font-size:37px;letter-spacing:-11px;color:var(--orange);height:50px}.modal-kicker{color:var(--orange);margin-top:12px}.modal h3{font-family:'Bricolage Grotesque','Noto Sans SC';font-size:27px;letter-spacing:-.05em;margin:9px 0 5px}.modal h3 span{color:var(--orange)}.modal-subtitle{color:var(--muted);font-size:12px;margin:0 0 23px}.modal label{font-size:11px;font-weight:700;display:block;margin:14px 0;color:var(--ink)}.input-wrap{height:43px;border:1px solid var(--line);border-radius:8px;display:flex;align-items:center;margin-top:7px;padding:0 12px;background:#fff}.input-wrap:focus-within{border-color:var(--orange);box-shadow:0 0 0 3px rgba(232,111,81,.1)}.input-wrap input{border:0;outline:0;background:transparent;width:100%;font-size:13px;color:var(--ink)}.input-wrap span{color:var(--muted);font-size:11px;white-space:nowrap}.limit-tip{background:#f8f3e8;border-radius:7px;padding:10px 12px;color:#a08456;font-size:10px;margin:18px 0}.limit-tip span{font-size:14px;margin-right:5px}.limit-tip b{color:var(--orange)}.full-width{width:100%;margin-top:4px}.leaderboard-modal{width:min(100%,580px)}.leader-tabs{display:flex;gap:26px;border-bottom:1px solid var(--line);margin-top:24px}.leader-tab{background:transparent;padding:0 0 11px;color:var(--muted);font-size:11px;font-weight:700;border-bottom:2px solid transparent}.leader-tab.active{color:var(--orange);border-color:var(--orange)}.leader-list{padding-top:7px}.leader-row{display:grid;grid-template-columns:30px 42px 1fr auto;align-items:center;gap:10px;border-bottom:1px solid #edf0e9;padding:11px 0}.leader-rank{font-family:'Bricolage Grotesque';font-size:14px;color:var(--muted)}.leader-rank.top{font-size:20px}.leader-pet{font-size:26px;letter-spacing:-8px}.leader-person strong{display:block;font-size:12px}.leader-person small{font-size:9px;color:var(--muted)}.leader-value{text-align:right;color:var(--orange);font-family:'Bricolage Grotesque';font-size:16px}.leader-value small{font:10px 'DM Sans';color:var(--muted);margin-left:3px}.close-leader{color:var(--ink);margin-top:19px}.toast{position:fixed;right:28px;bottom:28px;z-index:30;background:var(--deep);color:#fff;border-radius:11px;padding:13px 17px;display:flex;align-items:center;gap:11px;box-shadow:0 15px 40px rgba(17,51,50,.25);transform:translateY(120px);opacity:0;transition:.35s}.toast.show{transform:translateY(0);opacity:1}.toast-check{width:25px;height:25px;background:#70bc88;border-radius:50%;display:grid;place-items:center;font-size:13px}.toast strong{display:block;font-size:12px}.toast small{display:block;font-size:10px;color:#9fbbb0;margin-top:2px}@keyframes fadeIn{from{opacity:0}to{opacity:1}}@keyframes popIn{from{opacity:0;transform:scale(.95) translateY(8px)}to{opacity:1;transform:none}}@keyframes levelUp{0%,100%{transform:translateX(-50%) rotate(-3deg) scale(1)}40%{transform:translateX(-50%) rotate(-3deg) scale(1.35);filter:brightness(1.3)}70%{transform:translateX(-50%) rotate(-3deg) scale(.95)}}.level-up .level-row{animation:levelUp .8s ease}.level-up .pet-face{animation:bounce .8s ease}@keyframes bounce{40%{transform:translateY(-16px) rotate(7deg) scale(1.15)}70%{transform:translateY(3px) rotate(-4deg)}}
@media(max-width:1100px){.student-grid{grid-template-columns:repeat(3,1fr)}.hero-visual{right:1%}.hero-copy h2{font-size:39px}}
/* 工具栏操作按钮（当前仅保留底部 CTA 内的添加学生入口） */
.wall-action{font-size:10px;color:var(--muted);background:transparent;border:1px solid #cbd8cc;border-radius:6px;padding:7px 10px;transition:.2s}.wall-action:hover{color:var(--orange);border-color:var(--orange);background:#fffaf3}
@media(max-width:760px){.topbar{height:auto;padding:18px 20px;align-items:flex-start}.top-actions{gap:10px}.date-chip{display:none}.teacher-chip{font-size:0}.teacher-chip .chevron{font-size:18px}.brand-lockup h1{font-size:17px}main{padding:22px 16px}.hero-panel{height:466px}.hero-copy{padding:34px 25px}.hero-copy h2{font-size:36px}.hero-visual{top:220px;right:calc(50% - 220px);transform:scale(.8);transform-origin:top center}.wall-toolbar{display:block;padding-top:35px}.toolbar-right{justify-content:space-between;margin-top:18px}.student-grid{grid-template-columns:repeat(2,1fr);gap:10px}.student-card{min-height:280px;padding:11px}.pet-stage{height:132px}.pet-face{font-size:49px}.level-row{top:112px}.card-tag{left:11px}.bottom-cta{padding:15px}.bottom-cta .outline-button{font-size:0}.bottom-cta .outline-button span{font-size:16px}.footer{padding:20px 16px}.footer span:first-child{display:none}.modal{padding:26px 21px}.leaderboard-modal{padding:28px 21px}}

/* ==========================================================================
   繁星班 · 星宠立绘 / 权限登录 / 进化节点 / 底部榜单入口
   ========================================================================== */

/* ---- 头图：去掉「WEEK 07 / 20」和 READ MORE 之后收紧高度 ---- */
.hero-panel{height:302px}
.hero-copy{padding:40px 0 34px 7%}
.hero-copy h2{margin:0 0 12px}
/* 便签第二行的数字与单位贴紧，读起来是「32.7h」而不是「32.7 h」 */
.hero-note strong span{margin-left:1px}

/* ---- 头图星空：呼应「繁星班」这个班名 ----
   分两层：.hero-stars 是铺满整块的细小星点（纯 CSS 渐变，不增加 DOM），
   .hero-spark 是十来颗大小不一的四角星，带错峰的闪烁动画。 */
.hero-stars{position:absolute;inset:0;pointer-events:none;
  background-repeat:no-repeat;
  background-image:
    radial-gradient(1.6px 1.6px at 6% 16%, rgba(255,255,255,.72), transparent 62%),
    radial-gradient(1.2px 1.2px at 13% 62%, rgba(255,255,255,.42), transparent 62%),
    radial-gradient(1.4px 1.4px at 19% 33%, rgba(247,215,125,.55), transparent 62%),
    radial-gradient(1.1px 1.1px at 24% 84%, rgba(255,255,255,.36), transparent 62%),
    radial-gradient(1.5px 1.5px at 30% 12%, rgba(255,255,255,.58), transparent 62%),
    radial-gradient(1.2px 1.2px at 36% 55%, rgba(247,215,125,.40), transparent 62%),
    radial-gradient(1.3px 1.3px at 41% 88%, rgba(255,255,255,.44), transparent 62%),
    radial-gradient(1.1px 1.1px at 47% 26%, rgba(255,255,255,.34), transparent 62%),
    radial-gradient(1.7px 1.7px at 53% 71%, rgba(255,255,255,.62), transparent 62%),
    radial-gradient(1.2px 1.2px at 58% 8%, rgba(247,215,125,.46), transparent 62%),
    radial-gradient(1.3px 1.3px at 63% 44%, rgba(255,255,255,.50), transparent 62%),
    radial-gradient(1.1px 1.1px at 68% 90%, rgba(255,255,255,.32), transparent 62%),
    radial-gradient(1.6px 1.6px at 74% 20%, rgba(255,255,255,.66), transparent 62%),
    radial-gradient(1.2px 1.2px at 79% 58%, rgba(247,215,125,.42), transparent 62%),
    radial-gradient(1.4px 1.4px at 84% 34%, rgba(255,255,255,.55), transparent 62%),
    radial-gradient(1.1px 1.1px at 88% 78%, rgba(255,255,255,.36), transparent 62%),
    radial-gradient(1.5px 1.5px at 92% 14%, rgba(255,255,255,.60), transparent 62%),
    radial-gradient(1.2px 1.2px at 96% 52%, rgba(247,215,125,.44), transparent 62%),
    radial-gradient(1.3px 1.3px at 9% 44%, rgba(255,255,255,.38), transparent 62%),
    radial-gradient(1.2px 1.2px at 71% 76%, rgba(255,255,255,.40), transparent 62%)}
.hero-spark{animation:twinkle 3.4s ease-in-out infinite}
/* 大小、颜色、位置各不同，闪烁也错峰，避免整片一起眨眼 */
.spark-a{top:66px;right:58px;font-size:22px;animation-delay:0s}
.spark-b{top:238px;left:44px;color:#f18a67;font-size:18px;animation-delay:.6s}
.spark-c{bottom:30px;right:100px;font-size:15px;animation-delay:1.2s}
.spark-d{top:10px;left:26px;font-size:11px;animation-delay:.3s}
.spark-e{top:116px;left:4px;font-size:15px;animation-delay:1.6s}
.spark-f{top:248px;left:30px;font-size:9px;animation-delay:.9s}
.spark-g{top:16px;left:352px;font-size:13px;color:#fff6dc;animation-delay:2.1s}
.spark-h{top:148px;right:6px;font-size:10px;animation-delay:1.4s}
.spark-i{top:246px;right:30px;font-size:14px;color:#f18a67;animation-delay:2.6s}
.spark-j{top:4px;left:196px;font-size:9px;animation-delay:.4s}
/* 这两颗落在太阳上，用深色才有对比 */
.spark-k{top:60px;left:136px;font-size:12px;color:#0e2b2a;animation-delay:1.9s}
.spark-l{top:196px;left:118px;font-size:10px;color:#0e2b2a;animation-delay:2.9s}
@keyframes twinkle{0%,100%{opacity:.42;transform:scale(.82) rotate(-6deg)}50%{opacity:1;transform:scale(1.16) rotate(6deg)}}
@media (prefers-reduced-motion:reduce){
  .hero-spark{animation:none;opacity:.9}
}

/* ---- 星宠立绘 ---- */
/* 立绘靠下站，上方留出给台词气泡的位置，气泡就不会盖住星宠的头 */
.student-card{min-height:366px}
.pet-stage{height:178px;place-items:end center;padding-bottom:8px}
.pet-stage:after{bottom:12px}
.pet-art{width:auto;height:112px;max-width:88%;object-fit:contain;position:relative;z-index:1;transform:rotate(-3deg);filter:drop-shadow(4px 10px 0 rgba(23,60,59,.08));transition:.3s;pointer-events:none}
.student-card:hover .pet-art{transform:rotate(3deg) scale(1.07)}
.level-up .pet-art{animation:bounce .8s ease}
.pet-art.is-missing{display:none}
/* 等级 + 宠物名：等级已挪到姓名那一行；这里只留宠物名 */
.pet-id-row{margin:0 0 9px;text-align:center;font-size:12px;font-weight:700;color:var(--ink);letter-spacing:-.01em}
.level-up .pet-id-row{animation:idPop .8s ease}
@keyframes idPop{0%,100%{transform:scale(1)}40%{transform:scale(1.14);color:var(--orange)}70%{transform:scale(.98)}}

/* ---- 连胜那一行：左侧阅读等级 ↔ 右侧连胜天数，左右对称 ----
   这个 LV 是「学生」的阅读等级（由累计时长折算），不是宠物等级，
   所以不跟宠物名放在一起。 */
.card-top{gap:7px;justify-content:flex-start}
.student-name{white-space:nowrap;flex:0 0 auto}
/* 状态标签紧贴姓名右侧；宽度不够时优先让它省略，姓名和打卡徽章保持完整 */
.card-tag{position:static;left:auto;top:auto;flex:0 1 auto;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.card-top .check-badge{flex:0 0 auto;margin-left:auto}
.card-meta{justify-content:space-between}
.card-level{font-size:11px;font-weight:700;color:#a4702a;white-space:nowrap;letter-spacing:.01em}

/* ---- 星宠台词气泡（点立绘冒一句，几秒后淡出） ---- */
.pet-stage{cursor:pointer}
.pet-stage:focus-visible{outline:2px dashed var(--orange);outline-offset:4px;border-radius:12px}
/* 注意：这里用 left:0 / right:0 + width:fit-content + margin:auto 来居中。
   如果写成 left:50% + translateX(-50%)，绝对定位元素的「可用宽度」会只剩容器右半边，
   台词会被挤成很多行、把宠物整个挡住。 */
.pet-bubble{position:absolute;left:0;right:0;top:1px;z-index:5;
  width:fit-content;max-width:min(210px,90%);margin:0 auto;
  background:var(--paper);border:1.5px solid var(--ink);border-radius:13px;padding:8px 11px;
  font-size:11px;font-weight:600;line-height:1.5;color:var(--ink);text-align:left;
  box-shadow:3px 4px 0 rgba(23,60,59,.13);
  opacity:0;transform:translateY(7px) scale(.93);pointer-events:none;
  transition:opacity .45s ease,transform .45s ease}
.pet-bubble.show{opacity:1;transform:translateY(0) scale(1)}
.pet-bubble:after{content:'';position:absolute;left:50%;bottom:-6px;width:10px;height:10px;
  background:var(--paper);border-right:1.5px solid var(--ink);border-bottom:1.5px solid var(--ink);
  transform:translateX(-50%) rotate(45deg);border-bottom-right-radius:2px}
@media (prefers-reduced-motion:reduce){
  .pet-bubble{transition:opacity .2s ease;transform:none}
  .pet-bubble.show{transform:none}
}
.checkin-button:disabled{background:#e9ece5;color:#9aa9a1;cursor:not-allowed}
.checkin-button:disabled:hover{background:#e9ece5}
.primary-button:disabled,.primary-button[aria-disabled="true"]{background:#e5e9e1;color:#a4b1a9;box-shadow:none;cursor:not-allowed}
.primary-button:disabled:hover,.primary-button[aria-disabled="true"]:hover{background:#e5e9e1;transform:none}
/* 被「已选新宠物」拦下的进化按钮：外观是灰的，但点它/按回车是切回进化，所以光标仍是手型 */
.evo-card .primary-button[aria-disabled="true"]{cursor:pointer}
.evo-card .primary-button[aria-disabled="true"]:hover{background:#dfe4dc}

/* ---- 打卡弹窗：宠物挪到标题右侧，整体更紧凑、更宽 ---- */
.checkin-modal{width:min(100%,560px);padding:26px 30px 22px}
/* padding-right 让星宠避开右上角的关闭按钮 */
.modal-head{display:flex;align-items:center;gap:16px;padding-right:22px}
.modal-head-copy{flex:1;min-width:0}
.modal-head-copy .modal-subtitle{margin:0}
.modal-pet{flex:none;display:grid;place-items:center;width:92px;height:92px}
.modal-pet .pet-art{height:92px;max-width:100%;transform:rotate(-4deg)}
/* 压缩纵向留白 */
.checkin-modal form{margin-top:16px}
.checkin-modal form > label{margin:12px 0 0}
.checkin-modal form > label.date-label{margin-top:0}
.checkin-modal .checkin-dates{margin-top:7px}
.checkin-modal .backfill-tip{margin:11px 0 0}
.checkin-modal .limit-tip{margin:11px 0 0}
.checkin-modal .primary-button.full-width{margin-top:14px}

/* ---- 打卡日期选择（今天 + 最近 7 天可补打卡） ---- */
.date-label{display:flex;justify-content:space-between;align-items:center;margin-bottom:0}
.date-label span{color:var(--orange);font-size:11px}
.checkin-dates{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;margin-top:8px}
.checkin-date{display:flex;flex-direction:column;align-items:center;gap:2px;padding:7px 1px 6px;border:1.5px solid var(--line);border-radius:8px;background:#fbf8f0;transition:.15s}
.checkin-date:hover{border-color:#e6b9a6;transform:translateY(-1px)}
.checkin-date strong{font-size:10px;line-height:1.2;white-space:nowrap}
.checkin-date small{font-size:8px;color:var(--muted);line-height:1.2}
.checkin-date em{font-size:8px;font-style:normal;line-height:1.2;color:#bcc7c0;white-space:nowrap}
.checkin-date em.done{color:#4a9869;font-weight:700}
.checkin-date em.partial{color:#c09a3f;font-weight:700}
.checkin-date.active{border-color:var(--orange);background:#fff4ec;box-shadow:0 0 0 3px rgba(232,111,81,.12)}
.checkin-date.active strong{color:var(--orange-dark)}
.backfill-tip{display:none;background:#fdf0e8;border-radius:7px;padding:10px 12px;color:#b1663f;font-size:10px;margin:12px 0 0;align-items:center;gap:5px}
.backfill-tip span{font-size:14px}
.limit-tip i{font-style:normal}

/* ---- 榜单行立绘 ---- */
.leader-pet{display:grid;place-items:center}
.leader-art{height:34px;transform:none;filter:none}

/* ---- 老师登录区 ---- */
.teacher-area{position:relative}
.teacher-chip .avatar{font-size:12px}
.teacher-chip.guest .avatar{background:#e3e9e2;color:#79908a}
.teacher-menu{position:absolute;right:0;top:calc(100% + 10px);min-width:150px;background:var(--paper);border:1px solid var(--line);border-radius:11px;box-shadow:var(--shadow);padding:6px;display:none;z-index:12}
.teacher-menu.open{display:block;animation:popIn .16s ease}
.teacher-menu button{display:block;width:100%;text-align:left;background:transparent;font-size:12px;font-weight:600;padding:9px 10px;border-radius:7px;transition:.15s}
.teacher-menu button:hover{background:#f4f0e6;color:var(--orange)}

/* ---- 游客只读态 ---- */
.guest-lock{display:none;margin-left:auto;font-size:10px;color:#93a49b;background:#eef2ea;border-radius:7px;padding:9px 12px}
body.guest-mode .guest-lock{display:inline-block}
body.guest-mode #openAddStudent{display:none}
body.guest-mode .bottom-cta{border-color:#e0e6dd}

/* ---- 登录 / 改密弹窗 ---- */
.form-error{min-height:15px;margin:6px 0 0;font-size:11px;font-weight:600;color:var(--orange-dark)}
.login-hint{margin:16px 0 0;font-size:10px;color:var(--muted);text-align:center}
.login-hint b{color:var(--orange)}
.reset-password{display:block;margin:14px auto 0;background:transparent;font-size:11px;font-weight:700;color:var(--muted);text-decoration:underline;text-underline-offset:3px}
.reset-password:hover{color:var(--orange)}

/* ---- 星宠选择器 ---- */
.pet-picker{display:grid;grid-template-columns:repeat(2,1fr);gap:9px;margin-top:9px}
.pet-option{display:flex;flex-direction:column;align-items:center;gap:3px;background:#fbf8f0;border:1.5px solid var(--line);border-radius:11px;padding:10px 8px 9px;transition:.18s;text-align:center}
.pet-option:hover:not(:disabled){border-color:var(--orange);transform:translateY(-2px);background:#fffdf8}
.pet-option strong{font-size:11px}
.pet-option small{font-size:9px;color:var(--muted);line-height:1.35}
.pet-option-art{height:52px;width:auto;max-width:100%;object-fit:contain}
.pet-option.selected{border-color:var(--orange);background:#fff4ec;box-shadow:0 0 0 3px rgba(232,111,81,.12)}
.pet-option.selected small{color:var(--orange-dark);font-weight:700}
.pet-option.current,.pet-option:disabled{cursor:not-allowed;opacity:.52;filter:grayscale(.4)}
.pet-option.current small{color:#a4702a;font-weight:700}

/* ---- 添加学生弹窗：八种星宠以 4×2 网格展示 ---- */
.add-modal{width:min(100%,650px);padding:26px 30px 22px}
.add-modal form{margin-top:16px}
.add-modal .field-row{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.add-modal .field-row > label{margin:0}
.add-modal .picker-label{margin:16px 0 0}
.add-modal .pet-picker{grid-template-columns:repeat(4,1fr);gap:8px;margin-top:8px}
.add-modal .pet-option{padding:8px 6px 8px;gap:2px}
.add-modal .pet-option-art{height:40px}
/* 简介最多两行，保证八个选项等高 */
.add-modal .pet-option small{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.add-modal .primary-button.full-width{margin-top:18px}

/* ---- 进化节点弹窗 ---- */
.evolution-modal{width:min(100%,800px);padding:30px 30px 24px}
.evolution-current{display:flex;align-items:center;gap:13px;background:#f7f2e7;border:1px dashed #d9cdb4;border-radius:13px;padding:11px 14px;margin-bottom:16px}
.evo-current-art{height:58px;transform:none;filter:drop-shadow(3px 5px 0 rgba(23,60,59,.08))}
.evo-current-meta strong{display:block;font-size:14px;letter-spacing:-.02em}
.evo-current-meta span{display:block;font-size:11px;font-weight:700;color:var(--orange-dark);margin:2px 0}
.evo-current-meta small{font-size:10px;color:var(--muted)}
.evolution-options{display:grid;grid-template-columns:1fr 1.15fr;gap:13px;align-items:stretch}
.evo-card{background:var(--paper);border:1.5px solid var(--line);border-radius:14px;padding:14px;display:flex;flex-direction:column}
.evo-card h4{margin:0 0 6px;font-family:'Bricolage Grotesque','Noto Sans SC';font-size:14px;letter-spacing:-.02em}
.evo-card.evo-evolve{border-color:#eccfa4;background:linear-gradient(160deg,#fffdf6,#fdf6e6)}
.evo-note{margin:0 0 10px;font-size:10px;color:var(--muted);line-height:1.5}
.evo-art{display:grid;place-items:center;min-height:98px;margin-bottom:6px}
.evo-next-art{height:94px;transform:none;animation:pulseArt 2.6s ease-in-out infinite}
.evo-path{margin:0 0 12px;text-align:center;font-family:'Bricolage Grotesque';font-weight:700;font-size:14px;color:#a4702a}
.evo-path em{display:block;font-family:'DM Sans';font-style:normal;font-size:10px;color:var(--orange-dark);margin-top:2px}
.evo-card .primary-button{margin-top:auto}
.evo-card.disabled{opacity:.7}
.evo-switch .pet-picker{grid-template-columns:repeat(4,1fr);gap:7px;margin-top:4px}
.evo-switch .pet-option{padding:7px 5px 6px;gap:2px}
.evo-switch .pet-option-art{height:38px}
.evo-switch .pet-option strong{font-size:10px}
.evo-switch .pet-option small{font-size:8px}
/* 左卡整体可点：选中新宠后点它能把「让它进化」重新选回来 */
.evo-card.evo-evolve{cursor:pointer;transition:.18s}
.evo-card.evo-evolve.disabled:hover{border-color:var(--orange);opacity:.92}
.evolution-foot{margin:14px 0 0;text-align:center;font-size:10px;color:var(--muted)}
@keyframes pulseArt{0%,100%{transform:scale(1)}50%{transform:scale(1.05) rotate(2deg)}}

/* ---- 弹窗高度约束：整体不超出视口，内容在弹窗内部滚动 ---- */
.modal{max-height:calc(100vh - 40px);max-height:calc(100dvh - 40px);display:flex;flex-direction:column;overflow-y:auto;overscroll-behavior:contain}
/* 榜单：标题 / 三个 tab / 底部返回按钮固定，只有列表滚动 */
.leaderboard-modal{overflow:hidden}
.leaderboard-modal .modal-subtitle,
.leaderboard-modal .leader-tabs,
.leaderboard-modal .modal-kicker,
.leaderboard-modal h3{flex:none}
.leaderboard-modal .leader-list{flex:1 1 auto;min-height:0;overflow-y:auto;padding-right:6px;scrollbar-width:thin;scrollbar-color:#cfd9ce transparent}
.leaderboard-modal .leader-list::-webkit-scrollbar{width:6px}
.leaderboard-modal .leader-list::-webkit-scrollbar-thumb{background:#cfd9ce;border-radius:3px}
.leaderboard-modal .close-leader{flex:none}
/* 三个榜单 tab：左右居中，字号加大 */
.leader-tabs{justify-content:center;gap:46px}
.leader-tab{font-size:15px;padding:0 2px 12px}

/* ---- 底部榜单入口 ---- */
.leaderboard-entry{margin-top:16px;background:var(--deep);border-radius:20px;padding:26px 30px;display:flex;align-items:center;justify-content:space-between;gap:22px;color:var(--paper);position:relative;overflow:hidden;box-shadow:var(--shadow)}
.leaderboard-entry:before{content:'';position:absolute;right:-40px;top:-70px;width:230px;height:230px;border-radius:50%;background:radial-gradient(circle,rgba(233,184,68,.3),transparent 68%);pointer-events:none}
.leaderboard-entry .section-kicker{color:#9bbab0}
.leaderboard-entry .section-kicker span{color:var(--gold);margin-left:8px}
.leaderboard-entry h2{margin:9px 0 6px;font-family:'Bricolage Grotesque','Noto Sans SC';font-size:24px;letter-spacing:-.04em}
.leaderboard-entry p{margin:0;font-size:12px;color:#aac1b8}
.entry-button{position:relative;z-index:1;flex:none;padding:15px 20px;font-size:13px}

/* ---- 追加样式的移动端适配（必须排在媒体查询之后才能生效） ---- */
@media(max-width:760px){
  /* 必须放在这里的理由：上面的 .hero-panel{height:302px} 是普通规则，
     会盖掉第 6 行原媒体查询里的移动端高度，所以移动端值要写在更靠后的位置 */
  .hero-panel{height:466px}
  /* 视觉区整体下移了 220px，高度必须跟着减掉，否则 bottom 定位的「本周阅读」便签
     会落到面板外面被 overflow:hidden 裁掉（这是原本就存在的问题） */
  .hero-visual{height:calc(100% - 220px)}
  .student-card{min-height:330px}
  .pet-stage{height:152px;place-items:end center;padding-bottom:6px}
  .pet-stage:after{bottom:8px}
  .pet-art{height:92px}
  .pet-id-row{margin:0 0 8px}
  .card-level{font-size:10px}
  .card-top{gap:5px}
  .card-tag{font-size:7.5px;padding:3px 5px}
  .pet-bubble{font-size:10.5px;padding:7px 9px}
  .checkin-modal{padding:22px 18px 18px}
  .checkin-modal h3{font-size:21px}
  .add-modal{padding:22px 18px 18px}
  .add-modal h3{font-size:21px}
  .add-modal .pet-picker{grid-template-columns:repeat(2,1fr)}
  .modal-head{gap:10px;padding-right:18px}
  .modal-pet{width:64px;height:64px}
  .modal-pet .pet-art{height:64px}
  .leader-tabs{gap:30px}
  .leader-tab{font-size:14px}
  .evolution-modal{padding:22px 16px 18px}
  .evolution-options{grid-template-columns:1fr}
  .evo-switch .pet-picker{grid-template-columns:repeat(2,1fr)}
  .evo-switch .pet-option-art{height:42px}
  .evolution-current{align-items:flex-start}
  .leaderboard-entry{flex-direction:column;align-items:flex-start;padding:22px 18px;gap:14px}
  .entry-button{width:100%}
  .teacher-menu{min-width:136px}
}
