/* StudyTeacher AI - Terra / Rooted Warmth interface */
:root{
  --background:#faf6f0;
  --surface:#faf6f0;
  --surface-lowest:#ffffff;
  --surface-low:#f7f2ea;
  --surface-container:#f0ece4;
  --surface-container-high:#eae6de;
  --surface-container-highest:#e4e0d8;
  --surface-warm:#fff9ec;
  --primary:#4a7c59;
  --primary-hover:#3d6d4b;
  --primary-container:#d8f0de;
  --primary-soft:#e7f2e8;
  --on-primary:#ffffff;
  --on-primary-container:#16351f;
  --tertiary:#705c30;
  --tertiary-container:#f8e0a8;
  --secondary:#6b6358;
  --outline:#74796e;
  --outline-variant:#c4c8bc;
  --ink:#2e3230;
  --text:#4a4e4a;
  --muted:#77766c;
  --faint:#9b9a90;
  --danger:#b83230;
  --danger-bg:#ffdad8;
  --warn:#705c30;
  --warn-bg:#fff4cf;
  --font-body:"Nunito Sans","PingFang SC","Microsoft YaHei","Hiragino Sans GB",system-ui,-apple-system,sans-serif;
  --font-headline:"Literata","Noto Serif SC","Songti SC",serif;
  --shadow-soft:0 4px 20px rgba(46,50,48,.06);
  --shadow-lift:0 18px 46px rgba(46,50,48,.09);
  --radius-sm:8px;
  --radius:12px;
  --radius-lg:18px;
  --radius-pill:999px;
}

*{box-sizing:border-box}
html,body{margin:0;width:100%;height:100%;font-family:var(--font-body);background:var(--background);color:var(--text);-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}
body{overflow:hidden}
button,input,textarea,select{font-family:inherit}
a{color:inherit}
h1,h2,h3,.font-headline{font-family:var(--font-headline)}
.material-symbols-outlined{font-size:20px;line-height:1;font-variation-settings:"FILL" 0,"wght" 400,"GRAD" 0,"opsz" 24}
.material-symbols-outlined.fill{font-variation-settings:"FILL" 1,"wght" 500,"GRAD" 0,"opsz" 24}
.hidden{display:none!important}

