/* 页面配色与基础布局。 */
:root{
  --bg1:#f5f7ff; --bg2:#f5f7ff;
  --ink:#273854; --ink2:#576e91; --dim:#7b8eaa;
  --accent:#4c7dff; --accent2:#8fb5ff;
  --success:#4c7dff; --amber:#e89a3c; --red:#e86161;
  --glass:#fff;
  --glass-strong:#fff;
  --card:#fff; --bg:#f5f7ff; --line:#e1e9f5;
  --glass-border:#e1e9f5;
  --shadow:0 2px 8px rgba(37,48,68,.04);
  --r:12px;
  --safe-b:env(safe-area-inset-bottom, 0px);
  --safe-t:env(safe-area-inset-top, 0px);
}
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{height:100%}
body{
  margin:0;
  font:16px/1.7 var(--product-font);
  color:var(--ink);
  background:#f5f7ff;
  overscroll-behavior-y:none;
  overflow-x:hidden;   /* 保险：任何情况下都不出现横向滚动条 */
  max-width:100vw;
}
#app{max-width:720px;margin:0 auto;padding:0 16px;min-height:100%}

/* 顶部用户条允许换行、收缩用户名并隐藏横向溢出，避免退出按钮被挤出视口。 */
.topbar{
  display:flex;align-items:center;gap:7px;flex-wrap:wrap;
  padding:12px 2px 0;font-size:12.5px;color:var(--ink2);
}
.topbar.hidden{display:none}
.topbar .tb-user{
  font-weight:700;color:var(--ink);font-size:13.5px;
  min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:40vw;
}
.topbar .tb-quota{
  background:var(--glass);border:1px solid var(--glass-border);

  border-radius:12px;padding:3px 11px;
  white-space:nowrap;flex:0 0 auto;font-size:12px;
  box-shadow:none;
}
.topbar .tb-actions{margin-left:auto;display:flex;gap:4px;flex:0 0 auto;align-items:center}
.topbar .tb-btn{
  background:var(--glass);border:1px solid var(--glass-border);
  color:var(--accent);border-radius:12px;
  font-size:12.5px;font-weight:600;line-height:normal;font-family:inherit;cursor:pointer;padding:5px 13px;white-space:nowrap;
  box-shadow:none;transition:.15s;
}
.topbar .tb-btn:active{transform:scale(.95)}

/* 底部播放条已经去掉了，不用再留那么大一块空白 */
/* 页面切换：淡入 + 轻微上浮。
 * 「讲解结果页」只淡入不位移 —— 它里面有 position:fixed 的横屏讲解层，
 * 只要祖先带 transform，fixed 就会退化成按容器定位（这个坑踩过一次）。 */
