/* 班级主题解锁：上课模态的大背景跟随主题色（不作用到姓名牌 → 姓名牌保持白底） */
:root{--ink:#273044;--muted:#6c7892;--cream:#fffaf0;--paper:#fffdf8;--purple:#6546c8;--purple2:#8064e3;--gold:#ffb83d;--mint:#d9f6e8;--line:#e9e1d6;--red:#e9666a;--shadow:0 12px 30px rgba(49,39,76,.1)}}*{box-sizing:border-box}body{margin:0;background:linear-gradient(145deg,#f4edff 0%,#fff7e8 46%,#e9fbf3 100%);color:var(--ink);font-family:"PingFang SC","Microsoft YaHei",sans-serif;min-height:100vh}.app-shell{min-height:100vh}.topbar{height:80px;background:rgba(255,253,248,.9);backdrop-filter:blur(10px);border-bottom:1px solid rgba(119,93,169,.12);display:flex;align-items:center;padding:0 38px;gap:36px;position:sticky;top:0;z-index:10}.brand{display:flex;align-items:center;gap:10px;min-width:196px}.brand-mark{height:42px;width:42px;border-radius:14px;display:grid;place-items:center;background:linear-gradient(135deg,var(--purple),#b179df);color:#fff;font-size:23px;box-shadow:0 5px 12px #b8a6dd}.brand strong,.brand span{display:block}.brand strong{font-size:18px;letter-spacing:.08em}.brand span{font-size:12px;color:var(--muted);margin-top:3px}nav{display:flex;gap:6px;flex:1}.nav-btn,.shop-tab{border:0;background:transparent;color:var(--muted);font:inherit;padding:11px 15px;border-radius:10px;cursor:pointer}.nav-btn.active,.nav-btn:hover,.shop-tab.active{background:#eee8ff;color:var(--purple);font-weight:700}.teacher-chip{background:#fff3d9;border:1px solid #ffe1a3;border-radius:100px;padding:8px 12px;font-size:13px;color:#8b6314}.teacher-chip span,.live-dot{color:#31a76c;font-size:12px}main{max-width:1570px;margin:auto;padding:32px 38px 54px}.view{display:none}.view.active{display:block}.class-header,.page-heading{display:flex;justify-content:space-between;align-items:center;margin-bottom:22px}.eyebrow{font-size:12px;color:var(--purple);font-weight:700;letter-spacing:.14em;text-transform:uppercase}.class-header h1,.page-heading h1{font-size:28px;margin:5px 0 0}.class-header select{font:inherit;font-weight:800;color:var(--ink);border:0;background:transparent;outline:0;padding:0;cursor:pointer}.lesson-title{font-size:16px;color:var(--muted);font-weight:500;margin-left:13px}.class-actions{display:flex;gap:9px}.primary-btn,.secondary-btn,.file-btn{border:0;border-radius:10px;padding:11px 16px;font:inherit;font-weight:700;cursor:pointer;transition:.2s}.primary-btn{background:var(--purple);color:#fff;box-shadow:0 6px 14px rgba(101,70,200,.24)}.primary-btn:hover{background:#5035ad;transform:translateY(-1px)}.secondary-btn,.file-btn{background:#fff;border:1px solid var(--line);color:var(--ink)}.secondary-btn:hover,.file-btn:hover{border-color:#cbbce9;background:#fbf9ff}.adventure-progress{display:flex;align-items:center;gap:20px;background:linear-gradient(90deg,#47377c,#7259c2);color:#fff;border-radius:16px;padding:16px 21px;margin-bottom:22px;box-shadow:var(--shadow)}.progress-copy{white-space:nowrap}.progress-copy span{font-size:13px;display:block;opacity:.82}.progress-copy strong{font-size:24px}.progress-copy small{opacity:.8}.progress-track{height:12px;border-radius:20px;background:rgba(255,255,255,.22);overflow:hidden;flex:1}.progress-track div{height:100%;background:linear-gradient(90deg,#ffd05e,#ffebae);border-radius:20px;transition:width .5s}.progress-reward{font-size:13px;white-space:nowrap}.classroom-grid{display:grid;grid-template-columns:1.18fr 1fr .8fr;gap:20px}.panel{background:rgba(255,253,248,.55);border:1px solid rgba(215,203,186,.75);border-radius:18px;padding:20px;box-shadow:var(--shadow)}.panel-heading{display:flex;justify-content:space-between;align-items:start;margin-bottom:15px}.panel h2{font-size:18px;margin:4px 0}.panel p,.page-heading p{color:var(--muted);margin:6px 0 0;font-size:14px}.count-pill{background:#eee9fb;color:var(--purple);border-radius:100px;padding:5px 9px;font-size:12px;font-weight:bold}.student-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;max-height:610px;overflow:auto;padding:2px}.student-card{border:1px solid var(--line);background:var(--class-theme-bg,#fff);color:var(--class-theme-ink,#273044);border-radius:13px;padding:10px 7px 8px;cursor:pointer;position:relative;text-align:center;transition:.18s}.student-card:hover,.student-card.selected{border-color:#9983db;transform:translateY(-2px);box-shadow:0 6px 16px rgba(92,68,153,.13)}.student-card.selected{background:#f6f2ff}
/* 班级主题解锁后，仅作用到上课模态大背景；姓名牌保持白底、头像不淡化。 */
.student-card{background:#fff;color:var(--ink);border-color:var(--line)}
/* 上课全屏模态背景：默认深紫蓝渐变；解锁主题后整体变成对应主题色渐变。
   用户要求"班级解锁新主题 → 上课模式大背景变主题色"，所以这里用 4 条
   body[data-theme-level="N"] 规则覆盖 .teach-modal 的 background 渐变。 */
.teach-modal{background:radial-gradient(130% 78% at 50% -14%,rgba(255,255,255,.16),transparent 58%),linear-gradient(160deg,#473c78 0%,#3b3268 55%,#312a5b 100%)}  /* 默认深紫蓝 · 柔和 */
body[data-theme-level="1"] .teach-modal{background:radial-gradient(130% 78% at 50% -14%,rgba(216,246,234,.55),transparent 58%),linear-gradient(160deg,#5aa98a 0%,#4a9384 55%,#3c7c6b 100%)}  /* 宝藏森林 · 绿 */
body[data-theme-level="2"] .teach-modal{background:radial-gradient(130% 78% at 50% -14%,rgba(214,234,248,.55),transparent 58%),linear-gradient(160deg,#6aa0c4 0%,#5089b3 55%,#3f6f99 100%)}  /* 海风码头 · 蓝 */
body[data-theme-level="3"] .teach-modal{background:radial-gradient(130% 78% at 50% -14%,rgba(232,224,250,.55),transparent 58%),linear-gradient(160deg,#9a86c4 0%,#8069b0 55%,#6a52a0 100%)}  /* 星光城堡 · 紫 */
body[data-theme-level="4"] .teach-modal{background:radial-gradient(130% 78% at 50% -14%,rgba(248,222,240,.55),transparent 58%),linear-gradient(160deg,#c08ab4 0%,#a76da0 55%,#8c5788 100%)}  /* 银河殿堂 · 玫红 */.avatar{width:35px;height:35px;margin:auto;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#514089;background:var(--avatar-bg,#eee8ff)}.student-card span{display:block;margin-top:6px;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.student-card small{display:block;font-size:11px;color:#ac7a20;margin-top:3px}.selected-hero{border:1px dashed #d9cbe8;background:#faf7ff;border-radius:15px;min-height:103px;display:flex;align-items:center;gap:16px;padding:15px}.selected-hero p{margin:0;line-height:1.6}.big-avatar{width:65px;height:65px;flex:none;border-radius:23px;display:grid;place-items:center;background:linear-gradient(135deg,#f3c96c,#f48d66);font-size:24px;color:#fff;font-weight:800}.medal-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:9px;margin:17px 0}.medal-btn{border:1px solid var(--line);background:#fff;border-radius:12px;text-align:left;padding:10px;cursor:pointer;color:var(--ink);display:flex;align-items:center;gap:8px;transition:.18s}.medal-btn:hover:not(:disabled){border-color:#a48ee1;background:#fbfaff;transform:translateY(-1px)}.medal-btn:disabled{opacity:.45;cursor:not-allowed}.medal-icon{width:31px;height:31px;border-radius:10px;display:grid;place-items:center;background:#fff1c7;font-size:17px}.medal-btn strong,.medal-btn small{display:block}.medal-btn strong{font-size:13px}.medal-btn small{font-size:11px;color:var(--muted);margin-top:2px}.text-btn{border:0;background:transparent;color:var(--purple);cursor:pointer;font:inherit;font-size:13px;padding:3px}.ranking-list{list-style:none;margin:0;padding:0}.ranking-list li{display:flex;align-items:center;gap:10px;padding:11px 2px;border-bottom:1px dashed var(--line)}.rank-number{width:24px;text-align:center;font-weight:800;color:var(--muted)}.rank-number.top{font-size:18px}.rank-name{flex:1;font-size:14px}.rank-score{font-weight:800;color:#b77a0c;font-size:14px}.growth-star{display:flex;gap:10px;align-items:center;padding:12px;margin-top:14px;background:var(--mint);border-radius:12px}.growth-star span{font-size:25px}.growth-star small,.growth-star strong{display:block}.growth-star small{font-size:11px;color:#397755}.growth-star strong{font-size:14px;margin-top:2px}.page-heading{margin-bottom:28px}.settings-grid{display:grid;grid-template-columns:310px 1fr;gap:20px}.class-list-panel h2{margin-bottom:14px}.class-list-item{width:100%;border:1px solid var(--line);background:#fff;border-radius:11px;padding:13px;text-align:left;margin-bottom:9px;cursor:pointer;color:var(--ink);display:flex;justify-content:space-between}.class-list-item.active{border-color:var(--purple);background:#f8f5ff}.class-list-item span{color:var(--muted);font-size:12px}.import-row,.add-student-row{display:flex;gap:10px;margin:15px 0}.file-btn{display:inline-flex;align-items:center}.add-student-row input,.new-medal-form input,.new-medal-form select,.redeem-modal input{border:1px solid var(--line);border-radius:10px;padding:11px 12px;font:inherit;outline-color:var(--purple)}.add-student-row input{flex:1}.roster-table{border-top:1px solid var(--line)}.roster-row{display:flex;align-items:center;border-bottom:1px solid var(--line);padding:11px 6px;gap:12px}.roster-row .avatar{margin:0}.roster-row span{flex:1}.delete-btn{color:var(--red);border:0;background:transparent;cursor:pointer}.shop-layout{display:grid;grid-template-columns:260px 1fr;gap:20px}.shop-students h2{margin-bottom:14px}.shop-student{width:100%;display:flex;align-items:center;gap:9px;padding:9px;border:1px solid transparent;background:transparent;border-radius:10px;text-align:left;cursor:pointer;color:var(--ink)}.shop-student.active{background:#f2edff;border-color:#ddd0ff}.shop-student .avatar{margin:0}.shop-student strong{font-size:13px}.shop-student small{font-size:11px;color:#a97210}.shop-tabs{display:flex;gap:7px;margin-bottom:14px}.shop-tab{background:rgba(255,253,248,.7);border:1px solid transparent}.shop-grid{display:grid;grid-template-columns:repeat(3,minmax(160px,1fr));gap:15px}.shop-item{background:rgba(255,253,248,.94);border:1px solid var(--line);border-radius:16px;padding:15px;box-shadow:var(--shadow)}.shop-visual{height:85px;border-radius:12px;background:linear-gradient(135deg,#efe7ff,#d8f5ea);display:grid;place-items:center;font-size:42px;margin-bottom:12px}.shop-item h3{font-size:16px;margin:0 0 5px}.shop-item p{font-size:12px;color:var(--muted);min-height:30px;margin:0 0 11px}.shop-item footer{display:flex;align-items:center;justify-content:space-between;gap:7px}.price{font-weight:800;color:#b7770a;font-size:13px}.shop-item .primary-btn{padding:8px 10px;font-size:12px}.report-cards{display:grid;grid-template-columns:repeat(3,1fr);gap:17px;margin-bottom:20px}.report-card{background:rgba(255,253,248,.92);border:1px solid var(--line);box-shadow:var(--shadow);border-radius:17px;padding:20px}.report-card small{display:block;color:var(--muted)}.report-card strong{display:block;font-size:30px;margin-top:8px;color:var(--purple)}.report-list{display:grid;grid-template-columns:repeat(2,1fr);gap:9px}.report-row{display:flex;align-items:center;border:1px solid var(--line);border-radius:11px;padding:10px;gap:10px}.report-row .rank-number{font-size:14px}.modal-backdrop{position:fixed;inset:0;background:rgba(32,24,52,.52);z-index:20;display:grid;place-items:center;padding:20px}.modal-backdrop.hidden{display:none}.modal{max-width:670px;width:100%;background:#fffdf9;border-radius:22px;padding:28px;box-shadow:0 25px 60px rgba(27,17,59,.3);position:relative}.modal-close{position:absolute;right:16px;top:13px;border:0;background:transparent;font-size:27px;color:var(--muted);cursor:pointer}.award-top{display:flex;gap:15px;align-items:center}.award-medal-icon{width:58px;height:58px;border-radius:19px;display:grid;place-items:center;background:linear-gradient(135deg,#ffd96c,#ffad55);font-size:30px}.award-top h2,.manage-modal h2,.redeem-modal h2,.settle-modal h2{margin:4px 0}.award-top p{margin:0;color:var(--muted)}.card-prompt{text-align:center;margin:24px 0 15px;font-weight:700}.mystery-cards{display:grid;grid-template-columns:repeat(3,1fr);gap:13px}.mystery-card{border:0;border-radius:16px;min-height:154px;cursor:pointer;background:linear-gradient(145deg,#7653cd,#ad80e7);color:#fff;font-size:40px;box-shadow:0 9px 0 #573cac,0 12px 20px rgba(91,62,170,.22);transition:.2s}.mystery-card:hover{transform:translateY(-5px) rotate(1deg)}.mystery-card:disabled{cursor:default}.mystery-card.revealed{background:linear-gradient(145deg,#fff7d2,#ffe2a0);color:#8a5811;box-shadow:0 6px 0 #e1b85e}.mystery-card span{font-size:14px;display:block;font-weight:700}.award-result{text-align:center;margin:22px 0 2px;padding:13px;border-radius:12px;background:#e4f8eb;color:#28724c;font-weight:700}.manage-modal{max-width:760px}.manager-list{display:grid;grid-template-columns:repeat(2,1fr);gap:9px;margin:16px 0}.manager-item{border:1px solid var(--line);border-radius:10px;padding:9px;display:flex;align-items:center;gap:8px}.manager-item span{flex:1;font-size:13px}.manager-item button{border:0;background:transparent;color:var(--red);cursor:pointer}.new-medal-form{display:grid;grid-template-columns:1.3fr .5fr .9fr auto;gap:8px;border-top:1px solid var(--line);padding-top:16px}.redeem-modal{max-width:430px;text-align:center}.redeem-icon{font-size:41px}.redeem-modal p{color:var(--muted);line-height:1.6}.redeem-modal label{text-align:left;display:block;font-size:13px;font-weight:700;margin:17px 0 9px}.redeem-modal input{display:block;width:100%;margin-top:6px}.redeem-modal small{display:block;color:var(--muted);font-size:11px;line-height:1.4;margin:9px 0 16px}.feedback{font-size:13px;margin-top:10px;color:var(--red)}.settle-modal{text-align:center;max-width:510px}.confetti{color:var(--gold);font-size:27px;letter-spacing:15px}.settle-ranking{margin:20px 0;text-align:left}.settle-row{display:flex;justify-content:space-between;padding:11px;border-bottom:1px dashed var(--line)}
@media(max-width:1100px){.classroom-grid{grid-template-columns:1fr 1fr}.rank-panel{grid-column:span 2}.topbar{padding:0 22px}.shop-grid{grid-template-columns:repeat(2,1fr)}}@media(max-width:720px){.topbar{height:auto;padding:12px 16px;flex-wrap:wrap;gap:12px}.brand{min-width:auto}.teacher-chip{display:none}nav{order:3;flex-basis:100%;overflow:auto}.nav-btn{white-space:nowrap;padding:8px 10px}main{padding:22px 15px}.class-header,.page-heading{align-items:flex-start;gap:14px;flex-direction:column}.classroom-grid,.settings-grid,.shop-layout,.report-cards{grid-template-columns:1fr}.rank-panel{grid-column:auto}.student-grid{grid-template-columns:repeat(4,1fr)}.lesson-title{display:block;margin:7px 0 0}.adventure-progress{align-items:flex-start;flex-direction:column;gap:8px}.progress-track{width:100%}.shop-grid{grid-template-columns:1fr 1fr}.new-medal-form{grid-template-columns:1fr 1fr}.new-medal-form .primary-btn{grid-column:span 2}.mystery-cards{gap:8px}.modal{padding:23px 17px}.manager-list{grid-template-columns:1fr}}
.batch-row{display:flex;align-items:center;gap:16px;margin:-4px 0 12px;font-size:13px;color:var(--muted)}.batch-row input{accent-color:var(--purple)}.student-check{accent-color:var(--purple)}.shop-item-form{display:grid;grid-template-columns:1.2fr .45fr .6fr .8fr .8fr 1.5fr auto auto;gap:8px;border-top:1px solid var(--line);padding-top:16px}.shop-item-form input,.shop-item-form select{min-width:0;border:1px solid var(--line);border-radius:10px;padding:10px;font:inherit}.parent-view{min-height:100vh;padding:48px 20px;background:linear-gradient(145deg,#f4edff,#fff7e8)}.parent-card{max-width:760px;margin:auto;background:#fffdf8;border:1px solid var(--line);border-radius:22px;padding:30px;box-shadow:var(--shadow)}.parent-card h1{margin:10px 0}.parent-card>p{color:var(--muted);line-height:1.6}.parent-summary{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin:24px 0}.parent-summary div{background:#f5f0ff;border-radius:13px;padding:14px}.parent-summary small,.parent-summary b{display:block}.parent-summary small{color:var(--muted);font-size:12px}.parent-summary b{font-size:20px;margin-top:4px;color:var(--purple)}.parent-ranking>div{display:flex;align-items:center;gap:12px;padding:12px 5px;border-bottom:1px dashed var(--line)}.parent-ranking span{width:24px;text-align:center;color:var(--muted);font-weight:700}.parent-ranking b{flex:1}.parent-ranking small{color:var(--muted)}.parent-ranking strong{color:#b7770a}@media(max-width:720px){.shop-item-form{grid-template-columns:1fr 1fr}.shop-item-form input:nth-of-type(4),.shop-item-form .primary-btn,.shop-item-form .secondary-btn{grid-column:span 2}.parent-summary{grid-template-columns:1fr}.parent-card{padding:22px}}
.class-header h1 #lesson-select{font-size:15px;color:var(--muted);font-weight:500;border:0;background:transparent;outline:0;margin-left:12px;padding:2px;cursor:pointer}.share-modal{text-align:center;max-width:420px}.share-modal p{color:var(--muted);line-height:1.6}.share-icon{font-size:36px;color:var(--purple)}#qrcode{display:grid;place-items:center;margin:14px auto;padding:10px;background:#fff;width:max-content;min-width:160px;min-height:160px;border-radius:14px;border:1px solid var(--line)}#qrcode img{display:block}.share-modal small{font-size:11px;color:var(--muted);line-height:1.5;display:block}.image-upload{border:1px dashed #bfaee2;border-radius:10px;padding:9px;color:var(--purple);font-size:12px;font-weight:700;cursor:pointer;white-space:nowrap}.shop-visual img{max-width:100%;max-height:100%;object-fit:cover;border-radius:11px}.shop-item-form{align-items:center}
.cloud-login-btn{font:inherit;cursor:pointer}.cloud-login-btn:hover{border-color:#d7bd72}
.gender-select{border:1px solid var(--line);background:#fff;border-radius:8px;padding:5px;color:var(--ink);font:inherit;font-size:12px}.glory-btn{width:100%;margin-top:14px;border:0;border-radius:11px;background:linear-gradient(135deg,#f5b437,#ffdc75);padding:11px;color:#6e4811;font-weight:800;cursor:pointer}.glory-modal{max-width:800px;width:100%;min-height:510px;border-radius:26px;position:relative;overflow:hidden;padding:32px;background:radial-gradient(circle at 50% 0,#7961d5,#352260 67%,#221540);color:#fff;text-align:center;box-shadow:0 25px 65px rgba(25,15,56,.5)}.glory-heading{position:relative;z-index:2}.glory-heading h2{font-size:32px;margin:8px 0}.glory-heading p{margin:0;color:#e8dcff}.firework{position:absolute;color:#ffd857;font-size:48px;font-style:normal;animation:burst 1.8s infinite}.f1{left:8%;top:14%}.f2{right:10%;top:12%;animation-delay:.5s}.f3{right:20%;bottom:26%;animation-delay:1s}@keyframes burst{50%{transform:scale(1.45) rotate(70deg);opacity:.3}}.podium-stage{height:320px;margin:auto 0;display:flex;align-items:end;justify-content:center;gap:20px;position:relative;z-index:2;padding-top:58px}.winner{display:flex;flex-direction:column;align-items:center;justify-content:end;height:100%}.winner-1{order:2}.winner-2{order:1}.winner-3{order:3}.cartoon{height:154px;width:104px;position:relative;display:flex;flex-direction:column;align-items:center;justify-content:end}.face{width:76px;height:70px;border-radius:46% 46% 42% 42%;background:#ffd1ae;color:#5b3d35;display:grid;place-items:center;font-size:17px;z-index:2}.hair{position:absolute;top:18px;width:78px;height:36px;background:#5a3b32;border-radius:50px 50px 18px 18px;z-index:3}.cartoon.girl .hair{height:58px;border-radius:44px 44px 23px 23px;background:#4a3040}.body{height:70px;width:88px;background:#5da5e5;border-radius:24px 24px 7px 7px;margin-top:-4px;z-index:1;display:grid;place-items:center}.girl .body{background:#e985ac}.body b{font-size:13px;background:#fffbe8;color:#44345f;padding:4px 7px;border-radius:6px;max-width:82px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.podium{width:142px;background:linear-gradient(90deg,#d7a340,#ffe179,#c9852d);color:#704413;display:flex;flex-direction:column;justify-content:center;box-shadow:inset 0 3px rgba(255,255,255,.45)}.podium strong{font-size:43px;line-height:1}.podium small{font-weight:bold;margin-top:6px}.podium-1{height:132px}.podium-2{height:96px}.podium-3{height:74px}.glory-footer{position:relative;z-index:2;color:#ffe797;font-weight:bold;margin-top:12px}@media(max-width:620px){.glory-modal{min-height:450px;padding:25px 12px}.podium-stage{gap:5px}.podium{width:94px}.cartoon{transform:scale(.82);transform-origin:bottom}.glory-heading h2{font-size:26px}}
.podium-stage{display:grid;grid-template-columns:repeat(3,1fr);gap:0}.winner-1{grid-column:2;order:initial}.winner-2{grid-column:1;order:initial}.winner-3{grid-column:3;order:initial}.firework{font-size:78px;bottom:-35px;top:auto;z-index:1;animation:rocket 2.2s ease-out infinite}.f1{left:8%}.f2{right:8%;animation-delay:.7s}.f3{left:44%;animation-delay:1.35s}@keyframes rocket{0%{transform:translateY(0) scale(.25);opacity:0}25%{opacity:1}62%{transform:translateY(-380px) scale(1.35) rotate(100deg);opacity:1}78%{transform:translateY(-405px) scale(2.2) rotate(160deg);opacity:.75}100%{transform:translateY(-415px) scale(2.8) rotate(210deg);opacity:0}}.cartoon{height:174px;width:126px;animation:cheer .75s ease-in-out infinite alternate}.face{width:96px;height:90px;border-radius:47% 47% 45% 45%;background:#ffb59f;position:relative;z-index:3}.hair{top:17px;width:101px;height:47px;background:#78382f;border-radius:62px 62px 24px 24px;z-index:5}.cartoon.girl .hair{width:110px;height:82px;border-radius:62px 62px 28px 28px;background:#5b302b}.ear{position:absolute;top:72px;width:24px;height:31px;border-radius:50%;background:#ffad99;z-index:2}.ear-l{left:8px}.ear-r{right:8px}.eye{position:absolute;top:36px;width:25px;height:31px;border-radius:50%;background:#422522;border:3px solid #fff;box-shadow:inset -5px -4px 0 #281412}.eye:after{content:"";position:absolute;width:8px;height:10px;border-radius:50%;background:#fff;left:4px;top:4px}.eye-l{left:16px}.eye-r{right:16px}.cheek{position:absolute;width:18px;height:9px;border-radius:50%;background:#f48d8a;bottom:16px}.cheek-l{left:9px}.cheek-r{right:9px}.smile{position:absolute;width:26px;height:13px;border-radius:0 0 25px 25px;background:#d85e5f;bottom:12px;left:35px}.body{height:74px;width:100px;background:#edf5ff;border:5px solid #fff;border-radius:26px 26px 8px 8px;margin-top:-10px;z-index:2}.girl .body{background:#fff0f4}.body:before{content:"";position:absolute;top:139px;width:28px;height:22px;border:solid #2475c8;border-width:0 5px 5px 0;transform:rotate(45deg);z-index:3}.girl .body:before{border-color:#e95488}.arm{position:absolute;top:126px;width:22px;height:74px;border-radius:30px;background:#ffb59f;z-index:1;transform-origin:top}.arm-l{left:5px;transform:rotate(-65deg);animation:wave .55s ease-in-out infinite alternate}.arm-r{right:5px;transform:rotate(65deg);animation:wave .55s ease-in-out infinite alternate-reverse}@keyframes cheer{to{transform:translateY(-8px)}}@keyframes wave{to{transform:rotate(-92deg)}}.podium{width:148px}.winner.empty{visibility:hidden}
.cartoon .hair,.cartoon .face,.cartoon .ear{display:none}.cartoon{height:190px;width:142px}.reference-head{position:absolute;top:0;left:8px;width:126px;height:125px;border-radius:52% 52% 46% 46%;background-repeat:no-repeat;background-color:#fda098;background-size:178px auto;background-position:center 31%;z-index:4;box-shadow:0 3px 0 rgba(82,39,43,.15)}.cartoon.boy .reference-head{background-image:url('./assets/boy-character.png')}.cartoon.girl .reference-head{background-image:url('./assets/girl-character.png');background-size:172px auto;background-position:center 30%}.cartoon .body{position:absolute;top:112px;left:19px;height:78px;width:104px;margin:0;background:#eef4ff;border:4px solid #fff;border-radius:28px 28px 9px 9px;z-index:2}.cartoon.girl .body{background:#fff0f4}.cartoon .body:before{top:3px}.cartoon .arm{top:126px;z-index:1}.cartoon .arm-l{left:6px}.cartoon .arm-r{right:6px}.cartoon .body b{position:relative;z-index:5}.podium-stage{padding-top:42px}
.hidden{display:none!important}.login-landing{min-height:100vh;display:grid;place-items:center;padding:28px;background:radial-gradient(circle at 20% 20%,#f9e5b9 0,transparent 25%),radial-gradient(circle at 78% 82%,#d5c6ff 0,transparent 30%),linear-gradient(145deg,#49377e,#755ec2 55%,#f3bd72)}.login-card{width:min(100%,440px);background:rgba(255,253,248,.96);padding:34px;border-radius:27px;box-shadow:0 24px 70px rgba(29,18,58,.34);position:relative;z-index:1}.login-brand{margin-bottom:32px}.login-copy h1{font-size:31px;line-height:1.2;margin:8px 0 10px}.login-copy p{color:var(--muted);line-height:1.6;margin:0 0 22px}.login-card label{display:block;font-weight:700;font-size:13px;margin:14px 0 0}.login-card input{width:100%;margin-top:7px;border:1px solid var(--line);border-radius:11px;padding:12px;font:inherit;outline-color:var(--purple)}.login-submit{width:100%;margin-top:22px;padding:13px}.login-card small{display:block;text-align:center;margin-top:14px;color:var(--muted)}.login-scene{position:absolute;inset:0;overflow:hidden;pointer-events:none}.login-scene span{position:absolute;color:#fff6c6;font-size:34px;animation:twinkle 2.5s infinite}.login-scene span:nth-child(1){top:12%;left:17%}.login-scene span:nth-child(2){top:29%;right:18%;animation-delay:.6s}.login-scene span:nth-child(3){bottom:15%;left:26%;animation-delay:1.2s}@keyframes twinkle{50%{opacity:.3;transform:scale(.7) rotate(35deg)}}
.local-demo-btn{width:100%;margin-top:10px}
.admin-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:18px}.admin-summary{grid-column:1/-1;display:flex;gap:18px;padding:18px}.admin-summary>div{flex:1;background:#f8f5ff;border-radius:14px;padding:15px}.admin-summary small{display:block;color:var(--muted)}.admin-summary strong{display:block;font-size:24px;margin-top:6px}.admin-form{padding:22px}.admin-form h2{margin:0 0 6px}.admin-form p{font-size:13px;color:var(--muted);line-height:1.5}.admin-form form,.admin-form textarea{display:grid;width:100%;box-sizing:border-box;gap:10px;margin-top:14px}.admin-form input,.admin-form textarea{font:inherit;padding:11px;border:1px solid var(--line);border-radius:10px}.admin-form textarea{margin-bottom:10px;resize:vertical}.admin-list{grid-column:1/-1;padding:22px}.teacher-account-row{display:grid;grid-template-columns:1.4fr 1fr .7fr auto;align-items:center;gap:12px;padding:12px 0;border-bottom:1px solid var(--line)}.teacher-account-row small{color:var(--muted)}@media(max-width:760px){.admin-grid{grid-template-columns:1fr}.admin-summary{grid-column:auto}.admin-list{grid-column:auto}.teacher-account-row{grid-template-columns:1fr 1fr}}
.report-section{margin-bottom:34px}.section-heading{margin:0 0 15px}.section-heading h2{font-size:22px;margin:5px 0}.section-heading p{margin:0;color:var(--muted);font-size:14px}.lesson-record-list{display:grid;gap:8px}.lesson-record-row{display:grid;grid-template-columns:80px 1fr 1.1fr auto;align-items:center;gap:10px;border:1px solid var(--line);border-radius:11px;padding:11px}.lesson-record-row small{color:var(--muted);font-size:12px}.lesson-record-row b{font-size:14px}.lesson-record-row strong{color:#b7770a;font-size:14px}@media(max-width:720px){.lesson-record-row{grid-template-columns:1fr auto}.lesson-record-row small{grid-column:span 1}}

/* 荣耀时刻 2.0：游戏化颁奖舞台 */
.glory-modal{isolation:isolate;position:relative;display:flex;flex-direction:column;box-sizing:border-box;max-width:1040px;min-height:650px;max-height:90vh;padding:34px 48px 24px;border:1px solid rgba(255,234,154,.45);background:radial-gradient(ellipse at 50% 13%,#7656d6 0%,#3c236e 42%,#160e35 100%);box-shadow:0 34px 90px rgba(17,9,43,.72);overflow:hidden}
.glory-modal:before{content:"";position:absolute;inset:0;pointer-events:none;background:linear-gradient(100deg,rgba(255,255,255,.06),transparent 25%,transparent 70%,rgba(255,222,119,.08));mix-blend-mode:screen}
.glory-close{position:fixed;top:18px;right:18px;z-index:60;width:34px;height:34px;border:1px solid rgba(255,255,255,.34);border-radius:50%;background:rgba(24,13,62,.4);color:#fff;font-size:22px;line-height:1;display:grid;place-items:center;cursor:pointer;backdrop-filter:blur(8px)}.glory-close:hover{background:rgba(255,255,255,.18)}.glory-controls{position:absolute;right:68px;top:25px;z-index:21;display:flex;gap:8px}.glory-control{border:1px solid rgba(255,255,255,.34);border-radius:99px;background:rgba(24,13,62,.4);color:#fff;padding:7px 11px;font:600 12px inherit;cursor:pointer;backdrop-filter:blur(8px)}.glory-control:hover{background:rgba(255,255,255,.18)}
.glory-sky{position:absolute;inset:0;z-index:-1;overflow:hidden;pointer-events:none}.glory-sky:before{content:"";position:absolute;inset:0;background-image:radial-gradient(rgba(255,255,255,.8) 1px,transparent 1.5px),radial-gradient(rgba(255,222,118,.55) 1px,transparent 1.5px);background-size:47px 47px,83px 83px;background-position:5px 10px,20px 35px;opacity:.38}.star{position:absolute;color:#ffe58a;text-shadow:0 0 14px #ffd85b;font-size:26px;animation:gloryTwinkle 1.8s ease-in-out infinite alternate}.star-a{left:14%;top:20%;animation-delay:.3s}.star-b{right:15%;top:27%;font-size:20px;animation-delay:1s}.star-c{left:29%;top:8%;font-size:18px;animation-delay:1.5s}.spotlight{position:absolute;bottom:-8%;width:34%;height:85%;opacity:.34;filter:blur(2px);transform-origin:bottom;clip-path:polygon(45% 0,55% 0,100% 100%,0 100%);background:linear-gradient(180deg,rgba(255,247,187,.95),rgba(255,224,92,.03));animation:spotMove 5s ease-in-out infinite alternate}.light-left{left:-5%;transform:rotate(17deg)}.light-right{right:-5%;transform:rotate(-17deg);animation-delay:-2s}
.pyro{position:absolute;bottom:-20px;width:26px;height:190px;background:linear-gradient(to top,rgba(255,217,82,0),#ffdb62 26%,#fff8cc 50%,transparent 78%);filter:drop-shadow(0 0 12px #ffbf3e);transform-origin:bottom;animation:pyroShoot 3.6s cubic-bezier(.12,.78,.31,1) infinite}.pyro:after{content:"✦ ✦ ✦ ✦ ✦";position:absolute;top:-45px;left:-51px;width:125px;color:#ffe46c;font-size:25px;letter-spacing:10px;line-height:25px;text-shadow:0 0 12px #ffb827;opacity:0;animation:pyroBloom 3.6s ease-out infinite}.pyro-a{left:9%;animation-delay:.35s}.pyro-b{left:49%;animation-delay:1.5s}.pyro-c{right:9%;animation-delay:2.5s}
.glory-heading{z-index:5;animation:headingIn .7s both}.glory-kicker{font-size:10px;font-weight:800;letter-spacing:.18em;color:#ffe18a}.glory-heading h2{font-size:44px;letter-spacing:.12em;text-shadow:0 4px 0 #341d6c,0 0 28px rgba(255,223,107,.5)}.glory-heading p{font-size:15px}.glory-announce{position:relative;z-index:6;margin:13px auto 0;min-height:24px;font-size:15px;font-weight:700;color:#ffe7a5;letter-spacing:.08em;opacity:0;transform:translateY(10px);transition:.45s}.glory-modal.is-playing .glory-announce{opacity:1;transform:translateY(0);transition-delay:3.25s}
.podium-stage{height:390px;margin:-8px auto 0;max-width:800px;align-items:end;z-index:7;padding:54px 20px 0}.winner{position:relative;overflow:visible;opacity:0;transform:translateY(80px) scale(.7);filter:blur(5px)}.glory-modal.is-playing .winner{animation:winnerEnter .72s cubic-bezier(.18,.9,.25,1.3) forwards}.glory-modal.is-playing .winner-3{animation-delay:.45s}.glory-modal.is-playing .winner-2{animation-delay:1.45s}.glory-modal.is-playing .winner-1{animation-delay:2.45s}.winner-1{z-index:5}.winner-2,.winner-3{z-index:4}.winner.empty{opacity:.2;visibility:visible;filter:none;transform:none}.winner.empty .podium{opacity:.35}
.cartoon{height:224px;width:160px;animation:none;transform-origin:50% 100%}.glory-modal.is-playing .winner-1 .cartoon{animation:heroCelebrate 1.15s ease-in-out 3.12s infinite alternate}.glory-modal.is-playing .winner-2 .cartoon,.glory-modal.is-playing .winner-3 .cartoon{animation:sideCelebrate 1.35s ease-in-out 2.1s infinite alternate}.reference-head{left:12px;width:136px;height:136px;border:4px solid rgba(255,255,255,.86);border-radius:50% 50% 46% 46%;background-size:194px auto;background-position:center 30%;box-shadow:0 9px 0 rgba(57,29,77,.22),0 10px 25px rgba(0,0,0,.3)}.cartoon.girl .reference-head{background-size:188px auto;background-position:center 28%}.cartoon .body{top:124px;left:19px;width:122px;height:98px;border:4px solid #fff;border-radius:32px 32px 13px 13px;background:linear-gradient(135deg,#e7f3ff,#98c8fb);box-shadow:inset 0 7px 0 rgba(255,255,255,.4),0 6px 0 rgba(38,83,144,.25)}.cartoon.girl .body{background:linear-gradient(135deg,#ffeaf1,#f58ab6);box-shadow:inset 0 7px 0 rgba(255,255,255,.42),0 6px 0 rgba(129,43,85,.24)}.cartoon .body:before{content:"";top:6px;left:43px;width:31px;height:24px;border-width:0 5px 5px 0;border-color:#2778d1}.cartoon.girl .body:before{border-color:#ea4f8c}.cartoon .body:after{content:"";position:absolute;left:18px;right:18px;bottom:10px;height:17px;border-radius:50%;background:rgba(21,74,142,.16)}.cartoon .arm{top:132px;width:25px;height:96px;background:#ffb59f;box-shadow:inset 4px 0 rgba(255,255,255,.17);z-index:1}.cartoon .arm-l{left:4px;transform:rotate(-76deg)}.cartoon .arm-r{right:4px;transform:rotate(76deg)}.glory-modal.is-playing .arm-l{animation:armWaveLeft .48s ease-in-out 3.2s infinite alternate}.glory-modal.is-playing .arm-r{animation:armWaveRight .48s ease-in-out 3.2s infinite alternate}.cartoon .body b{display:inline-block;max-width:105px;padding:6px 9px;border:2px solid #fff;font-size:14px;color:#382856;background:linear-gradient(#fffdf0,#ffe9a5);box-shadow:0 3px 0 #c78c34}
.podium{position:relative;width:178px;border-radius:10px 10px 3px 3px;background:linear-gradient(90deg,#8c5218 0%,#e7ad3e 12%,#ffe792 48%,#d28b25 79%,#75400f 100%);border:2px solid rgba(255,244,188,.75);box-shadow:inset 0 9px rgba(255,255,255,.28),inset 0 -14px rgba(74,33,5,.2),0 16px 20px rgba(8,3,27,.43);overflow:hidden}.podium:before{content:"";position:absolute;inset:0;background:repeating-linear-gradient(90deg,transparent 0 18px,rgba(255,255,255,.13) 19px 21px);mix-blend-mode:screen}.podium strong,.podium small{position:relative;z-index:1}.podium strong{font-size:61px;text-shadow:0 3px #fff3ac}.podium small{font-size:14px}.podium-1{height:155px}.podium-2{height:116px}.podium-3{height:91px}.stage-floor{position:absolute;left:9%;right:9%;bottom:57px;height:100px;z-index:2;border-radius:50%;background:radial-gradient(ellipse,rgba(255,222,106,.64),rgba(164,94,255,.16) 42%,transparent 71%);filter:blur(3px)}.glory-footer{position:absolute;z-index:8;left:0;right:0;bottom:6px;font-size:13px;letter-spacing:.12em;color:#ffe797;opacity:0;animation:footerIn .6s ease forwards 3.7s}
@keyframes gloryTwinkle{to{transform:scale(1.45) rotate(25deg);opacity:.3}}@keyframes spotMove{to{transform:rotate(-12deg) scaleX(1.25);opacity:.55}}@keyframes pyroShoot{0%,18%{transform:scaleY(.03);opacity:0}27%{transform:scaleY(1);opacity:1}47%{transform:scaleY(1.12);opacity:.7}59%,100%{transform:scaleY(1.2);opacity:0}}@keyframes pyroBloom{0%,28%{transform:scale(.2);opacity:0}40%{transform:scale(1.7) rotate(20deg);opacity:1}59%,100%{transform:scale(2.3) rotate(45deg);opacity:0}}@keyframes headingIn{from{opacity:0;transform:translateY(-24px) scale(.92)}to{opacity:1;transform:none}}@keyframes winnerEnter{60%{filter:none}100%{opacity:1;transform:translateY(0) scale(1);filter:none}}@keyframes heroCelebrate{to{transform:translateY(-12px) rotate(-2deg) scale(1.035)}}@keyframes sideCelebrate{to{transform:translateY(-7px) rotate(2deg)}}@keyframes armWaveLeft{to{transform:rotate(-112deg)}}@keyframes armWaveRight{to{transform:rotate(112deg)}}@keyframes footerIn{to{opacity:1;transform:translateY(0)}}
@media(max-width:700px){.glory-modal{min-height:545px;padding:42px 8px 18px}.glory-controls{right:45px;top:12px}.glory-control{padding:5px 7px;font-size:10px}.glory-heading h2{font-size:29px}.podium-stage{height:328px;padding:43px 0 0}.cartoon{transform:scale(.72);transform-origin:bottom}.podium{width:105px}.podium-1{height:130px}.podium-2{height:98px}.podium-3{height:76px}.podium strong{font-size:44px}.stage-floor{bottom:42px}.glory-footer{font-size:12px}}

/* 兼容大屏浏览器：人物和奖台在动画受限时仍然始终显示 */
.glory-modal .winner{opacity:1;transform:none;filter:none}.glory-modal.is-playing .winner{opacity:0;transform:translateY(80px) scale(.7);filter:blur(5px);animation-fill-mode:both}@keyframes winnerEnter{0%{opacity:0;transform:translateY(80px) scale(.7);filter:blur(5px)}60%{filter:none}100%{opacity:1;transform:translateY(0) scale(1);filter:none}}

/* 大屏展示节奏：两秒内完成三位同学登台，不留空舞台 */
.glory-modal.is-playing .winner-3{animation-delay:.1s}.glory-modal.is-playing .winner-2{animation-delay:.62s}.glory-modal.is-playing .winner-1{animation-delay:1.14s}.glory-modal.is-playing .winner-1 .cartoon{animation-delay:1.8s}.glory-modal.is-playing .winner-2 .cartoon,.glory-modal.is-playing .winner-3 .cartoon{animation-delay:1.35s}.glory-modal.is-playing .arm-l,.glory-modal.is-playing .arm-r{animation-delay:1.9s}.glory-modal.is-playing .glory-announce{transition-delay:1.7s}

/* 真实 VRoid 领奖台：网页直接渲染模型，避免平面头像与纸片手臂。 */
.ceremony-3d{position:absolute;inset:135px 0 35px;z-index:7;display:none;overflow:visible;pointer-events:none}.ceremony-3d.is-ready{display:block}#ceremony-3d.is-ready~#podium-stage,#ceremony-3d.is-ready~.stage-floor{display:none!important}.three-active .podium-stage,.three-active .stage-floor{display:none!important}.three-active .glory-footer{position:absolute;z-index:11;left:0;right:0;bottom:14px}.three-active .glory-announce{position:relative;z-index:12}.three-active .glory-heading{position:relative;z-index:12}.three-active .glory-controls,.three-active .glory-close{z-index:22}.ceremony-3d canvas{display:block;width:100%;height:100%}.three-loading{position:absolute;left:50%;top:48%;transform:translate(-50%,-50%);padding:12px 18px;border:1px solid rgba(255,235,151,.65);border-radius:999px;background:rgba(34,17,78,.78);box-shadow:0 0 26px rgba(255,209,84,.38);color:#ffea9d;font-size:14px;font-weight:800;letter-spacing:.08em;white-space:nowrap}.three-nameplates{position:absolute;inset:0;display:grid;grid-template-columns:repeat(3,1fr);align-items:end;padding:0 11% 48px;gap:2px}.three-nameplate{align-self:end;justify-self:center;min-width:118px;padding:7px 10px 6px;border:2px solid rgba(255,245,196,.88);border-radius:10px;background:linear-gradient(145deg,#fffceb,#f4c85e);box-shadow:0 5px 0 rgba(87,42,7,.56),0 12px 20px rgba(14,6,42,.45);color:#43255e;text-align:center;transform:translateY(12px);opacity:0;animation:threePlateIn .5s cubic-bezier(.18,.9,.3,1.32) forwards 1.65s}.three-nameplate.rank-1{grid-column:2;grid-row:1;margin-bottom:70px;animation-delay:1.9s}.three-nameplate.rank-2{grid-column:1;grid-row:1;margin-bottom:45px;animation-delay:1.35s}.three-nameplate.rank-3{grid-column:3;grid-row:1;margin-bottom:32px;animation-delay:1.55s}.three-nameplate b,.three-nameplate span,.three-nameplate small{display:block}.three-nameplate b{font-size:10px;color:#a25c12;letter-spacing:.08em}.three-nameplate span{font-size:15px;font-weight:900;line-height:1.35}.three-nameplate small{font-size:10px;font-weight:700;color:#7d4b19}@keyframes threePlateIn{to{opacity:1;transform:translateY(0)}}@media(max-width:700px){.ceremony-3d{inset:122px 0 31px}.three-nameplates{padding:0 1% 34px}.three-nameplate{min-width:78px;padding:5px 4px}.three-nameplate span{font-size:11px}.three-nameplate.rank-1{margin-bottom:50px}.three-nameplate.rank-2{margin-bottom:32px}.three-nameplate.rank-3{margin-bottom:23px}}
/* 3D ceremony polish */
.three-nameplates{padding:0 10% 158px;pointer-events:none}.three-nameplate{min-width:108px;padding:6px 10px 5px;border-radius:12px}.three-nameplate b{display:none}.three-nameplate span{font-size:16px;line-height:1.2}.three-nameplate small{font-size:11px;margin-top:3px}.three-nameplate.rank-1{margin-bottom:28px}.three-nameplate.rank-2{margin-bottom:12px}.three-nameplate.rank-3{margin-bottom:4px}.pyro{animation-duration:4.15s}.pyro:after{animation-duration:4.15s}.pyro-a{left:10%;height:300px;animation-delay:.1s}.pyro-b{left:48%;height:220px;animation-delay:1.15s}.pyro-c{right:9%;height:145px;animation-delay:2.35s}.pyro:before{content:"";position:absolute;left:50%;bottom:9px;width:7px;height:7px;border-radius:50%;background:#fff9cd;box-shadow:0 -36px 0 #ffd25a,0 -70px 0 #fff6af;transform:translateX(-50%);filter:drop-shadow(0 0 8px #ffbd39);animation:rocketCore 4.15s ease-out infinite}.pyro-b:before{animation-delay:1.15s}.pyro-c:before{animation-delay:2.35s}@keyframes rocketCore{0%,20%{opacity:0;transform:translate(-50%,0) scale(.4)}34%{opacity:1}62%{opacity:1;transform:translate(-50%,-230px) scale(1)}85%,100%{opacity:0;transform:translate(-50%,-265px) scale(1.35)}}@media(max-width:700px){.three-nameplates{padding-bottom:118px}.three-nameplate{min-width:76px;padding:5px 6px}.three-nameplate span{font-size:12px}.three-nameplate.rank-1{margin-bottom:18px}.three-nameplate.rank-2{margin-bottom:8px}.three-nameplate.rank-3{margin-bottom:4px}}
/* 3D 舞台从标题下方开始，给标题留出约 110px 专属区域，避免人物头部
   被“荣耀时刻 / 本节荣耀榜”文字遮挡；底部仍保留 35px footer。 */
.three-active .ceremony-3d{inset:110px 0 35px}
@media(max-width:700px){.three-active .ceremony-3d{inset:140px 0 31px}}
.avatar.has-avatar-image{overflow:hidden;padding:0;background:var(--avatar-bg,#eee8ff)}.avatar.has-avatar-image img{width:100%;height:100%;object-fit:cover;display:block}.big-avatar.has-avatar-image{overflow:hidden;padding:0}.big-avatar.has-avatar-image img{width:100%;height:100%;object-fit:cover;display:block}
/* 动态并列领奖：姓名牌按每位获奖者的舞台坐标定位，不再被三列网格叠在一起。 */
.three-nameplates{display:block!important;padding:0!important;inset:0!important}
.three-nameplate{position:absolute;display:block;transform:translate(-50%,12px);margin:0!important;justify-self:auto!important;align-self:auto!important;z-index:30}
.three-nameplate.is-tied{box-sizing:border-box;width:84px;min-width:84px;padding:5px 3px 4px;border-width:1.5px}
.three-nameplate.is-tied span{font-size:13px;line-height:1.2;white-space:nowrap}
.three-nameplate.is-tied small{font-size:10px;margin-top:2px;white-space:nowrap}
.three-nameplate.rank-1,.three-nameplate.rank-2,.three-nameplate.rank-3{grid-column:auto;grid-row:auto}
@media(max-width:700px){.three-nameplate{min-width:76px;font-size:11px}}

/* Final ceremony overlay normalization: keep plates visible above the WebGL canvas.
   This intentionally repeats the visual surface styles so later responsive rules
   cannot make tied plates transparent or collapse their layout. */
.three-nameplates{position:absolute!important;inset:0!important;display:block!important;padding:0!important;z-index:40!important;pointer-events:none!important}
.glory-asset-fallback{display:none}.ceremony-3d.is-portrait-fallback canvas,.ceremony-3d.is-portrait-fallback .three-nameplates{display:none!important}.ceremony-3d.is-portrait-fallback .glory-asset-fallback{position:absolute;inset:0;display:grid;grid-template-columns:1fr 1.2fr 1fr;align-items:end;gap:clamp(8px,2vw,32px);padding:30px clamp(22px,10vw,180px) 8px;box-sizing:border-box;pointer-events:none}.asset-fallback-rank{height:100%;display:flex;min-width:0;flex-direction:column;justify-content:end;align-items:center}.asset-fallback-people{height:72%;display:flex;justify-content:center;align-items:end;gap:clamp(0px,1vw,12px);min-width:0}.asset-fallback-person{position:relative;display:flex;align-items:end;justify-content:center;min-width:0;height:100%;flex:1}.asset-fallback-person img{display:block;width:min(190px,18vw);height:100%;object-fit:contain;filter:drop-shadow(0 8px 9px rgba(11,4,32,.36));image-rendering:auto}.asset-fallback-person div{position:absolute;left:50%;bottom:3%;transform:translateX(-50%);min-width:70px;padding:5px 8px;border:1px solid #fff1bd;border-radius:10px;background:linear-gradient(145deg,#fffcec,#f5cd65);box-shadow:0 3px 0 rgba(87,42,7,.55);color:#43255e;text-align:center;white-space:nowrap}.asset-fallback-person b,.asset-fallback-person small{display:block}.asset-fallback-person b{font-size:13px}.asset-fallback-person small{margin-top:2px;color:#7d4b19;font-size:10px;font-weight:800}.asset-fallback-podium{display:grid;place-items:center;width:100%;height:22%;min-height:66px;border:2px solid rgba(255,244,188,.75);border-radius:11px 11px 3px 3px;background:linear-gradient(90deg,#8c5218,#e7ad3e 13%,#ffe792 48%,#d28b25 79%,#75400f);box-shadow:inset 0 8px rgba(255,255,255,.27),inset 0 -13px rgba(74,33,5,.2),0 12px 20px rgba(8,3,27,.43);color:#704111}.asset-fallback-rank-1 .asset-fallback-podium{height:31%;min-height:90px}.asset-fallback-rank-2 .asset-fallback-podium{height:25%;min-height:76px}.asset-fallback-podium strong{font-size:clamp(38px,4vw,68px);text-shadow:0 3px #fff3ac}@media(max-width:700px){.ceremony-3d.is-portrait-fallback .glory-asset-fallback{padding:24px 5px 6px;gap:4px}.asset-fallback-person img{width:30vw}.asset-fallback-person div{min-width:56px;padding:4px}.asset-fallback-person b{font-size:10px}.asset-fallback-podium{min-height:54px}.asset-fallback-rank-1 .asset-fallback-podium{min-height:70px}}
.three-nameplate{position:absolute!important;display:block!important;box-sizing:border-box!important;min-width:108px!important;padding:7px 10px 6px!important;border:2px solid rgba(255,245,196,.92)!important;border-radius:12px!important;background:linear-gradient(145deg,#fffceb 0%,#f4c85e 100%)!important;box-shadow:0 5px 0 rgba(87,42,7,.56),0 12px 20px rgba(14,6,42,.45)!important;color:#43255e!important;text-align:center!important;transform:translate(-50%,-108%)!important;opacity:1!important;visibility:visible!important;z-index:41!important}
.three-nameplate b,.three-nameplate span,.three-nameplate small{display:block!important}
.three-nameplate span{font-size:15px!important;font-weight:900!important;line-height:1.25!important;white-space:nowrap!important}
.three-nameplate small{font-size:10px!important;font-weight:700!important;color:#7d4b19!important;margin-top:3px!important;white-space:nowrap!important}
.three-nameplate.is-tied{width:var(--plate-width,84px)!important;min-width:var(--plate-width,84px)!important;padding:5px 3px 4px!important;border-width:1.5px!important}
.three-nameplate.is-tied span{font-size:13px!important;line-height:1.2!important}
.three-nameplate.is-tied small{font-size:10px!important;margin-top:2px!important}
.three-nameplate[data-count="4"],.three-nameplate[data-count="5"],.three-nameplate[data-count="6"],.three-nameplate[data-count="7"],.three-nameplate[data-count="8"],.three-nameplate[data-count="9"],.three-nameplate[data-count="10"]{width:var(--plate-width,70px)!important;min-width:var(--plate-width,70px)!important;padding:5px 3px 4px!important}
.three-nameplate[data-count="4"] span,.three-nameplate[data-count="5"] span,.three-nameplate[data-count="6"] span,.three-nameplate[data-count="7"] span,.three-nameplate[data-count="8"] span,.three-nameplate[data-count="9"] span,.three-nameplate[data-count="10"] span{font-size:11px!important;letter-spacing:-.04em}
.avatar .avatar-fallback,.big-avatar .avatar-fallback{display:inline-flex;align-items:center;justify-content:center;width:100%;height:100%;font:inherit}.avatar.has-avatar-image img,.big-avatar.has-avatar-image img{width:100%;height:100%;object-fit:cover;border-radius:inherit;display:block}
.modal-backdrop:has(.glory-modal),.modal-backdrop:has(.settle-modal){padding:0!important;place-items:stretch!important}.modal-backdrop:has(.glory-modal) .glory-modal,.modal-backdrop:has(.settle-modal) .settle-modal{width:100vw!important;max-width:none!important;min-height:100vh!important;height:100vh!important;max-height:none!important;border-radius:0!important;box-sizing:border-box!important}.modal-backdrop:has(.glory-modal) .glory-modal{padding-left:clamp(18px,5vw,90px);padding-right:clamp(18px,5vw,90px)}.settle-modal{overflow:auto;text-align:center}.settle-ranking{max-width:900px;margin:30px auto}.settle-row{font-size:18px;padding:15px 20px}.lesson-roster-tools{display:flex;align-items:center;gap:12px;padding:14px 6px;color:var(--muted);font-size:12px}.roster-row.lesson-temp{background:#fff8df}.roster-row.lesson-temp small{color:#b7770a;margin-left:6px}.parent-view{min-height:100vh;padding:30px 16px;background:linear-gradient(145deg,#f4edff,#fff7e8,#e9fbf3)}.parent-card{max-width:920px;margin:auto;background:rgba(255,253,248,.96);border-radius:28px;padding:28px;box-shadow:0 20px 50px rgba(49,39,76,.16)}.parent-card h1{font-size:30px;margin:8px 0}.parent-summary{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin:22px 0}.parent-summary>div{padding:17px;border-radius:16px;background:linear-gradient(135deg,#f3edff,#fff4d8);text-align:center}.parent-summary small,.parent-summary b{display:block}.parent-summary b{font-size:25px;color:var(--purple);margin-top:5px}.parent-section{margin-top:22px;padding-top:18px;border-top:1px solid var(--line)}.parent-section h2{font-size:18px;margin:0 0 12px}.parent-badges{display:flex;flex-wrap:wrap;gap:8px}.parent-badge{padding:8px 11px;border-radius:999px;background:#fff1c7;color:#7c5315;font-weight:700;font-size:13px}.parent-ranking{display:grid;gap:7px}.parent-ranking>div{display:grid;grid-template-columns:35px 1fr 1.4fr auto;align-items:center;gap:10px;padding:11px 13px;border:1px solid var(--line);border-radius:12px}.parent-ranking span{font-weight:900;color:var(--purple)}.parent-ranking small{color:var(--muted)}.parent-ranking strong{color:#b7770a}.parent-progress{display:grid;gap:8px}.parent-progress>div{display:flex;justify-content:space-between;padding:10px 13px;border-radius:11px;background:#e4f8eb;color:#28724c}.parent-muted{color:var(--muted)}
.settle-summary{max-width:980px;margin:28px auto 18px;display:grid;grid-template-columns:repeat(3,1fr);gap:14px}.settle-summary>div{padding:18px;border:1px solid var(--line);border-radius:16px;background:linear-gradient(135deg,#f5efff,#fff7df)}.settle-summary small,.settle-summary b{display:block}.settle-summary b{font-size:27px;color:var(--purple);margin-top:5px}.settle-stat-btn{margin-top:7px;border:0;background:transparent;color:#7c5315;font-size:20px;font-weight:800;cursor:pointer}.settle-badge-details{max-width:980px;margin:0 auto 18px;padding:13px;border-radius:14px;background:#fff8e3;display:flex;flex-wrap:wrap;gap:8px;justify-content:center}.settle-badge{padding:7px 11px;border-radius:999px;background:#ffe5a3;color:#7c5315;font-weight:700}.settle-ranking-list{max-width:900px;margin:20px auto}.settle-row{display:flex;justify-content:space-between;align-items:center;border:1px solid var(--line);border-radius:14px;margin:8px 0;background:#fff;padding:15px 20px}.settle-row b{color:#b7770a}.settle-progress-star{display:inline-flex;align-items:center;margin-left:8px;padding:2px 9px;border-radius:8px;background:linear-gradient(135deg,#ffe48a,#f5a623);color:#5a3d00;font-size:12px;font-weight:800;font-style:normal;vertical-align:middle;box-shadow:0 1px 4px rgba(245,166,35,.35)}adventure-progress{transition:background .5s ease}.progress-reward{transition:color .3s ease}body[data-progress-level="1"] .adventure-progress{background:linear-gradient(110deg,#176f9e,#45b3cf)}body[data-progress-level="2"] .adventure-progress{background:linear-gradient(110deg,#8a4f17,#e3a52c)}body[data-progress-level="3"] .adventure-progress{background:linear-gradient(110deg,#632a9b,#d04fa4)}body[data-progress-level="1"] .progress-reward:after{content:' · 解锁：海风码头'}body[data-progress-level="2"] .progress-reward:after{content:' · 解锁：星光城堡'}body[data-progress-level="3"] .progress-reward:after{content:' · 解锁：银河殿堂'}
@media(max-width:700px){.settle-summary{grid-template-columns:1fr}.parent-summary{grid-template-columns:1fr}.settle-row{font-size:16px}}
.student-grid-tools{display:flex;align-items:center;gap:10px;margin:-4px 0 10px;color:var(--muted);font-size:12px}.student-grid-tools .secondary-btn.active{background:var(--purple);color:#fff;border-color:var(--purple)}
.rank-label{font-size:12px;color:var(--muted);margin-left:5px}
.teach-students .student-panel{background:transparent;border:0;box-shadow:none;border-radius:0;padding:0;margin:0;color:#fff}
.teach-students .panel-heading{padding:0 0 18px}
.teach-students .panel-heading h2{color:#fff}
.teach-students .eyebrow{color:#c9b8ff}
.teach-students .count-pill{background:rgba(255,255,255,.14);color:#d6c6ff;border-color:rgba(255,255,255,.22)}
.teach-students .student-grid-tools{margin:0 0 14px;color:rgba(255,255,255,.75)}
.teach-students .student-grid-tools .secondary-btn{background:rgba(255,255,255,.18);color:#fff;border:1px solid rgba(255,255,255,.32)}
body[data-progress-level="1"]{background:linear-gradient(145deg,#e6f8ff 0%,#f6fdff 48%,#e9fbf3 100%)}body[data-progress-level="2"]{background:linear-gradient(145deg,#fff2d7 0%,#fffaf0 48%,#f7e8ff 100%)}body[data-progress-level="3"]{background:linear-gradient(145deg,#f0e5ff 0%,#fff1fb 48%,#e5f5ff 100%)}
.grouping-panel{margin-top:22px;padding-top:18px;border-top:1px solid var(--line)}.grouping-tools{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:13px}.grouping-tools select{border:1px solid var(--line);border-radius:9px;padding:9px 10px;background:#fff;font:inherit;color:var(--ink)}.group-board{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}.group-card{border:1px solid #dfd4f1;border-radius:14px;background:linear-gradient(145deg,#fbf8ff,#fffdf8);padding:11px;min-height:108px}.group-card header{display:flex;justify-content:space-between;align-items:center;color:var(--purple);margin-bottom:9px}.group-card header span{font-size:12px;color:var(--muted)}.group-members{display:flex;flex-wrap:wrap;gap:6px;min-height:46px;padding:5px;border-radius:9px;background:rgba(255,255,255,.7)}.group-member{border:1px solid #e6dccf;border-radius:999px;background:#fff;padding:5px 8px;font:inherit;font-size:12px;color:var(--ink);cursor:grab}.group-member:active{cursor:grabbing}.group-empty{padding:18px;text-align:center;border:1px dashed #d6c7ee;border-radius:12px;color:var(--muted)}
@media(max-width:720px){.group-board{grid-template-columns:1fr 1fr}.grouping-tools{align-items:stretch}.grouping-tools select,.grouping-tools button{flex:1}}
/* 2026.08 Classroom / settlement / parent report upgrade */
.classroom-group{grid-column:1/-1;border:1px solid #e5d9ff;border-radius:18px;padding:12px;background:linear-gradient(135deg,rgba(251,248,255,.55),rgba(255,253,248,.55))}
.classroom-group header{display:flex;justify-content:space-between;gap:12px;align-items:center;color:#5a3bb5;margin:0 0 10px}.classroom-group header span{font-size:.84rem;color:#987738}.classroom-group-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(102px,1fr));gap:9px}
.group-ranking-wrap{border-top:1px solid #eee4d8;margin-top:12px;padding-top:12px}.mini-section-title{font-weight:800;color:#6b4db9;margin-bottom:7px}.group-ranking-list{list-style:none;margin:0;padding:0;display:grid;gap:6px}.group-ranking-list li{display:grid;grid-template-columns:24px 1fr auto;gap:8px;align-items:center;background:#f8f4ff;border-radius:10px;padding:7px 9px}.group-ranking-list b{color:#fff;background:#6e4dd5;border-radius:50%;text-align:center}.group-ranking-list strong{color:#b47100}
.settle-modal{position:relative;width:min(1120px,96vw);max-height:92vh;overflow-y:auto;overflow-x:hidden;-webkit-overflow-scrolling:touch}.settle-modal > .modal-close{position:fixed;top:14px;right:14px;z-index:60;width:34px;height:34px;border-radius:50%;background:rgba(101,70,200,.12);color:var(--purple);font-size:22px;line-height:1;display:grid;place-items:center;transition:background .2s}.settle-modal > .modal-close:hover{background:rgba(101,70,200,.22)}.settle-summary,.settle-hint{display:none!important}.settle-ranking-list{max-width:1000px;margin:12px auto 0;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px 12px}.settle-row{width:100%;display:flex;justify-content:space-between;gap:12px;align-items:center;text-align:left;border:1px solid #eadfce;border-radius:14px;background:#fff;padding:9px 14px;margin:0;min-height:46px;font:inherit;font-size:15px;color:#28324b;cursor:pointer}.settle-row:hover{border-color:#8b68df;background:#fbf8ff}.settle-row small{margin-left:6px;color:#7984a0;font-size:12px}
.settle-row .settle-row-stats{display:flex;gap:14px;align-items:center;margin-left:auto}
.settle-row .settle-medals{color:#7984a0;font-size:13px;min-width:4.2em;text-align:right;font-weight:600}
.settle-row .settle-points{color:#b7770a;font-weight:800;min-width:2.6em;text-align:right;font-size:16px}.settle-student-detail{margin:14px 0;border-radius:18px;padding:14px;background:linear-gradient(135deg,#fff6d7,#f8f0ff);border:1px solid #ead9b0}.settle-student-detail h3{margin:4px 0}.detail-close{float:right;border:0;background:transparent;color:#6a4aca;font-weight:800;cursor:pointer}
.real-medal{display:inline-flex;align-items:center;gap:6px;margin:5px;padding:7px 10px;border-radius:999px;background:radial-gradient(circle at 35% 25%,#fffceb,#f9c54b 62%,#b77408);color:#523400;box-shadow:inset 0 1px 1px #fff,inset 0 -2px 4px #bd7d19,0 3px 5px #60400c44;font-weight:800}.real-medal i{width:19px;height:19px;display:grid;place-items:center;border-radius:50%;font-style:normal;color:#8b5100;background:#fff2a8;border:1px solid #c2831a}.real-medal b{font-size:.86em}
.share-select-label{display:grid;gap:5px;margin:10px auto;max-width:360px;text-align:left;font-weight:800;color:#4d3c74}.share-select-label select{width:100%;border:1px solid #dbcff4;border-radius:10px;padding:8px 10px;background:#fff;font:inherit}.share-actions{display:flex;justify-content:center;gap:8px;flex-wrap:wrap;margin-bottom:8px}
.theme-unlock-toast{position:fixed;z-index:9999;left:50%;top:8%;transform:translateX(-50%);width:min(470px,90vw);padding:25px;border-radius:22px;text-align:center;color:#fff;background:linear-gradient(135deg,#332176,#7b55df);box-shadow:0 22px 70px #28115aa0;animation:theme-unlock .5s both}.theme-unlock-toast b,.theme-unlock-toast span{display:block}.theme-unlock-toast b{font-size:1.3rem;margin-bottom:8px}.theme-unlock-confetti{letter-spacing:14px;color:#ffe26d;font-size:1.7rem;animation:confetti-spin 1.3s infinite alternate}@keyframes theme-unlock{from{opacity:0;transform:translate(-50%,-35px) scale(.8)}to{opacity:1;transform:translate(-50%,0) scale(1)}}@keyframes confetti-spin{to{transform:rotate(5deg) scale(1.1)}}
body[data-progress-level="1"]{--theme-accent:#2c9d7c}body[data-progress-level="1"] .adventure-progress,body[data-progress-level="1"] .panel{box-shadow:0 10px 28px #35bd8550}body[data-progress-level="2"]{--theme-accent:#2979cb}body[data-progress-level="2"] .app-shell{background:linear-gradient(150deg,#e8f5ff,#f5ecff)}body[data-progress-level="3"]{--theme-accent:#8a55d8}body[data-progress-level="3"] .app-shell{background:radial-gradient(circle at top,#fff4b9,#ede6ff 55%,#dac7ff)}
.parent-evaluation{padding:15px 17px;border-radius:14px;background:#f7f1ff;color:#50406f;line-height:1.75}.parent-timeline{padding:0;margin:0;list-style:none}.parent-timeline li{display:flex;gap:12px;align-items:center;border-bottom:1px solid #ede7de;padding:11px 0}.parent-timeline strong{margin-left:auto;color:#a96b00}.parent-timeline span{margin-left:auto;color:#6c7893}.parent-updated{margin:6px 0 0;font-size:12px;color:#8590a8;letter-spacing:.03em}
.theme-achievement-card{background:linear-gradient(135deg,#fff1bc,#eee3ff)!important}.theme-achievement-book{margin:18px 0;padding:18px;border-radius:18px;border:1px solid #ead594;background:linear-gradient(125deg,#fff8d9,#f4eeff)}.theme-achievement-book h3{margin:0 0 10px;color:#6045a9}.theme-achievement-book>div{display:grid;grid-template-columns:125px 1fr;gap:10px;padding:9px 0;border-top:1px dashed #d9c98d}.theme-achievement-book>div b{color:#925e09}.theme-achievement-book>div span{color:#68728e;line-height:1.55}
@media (max-width:720px){.classroom-group-cards{grid-template-columns:repeat(2,minmax(0,1fr))}.settle-row{padding:12px}.share-actions .secondary-btn{width:100%}}

/* 主题解锁不是只改进度条：页面主面板、远征卡与标题都随班级旅程切换。 */
body[data-progress-level="1"] .topbar,body[data-progress-level="1"] .hero-panel{background:linear-gradient(120deg,#eefcff,#e6fff6)}
body[data-progress-level="2"] .topbar,body[data-progress-level="2"] .hero-panel{background:linear-gradient(120deg,#fff2ce,#eff9ff)}
body[data-progress-level="3"] .topbar,body[data-progress-level="3"] .hero-panel{background:radial-gradient(circle at 75% 15%,#ffe6a7,#eee4ff 58%,#e2f7ff)}
body[data-progress-level="1"] .adventure-progress:before{content:'🌊';position:absolute;right:18px;bottom:10px;font-size:34px;opacity:.45}
body[data-progress-level="2"] .adventure-progress:before{content:'🏰';position:absolute;right:18px;bottom:10px;font-size:34px;opacity:.45}
body[data-progress-level="3"] .adventure-progress:before{content:'🌌';position:absolute;right:18px;bottom:10px;font-size:34px;opacity:.55}

/* 家长端两大版块：本节荣耀榜 + 本学期总览 */
.parent-section-kicker{display:inline-flex;align-items:center;padding:5px 10px;border-radius:999px;background:#eee6ff;color:#6743be;font-size:12px;font-weight:800;letter-spacing:.03em;margin-bottom:8px}
.parent-current-lesson{border:1px solid #e6d8ff;border-radius:20px;padding:20px;background:linear-gradient(135deg,#fcf9ff,#fffdf5);box-shadow:0 8px 24px rgba(103,67,190,.08)}
.parent-section-note{color:#6f7b96;margin:0 0 14px}
.parent-medal-summary{display:flex;flex-wrap:wrap;gap:8px;margin:12px 0 16px;padding:10px;border-radius:14px;background:#fff8df}
.parent-medal-chip,.parent-mini-badge{display:inline-flex;align-items:center;padding:6px 9px;border-radius:999px;background:linear-gradient(135deg,#fff1bc,#f7d774);color:#765015;font-size:12px;font-weight:800}
.parent-lesson-students{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:10px}
.parent-lesson-student{display:flex;align-items:center;gap:12px;min-height:84px;padding:12px;border:1px solid #eadff4;border-radius:14px;background:#fff}
.parent-avatar{width:58px!important;height:58px!important;flex:0 0 58px;border-radius:16px!important;overflow:hidden}
.parent-lesson-student h3{margin:0 0 4px;font-size:17px}.parent-lesson-student p{margin:0;color:#7a849c;font-size:13px}
.parent-mini-badges{display:flex;flex-wrap:wrap;gap:5px;margin-top:7px}.parent-mini-badge{padding:3px 7px;font-size:11px}
.parent-subheading{margin:22px 0 10px;color:#4d3a88;font-size:16px}
.parent-memory-card,.parent-theme-card{padding:14px 16px;border-radius:14px;border:1px solid #ead7a4;background:linear-gradient(135deg,#fff8d9,#f3edff);color:#5c458f;font-weight:800}
.parent-memory-card>strong{display:block;color:#7c4d12}.parent-memory-winners{display:flex;flex-wrap:wrap;gap:9px;margin:12px 0}.parent-memory-winner{display:inline-flex;align-items:center;gap:6px;padding:7px 9px;border-radius:12px;background:#fff;border:1px solid #ecd9a9;color:#5d487d;font-style:normal}.parent-memory-winner>b{color:#b47716}.parent-memory-winner>em{font-style:normal;font-weight:800}.parent-memory-winner>small{color:#a56c10}.parent-memory-avatar{width:28px!important;height:28px!important;border-radius:50%!important;overflow:hidden;flex:0 0 28px}
.parent-memory-card div,.parent-theme-card span{display:block;margin-top:5px;color:#79839a;font-size:13px;font-weight:500}
.parent-groups{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:10px}.parent-group-card{padding:13px 15px;border-radius:14px;background:#f8f4ff;border:1px solid #e3d7fa}.parent-group-card h3{display:flex;justify-content:space-between;margin:0 0 8px;color:#5a3bb5}.parent-group-card h3 span{color:#ae7000}.parent-group-card p{margin:0;color:#6f7891;font-size:13px;line-height:1.6}
@media(max-width:700px){.parent-lesson-students,.parent-groups{grid-template-columns:1fr}.parent-current-lesson{padding:15px}}

/* 本讲结算：点击姓名弹出居中卡片（覆盖在结算弹窗之上） */
.settle-student-detail:not(.hidden){position:fixed;inset:0;z-index:300;display:flex;align-items:center;justify-content:center;background:rgba(27,18,56,.5);padding:24px}
.settle-student-detail .ssd-card{position:relative;background:#fffdf8;border:1px solid var(--line);border-radius:20px;box-shadow:0 28px 70px rgba(17,9,43,.45);max-width:420px;width:100%;padding:28px 26px;text-align:center;animation:ssdIn .28s ease both}
@keyframes ssdIn{from{opacity:0;transform:translateY(14px) scale(.96)}to{opacity:1;transform:none}}
.settle-student-detail .ssd-close{position:absolute;right:14px;top:10px;border:0;background:transparent;font-size:26px;line-height:1;color:var(--muted);cursor:pointer}
.settle-student-detail .ssd-avatar{display:flex;justify-content:center;margin-bottom:6px}
.settle-student-detail .ssd-avatar .avatar{width:72px;height:72px;font-size:26px;margin:0 auto}
.settle-student-detail h3{margin:6px 0 2px;font-size:22px}
.settle-student-detail .ssd-points{color:var(--muted);margin:0 0 14px}
.settle-student-detail .ssd-badges{display:flex;flex-wrap:wrap;gap:8px;justify-content:center}
.settle-student-detail .settle-badge{background:#f5f0ff;border:1px solid #e6dcff;border-radius:99px;padding:6px 12px;font-size:13px;font-weight:700;color:var(--purple)}

/* 分享弹窗：统一为干净的长方形卡片 */
.share-modal{text-align:center;max-width:420px;width:min(92vw,420px);max-height:calc(100vh - 40px);overflow-y:auto;border-radius:22px;padding:24px 22px;background:#fffdf8;border:1px solid var(--line);box-shadow:var(--shadow)}
.share-modal .share-icon{font-size:34px;color:var(--purple)}
.share-modal p{color:var(--muted);line-height:1.55;margin:6px 0 10px}
.share-modal .share-select-label{max-width:100%}
#qrcode{border-radius:16px;margin:16px auto}
.share-actions .secondary-btn{min-width:116px}

/* 家长成长册头像：与课堂大屏抠图风格一致 */
.parent-avatar{border:2px solid #fff;background:#fff;object-fit:cover;object-position:center top;box-shadow:0 2px 8px rgba(33,24,59,.12)}
.parent-avatar.avatar-failed{background:#eef2ff url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'><circle cx='32' cy='22' r='12' fill='%23b9a7e6'/><path d='M10 58c0-13 10-20 22-20s22 7 22 20z' fill='%23b9a7e6'/></svg>") center/62% no-repeat}
/* 抠图需要填满圆形容器：.parent-avatar/.parent-memory-avatar 的 img 必须 100% 宽高 + object-fit:cover，
   否则透明 PNG 按原始像素渲染，会被 58px 圆形裁掉人物而露出白底。 */
.parent-avatar img,.parent-avatar.has-avatar-image img,.parent-memory-avatar img,.parent-memory-avatar.has-avatar-image img{width:100%;height:100%;object-fit:cover;object-position:center top;display:block}
/* 本节结算浮窗用 .ssd-card 居中卡片，里面的"收起"按钮定位到右上角，不影响标题留白。 */
.ssd-card .detail-close{position:absolute;right:14px;top:10px;border:0;background:transparent;color:var(--muted);font-size:13px;font-weight:700;cursor:pointer;padding:4px 10px;border-radius:8px}
.ssd-card .detail-close:hover{background:#f5f0ff;color:var(--purple)}
/* 分享弹窗：防止左右滑动条；#qrcode 与兜底文字都限定到弹窗宽度内，长中文提示自动换行。 */
.share-modal{overflow-x:hidden}
.share-modal #qrcode{width:100%;max-width:280px;box-sizing:border-box;min-width:0;min-height:160px}
.share-qr-fallback{text-align:left;line-height:1.55;color:var(--muted);font-size:13px;padding:8px 10px;overflow-wrap:break-word;word-break:break-word;white-space:normal}

/* ===== 优化2：颁发荣誉-固定积分快捷行 ===== */
.quick-points{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:6px 0 12px;padding:10px 12px;background:linear-gradient(135deg,#faf7ff,#eef3ff);border-radius:14px;border:1px solid var(--color-border-tertiary)}
.quick-points .eyebrow{width:100%;font-size:11px;color:var(--purple);margin-bottom:2px}
.qp-btn{flex:1;min-width:56px;padding:10px 0;border:0;border-radius:12px;background:var(--purple,#7c5cff);color:#fff;font-weight:700;font-size:15px;cursor:pointer;transition:transform .08s,box-shadow .15s}
.qp-btn:hover{transform:translateY(-1px);box-shadow:0 6px 16px rgba(124,92,255,.32)}
.qp-btn:active{transform:translateY(0)}

/* ===== 优化3：上课窗口 ===== */
/* 上课全屏模态 */
.modal-backdrop:has(.teach-modal){padding:0!important;place-items:stretch!important}
.modal-backdrop:has(.teach-modal) .teach-modal{width:100vw!important;max-width:none!important;min-height:100vh!important;height:100vh!important;border-radius:0!important}
.teach-modal{display:flex;flex-direction:column;background:linear-gradient(160deg,#221a45 0%,#2e2358 55%,#1b2240 100%);color:#fff;position:relative;overflow:hidden}
.teach-finish-btn{position:absolute;top:18px;right:22px;z-index:8;background:rgba(255,255,255,.32);color:#fff;border:1px solid rgba(255,255,255,.55);border-radius:100px;padding:10px 22px;font:inherit;font-weight:800;font-size:15px;cursor:pointer;transition:background .2s}
.teach-finish-btn:hover{background:rgba(255,255,255,.44)}
.teach-body{flex:1;display:flex;position:relative;overflow:hidden}
/* 学生区：垂直居中队框/姓名牌，顶部留呼吸；overflow:hidden 从根上杜绝滚动，由居中+网格收紧适配一屏 */
.teach-students{flex:1;display:flex;flex-direction:column;justify-content:center;padding:36px 22px 100px;overflow:hidden;min-width:0;position:relative}
/* 学生网格：6 列等分（恢复默认布局），撑满整个屏幕 */
.teach-students .student-grid{grid-template-columns:repeat(6,minmax(0,1fr));gap:14px 12px}
/* 让默认浅色学生卡片直接在深色 teach-modal 背景上显眼 —— 不再覆盖为白字白底 */
.teach-students .student-grid .student-card{background:#fff;color:var(--ink);border-color:#e1d4ff;box-shadow:0 6px 18px rgba(0,0,0,.18);padding:10px 7px 8px}
.teach-students .student-grid .student-card.selected{outline:3px solid var(--gold);outline-offset:-3px}
/* 教学模式下学生网格不限制高度，由 teach-students 自身滚动，避免双层滚动条 */
.teach-students .student-grid{max-height:none;overflow:visible}
/* 分组≥4 组时：一行排两个组（每组占一列），组自然成 2 列网格，不再让 .classroom-group 占满整行 */
.teach-students .student-grid.grouped-multi{grid-template-columns:1fr 1fr;gap:14px 12px;align-items:start}
.teach-students .student-grid.grouped-multi .classroom-group{grid-column:auto;min-width:0}
/* 分组态（has-grouped，>=4 组）：组卡总高可能超过一屏。
 * 原 justify-content:center + overflow:hidden 在超高时会把顶部推出视口被裁，
 * 导致最上面 1~2 组被浏览器顶部 UI/视口边界遮住（分 5 组最易触发，每组 6 人卡最高）。
 * 改：顶部对齐 + 可纵向滚动 + 顶部留白 48px，保证第 1 组不被遮，超高也能滚到看全。
 * 未分组/小组数（不超高）维持原居中布局，视觉不变。 */
.teach-students.has-grouped{justify-content:flex-start;overflow-y:auto;padding-top:48px;padding-bottom:96px}
/* 抽屉：从屏底滑出的横长面板，宽 100%；锚定 bottom:72px 从屏底升起，最高占屏 52%（内容精简，不滚动）。
 * 不再用 --teach-drawer-top（旧逻辑把抽屉顶钉在最下排姓名牌底，导致姓名牌被挤到顶部）；
 * 改为打开时由 JS 动态设 teach-students 的 padding-bottom 让位，抽屉顶 = 姓名牌底 - 12px 缝，零压。
 * 默认 transform 把整个抽屉推出视口外 40px + visibility 隐藏。
 */
.teach-award-drawer{position:absolute;top:auto;left:0;right:0;bottom:72px;max-height:52vh;width:100%;background:transparent;color:var(--ink);box-shadow:none;transform:translateY(calc(100% + 40px));visibility:hidden;transition:transform .4s cubic-bezier(.22,.61,.36,1),visibility 0s linear .4s;display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:10px;padding:14px 22px 18px;overflow:hidden}
.teach-award-drawer.open{transform:translateY(0);visibility:visible;transition:transform .4s cubic-bezier(.22,.61,.36,1),visibility 0s linear 0s}
/* 抽屉里：awardPanel 整块不渲染，qp-btn/medal-btn 已由 JS 搬到 .teach-award-drawer 直接子位置 */
.teach-award-drawer .award-panel{display:none}
.teach-award-drawer .panel-heading{display:none;margin:0;padding:0}
.teach-award-drawer .selected-hero{display:none}
.teach-drawer-close{display:none}
.teach-award-drawer .text-btn{display:none}
/* qp-btn：正方形 48×48，星币 ✦ 上下两行；medal-btn：高度同为 48px，紧接排 */
.teach-award-drawer > .quick-points{display:flex;justify-content:center;align-items:center;flex-wrap:nowrap;gap:8px;padding:0;margin:0;background:transparent;border:0;border-radius:0}
.teach-award-drawer > .quick-points .eyebrow{display:none}
.teach-award-drawer > .medal-grid{display:flex;flex-wrap:wrap;align-content:flex-start;justify-content:flex-start;gap:8px 10px;padding:0;margin:0;background:transparent;border:0;border-radius:0}
.teach-award-drawer .qp-btn,.teach-award-drawer .medal-btn{box-sizing:border-box;height:48px;border:1px solid var(--line);background:#fff;border-radius:11px;color:var(--ink);font-weight:700;cursor:pointer}
.teach-award-drawer .qp-btn{display:flex;flex:0 0 48px;width:48px;min-width:48px;padding:0;flex-direction:column;align-items:center;justify-content:center;gap:0;font-size:13px;background:#fff3d9;border-color:#ffd98a;color:#8b6314;line-height:1}
.teach-award-drawer .medal-btn{display:flex;flex:0 1 auto;min-width:150px;padding:6px 10px;gap:8px;align-items:center}
.teach-award-drawer .medal-icon{width:30px;height:30px;font-size:16px;border-radius:9px;flex:0 0 30px;display:grid;place-items:center;background:#fff1c7}
.teach-award-drawer .medal-btn strong{font-size:13px;line-height:1.2;display:block}
.teach-award-drawer .medal-btn small{font-size:11px;line-height:1.2;color:var(--muted);display:block;margin-top:2px}

/* 飞星币动画层（fixed 定位、pointer-events:none，不影响点击） */
#fly-star-layer{position:fixed;inset:0;pointer-events:none;z-index:9999}
.flying-star{position:fixed;font:800 64px/1 "PingFang SC","Microsoft YaHei",sans-serif;color:#ffb83d;text-shadow:0 0 22px #ffd966,0 0 6px #fff,0 0 36px rgba(255,184,61,.55);pointer-events:none;will-change:transform,opacity;transition:transform 1.8s cubic-bezier(.34,1.56,.64,1),opacity 1.6s ease-in}
/* 整行底部按钮：放右侧、小巧；从左至右 多选颁发 / 荣耀时刻 / 本节荣耀榜 / 下课 */
.teach-footer{position:absolute;right:24px;bottom:16px;display:flex;gap:8px;z-index:8;padding:0;background:transparent;backdrop-filter:none}
.teach-footer > button,.teach-footer > #multi-award-btn{flex:0 0 auto;background:rgba(255,255,255,.32);color:#fff;border:1px solid rgba(255,255,255,.55);font-weight:700;padding:6px 14px;border-radius:999px;font:inherit;font-size:13px;cursor:pointer;transition:background .2s,transform .08s}
.teach-footer > button:hover,.teach-footer > #multi-award-btn:hover{background:rgba(255,255,255,.5)}
.teach-footer > button:active,.teach-footer > #multi-award-btn:active{transform:translateY(1px)}
.teach-footer .teach-finish-btn{position:static;background:linear-gradient(135deg,#ff8a5b,#ff5a8a)!important;border-color:transparent!important;color:#fff}
/* 抽屉滑出时，把底部 4 按钮让位给抽屉，避免抽屉过窄 —— 用 id 选择器（id 在外层 backdrop，class 在内层不能用 .teach-modal） */
#teach-modal.drawer-open .teach-footer{display:none}

/* ===== 优化1：分享版块勾选区 ===== */
.share-sections{margin:14px 0;border-top:1px dashed var(--color-border-tertiary);padding-top:12px;display:grid;grid-template-columns:1fr 1fr;gap:6px 18px}
.share-sections .eyebrow{grid-column:1/-1;color:var(--purple)}
.share-section-item{display:flex;align-items:center;gap:8px;font-size:13px;cursor:pointer;color:var(--fg)}
.share-section-item input{width:16px;height:16px;accent-color:var(--purple,#7c5cff)}

/* ===== modal 层级修复：教课模式全屏时弹的其他 modal 不被遮挡 ===== */
.modal-backdrop#award-modal,.modal-backdrop#settle-modal,.modal-backdrop#glory-modal,.modal-backdrop#share-modal,.modal-backdrop#redeem-modal,.modal-backdrop#medal-modal,.modal-backdrop#teacher-register-modal,.modal-backdrop#cloud-login-modal,.modal-backdrop#teach-group-modal,.modal-backdrop#teach-finish-confirm{z-index:30}

/* ===== 上课模式内：分组弹窗 + 下课确认弹窗 ===== */
.teach-group-modal{max-width:760px}
.teach-group-modal .grouping-panel{background:transparent;border:0;padding:0;box-shadow:none}
.teach-group-modal .grouping-panel .panel-heading{display:none}
.teach-group-modal .group-board{min-height:280px}
.teach-confirm-modal{max-width:420px;text-align:center}
.teach-confirm-tip{color:var(--muted);font-size:13px;margin:10px 0 22px}
.teach-confirm-actions{display:flex;gap:12px;justify-content:center}
.teach-confirm-actions .primary-btn,.teach-confirm-actions .secondary-btn{min-width:96px;justify-content:center}

/* ===== 上课模式：颁发面板改为「屏幕正中、可拖动」小浮层（v20260903c） =====
 * 旧实现是底部抽屉（锚底升起 + 学生区让位），在大屏上会把姓名牌整块上移、
 * 第 1 排被浏览器菜单栏盖住，且抽屉过高时压住下方姓名牌。
 * 新版：浮层尺寸自适应内容、默认居中、可按标题栏拖动、不遮挡背景姓名牌。
 * 底部按钮栏（分组/多选颁发/撤销/主界面/下课）位置与大小完全不变。 */
.teach-award-drawer{
  /* 注意：left/top 绝不能加 !important —— JS 拖拽要用内联 style.left/top 定位，
   * 而 !important 的优先级高于普通内联样式，会导致拖动完全失效。
   * 这里的值只作为「尚未定位时」的初始居中方案（配合 translate(-50%,-50%)）。 */
  left:50%;right:auto!important;top:50%;bottom:auto!important;
  width:max-content!important;min-width:252px;max-width:min(432px,74vw);
  max-height:min(66vh,540px);
  background:rgba(255,255,255,.97)!important;
  border:1px solid rgba(20,16,40,.14)!important;
  border-radius:16px!important;
  box-shadow:0 20px 52px rgba(20,16,40,.3)!important;
  padding:8px 12px 12px!important;
  gap:8px!important;
  overflow:auto!important;
  z-index:30;
  transform:translate(-50%,-50%) scale(.96)!important;
  opacity:0;visibility:hidden;
  transition:opacity .16s ease,transform .16s ease,visibility 0s linear .16s!important;
}
/* JS 已算出像素级居中位置（left/top）后，transform 只保留缩放，避免与拖拽位移打架 */
.teach-award-drawer.picker-ready{transform:scale(.96)!important}
.teach-award-drawer.picker-ready.open{opacity:1;transform:scale(1)!important;visibility:visible;transition:opacity .16s ease,transform .16s ease,visibility 0s linear 0s!important}
.teach-award-drawer.dragging{transition:none!important;cursor:grabbing;user-select:none}
/* 拖拽标题栏 */
.teach-picker-head{
  display:flex;align-items:center;gap:8px;
  padding:2px 2px 6px;margin:0;
  border-bottom:1px solid rgba(20,16,40,.1);
  cursor:grab;touch-action:none;user-select:none;
}
.teach-picker-head:active{cursor:grabbing}
.teach-picker-grip{
  flex:0 0 auto;color:#a8a4b8;font-size:13px;letter-spacing:-2px;line-height:1;
  transform:rotate(90deg);transform-origin:center;
}
.teach-picker-title{
  flex:1 1 auto;font-size:13px;font-weight:800;color:#3d3657;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.teach-award-drawer .teach-drawer-close{
  display:grid!important;place-items:center;
  flex:0 0 auto;width:24px;height:24px;padding:0;
  border:1px solid rgba(20,16,40,.12);border-radius:8px;
  background:#fff;color:#6b6480;font-size:15px;line-height:1;cursor:pointer;
}
.teach-award-drawer .teach-drawer-close:hover{background:#f4f1fb;color:#3d3657}
/* 内容区：加分按钮一行、勋章卡两列，整体紧凑 */
/* 积分按钮 +1~+5 在该行水平居中（不贴左）；nowrap 保证 5 个始终排同一行。
   注：此行是 drawer/picker 内容区的收口样式，!important 会覆盖上面 :209 的 center，
   所以必须在这里再声明一次 center，否则按钮贴左。 */
.teach-award-drawer > .quick-points{justify-content:center!important;flex-wrap:nowrap!important;gap:6px!important}
.teach-award-drawer .qp-btn{flex:0 0 44px!important;width:44px!important;min-width:44px!important;height:44px!important}
.teach-award-drawer > .medal-grid{gap:8px!important;justify-content:flex-start!important}
.teach-award-drawer .medal-btn{min-width:0!important;flex:1 1 calc(50% - 4px)!important;max-width:calc(50% - 4px);height:52px!important}
.teach-award-drawer .medal-btn strong{font-size:12px}
.teach-award-drawer .medal-btn small{display:none}