::-webkit-scrollbar{width:8px;height:8px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-thumb{background:var(--outline-variant);border-radius:999px}
::-webkit-scrollbar-thumb:hover{background:var(--primary)}

/* ---------- Buttons & inputs ---------- */
button,.primaryBtn,.secondary,.ghostBtn,.upgradeBtn,.importLabel{min-height:38px;border:1px solid transparent;border-radius:var(--radius);padding:9px 14px;display:inline-flex;align-items:center;justify-content:center;gap:8px;background:var(--primary);color:var(--on-primary);font-size:14px;font-weight:800;line-height:1;cursor:pointer;text-decoration:none;white-space:nowrap;transition:background .16s ease,border-color .16s ease,transform .16s ease,box-shadow .16s ease}
button:hover,.primaryBtn:hover{background:var(--primary-hover)}
button:active,.primaryBtn:active,.navItem:active{transform:scale(.98)}
button:focus-visible,input:focus-visible,textarea:focus-visible,select:focus-visible,a:focus-visible,label:focus-visible{outline:2px solid rgba(74,124,89,.55);outline-offset:2px}
button:disabled{opacity:.5;cursor:not-allowed}
.secondary,.ghostBtn,.importLabel{background:var(--surface-lowest);color:var(--primary);border-color:rgba(116,121,110,.22);font-weight:800}
.secondary:hover,.ghostBtn:hover,.importLabel:hover{background:var(--primary-soft);border-color:rgba(74,124,89,.32)}
.danger,.dangerBtn{background:var(--danger-bg);color:var(--danger);border-color:rgba(184,50,48,.18)}
.danger:hover,.dangerBtn:hover{background:#ffd0ce}
.tiny{min-height:30px;padding:6px 10px;border-radius:10px;font-size:12px}
.iconBtn{width:40px;min-width:40px;height:40px;padding:0;border-radius:50%;background:var(--primary-soft);color:var(--primary);border-color:transparent}
.iconBtn:hover{background:var(--primary-container)}
.iconBtn.subtle{background:var(--surface-container);color:var(--secondary)}
.primaryBtn.fileBtn{width:100%;justify-content:center}
.fileBtn input,.importLabel input{display:none}

input,textarea,select{border:1px solid rgba(116,121,110,.22);border-radius:var(--radius);background:rgba(255,255,255,.64);color:var(--ink);font-size:14px;outline:0}
input,select{height:40px;padding:0 12px}
textarea{width:100%;min-height:88px;resize:vertical;padding:12px 14px;line-height:1.6}
input::placeholder,textarea::placeholder{color:var(--faint)}
input:focus,textarea:focus,select:focus{border-color:var(--primary);box-shadow:0 0 0 4px rgba(74,124,89,.12)}

/* ---------- Shell ---------- */
.terraShell{height:100vh;display:flex;background:var(--background)}
.sideNav{width:255px;min-width:255px;height:100vh;display:flex;flex-direction:column;padding:22px 16px;background:var(--surface-container);border-right:1px solid rgba(196,200,188,.32)}
.brandBlock{display:flex;gap:12px;align-items:center;text-decoration:none;color:var(--ink);margin-bottom:34px}
.brandMark{width:42px;height:42px;border-radius:14px;background:var(--primary);color:var(--on-primary);display:grid;place-items:center;box-shadow:var(--shadow-soft)}
.brandBlock b{display:block;font-family:var(--font-headline);font-size:19px;line-height:1;color:var(--ink)}
.brandBlock small{display:block;margin-top:5px;font-size:12px;color:var(--muted)}
.navList{display:flex;flex-direction:column;gap:7px}
.navItem{width:100%;height:48px;border:0;border-radius:24px;padding:0 18px;background:transparent;color:var(--text);display:flex;align-items:center;justify-content:flex-start;gap:14px;text-decoration:none;font-size:16px;font-weight:700;cursor:pointer;transition:background .16s ease,color .16s ease,transform .16s ease}
.navItem:hover{background:var(--surface-container-highest)}
.navItem.active{background:rgba(74,124,89,.72);color:var(--on-primary)}
.navItem.active .material-symbols-outlined{color:var(--on-primary)}
.sideFooter{margin-top:auto;padding-top:18px;border-top:1px solid rgba(196,200,188,.28);display:flex;flex-direction:column;gap:10px}
.helpLink{height:40px;display:flex;align-items:center;gap:12px;padding:0 14px;border-radius:var(--radius);text-decoration:none;color:var(--text);font-weight:700}
.helpLink:hover{background:var(--surface-container-high)}

.app{flex:1;min-width:0;height:100vh;display:flex;flex-direction:column;overflow:hidden}
.topbar{height:74px;min-height:74px;display:flex;align-items:center;gap:18px;padding:16px 26px;background:rgba(250,246,240,.86);border-bottom:1px solid rgba(196,200,188,.28);backdrop-filter:blur(18px)}
.searchWrap{height:42px;max-width:510px;min-width:260px;flex:1;display:flex;align-items:center;gap:9px;padding:0 10px 0 14px;background:var(--surface-container);border:1px solid rgba(196,200,188,.24);border-radius:24px;color:var(--muted)}
.searchWrap input{height:100%;flex:1;min-width:0;border:0;box-shadow:none;background:transparent}
/* 同登录框：全局 input:focus-visible 的绿色方框套在药丸外面很难看，
   这里连 outline 一起关，焦点交给药丸边框加深表达（中性灰，不用主题绿）。
   ⚠ 只关 box-shadow 不关 outline 等于没关 —— 登录框就是这么漏了很久。 */
.searchWrap input:focus,
.searchWrap input:focus-visible{outline:none;box-shadow:none}
.searchWrap:focus-within{border-color:rgba(116,121,110,.45)}
.topActions{display:flex;align-items:center;gap:10px;min-width:0}
/* 顶栏左侧没有内容时（该页没有真实搜索/状态可放），把操作区推到右侧。
   ——宁可留空，也不摆一个不工作的搜索框充数。 */
.topbar>.topActions:only-child{margin-left:auto}
.apiStatus{max-width:270px;min-width:160px;height:34px;display:flex;align-items:center;padding:0 12px;border-radius:var(--radius-pill);background:var(--primary-soft);border:1px solid rgba(74,124,89,.18);color:var(--primary);font-size:12px;font-weight:800;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.apiStatus.warn{background:var(--warn-bg);border-color:rgba(112,92,48,.18);color:var(--warn)}
.apiStatus.ok{background:var(--primary-soft);border-color:rgba(74,124,89,.22);color:var(--primary)}
.quotaChip{display:inline-flex;align-items:center;gap:6px;height:34px;padding:0 12px;border-radius:var(--radius-pill);background:var(--surface-container);border:1px solid rgba(116,121,110,.16);color:var(--text);font-size:12px;font-weight:900;white-space:nowrap}
.quotaChip:empty{display:none}
.quotaChip::before{content:"";width:7px;height:7px;border-radius:50%;background:currentColor}
.quotaChip.guest{color:var(--muted)}
.quotaChip.low{background:var(--warn-bg);color:var(--warn)}
.quotaChip.out{background:var(--danger-bg);color:var(--danger)}
.langSelect{width:118px;border-radius:var(--radius-pill);background:var(--surface-container);text-align:center;text-align-last:center}
/* language switcher with a globe icon so any user recognises it */
.langSwitch{display:inline-flex;align-items:center;gap:2px;height:38px;padding:0 6px 0 11px;background:var(--surface-container);border:1px solid rgba(116,121,110,.18);border-radius:var(--radius-pill);color:var(--muted)}
.langSwitch>.material-symbols-outlined{font-size:20px;color:var(--muted);flex:none}
.langSwitch>select.langSelect{width:auto;min-width:72px;max-width:120px;height:34px;background:transparent;border:0;box-shadow:none;padding:0 2px;text-align:left;text-align-last:left;color:var(--ink);font-weight:700}
.langSwitch>select.langSelect:focus{box-shadow:none}
.upgradeBtn{height:36px;min-height:36px;padding:0 16px;background:var(--surface-lowest);color:var(--primary);border-color:var(--primary);border-radius:var(--radius-pill);font-size:13px}
.upgradeBtn:hover{background:var(--primary-soft)}
.avatarBtn{display:inline-block;height:38px;min-height:38px;max-width:170px;padding:0 14px;line-height:36px;border-radius:var(--radius-pill);background:var(--surface-lowest);color:var(--ink);border:1px solid rgba(116,121,110,.18);text-decoration:none;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.badge{height:34px;display:flex;align-items:center;padding:0 12px;border-radius:var(--radius-pill);background:var(--tertiary-container);color:var(--tertiary);font-size:12px;font-weight:900}
.statusStrip{height:38px;min-height:38px;display:flex;align-items:center;gap:12px;padding:0 28px;color:var(--muted);font-size:13px;background:rgba(240,236,228,.42);border-bottom:1px solid rgba(196,200,188,.18)}
.statusText,.scopeText{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.statusText{max-width:46%}
.scopeText{max-width:46%}

/* ---------- Workspace ---------- */
.workspace{flex:1;min-height:0;display:grid;gap:24px;padding:26px 28px 18px;overflow:hidden}
.threeCol{grid-template-columns:minmax(270px,1fr) minmax(330px,1.15fr) minmax(280px,1fr);grid-template-areas:"reader actions stream"}
.readerPanel{grid-area:reader}
.actionPanel{grid-area:actions}
.streamColumn{grid-area:stream}
.panel{min-height:0;display:flex;flex-direction:column;overflow:hidden;background:rgba(255,255,255,.44);border:1px solid rgba(196,200,188,.34);border-radius:var(--radius-lg);box-shadow:var(--shadow-soft)}
.panelHeader{min-height:88px;padding:20px 24px;display:flex;justify-content:space-between;gap:14px;align-items:flex-start;background:rgba(250,246,240,.62);border-bottom:1px solid rgba(196,200,188,.24);flex-wrap:wrap}
.eyebrow{margin:0 0 6px;color:var(--primary);font-size:12px;font-weight:900;letter-spacing:0;text-transform:uppercase}
.panelHeader h2{margin:0;font-size:26px;line-height:1.15;color:var(--ink);font-weight:700}
.panelSub{margin-top:6px;font-size:14px;color:var(--muted);line-height:1.35}
.progressChip{height:32px;display:flex;align-items:center;padding:0 12px;border-radius:var(--radius-pill);background:var(--primary-soft);color:var(--primary);font-size:12px;font-weight:900;white-space:nowrap}

/* ---------- Reader ---------- */
.readerTools{padding:14px 18px;background:rgba(240,236,228,.54);border-bottom:1px solid rgba(196,200,188,.18);display:flex;flex-direction:column;gap:10px}
.searchResults{max-height:92px;overflow:auto;border:1px dashed rgba(116,121,110,.28);border-radius:var(--radius);padding:11px 12px;background:rgba(250,246,240,.7);font-size:13px;color:var(--muted);line-height:1.45}
.searchHit{padding:10px 12px;border-radius:var(--radius);cursor:pointer;background:rgba(255,255,255,.72);border:1px solid rgba(196,200,188,.28);margin-bottom:8px;color:var(--text)}
.searchHit:last-child{margin-bottom:0}
.searchHit:hover{background:var(--primary-soft);border-color:rgba(74,124,89,.26)}
.searchHit b{color:var(--primary)}
.toolRow,.row,.blockActions,.objectActions,.cardActions,.citationActions,.citationSelectActions,.reviewActions{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
.bookmarkList{min-height:24px;max-height:70px;overflow:auto;font-size:13px;color:var(--muted)}
.bookmarkItem{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:8px 10px;border-radius:var(--radius);background:rgba(255,255,255,.62);border:1px solid rgba(196,200,188,.26);margin-bottom:6px}
.reader{flex:1;min-height:0;overflow:auto;padding:22px;line-height:1.72;font-size:15px;background:rgba(255,255,255,.36);color:var(--text)}

/* ===== 工作台改版：折叠侧栏 + 两栏 + 阅读区顶部功能条 + 内联翻译 ===== */
/* 折叠侧栏（打开教材后 .terraShell 加 .railShell）：绝对定位悬停展开，宽度才能动画 */
.railShell .sideNav{position:absolute;left:0;top:0;bottom:0;width:68px;min-width:0;z-index:60;padding:22px 12px;overflow:hidden;white-space:nowrap;transition:width .2s ease,box-shadow .2s ease}
.railShell .sideNav:hover{width:255px;padding:22px 16px;box-shadow:12px 0 34px rgba(40,35,20,.14)}
.railShell .app{margin-left:68px}
/* 折叠时：文字标签宽度归 0（不再挤跑图标）+ 图标居中 */
.railShell .sideNav .brandBlock>span:last-child,
.railShell .sideNav .navItem>span:last-child,
.railShell .sideNav .fileBtn>span:not(.material-symbols-outlined),
.railShell .sideNav .helpLink>span:last-child{opacity:0;width:0;overflow:hidden;transition:opacity .16s}
.railShell .sideNav .brandBlock,.railShell .sideNav .navItem,.railShell .sideNav .fileBtn,.railShell .sideNav .helpLink{justify-content:center;padding-left:0;padding-right:0;gap:0}
.railShell .sideNav:hover .brandBlock>span:last-child,
.railShell .sideNav:hover .navItem>span:last-child,
.railShell .sideNav:hover .fileBtn>span:not(.material-symbols-outlined),
.railShell .sideNav:hover .helpLink>span:last-child{opacity:1;width:auto}
.railShell .sideNav:hover .brandBlock{justify-content:flex-start;gap:12px}
.railShell .sideNav:hover .navItem,.railShell .sideNav:hover .fileBtn,.railShell .sideNav:hover .helpLink{justify-content:flex-start;padding-left:18px;padding-right:18px;gap:14px}

/* 两栏：阅读 | 思考流 */
.twoCol{grid-template-columns:minmax(0,1.62fr) minmax(320px,1fr);grid-template-areas:"reader stream"}
.twoCol .readerPanel{grid-area:reader}
.twoCol .streamColumn{grid-area:stream}

/* 阅读区顶部功能条：主功能键 + 翻译三态 */
.readerActionBar{display:flex;align-items:center;gap:8px;flex-wrap:nowrap;overflow-x:auto;padding:9px 16px;border-bottom:1px solid rgba(196,200,188,.3)}
.readerActionBar::-webkit-scrollbar{height:0}
.readerActs{display:flex;flex-wrap:nowrap;gap:8px;align-items:center}
.actKey{flex:0 0 auto;display:inline-flex;align-items:center;gap:5px;font-family:inherit;font-size:12.5px;padding:6px 10px;border-radius:10px;border:1px solid rgba(196,200,188,.5);background:rgba(255,255,255,.7);color:var(--text);cursor:pointer;transition:.15s;white-space:nowrap}
.actKey .material-symbols-outlined{font-size:16px}
.actKey:hover{border-color:var(--primary);color:var(--primary)}
.actKey.primary{background:var(--primary);color:#fff;border-color:var(--primary)}
.actKey.primary:hover{color:#fff;filter:brightness(1.05)}
.actKey.on{background:var(--primary);color:#fff;border-color:var(--primary)}
.xlateSeg{margin-left:auto;flex:0 0 auto;display:inline-flex;background:rgba(255,255,255,.7);border:1px solid rgba(196,200,188,.5);border-radius:999px;padding:3px}
.xlateSeg button{font-family:inherit;border:0;background:transparent;color:var(--muted);font-size:12.5px;padding:6px 13px;border-radius:999px;cursor:pointer;transition:.15s;white-space:nowrap}
.xlateSeg button.on{background:var(--primary);color:#fff}

/* 「更多」面板：收纳当前学习重点 / 深度洞察 / 高亮朗读等次级功能 */
.morePanel{border-bottom:1px solid rgba(196,200,188,.3);background:rgba(255,255,255,.5);max-height:min(60vh,520px);overflow:auto}
.morePanel[hidden]{display:none}
.morePanelBody{padding:16px 16px 6px;display:flex;flex-direction:column;gap:14px}
.morePanelBody .deepInsight{margin:0}
.moreTools{display:grid;grid-template-columns:1fr 1fr;gap:8px}

/* 内联翻译：翻译整页时隐藏原文，只留译文 */
.reader.xlateHideOrig .blockTranslation{margin-top:0}
/* 阅读区顶部错误条：有内容才显示 */
.readerError{margin:8px 16px 0}
.readerError:empty{display:none;margin:0}

/* 顶栏合并成一条：教材名/范围/AI 状态 与 语言账号同一行（去掉面包屑+状态条两行） */
.topLead{display:flex;align-items:center;gap:12px;min-width:0;flex:1;overflow:hidden}
.topbar .topLead .statusText{max-width:44%;font-weight:800;color:var(--ink)}
.topbar .topLead .scopeText{max-width:40%;color:var(--muted)}

/* 阅读区右下角：当前页/总页数 + 翻页 */
.readerPanel{position:relative}
.readerPager{position:absolute;right:20px;bottom:16px;z-index:6;display:inline-flex;align-items:center;gap:3px;background:var(--surface-lowest);border:1px solid rgba(196,200,188,.5);border-radius:999px;padding:4px;box-shadow:var(--shadow-lift)}
.readerPager.hidden{display:none}
.readerPager button{width:32px;height:32px;border:0;border-radius:50%;background:transparent;color:var(--text);cursor:pointer;font-size:18px;line-height:1;display:grid;place-items:center}
.readerPager button:hover{background:var(--primary-soft);color:var(--primary)}
.readerPager button:disabled{opacity:.35;cursor:default}
.readerPager .pg{font-size:13px;color:var(--muted);padding:0 8px;font-variant-numeric:tabular-nums}
.readerPager .pg b{color:var(--ink);font-weight:700}
.placeholder{margin:0;color:var(--faint);line-height:1.7}
.docBlock{padding:18px;border:1px solid rgba(196,200,188,.3);border-radius:var(--radius-lg);background:rgba(255,255,255,.72);margin-bottom:14px;box-shadow:0 8px 24px rgba(46,50,48,.035);transition:border-color .16s ease,background .16s ease}
.docBlock:hover{border-color:rgba(74,124,89,.3);background:rgba(255,255,255,.9)}
.docBlock.flash{animation:flashBg 1.4s ease}
@keyframes flashBg{0%{background:var(--primary-soft)}100%{background:rgba(255,255,255,.72)}}
.blockHead{display:flex;justify-content:space-between;gap:12px;align-items:flex-start;margin-bottom:12px}
.blockTitle{color:var(--ink);font-family:var(--font-headline);font-weight:700;font-size:18px;line-height:1.25}
.blockMeta{font-size:12px;color:var(--muted);margin-top:4px}
.blockText{white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word}
.blockTranslation{white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;margin-top:12px;padding:12px 14px;background:var(--primary-soft);border-left:4px solid var(--primary);border-radius:var(--radius);color:var(--on-primary-container);font-size:14px;line-height:1.7}
mark.hl{background:#f8e0a8;border-radius:5px;padding:0 2px;box-shadow:inset 0 -2px 0 rgba(112,92,48,.28);color:inherit}

/* ---------- Action column ---------- */
.mentorHero{min-height:162px;margin:0;padding:24px;display:flex;align-items:flex-start;justify-content:space-between;gap:18px;background:linear-gradient(145deg,rgba(216,240,222,.9),rgba(248,224,168,.42));border-bottom:1px solid rgba(196,200,188,.2)}
.mentorHero h1{margin:0;color:var(--ink);font-size:34px;line-height:1.05;font-weight:700}
.mentorHero p:not(.eyebrow){margin:10px 0 0;color:var(--text);font-size:14px;line-height:1.5}
.mentorOrb{width:54px;height:54px;min-width:54px;border-radius:50%;display:grid;place-items:center;background:rgba(255,255,255,.58);color:var(--primary);box-shadow:var(--shadow-soft)}
.mentorOrb .material-symbols-outlined{font-size:30px}
.actionBody{flex:1;min-height:0;overflow:auto;padding:16px;display:flex;flex-direction:column;gap:14px}
.learningObject{padding:16px;border-radius:var(--radius-lg);border:1px solid rgba(74,124,89,.24);background:rgba(255,255,255,.7);box-shadow:var(--shadow-soft)}
.learningObject.empty{border-color:rgba(196,200,188,.34);background:rgba(250,246,240,.76)}
.objectHeader{display:flex;justify-content:space-between;gap:10px;align-items:flex-start;margin-bottom:12px}
.objectHeader b{display:block;color:var(--ink);font-family:var(--font-headline);font-size:18px}
.objectHeader span{display:block;margin-top:4px;color:var(--muted);font-size:13px;line-height:1.4}
.lockedText{max-height:128px;overflow:auto;padding:12px 14px;border:1px solid rgba(196,200,188,.32);border-radius:var(--radius);background:rgba(250,246,240,.68);white-space:pre-wrap;font-size:14px;line-height:1.62;margin-bottom:12px;color:var(--text);overflow-wrap:anywhere;word-break:break-word}
.audioLine{padding-top:2px}
.questionBlock{padding:16px;border:1px solid rgba(196,200,188,.3);border-radius:var(--radius-lg);background:rgba(255,255,255,.64);display:flex;flex-direction:column;gap:10px}
.questionBlock label{font-weight:900;font-size:14px;color:var(--ink)}
.courseBlock{background:rgba(240,236,228,.52)}
.hint{color:var(--muted);font-size:13px;line-height:1.45}
.error{color:var(--danger);background:var(--danger-bg);border:1px solid rgba(184,50,48,.18);border-radius:var(--radius);padding:11px 13px;font-size:13px;line-height:1.45}
.error:empty{display:none}

/* ---------- Stream ---------- */
.aiStream{flex:1;min-height:0;overflow:auto;background:rgba(250,246,240,.38);padding:16px}
.streamComposer{flex:none;border-top:1px solid rgba(196,200,188,.3);background:rgba(255,255,255,.55);padding:14px 16px;display:flex;flex-direction:column;gap:12px;max-height:46%;overflow:auto}
.streamComposer .questionBlock{padding:12px;gap:8px;background:rgba(255,255,255,.72)}
.streamComposer .questionBlock textarea{min-height:52px}
/* AI老师卡片（当前学习重点 #learningObject）与思考流功能重叠 → 右栏只保留思考流结果。
   display:none 隐藏而非删 DOM：app.js 非可选链绑定其按钮 + renderLearningObject() 会写入这些元素，删除会连锁报错 */
.streamColumn .learningObject{display:none}
/* 右栏精简：整个头部（「思考流」标题+副标题+清空键）隐藏，列直接从思考流结果开始。
   清空键仍留在 DOM——app.js 以非可选链绑定 #clearStreamBtn，删除会报错 */
.streamColumn .panelHeader{display:none}
/* 右栏「AI 老师入口」：底部只保留一个「全书/教材包问答」提问框（隐藏继续追问与整理学习路线，保持简洁）。
   元素都留在 DOM——app.js 非可选链绑定这些 id，且「关联知识」等会复用 #courseQuestion */
.streamColumn .streamComposer{display:flex}
.streamColumn .streamComposer .askLock:not(.courseLock){display:none}
.streamColumn .streamComposer .outlineChip{display:none}
/* 右栏空状态：AI 老师快捷入口 */
.aiHub{padding:20px 18px;display:flex;flex-direction:column;gap:16px}
.aiHubHead{display:flex;gap:12px;align-items:flex-start}
.aiHubHead>.material-symbols-outlined{font-size:26px;color:var(--primary)}
.aiHubHead b{display:block;font-family:var(--font-headline);font-size:19px;color:var(--ink);margin-bottom:4px}
.aiHubHead span{color:var(--muted);font-size:13.5px;line-height:1.5}
/* 空状态里的「先用示例教材试一下」。新用户第一次进来看到的就是它 ——
   在此之前这里只有一句「请先去左边锁定一段」，而左边同样是空的。 */
.aiHubTry{display:flex;flex-direction:column;gap:9px;align-items:flex-start;
  padding:16px 16px 15px;border:1px solid var(--primary);border-radius:var(--radius);
  background:var(--primary-soft)}
.aiHubTry b{font-family:var(--font-headline);font-size:15.5px;color:var(--ink)}
.aiHubTry span{color:var(--muted);font-size:13px;line-height:1.6}
/* 收藏页：列表 + 收藏卡（复用 .cardType/.cardMeta/.responseSections 全局样式，仅补差异） */
.favoritesList{max-height:min(70vh,600px);overflow:auto;display:flex;flex-direction:column;gap:14px;padding:2px}
.favoritesList .placeholder{color:var(--muted);padding:24px 8px;text-align:center}
.favCard{background:var(--surface-lowest);border:1px solid rgba(116,121,110,.16);border-radius:16px;padding:14px 16px;box-shadow:var(--shadow-soft)}
.favCard .cardTop{display:flex;justify-content:space-between;gap:12px;align-items:flex-start;margin-bottom:10px}
.favCardBtns{display:flex;gap:6px;align-items:center;flex:none}
.favBtn.on{color:var(--primary);border-color:var(--primary)}
/* 收藏卡「取自哪份教材」来源行 */
.favFrom{display:inline-flex;align-items:center;gap:4px;margin:3px 0 5px;font-size:12.5px;font-weight:700;color:var(--primary)}
.favFrom .material-symbols-outlined{font-size:15px}
/* 阅读区高亮：可点取消（配合 data-hl-id） */
.reader .hl{cursor:pointer}
.reader .hl:hover{outline:2px solid rgba(184,50,48,.35);outline-offset:1px}
.streamCard{background:rgba(255,255,255,.76);border:1px solid rgba(196,200,188,.32);border-radius:var(--radius-lg);padding:16px;margin-bottom:14px;box-shadow:var(--shadow-soft)}
.streamCard.current{border-color:rgba(74,124,89,.36);box-shadow:0 0 0 4px rgba(74,124,89,.08),var(--shadow-soft)}
.cardTop{display:flex;justify-content:space-between;gap:12px;align-items:flex-start;margin-bottom:10px}
.cardType{font-family:var(--font-headline);font-weight:700;font-size:18px;color:var(--ink)}
.cardMeta{color:var(--muted);font-size:12px;margin-top:4px;line-height:1.45;overflow-wrap:anywhere}
.cardContext{position:relative;background:rgba(240,236,228,.55);border-left:3px solid rgba(196,200,188,.5);border-radius:0 var(--radius) var(--radius) 0;padding:9px 12px;font-size:13px;line-height:1.65;color:var(--muted);margin-bottom:10px;white-space:pre-wrap;overflow-wrap:anywhere;cursor:pointer;max-height:80px;overflow:hidden}
.cardContext.open{max-height:none}
.cardContext:not(.open)::after{content:"⋯ 展开原文";position:absolute;right:0;bottom:0;padding:2px 12px 4px 22px;font-size:12px;color:var(--primary);background:linear-gradient(90deg,transparent,rgba(240,236,228,.95) 40%)}
.responseSections{display:flex;flex-direction:column;gap:10px;margin-top:10px}
.responseSection{border:1px solid rgba(196,200,188,.28);border-radius:var(--radius);padding:12px;background:rgba(250,246,240,.62)}
.sectionHead{display:flex;justify-content:space-between;gap:8px;align-items:center;margin-bottom:8px}
.responseSection h4{margin:0;font-size:14px;color:var(--primary);font-weight:900}
.responseText{white-space:pre-wrap;font-size:14px;line-height:1.66;color:var(--text);overflow-wrap:anywhere;word-break:break-word}
.citationBtn{display:inline;margin:0 2px;padding:2px 8px;border-radius:10px;background:var(--primary-soft);color:var(--primary);border:1px solid rgba(74,124,89,.24);font-size:12px;font-weight:900;cursor:pointer;line-height:1.85;white-space:normal;overflow-wrap:anywhere;-webkit-box-decoration-break:clone;box-decoration-break:clone}
.citationBtn:hover{background:var(--primary-container)}
.quoteUnverified,.citeUnverified{color:var(--muted);border-bottom:1px dashed var(--outline-variant);cursor:help;overflow-wrap:anywhere}
.unverifiedTag{display:inline-flex;align-items:center;margin-left:4px;padding:1px 6px;border-radius:var(--radius-pill);background:var(--warn-bg);color:var(--warn);font-size:10px;font-weight:900;white-space:nowrap}

/* ---------- Footer ---------- */
.disclaimer{height:34px;min-height:34px;padding:0 28px;display:flex;align-items:center;gap:10px;background:rgba(240,236,228,.72);border-top:1px solid rgba(196,200,188,.22);color:var(--muted);font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.disclaimer a{color:var(--primary);font-weight:900;text-decoration:none}

/* ---------- Modals ---------- */
.modalOverlay{position:fixed;inset:0;background:rgba(46,50,48,.42);z-index:1000;display:flex;align-items:center;justify-content:center;padding:22px;backdrop-filter:blur(4px)}
.modalOverlay.hidden{display:none}
.modalOverlay.noShade{background:transparent;pointer-events:none;backdrop-filter:none}
.modalCard{background:var(--background);border-radius:22px;border:1px solid rgba(196,200,188,.36);box-shadow:var(--shadow-lift);width:min(980px,96vw);max-height:90vh;overflow:hidden;display:flex;flex-direction:column;pointer-events:auto}
.smallModal{width:min(760px,94vw)}
.modalHead{padding:18px 22px;border-bottom:1px solid rgba(196,200,188,.26);display:flex;justify-content:space-between;gap:12px;align-items:flex-start;background:rgba(240,236,228,.58)}
.modalHead h3{margin:2px 0 0;font-family:var(--font-headline);font-size:22px;color:var(--ink)}
.smallLabel{color:var(--primary);font-size:12px;font-weight:900;text-transform:uppercase;letter-spacing:0}
.modalBody{padding:18px 22px;overflow:auto}
.modalFoot{padding:15px 22px;border-top:1px solid rgba(196,200,188,.26);display:flex;justify-content:space-between;gap:12px;align-items:center;background:rgba(240,236,228,.42)}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.grid2 label,.modalBody label{display:flex;flex-direction:column;gap:7px;font-size:13px;font-weight:900;color:var(--ink)}
.modalSection{margin:14px 0}
.checkList{border:1px solid rgba(196,200,188,.3);border-radius:var(--radius);padding:10px;max-height:160px;overflow:auto;background:rgba(255,255,255,.54);display:flex;flex-direction:column;gap:7px}
.checkList label{flex-direction:row;align-items:center;font-weight:700;gap:8px;color:var(--text)}
.libraryCard{width:min(1080px,96vw)}
.libraryLayout{flex:1;min-height:0;display:grid;grid-template-columns:230px 1fr;overflow:hidden}
.categoryPane{border-right:1px solid rgba(196,200,188,.26);padding:14px;overflow:auto;background:rgba(240,236,228,.52)}
.paneTitle{font-weight:900;font-size:12px;margin:0 0 9px;color:var(--muted);text-transform:uppercase;letter-spacing:0}
.categoryList{display:flex;flex-direction:column;gap:7px;margin-bottom:12px}
.categoryItem{padding:10px 12px;border:1px solid rgba(196,200,188,.3);border-radius:var(--radius);background:rgba(255,255,255,.58);cursor:pointer;display:flex;justify-content:space-between;gap:8px;align-items:center}
.categoryItem:hover{border-color:rgba(74,124,89,.32)}
.categoryItem.active{background:var(--primary);color:var(--on-primary);border-color:var(--primary)}
.miniForm{display:flex;gap:7px}
.miniForm input{min-width:0;flex:1}
.miniForm.inline{width:min(430px,52%)}
.libraryContent{padding:16px;overflow:auto}
.libraryTop{display:flex;justify-content:space-between;gap:12px;align-items:center;margin-bottom:15px}
.libraryTop h4{margin:0;font-family:var(--font-headline);font-size:20px;color:var(--ink)}
.libraryColumns{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.itemList{display:flex;flex-direction:column;gap:9px}
.libraryItem{border:1px solid rgba(196,200,188,.3);border-radius:var(--radius);padding:12px;background:rgba(255,255,255,.64)}
.libraryItemTitle{font-weight:900;margin-bottom:5px;color:var(--ink)}
.libraryItemMeta{color:var(--muted);font-size:12px;line-height:1.45;margin-bottom:9px}
.libraryDataRow{display:flex;gap:10px;align-items:center;flex-wrap:wrap;padding:15px 22px;border-top:1px solid rgba(196,200,188,.26);background:rgba(240,236,228,.42)}
.packCard{width:min(720px,94vw)}
.packDocs{padding:18px 22px;overflow:auto}
.reviewList{display:flex;flex-direction:column;gap:10px;max-height:62vh;overflow:auto;padding:18px 22px}
.reviewItem{border:1px solid rgba(196,200,188,.3);border-radius:var(--radius);padding:13px 14px;background:rgba(255,255,255,.6)}
.reviewText{color:var(--ink);font-size:14px;line-height:1.6;cursor:pointer;border-left:4px solid var(--tertiary-container);padding-left:10px}
.reviewText:hover{color:var(--primary)}
.reviewNote{margin-top:8px;font-size:13px;color:var(--primary);background:var(--primary-soft);border-radius:var(--radius);padding:8px 10px;white-space:pre-wrap}
.reviewMeta{font-size:11px;color:var(--muted);margin-right:auto}

/* ---------- Citation drawer ---------- */
.citationCard{width:min(860px,96vw);position:fixed;left:50%;top:50%;transform:translate(-50%,-50%);max-height:86vh}
.dragHandle{cursor:move;user-select:none}
.citationMeta{font-size:12px;color:var(--muted);margin-top:4px}
.citationOriginal{margin:16px 22px 10px;padding:14px;border:1px solid rgba(196,200,188,.3);border-radius:var(--radius);background:rgba(255,255,255,.55);min-height:140px;max-height:250px;overflow:auto;white-space:pre-wrap;line-height:1.65;color:var(--text);overflow-wrap:anywhere;word-break:break-word}
.citationActions,.citationSelectActions{padding:0 22px 10px}
.citationSelectActions span{color:var(--muted);font-size:12px}
.citationGenerated{margin:0 22px 20px;padding:14px;border:1px solid rgba(196,200,188,.3);border-radius:var(--radius);min-height:110px;max-height:250px;overflow:auto;white-space:pre-wrap;background:rgba(255,255,255,.58);color:var(--text);line-height:1.65}
.sourceBadge,.warnBadge{display:inline-flex;padding:2px 8px;border-radius:var(--radius-pill);font-size:11px;font-weight:900}
.sourceBadge{background:var(--primary-soft);color:var(--primary)}
.warnBadge{background:var(--warn-bg);color:var(--warn)}

/* ---------- Auth ---------- */
.authCard{width:min(420px,94vw);position:relative;overflow:visible}
.authClose{position:absolute;top:12px;right:12px;width:32px;height:32px;min-width:32px;min-height:32px;padding:0;border-radius:50%;background:rgba(255,255,255,.7);color:var(--muted);border:1px solid rgba(196,200,188,.3);font-size:22px;line-height:1}
.authHead{padding:30px 28px 4px;text-align:center}
.authMark{display:inline-flex;width:56px;height:56px;border-radius:18px;background:var(--primary-soft);border:1px solid rgba(74,124,89,.22);align-items:center;justify-content:center;margin-bottom:14px}
.authMark img{width:34px;height:34px;object-fit:contain}
.authHead h3{margin:0;font-family:var(--font-headline);font-size:24px;color:var(--ink)}
.authTagline{margin:8px 0 0;font-size:13px;color:var(--muted)}
.authCard .modalBody{padding:20px 28px 28px;overflow:visible}
.authField{display:flex;flex-direction:column;gap:7px;font-size:13px;font-weight:900;color:var(--ink);margin-bottom:13px}
.authField input{width:100%;height:44px}
.authConsent,.registerConsent{display:flex;flex-direction:column;gap:9px;margin:2px 0 12px;font-size:12.5px;line-height:1.55}
.authConsent label,.registerConsent label{display:flex!important;flex-direction:row!important;gap:9px;align-items:flex-start;color:#6b6f64;cursor:pointer;font-weight:600}
.authConsent input[type=checkbox],.registerConsent input[type=checkbox]{margin-top:2px;flex:none;width:16px;height:16px;accent-color:var(--primary);cursor:pointer}
.authConsent a,.registerConsent a{color:var(--primary);font-weight:800}
.authPrimary,.authGhost{width:100%;min-height:44px;box-sizing:border-box}
.authPrimary.asLink{text-decoration:none}
.authGhost{margin-top:9px;background:var(--surface-lowest);color:var(--primary);border:1px solid rgba(74,124,89,.22)}
.authGhost:hover{background:var(--primary-soft)}
.authGhost.isDanger{color:var(--danger);border-color:rgba(184,50,48,.2)}
.authGhost.isDanger:hover{background:var(--danger-bg)}
.authPerks{display:flex;flex-wrap:wrap;gap:8px 12px;justify-content:center;margin:17px 0 2px}
.authPerks span{font-size:12px;color:var(--muted)}
.authFine{margin:13px 0 0;text-align:center;font-size:12px;color:var(--faint)}
.authFine a{color:var(--primary);text-decoration:none;font-weight:900}
.accountEmail{margin:0 0 5px;font-weight:900;font-size:15px;color:var(--ink);text-align:center}
.accountUsage{margin:0 0 16px;font-size:13px;color:var(--muted);text-align:center}
.authActions{display:flex;flex-direction:column}
.authError{margin-top:12px}

/* ---------- Standalone Login ---------- */
.loginBody{min-height:100vh;overflow:auto;background:radial-gradient(circle at 14% 14%,rgba(216,240,222,.38),transparent 30%),radial-gradient(circle at 86% 72%,rgba(248,224,168,.26),transparent 32%),var(--background)}
.loginScene{min-height:100vh;position:relative;display:grid;place-items:center;padding:64px 22px 82px;overflow:hidden}
.loginScene::before{content:"";position:absolute;inset:0;background-image:radial-gradient(rgba(112,92,48,.12) 1px,transparent 1px);background-size:22px 22px;opacity:.2;pointer-events:none}
.loginBack{position:absolute;top:28px;left:32px;z-index:2;height:40px;display:inline-flex;align-items:center;gap:8px;padding:0 14px;border-radius:var(--radius-pill);background:rgba(255,255,255,.58);border:1px solid rgba(196,200,188,.32);text-decoration:none;color:var(--primary);font-weight:900;box-shadow:var(--shadow-soft)}
.loginBack:hover{background:var(--primary-soft)}
.loginCard{position:relative;z-index:2;width:min(352px,calc(100vw - 44px));padding:32px 34px 26px;border-radius:26px;background:rgba(255,255,255,.62);border:1px solid rgba(196,200,188,.26);box-shadow:0 18px 60px rgba(46,50,48,.1);backdrop-filter:blur(18px);text-align:center}
.loginIcon{width:48px;height:48px;margin:0 auto 20px;border-radius:17px;display:grid;place-items:center;background:var(--primary-container);color:var(--primary)}
.loginIcon .material-symbols-outlined{font-size:28px}
.loginCard h1{margin:0;color:var(--primary);font-size:28px;line-height:1.1;font-weight:700}
.loginSub{margin:8px 0 28px;color:var(--ink);font-size:13px}
.loginForm{display:flex;flex-direction:column;gap:14px;text-align:left}
.loginForm label{display:flex;flex-direction:column;gap:7px;color:var(--ink);font-size:12px;font-weight:900}
.labelRow{display:flex;justify-content:space-between;align-items:center;gap:12px}
.labelRow a{color:var(--primary);font-size:12px;text-decoration:none;font-weight:900}
.labelRow a:hover{text-decoration:underline}
.loginInput{height:42px;display:flex;align-items:center;gap:8px;padding:0 10px;border-radius:13px;background:rgba(240,236,228,.55);border:1px solid rgba(196,200,188,.22);color:var(--muted)}
.loginInput input{height:100%;flex:1;min-width:0;border:0;background:transparent;padding:0;box-shadow:none;font-size:13px}
/* 登录框不要绿框。
   上一次只关掉了 input:focus 的绿色辉光（见本文件 input:focus 那条），
   却漏了全局 button/input:focus-visible 的 `outline:2px solid rgba(74,124,89,.55)` ——
   那条才是套在药丸外面、带 2px 偏移的那个方绿框，所以「改过但一直还在」。
   两条必须一起关，只关一条等于没关。

   焦点提示不能直接删干净（键盘用户会瞎），改为交给外层药丸自己表达：
   边框加深 + 底色提亮。用中性灰 --outline(#74796E)，不用主题绿。 */
.loginInput input:focus,
.loginInput input:focus-visible{outline:none;box-shadow:none}
.loginInput:focus-within{border-color:rgba(116,121,110,.45);background:rgba(240,236,228,.85)}
.passwordEye{width:28px;min-width:28px;height:28px;min-height:28px;padding:0;border:0;border-radius:50%;background:transparent;color:var(--muted)}
.passwordEye:hover{background:var(--surface-container)}
.rememberRow{flex-direction:row!important;align-items:center!important;gap:8px!important;color:var(--text)!important;font-weight:700!important}
.rememberRow input{width:14px;height:14px;padding:0;accent-color:var(--primary)}
.loginSubmit{width:100%;height:50px;margin-top:4px;border-radius:13px;box-shadow:0 8px 16px rgba(74,124,89,.18)}
.loginMessage{min-height:18px;margin:2px 0 0;text-align:center;font-size:12px;line-height:1.45;color:var(--muted)}
.loginMessage.error{color:var(--danger)}
.loginMessage.ok{color:var(--primary);font-weight:900}
.loginMessage.notice{color:var(--tertiary);font-weight:900}
.loginDivider{display:flex;align-items:center;gap:12px;margin:18px 0 14px;color:var(--muted);font-size:12px}
.loginDivider::before,.loginDivider::after{content:"";height:1px;flex:1;background:rgba(196,200,188,.46)}
.socialLogin{width:100%;height:42px;background:rgba(255,255,255,.54);color:var(--ink);border:1px solid rgba(116,121,110,.28);font-weight:800}
.socialLogin:hover{background:var(--surface-lowest);border-color:rgba(74,124,89,.28)}
.googleMark{font-weight:900;color:#4285f4}
.signupHint{margin:22px 0 0;padding-top:18px;border-top:1px solid rgba(196,200,188,.24);color:var(--muted);font-size:13px}
.signupHint button{min-height:0;padding:0;border:0;background:transparent;color:var(--primary);font-size:13px;font-weight:900}
.signupHint button:hover{text-decoration:underline;background:transparent}
.loginBrandPanel{position:absolute;z-index:1;top:30%;left:calc(50% + 220px);width:168px;height:168px;border-radius:10px;border:1.5px solid var(--primary);display:grid;place-items:center;color:var(--primary);background:rgba(255,255,255,.26)}
.loginBrandPanel .material-symbols-outlined{font-size:86px}
.loginTrust{position:absolute;z-index:2;bottom:42px;left:50%;transform:translateX(-50%);display:flex;align-items:center;justify-content:center;gap:22px;color:var(--muted);font-size:12px;white-space:nowrap}
.loginTrust span{display:inline-flex;align-items:center;gap:5px}
.loginTrust .material-symbols-outlined{font-size:15px}
/* 批次 7 · 登录/找回/重设页的语言选择器：镜像 .loginBack，放右上角 */
.loginLang{position:absolute;top:28px;right:32px;z-index:2;background:rgba(255,255,255,.58);box-shadow:var(--shadow-soft)}
/* 批次 7 · 找回/重设页的结果面板（已发送 / 链接失效 / 重设成功） */
.resetPanel{display:flex;flex-direction:column;align-items:center;gap:8px;text-align:center;padding:6px 0 2px}
/* ⚠ display:flex 会覆盖浏览器给 [hidden] 的默认 display:none —— 必须显式压回去。
   不加这条：重设页用无效链接打开时，密码表单、「链接已过期」、「密码已经更新」
   三块会同时显示，页面等于在对用户撒谎。同 .morePanel[hidden] 的既有写法（188 行）。 */
.resetPanel[hidden],.loginForm[hidden]{display:none}
.resetPanelIcon{font-size:40px;color:var(--primary)}
.resetPanelIcon.danger{color:var(--danger)}
.resetPanel h2{margin:0;color:var(--ink);font-size:15px;font-weight:900;line-height:1.35}
.resetPanel p{margin:0;color:var(--muted);font-size:12.5px;line-height:1.5}
.resetPanelHint{padding:8px 10px;border-radius:10px;background:rgba(240,236,228,.6)}
.resetPanelBtn{display:flex;align-items:center;justify-content:center;margin-top:6px;text-decoration:none}
.resetFootNote{margin:14px 0 0;color:var(--muted);font-size:11.5px;line-height:1.5}

@media(max-width:760px){
  .loginScene{padding:90px 22px 64px}
  .loginBack{top:24px;left:22px}
  .loginBrandPanel{display:none}
  .loginTrust{position:relative;bottom:auto;left:auto;transform:none;margin-top:32px;flex-wrap:wrap;gap:12px 18px}
}

/* ---------- Responsive ---------- */
@media(max-width:1120px){
  body{overflow:auto}
  .terraShell{height:auto;min-height:100vh}
  .sideNav{position:sticky;top:0}
  .app{height:auto;min-height:100vh;overflow:visible}
  .topbar{position:sticky;top:0;z-index:20}
  .workspace{overflow:visible}
  .threeCol{grid-template-columns:1fr;grid-template-areas:"actions" "reader" "stream"}
  .twoCol{grid-template-columns:1fr;grid-template-areas:"reader" "stream"}
  /* 窄屏取消侧栏 rail 折叠，恢复常规侧栏 */
  .railShell .sideNav{position:sticky;width:255px;padding:22px 16px}
  .railShell .app{margin-left:0}
  .railShell .sideNav .brandBlock>span:last-child,.railShell .sideNav .navItem>span:last-child,.railShell .sideNav .fileBtn>span:not(.material-symbols-outlined),.railShell .sideNav .helpLink>span:last-child{opacity:1}
  .readerPanel,.streamColumn,.actionPanel{min-height:620px}
  .reader{min-height:420px}
  .aiStream{min-height:420px}
}

@media(max-width:900px){
  .terraShell{display:block}
  .sideNav{position:relative;width:100%;height:auto;min-width:0;padding:14px;border-right:0;border-bottom:1px solid rgba(196,200,188,.32)}
  .brandBlock{margin-bottom:12px}
  .navList{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px}
  .navItem{height:44px;border-radius:var(--radius);justify-content:center;padding:0 8px;font-size:13px}
  .navItem span:last-child{display:none}
  .sideFooter{margin-top:12px;padding-top:12px;display:grid;grid-template-columns:1fr 1fr;gap:8px}
  .helpLink{display:none}
  .topbar{height:auto;min-height:0;align-items:stretch;flex-direction:column;padding:14px}
  /* 顶栏在此断点变成纵向 flex，.topLead 的 flex:1 改为作用在高度上，宽度就没了约束；
     其子元素的 max-width:44%/40% 失去可参照基准，省略号不生效，整行被撑到 404px
     （实测 es 下顶出 11px、ru 9px、en 5px，导致整页横滚）。给它确定的宽度基准。 */
  .topLead{width:100%;max-width:100%;flex:none}
  .searchWrap{width:100%;max-width:none}
  /* 窄屏顶栏操作区改 flex（原为固定 4 轨网格）。
     各页控件数量并不一样：settings 2 个、library/programs 3 个、teacher/exam 4 个。
     固定 4 轨会给缺席的控件留一条空轨道；而末轨从 minmax(74px,auto) 改成 1fr 之后，
     那条空轨道还会按比例分走剩余宽度 —— 3 个控件的页面右侧因此空出一大片，
     账号入口被挤到中间。flex 只排真实存在的控件，2/3/4 个都自然靠右收尾。
     （长语言「登录/账号」撑破横向的问题由下面的 max-width + 既有省略号收口。） */
  .topActions{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:8px;overflow:visible;padding-bottom:0}
  .topActions>*{min-width:0}
  /* 语言选择器固定 98px 宽的 select 会溢出，让它自适应剩余空间；pricing 顶栏不受影响。 */
  .topActions .langSwitch{min-width:0;flex:0 1 auto}
  .topActions .langSwitch>select.langSelect{width:auto;min-width:0;max-width:none;flex:1 1 auto}
  .apiStatus{flex:1 0 100%;width:100%;max-width:none;min-width:0}
  .quotaChip{min-width:0;justify-content:center;padding:0 8px;flex:0 1 auto}
  .upgradeBtn{width:44px;min-width:44px;padding:0;flex:0 0 auto}
  .upgradeBtn span:last-child{display:none}
  .avatarBtn{width:100%;max-width:none;min-width:0;padding:0 10px;font-size:12px}
  /* 只在顶栏内改：pricing 导航里的 .avatarBtn 仍按原规则走，不受影响。 */
  .topActions .avatarBtn{width:auto;max-width:150px;flex:0 1 auto}
  .badge{display:none}
  .statusStrip{padding:0 14px}
  .workspace{padding:14px;gap:14px}
  .panelHeader{padding:16px}
  .panelHeader h2{font-size:23px}
  .mentorHero{padding:18px}
  .mentorHero h1{font-size:28px}
  .grid2,.libraryLayout,.libraryColumns{grid-template-columns:1fr}
  .categoryPane{border-right:0;border-bottom:1px solid rgba(196,200,188,.26)}
  .miniForm.inline{width:100%}
  .modalOverlay{padding:12px}
}

@media(max-width:560px){
  .sideFooter{grid-template-columns:1fr}
  .topActions{gap:8px}
  .langSelect{width:98px}
  .statusText,.scopeText{max-width:50%}
  .readerTools,.actionBody,.aiStream{padding:12px}
  .reader{padding:14px}
  .blockHead,.cardTop,.objectHeader,.libraryTop,.modalFoot{flex-direction:column;align-items:stretch}
  .toolRow,.objectActions,.row{display:grid;grid-template-columns:1fr}
  .objectActions.audioLine{grid-template-columns:repeat(4,1fr)}
  .citationActions,.citationSelectActions{display:grid;grid-template-columns:1fr}
  .disclaimer{height:auto;min-height:34px;white-space:normal;display:block;line-height:1.5;padding:9px 14px}
}

/* ===== Terra workbench · mockup-match pass (terra_1) ===== */
.topbar{display:flex;align-items:center;gap:16px;justify-content:space-between}
.crumbs{display:flex;align-items:center;gap:8px;min-width:0}
.crumbs a{color:var(--muted);text-decoration:none;font-weight:700;font-size:14px}
.crumbs a:hover{color:var(--primary)}
.crumbSep{font-size:18px;color:var(--muted)}
.crumbCurrent{font-family:var(--font-headline);font-weight:700;color:var(--ink);font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.apiStatus{width:9px;height:9px;min-width:9px;border-radius:50%;font-size:0;line-height:0;padding:0;background:#c9a24a;margin-left:4px;overflow:hidden;display:inline-block;flex:none}
.apiStatus.ok{background:var(--primary)}
.apiStatus.warn{background:#c9803a}

.readerHeadTools{display:flex;align-items:center;gap:8px}
.readerSearch{display:flex;align-items:center;gap:6px;margin:2px 0 12px;padding:4px 4px 4px 14px;border:1px solid rgba(116,121,110,.2);border-radius:var(--radius-pill);background:var(--surface-lowest)}
.readerSearch>.material-symbols-outlined{color:var(--muted);font-size:20px}
.readerSearch input{flex:1;border:0;background:transparent;box-shadow:none;height:34px;min-height:34px}
/* 同上：关掉绿色方框，焦点由药丸边框加深表达。
   askBar 刻意不改 —— 那里的绿是设计意图（药丸整体变绿，见 .askBar:focus-within）。 */
.readerSearch input:focus,
.readerSearch input:focus-visible{outline:none;box-shadow:none}
.readerSearch:focus-within{border-color:rgba(116,121,110,.45)}
.readerSearch .iconBtn{width:34px;min-width:34px;height:34px}

.deepInsight{margin-top:14px;background:var(--surface-lowest);border:1px solid rgba(116,121,110,.16);border-radius:var(--radius-lg);padding:18px;box-shadow:var(--shadow-soft)}
.insightHead{display:flex;align-items:center;gap:9px;margin-bottom:10px}
.insightHead>.material-symbols-outlined{color:var(--primary)}
.insightHead h3{margin:0;font-family:var(--font-headline);font-size:16px;color:var(--ink)}
.insightBody{display:flex;flex-direction:column;gap:10px}
.insightPlaceholder{margin:0;font-size:13px;color:var(--muted);line-height:1.6}
.insightCard{background:var(--surface-low);border:1px solid rgba(116,121,110,.14);border-radius:var(--radius);padding:12px 14px}
.insightCard h5{margin:0 0 4px;font-size:13px;color:var(--primary);font-weight:800}
.insightCard p{margin:0;font-size:13px;color:var(--text);line-height:1.6}

.streamComposer .askLock{display:flex;flex-direction:column;gap:7px;margin-top:2px}
.streamComposer .askLock+.askLock{margin-top:12px}
.askLabel{font-size:12.5px;font-weight:800;color:var(--muted)}
.askBar{display:flex;align-items:flex-end;gap:8px;background:var(--surface-lowest);border:1px solid rgba(116,121,110,.2);border-radius:20px;padding:6px 6px 6px 14px}
.askBar:focus-within{border-color:var(--primary);box-shadow:0 0 0 4px rgba(74,124,89,.12)}
.askBar textarea{flex:1;border:0;background:transparent;box-shadow:none;resize:none;min-height:26px;max-height:120px;padding:7px 0;line-height:1.5}
/* askBar 的绿是**药丸整体变绿 + 光晕**（见上面 .askBar:focus-within），那是设计，保留。
   但全局 :focus-visible 还会在里面的 textarea 上再套一圈 2px 绿方框 ——
   那圈只框住输入区、把右边发送按钮排除在外，视觉上等于把一个控件劈成两半。
   只关内圈，药丸的绿一点不动。 */
.askBar textarea:focus,
.askBar textarea:focus-visible{outline:none;box-shadow:none}
.askSend{width:38px;min-width:38px;height:38px;padding:0;border-radius:50%}
.askSend>.material-symbols-outlined{font-size:20px}
.outlineChip{align-self:flex-start;height:32px;min-height:32px;padding:0 12px;border-radius:var(--radius-pill);font-size:12.5px}

.aiStream .streamCard{background:var(--surface-lowest);border:1px solid rgba(116,121,110,.14);border-radius:16px 16px 16px 5px;box-shadow:var(--shadow-soft)}
.aiStream .streamCard.current{border-color:var(--primary-container);background:var(--surface-warm)}

/* ============================================================= */
/* Shared Terra primitives (exam / library / settings / pricing) */
/* ============================================================= */
.pageTitle{margin:0;font-family:var(--font-headline);font-size:30px;font-weight:700;color:var(--primary);line-height:1.1}
.pageSub{margin:8px 0 0;font-size:14px;color:var(--muted);line-height:1.5}
.card{background:var(--surface-lowest);border:1px solid rgba(196,200,188,.34);border-radius:var(--radius-lg);padding:24px;box-shadow:var(--shadow-soft)}
/* space-between 的标题行必须允许换行：中文标题短，放得下；换成 en/es/ru 后标题变长，
   不换行就把卡片顶破（实测 ru 下 108px、es 93px）。内容放得下时 wrap 不改变观感。 */
.cardHeadRow{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:18px;flex-wrap:wrap}
.cardHeadRow h2{margin:0;font-family:var(--font-headline);font-size:22px;color:var(--ink);font-weight:700}
.linkBtn{background:transparent;border:0;box-shadow:none;color:var(--primary);font-weight:800;font-size:13px;padding:6px 8px;min-height:0}
.linkBtn:hover{background:var(--primary-soft)}

/* page-scoped topbar that shows a title instead of breadcrumbs */
.topbar.pageTop{justify-content:space-between}
.topbar.pageTop .topActions{margin-left:auto}

/* Segmented control (计时/练习, 本周/上周) */
.segmented{display:inline-flex;background:var(--surface-container);border:1px solid rgba(196,200,188,.4);border-radius:12px;padding:4px;gap:4px}
.segmented button{min-height:34px;padding:0 16px;border-radius:9px;background:transparent;color:var(--muted);font-weight:800;font-size:13px;border:0;box-shadow:none}
.segmented button:hover{background:transparent;color:var(--ink)}
.segmented button.active{background:var(--primary);color:var(--on-primary)}
.segmented button.active:hover{background:var(--primary)}

/* Range slider field */
.rangeWrap{display:flex;align-items:center;gap:16px;background:var(--surface-lowest);border:1px solid rgba(196,200,188,.4);border-radius:14px;padding:12px 18px}
.rangeWrap input[type=range]{flex:1;height:6px;accent-color:var(--primary);background:transparent;border:0;padding:0;box-shadow:none;cursor:pointer}
.rangeWrap input[type=range]:focus{box-shadow:none}
.rangeValue{font-family:var(--font-headline);font-size:24px;font-weight:700;color:var(--primary);white-space:nowrap;min-width:52px;text-align:right}
.rangeValue small{font-size:13px;color:var(--muted);font-weight:600}

/* Toggle switch */
.switch{position:relative;display:inline-block;width:52px;height:30px;flex:none}
.switch input{opacity:0;width:0;height:0}
.switch .slider{position:absolute;inset:0;border-radius:999px;background:var(--surface-container-highest);border:1px solid rgba(196,200,188,.4);transition:background .2s ease;cursor:pointer}
.switch .slider::before{content:"";position:absolute;width:22px;height:22px;left:4px;top:3px;border-radius:50%;background:#fff;transition:transform .2s ease;box-shadow:var(--shadow-soft)}
.switch input:checked+.slider{background:var(--primary);border-color:var(--primary)}
.switch input:checked+.slider::before{transform:translateX(21px)}

/* Filter chips (library categories) */
.chipRow{display:flex;flex-wrap:wrap;gap:10px;align-items:center}
.chip{min-height:38px;padding:0 18px;border-radius:var(--radius-pill);border:1px solid rgba(196,200,188,.5);background:var(--surface-container);color:var(--text);font-weight:800;font-size:13px;cursor:pointer;display:inline-flex;align-items:center;gap:6px}
.chip:hover{background:var(--surface-container-high)}
.chip.active{background:var(--primary);color:var(--on-primary);border-color:var(--primary)}

/* Generated placeholder covers (PDF has no cover image) */
.docCover{position:relative;border-radius:var(--radius) var(--radius) 0 0;aspect-ratio:16/9;display:flex;align-items:flex-end;padding:14px;overflow:hidden;color:#fff}
.docCover::after{content:"";position:absolute;inset:0;background:radial-gradient(120% 90% at 15% 0,rgba(255,255,255,.28),transparent 55%)}
.docCover .coverGlyph{position:absolute;right:-10px;top:-14px;font-size:104px;opacity:.22;color:#fff;font-variation-settings:"FILL" 1}
.docCover .coverBadge{position:absolute;top:12px;right:12px;z-index:2;background:rgba(255,255,255,.85);color:#3d4a3f;font-size:11px;font-weight:900;letter-spacing:.04em;padding:4px 9px;border-radius:8px}
.docCover .coverName{position:relative;z-index:2;font-family:var(--font-headline);font-weight:700;font-size:16px;line-height:1.25;text-shadow:0 1px 8px rgba(0,0,0,.25);overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
.cover-0{background:linear-gradient(140deg,#5a8f68,#33573e)}
.cover-1{background:linear-gradient(140deg,#b0904e,#6d5626)}
.cover-2{background:linear-gradient(140deg,#7d9b8a,#456b57)}
.cover-3{background:linear-gradient(140deg,#b58a68,#7a4f38)}
.cover-4{background:linear-gradient(140deg,#6f93a3,#3f6373)}
.cover-5{background:linear-gradient(140deg,#9a7aa0,#5f4468)}

/* Document card grid (library terra_4 + exam picker terra_6) */
.docCardGrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:20px}
.docCardGrid.compact{grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:16px}
.uploadDashed{grid-column:auto;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;min-height:180px;border:2px dashed rgba(116,121,110,.4);border-radius:var(--radius-lg);background:var(--surface-low);color:var(--primary);text-decoration:none;text-align:center;padding:20px;cursor:pointer}
.uploadDashed .folderChip{margin-top:10px;min-height:34px;padding:0 14px;border-radius:var(--radius-pill);background:var(--tertiary-container);color:var(--tertiary);border:1px solid rgba(112,92,48,.28);font-weight:800;font-size:12.5px;display:inline-flex;align-items:center;gap:6px;cursor:pointer}
.uploadDashed .folderChip:hover{background:#f3dfa0}
.uploadDashed .folderChip .material-symbols-outlined{font-size:18px}
.uploadDashed .folderChip.locked{background:var(--surface-container);color:var(--secondary);border-color:rgba(196,200,188,.5)}
.uploadDashed .folderChip.locked:hover{background:var(--surface-container-high)}
.uploadDashed:hover{background:var(--primary-soft);border-color:var(--primary)}
.uploadDashed .material-symbols-outlined{font-size:34px}
.uploadDashed b{color:var(--ink);font-family:var(--font-headline);font-size:17px}
.uploadDashed small{color:var(--muted);font-size:12.5px;line-height:1.4}
.docCard{border:1px solid rgba(196,200,188,.36);border-radius:var(--radius-lg);background:var(--surface-lowest);box-shadow:var(--shadow-soft);overflow:hidden;display:flex;flex-direction:column;cursor:pointer;transition:border-color .16s ease,transform .16s ease,box-shadow .16s ease}
.docCard:hover{border-color:rgba(74,124,89,.4);transform:translateY(-2px);box-shadow:var(--shadow-lift)}
.docCard.selected{border-color:var(--primary);box-shadow:0 0 0 2px var(--primary),var(--shadow-soft)}
.docCardBody{padding:16px;display:flex;flex-direction:column;gap:8px;flex:1}
.docCardBody h4{margin:0;font-family:var(--font-headline);font-size:17px;color:var(--ink);line-height:1.3}
.docCardBody p{margin:0;font-size:13px;color:var(--muted);line-height:1.5;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.docCardFoot{display:flex;align-items:center;justify-content:space-between;margin-top:auto;padding-top:6px}
.docCardFoot .kpts{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;color:var(--muted);font-weight:700}
.docCardFoot .kpts .material-symbols-outlined{font-size:18px;color:var(--tertiary)}
.playBtn{width:38px;height:38px;min-width:38px;min-height:38px;padding:0;border-radius:50%;background:var(--primary-soft);color:var(--primary);border:0}
.playBtn:hover{background:var(--primary);color:#fff}
.docCard.selected .pickCheck{opacity:1}
.pickCheck{position:absolute;top:10px;left:10px;z-index:3;width:26px;height:26px;border-radius:50%;background:var(--primary);color:#fff;display:grid;place-items:center;opacity:0;box-shadow:var(--shadow-soft)}
.docCard{position:relative}
/* 悬停教材卡出现的删除（垃圾桶）按钮：放封面左上角，避开右上角的分类徽标 */
.docDelBtn{position:absolute;top:10px;left:10px;z-index:3;display:grid;place-items:center;width:32px;height:32px;padding:0;border:none;border-radius:9px;background:rgba(20,20,20,.42);color:#fff;cursor:pointer;opacity:0;transform:translateY(-2px);transition:opacity .15s ease,transform .15s ease,background .15s ease}
.docDelBtn .material-symbols-outlined{font-size:18px}
.docCard:hover .docDelBtn{opacity:1;transform:none}
.docDelBtn:hover{background:#c0392b}
/* 抽不出文字的教材（扫描件/影印版）：卡片必须自己说出来。
   此前它们和正常教材长得一模一样 —— 有封面、有「1 个知识点」、有播放按钮 ——
   点进去却是彻底空白的阅读区加一个「1 / 106」的页码器，没有一个字解释为什么。
   实际用户手上 22 本里有 11 本是这种，全都是他真正要读的课程教材。 */
.docCard.noText{border-color:rgba(184,50,48,.34);cursor:default}
.docCard.noText:hover{transform:none;border-color:rgba(184,50,48,.5);box-shadow:var(--shadow-soft)}
.docCard.noText .docCover{filter:grayscale(.55) opacity(.72)}
.docCardBody p.noTextNote{color:var(--danger);font-weight:600;-webkit-line-clamp:3}
.docCardFoot .noTextTag{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;font-weight:800;color:var(--danger);background:var(--danger-bg);border-radius:var(--radius-pill);padding:3px 9px}
.docCardFoot .noTextTag .material-symbols-outlined{font-size:17px;color:var(--danger)}
.reupBtn{background:transparent;border:0;box-shadow:none;color:var(--primary);font-weight:800;font-size:13px;padding:6px 8px;min-height:0}
.reupBtn:hover{background:var(--primary-soft)}
.noTextInline{color:var(--danger)}
/* 图片教材：阅读区显示上传的图片 */
.imageDocBox{margin-top:12px;text-align:center}
.imageDocBox img{max-width:100%;height:auto;border-radius:10px;border:1px solid rgba(196,200,188,.45);box-shadow:var(--shadow-soft)}

/* ============================================================= */
/* Exam center (terra_6)                                         */
/* ============================================================= */
.examCenter{flex:1;min-height:0;overflow:auto;padding:26px 30px 40px}
.examSteps{display:flex;align-items:center;justify-content:center;gap:10px;max-width:760px;margin:8px auto 26px}
.stepItem{display:flex;flex-direction:column;align-items:center;gap:8px;flex:none}
.stepDot{width:46px;height:46px;border-radius:50%;border:2px solid var(--outline-variant);display:grid;place-items:center;font-family:var(--font-headline);font-weight:700;font-size:18px;color:var(--muted);background:var(--surface)}
.stepLabel{font-size:13.5px;color:var(--muted);font-weight:800}
.stepItem.active .stepDot{background:var(--primary);border-color:var(--primary);color:#fff}
.stepItem.active .stepLabel{color:var(--primary)}
.stepLine{flex:1;height:2px;background:var(--outline-variant);max-width:170px;margin-top:-24px}
.examCenterGrid{display:grid;grid-template-columns:minmax(0,1.7fr) minmax(280px,1fr);gap:22px;align-items:start;max-width:1180px;margin:0 auto}
.examMainCol{display:flex;flex-direction:column;gap:20px;min-width:0}
.examSideCol{display:flex;flex-direction:column;gap:18px;position:sticky;top:0}
/* fr 轨道默认 min-width:auto —— 内容装不下时轨道不收缩，而是把卡片撑破。
   1024–1280 下「测试模式」切换键就这样溢出 92px 戳到卡片外面。
   改 minmax(0,…) 让轨道真的能收缩，并允许分段键/下拉在窄轨道里等分收窄。 */
.paramGrid{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.3fr) minmax(0,1fr);gap:18px;margin-bottom:20px}
.paramField{display:flex;flex-direction:column;gap:9px;min-width:0}
/* select 与 range 都自带浏览器固有最小宽度，min-width:0 必须落到控件本身，
   否则轨道收缩后换成它们顶出来（下拉曾溢出 37px、滑块行 32px）。 */
.paramField>select{min-width:0;width:100%}
.paramField .rangeWrap{min-width:0}
.paramField .rangeWrap input[type=range]{min-width:0}
.paramGrid .segmented{min-width:0}
.paramGrid .segmented button{flex:1 1 0;min-width:0;padding:0 8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* ≤1250：Pro 侧栏占位使主列很窄，三列会把难度下拉和模式键压到要省略号才放得下
   （实测 1150 时分段键仅 128px、下拉文字被截）。这段区间直接单列，
   宁可竖着排也不要挤到读不出；三列只留给真正放得下的宽屏。 */
@media(max-width:1250px){.paramGrid{grid-template-columns:minmax(0,1fr)}}
.paramField>label{font-size:13px;font-weight:800;color:var(--secondary)}
.bigCta{width:100%;min-height:58px;border-radius:var(--radius);font-size:17px;font-weight:900;gap:10px;box-shadow:0 12px 26px -12px rgba(74,124,89,.7)}
.bigCta .material-symbols-outlined{font-size:22px}
.genBankLine{margin-top:14px;display:flex;flex-wrap:wrap;gap:12px;align-items:center;font-size:13px;color:var(--muted)}
/* 错题本一行：数量在左、重练按钮在右。flex-wrap 是给长语言留的后路
   （俄语/西语的「本项目已存 N 道错题」比中文长得多，窄屏放不下就换行，不撑破卡片）。 */
.wbRow{margin-top:14px;display:flex;flex-wrap:wrap;gap:12px;align-items:center;justify-content:space-between}
.wbCount{min-width:0;font-size:14px;font-weight:800;color:var(--ink)}
.wbBtns{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.genStatusLine{margin-top:12px;font-size:13.5px;color:var(--text);line-height:1.5}
.genStatusLine a{color:var(--primary);font-weight:800}
.lockNoteBox{margin-top:14px;background:var(--warn-bg);border:1px solid rgba(112,92,48,.22);border-radius:var(--radius);padding:12px 14px;font-size:13px;color:var(--warn);line-height:1.55}
.lockNoteBox a{color:var(--warn);font-weight:900;text-decoration:underline}
.proPerksCard{background:linear-gradient(160deg,#6f5a34,#463920);color:#f2e6cc;border-radius:var(--radius-lg);padding:24px;box-shadow:var(--shadow-lift)}
.exclusiveBadge{display:inline-block;background:rgba(255,255,255,.16);color:#f7edd6;font-size:11px;font-weight:900;letter-spacing:.1em;padding:5px 11px;border-radius:8px;margin-bottom:16px}
.proPerksCard h3{font-family:var(--font-headline);font-size:26px;margin:0 0 18px;color:#fff;font-weight:700}
.perkList{list-style:none;margin:0 0 22px;padding:0;display:flex;flex-direction:column;gap:13px}
.perkList li{display:flex;gap:10px;align-items:flex-start;font-size:14px;color:#eaddbf;line-height:1.4}
.perkList li .material-symbols-outlined{color:#e8c877;font-size:20px;flex:none}
.perkUpgradeBtn{display:flex;align-items:center;justify-content:center;text-decoration:none;width:100%;background:#fff;color:#5a4a28;font-weight:900;border-radius:var(--radius);min-height:48px;font-size:15px}
.perkUpgradeBtn:hover{background:#f4ead3}
.recentScoresCard{background:var(--surface-lowest);border:1px solid rgba(196,200,188,.3);border-radius:var(--radius-lg);padding:22px;box-shadow:var(--shadow-soft)}
.recentScoresCard h3{font-family:var(--font-headline);font-size:20px;margin:0 0 14px;color:var(--ink)}
.scoreRow{display:flex;align-items:center;gap:13px;padding:11px 0;border-bottom:1px dashed rgba(196,200,188,.5)}
.scoreRow:last-of-type{border-bottom:0}
.scoreBadge{width:46px;height:46px;min-width:46px;border-radius:12px;background:var(--primary-soft);color:var(--primary);display:grid;place-items:center;font-family:var(--font-headline);font-weight:700;font-size:18px}
.scoreInfo{min-width:0}
.scoreInfo b{display:block;color:var(--ink);font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.scoreInfo span{font-size:12px;color:var(--muted)}
.scoreTrend{margin-left:auto;color:var(--primary)}
.scoreTrend.flat{color:var(--muted)}

/* ============================================================= */
/* Exam room — focused quiz + result (terra_2)                   */
/* ============================================================= */
.examRoom{height:100vh;display:flex;flex-direction:column;background:radial-gradient(1100px 520px at 100% -10%,rgba(232,224,206,.5),transparent 55%),var(--background)}
.examRoomTop{min-height:70px;display:flex;align-items:center;gap:20px;padding:12px 28px;background:rgba(250,246,240,.9);border-bottom:2px solid var(--primary);backdrop-filter:blur(12px)}
.examRoomBrand{font-family:var(--font-headline);font-size:20px;font-weight:700;color:var(--ink);text-decoration:none;white-space:nowrap}
.examRoomTitle{display:flex;flex-direction:column;min-width:0}
.examRoomTitle small{font-size:11px;color:var(--muted);font-weight:700}
.examRoomTitle b{font-size:14px;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.examTimerWrap{margin-left:auto;text-align:right}
.examTimerWrap small{display:block;font-size:11px;color:var(--muted);font-weight:700}
.examTimer{font-family:var(--font-headline);font-size:24px;font-weight:700;color:var(--ink);line-height:1}
.examTimer.low{color:var(--danger)}
.endExamBtn{min-height:44px;padding:0 20px;border-radius:var(--radius);font-size:14px}
.examRoomIcon{display:inline-flex;align-items:center;justify-content:center;width:40px;height:40px;min-width:40px;padding:0;border-radius:50%;background:var(--surface-lowest);color:var(--muted);border:1px solid rgba(116,121,110,.2);text-decoration:none;cursor:pointer}
.examRoomIcon:hover{background:var(--primary-soft);color:var(--primary)}
.examRoomMain{flex:1;min-height:0;overflow:auto;display:grid;grid-template-columns:minmax(0,1.9fr) minmax(300px,1fr);gap:22px;padding:24px 28px;max-width:1400px;margin:0 auto;width:100%}
.quizCard{background:var(--surface-lowest);border:1px solid rgba(196,200,188,.34);border-radius:22px;box-shadow:var(--shadow-soft);padding:28px 30px;display:flex;flex-direction:column;align-self:start}
.qTopRow{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:18px}
.qTypeBadge{background:var(--tertiary-container);color:var(--tertiary);font-weight:900;font-size:13px;padding:6px 12px;border-radius:var(--radius-pill)}
.qCounter{font-size:14px;color:var(--muted);font-weight:700}
.qText{font-size:19px;line-height:1.6;color:var(--ink);font-weight:600;margin-bottom:18px;white-space:pre-wrap;overflow-wrap:anywhere}
.qHintBox{background:var(--surface-low);border-left:4px solid var(--primary-container);border-radius:var(--radius);padding:12px 16px;margin-bottom:20px;font-size:14px;color:var(--text);font-style:italic;line-height:1.55}
.qHintBox b{font-style:normal;color:var(--primary)}
.choicesList{display:flex;flex-direction:column;gap:12px}
.choiceItem{display:flex;align-items:center;gap:16px;width:100%;text-align:left;padding:15px 18px;border:1px solid rgba(196,200,188,.5);border-radius:16px;background:var(--surface-lowest);color:var(--text);font-size:15px;font-weight:600;line-height:1.5;cursor:pointer}
.choiceItem:hover{background:var(--surface-low);border-color:rgba(116,121,110,.4)}
.choiceItem .choiceLetter{width:32px;height:32px;min-width:32px;border-radius:50%;border:1px solid rgba(116,121,110,.35);display:grid;place-items:center;font-weight:800;color:var(--muted);background:transparent}
.choiceItem .choiceBody{flex:1;overflow-wrap:anywhere}
.choiceItem .choiceCheck{margin-left:auto;color:var(--primary);opacity:0}
.choiceItem.picked{background:var(--primary-soft);border-color:var(--primary)}
.choiceItem.picked .choiceLetter{background:var(--primary);color:#fff;border-color:var(--primary)}
.choiceItem.picked .choiceCheck{opacity:1}
.quizFooterRow{display:flex;align-items:center;justify-content:space-between;gap:14px;margin-top:26px}
.prevLink{background:transparent;border:0;box-shadow:none;color:var(--primary);font-weight:800;display:inline-flex;align-items:center;gap:6px;padding:8px 4px}
.prevLink:hover{background:transparent;color:var(--primary-hover)}
.prevLink:disabled{color:var(--faint);opacity:.6}
.submitContinueBtn{min-height:52px;padding:0 30px;border-radius:var(--radius);font-size:15px}
.examRail{display:flex;flex-direction:column;gap:20px;align-self:start}
.qNavCard,.scratchCard{background:var(--surface-low);border:1px solid rgba(196,200,188,.34);border-radius:20px;padding:20px}
.qNavHead,.scratchHead{display:flex;align-items:center;gap:9px;margin-bottom:16px}
.qNavHead .material-symbols-outlined,.scratchHead .material-symbols-outlined{color:var(--primary)}
.qNavHead b,.scratchHead b{font-family:var(--font-headline);font-size:17px;color:var(--ink)}
.scratchHead .linkBtn{margin-left:auto}
.qNavGrid{display:grid;grid-template-columns:repeat(5,1fr);gap:10px}
.qNavCell{height:44px;border-radius:12px;border:1px solid rgba(196,200,188,.5);background:var(--surface-container);color:var(--muted);font-weight:800;display:grid;place-items:center;cursor:pointer;padding:0;min-height:0}
.qNavCell:hover{background:var(--surface-container-high)}
.qNavCell.answered{background:var(--primary-container);color:var(--on-primary-container);border-color:transparent}
.qNavCell.current{background:var(--surface-lowest);border:2px solid var(--primary);color:var(--primary)}
.qNavLegend{display:flex;flex-wrap:wrap;gap:14px;margin-top:16px;font-size:12.5px;color:var(--muted)}
.qNavLegend span{display:inline-flex;align-items:center;gap:6px}
.legendDot{width:11px;height:11px;border-radius:50%}
.legendDot.answered{background:var(--primary-container)}
.legendDot.current{background:var(--primary)}
.legendDot.empty{background:var(--surface-container-highest);border:1px solid var(--outline-variant)}
.scratchArea{width:100%;min-height:150px;border-radius:var(--radius);background:var(--surface-lowest);resize:vertical}
.scratchCheckBtn{width:100%;margin-top:12px;background:var(--surface-lowest);color:var(--primary);border:1px solid rgba(74,124,89,.35);font-weight:800;min-height:46px}
.scratchCheckBtn:hover{background:var(--primary-soft)}
.scratchResult{margin-top:12px;font-size:13.5px;color:var(--text);line-height:1.6;white-space:pre-wrap;background:var(--surface-lowest);border:1px solid rgba(196,200,188,.4);border-radius:var(--radius);padding:12px 14px}
.scratchResult:empty{display:none}
.examRoomFoot{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:14px 28px;border-top:1px solid rgba(196,200,188,.28);background:rgba(240,236,228,.5);color:var(--muted);font-size:12.5px;flex-wrap:wrap}
.examRoomFoot .fLinks{display:flex;gap:20px}
.examRoomFoot a{color:var(--muted);text-decoration:none;font-weight:700}
.examRoomFoot a:hover{color:var(--primary)}

/* Result view (terra styled) */
.resultWrap{max-width:820px;margin:0 auto;width:100%;grid-column:1/-1}
.resultCard{background:var(--surface-lowest);border:1px solid rgba(196,200,188,.34);border-radius:22px;box-shadow:var(--shadow-soft);padding:30px}
.resultCard h1{margin:0 0 6px;font-family:var(--font-headline);font-size:28px;color:var(--ink)}
.scoreBig{font-family:var(--font-headline);font-size:56px;font-weight:700;color:var(--primary);line-height:1}
.scoreBig small{font-size:16px;color:var(--muted);font-weight:600;margin-left:10px}
.resultCard h2{font-family:var(--font-headline);font-size:19px;color:var(--ink);margin:24px 0 12px}
.domainRow{display:flex;justify-content:space-between;gap:10px;padding:9px 0;border-bottom:1px dashed rgba(196,200,188,.5);font-size:14px}
.domainRow b{color:var(--ink)}
.domainRow .weak{color:var(--danger);font-weight:700}
.reviewBox{border:1px solid rgba(196,200,188,.4);border-radius:var(--radius);padding:15px;margin-bottom:11px;background:var(--surface-low)}
.reviewBox .rq{font-weight:700;color:var(--ink);margin-bottom:8px}
.reviewBox .rwrong{color:var(--danger);font-size:14px}
.reviewBox .rright{color:var(--primary);font-size:14px;font-weight:700}
.reviewBox .rexp{font-size:13.5px;color:var(--text);margin-top:9px;padding-top:9px;border-top:1px dashed rgba(196,200,188,.5);line-height:1.6}

/* ============================================================= */
/* Library (terra_4) + Settings (terra_5) shared page chrome      */
/* ============================================================= */
.pageTitle.dark{color:var(--ink);font-size:34px}
.libMain,.setMain,.progMain{flex:1;min-height:0;overflow:auto;padding:26px 34px 44px}
.libHead{display:flex;justify-content:space-between;align-items:flex-end;gap:20px;margin-bottom:24px;flex-wrap:wrap}
.filterChipBtn{width:44px;height:44px;min-width:44px;padding:0;border-radius:50%;background:var(--surface-container);color:var(--secondary);border:1px solid rgba(196,200,188,.5)}
.filterChipBtn:hover{background:var(--surface-container-high);color:var(--primary)}
.libManageRow{display:flex;gap:12px;align-items:center;flex-wrap:wrap;margin-top:28px;padding-top:20px;border-top:1px solid rgba(196,200,188,.3);color:var(--muted);font-size:13px}
/* 已经 wrap 了仍会溢出，是因为单个子项自身比整行还宽（长语言下的按钮/说明文字）。 */
.libManageRow>*{min-width:0;max-width:100%}
.libEmpty{grid-column:1/-1;align-self:center;color:var(--muted);padding:30px}
/* white-space:pre-line —— 批量上传的失败清单是一行一个文件，靠 \n 分行 */
.upStatus{margin:0 0 14px;font-size:13.5px;color:var(--primary);font-weight:700;line-height:1.5;white-space:pre-line}
.upStatus:empty{display:none}

/* Settings-specific */
.setGrid{display:grid;grid-template-columns:minmax(300px,1fr) minmax(0,1.6fr);gap:22px;align-items:start;max-width:1180px}
.setCol{display:flex;flex-direction:column;gap:22px;min-width:0}
.profileCard{background:var(--surface-lowest);border:1px solid rgba(196,200,188,.34);border-radius:var(--radius-lg);box-shadow:var(--shadow-soft);overflow:hidden}
.profileTop{background:linear-gradient(160deg,rgba(216,240,222,.7),rgba(248,224,168,.32));height:78px}
.profileBody{padding:0 24px 24px;text-align:center;margin-top:-46px}
.profileAvatar{width:92px;height:92px;border-radius:50%;margin:0 auto 12px;background:var(--primary);color:#fff;display:grid;place-items:center;font-family:var(--font-headline);font-size:36px;font-weight:700;border:4px solid var(--surface-lowest);box-shadow:var(--shadow-soft)}
.profileBody h3{margin:0;font-family:var(--font-headline);font-size:22px;color:var(--ink)}
.profileBody .pmail{margin:5px 0 16px;font-size:13.5px;color:var(--muted)}
.setSection{background:var(--surface-lowest);border:1px solid rgba(196,200,188,.34);border-radius:var(--radius-lg);box-shadow:var(--shadow-soft);padding:24px}
.setSection h3{margin:0 0 16px;font-family:var(--font-headline);font-size:20px;color:var(--ink)}
.planCard{background:linear-gradient(160deg,rgba(248,224,168,.5),rgba(240,236,228,.6));border:1px solid rgba(112,92,48,.2);border-radius:var(--radius-lg);padding:22px}
.planTag{display:inline-block;background:var(--tertiary);color:#fff;font-size:11px;font-weight:900;letter-spacing:.06em;padding:4px 10px;border-radius:8px;margin-bottom:12px}
.planCard h3{font-family:var(--font-headline);font-size:22px;color:var(--ink);margin:0 0 8px}
.planCard p{font-size:13.5px;color:var(--text);line-height:1.55;margin:0 0 14px}
.planManage{color:var(--primary);font-weight:800;text-decoration:none;display:inline-flex;align-items:center;gap:6px}
.prefRow{display:flex;align-items:center;gap:16px;padding:14px 16px;border-radius:var(--radius);background:var(--surface-low);margin-bottom:12px;flex-wrap:wrap}
.prefRow>*{min-width:0}
.prefRow:last-child{margin-bottom:0}
.prefIcon{width:42px;height:42px;min-width:42px;border-radius:12px;background:var(--surface-container);color:var(--primary);display:grid;place-items:center}
.prefText b{display:block;color:var(--ink);font-size:15px}
.prefText span{font-size:12.5px;color:var(--muted)}
.prefCtrl{margin-left:auto}
.prefCtrl select{min-width:130px}
.weekChart{display:flex;align-items:flex-end;justify-content:space-between;gap:10px;height:210px;padding:10px 4px 0}
.weekBar{flex:1;display:flex;flex-direction:column;align-items:center;gap:8px;height:100%;justify-content:flex-end}
.weekBar .bar{width:100%;max-width:38px;border-radius:8px 8px 0 0;background:linear-gradient(180deg,var(--primary),var(--primary-container));min-height:4px;transition:height .3s ease}
.weekBar .bar.empty{background:var(--surface-container-high)}
.weekBar small{font-size:12px;color:var(--muted)}
.setDualRow{display:grid;grid-template-columns:1fr 1fr;gap:22px;margin-top:22px}
.setMiniCard{background:var(--surface-lowest);border:1px solid rgba(196,200,188,.34);border-radius:var(--radius-lg);box-shadow:var(--shadow-soft);padding:22px}
.setMiniCard .miniIcon{width:44px;height:44px;border-radius:12px;background:var(--primary-soft);color:var(--primary);display:grid;place-items:center;margin-bottom:12px}
.setMiniCard h4{margin:0 0 6px;font-family:var(--font-headline);font-size:17px;color:var(--ink)}
.setMiniCard p{margin:0 0 12px;font-size:13px;color:var(--muted);line-height:1.5}
.setMiniCard .miniAct{color:var(--primary);font-weight:800;background:transparent;border:0;padding:0;box-shadow:none;cursor:pointer;font-size:14px}
.setMiniCard .miniAct:hover{background:transparent;text-decoration:underline}
@media(max-width:900px){.setGrid,.setDualRow{grid-template-columns:1fr}.examCenterGrid{grid-template-columns:1fr}.examSideCol{position:static}.paramGrid{grid-template-columns:1fr}.examRoomMain{grid-template-columns:1fr}.examRail{order:-1}}

/* ============================================================= */
/* Pricing (terra_3) — in-app top-nav marketing layout           */
/* ============================================================= */
body.pricePage{overflow:auto;height:auto;min-height:100vh;background:radial-gradient(1000px 520px at 90% -8%,rgba(232,224,206,.4),transparent 55%),var(--background)}
/* flex-wrap 放在基础规则里而不是某个断点里：导航的固有宽度随语言变化（中文约 772px，
   英文更宽），按单一语言定断点必然在别的语言下漏掉——英文 768px 曾因此整页横滚 33px。
   放得下时不会换行，桌面观感不变；放不下就换行，任何语言都不会横滚。 */
.priceNav{position:sticky;top:0;z-index:30;display:flex;align-items:center;gap:10px;row-gap:10px;flex-wrap:wrap;padding:14px 40px;background:rgba(250,246,240,.9);backdrop-filter:blur(14px);border-bottom:1px solid rgba(196,200,188,.3)}
.priceNav .brand{font-family:var(--font-headline);font-weight:700;font-size:20px;color:var(--ink);text-decoration:none;margin-right:18px;white-space:nowrap}
.priceNavLink{color:var(--muted);text-decoration:none;font-weight:700;font-size:14px;padding:7px 13px;border-radius:var(--radius-pill)}
.priceNavLink:hover{color:var(--primary);background:var(--primary-soft)}
.priceNavLink.active{color:var(--primary)}
.priceNavActions{margin-left:auto;display:flex;align-items:center;gap:12px}
.priceMain{max-width:1080px;margin:0 auto;padding:58px 24px 30px}
.priceHero{text-align:center;margin-bottom:14px}
.priceHero h1{font-family:var(--font-headline);font-size:clamp(30px,4vw,46px);color:var(--ink);font-weight:700;margin:0 0 14px}
.priceHero p{max-width:620px;margin:0 auto;color:var(--muted);font-size:16px;line-height:1.65}
.billToggle{display:flex;align-items:center;justify-content:center;gap:14px;margin:28px 0 40px}
.billToggle .lbl{font-weight:800;color:var(--muted);font-size:15px;cursor:pointer}
.billToggle .lbl.on{color:var(--ink)}
.saveTag{background:var(--tertiary-container);color:var(--tertiary);font-size:12px;font-weight:900;padding:4px 10px;border-radius:var(--radius-pill)}
.priceGrid{display:grid;grid-template-columns:repeat(3,1fr);gap:22px;align-items:stretch}
.priceCard{position:relative;display:flex;flex-direction:column;background:var(--surface-lowest);border:1px solid rgba(196,200,188,.4);border-radius:20px;padding:30px 26px;box-shadow:var(--shadow-soft)}
.priceCard.best{border:1.5px solid var(--primary);box-shadow:0 0 0 1px var(--primary),var(--shadow-lift)}
.priceBestTag{position:absolute;top:-13px;left:50%;transform:translateX(-50%);background:var(--tertiary);color:#fff;font-size:12px;font-weight:900;letter-spacing:.04em;padding:5px 16px;border-radius:var(--radius-pill);white-space:nowrap;display:none}
.priceCard.best .priceBestTag{display:block}
.priceKicker{color:var(--primary);font-weight:900;font-size:13px;letter-spacing:.04em}
.priceCard.free .priceKicker{color:var(--secondary)}
.priceAmount{font-family:var(--font-headline);font-size:40px;font-weight:700;color:var(--ink);line-height:1;margin:12px 0 4px}
.priceAmount small{font-size:15px;color:var(--muted);font-weight:600}
.priceAmount .was{font-size:14px;color:var(--faint);text-decoration:line-through;margin-left:8px;font-family:var(--font-body)}
.priceFor{color:var(--muted);font-size:13px;min-height:18px;margin-bottom:18px;line-height:1.5}
.priceFeatures{list-style:none;padding:0;margin:0 0 22px;display:flex;flex-direction:column;gap:11px;flex:1}
.priceFeatures li{display:flex;gap:9px;align-items:flex-start;font-size:14px;color:var(--text);line-height:1.45}
.priceFeatures li .material-symbols-outlined{color:var(--primary);font-size:20px;flex:none}
.priceFeatures li.dim{color:var(--faint)}
.priceFeatures li.dim .material-symbols-outlined{color:var(--faint)}
.priceFeatures li.feat-star{font-weight:800;color:var(--ink);background:linear-gradient(90deg,rgba(248,224,168,.5),rgba(248,224,168,.14));border:1px solid rgba(112,92,48,.2);border-radius:10px;padding:9px 11px;margin:-2px -2px 2px}
.priceFeatures li.feat-star .material-symbols-outlined{color:var(--tertiary);font-variation-settings:"FILL" 1}
/* 基础态（可购买/可升级）此前只有排版没有配色，渲染出来是一段纯文字 —— 全站唯一的付费入口
   看着不像能点。这里补上与站内主按钮一致的实心样式（button 那条规则只作用于 <button>，
   .priceCta 是 <a> 吃不到）。下面 ghost/owned/locked 三个变体在其后，仍会正确覆盖。 */
.priceCta{display:flex;align-items:center;justify-content:center;text-align:center;text-decoration:none;width:100%;min-height:50px;border-radius:var(--radius);font-weight:900;font-size:15px;background:var(--primary);color:var(--on-primary);border:1px solid transparent;transition:background .16s ease}
.priceCta:hover{background:var(--primary-hover)}
.priceCta.owned:hover,.priceCta.locked:hover{background:var(--surface-container)}
.priceCta.ghost{background:var(--surface-lowest);color:var(--primary);border:1px solid var(--primary)}
.priceCta.ghost:hover{background:var(--primary-soft)}
.priceCta.owned{background:var(--surface-container);color:var(--muted);border:1px solid rgba(196,200,188,.5);cursor:default}
.priceCta.locked{opacity:.5;cursor:not-allowed;background:var(--surface-container);color:var(--muted);border:1px solid rgba(196,200,188,.5)}
/* 自动续费披露：必须紧贴购买按钮下方，且要真的看得清 —— 这是结账前的法定告知
   （FTC ROSCA / 纽约 GBL §527-a / 加州 ARL），不是可以缩到看不见的免责小字。
   刻意不用 --faint：那一档在浅色底上对比度不足，写了等于没写。 */
.priceRenew{margin:10px 0 0;font-size:12.5px;line-height:1.55;color:var(--muted);text-align:center}
/* 换档说明：涉及扣款变化，要在按钮正下方讲清楚旧订阅怎么处理，不能只靠按钮文案 */
.swapNote{margin:10px 0 0;font-size:12px;line-height:1.55;color:var(--muted);text-align:center}
/* 站内取消订阅入口。整行居中放在三张价格卡下方，订阅用户才可见 */
.manageSub{margin:22px 0 0;text-align:center;font-size:13px}
.manageSub a{color:var(--muted);text-decoration:underline;text-underline-offset:3px}
.manageSub a:hover{color:var(--ink)}
.trustBlock{text-align:center;margin:60px 0 10px}
.trustBlock h2{font-family:var(--font-headline);font-size:30px;color:var(--ink);margin:0 0 8px}
.stars{color:var(--tertiary);font-size:22px;letter-spacing:5px}
.trustBlock .sub{color:var(--muted);font-size:14px;margin-top:6px}
.quoteGrid{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;margin-top:28px;text-align:left}
.quoteCard{background:var(--surface-lowest);border:1px solid rgba(196,200,188,.34);border-radius:16px;padding:22px;box-shadow:var(--shadow-soft)}
.quoteCard p{font-size:14px;color:var(--text);line-height:1.65;font-style:italic;margin:0}
.quoteWho{display:flex;align-items:center;gap:10px;margin-top:16px}
.quoteAvatar{width:38px;height:38px;border-radius:50%;background:var(--primary-soft);color:var(--primary);display:grid;place-items:center;font-weight:800;font-family:var(--font-headline)}
.quoteWho b{display:block;font-size:13.5px;color:var(--ink)}
.quoteWho span{font-size:12px;color:var(--muted)}
/* 考证方向标签（方案 §9 适用场景）。沿用 .trustBlock 的居中排版，不另起一套观感。
   标签由脚本按「·」拆分生成，数量随语言变化，因此用 flex-wrap 而不是固定列数。 */
.useCaseBlock{text-align:center;margin:52px 0 10px}
.useCaseBlock h2{font-family:var(--font-headline);font-size:30px;color:var(--ink);margin:0 0 8px}
.useCaseBlock .sub{color:var(--muted);font-size:14px;margin-top:6px}
.useCaseList{display:flex;flex-wrap:wrap;justify-content:center;gap:10px;margin-top:22px}
.useCaseTag{display:inline-block;max-width:100%;padding:7px 15px;border-radius:var(--radius-pill);background:var(--surface-lowest);border:1px solid rgba(196,200,188,.5);color:var(--secondary);font-size:13px;font-weight:700}
/* 价值段：一段静静的话，不配图标不配边框——它的说服力在内容里，装饰只会稀释。
   max-width 收窄到正文舒适行长；长语言(ru/ar)自然折行，无固定高度可撑破。 */
.whyBlock{max-width:760px;margin:56px auto 0;text-align:center;padding:0 16px}
.whyBlock p{font-size:15px;line-height:1.9;color:var(--secondary);margin:0}
.faqBlock{max-width:820px;margin:60px auto 0}
.faqBlock h2{text-align:center;font-family:var(--font-headline);font-size:30px;color:var(--ink);margin:0 0 24px}
.faqItem{background:var(--surface-lowest);border:1px solid rgba(196,200,188,.34);border-radius:14px;padding:18px 22px;margin-bottom:12px}
.faqItem summary{font-weight:800;color:var(--ink);cursor:pointer;list-style:none;display:flex;justify-content:space-between;align-items:center;gap:12px}
.faqItem summary::-webkit-details-marker{display:none}
.faqItem summary .material-symbols-outlined{color:var(--muted);transition:transform .2s ease}
.faqItem[open] summary{color:var(--primary)}
.faqItem[open] summary .material-symbols-outlined{transform:rotate(180deg);color:var(--primary)}
.faqItem p{margin:12px 0 0;color:var(--muted);font-size:14px;line-height:1.65}
.priceFoot{text-align:center;padding:40px 24px;margin-top:50px;border-top:1px solid rgba(196,200,188,.3);color:var(--muted);font-size:12.5px}
.priceFoot .fLinks{display:flex;gap:22px;justify-content:center;margin-bottom:12px;flex-wrap:wrap}
.priceFoot a{color:var(--secondary);text-decoration:none;font-weight:700}
.priceFoot a:hover{color:var(--primary)}
@media(max-width:820px){.priceGrid,.quoteGrid{grid-template-columns:1fr}.priceNav{padding:12px 18px}.priceMain{padding:36px 16px 20px}}
/* 导航固有宽度 772px（品牌 169 + 三链接 246 + 操作区 281 + 间距），窄屏放不下就整页横滚
   —— 手机上曾要横拖 263px 才看得到订阅按钮。允许换行；换行后导航变高，故不再吸顶，
   否则 390px 手机上光导航就吃掉近 1/5 屏。三个链接等分一行，不删任何控件。 */
@media(max-width:760px){.priceNav{flex-wrap:wrap;row-gap:10px;position:static}.priceNav .brand{flex:1 0 100%;margin-right:0}.priceNavActions{order:1;flex:1 0 100%;justify-content:flex-end;margin-left:0}.priceNavLink{order:2;flex:1 1 0;min-width:0;text-align:center}}

/* ============================================================= */
/* Workbench terra_1 refinements — concept card + 更多 folds      */
/* ============================================================= */
.conceptCard{padding:20px 22px}
.conceptCard .eyebrow{margin-bottom:8px}
h1#focusTitle{margin:0;font-family:var(--font-headline);font-size:26px;line-height:1.2;color:var(--ink);font-weight:700}
.conceptCard.empty h1#focusTitle{color:var(--muted)}
.conceptMeta{display:flex;flex-direction:column;gap:3px;margin:10px 0 14px}
.conceptMeta span{font-size:12.5px;color:var(--muted);line-height:1.4}
.scopeHint{color:var(--primary)!important;font-weight:700}
.primaryActions{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.primaryActions button{width:100%;justify-content:center}
.moreActions,.readerMore{margin-top:12px}
.moreActions>summary,.readerMore>summary{list-style:none;display:inline-flex;align-items:center;gap:6px;cursor:pointer;color:var(--secondary);font-weight:800;font-size:13px;padding:7px 13px;border-radius:var(--radius-pill);background:var(--surface-container);border:1px solid rgba(196,200,188,.4)}
.moreActions>summary::-webkit-details-marker,.readerMore>summary::-webkit-details-marker{display:none}
.moreActions>summary:hover,.readerMore>summary:hover{background:var(--surface-container-high);color:var(--primary)}
.moreActions[open]>summary,.readerMore[open]>summary{color:var(--primary)}
.moreActions[open]>summary .material-symbols-outlined,.readerMore[open]>summary .material-symbols-outlined{transform:rotate(90deg)}
.moreActions .objectActions{margin-top:10px}
.moreActions .audioLine{margin-top:8px}
.readerMore .toolRow{margin-top:10px}
.readerMore .bookmarkList{margin-top:10px}

/* ── 批次 3：当前备考项目上下文栏（teacher / exam / library 三页共用同一套样式） ── */
.projCtx {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  padding: 10px 20px; border-bottom: 1px solid var(--line, #e6e0d6);
  background: #f7f3ec; font-size: 13px; color: #4a453d;
}
.projCtx[hidden] { display: none !important; }
.projCtxIcon { font-size: 18px; color: #4a7c59; }
.projCtxName { font-weight: 700; color: #2f2b25; max-width: 320px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.projCtxSep { color: #b9b1a4; }
.projCtxMeta { color: #6b6257; }
.projCtxLabel { color: #8a8178; }
.projCtxCta { margin-left: auto; color: #4a7c59; font-weight: 600; text-decoration: none; white-space: nowrap; }
.projCtxCta:hover { text-decoration: underline; }
.projCtxEmpty { background: #fbf8f2; }
.projCtxEmptyText { color: #6b6257; }
/* 示例教材免责声明条。与 .projCtx 同为顶栏下方的通栏条，但**不可关闭**：
   它是法务声明，不是提示，用户不该能把它划掉。
   颜色比 .projCtx 略暖一档以示区分，正文用实色（弱化的声明等于没有声明）。 */
.demoDisclaim {
  display: flex; align-items: flex-start; gap: 8px;
  padding: 9px 20px; font-size: 12.5px; line-height: 1.55;
  color: #5a5145; background: #fdf6e8; border-bottom: 1px solid #ecdfc4;
}
.demoDisclaim[hidden] { display: none !important; }
.demoDisclaim .material-symbols-outlined { font-size: 17px; color: #a8823c; flex: none; margin-top: 1px; }
@media (max-width: 720px) { .demoDisclaim { padding: 8px 14px; font-size: 12px; } }
@media (max-width: 720px) {
  .projCtx { padding: 8px 14px; gap: 6px; }
  .projCtxName { max-width: 160px; }
  .projCtxCta { margin-left: 0; }
}

/* ── 批次 4：无项目 / 项目无关联教材的统一空状态 ── */
.projGate {
  border: 1px dashed #cfc7ba; border-radius: 12px; background: #fbf8f2;
  padding: 28px 24px; text-align: center; margin: 0 0 20px;
}
.projGate[hidden] { display: none !important; }
.projGate b { display: block; font-size: 16px; color: #2f2b25; margin-bottom: 6px; }
.projGate p { margin: 0 0 14px; color: #6b6257; font-size: 13px; }
.progGateBtn {
  display: inline-block; font: inherit; font-size: 13px; padding: 8px 14px; margin: 0 4px;
  border-radius: 8px; border: 1px solid #4a7c59; background: #4a7c59; color: #fff;
  text-decoration: none; cursor: pointer;
}
.progGateBtn.ghost { background: #fff; color: #4a7c59; }
.progGateBtn:disabled { opacity: .5; cursor: default; }

/* ── 批次 4：教材 ↔ 项目关联（备考资料库） ── */
.libProjectBar {
  display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
  padding: 10px 14px; margin: 0 0 16px; border-radius: 10px;
  background: #f7f3ec; border: 1px solid #e6e0d6; font-size: 13px; color: #4a453d;
}
.libProjectBar[hidden] { display: none !important; }
.libBarBtn {
  font: inherit; font-size: 12px; padding: 6px 11px; border-radius: 8px;
  border: 1px solid #4a7c59; background: #fff; color: #4a7c59;
  text-decoration: none; cursor: pointer; margin-left: auto; white-space: nowrap;
}
.libBarBtn:disabled { opacity: .5; cursor: default; }
.linkBtn {
  display: inline-flex; align-items: center; gap: 5px; font: inherit; font-size: 12px;
  padding: 5px 10px; margin: 6px 0 0; border-radius: 999px;
  border: 1px dashed #b9b1a4; background: #fff; color: #6b6257; cursor: pointer;
}
.linkBtn .material-symbols-outlined { font-size: 15px; }
.linkBtn.on { border-style: solid; border-color: #4a7c59; color: #4a7c59; background: #eef5f0; }
.linkBtn:disabled { opacity: .5; cursor: default; }
.docCard.inProject { border-color: #cfe0d5; }

/* 批次 4：未归属账号的旧教材提示条 */
.libProjectBar.legacyBar { background: #fdf6e8; border-color: #e8d9b5; }

/* ── 批次 5：套餐额度块（数字来自 /api/plans，页面不手写） ── */
.priceQuota {
  border: 1px solid var(--line, #e6e0d6); border-radius: 10px;
  background: #faf7f2; padding: 10px 12px; margin: 0 0 14px;
}
.priceQuota .qRow {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: 10px; padding: 4px 0; font-size: 13px;
}
.priceQuota .qRow + .qRow { border-top: 1px dashed #ece6dc; }
.priceQuota .qLabel { color: #6b6257; }
.priceQuota .qVal { font-weight: 700; color: #2f2b25; white-space: nowrap; }
/* 加载失败：明确说「暂时无法加载」，绝不回退旧数字、更不显示「无限」 */
.priceQuota.failed {
  background: #fdf6e8; border-color: #e8d9b5; color: #8a7a52;
  font-size: 13px; text-align: center; padding: 14px 12px;
}

/* ── 批次 6：pricing 能力卡（替换掉原来的虚构评价卡） ──
   复用 .quoteGrid 的三栏布局（裁决二.4：保留现有布局，不重新设计整页）。
   原 .stars / .quoteWho / .quoteAvatar 已无使用者 —— 它们是虚构评价的样式，
   保留空壳没有意义，但删 CSS 属清理范畴，本批不动（避免扩大范围）。 */
.capCard {
  background: var(--surface-lowest); border: 1px solid rgba(0,0,0,.06);
  border-radius: 14px; padding: 20px; text-align: left;
}
.capCard .capIcon { font-size: 26px; color: #4a7c59; display: block; margin-bottom: 10px; }
.capCard b { display: block; font-size: 15px; color: var(--ink); margin-bottom: 8px; }
.capCard p { font-size: 13.5px; color: var(--muted); line-height: 1.65; margin: 0; }
