/* ============================================================
   QB 路 绮句慨灞傦紙polish锛夛細鐧藉ぉ / 褰遍櫌鍙屼富棰樺叡浜?   ------------------------------------------------------------
   鎵嬫硶瀛﹁嚜 ryota-kk/personal-homepage锛?   kicker 鐪夐鎺掑嵃 路 鏀剁揣鐨勫ぇ鏍囬 路 鍗＄墖椤跺厜 路 鑳跺泭鏍囩 路
   鎮仠杈夊厜锛堝彧鍙橀鑹?/ 杈规 / 闃村奖锛屾棤浣嶇Щ鍔ㄧ敾锛夈€?   鏈枃浠舵渶鍚庡紩鍏ワ紝鍚岀壒寮傛€т笅浼樺厛锛涘奖闄㈢壒鍖栦竴寰嬪姞
   [data-theme="cinema"] 鍓嶇紑銆傚洖婊氾細鍒犲紩鐢ㄥ嵆鍙€?   ============================================================ */

/* ---------- 搂1 鐪夐 kicker ---------- */
.kicker {
  font-size: 11px;
  font-weight: 800;
  letter-spacing: .22em;
  text-transform: uppercase;
  color: var(--text-3);
  line-height: 1;
}
.kicker-light { color: rgba(255, 255, 255, .66); }
.cc-hero-kicker { margin-bottom: 10px; }

/* ---------- 搂2 棣栭〉 hero ---------- */
.cc-hero-title { font-size: 22px; letter-spacing: -.035em; }
.cc-hero-sub { letter-spacing: .01em; }
.cc-hero-actions { margin-top: 18px; }
.cc-hero .btn-solid {
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .6), 0 10px 22px -10px rgba(10, 30, 80, .55);
}

/* ---------- 搂3 鐧诲綍鍗?---------- */
.login-card { overflow: hidden; }
.login-card::before {
  content: "";
  position: absolute;
  inset: 0 0 auto 0;
  height: 3px;
  background: var(--brand-grad);
  pointer-events: none;
}
.login-title { font-size: 36px; letter-spacing: -.045em; }
.login-sub { letter-spacing: .02em; }
.login-card .btn-lg {
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .22), 0 14px 26px -10px rgba(37, 99, 235, .7);
}
.login-card .input { transition: border-color var(--t-fast), box-shadow var(--t-fast), background var(--t-fast); }

/* ---------- 搂4 璇曞嵎鍗¤川鎰?---------- */
.paper-title { letter-spacing: -.02em; }
.paper-card:hover { border-color: var(--brand-300); }
.recent-item-title { letter-spacing: -.01em; }

/* ---------- 搂5 瀵艰埅 active 鍐呴珮鍏?---------- */
.nav-item.active { box-shadow: inset 0 1px 0 rgba(255, 255, 255, .5); }
[data-theme="cinema"] .nav-item.active { box-shadow: inset 0 1px 0 rgba(255, 255, 255, .08), 0 0 20px rgba(79, 140, 255, .15); }

/* ---------- 搂5b 涓撴敞鍒嗙被琛岋細鍒嗙被鑹插厜鏌憋紙棰滆壊鐢辫鍐?--cat 浼犲叆锛?---------- */
.focus-cat-row { position: relative; overflow: hidden; }
.focus-cat-row::before {
  content: "";
  position: absolute;
  left: 0; top: 0; bottom: 0;
  width: 4px;
  background: linear-gradient(180deg, var(--cat, var(--brand-500)), transparent 135%);
  opacity: .8;
  pointer-events: none;
}

/* ---------- 搂6 闀垮垪琛ㄨ烦杩囧睆澶栨覆鏌擄紙婊氬姩鏇村揩锛岃鎰熸棤宸級 ---------- */
.q-card,
.paper-card,
.recent-item,
.ftimer,
.draft-row {
  content-visibility: auto;
  contain-intrinsic-size: auto 120px;
}

/* ---------- 搂6 褰遍櫌鐗瑰寲 ---------- */
[data-theme="cinema"] .cc-hero {
  box-shadow: 0 24px 70px rgba(0, 0, 0, .5), 0 0 44px rgba(59, 110, 240, .14), inset 0 1px 0 rgba(255, 255, 255, .2) !important;
}
[data-theme="cinema"] .cc-hero-title { text-shadow: 0 2px 22px rgba(0, 0, 0, .4); }
[data-theme="cinema"] .paper-card:hover { border-color: rgba(122, 168, 255, .4); }
[data-theme="cinema"] .login-card .btn-lg {
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .22), 0 14px 26px -10px rgba(37, 99, 235, .7), 0 0 32px rgba(122, 168, 255, .14);
}

/* =====================================================================
   搂7 2026-09-11 闇€姹傞棴鐜慨澶嶏紙鏈€鍚庡姞杞斤紝淇濊瘉瑕嗙洊锛?   #6 鐪肩潧閿欎綅 路 #12 chip 鎶栧姩 路 #13 宸︽爲鍥哄畾 路 #14/#15 绔犺妭鍒嗙粍
   #16 鏄剧ず绛旀+鑷姩娑堝け 路 #17 鎮诞缈婚鏉?路 #18 涓夋€佺Щ鍙?   ===================================================================== */

/* --- #6锛氬幓鎺?content-visibility 閫犳垚鐨勫睍寮€璺冲姩锛岄槄璇诲櫒绋冲畾鍗犳弧鏁磋 ---
   娉ㄦ剰 overflow-x 鐢?clip 鑰屼笉鏄?hidden锛歨idden 浼氭妸瀹瑰櫒鍙樻垚婊氬姩瀹瑰櫒锛?   reader-toc 鐨?position:sticky 闅忎箣澶辨晥锛堟粴鍔ㄦ椂澶х翰琚暣浣撳甫璧般€佹爣棰樿椤舵爮閬綇锛?*/
.draft-row { content-visibility: visible !important; contain-intrinsic-size: auto !important; }
.book-reader { display: block; width: 100%; max-width: 100%; margin: 0 0 14px; overflow-x: clip; }
.book-reader .reader-layout { margin-top: 12px; }

