/* Sovira 网站样式 —— 视觉规范 B「温暖轻盈」（docs/design/VISUAL_SPEC_B.md、docs/UI.md）。
   颜色、字体、圆角都用下面的变量；改外观先改变量。 */
:root{
  --bg:#FFF9F1; --apricot:#F6DEC9; --card:#FFFDFA; --neutral:#F3EEE8;
  --ink:#342E2A; --mute:#71665F; --line:#E8DDD1;
  --accent:#192F88; --accent-d:#14266F; --accent-ink:#FFFFFF; --accent-soft:#E7EAF6;
  --mint:#4DD5B3; --mint-soft:#E2F5ED; --clay:#CE896C;
  --me:#E2F5ED;
  --good:#0B6B50; --good-soft:#E2F5ED;
  --bad:#9A3412; --bad-soft:#FBE7E2;
  --note:#8A5300; --note-soft:#FFF4DD;
  --err:#B3261E;
  --f-display:"Figtree",system-ui,-apple-system,"Segoe UI","PingFang SC","Microsoft YaHei","Noto Sans CJK SC",sans-serif;
  --f-body:var(--f-display);
  --f-mono:ui-monospace,"SF Mono",Menlo,Consolas,monospace;
  --r-card:20px; --r-ctl:14px; --shadow:0 8px 24px rgba(120,80,40,.06);
  color-scheme:light;
}
*{box-sizing:border-box}
html,body{margin:0}
body{background:var(--bg);color:var(--ink);font:16.5px/1.6 var(--f-body);-webkit-font-smoothing:antialiased}
a{color:var(--accent)}
img{max-width:100%}
.wrap{max-width:820px;margin:0 auto;padding-block:20px 80px;padding-left:max(16px,env(safe-area-inset-left,0px));padding-right:max(16px,env(safe-area-inset-right,0px))}
h1{font:800 1.6rem/1.15 var(--f-display);letter-spacing:-.02em;margin:0}
h2{font:800 1.35rem/1.25 var(--f-display);letter-spacing:-.015em;margin:0 0 10px}
h3{font:700 1.05rem/1.3 var(--f-display);margin:0 0 8px}
.muted{color:var(--mute);font-size:.9rem}
.center{text-align:center}
.hide{display:none!important}
.row{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
.grid{display:grid;gap:10px}

/* —— 页头 —— */
.top{display:flex;align-items:center;gap:12px;min-height:64px;padding:8px max(16px,env(safe-area-inset-left,0px));border-bottom:1px solid var(--line);background:rgba(255,249,241,.94);backdrop-filter:blur(8px);position:sticky;top:0;z-index:5}
.brand{display:flex;align-items:center;text-decoration:none}
.brand img{height:46px;display:block}
.brand .mk{display:none;height:36px}
@media (max-width:520px){.brand .lk{display:none}.brand .mk{display:block}}
.top .sp{flex:1}
.who{display:inline-flex;align-items:center;gap:8px;min-height:40px;padding:0 12px 0 4px;border:1px solid var(--line);border-radius:20px;background:#fff;font:600 .88rem var(--f-body);color:var(--ink);max-width:52vw}
.who .av{flex:none;width:32px;height:32px;border-radius:16px;background:var(--mint-soft);color:var(--good);display:grid;place-items:center;font:800 .85rem var(--f-display)}
.who .nm{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* —— 按钮与输入 —— */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:48px;padding:0 20px;border-radius:24px;border:1.5px solid var(--accent);background:var(--accent);color:var(--accent-ink);font:700 .98rem var(--f-display);text-decoration:none;cursor:pointer;transition:background-color .18s ease,border-color .18s ease,transform .18s ease}
.btn:hover{background:var(--accent-d);border-color:var(--accent-d)}
.btn:active{transform:translateY(1px)}
.btn.ghost{background:#fff;color:var(--accent);border-color:var(--line)}
.btn.ghost:hover{border-color:var(--accent);background:#fff}
.btn:disabled,.opt:disabled{background:#D6CDC4;border-color:#D6CDC4;color:#fff;cursor:not-allowed;transform:none}
.btn.ghost:disabled{background:#fff;color:#B4A99F;border-color:var(--line)}
.btn.two{flex-direction:column;gap:0;line-height:1.2;padding:6px 18px}
.btn .zh{display:block;font:500 .78rem var(--f-body);color:inherit;opacity:.85;margin:0}
.linkbtn{background:none;border:none;color:var(--accent);font:700 .92rem var(--f-display);cursor:pointer;padding:0 4px;min-height:44px;text-decoration:underline;text-underline-offset:4px;display:inline-flex;align-items:center}
.opt{font:600 .98rem/1.35 var(--f-body);min-width:52px;min-height:48px;padding:10px 14px;border-radius:var(--r-ctl);border:1.5px solid var(--line);background:#fff;color:var(--ink);cursor:pointer;text-align:left;transition:border-color .18s ease,background-color .18s ease}
.opt:hover{border-color:var(--accent);background:#F7F8FD}
.opt .zh{font-weight:500;font-size:.86rem}
button:focus-visible,input:focus-visible,textarea:focus-visible,select:focus-visible,a:focus-visible,summary:focus-visible{outline:3px solid var(--mint);outline-offset:2px}
.bar{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px;align-items:center}
.bar input[type=text],.bar textarea{flex:1 1 12em;min-width:0;font:500 1.02rem var(--f-mono);min-height:50px;padding:12px 14px;border:1.5px solid var(--line);border-radius:var(--r-ctl);background:#fff;color:var(--ink)}
.bar textarea{font-family:var(--f-body);min-height:3.4em;resize:vertical}
.bar input::placeholder,.bar textarea::placeholder{color:#A3988E;font-family:var(--f-body)}
.start-opts{display:grid;grid-template-columns:1fr}
.field{display:flex;flex-direction:column;gap:6px;margin-bottom:12px;font:600 .92rem var(--f-body)}
.field input,.field select{font:500 1rem var(--f-body);min-height:50px;padding:0 14px;border:1.5px solid var(--line);border-radius:var(--r-ctl);background:#fff;color:var(--ink)}
.err{color:var(--err);font-size:.92rem;margin:6px 0}
.ok-note{color:var(--good);font-size:.92rem}

/* —— 卡片 —— */
.card{background:var(--card);border:1px solid var(--line);border-radius:var(--r-card);padding:18px;margin-bottom:14px;box-shadow:var(--shadow)}
.stage{font:700 .78rem var(--f-display);text-transform:uppercase;letter-spacing:.08em;color:var(--accent);margin-bottom:10px}
.qimg{width:100%;border:1px solid var(--line);border-radius:12px;background:#fff;display:block}
.recog{display:flex;gap:12px;align-items:center;font-size:.88rem;color:var(--mute);margin-bottom:10px}
.recog img{width:60px;height:60px;object-fit:cover;border-radius:10px;border:1px solid var(--line)}
.notes{font-size:.9rem;color:var(--mute);margin:8px 0 0;padding-left:1.2em}
.badge{display:inline-flex;align-items:center;gap:5px;font:700 .82rem var(--f-display);padding:4px 12px;border-radius:999px}
.badge.l1{background:var(--good-soft);color:var(--good)}
.badge.l2{background:var(--accent-soft);color:var(--accent)}
.badge.l3{background:var(--note-soft);color:var(--note)}
.badge.l4{background:var(--bad-soft);color:var(--bad)}
.report{white-space:pre-wrap;font-size:.96rem}
.spin{display:inline-block;width:18px;height:18px;border:3px solid var(--accent-soft);border-top-color:var(--accent);border-radius:50%;animation:sp 1s linear infinite;vertical-align:-4px;margin-right:8px}
@keyframes sp{to{transform:rotate(360deg)}}

/* —— 对话（学习页是唯一双语的地方：主要语言在上、字大；另一种在下、字小）—— */
.chat{display:flex;flex-direction:column;gap:10px}
.msg{max-width:88%;padding:10px 14px;border-radius:18px;overflow-wrap:anywhere;line-height:1.5}
.msg.t{background:var(--neutral);align-self:flex-start;border-bottom-left-radius:6px}
.msg.s{background:var(--me);align-self:flex-end;border-bottom-right-radius:6px}
.msg.ok{background:var(--good-soft);color:var(--good);align-self:flex-start;font-weight:700}
.msg.no{background:var(--note-soft);color:var(--note);align-self:flex-start}
.msg.hint{background:var(--accent-soft);color:var(--ink);align-self:flex-start}
.msg .lbl{display:block;font:700 .72rem var(--f-display);letter-spacing:.06em;text-transform:uppercase;color:var(--accent);margin-bottom:2px}
.msg.ok .lbl{color:var(--good)}.msg.no .lbl{color:var(--note)}
.msg.think{opacity:.7;font-style:italic}
.msg img{margin-top:8px}
.zh{display:block;color:var(--mute);font-size:.88rem;margin-top:3px}
.msg.ok .zh,.msg.no .zh{color:inherit;opacity:.85}
.method{background:var(--neutral);border-radius:14px;padding:12px 14px}
.method ol{margin:6px 0;padding-left:1.3em;font-size:.95rem}
.weak{margin-top:10px;border-top:1px dashed var(--line);padding-top:8px}.weak ul{margin:4px 0 0;padding-left:1.2em}
.qzh{margin-top:10px;background:var(--neutral);border-radius:12px;padding:10px 14px;white-space:pre-wrap;font-size:.95rem}
.qzh .lbl{display:block;font:700 .72rem var(--f-display);letter-spacing:.06em;color:var(--accent)}
.keystep{background:var(--mint-soft);border-radius:16px;padding:14px 16px}
.keystep .stage{color:var(--good)}

/* —— 学习页布局：电脑左题右问，手机题目可收起 —— */
.lesson{display:grid;gap:14px}
.lesson .card{margin:0}
.mcol{display:grid;gap:14px;min-width:0;align-content:start}
.bar:has(> input#in){flex-wrap:nowrap}
.bar:has(> input#in) .btn{flex:none}
.qfold>summary{list-style:none;display:flex;align-items:center;gap:10px;cursor:pointer;min-height:44px;font:700 .95rem var(--f-display);color:var(--ink)}
.qfold>summary::-webkit-details-marker{display:none}
.qfold>summary .th{width:56px;height:40px;object-fit:cover;object-position:top;border-radius:8px;border:1px solid var(--line);background:#fff}
.qfold>summary .chev{margin-left:auto;color:var(--accent);font-size:.85rem;transition:transform .18s ease}
.qfold[open]>summary .chev{transform:rotate(180deg)}
.qfold[open]>summary{margin-bottom:10px}
.qfold[open]>summary .th{display:none}
.steps{display:flex;gap:6px;margin:0 0 12px;align-items:center}
.steps i{width:8px;height:8px;border-radius:4px;background:#DDD3C7}.steps i.on{width:22px;background:var(--accent)}.steps i.done{background:var(--mint)}
.aux{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px}
.aux .btn{flex:1 1 150px}
@media (min-width:900px){
  .wrap:has(.lesson){max-width:1180px}
  .lesson{grid-template-columns:minmax(0,5fr) minmax(0,6fr);align-items:start;gap:28px}
  .lesson .qcol{position:sticky;top:84px}
  .qfold>summary{display:none}
}

/* —— 学生 / 家长页面的通用块 —— */
.kid{display:flex;align-items:center;gap:12px;padding:14px 16px;min-height:60px;border:1px solid var(--line);border-radius:16px;background:var(--card);color:var(--ink);text-decoration:none;font:700 1.02rem var(--f-display)}
.kid:hover{border-color:var(--accent)}
.kid .av{width:40px;height:40px;border-radius:50%;background:var(--mint-soft);color:var(--good);display:grid;place-items:center;font-weight:800}
.items{display:flex;flex-direction:column;gap:8px}
.itm{display:flex;gap:12px;align-items:center;padding:12px 16px;min-height:60px;border:1px solid var(--line);border-radius:16px;background:var(--card);color:var(--ink);text-decoration:none}
.itm:hover{border-color:var(--accent)}
.itm .q{font:700 .96rem var(--f-display)}
.itm .k{color:var(--mute);font-size:.88rem}
.itm .r{margin-left:auto;flex:none}
.itm.blocked{opacity:.85}
.drop{border:1.5px solid #D9D2EA;border-radius:24px;padding:24px 18px;text-align:center;background:var(--card);box-shadow:0 10px 30px rgba(25,47,136,.08)}
.drop .btn{margin-top:8px}
.login{max-width:440px;margin:32px auto}
.gbtn{display:flex;align-items:center;justify-content:center;gap:10px;width:100%;min-height:50px;border-radius:25px;border:1.5px solid var(--line);background:#fff;color:var(--ink);font:700 1rem var(--f-display);cursor:pointer}
.or{display:flex;align-items:center;gap:10px;color:var(--mute);font-size:.85rem;margin:16px 0}.or::before,.or::after{content:"";flex:1;border-top:1px solid var(--line)}
.hero{padding:16px 0 8px}.hero img{height:110px;margin:0 auto 8px;display:block}.hero h1{font-size:2rem}.hero p{color:var(--mute)}
.ai-note{font-size:.82rem;color:var(--mute);margin:4px 0 12px;line-height:1.5}
.alerts{border-left:4px solid var(--note);background:var(--note-soft)}
.alerts li{margin:4px 0}

/* —— 敏感话题的回应、求助热线（话术和号码由后台 guard.py / helplines.json 给）—— */
.msg.care{background:var(--mint-soft);color:var(--ink);align-self:flex-start}
.msg.care .zh{color:var(--mute)}
.msg.help{align-self:stretch;max-width:100%;background:var(--card);border:1.5px solid var(--mint);display:grid;gap:6px}
.msg.help .hl{display:block;padding:10px 12px;min-height:44px;border-radius:12px;background:var(--mint-soft);color:var(--ink);text-decoration:none}
.msg.help .hl b{font-family:var(--f-mono);margin-right:6px}
.msg.help .hl span{display:block;font-size:.8rem;color:var(--mute)}

/* —— 等待页（扫描照片 → Sovira 角色 → 小知识卡片；不显示步骤、百分比和时间）—— */
.load2{padding:26px 18px 20px;overflow:hidden;text-align:center}
.ld-stage{display:flex;justify-content:center;transition:opacity .3s ease,transform .3s ease}
.ld-stage.out{opacity:0;transform:scale(.94)}
.scanbox{position:relative;width:min(100%,320px);height:200px;border-radius:14px;overflow:hidden;background:var(--neutral);border:1px solid var(--line)}
.scanbox img{width:100%;height:100%;object-fit:cover}
.scan-ph{position:absolute;inset:18px;border-radius:8px;background:repeating-linear-gradient(180deg,#fff 0 10px,transparent 10px 22px);opacity:.8}
.scanline{position:absolute;left:0;right:0;top:0;height:44px;background:linear-gradient(180deg,transparent,rgba(77,213,179,.35) 75%,var(--mint) 96%,transparent)}
.mascot{position:relative;width:150px;height:150px}
.mascot .mk{position:absolute;left:24px;top:6px;width:102px}
.mascot .sh{position:absolute;left:37px;bottom:4px;width:76px;height:10px;border-radius:50%;background:#E9DFD2}
.ld-line{font:800 1.18rem/1.4 var(--f-display);margin:16px 0 10px;min-height:3em}
.ld-line .en{display:block;font:500 .88rem var(--f-body);color:var(--mute)}
.shimmer{height:4px;border-radius:2px;background:var(--neutral);overflow:hidden;margin:0 auto 18px;max-width:220px}
.shimmer>div{height:100%;width:40%;border-radius:2px;background:linear-gradient(90deg,transparent,var(--mint),transparent)}
.ld-card{background:var(--card);border:1px solid var(--line);border-radius:18px;padding:14px 16px;min-height:7.5em;text-align:left;max-width:360px;margin:0 auto}
.ld-card .tag{font:700 .74rem var(--f-display);letter-spacing:.06em;text-transform:uppercase;color:var(--note);margin-bottom:6px}
.ld-card .en{display:block;color:var(--mute);font-size:.86rem;margin-top:3px}
.ld-card .ans{margin-top:10px;padding:10px 12px;border-radius:10px;background:var(--mint-soft)}
.ld-card .row{margin-top:10px;justify-content:space-between}
.ld-sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}
.load2.ready .shimmer>div{width:100%;background:var(--mint);animation:none}

@media (prefers-reduced-motion:no-preference){
  .msg{animation:up .2s ease-out}@keyframes up{from{transform:translateY(5px)}to{transform:none}}
  .scanline{animation:scan 2.2s ease-in-out infinite}@keyframes scan{0%{transform:translateY(-50px)}100%{transform:translateY(210px)}}
  .mascot .mk{animation:float 2.6s ease-in-out infinite}@keyframes float{0%,100%{transform:translateY(0)}50%{transform:translateY(-6px)}}
  .shimmer>div{animation:slide 1.6s ease-in-out infinite}@keyframes slide{0%{transform:translateX(-100%)}100%{transform:translateX(250%)}}
  .ld-line.in,.ld-card.in{animation:fadein .4s ease-out}@keyframes fadein{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
  .load2.ready .mascot .mk{animation:jump .5s ease-out 2}@keyframes jump{0%,100%{transform:translateY(0)}40%{transform:translateY(-16px)}}
}
@media (prefers-reduced-motion:reduce){*,*::before,*::after{transition:none!important;animation:none!important}}

/* 未登录首页自带导航，隐藏站内页头 */
body.landing #top{display:none}

/* —— 注册 / 登录 / 验证页（docs/design/signup）—— */
.langsw{display:inline-flex;border:1px solid var(--line);border-radius:20px;background:#fff;padding:3px}
.langsw button{min-height:36px;min-width:52px;padding:0 10px;border:none;border-radius:16px;background:none;color:var(--mute);font:600 .88rem var(--f-display);cursor:pointer}
.langsw button[aria-pressed="true"]{background:var(--accent-soft);color:var(--accent)}
.auth{max-width:440px;margin:28px auto 64px;padding:0 16px}
.auth-card{padding:28px 26px}
.auth h1{font-size:1.6rem;margin:0 0 8px}
.auth h1+.muted{margin:0 0 6px}
.auth form{margin-top:10px}
.auth .field{margin:16px 0 0}
.help{font-size:.86rem;color:var(--mute);font-weight:500}
.pw{display:flex;align-items:center;border:1.5px solid var(--line);border-radius:var(--r-ctl);background:#fff}
.pw:focus-within{outline:3px solid var(--mint);outline-offset:2px}
.pw input{flex:1;min-width:0;border:none!important;outline:none!important;background:none}
.pw .show{min-height:44px;padding:0 14px;border:none;background:none;color:var(--accent);font:600 .9rem var(--f-display);cursor:pointer}
.rules{list-style:none;margin:6px 0 0;padding:0;font-size:.86rem;color:var(--mute)}
.rules li.ok{color:var(--good)}.rules li.no{color:var(--err);font-weight:600}
.field input[aria-invalid]{border-color:var(--err)}
.ferr{display:flex;gap:6px;align-items:flex-start;margin:6px 0 0;font:600 .86rem/1.45 var(--f-body);color:var(--err)}
.ferr::before{content:"!";flex:none;width:16px;height:16px;border-radius:8px;background:var(--err);color:#fff;font-size:11px;display:grid;place-items:center;margin-top:2px}
.ck{display:flex;gap:10px;align-items:flex-start;margin-top:18px;font-size:.92rem;line-height:1.5;cursor:pointer}
.ck input{flex:none;width:22px;height:22px;margin:1px 0 0;accent-color:var(--accent)}
.ck a{font-weight:600}
.btn.wide{width:100%;margin-top:18px;min-height:52px;border-radius:26px}
.btn.wide+.btn.wide{margin-top:10px}
.btn .spin{border-color:rgba(255,255,255,.4);border-top-color:#fff;width:16px;height:16px;border-width:2.5px;margin:0}
.alt{text-align:center;margin:16px 0 0;color:var(--mute);font-size:.95rem}
.alt a{font-weight:600}
.auth-foot{text-align:center;color:var(--mute);font-size:.88rem;margin:16px 8px 0}
.banner{background:#FCEBE9;color:var(--err);border-radius:12px;padding:10px 12px;font-size:.9rem;font-weight:600;line-height:1.45;margin-top:14px}
.note{background:var(--mint-soft);color:var(--good);border-radius:12px;padding:10px 12px;font-size:.9rem;font-weight:600;line-height:1.45;margin-top:14px}
.email{font-weight:700;word-break:break-all;margin:2px 0 10px}
.auth-ic{width:64px;height:64px;border-radius:20px;display:grid;place-items:center;margin-bottom:14px}
.chg{margin-top:14px}
.chg>summary{cursor:pointer;color:var(--accent);font:600 .95rem var(--f-display);min-height:44px;display:flex;align-items:center;justify-content:center}
.legal{max-width:760px;margin-top:20px;padding:24px 28px}
.legal h1,.legal h2{font-size:1.5rem}.legal h3{font-size:1.1rem;margin-top:22px}
.legal-note{background:var(--note-soft);color:var(--note);border-radius:12px;padding:10px 12px;font-size:.9rem}
.legal hr{border:none;border-top:1px solid var(--line);margin:24px 0}

/* —— 添加孩子 / 管理账号（docs/design/add-child）—— */
.auth.flow{margin-top:18px}.auth.wide2{max-width:560px}
.steps2{display:flex;gap:6px;margin:0 4px 8px}.steps2 i{flex:1;height:5px;border-radius:3px;background:#E3D9CE}.steps2 i.on{background:var(--accent)}
.step-lbl{font:700 .82rem var(--f-display);color:var(--accent);margin:0 4px 10px}
fieldset.field{border:none;padding:0;min-width:0}fieldset.field legend{padding:0;margin-bottom:6px;font:600 .92rem var(--f-body)}
.field select{appearance:none;background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23192F88' stroke-width='2.5'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E") no-repeat right 14px center;padding-right:40px}
.field select[aria-invalid]{border-color:var(--err)}
.radios{display:grid;gap:8px}
.radio{display:flex;align-items:center;gap:10px;min-height:48px;padding:0 14px;border:1.5px solid var(--line);border-radius:var(--r-ctl);background:#fff;font-weight:600;cursor:pointer}
.radio.on{border-color:var(--accent);background:#F7F8FD}
.radio input,.chip-r input{accent-color:var(--accent);width:18px;height:18px;margin:0}
.chips{display:flex;flex-wrap:wrap;gap:8px}
.chip-r{display:inline-flex;align-items:center;gap:8px;min-height:44px;padding:0 14px;border:1.5px solid var(--line);border-radius:22px;background:#fff;font-weight:600;cursor:pointer}
.chip-r.on{border-color:var(--accent);background:#F7F8FD;color:var(--accent)}
.preview{margin-top:10px;background:var(--neutral);border-radius:14px;padding:12px 14px;display:flex;flex-direction:column;gap:2px}
.preview .pv-tag{font:700 .7rem var(--f-display);letter-spacing:.08em;text-transform:uppercase;color:var(--mute);margin-bottom:4px}
.preview b{font-size:1.02rem}.preview span:last-child{font-size:.86rem;color:var(--mute)}
.soft-note{background:var(--note-soft);color:var(--note);border-radius:12px;padding:10px 12px;font-size:.9rem;font-weight:600;line-height:1.45;margin-top:12px}
.okline{color:var(--good);font:600 .86rem var(--f-body);margin:6px 0 0}
.mono{font-family:var(--f-mono)}
.logincard{margin:16px 0 0;border:1px solid var(--line);border-radius:16px;background:#fff;overflow:hidden}
.logincard>div{display:flex;align-items:center;gap:10px;min-height:52px;padding:6px 14px;border-top:1px solid var(--line)}.logincard>div:first-child{border-top:none}
.logincard dt{width:6.5em;flex:none;font-size:.84rem;color:var(--mute)}.logincard dd{margin:0;flex:1;font-weight:700;min-width:0;overflow-wrap:anywhere}
.mini{min-height:36px;padding:0 12px;border:1.5px solid var(--line);border-radius:18px;background:#fff;color:var(--accent);font:600 .82rem var(--f-display);cursor:pointer}
h2.sec{font-size:1.1rem;margin:22px 0 0}
.langbtn{margin-right:4px}

/* —— 学生端（docs/design/student、student-home）—— */
.menu{position:relative}.menu>summary{list-style:none;cursor:pointer}.menu>summary::-webkit-details-marker{display:none}
.menu-list{position:absolute;right:0;top:calc(100% + 6px);min-width:180px;background:#fff;border:1px solid var(--line);border-radius:14px;box-shadow:0 12px 30px rgba(25,47,136,.12);padding:6px;z-index:20;display:grid}
.menu-list a,.menu-list button{display:flex;align-items:center;min-height:44px;padding:0 12px;border-radius:10px;border:none;background:none;color:var(--ink);font:500 .95rem var(--f-body);text-decoration:none;cursor:pointer;text-align:left}
.menu-list a:hover,.menu-list button:hover{background:var(--neutral)}
.nick-mark{width:64px;margin-bottom:10px}
.pw .count{padding:0 14px;font-size:.84rem;color:var(--mute)}.pw .count.over{color:var(--err);font-weight:700}
.shome{max-width:880px}
.hi{font-size:2.1rem;margin:18px 0 2px}.hi-sub{margin:0 0 18px}
.upload{border:1.5px solid #D9D2EA;box-shadow:0 10px 30px rgba(25,47,136,.08);display:flex;gap:16px;align-items:center;flex-wrap:wrap;padding:22px}
.upload h2{color:var(--accent);font-size:1.45rem;margin:0 0 4px}
.up-txt{flex:1 1 280px}.up-txt p{margin:0 0 4px}
.up-btns{display:flex;gap:10px;flex-wrap:wrap}.up-btns .btn{min-height:52px;border-radius:26px}
.two-col{display:grid;gap:14px;margin-top:14px}
@media (min-width:760px){.two-col{grid-template-columns:1fr 1fr;align-items:start}}
.sec-card{margin:0}.sec-card h2{font-size:1.1rem;margin:0 0 8px}.sec-card .btn{margin-top:8px}
.mrow{display:flex;align-items:center;gap:12px;padding:8px 0;color:var(--ink);text-decoration:none;min-height:56px}
.mrow b{display:block;font:700 .96rem var(--f-display)}.mrow small{display:block;color:var(--mute);font-size:.82rem}
.mrow .th{flex:none;width:52px;height:38px;border-radius:8px;border:1px solid var(--line);background:#fff;overflow:hidden}.mrow .th img{width:100%;height:100%;object-fit:cover;object-position:top left}
.mrow .chev{margin-left:auto;color:var(--accent);font-size:1.3rem}
.more{margin-top:12px;border-top:1px solid var(--line);padding-top:6px}.more>summary{cursor:pointer;color:var(--accent);font:600 .92rem var(--f-display);min-height:44px;display:flex;align-items:center}
.state{flex-direction:column;align-items:stretch;gap:12px}.state h2{margin:0}
.ibar{height:6px;border-radius:3px;background:var(--neutral);overflow:hidden}.ibar div{height:100%;width:40%;background:var(--accent);border-radius:3px}
@media (prefers-reduced-motion:no-preference){.ibar div{animation:slide 1.4s ease-in-out infinite}}
.cropper{max-width:640px;margin:0 auto;padding:16px 16px 40px;background:#2A2522;color:#fff;min-height:calc(100vh - 64px)}
.crop-head h1{font-size:1.35rem;margin:6px 0 4px}.crop-head p{margin:0 0 12px;color:#E8E0D8;font-size:.95rem}
.crop-stage{position:relative;touch-action:none;user-select:none;line-height:0}
.crop-stage img{width:100%;display:block;border-radius:8px}
.cbox{position:absolute;border:3px solid var(--mint);box-shadow:0 0 0 9999px rgba(20,18,16,.55);border-radius:4px;cursor:move}
.cbox i{position:absolute;width:26px;height:26px;border-radius:13px;background:var(--mint);border:3px solid #fff}
.cbox i[data-h=nw]{left:-14px;top:-14px;cursor:nwse-resize}.cbox i[data-h=ne]{right:-14px;top:-14px;cursor:nesw-resize}
.cbox i[data-h=sw]{left:-14px;bottom:-14px;cursor:nesw-resize}.cbox i[data-h=se]{right:-14px;bottom:-14px;cursor:nwse-resize}
.crop-stage{overflow:hidden;border-radius:8px}
.crop-btns{display:flex;gap:10px;margin-top:16px}.crop-btns .btn{flex:1;min-height:52px;border-radius:26px}
.cropper .btn.ghost{background:#fff}
.confirm-img{background:#fff;border-radius:10px;padding:8px}.confirm-img img{width:100%;display:block}
.crop-note{color:#F3EEE8;margin:14px 0 8px}
.tips{color:#F3EEE8}.tips>summary{cursor:pointer;font-weight:700;min-height:44px;display:flex;align-items:center}
.tips ul,.tips-open ul{margin:4px 0 0;padding-left:1.2em;line-height:1.6}
.tips-open{background:var(--mint-soft);border-radius:14px;padding:12px 16px;color:var(--ink)}.tips-open h3{margin:0 0 4px;font-size:1rem}
.pcard .ph{display:flex;gap:10px;align-items:flex-start;justify-content:space-between}.pcard h3{margin:0}
.pcard .rec{margin:0 0 4px;font:700 .82rem var(--f-display);color:var(--accent)}
.pcard .btn{margin-top:4px}
.sub-h{font-size:1.1rem;margin:22px 0 8px}
.list-card{padding:6px 16px}.list-card .mrow+.mrow{border-top:1px solid var(--line)}
.logincard dd.mono{white-space:nowrap;overflow-wrap:normal;overflow:hidden;text-overflow:ellipsis}
.ld-dots{display:flex;gap:8px;justify-content:center;margin-top:2px}.ld-dots i{width:8px;height:8px;border-radius:4px;background:#D9CFC4}
@media (prefers-reduced-motion:no-preference){.ld-dots i{animation:dot 1.2s ease-in-out infinite}.ld-dots i:nth-child(2){animation-delay:.2s}.ld-dots i:nth-child(3){animation-delay:.4s}@keyframes dot{0%,100%{background:#D9CFC4}40%{background:var(--accent)}}}
#ld-long{margin-top:8px}
.badge.big{display:inline-flex;flex-direction:column;align-items:flex-start;padding:8px 14px;border-radius:14px;font-size:.95rem;margin:0 0 8px}.badge.big::before{display:none}.badge.big .zh{color:inherit;opacity:.8;margin:0}

/* —— 家长端（docs/design/parent-home、progress、report）—— */
a.who{text-decoration:none}
.phome{max-width:980px}
.now{margin:0 0 16px}
.badge.l0{background:var(--neutral);color:var(--mute)}
.kp{list-style:none;margin:0 0 6px;padding:0}
.kp li{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:9px 0;border-top:1px solid var(--line)}.kp li:first-child{border-top:none}
.kp li>span:first-child{min-width:0}.kp b{display:block;font:700 .95rem var(--f-display)}.kp small{display:block;color:var(--mute);font-size:.84rem}
.rec-btn[aria-pressed="true"]{background:var(--mint-soft);border-color:var(--mint);color:var(--good)}
.kids-h{display:flex;align-items:center;justify-content:space-between;margin:26px 0 10px}.kids-h h2{margin:0;font-size:1.2rem}
.kids{display:grid;gap:8px}
.kidrow{display:grid;grid-template-columns:40px 1.4fr 1fr 1fr auto;gap:12px;align-items:center;padding:12px 16px;border:1px solid var(--line);border-radius:16px;background:var(--card)}
.kidrow .av{width:40px;height:40px;border-radius:20px;background:var(--mint-soft);color:var(--good);display:grid;place-items:center;font-weight:800}
.kidrow small{display:block;color:var(--mute);font-size:.84rem}.kidrow .k2,.kidrow .k3{font-size:.9rem;color:var(--mute)}
@media (max-width:700px){.kidrow{grid-template-columns:40px 1fr auto}.kidrow .k2,.kidrow .k3{display:none}}
.kidsw{margin-left:10px}.kidsw .menu-list{left:0;right:auto}
.menu-list a small{display:block;color:var(--mute);font-size:.8rem}.menu-list a{flex-direction:column;align-items:flex-start;justify-content:center;padding:6px 12px}
.menu-list a[aria-current="true"]{background:var(--accent-soft)}
.seg{margin:6px 0 4px}
.kpd>summary{list-style:none;display:grid;grid-template-columns:1.4fr auto 1fr auto;gap:12px;align-items:center;padding:12px 0;cursor:pointer;min-height:56px}
.kpd>summary::-webkit-details-marker{display:none}
.kpd+.kpd{border-top:1px solid var(--line)}
.kpd b{display:block;font:700 .96rem var(--f-display)}.kpd small{display:block;color:var(--mute);font-size:.82rem}
.kpd .sup{font-size:.88rem;color:var(--mute)}.kpd .dl{color:var(--accent);font:600 .9rem var(--f-display);text-decoration:underline;text-underline-offset:4px}
.kpd[open] .dl{opacity:.6}
.kpb{background:var(--neutral);border-radius:14px;padding:12px 14px;margin:0 0 12px}.kpb p{margin:0 0 8px}
.qrow{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:6px 0;border-top:1px dashed var(--line);font-size:.92rem;flex-wrap:wrap}
@media (max-width:700px){.kpd>summary{grid-template-columns:1fr auto}.kpd .sup,.kpd .dl{display:none}}
.r2{margin-left:auto;display:flex;gap:10px;align-items:center;flex-wrap:wrap;justify-content:flex-end}
.steplist{list-style:none;padding:0;margin:14px 0 0;display:grid;gap:10px}.steplist li{margin:0}.steplist p{margin:4px 0}
.qfold2>summary{cursor:pointer;font:700 .95rem var(--f-display);color:var(--accent);min-height:40px;display:flex;align-items:center}
.summary p{margin:0;font-size:1.02rem}
.mrow.tick{align-items:flex-start}.mrow .ok{flex:none;width:24px;height:24px;border-radius:12px;background:var(--mint-soft);color:var(--good);display:grid;place-items:center;font-size:.8rem;margin-top:2px}
.numlist{margin:6px 0;padding-left:1.4em}.numlist li{padding:6px 0}
.gen{border-style:dashed}.gen p{margin:0 0 8px}
.earlier{display:inline-block;margin:0 0 12px}.earlier .menu-list{left:0;right:auto}.earlier>summary.mini{display:inline-flex;align-items:center}
.top .brand{flex:none}.top .linkbtn{white-space:nowrap}
@media (max-width:520px){.top{gap:6px}.top>a.who .nm{display:none}.top>a.who{padding:0 4px}.kidsw{margin-left:4px}.kidsw .nm{max-width:28vw}}

/* —— Logo 回首页、切换到学生登录 —— */
.brand{border-radius:10px;padding:2px;margin:-2px;transition:opacity .18s ease}
.brand:hover{opacity:.82}
.brand:focus-visible{outline:3px solid var(--mint);outline-offset:3px}
.lp .logo{display:inline-flex;border-radius:10px;transition:opacity .18s ease}.lp .logo:hover{opacity:.82}.lp .logo:focus-visible{outline:3px solid var(--mint);outline-offset:3px}
.now-row{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin:0 0 16px}.now-row .now{margin:0}
.to-stu.btn{min-height:48px;border-radius:24px}
.kidrow{grid-template-columns:40px 1.4fr 1fr 1fr auto}
.kidrow .k4{display:flex;gap:14px;align-items:center;flex-wrap:wrap;justify-content:flex-end}
.pick-dlg{border:none;border-radius:22px;padding:24px;max-width:440px;width:calc(100% - 32px);background:var(--card);color:var(--ink);box-shadow:0 30px 80px rgba(20,38,111,.25)}
.pick-dlg::backdrop{background:rgba(20,38,111,.35)}
.pick-dlg h2{margin:0 0 6px;font-size:1.3rem}
.pick-dlg .radio span{display:flex;flex-direction:column}.pick-dlg .radio small{color:var(--mute);font-weight:500}

/* —— 报告问题 —— */
.lesson-foot{justify-content:space-between}
.report-btn{gap:6px;color:var(--mute)}.report-btn:hover{color:var(--accent)}
.report-dlg{max-width:480px}.report-dlg h2 .zh,.report-dlg legend .zh,.report-dlg label .zh,.report-dlg p .zh{font-size:.82rem}
.report-dlg textarea{width:100%;font:500 1rem var(--f-body);padding:10px 12px;border:1.5px solid var(--line);border-radius:var(--r-ctl);resize:vertical}
.report-dlg .radio{min-height:52px;padding:6px 14px}.report-dlg .radio span{display:block}

/* —— 手机学习页：顶部「查看原题」+ 底部固定回答区；看原题用覆盖面板（用户 2026-10-31）—— */
.qbar{display:none}
.zoomable{cursor:zoom-in}
@media (max-width:899px){
  .qbar{display:block;position:sticky;top:64px;z-index:4;margin:-6px -16px 10px;padding:8px 16px;background:rgba(255,249,241,.96);backdrop-filter:blur(6px);border-bottom:1px solid var(--line)}
  .qbar-open{display:flex;align-items:center;gap:12px;width:100%;min-height:52px;padding:6px 12px 6px 6px;border:1.5px solid var(--line);border-radius:16px;background:#fff;color:var(--accent);cursor:pointer;text-align:left}
  .qbar-open .th{flex:none;width:64px;height:42px;object-fit:cover;object-position:top left;border-radius:10px;border:1px solid var(--line);background:#fff}
  .qbar-open span{flex:1;min-width:0}.qbar-open b{display:block;font:700 .98rem var(--f-display)}.qbar-open small{display:block;color:var(--mute);font-size:.8rem}
  .lesson .qcol{display:none}
  .dock{position:sticky;bottom:0;z-index:3;margin:12px -18px -18px;padding:10px 18px calc(12px + env(safe-area-inset-bottom,0px));background:var(--card);border-top:1px solid var(--line);border-radius:0 0 var(--r-card) var(--r-card);box-shadow:0 -8px 18px rgba(120,80,40,.08)}
  .dock .bar:first-child{margin-top:0}
  .dock .start-opts .opt{min-height:44px;padding:8px 12px}
  /* 手机开场：三个选项和输入框压紧，让讲解区多露出来（2026-11-01 手机整题检查） */
  .dock .start-opts{gap:6px}
  .dock .start-opts .opt{min-height:42px;padding:7px 12px;font-size:.95rem}
  .dock .start-opts .opt .zh{display:inline;margin:0 0 0 6px;font-size:.82rem}
  .dock .bar:has(> textarea#in){flex-wrap:nowrap;align-items:flex-end}
  .dock .bar > textarea#in{flex:1 1 0;width:0;min-width:0;min-height:64px;height:64px;max-height:140px;padding-top:9px;padding-bottom:9px;font-size:.95rem;line-height:1.4;resize:none}
  .dock .bar:has(> textarea#in) .btn{flex:none}
  .dock .bar:has(> textarea#in) .btn{padding-left:16px;padding-right:16px}
  .dock .bar > textarea#in::placeholder{font-size:.86rem}
}
.qviewer{border:none;padding:0;margin:0;width:100vw;max-width:100vw;height:100vh;height:100dvh;max-height:none;background:#1F1B18;color:#fff;display:flex;flex-direction:column}
.qviewer:not([open]){display:none}
.qviewer::backdrop{background:rgba(0,0,0,.6)}
.qv-top{display:flex;align-items:center;gap:10px;padding:10px 12px;padding-top:calc(10px + env(safe-area-inset-top,0px));background:#2A2522}
.qv-top>b{font:700 1rem var(--f-display);flex:1}
.qv-zoom{display:flex;border:1px solid #4A423D;border-radius:22px;overflow:hidden}
.qv-zoom button{min-width:44px;min-height:44px;border:none;background:none;color:#fff;font:700 1.1rem var(--f-display);cursor:pointer}.qv-zoom .qv-pct{font-size:.82rem;min-width:56px}
.qv-close{min-height:44px;padding:0 16px;border:none;border-radius:22px;background:#fff;color:var(--accent);font:700 .95rem var(--f-display);cursor:pointer}
.qv-stage{flex:1;overflow:auto;touch-action:pan-x pan-y;-webkit-overflow-scrolling:touch;padding:12px;background:#1F1B18}
.qv-stage img{display:block;width:100%;max-width:none;background:#fff;border-radius:6px;user-select:none}
.qv-zh{max-height:30vh;overflow:auto;padding:0 12px 12px}.qv-zh .qzh{background:#F3EEE8;color:var(--ink)}
.qviewer button:focus-visible{outline:3px solid var(--mint);outline-offset:2px}
.about-dlg h3{margin:16px 0 4px;font-size:1.02rem}.about-dlg p{margin:0 0 8px;line-height:1.6}.about-dlg .nick-mark{width:52px;margin-bottom:6px}
ul.plain{list-style:none;padding:0;margin:8px 0;display:grid;gap:8px;text-align:left;font-size:.95rem;line-height:1.45}ul.plain li b{display:inline-block;min-width:2.2em;color:var(--note)}
.credits-bar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px 16px;padding:12px 16px;margin-top:12px}
.cb-main{display:flex;align-items:center;gap:12px}.cb-main .muted{font-size:.82rem;line-height:1.2}
.cb-n{font:800 1.5rem/1.1 var(--f-display);color:var(--accent);letter-spacing:-.01em}
.cb-main.big{margin:6px 0 10px}.cb-main.big .spark{width:40px;height:40px}.cb-main.big .cb-n{font-size:2.2rem}
.cb-get{white-space:nowrap}.cb-low{flex-basis:100%;margin:0;color:var(--note);font-size:.9rem;font-weight:600}
table.rates{width:100%;border-collapse:collapse;font-size:.92rem;margin:6px 0}
table.rates th,table.rates td{text-align:left;padding:8px 6px;border-bottom:1px solid var(--line);vertical-align:top}
table.rates td:last-child,table.rates th:last-child{text-align:right;white-space:nowrap}
.hist{display:grid;gap:6px;font-size:.9rem}.hrow{display:grid;grid-template-columns:auto 1fr auto;gap:4px 12px;align-items:baseline;padding:6px 0;border-bottom:1px solid var(--line)}
@media(max-width:520px){.hrow{grid-template-columns:1fr auto}.hrow .muted{grid-column:1/-1}}
ul.plain li{display:flex;justify-content:space-between;gap:10px;flex-wrap:wrap}
.sub-q{margin:12px 0 6px;font-weight:600;font-size:.92rem}

/* —— 手机拍的题出现在电脑上 —— */
.fresh{border:2px solid var(--mint);background:var(--mint-soft);display:flex;flex-wrap:wrap;align-items:center;gap:8px 16px}
.fresh .fresh-tag{width:100%;font:700 .82rem var(--f-display);letter-spacing:.04em;color:var(--good)}
.fresh .mrow{flex:1 1 220px}.fresh .btn{flex:none}
.new-toast{position:fixed;right:20px;bottom:20px;z-index:40;display:flex;align-items:center;gap:12px;max-width:min(460px,calc(100vw - 40px));padding:12px 12px 12px 16px;background:var(--card);border:2px solid var(--mint);border-radius:16px;box-shadow:0 12px 30px rgba(25,47,136,.18)}
.new-toast .btn{min-height:40px;padding:0 16px}

/* —— 首页小提示（apps/web/hints.js，2026-11-01）—— */
.ptip{display:flex;gap:12px;align-items:flex-start;background:var(--accent-soft);border-color:#D5DBF0;margin-bottom:14px}
.ptip>svg{flex:none;color:var(--accent);margin-top:2px}
.ptip p{margin:0 0 6px}
.ptip .muted{font-size:.88rem}
.ptip .btn.small,.ihint .btn.small{min-height:40px;padding:6px 16px;font-size:14px}
.ihint{position:fixed;z-index:150;right:20px;bottom:20px;width:min(380px,calc(100vw - 32px));display:flex;gap:12px;align-items:flex-start;padding:16px 16px 14px;background:var(--card);border:1px solid var(--line);border-radius:var(--r-card);box-shadow:0 18px 44px rgba(52,46,42,.18);animation:ih-in .3s ease-out both}
.ihint>img{width:48px;height:48px;border-radius:12px;flex:none}
.ih-b{flex:1;min-width:0}
.ih-b>b{display:block;font:800 16px/1.3 var(--f-display);padding-right:18px}
.ih-b p{margin:4px 0 0;font-size:14px;color:var(--mute);line-height:1.45}
.ih-b .ih-steps{color:var(--ink);background:var(--neutral);border-radius:10px;padding:8px 10px;margin-top:8px}
.ih-a{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px}
.ih-x{position:absolute;top:6px;right:6px;width:36px;height:36px;border:none;background:none;font-size:22px;line-height:1;color:var(--mute);cursor:pointer;border-radius:50%}
.ih-x:hover{background:var(--neutral)}
.ih-x:focus-visible{outline:3px solid var(--mint)}
@keyframes ih-in{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}
@media (max-width:640px){.ihint{left:16px;right:16px;bottom:calc(16px + env(safe-area-inset-bottom,0px));width:auto}}
@media (prefers-reduced-motion:reduce){.ihint{animation:none}}

/* —— 家长端「问题反馈」入口（parent.js，2026-11-02）—— */
.pfoot{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:4px 10px;margin:34px 0 0;padding-top:16px;border-top:1px solid var(--line);color:var(--mute);font-size:.9rem;text-align:center}
.pfoot .linkbtn,.fb-inline .linkbtn,[data-fb].btn{display:inline-flex;align-items:center;gap:6px}
.auth .pfoot{margin-top:22px}
.fb-inline{margin:14px 0 0}
.fb-dlg textarea{min-height:120px}