.view{display:none;padding-top:calc(28px + var(--safe-t));padding-bottom:44px}
.view.active{display:block;animation:fade .26s cubic-bezier(.2,.8,.2,1) both}
#view-result.active{animation:fadeOnly .24s ease both}
@keyframes fade{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
@keyframes fadeOnly{from{opacity:0}to{opacity:1}}
/* 系统开了"减少动态效果"就都别动 */
@media (prefers-reduced-motion: reduce){
  .view.active,#view-result.active{animation:none}
}

/* ── 首页 · 聊天式提问 ──
 * 参考 DeepSeek 的聊天首页：居中 logo + 问候语，
 * 底部一条圆角输入条（chips + 附件 + 语音），不再放两个大按钮。
 */
.chat-hero{text-align:left;padding:5vh 8px 28px;max-width:580px;margin:auto}
.chat-logo{
  width:86px;height:86px;border-radius:12px;object-fit:cover;
  box-shadow:none;
  margin-bottom:20px;
}
.chat-title{font-size:clamp(24px,5vw,32px);margin:0 0 14px;letter-spacing:-.4px;font-weight:700;color:var(--ink);line-height:1.45;max-width:420px}
.chat-sub{margin:0;color:var(--ink2);font-size:14.5px;line-height:1.75}
.home-eyebrow{font-size:12px;color:var(--dim);margin:0 0 14px;letter-spacing:.8px}
.home-actions{display:flex;gap:12px;margin-top:28px;flex-wrap:wrap}
.home-actions .btn{min-height:48px;flex:1;min-width:140px}
.home-note{margin:16px 0 0;font-size:12px;line-height:1.8;color:var(--dim)}
#view-home{padding-bottom:220px}
@media(max-height:680px){.chat-hero{padding-top:16px}.chat-hero .chat-logo{display:none}}
.chat-hero .chat-logo{width:48px;height:48px;border-radius:12px;box-shadow:none;margin-bottom:22px}
button:focus-visible,a:focus-visible,input:focus-visible,textarea:focus-visible,select:focus-visible{outline:2px solid var(--accent);outline-offset:3px}
#view-home{padding-bottom:300px}
.hint{text-align:center;color:var(--dim);font-size:12.5px;margin-top:22px;line-height:1.7}
.confirm-head,.confirm-candidates{max-width:620px;margin:0 auto;padding:0 8px}
.confirm-head h2{margin:0 0 8px;font-size:22px}
.confirm-head p{margin:0 0 20px;color:var(--ink2);font-size:14px;line-height:1.65}
.confirm-source{max-width:620px;margin:0 auto 14px;padding:0 8px}
.confirm-source summary{width:max-content;padding:8px 12px;border:1px solid var(--line);border-radius:12px;color:var(--ink2);font-size:13px;cursor:pointer}
.confirm-source-img{display:block;width:auto;max-width:100%;max-height:32vh;object-fit:contain;margin:10px auto 0;border-radius:12px;background:var(--card);border:1px solid var(--line)}
.confirm-card{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:16px;margin:0 0 14px;box-shadow:0 5px 20px rgba(20,40,80,.05)}
.confirm-card h3{margin:0 0 12px;font-size:16px}
.confirm-card label{display:block;margin:12px 0 6px;color:var(--ink2);font-size:13px}
.confirm-card textarea{display:block;width:100%;min-height:82px;resize:vertical;border:1px solid var(--line);border-radius:12px;padding:11px;background:var(--bg);color:var(--ink);font:inherit;line-height:1.55}
.confirm-card textarea.confirm-options{min-height:72px}
.confirm-card .btn{margin-top:12px;width:100%}
#confirm-cancel{display:block;margin:18px auto 0}

/* 底部聊天输入条
 * bottom 抬高到 10vh：贴着屏幕最底下不但手感差，还会被
 * 手机浏览器的地址栏/工具条压住。偏下但不贴底。
 * 老师端还有一条 57px 的底部切换栏，要再往上让一让。
 */
.askbar{
  position:fixed;left:0;right:0;
  bottom:calc(16px + var(--safe-b));
  z-index:80;
  padding:0 12px;
  display:flex;flex-direction:column;align-items:center;gap:8px;
}
body.has-tabbar .askbar{bottom:calc(16px + 57px + var(--safe-b))}

/* 首次使用的引导条：＋ / 🎙 / 打字三个入口一眼看懂，点「知道了」后记住不再出现 */
.ask-hint{
  display:flex;align-items:center;gap:8px;width:100%;
  font-size:12px;color:var(--ink2);
  background:rgba(76,125,255,.09);
  border:1px solid rgba(76,125,255,.18);
  border-radius:12px;padding:7px 6px 7px 11px;margin-bottom:9px;
}
.ask-hint b{color:var(--accent);font-weight:700}
.ask-hint button{
  margin-left:auto;flex:0 0 auto;border:none;border-radius:12px;cursor:pointer;
  background:rgba(76,125,255,.14);color:var(--accent);
  font-size:11.5px;font-weight:700;line-height:1;font-family:inherit;padding:6px 11px;white-space:nowrap;
}
.ask-main{
  width:100%;max-width:696px;
  background:rgba(255,255,255,.78);
  border:1px solid var(--glass-border);

  border-radius:12px;padding:13px 14px 10px;
  box-shadow:none;
}
.ask-input{
  width:100%;border:none;outline:none;background:none;
  font-size:16px;font-weight:normal;line-height:1.6;font-family:inherit;color:var(--ink);
  padding:2px 6px 10px;
}
.ask-input::placeholder{color:var(--dim)}
.ask-row{display:flex;align-items:center;gap:8px}
.ask-chips{display:flex;gap:8px;flex:1;min-width:0;flex-wrap:wrap}
.ask-chip{
  display:inline-flex;align-items:center;gap:5px;
  border:1px solid rgba(150,160,200,.35);background:rgba(255,255,255,.85);
  color:var(--ink2);border-radius:12px;padding:6px 13px;
  font-size:13px;font-weight:600;line-height:1;font-family:inherit;cursor:pointer;transition:.15s;
}
.ask-chip:active{transform:scale(.95)}
/* 深度思考这类「开关」chips：默认素白，打开才点亮成渐变胶囊 */
.ask-chip.on{
  background:#4c7dff;color:#fff;border-color:transparent;
  box-shadow:none;
}
/* 输入框有文字时，🎙 圆钮切换成发送 ↑ */
.ask-round .ico-send{display:none}
.ask-round.send{background:#4c7dff;color:#fff;border-color:transparent;
  box-shadow:0 5px 14px rgba(76,125,255,.4)}
.ask-round.send .ico-mic{display:none}
.ask-round.send .ico-send{display:block}
.ask-tools{display:flex;gap:9px;flex:0 0 auto}
.ask-round{
  width:38px;height:38px;flex:0 0 38px;border-radius:50%;border:1px solid rgba(76,125,255,.3);
  background:rgba(255,255,255,.85);color:var(--accent);
  font-size:17px;line-height:1;display:flex;align-items:center;justify-content:center;
  cursor:pointer;transition:.15s;box-shadow:none;
  font-family:inherit;
}
.ask-round:active{transform:scale(.92)}
.ask-round.on{background:#4c7dff;color:#fff;border-color:transparent}

/* ＋号 / 语音弹出的面板：挂在输入条下面 */
.attach-panel,.voice-panel{
  width:100%;max-width:696px;
  background:rgba(255,255,255,.82);
  border:1px solid var(--glass-border);

  border-radius:22px;padding:14px;
  box-shadow:none;
  animation:upIn2 .2s ease;
}
@keyframes upIn2{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}
.attach-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}
.att-item{
  border:none;background:rgba(120,140,220,.08);border-radius:12px;
  padding:16px 6px 13px;cursor:pointer;font-size:13.5px;font-weight:600;line-height:1.4;font-family:inherit;color:var(--ink);
  display:flex;flex-direction:column;align-items:center;gap:8px;transition:.15s;
}
.att-item:active{transform:scale(.96);background:rgba(76,125,255,.13)}
.att-ico{
  width:44px;height:44px;border-radius:12px;background:#fff;
  display:flex;align-items:center;justify-content:center;font-size:22px;
  box-shadow:none;
}
.voice-hold{
  width:100%;border:none;border-radius:12px;padding:22px;cursor:pointer;
  background:#4c7dff;color:#fff;
  font-size:17px;font-weight:700;line-height:1;font-family:inherit;letter-spacing:2px;
  box-shadow:none;
  transition:.15s;user-select:none;-webkit-user-select:none;
}
.voice-hold:active{transform:scale(.985)}
.voice-hold.rec{animation:pulse 1.1s infinite}
.voice-tip{text-align:center;font-size:12px;color:var(--dim);margin-top:9px}

/* ── 通用按钮（处理中/记录页还在用） ── */
.btn{
  border:none;border-radius:19px;padding:17px 20px;font-size:17px;font-weight:700;
  font-family:inherit;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:9px;
  transition:transform .15s,box-shadow .15s,filter .15s;position:relative;overflow:hidden;
}
.btn:active{transform:scale(.975)}
.btn.primary{
  background:#4c7dff;color:#fff;
  box-shadow:none;
}
.btn.primary::after{ /* Decorative highlight disabled. */
  display:none;
  content:"";position:absolute;left:8%;right:8%;top:0;height:46%;
  background:linear-gradient(180deg,rgba(255,255,255,.28),rgba(255,255,255,0));
  border-radius:19px 19px 60% 60%/19px 19px 100% 100%;pointer-events:none;
}
.btn.ghost{
  background:var(--glass);color:var(--accent);
  border:1px solid var(--glass-border);

  box-shadow:var(--shadow);
}
.btn.ghost:hover{background:var(--glass-strong)}
.btn.text{background:none;color:var(--dim);font-weight:500;font-size:14px;padding:12px;box-shadow:none;margin:14px auto 0}
.btn.text::after{display:none}
.btn[disabled]{opacity:.5;pointer-events:none}

/* ── 处理中 ── */
.scan-box{
  position:relative;border-radius:var(--r);overflow:hidden;
  background:var(--glass-strong);

  box-shadow:var(--shadow);margin-bottom:22px;
}
.scan-box img{display:block;width:100%;max-height:44vh;object-fit:contain;background:rgba(244,246,253,.9)}
/* 文字搜题没有图片预览：只留取景框和扫描线当动效 */
.scan-box.text-only{min-height:130px}
.scan-box.text-only img{display:none}
/* 取景器：四角括号（用一个元素 + 8 段背景渐变画出 4 个 L 角） */
.scan-frame{
  position:absolute;inset:10px;border-radius:10px;pointer-events:none;
  --c:rgba(76,125,255,.95);
  background:
    linear-gradient(var(--c),var(--c)) left 0 top 0/30px 3px,
    linear-gradient(var(--c),var(--c)) left 0 top 0/3px 30px,
    linear-gradient(var(--c),var(--c)) right 0 top 0/30px 3px,
    linear-gradient(var(--c),var(--c)) right 0 top 0/3px 30px,
    linear-gradient(var(--c),var(--c)) left 0 bottom 0/30px 3px,
    linear-gradient(var(--c),var(--c)) left 0 bottom 0/3px 30px,
    linear-gradient(var(--c),var(--c)) right 0 bottom 0/30px 3px,
    linear-gradient(var(--c),var(--c)) right 0 bottom 0/3px 30px;
  background-repeat:no-repeat;
}
.scan-line{
  position:absolute;left:26px;right:26px;height:2.5px;border-radius:2px;
  background:linear-gradient(90deg,transparent,#8fb5ff,#4c7dff,transparent);
  box-shadow:none;
  animation:scan 2.1s ease-in-out infinite;
}
@keyframes scan{0%{top:18px}50%{top:calc(100% - 20px)}100%{top:18px}}
.loading-title{font-size:17px;text-align:center;margin:0 0 18px;font-weight:700}
.progress{list-style:none;margin:0;padding:0}
.progress li{
  display:flex;align-items:center;gap:10px;padding:10px 15px;margin-bottom:9px;
  background:var(--glass);border:1px solid var(--glass-border);

  border-radius:12px;font-size:14.5px;color:var(--ink2);
  box-shadow:none;
  animation:slideIn .32s ease;
}
@keyframes slideIn{from{opacity:0;transform:translateX(-10px)}to{opacity:1;transform:none}}
.progress li .dot{
  width:18px;height:18px;flex:0 0 18px;border-radius:50%;border:2px solid #ccd4f0;
  display:flex;align-items:center;justify-content:center;font-size:11px;color:#fff;
}
.progress li.done .dot{background:var(--success);border-color:var(--success)}
.progress li.done .dot::after{content:"✓"}
.progress li.active .dot{border-color:var(--accent);border-top-color:transparent;animation:spin .8s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.progress li.active{color:var(--ink);font-weight:600}

/* ── 结果页 ── */
.card{
  background:var(--glass);
  border:1px solid var(--glass-border);

  border-radius:var(--r);padding:19px 21px;
  box-shadow:var(--shadow);
  margin-bottom:15px;animation:cardIn .34s ease backwards;
}
@keyframes cardIn{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
.sec-title{font-size:15.5px;margin:0 0 12px;color:var(--accent);font-weight:700}
.banner{
  background:#eef5ff;
  border:1px solid rgba(240,214,158,.75);border-radius:var(--r);

  padding:14px 18px;margin-bottom:15px;font-size:13.5px;color:#8a5a10;line-height:1.7;
  box-shadow:0 6px 20px rgba(224,154,60,.12);
}
.banner b{display:block;margin-bottom:4px}

.q-text{font-size:16px;line-height:2;word-break:break-word}
.choices{margin:11px 0 0;padding:0;list-style:none}
.choices li{padding:3px 0;color:var(--ink2);line-height:1.95;word-break:break-word}
.chips{margin-top:14px;display:flex;flex-wrap:wrap;gap:7px}
.chip{
  background:#eef5ff;
  color:var(--accent);border-radius:12px;padding:4px 13px;font-size:12.5px;font-weight:700;
}
.badge{
  font-size:12px;color:var(--ink2);
  background:rgba(255,255,255,.7);border:1px solid var(--glass-border);
  border-radius:12px;padding:4px 12px;
}

/* 步骤 */
.step{padding:17px 20px 15px}
.step-head{display:flex;align-items:center;gap:11px;margin-bottom:9px}
.step-no{
  width:29px;height:29px;flex:0 0 29px;border-radius:11px;
  background:#4c7dff;color:#fff;font-weight:800;font-size:14px;
  display:flex;align-items:center;justify-content:center;
  box-shadow:none;
}
.step-title{flex:1;min-width:0}
.step-title h3{margin:0;font-size:15.5px;font-weight:700}
.step-type{font-size:11px;color:var(--dim)}
.step-play{
  width:36px;height:36px;flex:0 0 36px;border-radius:50%;border:none;cursor:pointer;
  background:#4c7dff;color:#fff;font-size:12px;
  display:flex;align-items:center;justify-content:center;font-family:inherit;
  box-shadow:none;
  transition:.15s;
}
.step-play:active{transform:scale(.94)}
.step-play.playing{animation:pulse 1.1s infinite}
@keyframes pulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.85;transform:scale(.96)}}
/* 没有底部播放条了，所以每一步的按钮自己要说清楚状态：
   灰着转圈＝语音还在合成，点了会等；↻＝合成失败，点一下重试 */
.step-play.loading{background:#dfe4fa;color:var(--accent);box-shadow:none;animation:softPulse 1.2s ease-in-out infinite}
@keyframes softPulse{0%,100%{opacity:.5}50%{opacity:1}}
.step-play.failed{background:#fdeaea;color:var(--red);box-shadow:none}
.step-play[disabled]{opacity:.4;animation:none}
.screen-text{font-size:15.5px;line-height:2;word-break:break-word}
.speech{margin-top:11px;border-top:1px dashed rgba(120,130,200,.25);padding-top:9px}
.speech summary{cursor:pointer;font-size:12.5px;color:var(--dim);user-select:none;outline:none;list-style:none}
.speech summary::-webkit-details-marker{display:none}
.speech summary::before{content:"▸ ";transition:transform .2s}
.speech[open] summary::before{content:"▾ "}
.speech p{
  margin:9px 0 0;font-size:13.5px;line-height:1.95;color:var(--ink2);
  background:rgba(244,246,253,.85);border-radius:12px;padding:11px 15px;
}

ul.plain{margin:0;padding-left:19px;color:var(--ink2);font-size:14.5px;line-height:1.95}
ul.plain li{margin-bottom:5px}
.sim{padding:10px 0;border-bottom:1px dashed rgba(120,130,200,.22)}
.sim:last-child{border-bottom:none;padding-bottom:0}
.sim-q{font-size:15px;line-height:1.95}
.sim details{margin-top:8px}
.sim summary{cursor:pointer;font-size:12.5px;color:var(--accent);outline:none}
.sim-a{margin:10px 0 4px}

/* 答案（默认藏起来） */
.answer-card{
  background:#eef5ff;
  border:1px solid rgba(218,224,246,.8);

  box-shadow:0 8px 24px rgba(76,125,255,.14);
}
.answer-locked{display:flex;align-items:center;justify-content:space-between;gap:12px}
.answer-locked .lbl{font-size:14px;color:var(--ink2)}
.answer-locked button{
  border:none;background:#eef5ff;color:#fff;
  border-radius:13px;padding:9px 19px;font-size:14px;font-weight:700;font-family:inherit;cursor:pointer;
  box-shadow:0 6px 16px rgba(76,125,255,.35), inset 0 1px 0 rgba(255,255,255,.35);transition:.15s;
}
.answer-locked button:active{transform:scale(.96)}
.answer-shown{display:flex;align-items:center;gap:12px}
.answer-shown .k{font-size:13px;color:var(--success);font-weight:800;white-space:nowrap}
.answer-shown .v{font-size:18px;font-weight:800}

.warn-card{
  background:#eef5ff;
  border:1px solid rgba(240,224,180,.8);box-shadow:0 6px 18px rgba(232,154,60,.10);
}
.warn-card .sec-title{color:var(--amber)}
.warn-card ul{color:#8a6a2a}

/* toast */
@keyframes upIn{from{opacity:0;transform:translate(-50%,16px)}to{opacity:1;transform:translate(-50%,0)}}
.toast{
  position:fixed;left:50%;transform:translateX(-50%);bottom:88px;
  background:rgba(42,51,82,.92);color:#fff;padding:12px 21px;border-radius:12px;

  box-shadow:0 12px 30px rgba(42,51,82,.35);
  font-size:14px;z-index:99;max-width:86%;text-align:center;line-height:1.6;
  animation:upIn .25s ease;
}
.toast.hidden{display:none}

.katex{font-size:1.03em}
.katex-display{margin:9px 0;overflow-x:auto;overflow-y:hidden}

/* ── 老师专用的底部切换栏（学生看不到） ── */
/* 有切换栏时，页面底部留出位置别被压住 */
body.has-tabbar .view{padding-bottom:120px}

/* markdown 粗体 / 行内代码 */
.q-text strong,.screen-text strong,.sim-q strong,ul.plain strong,.sim p strong{font-weight:700;color:var(--ink)}
code{
  background:rgba(76,125,255,.1);color:var(--accent);padding:1.5px 6px;border-radius:6px;
  font-size:.92em;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  word-break:break-word;
}

/* ── 讲解两段式 ──
 * 第一段（竖屏）：解答过程 —— 像学生考卷一样只有步骤，不带分析块。
 * 第二段（横屏）：左栏完整讲解 + 右栏当前语音文本、麦克风、提问条。
 */

/* 第一段的纯步骤：一条接一条，中间用淡分隔线，不带卡片装饰 */
.sol-line{padding:12px 2px;border-bottom:1px dashed rgba(120,140,210,.22)}
.sol-line:last-child{border-bottom:none;padding-bottom:4px}
.sol-line .screen-text{font-size:15.5px}

/* 分步讲解入口位于结果页顶部，方便找到。
   早先做成悬浮胶囊会压住老师端底部切换栏，现在是文档流里的普通块。 */
.analyze-cta{
  display:flex;flex-direction:column;align-items:center;gap:5px;
  width:100%;margin:2px 0 14px;
  border:none;border-radius:12px;cursor:pointer;
  background:#4c7dff;color:#fff;
  font-family:inherit;
  padding:15px 20px 13px;
  box-shadow:none;
  transition:.15s;
}
.analyze-cta .cta-main{font-size:16.5px;font-weight:800;line-height:1;font-family:inherit;display:flex;align-items:center;gap:8px}
.analyze-cta .cta-main .ply{
  display:inline-flex;width:24px;height:24px;border-radius:50%;
  background:rgba(255,255,255,.22);align-items:center;justify-content:center;
  font-size:11px;padding-left:2px;
}
.analyze-cta .cta-sub{font-size:12px;font-weight:500;line-height:1;font-family:inherit;color:rgba(255,255,255,.85)}
.analyze-cta:active{transform:scale(.98)}
.analyze-cta.hidden{display:none}

/* ═══ 横屏讲解页：全屏两栏 ═══
 * 注意：竖屏下点进去也先铺满全屏，再靠旋转变成横向，
 * 所以定位/尺寸这套要写在 in-analysis 上，伪横屏只加旋转。
 */
body.in-analysis #phase-analysis{
  position:fixed;top:0;left:0;z-index:200;
  width:100%;height:var(--analysis-height,100dvh);
  display:grid;grid-template-columns:1fr 304px;
  /* 行高钉死成 100%：讲解再长也只能在自己那格里滚，
     不会把整行撑高、把右栏底部的按钮和输入条顶出屏幕外 */
  grid-template-rows:100%;gap:0;
  overflow:hidden;
  background:#f5f7ff;
}
/* 讲解页独占屏幕：外层导航和聊天条都让位 */
body.in-analysis .topbar,
body.in-analysis .teacher-nav,
body.in-analysis .askbar,
body.in-analysis .analyze-cta,
body.in-analysis #phase-solution{display:none}

/* 外层 .view 的 fade 动画会给 #view-result 留一个 transform，
   而带 transform 的祖先会变成 position:fixed 的包含块 ——
   讲解页那层「铺满整个屏幕」立刻失效，退化成按外层容器定位。
   页面被切到后台时动画帧被节流、停在第一帧，这个 transform 就一直挂着，
   所以这里必须显式清掉，别指望动画自己跑完。 */
body.in-analysis #view-result{animation:none;transform:none}

/* 左栏顶部的返回条 */
.analysis-head{
  display:flex;align-items:center;gap:10px;
  background:rgba(255,255,255,.72);
  border:1px solid var(--glass-border);border-radius:12px;
  padding:8px 11px;margin-bottom:12px;
  box-shadow:var(--shadow);
  position:sticky;top:0;z-index:5;

}
.analysis-head b{font-size:14.5px;font-weight:700}
.analysis-head-tip{margin-left:auto;font-size:11px;color:var(--dim)}
.analysis-head .ask-round{width:30px;height:30px;flex:0 0 30px;font-size:14px}
/* 横屏讲解页里的「题目一/二/三」：点一下就换题。
   有它在的时候藏掉那句提示，窄屏别两行挤在一起。 */
.ana-pager{
  display:flex;gap:6px;min-width:0;overflow-x:auto;scrollbar-width:none;
  margin-left:8px;max-width:52%;
}
.ana-pager::-webkit-scrollbar{display:none}
.ana-pager .ana-q{
  flex:0 0 auto;border:1px solid rgba(76,125,255,.3);border-radius:12px;
  background:rgba(255,255,255,.85);color:var(--ink2);
  font-size:11.5px;font-weight:700;line-height:1;font-family:inherit;padding:7px 11px;cursor:pointer;white-space:nowrap;
  transition:.15s;
}
.ana-pager .ana-q:active{transform:scale(.95)}
.ana-pager .ana-q.on{
  background:#4c7dff;color:#fff;border-color:transparent;
  box-shadow:none;
}
.ana-pager .ana-q.todo{border-style:dashed;opacity:.8}
.ana-pager:not(.hidden) ~ .analysis-head-tip{display:none}

/* 左栏：完整的讲解内容，自己滚动。
   伪横屏那一层是 rotate(90deg)，手指"往上滑"在内容坐标系里其实是横向位移 ——
   这里**不能**写 touch-action: pan-y（那等于只允许内容坐标系的纵向手势，
   正好把学生的手势挡掉，实测就是"左边滑不动"）。留着默认 auto：
   纵向手势浏览器自己滚，横向手势交给 JS 切题。
   position:relative 是给自动跟随用的：每张步骤卡片的 offsetTop
   就成了"离滚动区顶部的距离"，换算 scrollTop 不受旋转影响。 */
.ana-left{
  position:relative;
  min-width:0;min-height:0;overflow-y:auto;overflow-x:hidden;
  padding:14px 18px 30px;
  -webkit-overflow-scrolling:touch;
  overscroll-behavior:contain;
}
/* 字号收一收：横屏一屏能放更多，也别让一行字长得读不下去 */
.ana-left .screen-text{font-size:14px;line-height:1.85}
.ana-left .step{padding:14px 16px 12px}
.ana-left .step-title h3{font-size:14.5px}
.ana-left .step-no{width:26px;height:26px;flex:0 0 26px;font-size:13px;border-radius:9px}
.ana-left .step-play{width:32px;height:32px;flex:0 0 32px;font-size:11px}
.ana-left .card{padding:14px 16px;margin-bottom:12px;border-radius:16px}
.ana-left .sec-title{font-size:14px;margin-bottom:9px}
.ana-left ul.plain{font-size:13.5px;line-height:1.85}
.ana-left .sim-q{font-size:14px}
.ana-left .sim-a{margin:8px 0 2px}
.ana-left .speech p{font-size:13px;padding:9px 12px}
.ana-left .speech summary{font-size:12px}
.ana-left .analysis-head{max-width:520px}

/* 讲解页开头那张「原题」：虚线框表示这是引用、不是讲解，
   但字要看得清（放开头就是要给学生对着看的，别做成淡淡的脚注）。
   字号仍比讲解正文小一号，免得跟讲解抢。 */
.orig-card{background:rgba(255,255,255,.72);border-style:dashed}
.orig-card .sec-title{color:var(--accent)}
.ana-left .orig-card .q-text{font-size:13.5px;line-height:1.95;color:var(--ink)}
.ana-left .orig-card .choices li{font-size:13px;color:var(--ink2)}

/* 当前正在讲的那一步：高亮出来，方便对上右栏的话 */
.ana-left .step.current{
  box-shadow:none;
  border-color:transparent;
}

/* 右栏：老师面板
 * 整栏高度锁死（min-height:0 + overflow:hidden），
 * 中间的讲解框 flex:1 吃掉剩余空间、自己滚 —— 讲解再长也挤不走下面的按钮。
 */
.ana-right{
  min-width:0;min-height:0;height:100%;overflow:hidden;
  display:flex;flex-direction:column;
  padding:16px 16px calc(14px + var(--safe-b));
  background:rgba(255,255,255,.5);
  border-left:1px solid var(--glass-border);

}
.ana-logo{
  width:46px;height:46px;border-radius:12px;object-fit:cover;flex:0 0 auto;
  box-shadow:none;
}

/* ── 讲解页右上角的两个小工具：倍速 / 反馈 ──
 * 设计要求是「完美融入、不突兀，不显眼但也不能让人找不到」，所以：
 *   · 用右栏其它玻璃件同一套料（白玻璃 + 玻璃描边 + 圆角胶囊），不引入新样式；
 *   · 文字用灰蓝 --ink2，不用强调色 —— 一眼扫过去不该先看到它；
 *   · 但位置固定在右栏顶上、和品牌 logo 并排，抬头就在，不用找。
 * 学生动过倍速、或者反馈过，才给一点点强调色（.on），算是个安静的"已设置"。
 */
.ana-top{flex:0 0 auto;display:flex;align-items:center;gap:8px}
.ana-tools{margin-left:auto;display:flex;gap:6px}
.ana-tool{
  background:rgba(255,255,255,.62);border:1px solid var(--glass-border);
  color:var(--ink2);border-radius:12px;padding:6px 11px;cursor:pointer;
  font-size:12px;font-weight:600;line-height:1;font-family:inherit;transition:.15s;
}
.ana-tool:active{transform:scale(.95)}
.ana-tool.on{
  color:var(--accent);border-color:rgba(76,125,255,.32);background:rgba(255,255,255,.92);
}

/* 浮层：铺满整个讲解页，点空白处关掉 */
.ana-panel{position:absolute;inset:0;z-index:40}
.ana-panel-bg{position:absolute;inset:0}
/* 倍速那个不压暗页面（还在听声音，压暗反而分心）；反馈那个压暗，好专心选 */
.ana-panel.dim .ana-panel-bg{
  background:rgba(42,51,82,.3);

}
.ana-panel-card{
  position:absolute;background:rgba(255,255,255,.97);
  border:1px solid var(--glass-border);border-radius:12px;
  box-shadow:none;
  padding:14px 16px 15px;
}
/* 倍速：贴在「倍速」按钮下面，像个下拉；反馈：居中，像张卡片 */
.ana-panel-card.anchor{top:70px;right:16px;width:196px}
.ana-panel-card.center{
  left:50%;top:50%;transform:translate(-50%,-50%);width:min(430px,74%);
}
.ana-panel-title{
  display:flex;align-items:center;gap:8px;
  font-size:14.5px;font-weight:800;color:var(--ink);
}
.ana-panel-close{
  margin-left:auto;width:24px;height:24px;flex:0 0 24px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;cursor:pointer;
  background:rgba(233,236,248,.9);color:var(--ink2);font-size:12px;font-weight:700;
}
.ana-panel-close:active{transform:scale(.94)}
.ana-panel-sub{font-size:12px;color:var(--dim);margin-top:6px;line-height:1.6}

/* 倍速档位 */
.sp-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:7px;margin:12px 0 0}
.sp-item{
  border:1px solid rgba(219,225,244,.95);background:rgba(246,248,254,.95);
  color:var(--ink2);border-radius:11px;padding:9px 0;cursor:pointer;
  font-size:13px;font-weight:700;line-height:1;font-family:inherit;transition:.15s;
}
.sp-item:active{transform:scale(.96)}
.sp-item.on{
  background:#4c7dff;color:#fff;border-color:transparent;
  box-shadow:none;
}
.sp-foot{
  margin-top:11px;padding-top:10px;border-top:1px solid rgba(226,230,240,.8);
  font-size:11.5px;color:var(--dim);line-height:1.7;
}
.sp-reset{
  background:none;border:none;padding:0;cursor:pointer;
  font-size:11.5px;font-weight:600;line-height:1;font-family:inherit;color:var(--accent);
}

/* 反馈：三个表情 + 「题目出错了」 */
.fb-where{font-size:12px;color:var(--dim);margin-top:7px}
.fb-faces{display:flex;gap:9px;margin:13px 0 0}
.fb-face{
  flex:1;display:flex;flex-direction:column;align-items:center;gap:8px;
  background:rgba(246,248,254,.95);border:1px solid rgba(219,225,244,.95);
  border-radius:12px;padding:12px 4px 10px;cursor:pointer;transition:.15s;
  font-size:12.5px;font-weight:600;line-height:1;font-family:inherit;color:var(--ink2);
}
.fb-face:active{transform:scale(.96)}
.fb-face.on{border-color:rgba(76,125,255,.42);color:var(--accent);background:#fff}
.fb-face svg{width:36px;height:36px;display:block}
.fb-or{
  display:flex;align-items:center;gap:10px;margin:14px 0 11px;
  font-size:11.5px;color:var(--dim);
}
.fb-or::before,.fb-or::after{content:'';flex:1;height:1px;background:rgba(226,230,240,.9)}
/* 卡片本身是白的，按钮再用白底就糊成一片了（实测第一版就是这样，
   看着像一行普通文字）—— 这里单独用淡蓝灰底 + 可见的描边。 */
.fb-err{
  width:100%;display:flex;align-items:center;justify-content:center;gap:7px;
  background:rgba(240,243,253,.9);border:1px solid rgba(226,230,240,.95);
  border-radius:13px;padding:11px;cursor:pointer;transition:.15s;
  font-size:13px;font-weight:600;line-height:1;font-family:inherit;color:var(--ink2);
}
.fb-err::before{
  content:'';width:5px;height:5px;border-radius:50%;background:var(--amber);flex:0 0 5px;
}
.fb-err:active{transform:scale(.98)}
.fb-note{
  width:100%;min-height:68px;resize:none;outline:none;
  border:1px solid rgba(226,230,240,.95);border-radius:13px;padding:10px 12px;
  margin-top:11px;background:rgba(250,251,255,.95);
  font-size:13.5px;font-weight:normal;line-height:1.65;font-family:inherit;color:var(--ink);
}
.fb-note::placeholder{color:var(--dim)}
.fb-note:focus{border-color:rgba(76,125,255,.45);background:#fff}
.fb-btns{display:flex;gap:9px;margin-top:11px}
.fb-btns button{
  flex:1;border-radius:13px;padding:11px;cursor:pointer;transition:.15s;
  font-size:13.5px;font-weight:700;line-height:1;font-family:inherit;
  border:1px solid rgba(226,230,240,.95);
}
.fb-btns .fb-back{background:rgba(240,243,253,.9);color:var(--ink2)}
.fb-btns .fb-send{background:#4c7dff;color:#fff;border-color:transparent}
.fb-btns button:active{transform:scale(.98)}
/* 触屏设备上输入框字号必须 ≥16px，否则一聚焦浏览器就把整页放大
   （和 .ana-ask input 同一个坑，见下面 @media (pointer:coarse) 那段） */
@media (pointer:coarse){
  .fb-note{font-size:16px;line-height:1.5}
}
/* 当前步骤的朗读文本区域，不显示步骤标题。 */
.ana-say{
  flex:1 1 auto;min-height:0;overflow-y:auto;
  overscroll-behavior:contain;
  margin:12px 0 10px;padding:12px 14px;
  background:rgba(255,255,255,.74);
  border:1px solid var(--glass-border);border-radius:16px;
  box-shadow:var(--shadow);
}
.ana-say-text{
  margin:0;font-size:14px;line-height:1.9;color:var(--ink2);
}
.ana-step-status{font-size:12px;color:var(--ink2);font-weight:600;margin:0 0 8px}
.ana-say.idle .ana-say-text{color:var(--dim)}
.followup-head{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:12px;color:var(--ink2)}
.followup-head button{font:inherit;background:none;border:0;color:var(--accent,#476bc7);cursor:pointer;padding:4px}
.followup-message{font-size:13px;line-height:1.8;overflow-wrap:anywhere;margin:12px 0;padding:9px 10px;border-radius:10px;background:var(--paper,#fff)}
.followup-message.user{background:#eef2fa;color:var(--ink2)}
#followup-status{font-size:12px;line-height:1.6;color:var(--dim)}

.ana-pause{
  flex:0 0 auto;width:100%;border:1px solid rgba(76,125,255,.28);
  background:rgba(255,255,255,.85);color:var(--accent);
  border-radius:12px;padding:10px;cursor:pointer;
  font-size:14px;font-weight:700;line-height:1;font-family:inherit;transition:.15s;
  box-shadow:none;
}
.ana-pause:active{transform:scale(.98)}
.ana-pause[disabled]{opacity:.45;pointer-events:none}

/* 麦克风 */
.ana-micwrap{flex:0 0 auto;display:flex;flex-direction:column;align-items:center;gap:7px;margin:14px 0 12px}
.ana-mic{
  width:66px;height:66px;border-radius:50%;border:none;cursor:pointer;
  background:#4c7dff;color:#fff;
  display:flex;align-items:center;justify-content:center;
  box-shadow:none;
  transition:.15s;
}
.ana-mic:active{transform:scale(.94)}
.ana-mic.rec{animation:pulse 1.1s infinite}
.ana-mictip{font-size:11.5px;color:var(--dim)}

/* 提问小条：只有输入框 + 发送 */
.ana-ask{
  flex:0 0 auto;display:flex;align-items:center;gap:8px;
  background:rgba(255,255,255,.85);
  border:1px solid var(--glass-border);border-radius:12px;
  padding:6px 6px 6px 13px;
  box-shadow:none;
}
.ana-ask input{
  flex:1;min-width:0;border:none;outline:none;background:none;
  font-size:13.5px;font-weight:normal;line-height:1.5;font-family:inherit;color:var(--ink);padding:6px 0;
}
.ana-ask input::placeholder{color:var(--dim)}
.ana-ask button{
  flex:0 0 32px;width:32px;height:32px;border-radius:10px;border:none;cursor:pointer;
  background:#4c7dff;color:#fff;
  display:flex;align-items:center;justify-content:center;transition:.15s;
}
.ana-ask button:active{transform:scale(.94)}

@media (pointer:coarse){
  .ana-ask input{font-size:16px;line-height:1.4}
}

/* 窄屏（手机横过来也就 700~900px 宽）：右栏收窄，别把讲解挤没 */
@media (max-width:820px){
  body.in-analysis #phase-analysis{grid-template-columns:1fr 246px}
  .ana-right{padding:12px 12px calc(10px + var(--safe-b))}
  .ana-logo{width:38px;height:38px;border-radius:11px}
  .ana-tool{padding:5px 10px;font-size:11.5px}
  .ana-panel-card.anchor{top:58px;right:12px;width:184px}
  .ana-say{margin:10px 0 9px;padding:10px 11px;border-radius:12px}
  .ana-say-text{font-size:12px;line-height:1.88}
  .ana-mic{width:54px;height:54px}
  .ana-micwrap{margin:10px 0 9px}
  .ana-pause{padding:8px;font-size:13px}
  .ana-left{padding:12px 12px 24px}
}

/* 矮屏时缩小固定区域，为讲解框保留滚动空间；极矮屏在下方单独处理。 */
@media (max-height:440px){
  .ana-right{padding-top:10px;padding-bottom:calc(8px + var(--safe-b))}
  .ana-logo{width:34px;height:34px;border-radius:10px}
  .ana-panel-card{padding:12px 13px 13px}
  .ana-panel-card.anchor{top:52px;width:180px}
  .ana-panel-title{font-size:13.5px}
  .sp-item{padding:7px 0;font-size:12.5px}
  .fb-face{padding:9px 3px 8px;font-size:11.5px}
  .fb-face svg{width:30px;height:30px}
  .ana-say{margin:8px 0 8px}
  .ana-say-text{font-size:11.5px;line-height:1.85}
  .ana-pause{padding:7px;font-size:12.5px;border-radius:12px}
  .ana-micwrap{margin:8px 0}
  .ana-mic{width:46px;height:46px}
  .ana-mic svg{width:22px;height:22px}
  .ana-mictip{font-size:11px}
  .ana-ask{padding:4px 4px 4px 11px}
  .ana-ask input{font-size:12.5px;padding:5px 0}
  .ana-ask button{flex:0 0 28px;width:28px;height:28px;border-radius:9px}
}

/* 特别矮（老机型横屏）：麦克风和小字并排，再省一行高度 */
@media (max-height:360px){
  .ana-micwrap{flex-direction:row;gap:10px}
}

/* 通用隐藏：askbar / 附件面板 / 语音面板 / 框选页 / 悬浮按钮都靠它收起来。
   用 !important 是因为文件后面还有 .crop-panel 这类自带 display:flex 的规则，
   同权重比"谁靠后"的话隐藏会失效（2026-09-13 踩过）。 */
.hidden{display:none !important}

@media(max-width:700px){
  body.in-analysis #phase-analysis{grid-template-columns:1fr;grid-template-rows:minmax(0,1fr) 280px}
  body.in-analysis .ana-left{padding:10px 12px 16px;touch-action:pan-y}
  body.in-analysis .ana-left .screen-text{font-size:16px;line-height:1.85}
  body.in-analysis .ana-left .step-play{width:44px;height:44px;flex-basis:44px;font-size:14px}
  body.in-analysis .ana-right{display:grid;grid-template-columns:1fr 44px;grid-template-rows:32px minmax(80px,1fr) 36px 44px;gap:8px;padding:10px 12px calc(10px + var(--safe-b));border-left:0;border-top:1px solid var(--glass-border)}
  body.in-analysis .ana-top{grid-column:1 / -1;grid-row:1}
  body.in-analysis .ana-logo{width:28px;height:28px;border-radius:8px;box-shadow:none}
  body.in-analysis .ana-say{grid-column:1 / -1;grid-row:2;margin:0;padding:8px 10px;box-shadow:none}
  body.in-analysis .ana-say-text{font-size:14px;line-height:1.75}
  body.in-analysis .ana-pause{grid-column:1;grid-row:3;margin:0;padding:6px;font-size:14px}
  body.in-analysis .ana-micwrap{grid-column:2;grid-row:3;margin:0}
  body.in-analysis .ana-mic{width:36px;height:36px;box-shadow:none}
  body.in-analysis .ana-mic svg{width:20px;height:20px}
  body.in-analysis .ana-mictip{display:none}
  body.in-analysis .ana-ask{grid-column:1 / -1;grid-row:4;padding:4px 4px 4px 10px}
  body.in-analysis .ana-ask input{font-size:16px}
  body.in-analysis .analysis-head{max-width:none;gap:8px}
  body.in-analysis .analysis-head-tip{display:none}
  body.in-analysis.analysis-keyboard #phase-analysis{grid-template-rows:56px minmax(0,1fr)}
}

/* ═══ 页面内相机：全屏取景 + 快门，拍完直接进框选 ═══
 * 存在的意义：系统相机拍完必然先问「使用照片 / 重拍」，网页跳不过去。
 * z-index 290 —— 比框选页（300）低一层，拍完立刻让位，视觉上是一次连续的操作。
 */
.cam-panel{
  position:fixed;inset:0;z-index:290;
  display:flex;flex-direction:column;
  background:#0b1020;
}
.cam-panel video{
  position:absolute;inset:0;width:100%;height:100%;
  object-fit:cover;background:#0b1020;
}
.cam-head{
  position:relative;z-index:1;
  display:flex;align-items:center;gap:10px;
  padding:calc(10px + var(--safe-t)) 14px 8px;color:#fff;
}
.cam-head .ask-round{background:rgba(255,255,255,.16);border:none;color:#fff}
.cam-tip{margin-left:auto;font-size:12.5px;color:rgba(255,255,255,.72);text-align:right}
.cam-foot{
  position:relative;z-index:1;margin-top:auto;
  display:flex;align-items:center;justify-content:space-between;
  padding:18px 26px calc(26px + var(--safe-b));
}
/* 左右各占同样宽度，快门才能真的居中 */
.cam-album,.cam-holder{flex:0 0 84px}
.cam-album{
  border:none;background:none;color:rgba(255,255,255,.9);
  font-size:13.5px;font-weight:600;line-height:1.3;font-family:inherit;cursor:pointer;padding:8px 0;
}
.cam-album:active{opacity:.6}
.cam-holder{height:1px}
.cam-shutter{
  flex:0 0 74px;width:74px;height:74px;border-radius:50%;cursor:pointer;
  border:4px solid rgba(255,255,255,.85);background:rgba(255,255,255,.22);
  display:flex;align-items:center;justify-content:center;padding:0;
  transition:.12s;
}
.cam-shutter:active{transform:scale(.93)}
.cam-shutter i{display:block;width:56px;height:56px;border-radius:50%;background:#fff}
.cam-shutter[disabled]{opacity:.45;pointer-events:none}

/* ═══ 框选页：拍照/选图之后、识别之前，圈出要讲的那道题 ═══
 * 全屏深色，压在一切之上（z-index 高于横屏讲解页的 200）。
 * 框外的变暗不靠单独的遮罩层，用 crop-box 的大范围 box-shadow 实现。
 */
.crop-panel{
  position:fixed;inset:0;z-index:300;
  display:flex;flex-direction:column;
  background:rgba(14,20,38,.94);
}
.crop-head{
  display:flex;align-items:center;gap:10px;
  padding:calc(10px + var(--safe-t)) 14px 8px;color:#fff;
}
.crop-head b{font-size:15px}
.crop-tip{margin-left:auto;font-size:11.5px;color:rgba(255,255,255,.55);text-align:right}
.crop-head .ask-round{background:rgba(255,255,255,.14);border:none;color:#fff}
.crop-stage{
  flex:1;min-height:0;display:flex;align-items:center;justify-content:center;
  padding:8px 14px;overflow:hidden;
  touch-action:none;   /* 手势全留给框选，别让页面跟着滚 */
}
/* flex:0 0 auto —— stage 是 flex 容器，不让它把图片压得比算好的尺寸小，
   否则默认的「全图框」会和图片对不齐，确认时会裁到图外面去 */
.crop-wrap{position:relative;flex:0 0 auto;box-shadow:0 10px 46px rgba(0,0,0,.55)}
.crop-wrap img{display:block;width:100%;height:100%;user-select:none;-webkit-user-drag:none;pointer-events:none}
.crop-box{
  position:absolute;border:2px solid #fff;border-radius:3px;
  box-shadow:0 0 0 9999px rgba(8,12,24,.62);
  touch-action:none;
}
/* 框本身不响应拖动（只有四个角能拖），手指落在框里就是"看看"，不会误挪整框 */
.crop-box.dragging{border-color:#8fb5ff}
.crop-box .h{
  position:absolute;display:block;width:30px;height:30px;border-radius:50%;
  background:#fff;border:2px solid rgba(76,125,255,.95);box-sizing:border-box;
  box-shadow:0 2px 8px rgba(0,0,0,.45);
}
.h-nw{left:-16px;top:-16px;cursor:nwse-resize}
.h-ne{right:-16px;top:-16px;cursor:nesw-resize}
.h-sw{left:-16px;bottom:-16px;cursor:nesw-resize}
.h-se{right:-16px;bottom:-16px;cursor:nwse-resize}
.crop-foot{display:flex;gap:10px;padding:12px 14px calc(14px + var(--safe-b))}
.crop-foot .btn{flex:1;padding:13px 12px;font-size:15.5px;border-radius:12px}
.crop-foot .btn.ghost{background:rgba(255,255,255,.14);color:#fff;box-shadow:none}

/* ═══ 多题：题目一/二/三 横向翻页条 ═══ */
.q-strip{
  display:flex;gap:7px;overflow-x:auto;scrollbar-width:none;
  margin:2px 0 12px;padding-bottom:2px;
}
.q-strip::-webkit-scrollbar{display:none}
.q-tab{
  flex:0 0 auto;display:flex;align-items:center;gap:6px;
  border:1px solid rgba(76,125,255,.28);border-radius:12px;
  background:rgba(255,255,255,.75);color:var(--ink2);
  font-size:13px;font-weight:700;line-height:1;font-family:inherit;padding:9px 14px;cursor:pointer;
  transition:.15s;white-space:nowrap;
}
.q-tab:active{transform:scale(.95)}
.q-tab.on{
  background:#4c7dff;color:#fff;
  border-color:transparent;box-shadow:none;
}
.q-tab .dot{width:6px;height:6px;border-radius:50%;background:var(--amber);display:inline-block}
.q-tab.on .dot{background:rgba(255,255,255,.85)}
/* 「生成中」那页的样子 */
.q-wait .sub{font-size:12px;color:var(--dim);margin-top:7px;line-height:1.7}

/* ═══ 收藏夹（教师端特有） ═══
 * 结果页上的加入/移出按钮（虚线框，加入后变绿色实线） */
/* 列表里的卡片可以点开看讲解 —— 得让人看出来能点：
   整卡按下有反馈，右下角给一句提示。不需要点的地方就别摆出可点的样子。 */
.card.tapable{cursor:pointer;transition:.15s}
.card.tapable:active{transform:scale(.985);box-shadow:0 2px 10px rgba(76,125,255,.16)}
.tap-hint{
  margin-top:10px;font-size:12px;color:var(--accent);
  display:flex;align-items:center;justify-content:space-between;
}
.wrong-toggle{
  display:block;width:100%;margin:12px 0 4px;
  border:1px dashed rgba(76,125,255,.45);border-radius:12px;
  background:rgba(255,255,255,.6);color:var(--accent);
  font-size:14px;font-weight:700;line-height:1.4;font-family:inherit;padding:12px;cursor:pointer;
  transition:.15s;
}
.wrong-toggle:active{transform:scale(.98)}
.wrong-toggle.in{
  background:rgba(76,125,255,.1);color:var(--success);
  border-style:solid;border-color:rgba(76,125,255,.45);
}
/* 收藏夹列表里的移除按钮 */
.wrong-del{
  margin-top:10px;font-size:13px;font-weight:600;line-height:1;font-family:inherit;color:var(--red);
  background:none;border:none;cursor:pointer;padding:5px 2px;
}
.wrong-del:active{opacity:.6}

/* 解题步骤空着时的样子（老题库没有这个字段） */
.sol-empty{color:var(--dim);font-size:14px;text-align:center;padding:10px 0}

/* Student product surface. Player orientation and viewport rules remain above. */
:root{--glass:#fff;--glass-strong:#fff;--card:#fff;--bg:#f5f7ff;--shadow:0 5px 20px rgba(39,56,84,.04);--r:16px}
body{background:radial-gradient(ellipse at 85% 0,rgba(132,184,255,.22),transparent 48%),radial-gradient(ellipse at 0 48%,rgba(169,226,238,.19),transparent 42%),radial-gradient(ellipse at 95% 85%,rgba(231,199,237,.15),transparent 40%),var(--page)}
.topbar{border-bottom:1px solid var(--line);padding-bottom:12px}
.topbar .tb-btn,.topbar .tb-quota,.ask-chip,.q-tab,.ana-tool{border-radius:9px;box-shadow:none}
.chat-hero{position:relative;padding:46px 10px 28px;max-width:620px;isolation:isolate}
.home-brand{display:flex;gap:12px;align-items:center;margin-bottom:30px}
.home-brand .chat-logo{width:40px;height:40px;margin:0;border-radius:11px}
.home-brand .home-eyebrow{margin:0;font-size:16px;font-weight:700;color:var(--ink);letter-spacing:.2px}
.home-kicker{font-size:12px;color:var(--accent);letter-spacing:1.4px;margin:0 0 12px;font-weight:600}
.chat-title{font-size:clamp(30px,5vw,42px);line-height:1.25;font-weight:750;letter-spacing:-1px;max-width:460px;margin-bottom:18px}
.chat-sub{max-width:390px;font-size:15px}
.home-art{animation:productEnter .35s var(--ease) .08s both;display:block;width:210px;height:132px;margin:22px 0 0;opacity:.9}
.home-actions{margin-top:24px;gap:12px}.home-actions .btn{flex:0 1 auto;min-width:176px;border-radius:12px}
.btn.primary{background:linear-gradient(115deg,#4c7dff,#77a7ff);box-shadow:0 6px 18px rgba(76,125,255,.16)}
.btn.primary::after{display:none}.btn.ghost{background:#fff;border-color:#d7e5fc;box-shadow:none}
.home-note a{margin-left:10px;color:var(--ink2);text-underline-offset:3px}
.ask-main{background:#fff;border-radius:18px;border-color:#dce8f7;box-shadow:0 8px 26px rgba(39,56,84,.07)}
.attach-panel{background:#fff;border-radius:16px}.att-item{background:#f2f7ff;color:var(--ink2)}.att-ico{color:var(--accent);display:flex;align-items:center;justify-content:center}
.card,.confirm-card{background:#fff;border-radius:16px;border-color:var(--border);box-shadow:0 4px 18px rgba(39,56,84,.035)}
.confirm-card{transition:transform .24s var(--ease),border-color .2s}.confirm-card:focus-within{border-color:var(--accent)}
.step{transition:transform .28s var(--ease),opacity .28s,border-color .2s;background:#fff}
.ana-left .step.current{border-color:#9ec4ff;background:#f2f7ff}
.ana-logo{object-fit:contain;box-shadow:none}.ana-panel-card{border-radius:16px}
.answer-locked button{background:var(--accent);box-shadow:none;border-radius:9px}.answer-card{border-color:#d7e5fc;background:#f1f3ff;box-shadow:none}.warn-card,.banner{background:#faf6eb;box-shadow:none}
@media(hover:hover){.confirm-card:hover,.card.tapable:hover{transform:translateY(-3px);border-color:#b3d0fa}}
@media(min-width:1000px){.chat-hero{padding-top:58px}.home-art{position:absolute;right:0;top:146px;width:190px;height:145px;z-index:-1}.chat-title{max-width:420px}.chat-sub{max-width:380px}}
@media(max-width:520px){.chat-hero{padding:28px 2px 24px}.home-brand{margin-bottom:26px}.home-art{width:172px;height:108px;margin-top:22px}.home-actions .btn{flex:1;min-width:120px}.topbar .tb-actions{gap:4px;flex-wrap:wrap}.topbar .tb-btn{padding:6px 9px}}
@media(max-height:740px){.home-art{display:none}.chat-hero{padding-top:22px}.home-brand{margin-bottom:20px}}

/* Liquid glass surfaces keep the existing fixed-player and viewport geometry. */
.topbar{background:rgba(255,255,255,.58);border:1px solid var(--glass-edge);border-radius:14px;padding:12px 10px;margin-top:8px;backdrop-filter:blur(16px) saturate(1.25);-webkit-backdrop-filter:blur(16px) saturate(1.25);box-shadow:inset 0 1px 0 #fff,0 3px 14px rgba(82,119,184,.045)}
.ask-main,.attach-panel,.card,.confirm-card,.ana-panel-card{background:var(--glass-bg);border-color:var(--glass-edge);backdrop-filter:var(--glass-filter);-webkit-backdrop-filter:var(--glass-filter);box-shadow:var(--glass-shadow)}
.ask-main{background:rgba(255,255,255,.74)}
.confirm-card:focus-within{border-color:#aacaff}
.ana-left .step.current{background:rgba(237,246,255,.82);border-color:#b7d5ff}
.btn.ghost{background:rgba(255,255,255,.67);border-color:rgba(255,255,255,.95);box-shadow:inset 0 1px 0 #fff,0 4px 15px rgba(82,119,184,.08)}
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){.topbar,.ask-main,.attach-panel,.card,.confirm-card,.ana-panel-card{background:#fff}}