/* --- #13锛氱瓟棰橀〉宸﹀ぇ绾插浐瀹氾紙涓嶉殢姝ｆ枃婊氬姩璺宠蛋锛?--- */
.exam-layout.has-toc { align-items: start; }
.exam-side {
  position: sticky; top: calc(var(--header-h) + 12px);
  max-height: calc(100vh - var(--header-h) - 40px); overflow-y: auto;
}
.toc-head { padding: 8px 10px 10px; border-bottom: 1px solid var(--line); margin-bottom: 6px; }
.toc-head-label {
  display: block; font-size: 12px; font-weight: 750; color: var(--text-2); letter-spacing: .01em;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

/* --- #14/#15锛氱粍鍐呭彧鏀鹃鍙锋牸锛堟寜绔犺妭鍒嗙粍锛屼笉鍐嶆瘡棰樹竴琛岋級 --- */
.tree-sub-grid { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 4px; padding: 6px 8px 10px 20px; }
.qno-chip {
  height: 26px; border-radius: 7px; border: 1px solid var(--line); background: var(--surface-2);
  color: var(--text-2); font-size: 11.5px; font-weight: 700; font-variant-numeric: tabular-nums;
  cursor: pointer; transition: border-color var(--t-fast), color var(--t-fast), background var(--t-fast);
}
.qno-chip:hover { border-color: var(--brand-300, #93b4f8); color: var(--text-1); }
/* 鎺屾彙搴﹂鍙风潃鑹诧細瀹炶壊搴?+ 娣卞瓧鑹?+ 鍚岃壊鎻忚竟锛屼竴鐪煎彲杈紙2026-09-14 鐢ㄦ埛瀚?鍙煋瀛楄壊+鎻忚竟涓嶆槑鏄?锛夈€? * 鏈瘎杩囩殑棰樹笉鏌擄細浠嶈蛋 .qno-chip 榛樿鐏板簳銆傚奖闄富棰樼敤浜瓧鑹?+ 鍗婇€忔槑搴曠壒鍖栥€?*/
.qno-chip.m-PROFICIENT { background: var(--ok-bg, #e8f8ee); color: #15803d; border-color: var(--ok-500, #22a06b); }
.qno-chip.m-FUZZY { background: var(--warn-bg, #fff6e3); color: #b45309; border-color: var(--warn-500, #f59e0b); }
.qno-chip.m-UNKNOWN { background: var(--err-bg, #fdeeee); color: #dc2626; border-color: var(--err-500, #ef4444); }
[data-theme="cinema"] .qno-chip.m-PROFICIENT { background: rgba(74, 222, 128, .22); color: #4ade80; border-color: #4ade80; }
[data-theme="cinema"] .qno-chip.m-FUZZY { background: rgba(251, 191, 36, .24); color: #fbbf24; border-color: #fbbf24; }
[data-theme="cinema"] .qno-chip.m-UNKNOWN { background: rgba(248, 113, 113, .24); color: #f87171; border-color: #f87171; }
.qno-chip.on { background: var(--brand-500, #3b82f6) !important; border-color: var(--brand-500, #3b82f6) !important; color: #fff !important; }
/* 2026-09-14 鐢ㄦ埛鎷嶆澘锛氶鍙锋牸鎭㈠鎺屾彙搴﹂鑹诧紱閫変腑娣辫摑鐢?.on 鐨?!important 姘歌繙楂樹簬妗ｄ綅鑹层€?*/
.qno-chip[hidden] { display: none; }
.tree-row.tree-chap[hidden], .tree-sub[hidden] { display: none; }
/* 绛涚┖涓€閿竻闄よ锛堢瓫閫夐浂鍛戒腑鏃舵墠闇查潰锛?*/
.tree-empty { margin-top: 6px; border: 1px dashed var(--line-strong, var(--line)); border-radius: 9px; color: var(--text-2); }
.tree-empty[hidden] { display: none; }
/* 鎺屾彙搴︿笁鎬佹寜閽?hover/active 鍙嶉锛堜箣鍓嶆棤浠讳綍鍙嶅簲锛夛紱
 * hover 淇濈暀涓夋€佹湰鑹插苟缁欏搴旇壊搴曪紙2026-09-14 鐢ㄦ埛鍙嶉锛氫笉鑳藉彧鍑轰竴涓伆妗嗘妸棰滆壊鐩栨帀锛?*/
.m-seg button, #mFilterSeg button { cursor: pointer; border-radius: 8px; transition: background var(--t-fast), transform var(--t-fast); }
/* 2026-09-14 绉诲姩绔慨澶嶏細瑙﹀睆 tap 浼氱偣浜苟"绮樹綇" :hover锛堟墜鏈烘棤 mouseleave 娓呴櫎锛夛紝
 * 绗簩娆?tap 宸茬敱 paintSeg 鎽樻帀 .on锛屼絾绮樹綇鐨?hover 搴曡壊/鎻忚竟浠嶅湪
 * 鈫?鐢ㄦ埛鐪嬪埌"鑳藉彇娑堟爣璁板彲杩樹竴鐩存樉绀虹潃"銆傛偓鍋滃弽棣堝彧鍦ㄧ湡路鎮仠璁惧鐢熸晥锛? * 瑙﹀睆鐨勬寜鍘嬪弽棣堜氦缁?:active锛岄€変腑鎬佷氦缁?.on銆?*/
@media (hover: hover) {
  .m-seg button:hover, #mFilterSeg button:hover { background: var(--surface-3); }
  .m-seg button[data-lv="PROFICIENT"]:hover, #mFilterSeg button[data-m="PROFICIENT"]:hover { background: var(--ok-bg, rgba(22, 163, 74, .12)); }
  .m-seg button[data-lv="FUZZY"]:hover, #mFilterSeg button[data-m="FUZZY"]:hover { background: var(--warn-bg, rgba(217, 119, 6, .12)); }
  .m-seg button[data-lv="UNKNOWN"]:hover, #mFilterSeg button[data-m="UNKNOWN"]:hover { background: var(--err-bg, rgba(220, 38, 38, .1)); }
}
.m-seg button:active, #mFilterSeg button:active { transform: scale(.92); }
.m-seg button:focus-visible, #mFilterSeg button:focus-visible { outline: 2px solid var(--brand-400, #6b9bf7); outline-offset: 1px; }
.m-count { font-size: 11px; font-weight: 800; color: var(--text-2); margin-left: 2px; font-variant-numeric: tabular-nums; }
#mFilterSeg button.on .m-count { color: inherit; }
.save-state:empty { display: none; }
.exam-side-sub:has(.save-state:empty) { display: none; }
/* 宸︽爮涓婁笅棰橈細鍞竴鐨勭炕棰樻寜閽紙搴曢儴鎮诞鏉″凡鍒狅紝鏃犻〉鐮侊紱hover 鍙崲棰滆壊涓嶅姩浣嶏級 */
.exam-side-nav { display: flex; gap: 8px; }
.exam-nav-btn { flex: 1 1 0; justify-content: center; }
.exam-nav-btn:disabled { opacity: .38; cursor: default; }
.exam-nav-btn:disabled:hover { border-color: var(--line); color: var(--text-2); background: var(--surface-2); }
/* 缈婚鏉?hover 鍔犲浐锛堥仐鐣欐牱寮忥紝鍏冪礌宸插垹锛屼繚鐣欓槻鏃х紦瀛橀棯涓€涓嬫椂鏃犳牱寮忥級锛氫富鎸夐挳 hover 鍙姞娣变笉鏂櫧锛岀鐢ㄦ€佹案涓嶅搷搴?*/
.fnav-btn:hover:not(:disabled) { background: var(--surface-3); }
.fnav-btn.primary:hover:not(:disabled) { background: var(--brand-600, #2563eb); filter: none; color: #fff; }
.fnav-btn:active:not(:disabled) { transform: scale(.96); }
.fnav-btn:disabled, .fnav-btn:disabled:hover { opacity: .38; cursor: default; background: transparent; }
/* 鏄剧ず绛旀涓庢帉鎻″害骞舵帓灞呬腑锛堟帉鎻″害绱ц创鏄剧ず绛旀鍙充晶锛?*/
.q-foot { grid-template-columns: 1fr auto auto 1fr; }
.q-foot > :first-child { grid-column: 2; }
.q-foot .m-row { grid-column: 3; }
/* 鑳岃鍗℃帉鎻″害锛氭爣棰樿鍐呭祵涓夋€侊紙灏忎竴鍙凤級锛屼笌鏌ョ湅绛旀骞舵帓 */
/* 鏀瑰悕妯″紡宸蹭笅绾匡紙2026-09-14 鐢ㄦ埛鎷嶆澘锛夛細宸ュ叿鏉＄瑪涓庢瘡琛屾敼鍚嶇瑪鍏ㄥ垹锛? * 鏀瑰悕缁熶竴璧板彸鎶藉眽绉戠洰鐩綍鈥斺€旂偣琛屽嵆寮规敼鍚嶆锛堣 subjects.js dwBody 缁戝畾锛?*/
/* 闂瓟鍗′笁鐗堬紙鐢ㄦ埛瑕佹眰锛夛細鍗＄墖鍖栧鍣?+ 闂?绛斿窘绔?+ 椤堕儴鏂囧瓧涓夋€侀挳锛? * 绂佷竴鍒囧乏缂樼珫绾匡紙钃?缁挎潯鍏ㄥ垹锛岄€変腑鎬佸彧闈犱笁鎬侀挳鏈韩鐨勫簳鑹诧級 */
.kp-card { border: 1px solid var(--line); background: var(--surface); border-radius: 14px; margin-bottom: 12px; overflow: hidden; box-shadow: var(--shadow-1); }
.kp-card > summary { padding: 12px 14px; gap: 10px; }
.kp-card > summary .kp-q::before,
.kp-card .kp-ans::before { content: none; display: none; }
/* 闂?绛斿窘绔犺蛋 HTML + i18n锛坮ecite.q/recite.a锛夛紝涓嫳璺熼殢璇█锛涙棫 ::before 纭紪鐮佷腑鏂囧凡閫€褰?*/
.qa-badge { flex: 0 0 auto; display: inline-block;
  font-size: 10.5px; font-weight: 800; line-height: 1;
  border-radius: 6px; padding: 3px 5px; margin-right: 8px;
  vertical-align: 1px;
}
.qa-q {
  color: var(--brand-600, #2563eb); background: var(--brand-50, rgba(59, 130, 246, .12));
  border: 1px solid var(--brand-200, #c6dbff);
}
.qa-a {
  color: var(--ok-500, #16a34a); background: var(--ok-bg, rgba(22, 163, 74, .12));
  border: 1px solid var(--ok-line, rgba(22, 163, 74, .3));
  margin: 8px 8px 4px 0;
}
.kp-card > summary .kp-q { font-size: 14.5px; font-weight: 750; }
.kp-card[open] > summary { background: transparent; border-bottom: 1px solid var(--line); }
.kp-card .kp-ans { margin: 0; padding: 4px 16px 14px; border: 0; border-radius: 0; background: var(--surface-2); }
.kp-card > summary .bseg { flex: 0 0 auto; }
.kp-card > summary .bseg button {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 5px 10px; font-size: 12px; font-weight: 700;
  color: var(--text-2); border-radius: 999px; cursor: pointer;
  transition: background var(--t-fast), color var(--t-fast), box-shadow var(--t-fast);
}
.kp-card > summary .bseg button svg { width: 13px; height: 13px; }
/* hover 鍙崲搴曡壊銆佷笉澶轰笁鎬佹湰鑹诧紙鍘?color:text-1 浼氭妸缁?amber/绾㈢洊鎴愮伆锛屽緢涓戯級
 * 2026-09-14锛氭偓鍋滃弽棣堥棬鎺у湪 (hover:hover)鈥斺€旇Е灞?tap 绮樹綇 :hover 浼氱洊浣?.on 閫変腑鎬?*/
@media (hover: hover) {
  .kp-card > summary .bseg button:hover { background: var(--surface-3); }
  .kp-card > summary .bseg button[data-lv="PROFICIENT"]:hover { background: var(--ok-bg, rgba(22, 163, 74, .12)); }
  .kp-card > summary .bseg button[data-lv="FUZZY"]:hover { background: var(--warn-bg, rgba(217, 119, 6, .12)); }
  .kp-card > summary .bseg button[data-lv="UNKNOWN"]:hover { background: var(--err-bg, rgba(220, 38, 38, .1)); }
}
/* 2026-09-14 鐢ㄦ埛鍥?锛?鎺屾彙杩欎簺鐐瑰嚮鍙栨秷杩樻槸涓嶆秷澶?锛坱oast 宸叉彁绀?宸插彇娑堟爣璁?锛屾寜閽粛鏄鑹诧級銆? * 鐪熷嚩锛氶儴鍒嗗畨鍗撴祻瑙堝櫒锛堜笁鏄熸祻瑙堝櫒绛夛級鎶婅Е鎽稿悎鎴愪负"hover:hover 鐨勬寚閽堜簨浠?锛宼ap 涔嬪悗 :hover
 * 浼氱矘鍦ㄦ寜閽笂锛堣Е灞忔病鏈?mouseleave锛夛紝浜庢槸**宸插彇娑?*鐨勬寜閽粛濂楃潃涓夋€佸簳鑹?鎻忚竟銆? * 鍗曢潬 @media (hover:none) 闂ㄦ帶鎸′笉浣忥紙璇ユ満鍨?media 鎶?hover:hover锛夈€? * app.js 鏀跺埌浠讳綍涓€娆＄湡瀹?touchstart 灏辩粰 body 鎸?.qb-touch锛堣嚜鎰堬級锛岃繖閲屾妸绮樹綇鐨?hover 瑙嗚浣滃簾銆? * 鍙綔鐢ㄤ簬 :not(.on)鈥斺€旈€変腑鎬佺敱 .on 鐙珛鎵挎媴锛屼笉鍙楀奖鍝嶃€?*/
body.qb-touch .m-seg button:not(.on):hover,
body.qb-touch #mFilterSeg button:not(.on):hover,
body.qb-touch .m-filter button:not(.on):hover,
body.qb-touch .kp-card > summary .bseg button:not(.on):hover,
body.qb-touch .seg button:not(.on):hover {
  background: transparent !important;
  box-shadow: none !important;
}
.kp-card > summary .bseg button:active { transform: scale(.95); }
/* 涔﹀唴澶х翰鎺屾彙搴︾瓫閫夎锛氭爣棰樹笅鎹㈣锛屼笉鎸ゆ爣棰?*/
.rtoc-side-head { flex-wrap: wrap; }
.b-filter { flex: 1 1 100%; justify-content: flex-start; }
.b-filter button { min-width: 30px; }
.kp-card[hidden], .rtoc-row[hidden] { display: none; }
/* 鎶樺彔 hidden 蹇呴』鍘嬭繃鎶藉眽/宸?dock 鐨?display:block锛堝悓绛変紭鍏堢骇涓嬪悗鑰呰耽锛岃鍏充笉涓婏級 */
.rdr-body .rtoc-row[hidden], .rdr-body .rtoc-group[hidden],
.reader-toc .rtoc-row[hidden], .reader-toc .rtoc-group[hidden],
.reader-toc-dock .rtoc-row[hidden], .reader-toc-dock .rtoc-group[hidden] { display: none; }
/* 鍙虫娊灞夊ぇ绾诧細fixed 鍙?panels锛屼笉鎸ゆ鏂囷紱琛屾牱寮忓鐢ㄥ乏渚?rtoc-row/-group */
.reader-drawer {
  position: fixed; top: calc(var(--header-h, 64px) + 8px); right: 12px; bottom: 12px;
  width: min(300px, 88vw); z-index: 70; display: flex; flex-direction: column;
  background: var(--glass-bg-strong, var(--surface)); border: 1px solid var(--line);
  border-radius: 14px; box-shadow: var(--shadow-2); overflow: hidden;
}
.reader-drawer[hidden] { display: none; }
.rdr-head {
  display: flex; align-items: center; justify-content: space-between;
  padding: 10px 12px; border-bottom: 1px solid var(--line);
  font-size: 13px; font-weight: 750; color: var(--text-1); flex: 0 0 auto;
}
.rdr-body { overflow-y: auto; padding: 8px; }
.rdr-body .rtoc-row { display: block; width: 100%; }
/* 鍙虫娊灞夊ご锛氳儗璇?绛旈妯″紡鍥炬爣 + 鍥鹃拤 + 鍏抽棴锛?026-09-14 鐢ㄦ埛绾犳锛? * 妯″紡鍥炬爣瑕佹斁鍦ㄥ彸渚х洰褰曞ご涓婏紱鍥鹃拤鏄浐瀹氱洰褰曚繚鎸佸睍寮€锛屼笉鏄秷澶憋級銆?*/
.rdr-head-acts { display: inline-flex; align-items: center; gap: 2px; margin-left: auto; }
.rdr-head-acts .seg[data-readmode] { display: inline-flex; gap: 1px; }
.rdr-head-acts .seg[data-readmode] button { width: 30px; height: 30px; padding: 0; display: inline-flex; align-items: center; justify-content: center; }
.rdr-head-acts .seg[data-readmode] button svg { width: 15px; height: 15px; }
.rdr-head-acts .seg[data-readmode] button.on { color: var(--brand-600, var(--brand-500)); background: var(--brand-50, rgba(100,130,255,.12)); border-radius: 7px; }
/* 鎶藉眽澶寸瓫閫夛紙鐢ㄦ埛瑁佸喅鏀惧彸渚уぇ绾查〉锛夛細澶村厑璁告崲琛岋紝绛涢€夊崰婊′竴琛岋紝涓嶆尋鏍囬 */
.book-reader .rdr-head { flex-wrap: wrap; row-gap: 6px; }
.book-reader .rdr-head-acts { flex-wrap: wrap; row-gap: 4px; justify-content: flex-end; }
[data-rdrpin] { color: var(--text-3); }
[data-rdrpin].on { color: var(--brand-600, var(--brand-500)); }
/* 鐩綍鍥哄畾鎬侊細鎶藉眽淇濇寔灞曞紑锛屼笉闇€瑕侀澶栨牱寮忥紱鍥鹃拤 brand 鑹插嵆鍙嶉 */
body.rdr-pinned .reader-drawer.force-open { box-shadow: var(--shadow-3), 0 0 0 1px var(--brand-300, rgba(100,130,255,.35)); }
/* 娌夋蹈闃呰锛氬紑涔﹀嵆鏀跺乏鏍戯紝姝ｆ枃鍗犳弧锛涘乏缂樼珫绛鹃拤鍥炵洰褰?*/
.subject-layout.reading { grid-template-columns: minmax(0, 1fr); }
.subject-layout.reading .side-tree { display: none; }
#treeRail {
  position: fixed; left: 0; top: 40%; z-index: 65;
  width: 26px; height: 64px; border-radius: 0 10px 10px 0;
  border: 1px solid var(--line); border-left: 0;
  background: var(--glass-bg-strong, var(--surface)); color: var(--text-2);
  cursor: pointer; display: grid; place-items: center;
  box-shadow: var(--shadow-2);
}
#treeRail:hover { color: var(--text-1); }
#treeRail[hidden] { display: none; }
/* 妗岄潰绔洰褰曞紑鍏冲綊宸︿笂瑙掗攣锛屽乏缂樼珫绛惧彧鐣欑Щ鍔ㄧ锛?026-09-13 鐢ㄦ埛瑕佹眰锛?*/
@media (min-width: 901px) { #treeRail { display: none; } }
/* 鍙崇紭鐑尯锛堥暅鍍忓乏缂?rail-hot锛夛細鎮仠鍗虫粦鍑烘娊灞夛紝绂诲紑鎶藉眽鍗虫敹鍥炪€? * 2026-09-13 鍔犲鍒?30px锛歐indows 鍘熺敓婊氬姩鏉″崰鍙崇紭绾?15px锛?6px 鐑尯浼氳鐩栦綇 hover 涓嶅埌 */
.rdr-hot { position: fixed; top: 0; right: 0; bottom: 0; width: 30px; z-index: 65; }
.rdr-hot::after {
  content: ""; position: absolute; right: 4px; top: 50%;
  width: 3px; height: 72px; border-radius: 999px;
  background: linear-gradient(180deg, transparent, var(--brand-500), transparent);
  opacity: .45; pointer-events: none;
}
/* 鍏ㄩ儴鐩綍鍘绘粴鍔ㄦ潯锛?026-09-13 鐢ㄦ埛瑕佹眰锛夛細鍙棌鏉★紝婊氬姩淇濈暀锛涘洖婊氬垹鏈鍗冲彲 */
.side-tree, .reader-toc, .exam-side, .exam-toc, .toc-chips, .qnav.exam-qnav { scrollbar-width: none; }
.side-tree::-webkit-scrollbar, .reader-toc::-webkit-scrollbar, .exam-side::-webkit-scrollbar,
.exam-toc::-webkit-scrollbar, .toc-chips::-webkit-scrollbar, .qnav.exam-qnav::-webkit-scrollbar { display: none; }
/* 绉戠洰椤电獥鍙ｆ粴鍔ㄦ潯涔熷幓鎺夛紙鍙崇紭鎶藉眽鐑尯琚師鐢熸潯鐩栦綇 hover 涓嶅埌锛?026-09-13 鐢ㄦ埛瑕佹眰鐩村幓锛夛紱
 * 鐢?html.nosb 寮€鍏筹紙杩?subjects 璺敱鎸傘€佺寮€鎽橈級锛屾粴杞?瑙︽懜/閿洏婊氬姩涓嶅彈褰卞搷 */
html.nosb { scrollbar-width: none; }
html.nosb::-webkit-scrollbar { display: none; }
/* 椤舵爮鑷姩闅愯棌锛?026-09-13 鐢ㄦ埛鎷嶆澘锛氬钩鏃舵敹璧凤紝榧犳爣闈犺繎椤堕儴鐑尯婊戝嚭锛? * 瑙﹀睆鏃?topauto 绫伙紝淇濇寔鍘?sticky 甯告樉锛涙樉闅愬彧鍔?transform锛屼笉鍗犱綅涓嶆姈鍔級 */
.top-hot { position: fixed; top: 0; left: 86px; right: 0; height: 12px; z-index: 61; display: none; }
body.topauto .top-hot { display: block; }
body.topauto .topbar {
  position: fixed; top: 0; left: 0; right: 0; z-index: 60;
  transform: translateY(-105%);
  transition: transform .18s ease; /* 2026-09-13 鐢ㄦ埛瀚屾敹璧锋參锛?25s鈫?18s */
}
body.topauto.topshow .topbar { transform: none; }
/* 椤舵爮鏀惰捣鍚庣矘鎬ч潰鏉胯窡闅忎笂鎻愶紙2026-09-13锛氬惁鍒欑洰褰曢兘鎮┖浣庝竴鍧楋級銆? * topauto 涓嬮《鏍忔槸 fixed锛堜笉鍗犱綅锛夛細闈㈡澘鐩存帴璐撮《鍚镐綇锛屽苟鎶婂師鏈负椤舵爮棰勭暀鐨? * max-height 涓€骞惰繕鍥炴潵锛屽惁鍒欏彧涓婄Щ銆佸彲鐢ㄩ珮搴︿粛鐧界櫧灏?66px銆? * 鏂囦欢鐩綍 side-tree / 鍋氶鐩綍 side-tree.exam-side / 闃呰鏍?reader-toc /
 * 棰樺彿鏍?exam-toc / 绛旈宸ュ叿鏉?exam-toolbar路exam-nav 鈥斺€?缁熶竴鍚屼竴鍙ｅ緞銆?*/
body.topauto .side-tree { top: 10px; }
body.topauto .exam-side { top: 12px; }
body.topauto .reader-toc { top: 10px; }
body.topauto .exam-toc { top: 10px; }
body.topauto .exam-nav { top: 10px; }
body.topauto .exam-toolbar { top: 10px; }
/* 鎶婃寜 --header-h 鎵ｆ帀鐨勯珮搴﹁繕鍥炴潵锛況eader-toc 鐨?420px 璁捐涓婇檺淇濇寔涓嶅姩 */
body.topauto .side-tree,
body.topauto .exam-side,
body.topauto .exam-toc,
body.topauto .exam-nav,
body.topauto .book-reader .reader-toc {
  max-height: calc(100vh - 24px);
}
/* 璺宠浆閿氱偣锛氶《鏍忎笉鍐嶅崰浣嶏紝棰樺崱涓嶅繀鍐嶄负瀹冭鎺?110px */
body.topauto { --jump-top: 16px; }
/* 澹冲唴鍚勫 logo 璧?currentColor锛氱櫧澶╁搧鐗岃摑锛屽奖闄㈡祬钃濓紙璺熼殢搴曡壊锛夈€? * 瑙掕惤淇℃爣锛?logo-peek锛夊凡浜?2026-09-13 鐢ㄦ埛瑁佸喅绉婚櫎锛氬乏涓婅涓嶅啀娴嚭浠讳綍鍥炬爣锛? * 鍥炲伐浣滃彴缁熶竴璧颁晶鏍?brandHome 涓庡乏渚у鑸€?*/
.brand-mark, .brand-logo, .welcome-logo { color: #2f6bf0; }
[data-theme="cinema"] .brand-mark,
[data-theme="cinema"] .brand-logo,
[data-theme="cinema"] .welcome-logo { color: #8fb3ff; }
/* 鍙虫娊灞夊悓鏍疯创椤讹紙2026-09-13 鐢ㄦ埛鍙嶉鍙宠竟楂樺害灏戜竴鍧楋細fixed top 鎸夐《鏍忛鐣欎簡 72px锛? * 椤舵爮鏀惰捣鍚庡簲鍥炲埌 12px锛涢《鏍忎竴寰嬪彔鍔狅紙涓嶅啀鍥炶惤閬胯锛夈€?*/
body.topauto .reader-drawer { top: 12px; }
/* 鎶藉眽甯搁┗ DOM锛屽仠闈犱綅鐢?transform 钘忥紙瀵归綈 sidebar锛屾偓鍋滆繃娓′笉鏂級锛? * visibility 闅忓姩锛氭敹璧峰悗鎵?hidden锛堥敭鐩?Tab 杩涗笉鍘伙級锛屽睍寮€绔嬪埢鍙 */
.reader-drawer {
  transform: translateX(105%);
  visibility: hidden;
  transition: transform .18s cubic-bezier(.4, 0, .2, 1), visibility 0s linear .18s;
  will-change: transform;
}
.reader-drawer.force-open {
  transform: translateX(0);
  visibility: visible;
  transition: transform var(--t-fast);
  box-shadow: var(--shadow-3);
}
/* 鎶藉眽绾彔鏀撅紙2026-09-13 鐢ㄦ埛瑕佹眰锛氬埆璁╂鏂囪绌洪棿锛岀洿鎺ョ洊鍦ㄤ笂闈級锛? * 涔嬪墠瀹藉睆涓嬩富鍖?padding-right 璁╀綅宸插垹锛屾娊灞?fixed 瑕嗙洊锛屼笉鎸ゅ竷灞€銆?*/
/* 宸ヤ綔鍙版粴杞喕缁擄紙2026-09-13 鐢ㄦ埛瑕佹眰锛氭粴杞竴婊氬叏涔卞姩 鈫?鏁撮〉鍥哄畾姝伙紝
 * 鍙湁涔?鍗峰垪琛ㄦ #dashList 鍐呴儴婊氬姩锛涚獥鍙ｇ骇婊氬姩褰诲簳鍏虫帀锛?*/
body.route-dashboard { overflow: hidden; }
/* 楂樺害鍩哄噯鎸傚湪 .shell 涓婏紝鏁村３鎭板ソ 100dvh锛堥《鏍?+ 鍐呭鍚勮嚜鍦ㄥ唴閮ㄦ秷鍖栵級銆? * 2026-09-14 鐪熸満瀹炴祴锛氬師鏉?#outlet 鑷繁 height:100dvh锛?800锛?*鍐嶅姞涓?*
 * 棰勭暀鐨?padding-top:66px 涓?sticky 椤舵爮 66px锛屾暣椤靛彉鎴?866px > 瑙嗗彛锛? * body 鍙?overflow:hidden 鈫?搴曢儴 66px 琚洿鎺ヨ鎺夛紝涓婚〉涓婃尋涓嬩涪锛堢敤鎴凤細"鏋佸叾鎷ユ尋"锛夈€? * 100dvh 鑰岄潪 100vh锛氭墜鏈?100vh 鏄€屽湴鍧€鏍忔敹璧峰悗銆嶇殑鏈€澶ч珮锛屽湴鍧€鏍忎竴鏀朵竴鏀炬暣椤典几缂╋紙"ui 涓嶅浐瀹?锛夈€?*/
body.route-dashboard .shell { height: 100dvh; min-height: 0; overflow: hidden; }
body.route-dashboard .main { height: 100%; min-height: 0; }
body.route-dashboard #outlet { height: auto; flex: 1 1 auto; min-height: 0; overflow: hidden; display: flex; flex-direction: column; }
body.route-dashboard .cc-hero.dash-sticky { position: static; flex: 0 0 auto; /* flex-shrink:0锛?outlet 鍑忓幓椤舵爮璁╀綅鍚庣┖闂翠笉瓒虫椂 hero 涓嶅緱琚帇缂╄搴曪紙2026-09-14 鐢ㄦ埛澶嶆祴鍙嶉锛?*/ }
body.route-dashboard #resumeOne,
body.route-dashboard .dash-subtabs { flex: 0 0 auto; }
body.route-dashboard #subjectPanel { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; overflow: hidden; }
body.route-dashboard .dash-subcard { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; overflow: hidden; }
body.route-dashboard #dashList { flex: 1 1 auto; min-height: 0; overflow-y: auto; max-height: none; }
/* 涓婚〉娆㈣繋鍖鸿椤舵爮鎸′綇锛?026-09-14锛夛細宸ヤ綔鍙版暣椤靛喕缁撱€乭ero 鏄?static锛? * topauto 椤舵爮 fixed 鍙犲姞涓嶅崰浣嶏紝鍞ゅ嚭鏃舵濂界洊浣?hero 鐨?kicker 涓庛€屾杩庡洖鏉ャ€嶄笂鍗婃埅锛? * 鍐荤粨甯冨眬涓嬫病娉曢潬婊氬姩韬插紑銆傜粰 #outlet 甯搁┗璁╁嚭涓€鏉?--header-h锛? * 椤舵爮婊戝叆婊戝嚭閮藉彧瑕嗙洊杩欐绌虹櫧锛屽唴瀹逛綅缃亽瀹氫笉璺筹紙涓嶅仛 padding 杩囨浮锛岄伒瀹堟棤浣嶇Щ鍔ㄧ敾绾㈢嚎锛夈€?*/
/* 鍙湁褰撻《鏍?鍙犲姞涓嶅崰浣?锛坆ody.topauto锛岀湡榧犳爣璁惧鎵嶆寕锛夋椂鎵嶉渶瑕佽鍑?--header-h锛? * 瑙﹀睆椤舵爮鏄?sticky 甯告樉銆佹湰韬氨鍦ㄦ祦閲屽崰浣嶏紝鍐嶈涓€娆″氨鏄笂闈㈤偅 66px 婧㈠嚭鐨勬潵婧愩€? * 鏁呯敤 (hover:hover) 鎶婅繖鏉￠檺瀹氬湪妗岄潰锛岃Е灞忎竴寰嬩笉璁╀綅銆?*/
@media (hover: hover) {
  body.topauto.route-dashboard #outlet { padding-top: var(--header-h); }
}
/* 2026-09-14 鐢ㄦ埛鍥?锛堢涓€涓孩鍦堬級绾犳锛? * 鍦堢殑鏄?*宸︾紭**绔栫 `#treeRail`锛堟矇娴搁槄璇绘椂"閽夊洖宸︽爲鐩綍"閭ｅ潡锛宭eft:0/top:40%/26脳64锛夛紝
 * 涓嶆槸鍙崇紭鐨?`#rdrRail`銆傚彸缂樼珫绛炬槸鎵撳紑鍙充晶澶х翰鎶藉眽鐨?*鍞竴鍏ュ彛**锛屽繀椤讳繚鐣欍€? * 鈬?杩欓噷闅愯棌宸︾紭绔栫锛涘乏鏍戠殑鍏ュ彛浠嶆湁椤舵爮姹夊牎鎸夐挳锛?menuBtn锛変笌宸︾紭 10px 鐑尯 .rail-hot銆?*/
#treeRail { display: none !important; }
/* 2026-09-14 鐢ㄦ埛鍐嶆鐐瑰悕锛?鍙充笂瑙掔孩鍦堝湀浣忕殑 ui 鍘绘帀"锛屽苟婢勬竻"鍙槸鍘绘帀鍙充笂瑙掗偅涓紝
 * 鍙宠竟杈圭紭鐨勪繚鐣?銆傜敤鎴疯嚜鎴浘锛圫nipaste 23:47:23锛屽彸缂樼珫鏉?160脳1356锛夐€愭纭涓猴細
 *   涓婏紳鍙充笂瑙掓柟妗嗗唴鐨?*涓夋潯鏉犳寜閽?*锛坄#rdrRail`锛夆啋 瑕佸幓鎺夛紱
 *   涓紳鍙崇紭閭ｆ潯 3脳72 鐨勮摑鑹叉笎鍙樻彁绀烘潯锛坄.rdr-hot::after`锛夆啋 瑕佷繚鐣欙紱
 *   涓嬶紳鍥炲埌椤堕儴 FAB 鈫?淇濈暀銆? * 鏁咃細鎶?`#rdrRail` 浠庤瑙変笌鍛戒腑閲屾憳鎺夛紙涓嶆槸鍒犲厓绱狅紝`resolveRdr` 鐨勫厹搴曢€昏緫鐓ф棫瀛樺湪锛夛紝
 * 鍙崇紭鐑尯 `.rdr-hot` 涓庢笎鍙樻彁绀烘潯鍘熸牱淇濈暀 鈥斺€?妗岄潰鎮仠鍙崇紭鍗冲紑鎶藉眽锛? * 瑙﹀睆鐨勭偣鎸夊叆鍙ｇЩ鍒?`.rdr-hot` 鑷韩锛堣 subjects.js 鐨?hot click锛夛紝鍏ュ彛涓嶆柇銆?*/
#rdrRail { display: none !important; }
/* 椤舵爮鎼滅储鎶藉眽锛堥《鏍忔悳绱㈡宸插垹锛屽叆鍙ｅ彧鍓╂斁澶ч暅鎸夐挳 + "/" 蹇嵎閿紱
 * 缁撴灉鍒楄〃鐭紝鍒板簳娓愰殣鐩存帴鍏虫帀锛屼笉鍑?鍒板簳"瀛楁牱锛?*/
.search-drawer .search-drawer-input { padding: 10px 12px 4px; flex: 0 0 auto; }
.search-drawer .rdr-body { padding: 8px; display: grid; gap: 2px; align-content: start; }
.search-drawer .rdr-body::after { display: none; }
.search-drawer .search-pop-item { border-radius: 9px; }
/* 娆㈣繋椤?路 鐢靛奖鎰燂紙personal-homepage 璇█锛氱湁棰?鏀剁揣澶ф爣棰?鐜荤拑/杈夊厜锛? * 鍙繃娓￠鑹茶竟妗嗛槾褰憋紝鏃犱綅绉诲姩鐢伙紱褰遍櫌鐗瑰寲杩?cinema.css锛?*/
.welcome-stage { position: relative; overflow: clip; }
.welcome-stage::before {
  content: ""; position: absolute; inset: 0; pointer-events: none;
  background:
    radial-gradient(560px 340px at 50% 28%, rgba(59, 130, 246, .14), transparent 65%),
    radial-gradient(720px 440px at 85% 92%, rgba(99, 102, 241, .10), transparent 60%);
}
.welcome-card {
  position: relative; width: min(420px, 100%); border-radius: 28px;
  padding: 42px 38px 36px; text-align: center;
  background: var(--glass-bg-strong, var(--surface));
  border: 1px solid var(--line); box-shadow: var(--shadow-3);
}
/* 椤惰竟鍝佺墝娓愬彉绾垮凡鍒狅紙2026-09-14 鐢ㄦ埛鍙嶉璁捐鏈夐棶棰橈級锛?px 绾垮湪澶у渾瑙掑崱涓? * 娓叉煋鎴愪袱绔唴鏀剁殑鎬舰锛屾殫鑹蹭富棰樹笅鏇村儚鎮┖鐨勬柇绾匡紱鍗＄墖鏈韩鏈夌幓鐠冨簳+鎻忚竟锛岃冻澶熴€?*/
.welcome-kicker { margin: 16px 0 10px; }
.welcome-title { font-size: 34px; letter-spacing: -.04em; }
.welcome-card #welDirect, .welcome-card #welUser, .welcome-card #welAdmin {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
}
.welcome-card #welDirect svg, .welcome-card #welUser svg, .welcome-card #welAdmin svg { width: 17px; height: 17px; }
.wel-row { display: flex; gap: 8px; margin-top: 8px; }
.wel-row .btn { flex: 1 1 0; }
.welcome-card #welUser {
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 14px 28px -10px rgba(37, 99, 235, .65);
}
/* 澶х翰鎶藉眽鍘绘粴鍔ㄦ潯锛堜粛鍙粴锛? 鍒板簳鎻愮ず锛氭湭鍒板簳搴曢儴娓愰殣锛堟湁浣欓噺锛夛紝
 * 鍒板簳鍒囧埌搴曞瓧鏍凤紱鍚屼竴鐩掑瓙灏哄锛屽垏鎹笉鎶栦笉鍔?*/
.rdr-body { scrollbar-width: none; }
.rdr-body::-webkit-scrollbar { display: none; }
.rdr-body::after {
  content: ""; position: sticky; bottom: 0; display: block;
  height: 26px; margin-top: -26px; pointer-events: none;
  background: linear-gradient(transparent, var(--surface));
}
.rdr-body.at-bottom::after {
  content: "鈥?鍒板簳 鈥?; display: grid; place-items: center;
  font-size: 11px; color: var(--text-3);
  /* 鍒板簳鍚庝笉鍐嶈鐩栧唴瀹癸細杞垚鏂囨。娴佸唴椤佃剼锛堝彧澶?26px 鍙粴鍖猴紝涓婇潰琛屼笉鍔級 */
  position: static; margin-top: 0; background: transparent;
}
/* 涔﹀唴鐩綍鍙繘鍙虫娊灞夛紙2026-09-14 鐢ㄦ埛鎷嶆澘锛氫功鑷甫鐨勭珷鑺傜洰褰曞崱鎸″涔狅級锛? * 宸﹁建閬撳己鍒跺崟鍒?+ 宸︽爮闅愯棌锛屽ぇ绾茬粡宸ュ叿鏉℃寜閽繘鍙充晶鎶藉眽銆?*/
.subject-main .book-reader .reader-layout.has-rtoc { grid-template-columns: minmax(0, 1fr); }
.subject-main .book-reader .reader-toc { display: none; }
/* 闃呰鍖洪《閮ㄥ伐鍏锋潯锛堝叏妯″紡锛夛細鏍囬 + 澶х翰鎶藉眽鍏ュ彛锛屽乏鏍忎笉鏄剧ず鏃朵篃鑳藉紑鎶藉眽 */
.reader-bar {
  display: flex; align-items: center; gap: 8px;
  padding: 2px 2px 10px; margin-bottom: 2px;
}
.reader-bar-title {
  flex: 1; min-width: 0; font-size: 13.5px; font-weight: 750; color: var(--text-1);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.reader-bar-actions { display: inline-flex; gap: 6px; flex: 0 0 auto; }
/* 褰遍櫌婊氬姩鍗￠】锛氶《鏍?blur(18px) 鐩栧湪婊氬姩鍐呭涓婃瘡甯ч噸绠楋紝涓荤嚎绋嬪凡娴嬪共鍑€锛岀摱棰堝湪鍚堟垚锛? * 鏀瑰疄鑹?+ 淇濈暀搴曡竟锛?026-09-13 鐢ㄦ埛鍙嶉锛?*/
[data-theme="cinema"] .topbar { -webkit-backdrop-filter: none; backdrop-filter: none; background: #0c1119; }
/* 宸ヤ綔鍙帮細娆㈣繋鍖哄惛椤跺父椹伙紙2026-09-13 鐢ㄦ埛鎷嶆澘锛氫竴婊氬氨娌′笉琛岋紝蹇呴』涓€鐩寸湅寰楄锛? * 缁撴瀯鏂囨浠嶅喕缁擄紝鍙敼瀹氫綅銆傞《鏍忚嚜鍔ㄩ殣钘忓悗鍚搁《浣嶇疆鎸夋棤椤舵爮绠?*/
.cc-hero.dash-sticky {
  position: sticky;
  top: 10px;
  z-index: 15;
  background: var(--glass-bg-strong, var(--surface));
}
/* 宸ヤ綔鍙板彔鍚革紙2026-09-13 鐢ㄦ埛鎷嶆澘锛歵abs+鍒楄〃妗嗚窡 hero 涓€璧烽拤浣忥紝婊氫笉鍔ㄥ畠浠紱
 * 鍐荤粨鏂囦欢涓嶅姩锛岀函 CSS锛涘彧鍦ㄥ楂橀兘澶熺殑妗岄潰鐢熸晥锛屽惁鍒欒嚜鐒舵粴鍔級 */
@media (min-width: 1100px) {
  .dash-subtabs {
    position: sticky; top: 229px; z-index: 14;
    background: var(--surface);
    border-radius: 999px;
  }
  .dash-subcard {
    position: sticky; top: 285px; z-index: 13;
  }
}
/* 鍝佺墝缁崇粨鏍囷紙2026-09-13 鐢ㄦ埛鎷嶆澘锛氬師鍒涗笁鐡ｅ嚑浣曠怀缁擄紱娣辨祬涓婚闈犳笎鍙樿嚜閫傚簲锛? * 闈犺繎鎮仠杈夊厜鍔犳繁锛涙杩?鐧诲綍/渚ф爮/favicon 鍏辩敤鍚屼竴鍥惧舰锛?*/
.brand-mark { display: inline-grid; place-items: center; flex: 0 0 auto; }
.brand-mark svg { width: 26px; height: 26px; display: block; transition: filter var(--t-fast); }
/* Logo light feel (2026-09-14): ChatGPT-style glow.
 * Technique: filter drop-shadow follows the SVG alpha silhouette
 * (box-shadow would draw a square). Idle keeps a soft halo so the mark
 * reads luminous without hover; hover layers a white core + brand halo.
 * Filter-only transition: no movement, cheap on a 26-64px mark. */
.brand-mark svg,
.login-brand .brand-mark svg { filter: drop-shadow(0 0 3px rgba(79, 140, 255, .45)); }
.welcome-logo svg { transition: filter var(--t-fast); filter: drop-shadow(0 0 8px rgba(79, 140, 255, .35)); }
.brand:hover .brand-mark svg,
.brand:focus-visible .brand-mark svg,
.login-brand:hover .brand-mark svg,
.welcome-logo:hover svg { filter: drop-shadow(0 0 3px rgba(255, 255, 255, .9)) drop-shadow(0 0 12px rgba(79, 140, 255, .85)); }
[data-theme="cinema"] .brand-mark svg,
[data-theme="cinema"] .login-brand .brand-mark svg { filter: drop-shadow(0 0 5px rgba(122, 168, 255, .5)); }
[data-theme="cinema"] .welcome-logo svg { filter: drop-shadow(0 0 10px rgba(122, 168, 255, .4)); }
[data-theme="cinema"] .brand:hover .brand-mark svg,
[data-theme="cinema"] .brand:focus-visible .brand-mark svg,
[data-theme="cinema"] .login-brand:hover .brand-mark svg,
[data-theme="cinema"] .welcome-logo:hover svg { filter: drop-shadow(0 0 4px rgba(255, 255, 255, .65)) drop-shadow(0 0 18px rgba(122, 168, 255, .9)); }
@media (prefers-reduced-motion: reduce) {
  .brand-mark svg, .welcome-logo svg { transition: none; }
}
/* ---------- 鍏ュ彛椤靛搧鐗岋細鐪夐閰嶈壊 + logo 鍛煎惛杈夊厜锛?026-09-14 鐢ㄦ埛鍙嶉锛?----------
 * 鈶犮€屽瓧浣撻鑹蹭笐銆嶏細QUIZ BANK 鍘熶负鐞ョ弨 #fbbf24锛坈inema 瑕嗙洊锛夛紝涓庤摑鑹?logo 鎾炶壊 鈫? *    鎹㈡垚鍝佺墝浜摑锛堣窡 logo 鍚屾棌锛夛紝鍋氭垚鍏嬪埗鐨?鐪夐"銆? * 鈶°€岃嚜鍔ㄥ彂鍏夈€? 鐢ㄦ埛鐐瑰悕瑕佺殑鐗规晥銆?*褰㈢姸蹇呴』璐村悎 logo 鍓奖**锛堜笉鏄渾褰㈠厜鏂戯級鈥斺€? *    鍋氭硶锛氬湪鏍囪閲屾斁涓€浠?logo 鐨?*鍚屽舰鍓湰**锛?qb-mark-glow锛屽疄蹇冩煋鑹诧級锛? *    瀵瑰畠鍋氶潤鎬?blur锛涘壇鏈湰韬氨鏄偅涓怀缁撳舰鐘讹紝鎵€浠ュ厜鏅曞ぉ鐒舵槸 logo 鐨勫舰鐘躲€? *    鍔ㄧ敾鍙窇 opacity + scale锛堝悎鎴愬櫒绾跨▼銆侀浂閲嶇粯锛夛紱blur 鏄潤鎬佺殑锛屼笉浼氳閫愬抚閲嶇畻
 *    锛堣繖鏄笉鐢?filter 鍔ㄧ敾鐨勫叧閿€斺€攆ilter 鍔ㄧ敾姣忓抚閲嶆柊妯＄硦锛屼唬浠烽珮锛夈€? * 鈶銆屽懠鍚歌浠庢斁涓婂幓寮€濮嬨€嶏細寰幆浠?*鏈€浜浉浣?*寮€澶达紙animation-fill-mode: both +
 *    0% 鍗冲嘲鍊硷級锛屽厓绱犱竴鎸備笂灏辨槸浜潃鐨勶紝闅忓悗鎵嶅紑濮嬪懠鍚革紱娌℃湁 delay銆佷笉绛夋偓鍋?婊氬姩銆? * 璋冨弬锛堥兘鍦?:root锛夛細
 *    --qb-glow-fg    杈夊厜棰滆壊锛堜細鍚屾椂瑕嗙洊鍓湰鐨?stroke/fill锛? *    --qb-glow-blur  杈夊厜鎵╂暎锛堝舰鐘惰竟缂樼殑鏌斿寲绋嬪害锛? *    --qb-glow-min/max  鍛煎惛鐨勭缉鏀惧尯闂达紙"鎵╁埌澶氬ぇ / 鏀跺緱澶氬皬"锛? *    --qb-glow-dur   涓€涓懠鍚稿懆鏈燂紙"閫熷害"锛? * 鍙綔鐢ㄤ簬鍏ュ彛椤碉紙welcome / login锛夛紱甯搁┗鐨勪晶鏍?椤舵爮鍝佺墝鏍囦笉鍔犲姩鐢伙紝閬垮厤鍏ㄧ珯甯搁┗鍔ㄧ敾銆?*/
:root {
  --qb-kicker-fg: #8fb3ff;
  --qb-glow-fg: #7aa8ff;
  --qb-glow-blur: 7px;
  --qb-glow-min: .92;
  --qb-glow-max: 1.16;
  --qb-glow-dur: 2.8s;
}
[data-theme="cinema"] .welcome-kicker { color: var(--qb-kicker-fg); }
.welcome-logo, .login-brand .brand-mark { position: relative; }
/* 鍚屽舰杈夊厜鍓湰锛氱粷瀵瑰畾浣嶅眳涓紙鐢ㄧ嫭绔?translate锛岄伩鍏嶄笌鍔ㄧ敾鐨?scale 鎵撴灦锛夛紝
 * 鐩栧湪搴曞眰銆佷笉鍚冧簨浠讹紱鏌撹壊鍚庢暣浣撴ā绯婃垚鍏夋檿銆?*/
.qb-mark-glow {
  position: absolute; left: 50%; top: 50%; translate: -50% -50%;
  display: grid; place-items: center; z-index: 0; pointer-events: none;
  filter: blur(var(--qb-glow-blur)) saturate(1.15);
  animation: qb-glow-breathe var(--qb-glow-dur) ease-in-out infinite;
  animation-fill-mode: both;
  will-change: opacity, scale;
}
/* 鍓湰缁熶竴鏌撴垚杈夊厜鑹诧紙CSS 瑕嗙洊 SVG 琛ㄧ幇灞炴€э級锛屽壀褰?= 涓夋き鍦嗘弿杈?+ 鍗佷簩鍦嗙偣 */
.qb-mark-glow svg * { stroke: var(--qb-glow-fg); fill: var(--qb-glow-fg); }
.welcome-logo > svg, .login-brand .brand-mark > svg { position: relative; z-index: 1; }
@keyframes qb-glow-breathe {
  /* 0% 鍗冲嘲鍊硷細鏀句笂鍘荤殑涓€鍒绘槸浜殑锛岀劧鍚庢敹鈫掓斁 */
  0%, 100% { opacity: .95; scale: var(--qb-glow-max); }
  50%      { opacity: .45; scale: var(--qb-glow-min); }
}
@media (prefers-reduced-motion: reduce) {
  .qb-mark-glow { animation: none; opacity: .7; scale: 1; }
}
/* Logo gradient stops follow theme (day pair = favicon-proven blue). */
.qb-lg0 { stop-color: #2f6bf0; }
.qb-lg1 { stop-color: #7aa8ff; }
[data-theme="cinema"] .qb-lg0 { stop-color: #8fb3ff; }
[data-theme="cinema"] .qb-lg1 { stop-color: #d6e6ff; }
/* B6 hexstar 杞村悜娓愬彉 stops锛氫腑鐐圭绾?OKLCH 鐑ゅ埗锛坥utput/compute-stops.cjs锛夛紝鏄煎涓ゅ銆?*/
.qb-hx0 { stop-color: #e9f2ff; }
.qb-hx1 { stop-color: #75a5fa; }
.qb-hx2 { stop-color: #2e63e0; }
.qb-hx3 { stop-color: #223b96; }
.qb-hx4 { stop-color: #141f5e; }
[data-theme="cinema"] .qb-hx0 { stop-color: #ffffff; }
[data-theme="cinema"] .qb-hx1 { stop-color: #acc5c5; }
[data-theme="cinema"] .qb-hx2 { stop-color: #7d88a3; }
[data-theme="cinema"] .qb-hx3 { stop-color: #3b4356; }
[data-theme="cinema"] .qb-hx4 { stop-color: #0e1420; }
/* 渚ф爮鍥炬爣杞紙2026-09-13 鐢ㄦ埛鎷嶆澘锛氬幓鈥滃涔犫€濆垎缁勫瓧鍜屽鑸枃瀛楋紝鍙暀鍥炬爣锛?*/
@media (min-width: 861px) {
  .sidebar { width: 70px; }
  .sidebar .brand-word,
  .sidebar .nav-group,
  .sidebar .nav-label { display: none; }
  .sidebar .nav-item { justify-content: center; padding-left: 0; padding-right: 0; }
  .sidebar .side-actions { flex-direction: column; align-items: center; }
  /* 鍥炬爣杞?hover锛?026-09-14 鐢ㄦ埛浜屾鎷嶆澘锛氫笉瑕佹枃瀛楁爣绛俱€佷笉瑕佸簳妗嗭級
   * 2026-09-15 涓夋敼锛堢敤鎴凤細"杩欎釜鍙樼櫧鐨?hover 澶笐浜?锛夛細brightness(1.25) 浼氭妸娴呰壊
   * tile 鎻愭垚杩戠櫧锛岀湅璧锋潵鍍?娲楃櫧"銆傛敼鎴?*鍔犳繁鍔犻ケ鍜?*鈥斺€斿浘鏍囬鑹叉洿瀹炪€佷笉娉涚櫧銆?   * 涓嶅彂鍏夈€佷笉鍔犲ぇ搴曟锛涙殫鑹蹭富棰樺悓鏍锋垚绔嬶紙鍔犳繁鍦ㄦ殫搴曚篃璇诲緱鍑?鎮仠鍒颁簡"锛夈€?*/
  .sidebar .nav-item:hover { background: transparent; }
  .sidebar .nav-item:hover .nav-tile,
  .sidebar .nav-item:focus-visible .nav-tile { filter: saturate(1.5) brightness(.93); }
  /* 宸︿笅瑙掍笁閽粺涓€灏哄锛?026-09-13 鐢ㄦ埛鍙嶉"鍥炬爣澶у皬涓嶄竴鑷?锛?   * logoutBtn 鐨?btn-icon 瀹?33px 鐮村潖浜?stretch锛岀洅 瀛?33x18锛屽拰鏃佽竟 36x36 鏄庢樉涓嶉綈锛?*/
  .sidebar .side-actions .btn {
    width: 36px; height: 36px; padding: 0; flex: 0 0 36px;
    display: inline-flex; align-items: center; justify-content: center;
  }
  /* 2026-09-15 鐢ㄦ埛鎷嶆澘锛堢 6 杞埅鍥撅級锛氬乏鎶藉眽婊戝嚭鏃堕《鏍忋€愪笉鐢ㄣ€戣浣嶁€斺€?   * 鍘?2026-09-13 鐨?padding-left:86px 鍙崇Щ瑙勫垯鏁村潡鎾ら攢锛岄《鏍忓唴瀹逛繚鎸?x=16 璧锋帓锛?   * 70px 鍥炬爣鏍忔寜瑕嗙洊寮忓彔涓婃潵鍗冲彲锛堥《鏍忓钩鏃舵槸 topauto 鏀惰捣鐨勶紝涓よ€呮瀬灏戝悓鏃跺睍寮€锛夈€?*/
}
/* 瀵艰埅椤?hover锛?026-09-14 鐢ㄦ埛鍙嶉锛夛細浠呭睍寮€鎬侊紙绐勫睆鎶藉眽锛屾湁鏂囧瓧鏍囩锛夌粰搴曡壊鑳跺泭锛? * 鍥炬爣杞?hover 瑙佷笂鏂瑰獟浣撴煡璇紙鍙彁浜浘鏍囷級銆俛ctive 鎭㈠鍘熸湁瀹炲績钃濆潡锛堢敤鎴风偣鍚?鍘熸潵
 * 濂界湅鐨勯€変腑鏁堟灉"锛夛紝涓嶅仛浠讳綍鏀瑰啓銆?*/
.nav-item:hover { background: var(--surface-3); }
/* 2026-09-15 鐢ㄦ埛鎷嶆澘锛堢 6 杞埅鍥撅級锛氬乏鎶藉眽婊戝嚭鏃舵鏂囥€愪笉鐢ㄣ€戣浣嶁€斺€? * 鍘?padding-left:86px 鍙崇Щ瑙勫垯鏁村潡鎾ら攢锛屽浘鏍囨爮鎸夎鐩栧紡鍙犲湪姝ｆ枃涓? * 锛堢鐩〉姝ｆ枃鐢?studio.css 鐨?main#outlet padding-left:300px 绠″乏鏍戣浣嶏紝涓庢鏃犲叧锛夈€? * 鍙虫娊灞夊浘閽夊浐瀹氭椂鐨?padding-right 璁╀綅淇濈暀锛堜笅鏂?961px 鍧楋級銆?*/
/* 鍙虫娊灞夊浐瀹氾紙鍥鹃拤 on 涓旀娊灞夊疄闄呭睍寮€锛夋椂鍐呭璁╀綅锛?026-09-14 鐢ㄦ埛鍙嶉锛氬浐瀹氭椂涓嶅啀鐩栦綇姝ｆ枃锛?*/
@media (min-width: 961px) {
  .content { transition: padding-right .22s ease; }
  body.rdr-pinned:has([data-drawer].force-open, [data-subjdrawer].force-open) .content { padding-right: 324px; }
}
/* 椤舵爮甯搁┗ Logo 宸叉寜 2026-09-14 鐢ㄦ埛瑕佹眰绉婚櫎锛?杩斿洖鏃佽竟閭ｄ釜 logo 鍘绘帀"锛夛細
 * .brand-top 闅?#brandTop 鍏冪礌涓€骞朵笅绾匡紝椤舵爮浠庤繑鍥為敭璧锋帓銆?*/
#heroSub { min-height: 19px; }
/* 宸ヤ綔鍙板埛鏂版寜閽笅绾匡紙2026-09-13 鐢ㄦ埛鎷嶆澘锛氭病鐢紱鍐荤粨鏂囦欢涓嶅姩锛孋SS 闅愯棌锛?*/
.page-head:has(> .page-head-actions > #dashRefresh) { display: none; }
/* 棰樺簱鍒楄〃鍥哄畾妗嗭紙2026-09-13 鐢ㄦ埛鎷嶆澘锛夛細妗嗛珮鍥哄畾鏀句簲鍏锛屽唴閮ㄦ粴鍔紝妗嗘湰韬笉鍔?*/
.dash-subcard #dashList {
  max-height: 430px; overflow-y: auto;
  scrollbar-width: none;
}
#dashList::-webkit-scrollbar { display: none; }
.dash-subtabs { display: flex; gap: 8px; overflow-x: auto; padding: 2px; }
.dash-subtabs button {
  flex: 0 0 auto; border: 1px solid var(--line); background: var(--surface);
  color: var(--text-2); border-radius: 999px; padding: 8px 18px;
  font-size: 13.5px; font-weight: 700; cursor: pointer; white-space: nowrap;
  transition: background var(--t-fast), color var(--t-fast), border-color var(--t-fast);
}
.dash-subtabs button:hover { border-color: var(--brand-300, #93b4f8); color: var(--text-1); }
.dash-subtabs button.on { background: var(--brand-500, #3b82f6); border-color: var(--brand-500, #3b82f6); color: #fff; }
.dash-viewseg { display: inline-flex; }
.dash-viewseg button.on { background: var(--brand-50, rgba(59, 130, 246, .12)); border-color: var(--brand-300, #93b4f8); color: var(--brand-600, #2563eb); }
[data-theme="cinema"] .dash-viewseg button.on { background: rgba(79, 140, 255, .16); border-color: rgba(79, 140, 255, .45); color: #fff; }

/* --- #12锛氶鍙烽潰鏉挎敼娴眰锛屽睍寮€涓嶅啀鎸ゅ帇姝ｆ枃锛堟秷闄ゆ姈鍔級 --- */
.qnav.exam-qnav {
  position: absolute; top: calc(100% + 8px); left: 0; right: 0; margin: 0; z-index: 40;
  background: var(--surface); border: 1px solid var(--line); border-radius: 14px;
  box-shadow: var(--shadow-2); padding: 10px; max-height: 240px; overflow-y: auto;
}
/* .qnav{display:grid} 浼氱洊鎺?[hidden] 鐨?UA display:none 鈥斺€?绌烘诞灞傚繀椤诲交搴曚笉鎸＄偣鍑?*/
.qnav.exam-qnav[hidden] { display: none !important; }

/* 宸ュ叿鏉￠噷鐨勬帉鎻″害绛涢€夛細涓嶅啀鎾戞弧鏁磋锛坈c-ui 鐨?width:100% 鏄棫甯冨眬閬椾骇锛?*/
.exam-chiprow .m-filter { width: auto; flex: 0 0 auto; }
.exam-chiprow .m-filter button { flex: 0 0 auto; min-width: 34px; }

/* --- #16/#18锛氬崱鐗囬〉鑴?鈥斺€?鏄剧ず绛旀鍦ㄥ乏銆佹帉鎻″害涓夋€佸湪鍙?--- */
.q-foot { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-top: 12px; }
.q-foot .m-row { margin: 0; justify-content: flex-end; }
.q-foot .btn.on { border-color: var(--brand-400, #6b9bf7); color: var(--brand-600, #2563eb); background: var(--brand-50, rgba(59, 130, 246, .1)); }

/* --- #17锛氬簳閮ㄦ偓娴炕棰樻潯锛?026-09-12 绉诲埌宸︿笅瑙掞細灞呬腑鐗堜細鎸′綇棰樼洰/瑙ｆ瀽鍐呭锛?--- */
.exam-floatnav {
  position: fixed; left: 16px; bottom: 20px; z-index: 60;
  display: flex; align-items: center; gap: 6px; padding: 7px 10px; border-radius: 999px;
  background: var(--glass, var(--surface));
  -webkit-backdrop-filter: blur(16px) saturate(1.3); backdrop-filter: blur(16px) saturate(1.3);
  border: 1px solid var(--line); box-shadow: var(--shadow-2);
}
.fnav-btn {
  display: inline-flex; align-items: center; gap: 6px; padding: 8px 14px; border-radius: 999px;
  border: 1px solid transparent; background: transparent; color: var(--text-1);
  font-size: 13px; font-weight: 650; cursor: pointer; transition: background var(--t-fast), filter var(--t-fast);
}
/* 2026-09-14锛氭偓鍋滃弽棣堥棬鎺?(hover:hover)鈥斺€旂炕棰樻潯鍙湪鎵嬫満鏄剧ず锛岃Е灞?tap 浼氱矘浣?:hover */
@media (hover: hover) { .fnav-btn:hover:not(:disabled) { background: var(--surface-2); } }
.fnav-btn.primary { background: var(--brand-500, #3b82f6); color: #fff; }
@media (hover: hover) { .fnav-btn.primary:hover:not(:disabled) { filter: brightness(1.07); } }
.fnav-btn:disabled { opacity: .38; cursor: default; }
.fnav-pos { min-width: 58px; text-align: center; font-size: 12px; color: var(--text-2); font-variant-numeric: tabular-nums; }

/* --- 闃呰鍣細涔﹀悕鏍囬鍦ㄥぇ绾查《閮紙涓嶈繘鍗＄墖锛夈€佺粨鏋勮鍋氬垎缁勫ご锛?19锛?--- */
.rtoc-title {
  padding: 8px 9px 10px; margin-bottom: 6px; border-bottom: 1px solid var(--line);
  font-size: 12.5px; font-weight: 750; color: var(--text-1); line-height: 1.5;
}
.rtoc-group {
  padding: 8px 9px 4px; font-size: 11.5px; font-weight: 750; color: var(--text-3);
  letter-spacing: .02em;
}
.kp-group-head {
  margin: 16px 0 8px; font-size: 13px; font-weight: 800; color: var(--brand-700, #1d4ed8);
  border-left: 4px solid var(--brand-500, #3b82f6); padding-left: 10px;
}
.kp-group-head:first-child { margin-top: 0; }

/* --- 渚ф爮锛氭潯鐩洿绱у噾锛?2 鍑忓皯闂磋窛锛?--- */
.sidebar .nav-item { padding-top: 7px; padding-bottom: 7px; }
.sidebar .nav-group { margin-top: 8px; margin-bottom: 4px; }
/* 渚ф爮婵€娲荤珫鏉℃寚绀哄櫒鍘绘帀锛堢敤鎴疯姹傦級锛氶€変腑鎬佸彧鐣欏簳鑹?鍥炬爣鐮栵紝涓嶅仛宸︿晶绔栨潬 */
.nav-item.active::before { display: none; }
/* Toast 鍘昏摑缁跨珫绾匡紙鐢ㄦ埛瀚屼笐锛夛細绫诲瀷鍙潬娣″簳鑹?鍥炬爣鑹插尯鍒嗭紱hover 鍔犱寒锛岀偣鍗冲叧锛? * 鍫嗙Н涓婇檺 4 鏉＄敱 ui.js 淇濊瘉锛岃繖閲屽彧绠℃牱瀛?*/
.toast { cursor: default; pointer-events: none; transition: opacity var(--t-fast), background var(--t-fast), box-shadow var(--t-fast); }
/* toast 姘镐笉鎸＄偣鍑伙紙2026-09-13 鐢ㄦ埛鍙嶉棰樺彿鐐逛笉浜嗭級锛氭彁绀烘潯鍙犲湪鍙充笂棰樺彿闈㈡澘涓婏紝
 * 鍙偣锛堜负浜嗙偣鎸夋秷澶憋級浼氭妸涓嬮潰涓€鏁村潡棰樺彿鍙樻垚姝诲尯锛涙敼绌块€忥紝娑堝け鍙蛋鑷姩瀹氭椂锛? * el.onclick 鐨勭偣鎸夋秷澶变繚鐣欙紙鏃犲锛夈€?*/
.toast.ok, .toast.err, .toast.info { border-left: 0; }
.toast:hover { box-shadow: var(--shadow-2); filter: brightness(1.04); }
.toast.ok { background: var(--ok-bg); }
.toast.err { background: var(--err-bg); }
.toast.info { background: var(--brand-50, rgba(59, 130, 246, .1)); }

/* --- 椤堕儴鎼滅储鍗犱綅绮剧畝锛?3 鍘诲啑浣欐弿杩帮級 --- */
.topbar-search-wrap .search-box .input::placeholder { font-size: 12.5px; }

/* --- 绉戠洰椤碉細椤跺眰鍙湁 涔︾睄/棰樺簱锛屾牴鑺傜偣鍔犻噸鏄剧ず --- */
.cat-group.cat-root > summary { padding-top: 10px; padding-bottom: 10px; }
.cat-group.cat-root > summary .cat-name { font-size: 14.5px; font-weight: 800; }
.cat-root-ico { display: inline-flex; color: var(--brand-600, #2563eb); margin-right: 2px; }
.cat-root-ico svg { width: 16px; height: 16px; }
.tree-row.tree-root { font-weight: 750; color: var(--text-1); }
.tree-row.tree-root .tree-ico { color: var(--brand-600, #2563eb); }
.tree-row.tree-top { color: var(--text-3); font-size: 12px; letter-spacing: .03em; }

/* --- 闃呰鍣細鏁ｅ彞澶囨敞娈佃惤锛堝唴瀹瑰彧澶氫笉灏戯紝涓嶅仛鎴愬崱鐗囷級 --- */
.kp-note { margin: 6px 0 10px; font-size: 12.5px; line-height: 1.7; color: var(--text-2); white-space: pre-wrap; }
/* 鏁欐潗鍨嬪娉紙璧?mdLite 鏍囬鎻愬崌鍚庯級锛氭鏂囩骇鎺掔増锛屼笌 .book-text 鍚屼竴鍙ｅ緞锛? * white-space 鏀?normal锛堟钀界粨鏋勪氦缁?<p>/<div>锛屼笉鍐嶉潬婧愭崲琛岋級 */
.kp-note-md { font-size: 13.5px; line-height: 1.75; color: var(--text-1); white-space: normal; }
.kp-note-md p { margin: 0 0 9px; }
.kp-note-md p:last-child { margin-bottom: 0; }
.kp-note-md .md-h3 { font-size: 14.5px; margin: 12px 0 6px; }
.kp-note-md .md-h4 { font-size: 13.5px; margin: 10px 0 5px; }
.kp-subhead { margin: 12px 0 5px; font-size: 13.5px; font-weight: 750; color: var(--text-1); }

/* --- 闃呰鍣細婧?PDF 鏃犳枃瀛楀眰鐨勬暣椤靛浘锛堝嚭鐗堢ぞ鎻掑浘/鎵弿椤碉級鐩存帴鍐呭祵 --- */
img.kp-fig,
[data-pane="recite"] img[data-bimg] {
  display: block; max-width: 100%; margin: 10px auto; border: 1px solid var(--line);
  border-radius: 10px; background: var(--surface);
}

/* --- 涓撴敞椤碉細绌烘€佺敤鍥炬爣鎸夐挳锛堜笉鍐嶆槸涓€琛岃鏄庢枃瀛楋級 --- */
.fchip-addhint {
  display: inline-flex; align-items: center; gap: 6px; padding: 5px 12px 5px 9px;
  border-radius: 999px; border: 1px dashed var(--line-strong, var(--line)); background: transparent;
  color: var(--text-3); font-size: 12px; font-weight: 650; cursor: pointer;
  transition: border-color var(--t-fast), color var(--t-fast), background var(--t-fast);
}
.fchip-addhint:hover { border-color: var(--cat, var(--brand-400)); color: var(--text-1); background: var(--surface-2); }
.fchip-addhint svg { width: 15px; height: 15px; }

@media (max-width: 980px) {
  .exam-side { position: static; max-height: 220px; }
  .tree-sub-grid { grid-template-columns: repeat(8, minmax(0, 1fr)); }
}
@media (max-width: 860px) {
  .exam-floatnav { bottom: 14px; padding: 6px 8px; }
  .fnav-btn { font-size: 12px; padding: 7px 11px; }
}


/* ============================================================
 * 搂9 涓撴敞椤?路 鍦烘櫙鍖栭噸缁橈紙鍙傝€?personal-homepage锛氬ぇ鍦嗙幆鍦烘櫙 +
 *     鍘诲崱鐗囧爢鍙?+ 鍥炬爣椹卞姩锛沴ight 娣℃笎鍙?/ cinema 鐜荤拑鎷熸€侊級
 * ============================================================ */
.focus-top.card {
  background:
    radial-gradient(120% 160% at 0% 0%, color-mix(in srgb, var(--brand-500, #3b82f6) 8%, transparent), transparent 55%),
    var(--surface);
  border: 1px solid var(--line);
  border-radius: 20px;
  padding: 26px 30px;
  gap: 28px;
}
.focus-top .focus-ring svg { width: 150px; height: 150px; }
.focus-top .focus-ring { margin: 4px 8px; }
.focus-top .focus-clock { font-size: 22px; }
.focus-addcat .input {
  background: transparent;
  border: 0;
  border-bottom: 1px solid var(--line);
  border-radius: 0;
  padding: 5px 2px;
  box-shadow: none;
}
.focus-addcat .input:focus { border-bottom-color: var(--brand-500, #3b82f6); box-shadow: none; }

/* 鍒嗙被琛岋細鍘诲崱鐗囧寲 鈫?鍒嗛殧绾垮垪琛?+ hover 娣℃煋鑹?*/
.focus-cats { gap: 2px; }
.focus-cat-row.card {
  background: transparent;
  border: 0;
  border-bottom: 1px solid var(--line);
  border-radius: 0;
  padding: 13px 10px 13px 16px;
  transition: background var(--t-fast);
}
.focus-cat-row.card:last-child { border-bottom: 0; }
.focus-cat-row.card:hover { background: color-mix(in srgb, var(--brand-500, #3b82f6) 4%, transparent); }

/* 鍛ㄧ粺璁★細鍘诲崱鐗囧寲锛屾爣棰樺急鍖?*/
#catZones ~ .card {
  background: transparent;
  border: 0;
  border-top: 1px solid var(--line);
  border-radius: 0;
  padding: 16px 6px 6px;
  margin-top: 18px;
}

/* 褰遍櫌涓婚锛歨ero 鐜荤拑鎷熸€?+ 鍒嗛殧绾垮噺娣?*/
[data-theme="cinema"] .focus-top.card {
  background:
    radial-gradient(120% 160% at 0% 0%, rgba(79, 140, 255, .12), transparent 55%),
    rgba(255, 255, 255, .03);
  backdrop-filter: blur(14px);
  border-color: rgba(255, 255, 255, .09);
}
[data-theme="cinema"] .focus-cat-row.card {
  background: transparent !important;
  box-shadow: none !important;
  border-bottom: 1px solid rgba(255, 255, 255, .07) !important;
}
[data-theme="cinema"] .focus-cat-row.card:hover { background: rgba(79, 140, 255, .08) !important; }
[data-theme="cinema"] #catZones ~ .card { border-top-color: rgba(255, 255, 255, .07); }

/* --- #9 鎺屾彙搴︿笁鎬佷笁鑹诧紙棰勮/绛旈/缁撴灉绛涢€夐€氱敤锛夛細鎺屾彙缁?路 妯＄硦 amber 路 涓嶄細绾?---
 * 2026-09-14 鐢ㄦ埛鍙嶉"閫変腑鍚庡垎涓嶆竻"锛氫功鍐呭ぇ绾茬瓫閫?seg 鐢ㄧ殑鏄?.m-filter锛堥潪 .m-seg/#mFilterSeg锛夛紝
 * 閫変腑鎬佹帀鍒伴€氱敤鐏板簳涓婁笁鎬佸叏鍚屸€斺€旇繖閲屾妸 .m-filter 涓€骞剁撼鍏ヤ笁鑹查€変腑鎬併€?*/
.m-seg button[data-lv="PROFICIENT"], #mFilterSeg button[data-m="PROFICIENT"], .m-filter button[data-m="PROFICIENT"] { color: var(--ok-500, #16a34a); }
.m-seg button[data-lv="FUZZY"], #mFilterSeg button[data-m="FUZZY"], .m-filter button[data-m="FUZZY"] { color: var(--warn-500, #d97706); }
.m-seg button[data-lv="UNKNOWN"], #mFilterSeg button[data-m="UNKNOWN"], .m-filter button[data-m="UNKNOWN"] { color: var(--err-500, #dc2626); }
.m-seg button[data-lv="PROFICIENT"].on, #mFilterSeg button[data-m="PROFICIENT"].on, .m-filter button[data-m="PROFICIENT"].on {
  background: var(--ok-bg, rgba(22, 163, 74, .12)); color: var(--ok-500, #16a34a); box-shadow: inset 0 0 0 1px var(--ok-500, #16a34a);
}
.m-seg button[data-lv="FUZZY"].on, #mFilterSeg button[data-m="FUZZY"].on, .m-filter button[data-m="FUZZY"].on {
  background: var(--warn-bg, rgba(217, 119, 6, .12)); color: var(--warn-500, #d97706); box-shadow: inset 0 0 0 1px var(--warn-500, #d97706);
}
.m-seg button[data-lv="UNKNOWN"].on, #mFilterSeg button[data-m="UNKNOWN"].on, .m-filter button[data-m="UNKNOWN"].on {
  background: var(--err-bg, rgba(220, 38, 38, .1)); color: var(--err-500, #dc2626); box-shadow: inset 0 0 0 1px var(--err-500, #dc2626);
}
.m-filter button.on .m-count, #mFilterSeg button.on .m-count { color: inherit; font-weight: 800; }
/* 绛涢€夌敓鏁堟椂锛氬懡涓殑澶х翰琛屾爣涓婂搴旂啛缁冨害棰滆壊锛堢敤鎴峰弽棣?瀵瑰簲棰樼洰鐪嬩笉鍑烘潵"锛?*/
.rtoc-row[data-mf="PROFICIENT"] { color: var(--ok-500, #16a34a); font-weight: 650; }
.rtoc-row[data-mf="FUZZY"] { color: var(--warn-500, #d97706); font-weight: 650; }
.rtoc-row[data-mf="UNKNOWN"] { color: var(--err-500, #dc2626); font-weight: 650; }

/* ---------- 搂10 hidden 姘歌繙闅愯棌锛氬竷灞€ display 浼氱洊鎺?UA 鐨?[hidden]{display:none} ----------
   绌虹殑 .book-reader锛堟瘡琛屼功鍚庨潰閮芥湁涓€涓?hidden 鐨勶級鍦ㄤ功缂濅箣闂撮湶鍑轰竴閬?2px 杈规妯嚎
   + 14px 搴曡竟璺濓紝闅忔粴鍔ㄦ弧灞忛兘鏄嚎锛涘悓鐞?cat-new-form / .btn 绛?hidden 鎺т欢涔熶細楝煎奖鏄惧舰銆?   鍏ㄧ珯鏄鹃殣涓€寰嬭蛋 hidden 灞炴€у鍒狅紙JS 渚у凡濡傛锛夛紝CSS 涓嶅緱鍐嶈鐩栧畠銆?*/
[hidden] { display: none !important; }

/* ============================================================
 * 搂11 绛旈鍒嗛〉 + 鏄剧ず绛旀灞呬腑鍥哄畾 + 宸﹀ぇ绾插凡鍋氭€?+ 鍥剧墖鍗犱綅闃茶烦
 * ============================================================ */
/* 鏄剧ず绛旀涓庢帉鎻″害涓夐挳锛氬悓涓€灞呬腑缁勶紙鎺屾彙搴︾揣璐存樉绀虹瓟妗堝彸渚э紝浜掍笉椤跺姩锛夛紱
 * 鏄剧ず绛旀鍥哄畾鏈€灏忓搴︼細灞曞紑/鏀惰捣鏂囨瀛楁暟涓嶅悓涓嶅啀宸﹀彸椤舵帉鎻￠挳 */
.q-foot { display: flex; align-items: center; justify-content: center; gap: 10px; }
.q-foot > :first-child { justify-self: auto; }
.q-foot .m-row { justify-self: auto; margin: 0; }
.q-foot .btn[data-act="reveal"], .q-foot .btn[data-act="reveal2"] { min-width: 108px; justify-content: center; }
/* 2026-09-14 鐢ㄦ埛鎷嶆澘锛氶鍙锋牸鍙繚鐣?on=褰撳墠棰橈紙娣辫摑瀹炲績锛夛紝done(鍋氳繃钃?/cleared(浣滃缁?/
 * m-*锛堟帉鎻″害鑹诧級鍏ㄩ儴绉婚櫎 鈥斺€?鎺屾彙搴︿笁閿槸鍞竴鏍囪锛屼笉鍐嶆湁棰濆棰滆壊姹℃煋锛? * .qno-chip.on 瑙勫垯鍦?base 娈碉紙:122锛夛紝鐜板湪瀹冩槸鍞竴鐫€鑹诧紝涓嶅瓨鍦ㄨ瑕嗙洊闂銆?*/
/* 澶х翰搴曢儴缈婚〉鏉★紙2026-09-15 閲嶈璁★細椤佃剼鏉℃洿钖勩€佹寜閽垚鑳跺泭銆侀〉鐮佹垚"绔?锛屼笉鍐嶆槸涓€琛岃８瀛楋級 */
.toc-pager {
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
  padding: 8px 10px 4px; border-top: 1px solid var(--line); margin-top: 6px;
}
.toc-pager[hidden] { display: none !important; }
/* 涓婃/涓嬫锛氳兌鍥婃弿杈归挳锛堥粯璁ょ礌搴曪紝hover 鎵嶄笂鍝佺墝鑹诧紱瑙﹀睆绮樻粸 hover 宸茬敱鍏ㄥ眬闂ㄦ帶鍏滀綇锛?*/
.toc-pager > .btn {
  min-width: 72px; justify-content: center;
  border: 1px solid var(--line); background: var(--surface); border-radius: 999px;
  font-size: 12.5px; box-shadow: none;
}
.toc-pager > .btn:disabled { opacity: .4; box-shadow: none; }
@media (hover: hover) {
  .toc-pager > .btn:not(:disabled):hover {
    border-color: var(--brand-300, #93c5fd); color: var(--brand-600, #2563eb);
    background: var(--brand-50, rgba(59, 130, 246, .10));
  }
}
/* 涓棿椤电爜锛氬皬鍦嗙珷锛堢瓑瀹芥暟瀛楋紝缈婚〉鏃舵暟瀛椾笉璺冲锛?*/
.toc-pager > .muted, .toc-pager > [data-rpglabel], .toc-pager > [data-pg], .toc-pager > [data-ipg] {
  font-size: 12px; font-weight: 650; color: var(--text-2); letter-spacing: .02em;
  padding: 3px 12px; border-radius: 999px;
  background: var(--surface-2, rgba(125, 135, 155, .12)); border: 1px solid var(--line);
  font-variant-numeric: tabular-nums;
}
/* 2026-09-14 鐢ㄦ埛鍥撅紙"涓婃涓嬫涓嶅湪搴曢儴"銆?鍙樉绀哄湪涓棿涓€鍧?锛夛細
 * 涓婁竴鐗堝仛鎴愪簡"璐村湪瑙嗗彛搴?+ 60px 鎶珮 + 鍦嗚"锛岀粨鏋滄槸涓€鏉℃诞鍔ㄥ皬鍦嗗崱鐗囨偓鍦ㄦ鏂囦腑闂达紝
 * 涓嬮潰杩橀湶鍑哄唴瀹癸紝鏃笉鍦ㄥ簳閮ㄤ篃涓嶅儚鐢靛瓙涔︺€傛敼鎴?*鐪熸鐨勫簳閮ㄩ€氭爮**锛? *   路 bottom:0 璐存瑙嗗彛搴曪紙涓嶅啀涓烘祻瑙堝櫒搴曟爮鎶珮锛涘簳鏍忎綅缃氦缁?safe-area锛? *   路 鐩磋 + 閫氭爮瀹?+ 涓婅竟妗嗭紝瑙嗚涓婂氨鏄?闃呰鍣ㄩ〉鑴?
 *   路 margin-top:auto锛氬唴瀹规瘮灞忓箷鐭椂涔熷帇鍒板鍣ㄥ簳閮紙閰嶅悎 .reader-main 鐨?flex 鍒楋級
 * 鑳岃椤?/ 鍏ㄦ枃椤?/ 鎵弿椤典笁鏉＄炕椤垫潯鍏辩敤 .toc-pager锛岃涓轰竴鑷淬€?*/
.reader-main .toc-pager {
  position: sticky; bottom: 0; z-index: 30;
  margin-top: auto; margin-bottom: 0;
  padding: 9px 14px calc(9px + env(safe-area-inset-bottom, 0px));
  border-top: 1px solid var(--line); border-radius: 0;
  background: var(--surface, #10161f);
  box-shadow: 0 -12px 20px -18px rgba(0, 0, 0, .55);
}
/* 2026-09-15 鐢ㄦ埛锛?涓€婊氬氨璺?锛夋牴鍥狅細.reader-main 搴曚笅杩樺帇鐫€鍒殑鐩掑瓙 鈥斺€? * .book-reader margin-bottom 14 + #bookList 浣欓噺 16 + .content padding-bottom 60 鈮?90px銆? * 婊氬埌鏂囨。搴曟椂 sticky 鐨勫鍣ㄥ簳杈瑰凡楂樹簬瑙嗗彛搴曪紝缈婚〉鏉¤鎶?90px锛堝疄娴?scrollTo 900鈫?099锛夈€? * 淇硶 = 璁╃炕椤垫潯鎴愪负鏂囨。鏈€鍚庝竴涓洅瀛愶紙涓嬫柟娓呴浂锛夛紝sticky 灏辫兘涓€璺拤姝诲湪瑙嗗彛搴曘€? * 浠呭湪"椤甸潰涓婄湡鏈夌炕椤垫潯"鏃剁敓鏁堬紙:has锛夛紝涓嶅奖鍝嶅叾瀹冮〉闈€?*/
body:has(.reader-main .toc-pager) .content { padding-bottom: 0; }
body:has(.reader-main .toc-pager) #bookList { margin-bottom: 0; padding-bottom: 0; }
body:has(.reader-main .toc-pager) .book-reader { margin-bottom: 0; }
/* 闃呰姝ｆ枃鍒楁拺鎴愪竴鏁村睆锛堝惈 flex 鍒楋級锛岀炕椤垫潯鎵嶈兘琚?margin-top:auto 鍘嬪埌搴曘€? * 鍙湪闃呰鍣ㄩ噷鐢熸晥锛屼笉纰板叾瀹冮〉闈€?*/
.reader-main {
  display: flex; flex-direction: column;
  min-height: calc(100dvh / var(--qb-zoom, 1) - var(--header-h, 64px) - 26px);
}
.reader-main > [data-pane], .reader-main > .book-text, .reader-main > .img-pager { flex: 1 0 auto; }
/* 鎵嬫満涓婂繀椤绘槸"璐存鍦ㄥ睆骞曞簳"鐨勯€氭爮銆俿ticky 鍋氫笉鍒帮細姝ｆ枃婊氬埌搴曟椂椤甸潰鑷韩杩樻湁鍐呰竟璺濓紝
 * 缈婚〉鏉′細鍋滃湪绂昏鍙ｅ簳 ~59px 澶勶紙瀹炴祴锛夛紝鐢ㄦ埛鍥鹃噷灏辨槸"娴湪涓棿涓€鍧ㄣ€佷笅闈㈣繕闇茬潃鍐呭"銆? * 鏀?position:fixed 鈫?鏃犺椤甸潰闀跨煭閮界簿纭创搴曪紱鍐嶇粰 .reader-main 鐣欏嚭鍚岄珮鐨?padding-bottom锛? * 鍚﹀垯鏈€鍚庝竴寮犲崱浼氳鍘嬪湪缈婚〉鏉′笅闈㈢偣涓嶅埌銆傛闈紙>900px锛屾鏂囨槸 660px 绐勫垪锛変粛鐢?sticky锛? * 閫氭爮 fixed 浼氭í璺ㄦ暣灞忋€?*/
@media (max-width: 900px) {
  .reader-main { padding-bottom: calc(56px / var(--qb-zoom, 1)); }
  .reader-main .toc-pager { position: fixed; left: 0; right: 0; bottom: 0; margin: 0; }
  /* 2026-09-15 鏍瑰洜淇锛堢敤鎴凤細"绗笁寮犲唴瀹硅浠庝腑闂存埅鏂?锛夛細
   * 鍩虹瑙勫垯閲?`.book-text { max-height: 420px }`锛坈c-ui.css锛夋槸缁?鍗＄墖鍐呭祵涓€灏忓潡姝ｆ枃"
   * 鐢ㄧ殑锛涘叏鏂囦功闃呰椤靛鐢ㄤ簡鍚屼竴涓被锛岃€岃В闄や笂闄愮殑瑙勫垯鍙啓鍦?@media(min-width:901px) 閲?   * 鈬?鎵嬫満涓婃鏂囨案杩滃彧鏈?420px 楂橈紝鑰?.reader-main 鏈?~975px锛?*鍓╀笅鐨?480px 鍏ㄦ槸绌虹櫧**锛?   * 瑙嗚涓婂氨鏄?鍐呭琚粠涓棿鍒囨帀"銆傚疄娴?.book-text clientH=420 / scrollH=4149銆?   * 淇硶锛氱獎灞忓悓鏍疯В闄や笂闄愶紝骞惰瀹冧綔涓?flex 椤瑰～婊?.reader-main 鐨勫墿浣欓珮搴?   * 锛坢in-height:0 鎵嶈兘鏀剁缉鍒板鍣ㄩ珮锛岃秴鍑洪儴鍒嗕粛鐢辫嚜韬粴鍔紝搴曢儴缈婚〉鏉′笉鍔級銆?*/
  .book-reader .book-text { max-height: none; }
  .reader-main > .book-text { flex: 1 1 auto; min-height: 0; }
}
/* 闃呰鍣ㄥ浘鐗囬鐣欓珮搴︼細寮傛鍔犺浇涓嶅啀鎶婃鏂囬《璺?*/
.img-pager { display: grid; gap: 8px; }
.img-pager img[data-bookimg] {
  width: 100%; height: min(58vh, 600px);
  object-fit: contain; background: var(--surface-2); border-radius: 12px;
}
.book-text img[data-bimg] {
  width: 100%; min-height: 160px; object-fit: contain;
  background: var(--surface-2); border-radius: 8px;
}
/* 璺宠浆鐩爣鐣欏嚭椤舵爮楂樺害锛屼笉琚?sticky 宸ュ叿鏉＄洊浣?*/
.q-card, .cat-group { scroll-margin-top: calc(var(--header-h) + 76px); }
/* 绛旈椤靛崱鐗囩鐢?content-visibility 铏氭嫙鍖栵細浼扮畻楂樺害锛坕ntrinsic 120px锛変笌
 * 鐪熷疄鍗＄墖楂樺害宸嚑鐧?px锛屾瘡娆＄墿鍖栭兘鏀瑰彉鐩爣涓婃柟鎬婚珮搴︼紝閿氱偣姘歌繙瀵逛笉榻? * 锛堥鍙疯烦/涓婇/涓嬮涓夋绠楀嚭涓変釜浣嶇疆鐨勬牴鍥狅級銆傜瓟棰樺垪琛ㄤ粎鍑犲崄棰橈紝鍏ㄩ噺娓叉煋鎴愭湰鍙帴鍙椼€?*/
.exam-layout .q-card { content-visibility: visible; contain-intrinsic-size: auto; }

/* --- 绉戠洰椤碉細宸﹀叏鏍戣 + 鎶樺彔閽?+ 鍙冲崟灞傞棿璺濓紙鐐瑰嚮鍙樉闅?杩囨护锛屼笉閲嶆覆鏌擄級 --- */
.tree-line { display: flex; align-items: center; gap: 2px; }
.tree-line .tree-row { flex: 1; min-width: 0; width: auto; }
.tree-twisty { flex: 0 0 24px; width: 24px; height: 24px; display: grid; place-items: center; border: 0; background: transparent; color: var(--text-2); cursor: pointer; border-radius: 6px; padding: 0; }
.tree-twisty svg { width: 15px; height: 15px; }
.tree-twisty.closed svg { transform: rotate(-90deg); }
.tree-twisty:hover { background: var(--line); }
.tree-twisty-sp { flex: 0 0 24px; }
/* 宸︽爲椤惰鎮仠鍒囩锛氬叾瀹冪鐩钩鏃舵敹璧凤紝鎮仠椤惰鎵嶄笅鎷夛紙瑙﹀睆鏃犳偓鍋滐紝鐩存帴骞抽摵锛夛紱
 * 涓嬫媺璐磋瀹界旱鎺掞紝涓嶈秴鍑轰晶鏍忥紙渚ф爮 overflow-y:auto锛屾í鍚戜細琚锛夈€?*/
.tree-line[data-line="__top"] { position: relative; }
.sub-switch {
  display: none; position: absolute; top: 100%; left: 0; right: 0; z-index: 60;
  background: var(--surface); border: 1px solid var(--line); border-radius: 12px;
  box-shadow: var(--shadow-3); padding: 6px; flex-direction: column; gap: 2px; align-items: stretch;
}
.tree-line[data-line="__top"]:hover .sub-switch,
.tree-line[data-line="__top"]:focus-within .sub-switch { display: flex; }
.sub-switch:empty { display: none !important; }
.sub-switch .course-chip { max-width: none; justify-content: flex-start; }
@media (hover: none) {
  .sub-switch {
    display: flex; position: static; z-index: auto;
    background: transparent; border: 0; box-shadow: none; padding: 2px 0 0;
  }
}
.course-chip { display: inline-flex; align-items: center; gap: 6px; max-width: 260px; padding: 6px 14px; border: 1px solid var(--line); border-radius: 999px; background: var(--surface); color: var(--text-2); font-size: 13px; cursor: pointer; }
.course-chip .tree-ico { display: inline-flex; }
.course-chip .truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.course-chip.on { border-color: var(--brand-500); color: var(--brand-500); font-weight: 700; }
.course-chip:hover { border-color: var(--brand-300, #93b4f8); }
.tree-del { flex: 0 0 22px; width: 22px; height: 22px; display: grid; place-items: center; border: 0; background: transparent; color: var(--text-3); cursor: pointer; border-radius: 6px; padding: 0; }
.tree-del:hover { color: var(--err-500, #dc2626); background: var(--err-bg, rgba(220, 38, 38, .1)); }
.tree-del svg { width: 13px; height: 13px; }
/* 宸︽爲缂╄繘鎸傛暣琛岋細twisty 璺熻涓€璧疯繘锛屼竴浜岀骇涓嶅啀鎸ゅ湪宸︾紭閲嶅悎
 * 锛坧ages.css 鎶?--depth 绠楀湪 .tree-row 涓婏紝杩欓噷鏀瑰埌鏁磋锛涜鍐呭彧鐣?10px 搴曡竟璺濓級
 * 鍙虫娊灞夌鐩洰褰曞悓鏋勶紙2026-09-14 鐢ㄦ埛鍙嶉锛氱澶翠笉鑳芥尋鎴愪竴鍒楋紝澶氱骇灞曞紑瑕佽窡宸︽爲涓€鏍凤級锛? * .rdr-body 閲屽彧鏈夌鐩爲鎵嶆湁 .tree-line锛屼功鍐呭ぇ绾诧紙rtoc-*锛変笉鍙楀奖鍝?*/
.side-tree .tree-line, .rdr-body .tree-line { padding-left: calc(var(--depth, 0) * 16px); }
.side-tree .tree-line .tree-row, .rdr-body .tree-line .tree-row { padding-left: 10px; }
/* 宸︽爲琛?hover锛?026-09-15 鐢ㄦ埛锛?鏀句笂鍘诲嚭鐜板埆鐨勪功绫嶆牱寮忚繖涓お涓戜簡"锛夛細
 * pages.css 鐨?hover 鏄?surface-2锛堣繎鐧斤級+ 瀛楄壊璺?text-1 鈥斺€?鍦ㄦ祬绱簳涓婂氨鏄竴棰? * "鐧藉簳鑳跺泭"锛屽拰 .on 閫変腑涔︽湰鍑犱箮涓€涓牱銆傛敼鎴?*涓€т綆閫忔槑瑕嗙洊**锛堣窡闅忎富棰樻枃瀛楄壊锛? * 浜?鏆楅兘鎴愮珛锛夛紝瀛楄壊淇濇寔 text-2 涓嶆姠鐪硷紱.on 閫変腑鎬佷笉鍙楀奖鍝嶏紙:not(.on) 鎺掗櫎锛夈€?*/
.side-tree .tree-row:hover:not(.on),
.rdr-body .tree-row:hover:not(.on) {
  background: color-mix(in srgb, var(--text-1, #1f2937) 7%, transparent);
  color: var(--text-2);
}
/* 宸︽爲闈㈡澘涓庡彸鎶藉眽鍚屽簳鑹诧紙glass-strong锛夛細涓や晶 .tree-row:hover 鐢ㄥ悓涓€鍙橀噺锛? * 搴曚竴鑷?hover 瑙傛劅鎵嶄竴鑷达紙2026-09-14 鐢ㄦ埛鍙嶉锛歨over 宸﹁竟瑕佽窡鍙宠竟涓€鏍凤級 */
.side-tree.card {
  background: var(--glass-bg-strong, var(--surface)) !important;
  border: 1px solid var(--glass-line, var(--line)) !important;
}
/* 绔犺妭閰嶅浘鍏ㄩ儴闅愯棌锛堢敤鎴风‘璁ゅ浣欙級锛氬彧钘忚鍐呭浘 data-bimg锛堝叏鏂?鑳岃閲岀殑 fitz 鎻掑浘锛夛紝
 * SCAN 缈婚〉鍥?data-bookimg 涓嶅姩锛涘洖婊?鍒犳湰鏉°€傛暟鎹笉鍔ㄣ€?*/
.book-reader img[data-bimg] { display: none; }
/* 宸︽爲琛屽唴閲嶅懡鍚嶉挳锛氫笌 tree-del 鍚岃鏍硷紝鎮仠鍝佺墝鑹?*/
.tree-op { flex: 0 0 22px; width: 22px; height: 22px; display: grid; place-items: center; border: 0; background: transparent; color: var(--text-3); cursor: pointer; border-radius: 6px; padding: 0; }
.tree-op:hover { color: var(--brand-600, #2563eb); background: var(--brand-50, rgba(37, 99, 235, .1)); }
.tree-op svg { width: 13px; height: 13px; }
.cat-new-form .select { flex: 1 1 140px; min-width: 0; }
#bookList { display: grid; gap: 8px; align-content: start; scroll-margin-top: calc(var(--header-h) + 10px); }

/* --- 鑳岃绐楀眰绾э細缁勫ご > 鍗＄墖鏍囬 > 灏忔爣棰樻暎鍙?> 姝ｆ枃鏁ｅ彞 --- */


/* --- 涓婚〉鍞竴鐨?缁х画"锛氫笂娆″仛鍒扮殑棰橈紙鏁磋鍙偣锛宧over 鍙崲棰滆壊/闃村奖涓嶅姩浣嶏級 --- */
#resumeOne:empty { display: none; }
.resume-one {
  display: flex; align-items: center; gap: 12px;
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-lg);
  box-shadow: var(--shadow-1); padding: 12px 16px;
  cursor: pointer;
  transition: border-color var(--t-fast), box-shadow var(--t-fast), background var(--t-fast);
}
.resume-one:hover { border-color: var(--line-strong); box-shadow: var(--shadow-2); background: var(--surface-2); }
.resume-one:focus-visible { outline: 2px solid var(--brand-400, #6b9bf7); outline-offset: 2px; }
.resume-one-ico {
  flex: 0 0 34px; width: 34px; height: 34px; border-radius: 11px;
  display: grid; place-items: center;
  background: var(--brand-500, #3b82f6); color: #fff;
}
.resume-one-ico svg { width: 17px; height: 17px; }
.resume-one-main { flex: 1; min-width: 0; }
.resume-one-title { font-weight: 700; font-size: 14px; }

/* --- 澶х翰琛岄€変腑鎬侊紙2026-09-14 缁熶竴锛夛細涓庣鐩爲涓€鑷寸殑銆岃摑瀛楁祬钃濆渾瑙掕兌鍥娿€嶏紝
 * 涓嶅啀鐢ㄥ唴渚ф寚绀烘潯锛堢敤鎴风偣鍚嶆墍鏈夐€変腑鏁堟灉瀵归綈鍥?鍙虫爲鏍峰紡锛?--- */
.rtoc-row.on {
  background: var(--brand-50, rgba(37, 99, 235, .1));
  color: var(--brand-600, #2563eb);
}

/* --- 绛旈椤电洰褰曡创鍙冲仠闈狅紙妗岄潰绔紝鐢ㄦ埛瑕佹眰浠庡乏渚ф惉杩囨潵锛夛細鐩綍 fixed 鍚镐綇瑙嗗彛鍙崇紭鍏ㄩ珮锛? * 涓诲尯鍙宠 254px锛涘唴瀹瑰彧婊氫富鍖恒€傜Щ鍔ㄧ淇濇寔鍘?static 缁撴瀯銆?--- */
@media (min-width: 901px) {
  .exam-layout.has-toc { display: block; max-width: none; margin: 0; }
  .exam-layout.has-toc .exam-side {
    position: fixed; left: auto; right: 0; top: var(--header-h); bottom: 0;
    width: 236px; height: auto; max-height: none; margin-left: 0;
    border-right: 0; border-top: 0;
    border-radius: 14px 0 0 0; z-index: 40;
  }
  .exam-layout.has-toc .exam-wrap { margin-left: 0; margin-right: 254px; }
}
/* 椤舵爮鏀惰捣鍚庣瓟棰樼洰褰曞悓鏍蜂笂鎻愶紙2026-09-13 鐢ㄦ埛鍙嶉锛夛細妗岄潰 fixed 瑙勫垯鏄笁绫婚€夋嫨鍣紝
 * 鍘熷厛 body.topauto 浜岀被鍘嬩笉浣忥紝鐩綍涓€鐩存偓鍦?66px銆傝繖閲屾彁鍒板洓绫伙紱椤舵爮涓€寰嬪彔鍔狅紝涓嶅啀鍥炶惤銆?*/
body.topauto .exam-layout.has-toc .exam-side { top: 12px; }

/* ============================================================
 * 鏍囬 / 鐩綍灞傜骇寮哄寲锛?026-09-13 鐢ㄦ埛鍙嶉锛歮d 鍒嗘爣棰樸€佹枃浠剁洰褰曟爣棰樹笉鏄剧溂锛? * 鍙寮哄瓧鍙仿峰瓧閲嵚烽鑹猜峰乏渚у眰绾ф潯锛屼笉鍔ㄤ换浣曠粨鏋勶紱璧?var token锛岀櫧澶?褰遍櫌鑷€傚簲銆? * 鍥炴粴 = 鏁村潡鍒犻櫎銆? * ============================================================ */

/* ---- 姝ｆ枃 markdown 鏍囬锛氱珷(h1) > 鑺?h2) > 涓€銆?鐭ヨ瘑鐐?h3) > h4锛屼竴鐪煎垎灞?---- */
.book-text .md-h1, .reader-main .md-h1, .md-h1 {
  font-size: 20px; font-weight: 800; line-height: 1.35; letter-spacing: -.01em;
  color: var(--text-1); margin: 22px 0 11px; padding-left: 11px;
  border-left: 4px solid var(--brand-500, #3b82f6);
}
.book-text .md-h2, .reader-main .md-h2, .md-h2 {
  font-size: 17px; font-weight: 800; line-height: 1.35; letter-spacing: -.01em;
  color: var(--text-1); margin: 17px 0 9px; padding-left: 10px;
  border-left: 3px solid var(--brand-500, #3b82f6);
}
.book-text .md-h3, .reader-main .md-h3, .md-h3 {
  font-size: 15px; font-weight: 700; line-height: 1.4;
  color: var(--brand-600, #2563eb); margin: 14px 0 7px; padding-left: 9px;
  border-left: 3px solid var(--brand-300, #93b4fb);
}
.book-text .md-h4, .reader-main .md-h4, .md-h4 {
  font-size: 14px; font-weight: 700; color: var(--text-1); margin: 12px 0 6px; padding-left: 9px;
  border-left: 2px solid var(--brand-200, #c7d7fe);
}
.md-h1:first-child, .md-h2:first-child, .md-h3:first-child { margin-top: 4px; }

/* ---- 鑳岃/鍏ㄦ枃鍒嗙粍澶?kp-group-head 鎸?lv 鍒嗙骇 ---- */
.kp-group-head.lv1 { font-size: 16px; font-weight: 800; border-left-width: 4px; padding-left: 11px; }
.kp-group-head.lv2 { font-size: 14.5px; font-weight: 800; }
.kp-group-head.lv3 { font-size: 13px; font-weight: 700; }

/* ---- 闃呰鍣ㄥ唴宸﹀ぇ绾?reader-toc锛氱珷鑺傜粍澶?/ 鏉＄洰鎸夊眰绾у垎绾э紝閫変腑椤规洿閱掔洰 ---- */
.book-reader .reader-toc .rtoc-group.lv1 { font-size: 13.5px; font-weight: 800; color: var(--text-1); padding-top: 9px; letter-spacing: 0; }
.book-reader .reader-toc .rtoc-group.lv2 { font-size: 12.5px; font-weight: 750; color: var(--text-1); }
.book-reader .reader-toc .rtoc-group.lv3 { font-size: 12px; font-weight: 700; color: var(--text-2); }
.book-reader .reader-toc .rtoc-row.lv1 { font-size: 13px; font-weight: 700; color: var(--text-1); padding-left: 8px; }
.book-reader .reader-toc .rtoc-row.lv2 { font-size: 12.5px; font-weight: 600; color: var(--text-2); padding-left: 20px; }
.book-reader .reader-toc .rtoc-row.lv3 { font-size: 11.5px; color: var(--text-3); padding-left: 32px; line-height: 1.45; }
.book-reader .reader-toc .rtoc-row.on {
  color: var(--brand-700, #1d4ed8); background: var(--brand-50, rgba(37, 99, 235, .1));
  box-shadow: inset 3px 0 0 var(--brand-500, #3b82f6);
}

/* 鍙崇紭澶х翰鎶藉眽 reader-drawer锛氱珷/鑺?鐭ヨ瘑鐐瑰悓鏍蜂笁绾х缉杩?+ 瀛楅噸姊害锛堝乏鏍忓凡闅愯棌锛岀洰褰曞疄闄呭湪杩欓噷鐪嬶級 */
.reader-drawer .rdr-body .rtoc-group.lv1 { font-size: 13.5px; font-weight: 800; color: var(--text-1); padding-top: 8px; }
.reader-drawer .rdr-body .rtoc-row.lv1 { font-size: 13px; font-weight: 700; color: var(--text-1); padding-left: 8px; }
.reader-drawer .rdr-body .rtoc-row.lv2 { font-size: 12.5px; font-weight: 600; color: var(--text-2); padding-left: 20px; }
.reader-drawer .rdr-body .rtoc-row.lv3 { font-size: 11.5px; color: var(--text-3); padding-left: 32px; line-height: 1.45; }
.reader-drawer .rdr-body .rtoc-row.on {
  color: var(--brand-600, #2563eb); background: var(--brand-50, rgba(37, 99, 235, .1));
}

/* ---- 绉戠洰宸︽爲 side-tree锛氭牴/鍒嗙粍鏇撮噸锛涢€変腑琛?= 涓庡彸鎶藉眽涓€鑷寸殑娴呰摑鑳跺泭锛堟棤鎸囩ず鏉★級 ---- */
.side-tree .tree-row.tree-root { font-size: 13.5px; font-weight: 800; }
.side-tree .tree-row.on {
  background: var(--brand-50, rgba(37, 99, 235, .1));
  color: var(--brand-600, #2563eb);
}
.side-tree .tree-row.on .tree-label { color: var(--brand-600, #2563eb); }


/* ============================================================
 * 鍋氶妯″紡鍒囨崲锛堢粌涔?/ 鍒烽锛? 鍒烽缁熻鏉?鈥斺€?2026-09-14 鐢ㄦ埛鏂板
 * 浣嶇疆锛氱瓟棰橀〉鍙充晶闈㈡澘锛堟闈㈢ exam-side 鍋滈潬鍙崇紭锛夐《閮紝杩涘害鏉′笅鏂广€? * 鍥炴粴 = 鏁村潡鍒犻櫎锛坋xam.js 閲?#modeSeg / .drill-report 涓€骞舵挙锛夈€? * ============================================================ */
.exam-side-mode { display: flex; }
.exam-side-mode .mode-seg { width: 100%; }
.mode-seg button { flex: 1 1 0; min-width: 0; padding: 6px 4px; font-size: 12.5px; }
.mode-seg button svg { width: 14px; height: 14px; flex: 0 0 auto; }
.mode-seg button[data-mode="drill"].on {
  color: var(--brand-700, #1d4ed8);
  box-shadow: var(--shadow-1), inset 0 0 0 1px var(--brand-300, #93c5fd);
}
/* Exam infinite window (pagination removed 2026-09-17; sentinel 2px placeholder kept). */
.exam-sentinel { height: 2px; overflow: hidden; }
.exam-side-mode { flex-direction: column; gap: 6px; }
/* 閫€鍑哄埛棰樻ā寮忔椂鎻掑埌棰樼洰鍒楄〃椤堕儴鐨勬纭巼鏉?*/
.drill-report {
  display: flex; align-items: center; gap: 8px;
  margin: 0 0 12px; padding: 10px 14px; border-radius: 12px;
  font-size: 13.5px; font-weight: 750;
  color: var(--ok-700, #15803d);
  background: rgba(34, 160, 107, .12);
  border: 1px solid var(--ok-500, #22a06b);
}
.drill-report svg { width: 16px; height: 16px; flex: 0 0 auto; }

/* ============================================================
 * hover 鍙嶉琛ラ綈锛?026-09-14 鐢ㄦ埛瑕佹眰锛夛細棰樺簱/鑳屼功鍗＄瓑宸︽爮瀵艰埅銆? * 鎺屾彙搴︿笁鎬侊紙鎺屾彙/妯＄硦/涓嶄細锛夈€佸彸闈㈡澘鎺屾彙绛涢€夈€佺粌涔?鍒烽妯″紡閽€? * 鍘熷厛 nav 鍙湁 surface-2 搴曡壊锛堟繁鑹蹭富棰樹笅鍑犱箮鐪嬩笉瑙侊級銆乻eg 鍙湁鍙樺瓧鑹层€? * 鍥炴粴 = 鏁村潡鍒犻櫎銆? * ============================================================ */
.nav-item { transition: background var(--t-fast), color var(--t-fast); }
/* 2026-09-14 鐢ㄦ埛浜屾鍙嶉锛歨over 涓嶈钃濆簳鎻忚竟妗嗭紙"涓戠殑瑕佸懡"锛夛紝灞曞紑鎬佸彧缁?surface-3 搴曪紱
 * 鍥炬爣杞紙鈮?61px锛岃涓婃柟鍥炬爣杞ㄥ潡锛夊畬鍏ㄦ棤搴曡壊锛宧over 鍙彁浜浘鏍囨湰浣撱€?*/
.nav-item:hover {
  background: var(--surface-3);
  color: var(--text-1);
}
/* 鎺屾彙搴︿笁鎬侊紙绛旈鍗″唴 m-seg / 鍙抽潰鏉?m-filter / 妯″紡鍒囨崲 mode-seg 鍚屾棌锛? * 2026-09-14锛氬悓鏍烽棬鎺у湪 (hover:hover) 鈥斺€?瑙﹀睆绮樻粸 hover 浼氱洊浣?.on 閫変腑鎬?*/
.m-seg button, .m-filter button, .mode-seg button { transition: background var(--t-fast), color var(--t-fast), box-shadow var(--t-fast); }
@media (hover: hover) {
  .m-seg button:hover,
  .m-filter button:hover,
  .mode-seg button:hover {
    background: var(--brand-50, rgba(59, 130, 246, .12));
    color: var(--text-1);
    box-shadow: inset 0 0 0 1px var(--brand-300, #93c5fd);
  }
  .m-seg button[data-lv="PROFICIENT"]:hover { color: var(--ok-600, #16a34a); box-shadow: inset 0 0 0 1px var(--ok-500, #22a06b); }
  .m-seg button[data-lv="FUZZY"]:hover { color: var(--warn-600, #d97706); box-shadow: inset 0 0 0 1px var(--warn-500, #f59e0b); }
  .m-seg button[data-lv="UNKNOWN"]:hover { color: var(--err-600, #dc2626); box-shadow: inset 0 0 0 1px var(--err-500, #ef4444); }
}

/* ---------- 婊氬姩鏈熸姂鍒惰繃娓★紙2026-09-14 鎬ц兘娌荤悊锛?----------
 * 鏈虹悊锛氬唴瀹瑰湪"闈欐鎸囬拡"涓嬫粴鍔ㄦ椂浼氫笉鏂繘鍑?:hover锛岃Е鍙?background/box-shadow/border-color
 * 杩囨浮鍔ㄧ敾 鈫?姣忕鏁板崄娆￠噸缁樸€傛暣鍗?93 鍗?脳 鏁板崄涓繃娓″厓绱犳椂锛孋DP trace 瀹炴祴婊氬姩鏈? * Paint 1018ms / GPUtask 1809ms锛涗氦閿?A/B 涓夋涓綅甯ф椂闀?16.7ms 鈫?8.3ms锛堢害 2 鍊嶏級銆? * app.js 鍦ㄦ粴鍔ㄥ紑濮嬬粰 body 鍔?.qb-scrolling锛坮AF 鍚堝苟锛夛紝鍋滄 160ms 鍚庢憳鎺夈€? * 鍙竻闆?duration锛堜繚鐣欒繃娓″畾涔夛級锛岀┖闂叉椂瑙傛劅瀹屽叏涓嶅彉锛涙粴鍔ㄦ湡杩囨浮鐬椂鍒颁綅銆? * 娉紙2026-09-14 浜岃疆锛屽凡瀹為獙鍚﹀喅锛夛細鏇惧彟鍔犱竴缁?`body.qb-scrolling .q-card{box-shadow:...!important}`
 * + 鎮诞灞傚幓 backdrop-filter銆傚悓椤甸厤瀵?A/B锛坅b-fixc.cjs锛屾墜鏈?cinema 5 杞級娴嬪緱 paint 971.5鈫?91.2
 * (+2%)銆丱N 鏇寸渷鐨勮疆娆?2/5銆佷腑浣嶅抚鏃堕暱涓よ€呴兘鏄?20.8ms 鈥斺€?鏃犲彲娴嬫敹鐩婏紝涓?!important 瑕嗗啓闃村奖浼氬湪
 * 婊氬姩璧锋澶氫竴娆℃牱寮忛噸绠椼€傛晠绉婚櫎锛屽嬁鍐嶅姞鍥炪€?*/
body.qb-scrolling * { transition-duration: 0s !important; }

/* ============================================================
 * 绛旈椤垫粴鍔ㄦ姈鍔ㄦ牴娌伙紙2026-09-14 鐢ㄦ埛锛氫笅涓€棰樿交寰姈銆佺偣ABCD鍋跺皵鍓ф姈锛? * 鏍瑰洜锛欳hrome 榛樿瀵规枃妗ｆ粴鍔ㄥ鍣ㄥ紑鍚?scroll anchoring 鈥斺€?绛旀闈㈡澘灞曞紑/鏀惰捣銆? * clearFeedback 鏀惰蛋涓婁竴棰樿В鏋愮瓑涓€鍒囬珮搴︾獊鍙橈紝浼氳娴忚鍣ㄨ嚜鍔ㄨˉ鎷?scrollY锛? * 涓庢垜浠嚜鏍℃鐨?scrollToCard锛堥噺鈫掓粴鈫掑啀閲忊啋鍐嶈ˉ锛夊弽鍚戞媺鎵細
 * 涓嬩竴棰?灏忓箙鍥炶烦锛涚偣閫夐」瑙﹀彂绛旀灞曞紑=閿氱偣鑺傜偣閲嶉€夌灛闂寸殑鍓х儓璺冲姩銆? * 淇锛氱瓟棰橀〉鏄惧紡鍏抽棴 scroll anchoring锛屾粴鍔ㄥ畬鍏ㄧ敱绋嬪簭鎺ョ銆? * 鍥炴粴 = 鍒犻櫎鏈潡锛坰crollToCard 鐨勮嚜鏍℃浠嶅彲鐙珛宸ヤ綔锛夈€? * ============================================================ */
.exam-wrap, #questionList { overflow-anchor: none; }
.exam-wrap .q-card, #questionList .q-card { overflow-anchor: none; }

/* ============================================================
 * 鍥炲埌椤堕儴 FAB锛?026-09-14 鐢ㄦ埛瑕佹眰"璁╂墜鏈鸿兘浣跨敤"锛? * 瑙﹀睆娌℃湁 Home 閿?婊氳疆锛岄暱鍗峰洖椤跺彧鑳界媯婊戯紱鍙充笅瑙掓偓娴寜閽殢婊氬姩鏄鹃殣銆? * 瀹氫綅閬垮紑宸叉湁鍥哄畾灞傦細宸︿笅 `.exam-floatnav`(z60)銆佸彸缂樼儹鍖?`.rdr-hot`(z65)銆? * 鍙崇紭绔栫 `#rdrRail`/宸︾紭 `#treeRail`(z65/66)銆佸彸鎶藉眽 `.reader-drawer`(z70)銆? * z-index 68 鍙帇杩囩儹鍖?绔栫 鈥斺€?鎶藉眽灞曞紑鏃跺睘妯℃€侊紝FAB 璁╀綅涓嶇浜嬨€? * 瑙﹀睆鏃?:hover锛屾寜鍘嬪弽棣堢敤 :active锛沨over:none 涓嬪姞澶у懡涓尯鍒?50px銆? * ============================================================ */
#backToTop {
  position: fixed; right: 14px; bottom: 18px; z-index: 68;
  width: 46px; height: 46px; border-radius: 50%;
  display: grid; place-items: center; padding: 0;
  /* 娣辫壊褰遍櫌涓婚涓嬪師鏉ョ殑 --glass-bg-strong 鍑犱箮铻嶈繘鑳屾櫙锛?鏈夎繖涓寜閽?閮界湅涓嶅嚭鏉?   * 锛?026-09-14 鐢ㄦ埛锛?杩樻槸娌℃湁鍒伴《閮ㄥ姛鑳?锛夈€傛敼鎴愭洿瀹炵殑闈㈡澘鑹?+ 鏇村己鐨勬弿杈癸紝涓€鐪煎彲杈ㄣ€?*/
  border: 1px solid var(--line-strong, var(--line));
  background: var(--surface-2, var(--glass-bg-strong, var(--surface)));
  -webkit-backdrop-filter: blur(14px) saturate(1.3); backdrop-filter: blur(14px) saturate(1.3);
  color: var(--text-1); cursor: pointer;
  box-shadow: var(--shadow-2);
  opacity: 0; visibility: hidden; transform: translateY(10px) scale(.92);
  transition: opacity .18s ease, transform .18s ease, visibility .18s;
  -webkit-tap-highlight-color: transparent; touch-action: manipulation;
}
#backToTop > svg { width: 22px; height: 22px; }
#backToTop.show { opacity: 1; visibility: visible; transform: none; }
#backToTop:active { transform: scale(.94); }
@media (hover: none) {
  #backToTop { width: 50px; height: 50px; right: 12px; bottom: 16px; }
}

/* ============================================================
 * 瑙﹀睆鍏滃簳锛氶《鏍忕粷涓嶈兘鍦ㄦ棤鎮仠璁惧涓?鑷姩闅愯棌"锛?026-09-14 鐢ㄦ埛锛?鎵嬫満绔繕鏄病鏈夐偅涓《绔?锛? * 瑙﹀睆娌℃湁 hover锛歵opauto 涓€鏃︽寕涓婏紝椤舵爮琚?translateY(-105%) 鏀惰捣灏卞啀涔熷敜涓嶅洖鏉ワ紝
 * 鑿滃崟/鎼滅储/涓婚/璇█/閫€鍑哄叏閮ㄦ秷澶憋紙= 鐢ㄦ埛璇寸殑"寰堝鍔熻兘娌℃硶鏄剧ず"锛夈€? * app.js 宸叉敼涓?鐪熼紶鏍囨墠 arm銆佷竴 touchstart 灏辨憳"锛涜繖閲屽啀鍏滀竴灞傗€斺€斿彧瑕佽澶囩‘瀹炴姤
 * (hover:none)锛屾棤璁?topauto 鏄惁琚鎸傦紝椤舵爮涓€寰?sticky 甯告樉锛岄《缂樼儹鍖轰笉鍐嶅崰浣嶃€? * ============================================================ */
@media (hover: none) {
  body.topauto .topbar { position: sticky; top: 0; transform: none; }
  body.topauto .top-hot { display: none; }
}

/* ============================================================
 * 瑙﹀睆缈婚鏉℃樉闅?+ 瑙︽帶灏哄锛?026-09-14 鐢ㄦ埛锛?涓嬩竴棰樹竴婊氬氨娌′簡"锛? * 妗岄潰宸︽爮 .exam-side 鏄?fixed 甯搁┗ 鈫?缈婚鎸夐挳涓€鐩村湪锛涙墜鏈哄乏鏍?static 闅忓唴瀹规粴璧帮紝
 * 浜庢槸"涓嬩竴棰?澶熶笉鐫€銆傝繖鏉℃偓娴炕棰樻潯鍙湪 鈮?00px 鍑虹幇锛堝鐢ㄦ棦鏈?.exam-floatnav / .fnav-btn锛夈€? * 浣嶇疆宸︿笅瑙掞紝涓庡彸涓嬭 #backToTop 鍒嗗垪涓よ锛屼簰涓嶉噸鍙犮€? * ============================================================ */
@media (min-width: 901px) { .exam-floatnav { display: none !important; } }
@media (max-width: 900px) {
  .exam-floatnav { z-index: 67; left: 12px; bottom: 14px; gap: 6px; padding: 6px 8px; }
  .exam-floatnav .fnav-btn { padding: 9px 13px; font-size: 13.5px; }
  .exam-floatnav .fnav-btn:active:not(:disabled) { transform: scale(.95); }
  /* 搴曢儴鐣欑櫧锛氭渶鍚庝竴寮犻鍗′笉琚偓娴潯鍘嬩綇 */
  .exam-layout { padding-bottom: 68px; }
}

/* ============================================================
 * 鎵嬫満绔揣鍑戝寲锛?026-09-14 鐢ㄦ埛锛?鎵嬫満妗嗘牸 UI 澶ぇ瀵艰嚧鍐呭,鎴栬€呴鐩竴棰樻棤娉曞畬鏁存樉绀?锛? * 绔栧睆绌洪棿琚?娴忚鍣ㄦ爮 + 椤舵爮 66 + 宸︽爮鍧?220 + 鎮诞鏉?+ 搴曢儴鐣欑櫧"鍚冩帀澶у崐锛屼竴閬撻鏀句笉涓嬨€? * 鍙湪灏忓睆鏀剁揣锛堝乏鏍忓潡楂樺害/鍐呰竟璺?琛岃窛銆侀鍙锋牸鏇村瘑锛夛紱妗岄潰涓€寰嬩笉鍔ㄣ€? * ============================================================ */
@media (max-width: 900px) {
  /* 宸︽爮鍧?220 鈫?116px锛氶鍨?绔犺妭鍒楄〃鏀逛负鍧楀唴婊氬姩锛屾妸绔栧睆璁╃粰棰樼洰姝ｆ枃 */
  .exam-side { max-height: 116px; }
  .exam-side-top { gap: 5px; padding: 5px 6px 7px; margin-bottom: 3px; }
  .exam-side-title { font-size: 12.5px; line-height: 1.35; }
  /* 棰樺彿鏍?5 鍒?鈫?7 鍒楋紙鏇村瘑銆佹暣鍧楁洿鐭級 */
  .tree-sub-grid { grid-template-columns: repeat(7, minmax(0, 1fr)); padding: 4px 6px 7px 14px; }
  .qno-chip { height: 23px; }
  /* 宸︽爮鍧楀唴鐨勪笂涓嬮涓庢偓娴潯閲嶅锛氬睆涓婂彧鐣欐偓娴潯涓€浠斤紝鐪佹帀 44px 楂樼殑閭ｈ */
  .exam-side .exam-side-nav { display: none; }
  /* 宸︽爮鍧?鈫?姝ｆ枃涔嬮棿鐨勬爡鏍奸棿璺?18 鈫?10px */
  .exam-layout.has-toc { gap: 10px; }
  /* 姝ｆ枃瀹瑰櫒涓婁笅鍐呰竟璺濇敹绱э紙棰樺崱涓婃柟澶氬嚭鐨勯偅 32px 閲屾湁瀹冧竴浠斤級 */
  .exam-wrap { padding-top: 4px; }
  #questionList { padding-top: 2px; }
}

/* 绐勫睆鑳岃鍗★細棰樺共涓嶅啀琚?鎺屾彙/妯＄硦/涓嶄細"鎸ゆ垚绐勬煴鈥斺€旀爣棰樼嫭鍗犳暣琛岋紝鏍囪琛岃惤鍒颁笅涓€琛?*/
@media (max-width: 640px) {
  .kp-card > summary { flex-wrap: wrap; align-items: flex-start; row-gap: 8px; }
  .kp-card > summary .kp-q { flex: 1 1 100%; }
  .kp-card > summary .bseg { margin-left: auto; }
}

/* ============================================================
 * 鎵嬫満绔?涓€棰樹竴灞?绱у噾鍖栵紙2026-09-14 鐢ㄦ埛锛?棰樼洰 UI 杩樻槸寰堝ぇ锛屼竴棰樺姞涓婃樉绀虹瓟妗堟樉绀轰笉鍏?锛? * 鍙缉鍐呰竟璺?琛岃窛/鍦嗚鍗婂緞/姝ｆ枃瀛楀彿锛屼笉鍔ㄤ换浣曢€昏緫锛涙闈㈠畬鍏ㄤ笉鍔ㄣ€? * 鐩爣锛氭妸"棰樺共 + 4 閫夐」 + 灞曞紑鐨勬爣鍑嗙瓟妗?瑙ｆ瀽"鍘嬭繘涓€灞忋€? * ============================================================ */
@media (max-width: 640px) {
  .q-card { padding: 12px 12px 10px; margin-bottom: 9px; border-radius: 14px; }
  .q-head { gap: 8px; margin-bottom: 9px; }
  .q-no { flex: 0 0 25px; height: 25px; border-radius: 8px; font-size: 12px; }
  .q-prompt { font-size: 14px; line-height: 1.48; padding-top: 1px; }
  .q-score { padding: 2px 7px; font-size: 10.5px; margin-top: 2px; }
  .opt { padding: 8px 10px; gap: 8px; margin-bottom: 5px; border-radius: 10px; }
  .opt:last-child { margin-bottom: 0; }
  .opt-key { flex: 0 0 20px; height: 20px; border-radius: 7px; font-size: 11px; }
  .opt-text { padding-top: 1px; line-height: 1.42; }
  .q-foot { margin-top: 8px; gap: 6px; }
  /* 灞曞紑鐨勭瓟妗?瑙ｆ瀽锛氭敹绱ц竟璺濅笌琛岃窛锛堝師鏉ユ部鐢ㄦ闈?11/14px 鍐呰竟璺?+ 1.75 琛岃窛锛屽緢鍗犻珮锛?*/
  .q-answer, .q-answer-wrap { margin-top: 7px; }
  .q-answer .exp, .q-answer-wrap .exp { margin-top: 8px; padding: 8px 10px 9px; font-size: 12px; line-height: 1.55; }
  .q-answer .exp b { font-size: 11.5px; margin-bottom: 2px; }
}

/* 瑙﹀睆锛氬洖椤堕挳鎶珮銆傛墜鏈烘祻瑙堝櫒澶氫负搴曢儴宸ュ叿鏍忥紝`position:fixed` 鏄寜 layout viewport 瀹氫綅鐨勶紝
 * bottom:16 閭ｄ竴甯﹀父琚伐鍏锋爮/鎵嬪娍鏉＄洊浣忥紙鐢ㄦ埛锛?鍥炲埌椤堕儴娌′簡"锛夈€傛姮鍒?76px + 瀹夊叏鍖猴紝
 * 涓庡乏涓嬭缈婚鏉″垎灞傦紙涓よ€呭垎鍒楀乏鍙筹紝涓嶉噸鍙狅級銆?*/
@media (hover: none) {
  #backToTop { bottom: calc(76px + env(safe-area-inset-bottom, 0px)); }
}

/* ============================================================
 * 绉诲姩/骞虫澘涓撻」锛?026-09-14 sweep锛歰utput/mobile-sweep-{phone,tablet}.log + output/shots-m/*锛? * ============================================================ */
/* 1) 瑙﹀睆锛氬彸缂?30px 鎮仠鐑尯涓嶅啀鎷︽埅鐐瑰嚮锛堣Е灞忔棤鎮仠锛岀儹鍖哄彧鍓╁壇浣滅敤鈥斺€? *    鐩栦綇姝ｆ枃鍙崇紭 30px 鐨勭偣鎸夛紱绔栫鏄叾瀛愬厓绱狅紝鏄惧紡鎭㈠鍙偣锛?*/
@media (hover: none) {
  .rdr-hot { pointer-events: none; }
  /* 2026-09-14 绔栫 `#rdrRail` 鎸夎姹傛挙涓嬪悗锛岃Е灞忕殑澶х翰鍏ュ彛鏀规寕鍦ㄨ繖閲岋細
   * 缁?`.rdr-hot` 鍔犱竴鍧?*涓嶅彲瑙?*鐨勭偣鎸夊尯锛岀偣瀹冿紳寮€鍚堝綋鍓嶆娊灞夛紙鐐瑰嚮浜嬩欢鐢变吉鍏冪礌鍐掓场鍒?   * `#rdrHot`锛岃 subjects.js 鐨?hot click锛夈€?   * 2026-09-15 鐢ㄦ埛鎶?鐐瑰嚮涓嶆樉绀烘垜鐨勫ぇ绾茬洰褰?鈫?瀹炴祴鏃х偣鎸夊尯鍙湁鍙崇紭鍨傜洿灞呬腑 24脳96
   * 锛?6 缂╂斁鍚庝粎 72 璁惧 px锛夛紝鍦?25% / 40% / 60% 楂樺害鐐逛笂鍘诲懡涓殑閮芥槸 MAIN.content锛?   * **鐐圭┖鏄父鎬?*銆傛敼涓鸿鐩栧彸缂樹腑閮?56% 楂樺害锛坱op/bottom 鍚勮 22%锛氫笂鏂归伩寮€椤舵爮銆?   * 涓嬫柟閬垮紑鍥為《閽笌缈婚〉鏉★級锛屽 26銆傜獎鏉★紙26 缂╂斁鍚?鈮?0 璁惧 px锛変笉纰嶆鏂囬槄璇汇€?*/
  .rdr-hot::before {
    content: ""; position: absolute; right: 0; top: 22%; bottom: 22%;
    width: 26px; pointer-events: auto;
  }
  /* 鐢ㄦ埛锛?鍙宠竟涔嬪墠鐑嚭鐜扮殑鍏夋潯閮戒笉瑙佷簡" 鈫?瑙﹀睆娌℃湁 hover 鍔犳垚锛岄潤鎬?.45/3px 鍦ㄦ祬鑹插簳涓?   * 鍑犱箮鐪嬩笉瑙併€傝Е灞忎笅鍔犵矖鎻愪寒鍒?4px/.6锛岃瀹冪ǔ瀹氬厖褰?杩欓噷鏈夊叆鍙?鐨勬彁绀恒€?*/
  .rdr-hot::after { width: 4px; height: 88px; opacity: .6; }
  #rdrRail { pointer-events: auto; }
}
/* 2) 鎵嬫満/骞虫澘绔栫鐦﹁韩鍗婇€忔槑锛?6x64 瀹炲績鍧楀帇鍦ㄦ鏂囦腑闂村お閲嶏紙phone-03/06锛?*/
@media (max-width: 900px) {
  #treeRail { width: 20px; height: 46px; opacity: .7; }
  #treeRail svg { width: 12px; height: 12px; }
}
@media (hover: none) and (max-width: 900px) {
  #rdrRail { width: 20px; height: 46px; opacity: .7; }
  #rdrRail svg { width: 12px; height: 12px; }
}
/* 3) 鎵嬫満鎶藉眽涓嶉€忔槑锛氬奖闄?--surface 鏄?rgba(...,.78) 鐜荤拑锛屽睍寮€鐨勫ぇ绾蹭笌姝ｆ枃閫忓瓧閲嶅彔锛坧hone-05锛?*/
@media (max-width: 860px) {
  .reader-drawer.force-open { background: var(--surface); }
  [data-theme="cinema"] .reader-drawer.force-open { background: #151d33; }
}
/* 4) 瑙︾偣鎵╁锛堝彧鎵╃儹鍖轰笉鍔ㄥ竷灞€锛夛細鏍?澶х翰鎶樺彔閽笌棰樺彿绛捐Е灞忎笅 <26px锛坰weep tinyTargets锛?*/
@media (pointer: coarse) {
  .tree-twisty, .rtoc-twisty, .qno-chip { position: relative; }
  .tree-twisty::before { content: ""; position: absolute; inset: -10px -7px; }
  .rtoc-twisty::before { content: ""; position: absolute; inset: -12px -8px; }
  .qno-chip::before { content: ""; position: absolute; inset: -7px 0; }
}
/* 5) 瑙﹀睆绉戠洰椤惰鎹㈣锛歴ub-switch 瑙﹀睆鏄?static 鍒楋紝浼氭妸绉戠洰鍚嶆尋鎴愮渷鐣ュ彿锛坧hone-02锛?*/
@media (hover: none) {
  .tree-line[data-line="__top"] { flex-wrap: wrap; }
  .tree-line[data-line="__top"] .sub-switch { flex: 1 1 100%; }
}
/* 6) 鎵嬫満 toast 閬垮紑椤舵爮锛歵oast-zone 榛樿 top:18px right:18px锛屾濂藉帇浣忚繑鍥?鎼滅储鎸夐挳锛坧hone-10锛?*/
@media (max-width: 640px) {
  .toast-zone { top: calc(var(--header-h, 64px) + 10px); left: 12px; right: 12px; width: auto; }
}
/* 7) 鎵嬫満鑳岃鍗″ご鎹㈣锛氭帉鎻?妯＄硦/涓嶄細鎸夐挳缁勪笉鍐嶆尋鍘嬩袱琛屾爣棰橈紙phone-06锛?*/
@media (max-width: 640px) {
  .kp-card > summary { flex-wrap: wrap; row-gap: 8px; }
  /* 2026-09-14 鐢ㄦ埛鍥?锛?鎺掔増鏈夐棶棰?鈥斺€斾笂涓€鐗堝啓 flex:1 1 100%锛屾妸涓夐挳瀹瑰櫒鎾戞垚**鏁磋瀹?*锛?   * 涓€鏁存潯鐏板簳绌烘澘鍙负鎶婃寜閽尋鍒板彸杈癸紙瀹炴祴 298/326 = 91%锛夈€傛敼涓烘寜鍐呭瀹斤紙0 0 auto锛?   * + margin-left:auto 闈犲彸锛氭崲琛屽悗鏄竴鏉″悎韬殑鑳跺泭锛屼笉鍐嶆湁鍗婅绌虹櫧銆?*/
  .kp-card > summary .bseg { flex: 0 0 auto; margin-left: auto; justify-content: flex-end; }
}

/* ============================================================
 * 鎵嬫満绔富椤?绉戠洰椤靛疄娴嬩慨澶嶏紙2026-09-14 鐪熸満 360脳800 DPR3 鎴浘澶嶆牳锛? * 鐢ㄦ埛锛?涓婚〉鏋佸叾鎷ユ尋涓?ui 涓嶅浐瀹?銆?涔︾睄鐩綍鍙樻垚浜嗕竴灏忓崐"
 * ============================================================ */
/* 8) 宸ヤ綔鍙扮鐩垏鎹㈡潯涓嶅啀琚锛?60px 涓嬩袱涓鐩?pill 鍏?340px > 瀹瑰櫒 328px銆? *    涓婁竴鐗堟敼鎴?flex-wrap 鏄敊鐨勨€斺€攚rap 涔嬪悗涓や釜 pill **绔栨帓鍫嗕笁琛?*锛屾洿闅剧湅銆? *    姝ｈВ鏄瀹冧滑鐪熻兘濉炶繘涓€琛岋細鏀剁揣瀛楀彿/鍐呰竟璺濆埌 11.5px锛堝疄娴?scrollWidth-clientWidth=0锛夈€?*/
@media (max-width: 640px) {
  .dash-subtabs { flex-wrap: nowrap; overflow-x: visible; }
  .dash-subtabs button { padding: 6px 10px; font-size: 11.5px; }
}
/* 9) 瑙﹀睆锛氱炕椤垫潯涓庡彸涓嬭 #backToTop 浜掍笉閬尅銆? *    FAB 鎶珮閲?76px銆佺炕椤垫潯鍙宠浣?70px 閮芥槸"鐪熷疄鍍忕礌"璁捐鍊硷紝浣?搂12 鐨?75% 缂╂斁浼氭妸瀹冧滑
 *    涓€璧风缉鍒?0.75 鈫?蹇呴』鎸夌缉鏀剧郴鏁拌繕鍘熸垚鐪熷疄鍍忕礌銆?*/
@media (max-width: 900px) {
  .reader-main .toc-pager { padding-right: calc(70px / var(--qb-zoom, 1)); }
}

/* ============================================================
 * 搂11b 澶х翰澶氱骇鎶樺彔锛?026-09-14 鐢ㄦ埛锛?鍙宠竟鐨勭洰褰曟病鏈変簩绾у睍寮€"锛? * 鑺?鐭ヨ瘑鐐逛篃甯︽姌鍙犳妸鎵嬪悗锛屾妸鎵嬭涓庢墍灞炲眰绾ч敊寮€锛屽惁鍒欒妭鎶婃墜鐪嬬潃璺熺珷鎶婃墜鍚屽眰銆? * ============================================================ */
.rtoc-node.lv2 { padding-left: 12px; }
.rtoc-node.lv3 { padding-left: 24px; }
/* 澶х翰澶?鍏ㄩ儴灞曞紑/鍏ㄩ儴鏀惰捣"锛氫袱涓皬鍥炬爣閽紝闈犲彸璐存爣棰樿灏?*/
.toc-all { display: inline-flex; align-items: center; gap: 2px; margin-left: auto; }
.toc-all .btn-icon {
  width: 26px; height: 26px; padding: 0;
  display: inline-flex; align-items: center; justify-content: center;
  color: var(--text-3);
}
.toc-all .btn-icon svg { width: 14px; height: 14px; }
@media (hover: hover) {
  .toc-all .btn-icon:hover { color: var(--text-1); }
}

/* ============================================================
 * 搂12 鎵嬫満/骞虫澘榛樿 75% 缂╂斁锛?026-09-14 鐢ㄦ埛鍥?/鍥?锛?缂╁埌 75% 鍒氬垰濂?锛? * ------------------------------------------------------------
 * 鐢ㄦ埛瀹炴祴锛氭祻瑙堝櫒缂╂斁鍒?75% 鏃朵竴灞忓垰濂借涓嬶紙鍥?锛夛紝100% 鏃舵瀬鍏舵嫢鎸わ紙鍥?锛夈€? * 杩欓噷鐢?CSS zoom 澶嶅埢瀹冿細鏁撮〉绛夋瘮缂╁皬锛屼竴灞忚鏇村銆? *   路 zoom 鍙缉"缁樺埗"锛屼笉鏀惧ぇ"甯冨眬瑙嗗彛" 鈬?濯掍綋鏌ヨ浠嶆寜鐪熷疄瀹藉害(360)鍒ゅ畾锛? *     浠嶆槸鎵嬫満鐗堝竷灞€锛堥《鏍?鍗曞垪/鎶藉眽閮藉湪锛夛紝鍙槸鐢诲嚭鏉ュ皬涓€鍙?鈥斺€?姝ｆ槸鐢ㄦ埛瑕佺殑鏍峰瓙銆? *   路 姣旈€愭潯鏀瑰瓧鍙?鍐呰竟璺濆彲闈犲緱澶氾細涓嶄細婕忔帀鏌愪釜鍐欐 px 鐨勮钀姐€? * 鈿?鍞竴鐨勫潙锛?00dvh 浠嶆槸**鐪熷疄**瑙嗗彛楂?800)锛岃缂╁埌 0.75 鍚庡彧鍓?600
 *   鈬?鎵€鏈?鏁村睆楂?瀹瑰櫒鐨勫簳閮ㄤ細绌哄嚭 25%銆傛晠鏁村睆楂樹竴寰嬮櫎浠?--qb-zoom 鎶垫秷銆? * 浣滅敤浜?鈮?00px锛堟墜鏈?骞虫澘锛夛紱妗岄潰绐勭獥鍙ｅ悓鏍疯窡闅忥紝瑙嗚涓€鑷淬€佹棤鍓綔鐢ㄣ€? * ============================================================ */
:root { --qb-zoom: 1; }
@media (max-width: 900px) {
  :root { --qb-zoom: .75; zoom: .75; }
  /* 鏁村睆楂橈細鍏堟寜缂╂斁绯绘暟鏀惧ぇ锛岀缉鍥炴潵姝ｅソ閾烘弧瑙嗗彛 */
  .shell { min-height: calc(100dvh / var(--qb-zoom)); }
  .sidebar { height: calc(100dvh / var(--qb-zoom)); }
  .login-stage { min-height: calc(100dvh / var(--qb-zoom)); }
  .welcome-stage { min-height: calc(100dvh / var(--qb-zoom)); }
  body.route-dashboard .shell { height: calc(100dvh / var(--qb-zoom)); }
  .side-tree { max-height: calc(min(62dvh, 560px) / var(--qb-zoom)); }
}
/* 瑙﹀睆 FAB 鐨勬姮楂橀噺鍚屾牱瑕佽繕鍘燂紙76 鐪熷疄 px锛?*/
@media (max-width: 900px) and (hover: none) {
  #backToTop { bottom: calc(76px / var(--qb-zoom) + env(safe-area-inset-bottom, 0px)); }
}

/* ============================================================
 * 2026-09-15 浜岃疆锛堢敤鎴凤細"鐐瑰嚮鍙充晶鍏夎繕鏄笉鍑烘枃浠跺ぇ绾茬洰褰曪紝杩樻槸娌℃湁鍥炲埌椤堕儴"锛? *
 * 鏍瑰洜锛?*涓嶈鍐嶆嬁 `@media (hover: none)` 褰?杩欐槸瑙﹀睆"鐨勫垽鎹€?*
 * 涓夋槦娴忚鍣ㄧ瓑瀹夊崜娴忚鍣ㄤ細鎶婅Е鎽?*鍚堟垚 hover:hover 鐨勬寚閽堜簨浠?*锛堟湰鏂囦欢 216 琛屻€? * app.js:596 琛屾棭鏈夊悓涓€璁板綍锛夛紝杩欑被鏈哄瀷涓?`@media (hover: none)` 鏁村潡**涓嶈惤鍦?*锛? *   路 .rdr-hot 浠?pointer-events:auto 鈫?鎸′綇姝ｆ枃鍙崇紭锛涜€?subjects.js 鐨?click 澶勭悊鍣? *     鍙堝洜 matchMedia('(hover:hover)') 鍛戒腑鐩存帴 return 鈬?鎵嬫寚鐐瑰彸缂?鍏夋潯"姣棤鍙嶅簲锛? *   路 鐐规寜鍖?::before 鏍规湰涓嶅瓨鍦?鈬?娌℃湁鍔犲鐑尯锛? *   路 #backToTop 鍋滃湪 bottom:16/18px 鈥斺€?閭ｆ鏄墜鏈烘祻瑙堝櫒搴曟爮/鎵嬪娍鏉＄殑浣嶇疆锛? *     鎸夐挳"鐪嬩笉瑙佷篃澶熶笉鐫€"锛濈敤鎴疯鐨?杩樻槸娌℃湁鍥炲埌椤堕儴"銆? *
 * 淇硶锛歛pp.js 宸插湪**浠讳綍涓€娆＄湡瀹?touchstart** 鏃剁粰 body 鎸?`.qb-touch`锛堣嚜鎰堬紝涓斿凡鐢ㄤ簬
 * 娑堥櫎绮樻粸 hover锛夈€傝繖閲屾妸涓婅堪瑙﹀睆瑙勫垯**鍚屾椂**鎸傚埌 `body.qb-touch` 涓婏細鍙鐢ㄦ埛鐪熺殑鐢? * 鎵嬫寚鐐硅繃灞忓箷锛岃鍒欏繀瀹氳惤鍦帮紝涓嶇湅娴忚鍣ㄥ獟浣撴煡璇㈢殑鑴歌壊銆傛湰鍧楁斁鍦ㄦ枃浠舵湯灏撅紝
 * 鍚岀壒寮傚害涓嬪悗鍐欒€呰儨锛屽彲瑕嗙洊涓婇潰鎵€鏈?`@media (hover: none)` 鐗堟湰銆? *
 * 鍥炴粴 = 鍒犳帀鏈潡锛堟棫 @media 瑙勫垯鍘熸牱淇濈暀锛岃涓洪€€鍥炲師鐘讹級銆? * 鎶ゆ爮锛歰utput/qaudit/probe-reader-live.cjs锛堢湡瑙︽懜鐐规寜鍙崇紭 + 鐪熻Е鎽哥偣鍥為《閽級銆? * ============================================================ */
/* 1) 鍙崇紭澶х翰鍏ュ彛锛氱儹鍖烘湰浣撲笉鍚冧簨浠讹紙涓嶆尅姝ｆ枃锛夛紝鐐规寜鍖烘寕鍦?::before 涓婏紝
 *    骞朵粠 26 鈫?44 璁捐 px锛堢缉鏀惧悗 鈮?3 璁惧 px锛夆€斺€?26 鍙湁 鈮?0px锛屼綆浜庤Е鎺ф渶灏忕洰鏍囥€?*/
body.qb-touch .rdr-hot { pointer-events: none; }
body.qb-touch .rdr-hot::before {
  content: ""; position: absolute; right: 0; top: 18%; bottom: 18%;
  width: 44px; pointer-events: auto;
}
/* 鍏夋潯锛堢敤鎴风偣鍚嶈淇濈暀鐨?鍙宠竟杈圭紭閭ｆ潯"锛夛細鍔犵矖鎻愪寒锛岀ǔ瀹氬厖褰?杩欓噷鏈夊叆鍙?鐨勬彁绀?*/
body.qb-touch .rdr-hot::after { width: 5px; height: 92px; opacity: .62; }
/* 2) 鍥為《閽細鎶埌 76 鐪熷疄 px锛堣繕鍘?zoom锛? 瀹夊叏鍖猴紝閬垮紑鎵嬫満娴忚鍣ㄥ簳鏍?鎵嬪娍鏉?*/
body.qb-touch #backToTop {
  width: 50px; height: 50px; right: 12px;
  bottom: calc(76px / var(--qb-zoom, 1) + env(safe-area-inset-bottom, 0px));
}
/* 3) 椤舵爮锛氱湡瑙︽懜璁惧涓€寰嬩笉璁歌蛋"鑷姩闅愯棌"锛堟病鏈?hover 鍞や笉鍥炴潵锛?*/
body.qb-touch.topauto .topbar { position: sticky; top: 0; transform: none; }
body.qb-touch .top-hot { display: none; }
/* 4) 绉戠洰琛岋細瑙﹀睆鏀圭敤 static 鍒楋紝閬垮厤鎶婄鐩悕鎸ゆ垚鐪佺暐鍙凤紙闀滃儚 968 琛岋級 */
body.qb-touch .sub-switch {
  display: flex; position: static; z-index: auto;
  background: transparent; border: 0; box-shadow: none; padding: 2px 0 0;
}
body.qb-touch .tree-line[data-line="__top"] { flex-wrap: wrap; }
body.qb-touch .tree-line[data-line="__top"] .sub-switch { flex: 1 1 100%; }

/* ============================================================
 * 搂13 闃呰鍣ㄦ杩涙潯 + 鍥炬爣缈婚〉 + 渚嬮琛屽唴绛旀锛?026-09-16 鐢ㄦ埛闇€姹傦級
 * ------------------------------------------------------------
 * 路 姝ヨ繘鏉★紙涓婁竴鍗?涓嬩竴鍗?涓婁竴鑺?涓嬩竴鑺傦級涓庨搴?涓嬩竴棰?鍚屾 UI锛堝浘鏍?鏂囧瓧鑳跺泭锛? *   涓嬩竴寮犺蛋鍝佺墝瀹炲績 primary锛夛紝鍥哄畾鍦ㄧ炕椤佃涓婁竴琛岋紱缈婚〉琛屾敼鍥炬爣鍦嗛挳锛堟棤鏂囧瓧锛? *   title/aria-label 淇濈暀鍘熻涔?+ 鍙鐒︾偣鐜紝WCAG 4.1.2锛夈€? * 路 涓夌鍚?DOM锛氭闈?sticky / 鎵嬫満 fixed 鍏ㄩ儴鐢卞灞?.toc-pager 缁ф壙锛屼笉鏂板瀹氫綅灞傦紱
 *   鎵嬫満绔簳閮ㄧ暀鐧介殢琛屾暟鍔犻珮锛堝崟琛?56 鈫?鍙岃 124锛岃繕鍘?zoom锛夈€? * 路 鎬ц兘锛氬皬鑳跺泭澶嶇敤鏃㈡湁 .fnav-btn锛堟棤澶ч潰绉?backdrop-filter銆佹棤浣嶇Щ鍔ㄧ敾锛? *   婊氬姩鏈熻繃娓℃竻闆剁敱 body.qb-scrolling 鍏ㄥ眬鍏滀綇锛夛紱璺宠浆鐩爣 scroll-margin 闃插師鐢? *   鐒︾偣婊氬姩鐩栭《锛涢厤鍥?height:auto + max-width锛堢 width:auto锛孋LS 闄烽槺锛夈€? * 鍥炴粴 = 鍒犳帀鏈潡锛堢炕椤靛洖鍒版枃瀛楅挳闇€鍚屾鏀?subjects.js 妯℃澘锛夈€? * ============================================================ */
.reader-main .toc-pager { flex-direction: column; align-items: stretch; gap: 8px; }
/* 姝ヨ繘鏉★細灞呬腑鑳跺泭缁勶紙涓婁竴寮犵礌搴?+ 浣嶇疆绔?+ 涓嬩竴寮犲疄蹇冿級锛屼笌 exam fnav 鍚岃瑷€ */
.rdr-step { display: flex; align-items: center; justify-content: center; gap: 8px; }
.rdr-step .fnav-btn { padding: 7px 13px; font-size: 12.5px; }
.rdr-step .fnav-btn svg { width: 15px; height: 15px; }
.rdr-step .fnav-btn:disabled { opacity: .35; }
/* 缈婚〉琛岋細鍥炬爣鍦嗛挳鍒嗗眳涓や晶锛岄〉鐮佺珷灞呬腑锛堢瓑瀹芥暟瀛楋紝缈婚〉涓嶈烦瀹斤級 */
.rdr-pagerow { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.rdr-pagerow > .muted, .rdr-pagerow > [data-rpglabel], .rdr-pagerow > [data-pg], .rdr-pagerow > [data-ipg] {
  font-size: 12px; font-weight: 650; color: var(--text-2); letter-spacing: .02em;
  padding: 3px 12px; border-radius: 999px;
  background: var(--surface-2, rgba(125, 135, 155, .12)); border: 1px solid var(--line);
  font-variant-numeric: tabular-nums;
}
.toc-pager > .rdr-pagerow { width: 100%; }
.rdr-pagerow > .btn.pg-btn {
  width: 38px; height: 38px; min-width: 38px; padding: 0; border-radius: 50%;
  display: inline-grid; place-items: center;
  border: 1px solid var(--line); background: var(--surface); color: var(--text-2);
  box-shadow: none;
}
.rdr-pagerow > .btn.pg-btn svg { width: 17px; height: 17px; }
@media (hover: hover) {
  .rdr-pagerow > .btn.pg-btn:not(:disabled):hover {
    border-color: var(--brand-300, #93c5fd); color: var(--brand-600, #2563eb);
    background: var(--brand-50, rgba(59, 130, 246, .10));
  }
}
.rdr-pagerow > .btn.pg-btn:disabled { opacity: .35; box-shadow: none; cursor: default; }
.rdr-pagerow > .btn.pg-btn:active:not(:disabled) { transform: scale(.94); }
/* 鍙鐒︾偣鐜紙鍥炬爣閽棤鏂囧瓧锛岄敭鐩樼敤鎴烽潬瀹冨畾浣嶏紱涓庡叏灞€杩囨浮闂ㄦ帶鍏煎锛?*/
.pg-btn:focus-visible, .rdr-step .fnav-btn:focus-visible, .md-ans-toggle:focus-visible {
  outline: 2px solid var(--brand-500, #3b82f6); outline-offset: 2px;
}
/* 例题答案：行内「最小」开关（2026-09-16 重做）
 * 收起＝原文末段行尾一个小图标（零额外行高、原文不动）；展开＝其后插入紧凑答案块。
 * 图标两个都在 DOM，靠 [aria-expanded] 切换显示（绝不替换被点节点）。 */
.md-ansline { margin: 2px 0 9px; line-height: 1.7; }
.md-ans-toggle {
  display: inline-flex; align-items: center; justify-content: center;
  width: 18px; height: 18px; padding: 0; margin-left: 5px;
  vertical-align: -4px;
  color: var(--brand-600, #2563eb); background: transparent;
  border: 0; border-radius: 6px; cursor: pointer;
  opacity: .7; transition: opacity var(--t-fast, .15s), background var(--t-fast, .15s);
}
.md-ans-toggle:hover { opacity: 1; background: var(--brand-50, rgba(59, 130, 246, .12)); }
.md-ans-toggle.on { opacity: .85; color: var(--text-2); background: var(--surface-2); }
.md-ans-toggle .ic-ans-close { display: none; }
.md-ans-toggle[aria-expanded="true"] .ic-ans-open { display: none; }
.md-ans-toggle[aria-expanded="true"] .ic-ans-close { display: block; }
.md-ans-body {
  margin: 4px 0 10px; padding: 7px 10px 7px 11px;
  border-left: 3px solid var(--brand-300, #93c5fd);
  background: var(--surface-2); border-radius: 0 8px 8px 0;
  font-size: 13px; line-height: 1.72; color: var(--text-1);
}
.md-ans-p { margin: 0 0 6px; }
.md-ans-p:last-child { margin-bottom: 0; }
.md-ans-lb {
  display: inline-block; margin-right: 6px; padding: 0 5px;
  font-size: 11px; line-height: 16px; vertical-align: 1px;
  color: var(--brand-600, #2563eb); background: var(--brand-50, rgba(59, 130, 246, .12));
  border-radius: 4px;
}
.md-ans { font-size: 13px; color: var(--text-1); }
/* 题库配图：响应式 + 占位底色 + 防 CLS（禁 width:auto，见 research-nav-20260916.log） */
.q-prompt img, .q-answer img, .opt-text img {
  display: block; max-width: 100%; height: auto;
  border-radius: 8px; background: var(--surface-2); margin: 6px 0;
}
/* 闃呰鍣ㄨ烦杞洰鏍囷細鍘熺敓鐒︾偣婊氬姩涔熺暀椤讹紙绋嬪簭婊氬姩璧?rdrPlaceTo 鍥哄畾閿氾級 */
.reader-main .kp-card, .reader-main .kp-pair { scroll-margin-top: calc(var(--header-h, 64px) + 12px); }
/* 闃呰鍣ㄦ粴鍔ㄩ敋瀹氬叧闂紙2026-09-16 姝ヨ繘/澶х翰璺ㄩ〉璺充笌娴忚鍣ㄥ洖鎷変簰鎼忓疄閿わ細
 * output/probe-reader-dbg2锛欿EY=20/22 澶?scrollBy 鍦?+593/+154 闂存潵鍥炴墦鏋?69~119 娆? * 姘镐笉鏀舵暃锛涘悓椤佃烦 nSb=1 鍗虫敹鏁涖€傛満鐞嗕笌 09-14 绛旈椤靛悓婧?鈥斺€?paintRecite 鏁撮〉鎹㈣鏃? * Chrome 鎸夋棫閿氱偣鑷姩琛ユ媺 scrollY銆備慨娉曚笌棰樺簱涓€鑷达細婊氬姩瀹屽叏鐢?rdrPlaceTo 鎺ョ銆? * 鍥炴粴 = 鍒犳帀鏈潡锛坮drPlaceTo 鑷牎姝ｄ粛鍙嫭绔嬪伐浣滐紝浣嗚法椤佃烦浼氬洖璺筹級銆?*/
.reader-main, .reader-main .kp-card, .reader-main .book-text, .reader-main [data-pane="recite"] { overflow-anchor: none; }
/* 鎵嬫満/骞虫澘锛氬弻琛岄〉鑴氾紙姝ヨ繘鏉?+ 缈婚〉锛夌害 124 璁捐 px锛屽簳閮ㄧ暀鐧藉悓姝ュ姞楂橈紝
 * 鍚﹀垯鏈€鍚庝竴寮犲崱浼氳鏂拌鍘嬩綇鐐逛笉鍒帮紙鏃?56px 鍙鍗曡锛夈€?*/
@media (max-width: 900px) {
  .reader-main:has(.rdr-step) { padding-bottom: calc(124px / var(--qb-zoom, 1) + env(safe-area-inset-bottom, 0px)); }
  .rdr-step .fnav-btn { padding: 8px 14px; font-size: 13px; }
}

/* ============================================================
 * S14 Step/pager/answer-toggle polish (2026-09-16 user ask).
 * Scope: color/border/spacing/hit-area only. No new backdrop-filter,
 * no motion, no layout-affecting rules (perf budget untouched;
 * transitions stay under the global body.qb-scrolling gate).
 * Rollback = delete this block.
 * ============================================================ */
/* Step position pill speaks the same language as pager pills. */
.rdr-step .fnav-pos {
  min-width: 64px; padding: 3px 12px; border-radius: 999px;
  background: var(--surface-2, rgba(125, 135, 155, .12));
  border: 1px solid var(--line);
}
/* Tap behavior for the whole step/pager family: no double-tap zoom,
 * no gray flash; visual style unchanged. */
.rdr-step .fnav-btn, .rdr-pagerow .btn.pg-btn, .md-ans-toggle,
.exam-floatnav .fnav-btn {
  touch-action: manipulation; -webkit-tap-highlight-color: transparent;
}
/* Disabled-state unity: step + pager + floatnav share one opacity. */
.rdr-step .fnav-btn:disabled, .rdr-pagerow > .btn.pg-btn:disabled { opacity: .38; }
/* pageFnav focus ring removed with pagination. */
/* Answer toggle: 图标式开关（2026-09-16 重做后只做颜色/透明度过渡，
 * 粗指针设备给到 26px 方形点按区——仍是"最小显示"，不回到药丸按钮）。 */
.md-ans-toggle { transition: opacity var(--t-fast), background var(--t-fast), color var(--t-fast); }
@media (pointer: coarse) {
  .md-ans-toggle { width: 26px; height: 26px; vertical-align: -7px; }
  .rdr-step .fnav-btn, .rdr-pagerow > .btn.pg-btn { min-height: 40px; }
}

/* ============================================================
 * S15 Single-row footer (pagination removed 2026-09-17).
 * Footer: step group shares ONE row (DOM order step, pure flex).
 * No motion, no new blur.
 * Rollback = delete this block.
 * ============================================================ */
.reader-main .toc-pager {
  flex-direction: row; align-items: center; justify-content: center;
  gap: 10px; flex-wrap: nowrap;
}
.reader-main .toc-pager .rdr-step { flex: 0 1 auto; min-width: 0; }
.reader-main .toc-pager > .rdr-pagerow { width: auto; flex: 0 0 auto; }
/* [data-bookmode]/[data-pagemode] rules removed with pagination 2026-09-17. */
@media (max-width: 900px) {
  /* One row must fit 390px: compact metrics, footer padding tightened. */
  .reader-main .toc-pager { gap: 6px; padding-left: 10px; padding-right: 10px; }
  .reader-main .toc-pager .rdr-step { gap: 6px; }
  .rdr-step .fnav-btn { padding: 7px 10px; font-size: 12px; }
  .rdr-step .fnav-pos { min-width: 52px; padding: 3px 8px; font-size: 11.5px; }
  .rdr-pagerow { gap: 6px; }
  .rdr-pagerow > .btn.pg-btn, .reader-main .toc-pager [data-bookmode] {
    width: 32px; height: 32px; min-width: 32px;
  }
  .rdr-pagerow > .btn.pg-btn svg, .reader-main .toc-pager [data-bookmode] svg {
    width: 15px; height: 15px;
  }
  .rdr-pagerow > .muted, .rdr-pagerow > [data-rpglabel],
  .rdr-pagerow > [data-pg], .rdr-pagerow > [data-ipg] {
    font-size: 11px; padding: 2px 8px;
  }
  /* Single-row footer ~64px: shrink the bottom clearance accordingly. */
  .reader-main:has(.rdr-step) { padding-bottom: calc(84px / var(--qb-zoom, 1) + env(safe-area-inset-bottom, 0px)); }
}

/* ============================================================
 * S16 Exam rail + shortcut panel (2026-09-17 railkeys Task 1).
 * Scope: position/appearance only. No motion, no backdrop-filter.
 * Rollback = delete this block.
 * ============================================================ */
#examRail { position: fixed; right: 18px; top: 50%; transform: translateY(-50%); display: flex; flex-direction: column; gap: 10px; z-index: 60; }
#examRail .fnav-btn.icon-only { width: 44px; height: 44px; padding: 0; display: inline-flex; align-items: center; justify-content: center; }
#examRail .fnav-btn.icon-only svg { width: 18px; height: 18px; }
#examRail .fnav-btn:disabled { opacity: .38; }
#examRail .fnav-btn:focus-visible, #modeIcon:focus-visible { outline: 2px solid var(--brand-500, #3b82f6); outline-offset: 2px; }
.exam-side-mode { display: flex; gap: 8px; }
.exam-side-mode .fnav-btn.icon-only { width: 36px; height: 32px; padding: 0; display: inline-flex; align-items: center; justify-content: center; }
.exam-side-mode .fnav-btn.icon-only svg { width: 16px; height: 16px; }
#scPanel { position: fixed; top: 60px; left: 12px; right: auto; z-index: 120; min-width: 250px; max-width: calc(100vw - 24px); background: var(--surface); border: 1px solid var(--line); border-radius: 12px; box-shadow: var(--shadow-2); padding: 10px; display: flex; flex-direction: column; gap: 8px; }
#scPanel[hidden] { display: none; }
#scPanel .sc-row { display: flex; align-items: center; gap: 8px; font-size: 13px; }
#scPanel .sc-row kbd { margin-left: auto; min-width: 40px; text-align: center; padding: 2px 8px; border: 1px solid var(--line); border-radius: 6px; background: var(--surface-2, rgba(125,135,155,.12)); font-family: inherit; }
#scPanel .sc-foot { display: flex; justify-content: flex-end; }
@media (max-width: 900px) {
  /* 2026-09-17 修（用户截图：手机答题页「下一题」被「回到顶端」压住，点不动）：
   * ① 桌面版遗留的 transform:translateY(-50%) 在窄屏 top:auto 之后成了纯向上偏移，
   *    把整条轨抬高半个身位 ⇒ 与右下角回顶 FAB 挤在同一高度 → 互相遮挡。
   *    实测：相交 1006.5px²，#railNext 中心 elementFromPoint 命中 #backToTop（＝真的点不到）。
   * ② bottom 改用「真实像素」口径（÷ --qb-zoom），与回顶 FAB 同一坐标空间，不再各说各话。
   * ③ 回顶 FAB 让位到翻题轨正上方（右缘对齐），两者上下分层、互不遮挡。
   * 2026-09-17 追加（用户：把手机的下一题改到中间位置）：整条上一题/下一题轨**水平居中**，
   *    #railNext 主操作键落屏幕中央稍偏右，拇指盲区更易够到；FAB 保留右缘 76px 抬升（避底部手势条），
   *    因轨已居中、右缘不再冲突，去掉本条 `-has(#examRail)#backToTop` 的 +56 复盖。
   * 回滚 = 还原本节声明。护栏 output/qaudit/probe-rail-fab.cjs。 */
  #examRail { top: auto; bottom: calc(76px / var(--qb-zoom, 1)); left: 50%; right: auto; flex-direction: row; transform: translateX(-50%); gap: 12px; }
  #examRail .fnav-btn.icon-only { width: 44px; height: 44px; }
}

/* ============================================================
 * 答题页右侧五键扁平重做（2026-09-17 用户：五个丑 + 大小割裂）。
 * 上两行 = 模式分段（练习/刷题、连读/整页，图标+文字等分）；
 * 下三块 = 熟练度统计（大数字 + 小图标+文字，选中才染底）。
 * 背诵抽屉 b-filter 共用下三块样式。只加颜色/尺寸，无位移动画；
 * 回滚 = 删除本块并回退 exam.js/subjects.js 模板。
 * ============================================================ */
.exam-side-mode { flex-direction: column; gap: 6px; }
.exam-side-mode .seg { width: 100%; }
.exam-side-mode .seg button {
  flex: 1 1 0; min-width: 0;
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
  min-height: 36px; padding: 7px 4px; border-radius: 10px;
  font-size: 12.5px; font-weight: 700; color: var(--text-2); cursor: pointer;
  border: 1px solid transparent; background: transparent;
}
.exam-side-mode .seg button svg { width: 15px; height: 15px; flex: 0 0 auto; }
.exam-side-mode .seg button.on {
  background: var(--surface); color: var(--text-1);
  border-color: var(--line-strong, var(--line)); box-shadow: var(--shadow-1);
}
/* 熟练度三行：slim 统计行（图标+文字左、计数右），平时透明只在 hover/选中时显形（2026-09-17 用户：大方块丑） */
.m-filter { display: flex; flex-direction: column; gap: 6px; width: 100%; }
.m-filter button[data-m] {
  display: flex; flex-direction: row; align-items: center; gap: 8px;
  width: 100%; min-height: 40px; padding: 8px 12px;
  border: 1px solid transparent; border-radius: 10px; background: transparent;
  cursor: pointer;
}
.m-filter .m-lab {
  flex: 1 1 auto; min-width: 0;
  display: inline-flex; align-items: center; gap: 8px;
  font-size: 12.5px; font-weight: 700; line-height: 1; color: var(--text-2);
}
.m-filter .m-lab svg { width: 15px; height: 15px; flex: 0 0 auto; }
.m-filter .m-count {
  font-size: 15px; font-weight: 800; line-height: 1; font-variant-numeric: tabular-nums;
}
.m-filter button[data-m="PROFICIENT"] .m-lab svg { color: var(--ok-500, #16a34a); }
.m-filter button[data-m="FUZZY"] .m-lab svg { color: var(--warn-500, #d97706); }
.m-filter button[data-m="UNKNOWN"] .m-lab svg { color: var(--err-500, #dc2626); }
.m-filter button[data-m="PROFICIENT"].on { background: var(--ok-bg, rgba(22, 163, 74, .12)); border-color: var(--ok-500, #16a34a); }
.m-filter button[data-m="FUZZY"].on { background: var(--warn-bg, rgba(217, 119, 6, .12)); border-color: var(--warn-500, #d97706); }
.m-filter button[data-m="UNKNOWN"].on { background: var(--err-bg, rgba(220, 38, 38, .1)); border-color: var(--err-500, #dc2626); }
.m-filter button[data-m].on .m-lab { color: inherit; }
/* ============================================================
 * 答题页宽屏：内容拓宽 + 上/下一题搬进中间空隙（2026-09-17 用户：
 * 中间留白太大 + 翻题钮放空隙；目录仍 fixed 贴右，窄屏一切照旧）。
 * 回滚 = 删除本块（rail 回右缘，内容回 880）。
 * ============================================================ */
@media (min-width: 901px) {
  .exam-layout.has-toc .exam-wrap { max-width: 1060px; margin-left: 0; margin-right: 120px; }
  #examRail { right: 300px; }
}
/* ============================================================
 * Toast 搬右下 + 面板化（2026-09-17 用户：样式丑、放右下；
 * bottom 取 76 避开右下回顶 FAB；移动端同样走底部、再抬高避翻题条）。
 * 回滚 = 删除本块（回右上 tint 底）。
 * ============================================================ */
.toast-zone { top: auto; bottom: 76px; right: 18px; }
.toast {
  align-items: center; background: var(--surface);
  border: 1px solid var(--line-strong, var(--line)); border-radius: 12px;
  box-shadow: var(--shadow-2);
}
.toast.ok, .toast.err, .toast.info { background: var(--surface); }
.toast svg { flex: 0 0 auto; width: 26px; height: 26px; padding: 5px; border-radius: 50%; margin-top: 0; }
.toast.ok svg { color: var(--ok-600, #16a34a); background: var(--ok-bg, rgba(22, 163, 74, .12)); }
.toast.err svg { color: var(--err-600, #dc2626); background: var(--err-bg, rgba(220, 38, 38, .1)); }
.toast.info svg { color: var(--brand-600, #2563eb); background: var(--brand-50, rgba(59, 130, 246, .1)); }
@media (max-width: 900px) {
  .toast-zone { top: auto; bottom: 150px; left: 12px; right: 12px; width: auto; }
}
/* ============================================================
 * Reader media polish (2026-09-17 user: images made the page
 * sluggish and broke small-screen fitting).
 *
 * Root cause found in output/_figdiag*.log:
 *   1) a jump to a far card rendered every preceding card;
 *   2) the off-canvas right drawer widened mobile scrollWidth;
 *   3) inline figures had no height ceiling.
 * These rules keep long recite lists cheap, prevent the drawer from
 * creating a horizontal scrollbar, and constrain figures without
 * stretching or cropping them.
 * ============================================================ */
.reader-main .kp-card,
.reader-main .kp-pair,
.reader-main .kp-note {
  content-visibility: auto;
  contain-intrinsic-size: auto 120px;
}
.md-img {
  height: auto;
  max-height: min(60vh, 520px);
  object-fit: contain;
}
html,
body {
  overflow-x: clip;
}

/* 2026-09-17 插图防抖：width/height 属性已精准预留盒，max-width 压宽时高度按比例缩放，
 * 不再出现 0px/96px -> 实高的跳动（证据 output/_figperf2.json 修复前 b100 CLS 7.6-9.9）。 */
.book-text img.md-img,
[data-pane="recite"] img.md-img,
.book-reader img.md-img {
  height: auto;
}
