/* ===== 轻量刷题模块样式（练习页 /quiz/ + 管理页 /quiz/admin/）=====

   自带全部样式：不 import blog.css，也不加载任何外部字体或图片。
   颜色、圆角、字体栈沿用博客 web/blog.css 的令牌取值（同一批 hex），
   让两处观感一致；改色请两边同步。

   布局约束（390px 宽不出现横向滚动）：
     · 所有元素 box-sizing:border-box；
     · 长文本（题干、选项、文件名、提取节选）一律 overflow-wrap:anywhere；
     · 网格只用 1fr / minmax(min(...),1fr)，不写死大于视口的宽度；
     · 输入控件 width:100% + max-width:100%，不设固定像素宽。 */

:root{
  --font-serif:'Songti SC','STSong','SimSun','Noto Serif SC',Georgia,serif;
  --font-sans:'PingFang SC','Hiragino Sans GB','Microsoft YaHei','Noto Sans SC',system-ui,sans-serif;
  --mono:ui-monospace,SFMono-Regular,Menlo,monospace;

  --radius-sm:10px;--radius-md:12px;--radius-lg:24px;--radius-pill:999px;

  /* 雾白纸面 × 翡翠液态玻璃；light 是显式默认值，blogTheme=dark 时才切换 */
  color-scheme:light;
  --bg:#eef3ee;--bg-soft:#f8faf6;--card:#fbfcf8;--card-hover:#f3f8f2;
  --text:#152c25;--text-strong:#0d211a;--muted:#60746a;--border:#d5e0d7;
  --accent:#176b52;--accent-soft:rgba(23,107,82,.1);
  --danger:#a93832;--danger-soft:rgba(169,56,50,.1);
  --ok:#176b52;--ok-soft:rgba(23,107,82,.1);
  --warn:#8c672f;--warn-soft:rgba(197,165,117,.17);
  --champagne:#c5a575;
  /* 强调色底上的前景色：浅色主题保持白字，深色主题浅翡翠底改用深墨绿。 */
  --on-accent:#fff;
  --on-danger:#fff;
  --shadow:0 16px 44px -26px rgba(25,53,42,.32);

  /* ---- 材质：表面渐变 + 三层阴影 + 内高光 ----
     单层大阴影像一张贴纸；"悬在背景上"的厚度感来自三层：
     接触阴影贴边、中景塑形、远景拉开层次。内高光给边缘一道细亮线。 */
  --surface-grad:linear-gradient(180deg,rgba(255,255,252,.92) 0%,rgba(247,251,246,.86) 100%);
  --surface-soft-grad:linear-gradient(180deg,#fbfdf9 0%,#f2f7f1 100%);
  --raise-1:0 1px 2px rgba(25,53,42,.05),0 5px 14px -8px rgba(25,53,42,.1);
  --raise-2:0 1px 2px rgba(25,53,42,.05),0 12px 30px -18px rgba(25,53,42,.2),0 26px 56px -36px rgba(25,53,42,.24);
  --raise-3:0 2px 4px rgba(25,53,42,.06),0 18px 42px -18px rgba(25,53,42,.2),0 40px 80px -42px rgba(25,53,42,.28);
  --inner-light:inset 0 1px 0 rgba(255,255,255,.92);
  --inner-hair:inset 0 0 0 1px rgba(255,255,255,.62);
  --border-strong:#b9cec0;
  --accent-grad:linear-gradient(135deg,#248868 0%,#176b52 55%,#10523f 100%);
  --accent-glow:0 8px 22px -10px rgba(23,107,82,.62);
  --focus-ring:0 0 0 3px rgba(23,107,82,.2);
  --glass-bg:rgba(248,252,247,.7);
  --glass-border:rgba(255,255,255,.64);
  --glass-blur:12px;
  --halo-1:rgba(47,139,106,.1);
  --halo-2:rgba(197,165,117,.1);
  --halo-3:rgba(120,195,164,.08);
  /* 动效：只动 transform/opacity/box-shadow，保证 60fps */
  --ease-out:cubic-bezier(.22,.61,.36,1);
  --ease-spring:cubic-bezier(.34,1.36,.64,1);
  --dur-1:120ms;--dur-2:200ms;--dur-3:320ms;
}
[data-theme="dark"]{
  color-scheme:dark;
  --bg:#0e1814;--bg-soft:#14221c;--card:#17271f;--card-hover:#1c3027;
  --text:#e4eee8;--text-strong:#f7fbf8;--muted:#94aa9e;--border:#30463a;
  --accent:#79d8b4;--accent-soft:rgba(121,216,180,.12);
  --danger:#f08a80;--danger-soft:rgba(240,138,128,.12);
  --ok:#79d8b4;--ok-soft:rgba(121,216,180,.12);
  --warn:#d9bb86;--warn-soft:rgba(217,187,134,.12);
  --champagne:#d9bb86;
  --on-accent:#10291f;
  --on-danger:#10291f;
  --shadow:0 18px 50px -26px rgba(0,0,0,.65);
  /* 深色下"材质"靠更亮的内高光 + 更深的接触阴影，渐变夹角也反过来 */
  --surface-grad:linear-gradient(180deg,rgba(28,47,38,.92) 0%,rgba(20,34,28,.92) 100%);
  --surface-soft-grad:linear-gradient(180deg,#1b2d24 0%,#16251e 100%);
  --raise-1:0 1px 2px rgba(0,0,0,.36),0 5px 14px -8px rgba(0,0,0,.46);
  --raise-2:0 1px 2px rgba(0,0,0,.4),0 14px 32px -18px rgba(0,0,0,.58),0 28px 60px -36px rgba(0,0,0,.68);
  --raise-3:0 2px 5px rgba(0,0,0,.42),0 20px 44px -18px rgba(0,0,0,.62),0 44px 84px -42px rgba(0,0,0,.72);
  --inner-light:inset 0 1px 0 rgba(215,255,236,.08);
  --inner-hair:inset 0 0 0 1px rgba(215,255,236,.04);
  --border-strong:#476555;
  --accent-grad:linear-gradient(135deg,#93e7c5 0%,#79d8b4 55%,#55b892 100%);
  --accent-glow:0 10px 26px -12px rgba(121,216,180,.55);
  --focus-ring:0 0 0 3px rgba(121,216,180,.25);
  --glass-bg:rgba(19,33,27,.7);
  --glass-border:rgba(215,255,236,.1);
  --glass-blur:12px;
  --halo-1:rgba(58,170,128,.12);
  --halo-2:rgba(197,165,117,.08);
  --halo-3:rgba(121,216,180,.07);
  --ease-out:cubic-bezier(.22,.61,.36,1);
  --ease-spring:cubic-bezier(.34,1.36,.64,1);
  --dur-1:120ms;--dur-2:200ms;--dur-3:320ms;
}

*{margin:0;padding:0;box-sizing:border-box}
/* 任何可聚焦控件被滚动到视口时，都要与吸顶条保持距离 */
.q-wrap button,.q-wrap input,.q-wrap select,.q-wrap textarea,.q-wrap [tabindex],
.q-wrap label{scroll-margin-top:4.5rem}
html{
  -webkit-text-size-adjust:100%;
  /* 吸顶条高度约 52px：任何自动滚动（聚焦、锚点、scrollIntoView）都要给它让位，
     否则表单控件会停在吸顶条背后，鼠标点上去命中导航而不是控件（桌面端特有）。 */
  scroll-padding-top:4.5rem;
}
body{
  font-family:var(--font-sans);color:var(--text);background:var(--bg);
  line-height:1.7;min-height:100vh;overflow-wrap:anywhere;
}
button{font-family:inherit;cursor:pointer;border:none;background:none;color:inherit}
input,select,textarea{font-family:inherit;font-size:.85rem;color:var(--text);max-width:100%}
a{color:var(--accent)}
:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:4px}
.vh{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
/* hidden 属性必须永远生效：.start-panel / .q-banner 这类组件声明了 display:flex，
   作者样式会压过浏览器默认的 [hidden]{display:none}，不写这条就会出现
   「面板已经 hidden 却还挂在页面上」。 */
[hidden]{display:none!important}

/* 跳到主内容：键盘用户不必逐个 Tab 越过页头 */
.skip-link{
  position:fixed;top:.6rem;left:.6rem;z-index:50;padding:.5rem .9rem;border-radius:var(--radius-sm);
  background:var(--accent);color:var(--on-accent);font-size:.8rem;text-decoration:none;
  translate:0 -200%;transition:translate .2s ease;
}
.skip-link:focus{translate:0 0}

/* ===== 页头 / 页脚 ===== */
.q-top{
  position:sticky;top:0;z-index:20;display:flex;flex-wrap:wrap;gap:.5rem 1rem;
  align-items:center;justify-content:space-between;
  min-height:3.5rem;padding:.6rem max(1rem,calc((100vw - 1180px)/2));background:var(--card);border-bottom:1px solid var(--border);
}
.q-brand{font-size:.82rem;color:var(--muted);text-decoration:none;white-space:nowrap}
.q-brand:hover{color:var(--accent)}
.q-nav{display:flex;flex-wrap:wrap;gap:.3rem;align-items:center}
.q-nav-link{
  font-size:.8rem;padding:.25rem .7rem;border-radius:var(--radius-pill);
  color:var(--muted);text-decoration:none;border:1px solid transparent;
}
.q-nav-link:hover{color:var(--accent);border-color:var(--border)}
.q-nav-link.is-active{color:var(--on-accent);background:var(--accent)}
.q-top-actions{display:flex;align-items:center;gap:.4rem;margin-left:auto}
.skip-link+.q-top+main.q-wrap:focus{outline:0!important;box-shadow:none!important}
.q-wrap:focus:not(:focus-visible){outline:0!important}
.q-wrap[tabindex="-1"]:focus-visible{outline:0!important;box-shadow:none!important}
.q-wrap[tabindex="-1"]:focus:not(:focus-visible){outline:0!important;box-shadow:none!important}
.q-theme-toggle{
  width:2.5rem;height:2.5rem;flex:none;display:inline-flex;align-items:center;justify-content:center;
  border:1px solid var(--border);border-radius:50%;background:var(--surface-soft-grad);color:var(--text);
  box-shadow:var(--inner-light),var(--raise-1);
  transition:border-color var(--dur-2) var(--ease-out),background-color var(--dur-2) var(--ease-out),transform var(--dur-1) var(--ease-out);
}
.q-theme-toggle:hover{border-color:var(--accent);color:var(--accent);transform:translateY(-1px)}
[data-theme="dark"] .q-theme-toggle:hover,
[data-theme="dark"] .q-btn:hover:not(:disabled),
[data-theme="dark"] .q-account-btn:hover,
[data-theme="dark"] .q-nav-link:not(.is-active):hover,
[data-theme="dark"] .q-brand:hover,
[data-theme="dark"] .bank-card-arrow{color:var(--text-strong)}
.q-theme-icon{width:1rem;height:1rem;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
.q-theme-icon-sun{display:block}
.q-theme-icon-moon{display:none}
[data-theme="dark"] .q-theme-icon-sun{display:none}
[data-theme="dark"] .q-theme-icon-moon{display:block}
.q-wrap{
  /* 1080：题目是主角，900 宽在桌面上题干每行只能放 ~28 字，读起来局促 */
  width:100%;max-width:1180px;margin:0 auto;
  /* 底部留白要大于吸顶条高度：否则滚到最底时，最上面那批控件会被吸顶条永久盖住，
     用户再怎么滚都点不到（管理页表单就是这样被挡的）。 */
  padding:2rem 1.5rem 5.5rem;
}
.q-page-intro{
  position:relative;padding:0 0 1.4rem;border-bottom:1px solid var(--border);
}
.q-page-intro::after{
  content:"";position:absolute;left:0;bottom:-1px;width:4.5rem;height:2px;border-radius:2px;
  background:linear-gradient(90deg,var(--accent),var(--champagne));
}
.q-eyebrow,.q-kicker{
  font-family:var(--mono);font-size:.66rem;line-height:1.5;letter-spacing:.12em;
  text-transform:uppercase;color:var(--muted);
}
.q-eyebrow{color:var(--accent);margin-bottom:.45rem}
.q-title{font-family:var(--font-serif);font-size:clamp(1.75rem,3.2vw,2.65rem);color:var(--text-strong);line-height:1.25;letter-spacing:-.025em}
.q-lead{font-size:.82rem;color:var(--muted);margin-top:.55rem;max-width:58rem;line-height:1.85}
.q-footer{
  border-top:1px solid var(--border);padding:1.5rem 1rem;text-align:center;
  font-size:.7rem;color:var(--muted);
}

/* ===== 面板 / 卡片 ===== */
.q-panel{
  background:var(--card);border:1px solid var(--border);border-radius:var(--radius-lg);
  padding:1.1rem 1.2rem;margin-top:1.1rem;box-shadow:var(--shadow);
}
.q-panel-head{display:flex;flex-wrap:wrap;gap:.5rem;align-items:baseline;justify-content:space-between}
.q-section-title{
  font-family:var(--font-serif);font-size:1.05rem;color:var(--text-strong);
  display:flex;align-items:center;gap:.6rem;
}
.q-section-title::after{content:'';flex:1;height:1px;background:var(--border);min-width:1rem}
.q-card{
  border:1px solid var(--border);border-radius:var(--radius-md);
  padding:.9rem 1rem;background:var(--bg-soft);
}
.q-hint{font-size:.72rem;color:var(--muted);line-height:1.7}
.q-meta{font-size:.72rem;color:var(--muted);letter-spacing:.02em}
.q-mono{font-family:var(--mono);font-size:.7rem}
.q-row{display:flex;flex-wrap:wrap;gap:.5rem;align-items:center}
.q-row-center{justify-content:center;margin-top:.9rem}
.q-row-end{justify-content:flex-end}
/* 间距工具类：代替 HTML 里的行内 style（页面的 CSP 只保证 script 同源，样式尽量走类） */
.q-mt4{margin-top:.4rem}
.q-mt5{margin-top:.5rem}
.q-mt6{margin-top:.6rem}
.q-mt8{margin-top:.8rem}
.q-mt9{margin-top:.9rem}
.q-mt10{margin-top:1rem}
.field-grow{flex:1 1 14rem}
.q-stack{display:flex;flex-direction:column;gap:.6rem}

/* ===== 按钮 ===== */
.q-btn{
  font-size:.8rem;padding:.42rem 1rem;border-radius:var(--radius-sm);
  border:1px solid var(--border);color:var(--text);
  transition:background-color .2s ease,color .2s ease,border-color .2s ease,opacity .2s ease;
}
.q-btn:hover{border-color:var(--accent);color:var(--accent)}
.q-btn:disabled{opacity:.5;cursor:not-allowed}
.q-btn:disabled:hover{border-color:var(--border);color:var(--text)}
.q-btn-primary{background:var(--accent);border-color:transparent;color:var(--on-accent)}
.q-btn-primary:hover{background:var(--accent);color:var(--on-accent);opacity:.88}
.q-btn-primary:disabled:hover{background:var(--accent);color:var(--on-accent)}
.q-btn-danger{color:var(--danger);border-color:var(--danger-soft)}
.q-btn-danger:hover{color:var(--on-danger);background:var(--danger);border-color:var(--danger)}
.q-btn-sm{font-size:.72rem;padding:.22rem .6rem}
.q-btn-block{width:100%}

/* ===== 内联提示条 ===== */
.q-banner{
  display:flex;gap:.6rem;align-items:flex-start;margin-top:1rem;
  padding:.7rem .9rem;border-radius:var(--radius-md);border:1px solid var(--border);
  font-size:.8rem;line-height:1.6;background:var(--card);
}
.q-banner[hidden]{display:none}
.q-banner-msg{flex:1;min-width:0;white-space:pre-wrap}
.q-banner-close{font-size:.75rem;color:var(--muted);flex:none;padding:0 .2rem}
.q-banner-close:hover{color:var(--text)}
.q-banner-error{border-color:var(--danger-soft);background:var(--danger-soft);color:var(--danger)}
.q-banner-ok{border-color:var(--ok-soft);background:var(--ok-soft);color:var(--ok)}
.q-banner-warn{border-color:var(--warn-soft);background:var(--warn-soft);color:var(--warn)}

/* ===== 徽标 ===== */
.q-badge{
  display:inline-block;padding:.05rem .5rem;border-radius:var(--radius-pill);
  font-size:.66rem;line-height:1.6;border:1px solid var(--border);
  color:var(--muted);background:var(--bg-soft);
  /* 提示码可能很长（未知码原样显示），必须允许换行并限制宽度，
     否则 nowrap 会把 390px 的页面撑出横向滚动 */
  white-space:normal;overflow-wrap:anywhere;max-width:100%;
}
.q-badge-ok{color:var(--ok);border-color:var(--ok-soft);background:var(--ok-soft)}
.q-badge-err{color:var(--danger);border-color:var(--danger-soft);background:var(--danger-soft)}
.q-badge-warn{color:var(--warn);border-color:var(--warn-soft);background:var(--warn-soft)}
.q-badge-accent{color:var(--accent);border-color:var(--accent-soft);background:var(--accent-soft)}
.q-badges{display:flex;flex-wrap:wrap;gap:.3rem;align-items:center}

/* ===== 题库列表（练习页）===== */
.bank-list{display:grid;gap:.8rem;grid-template-columns:1fr;margin-top:.9rem}
@media (min-width:700px){.bank-list{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (min-width:1100px){.bank-list{grid-template-columns:repeat(3,minmax(0,1fr))}}
.bank-card{
  display:flex;flex-direction:column;gap:.45rem;text-align:left;
  border:1px solid var(--border);border-radius:var(--radius-md);
  padding:.9rem 1rem;background:var(--bg-soft);min-width:0;
  transition:border-color .2s ease,background-color .2s ease,translate .3s ease;
}
.bank-card:hover{border-color:var(--accent);background:var(--card-hover);translate:0 -2px}
.bank-card-title{font-family:var(--font-serif);font-size:1rem;color:var(--text-strong);line-height:1.4}
.bank-card-desc{font-size:.78rem;color:var(--muted);white-space:pre-wrap}
.bank-card-meta{font-size:.72rem;color:var(--muted)}
.q-empty{
  border:1px dashed var(--border);border-radius:var(--radius-md);
  padding:2rem 1rem;text-align:center;color:var(--muted);margin-top:.9rem;
}
.q-empty .q-btn{margin-top:.7rem}
.q-empty h3{font-family:var(--font-serif);font-size:1rem;color:var(--text);margin-bottom:.3rem}
.q-empty p{font-size:.78rem}

/* ---------- 题库工作台：左侧学习概况 / 右侧可搜索题库 ---------- */
.q-workbench{
  display:grid;grid-template-columns:minmax(15rem,19rem) minmax(0,1fr);
  gap:1rem;align-items:start;margin-top:1.2rem;
}
.q-workbench .q-panel{margin-top:0}
.q-panel.q-overview{position:sticky;top:4.6rem}
.q-kicker{margin-bottom:.2rem}
.q-overview .q-section-title,.q-library .q-section-title{font-size:1.2rem}
.q-overview .summary-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
.q-overview .summary-item:first-child{grid-column:1 / -1}
.q-overview .summary-val{font-size:1.45rem}
.q-overview .summary-item.is-unavailable .summary-val{color:var(--muted);font-family:var(--mono);font-size:1.2rem}
.q-overview .summary-item.is-unavailable .summary-lbl{color:var(--muted)}
.q-overview .summary-item.is-unavailable{background:var(--bg-soft);box-shadow:none;border-style:dashed}
.q-scope{margin-top:.75rem;padding-top:.65rem;border-top:1px dashed var(--border)}
.q-scope::before{content:"↳ ";color:var(--champagne)}
.q-library-head{align-items:center}
.q-library-head .q-meta{max-width:100%}
.bank-toolbar{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap;margin-top:.9rem}
.bank-search{
  flex:1 1 14rem;min-width:0;display:flex;align-items:center;gap:.5rem;
  height:2.75rem;padding:0 .85rem;border:1px solid var(--border);border-radius:12px;
  background:var(--surface-soft-grad);box-shadow:var(--inner-hair);
  cursor:text;
  transition:border-color var(--dur-2) var(--ease-out),box-shadow var(--dur-2) var(--ease-out);
}
.bank-search:focus-within{border-color:var(--accent);box-shadow:var(--inner-hair),var(--focus-ring)}
.bank-search svg{width:1rem;height:1rem;flex:none;fill:none;stroke:var(--muted);stroke-width:1.7;stroke-linecap:round}
.bank-search input{
  width:100%;height:100%;min-width:0;padding:0;border:0!important;border-radius:0;outline:0!important;
  background:transparent!important;box-shadow:none!important;appearance:none;
  font-size:.82rem;line-height:1.5;color:var(--text);
}
.bank-search input:focus,.bank-search input:focus-visible{border:0!important;box-shadow:none!important}
.bank-search input::placeholder{color:var(--muted)}
.bank-search input::-webkit-search-cancel-button{display:none}
.bank-result-count{font-family:var(--mono);font-size:.68rem;color:var(--muted);white-space:nowrap}
.bank-empty{margin-top:1rem}
.bank-empty .q-btn{margin:.7rem .2rem 0}
.bank-card{
  min-height:10.25rem;padding:1rem;justify-content:space-between;
  border-radius:16px;background:var(--surface-grad);
}
.bank-card-head{display:flex;align-items:flex-start;gap:.55rem;width:100%}
.bank-card-index{
  flex:none;font-family:var(--mono);font-size:.62rem;line-height:1.8;color:var(--champagne);
  border-bottom:1px solid rgba(197,165,117,.5);
}
.bank-card-head .bank-card-title{flex:1;min-width:0;font-size:1.04rem;line-height:1.5}
.bank-card-arrow{margin-left:auto;color:var(--accent);font-size:1rem;line-height:1.5;transition:transform var(--dur-2) var(--ease-out)}
.bank-card:hover .bank-card-arrow{transform:translate(2px,-2px)}
.bank-card-meta{
  display:flex;gap:.45rem;flex-wrap:wrap;margin-top:.65rem;padding-top:.55rem;
  border-top:1px dashed var(--border);font-variant-numeric:tabular-nums;
}
.bank-card-meta span{padding:.05rem .45rem;border-radius:var(--radius-pill);background:var(--accent-soft);color:var(--accent)}

/* ===== 学习概况 ===== */
.summary-grid{
  display:grid;gap:.7rem;margin-top:.8rem;
  grid-template-columns:repeat(auto-fit,minmax(min(8rem,100%),1fr));
}
.summary-item{
  border:1px solid var(--border);border-radius:var(--radius-md);
  padding:.6rem .7rem;background:var(--bg-soft);min-width:0;
}
.summary-val{
  font-family:var(--font-serif);font-size:1.15rem;font-weight:700;color:var(--text-strong);
  font-variant-numeric:tabular-nums;line-height:1.2;
}
.summary-lbl{font-size:.68rem;color:var(--muted);letter-spacing:.04em}

/* ===== 开始练习面板 ===== */
.start-panel{margin-top:.9rem;display:flex;flex-direction:column;gap:.7rem}
.field{display:flex;flex-direction:column;gap:.25rem;min-width:0}
.field-label{font-size:.74rem;color:var(--muted)}
.field input[type="text"],.field input[type="number"],.field select,.field textarea{
  width:100%;background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-sm);
  padding:.45rem .7rem;outline:none;
}
.field input:focus,.field select:focus,.field textarea:focus{border-color:var(--accent)}
.field textarea{min-height:4.5rem;resize:vertical;line-height:1.7}
.field-inline{display:flex;flex-wrap:wrap;gap:.6rem}
.field-inline>*{flex:1 1 8rem;min-width:0}

/* ===== 题目 ===== */
.q-question{border:1px solid var(--border);border-radius:var(--radius-md);padding:1.05rem 1.15rem;background:var(--bg-soft);min-width:0}
.q-question + .q-question{margin-top:.9rem}
.q-legend{
  display:flex;flex-wrap:wrap;gap:.4rem;align-items:center;
  padding:0 .2rem;font-size:.78rem;color:var(--muted);
}
.q-num{font-weight:600;color:var(--text-strong);font-size:.9rem}
.q-stem{
  white-space:pre-wrap;overflow-wrap:anywhere;
  font-size:1.04rem;line-height:1.85;margin:.55rem 0 .85rem;color:var(--text);
}
.q-options{display:flex;flex-direction:column;gap:.4rem}
.q-opt{
  display:flex;gap:.6rem;align-items:flex-start;min-width:0;
  border:1px solid var(--border);border-radius:var(--radius-sm);
  min-height:3rem;padding:.62rem .85rem;cursor:pointer;background:var(--card);
  transition:border-color .18s ease,background-color .18s ease;
}
.q-opt:hover{border-color:var(--accent);background:var(--card-hover)}
.q-opt input{flex:none;margin-top:.42rem;accent-color:var(--accent);width:1rem;height:1rem}
.q-opt:has(input:checked){border-color:var(--accent);background:var(--accent-soft)}
.q-opt-key{font-weight:700;color:var(--accent);flex:none;min-width:1.1rem}
.q-opt-text{flex:1;min-width:0;font-size:.95rem;line-height:1.7}
.q-opt-shortcut{
  flex:none;display:inline-flex;align-items:center;justify-content:center;
  width:1.35rem;height:1.35rem;margin-top:.18rem;border:1px solid var(--border);border-radius:6px;
  font-family:var(--mono);font-size:.58rem;line-height:1;color:var(--muted);background:var(--bg-soft);
}
.q-opt:has(input:checked) .q-opt-shortcut{border-color:color-mix(in srgb,var(--accent) 45%,var(--border));color:var(--accent);background:var(--card)}

/* 交卷操作条：吸底，手机上自动折行 */
.q-actionbar{
  position:sticky;bottom:0;z-index:10;display:flex;flex-wrap:wrap;gap:.6rem;
  align-items:center;justify-content:space-between;
  margin-top:1rem;padding:.7rem .2rem;background:var(--bg);
  border-top:1px solid var(--border);
}
.q-head-actions{display:flex;align-items:center;gap:.6rem;flex-wrap:wrap;justify-content:flex-end}
.q-focus-toggle{min-height:2rem}
.q-focus-hint{margin:.55rem 0 0;padding:.55rem .75rem;border:1px dashed rgba(23,107,82,.32);border-radius:10px;background:var(--accent-soft);color:var(--accent)}
.q-session-strip{
  display:flex;align-items:center;gap:.5rem .9rem;flex-wrap:wrap;margin:.4rem 0 .15rem;
  min-height:1.5rem;
}
.q-session-strip .q-hint{margin:0}
.q-draft-state{display:inline-flex;align-items:center;gap:.35rem;min-height:1.35em}
.q-draft-state::before{content:"";width:.4rem;height:.4rem;border-radius:50%;background:var(--champagne);flex:none}
.q-draft-state[data-state="saved"]{color:var(--ok)}
.q-draft-state[data-state="saved"]::before{background:var(--ok)}
.q-draft-state[data-state="saving"]::before{animation:q-pulse 1s ease-in-out infinite}
.q-draft-state[data-state="offline"],.q-draft-state[data-state="conflict"]{color:var(--warn)}
.q-draft-state[data-state="offline"]::before,.q-draft-state[data-state="conflict"]::before{background:var(--warn)}
.q-keyhint{margin-left:auto;font-family:var(--mono);font-size:.62rem;color:var(--muted);white-space:nowrap}
.q-progress{font-size:.8rem;color:var(--text);font-variant-numeric:tabular-nums}

/* ===== 结果 ===== */
.result-head{display:flex;flex-wrap:wrap;gap:.6rem;align-items:center;margin-top:.7rem}
.result-score{font-family:var(--font-serif);font-size:1.6rem;font-weight:700;color:var(--text-strong);font-variant-numeric:tabular-nums}
.res-item{border-left:3px solid var(--border)}
.res-ok{border-left-color:var(--ok)}
.res-bad{border-left-color:var(--danger)}
.res-miss{border-left-color:var(--muted)}
.q-opt-static{background:var(--card);cursor:default}
.q-opt-static:hover{border-color:var(--border);background:var(--card)}
.q-opt.is-answer{border-color:var(--ok);background:var(--ok-soft)}
.q-opt.is-answer:hover{border-color:var(--ok);background:var(--ok-soft)}
.q-opt.is-wrong{border-color:var(--danger);background:var(--danger-soft)}
.q-opt.is-wrong:hover{border-color:var(--danger);background:var(--danger-soft)}
.ans-line{font-size:.8rem;line-height:1.7;margin-top:.45rem}
.ans-line b{color:var(--text-strong)}
.explain{
  margin-top:.6rem;padding:.55rem .75rem;border-radius:var(--radius-sm);
  background:var(--bg);border:1px dashed var(--border);font-size:.8rem;
  line-height:1.75;white-space:pre-wrap;
}

/* ===== 管理页：上传 / 批次 ===== */
.q-file{display:flex;flex-wrap:wrap;gap:.6rem;align-items:center;min-width:0}
.q-file input[type="file"]{max-width:100%;font-size:.78rem;min-width:0}
.q-file-name{font-size:.75rem;color:var(--muted);min-width:0}
.q-list{display:flex;flex-direction:column;gap:.6rem;margin-top:.8rem}
.q-list-item{
  display:flex;flex-wrap:wrap;gap:.5rem;align-items:center;justify-content:space-between;
  border:1px solid var(--border);border-radius:var(--radius-md);
  padding:.6rem .8rem;background:var(--bg-soft);min-width:0;
}
.q-list-main{min-width:0;flex:1 1 12rem}
.q-list-title{font-size:.86rem;color:var(--text-strong);font-weight:600;line-height:1.5}
.stem-clamp{
  display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;
  white-space:pre-wrap;overflow-wrap:anywhere;font-weight:400;
}
.q-list-sub{font-size:.7rem;color:var(--muted)}
.q-list-actions{display:flex;flex-wrap:wrap;gap:.4rem;align-items:center;flex:none}
details.q-fold{border:1px solid var(--border);border-radius:var(--radius-md);padding:.5rem .8rem;background:var(--bg-soft);margin-top:.7rem}
details.q-fold>summary{cursor:pointer;font-size:.78rem;color:var(--muted)}
details.q-fold[open]>summary{margin-bottom:.6rem;color:var(--text)}
.q-excerpt{
  white-space:pre-wrap;overflow-wrap:anywhere;max-height:16rem;overflow:auto;
  font-family:var(--mono);font-size:.72rem;line-height:1.7;
  background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-sm);
  padding:.6rem .7rem;margin-top:.5rem;
}

/* ===== 管理页：候选校对 ===== */
.cand{border:1px solid var(--border);border-radius:var(--radius-md);padding:.85rem 1rem;background:var(--bg-soft)}
.cand + .cand{margin-top:.8rem}
.cand-head{display:flex;flex-wrap:wrap;gap:.4rem;align-items:center;justify-content:space-between;margin-bottom:.6rem}
.cand-editor{display:flex;flex-direction:column;gap:.6rem}
.opt-row{
  display:flex;flex-wrap:wrap;gap:.5rem;align-items:center;
  border:1px solid var(--border);border-radius:var(--radius-sm);
  padding:.4rem .6rem;background:var(--card);min-width:0;
}
.opt-row .q-opt-key{min-width:1rem}
.opt-row input[type="text"]{
  flex:1 1 10rem;min-width:0;background:var(--bg);border:1px solid var(--border);
  border-radius:var(--radius-sm);padding:.35rem .55rem;outline:none;
}
.opt-row input[type="text"]:focus{border-color:var(--accent)}
.opt-answer{display:flex;align-items:center;gap:.3rem;font-size:.72rem;color:var(--muted);white-space:nowrap;flex:none}
.opt-answer input{accent-color:var(--accent);width:.95rem;height:.95rem}
.q-num-input{width:5.5rem}
.q-divider{height:1px;background:var(--border);border:none;margin:.3rem 0}
.commit-bar{display:flex;flex-wrap:wrap;gap:.6rem;align-items:center;margin-top:.9rem}

/* ===== 组卷面板：单选/复选行、fieldset 复位 ===== */
.fieldset-reset{
  border:0;padding:0;margin:0;min-width:0;
  display:flex;flex-direction:column;gap:.35rem;
}
.q-choice-row{display:flex;flex-wrap:wrap;gap:.4rem .9rem}
.q-choice{
  display:flex;align-items:center;gap:.35rem;min-width:0;
  font-size:.78rem;color:var(--text);cursor:pointer;
}
.q-choice input{accent-color:var(--accent);width:1rem;height:1rem;flex:none}

/* ===== 组卷方式：分段控件（三个入口始终可见、可点击）=====
   选中态不只靠颜色：✓ 记号 + 实心高亮 + 加粗 + aria-pressed。
   窄屏允许换行，每段 flex:1 1 8rem，390px 也不会横向溢出。 */
.q-segments{
  display:flex;flex-wrap:wrap;gap:.3rem;min-width:0;
  padding:.25rem;border:1px solid var(--border);border-radius:var(--radius-md);
  background:var(--bg);
}
.q-segment{
  flex:1 1 8rem;min-width:0;
  display:flex;align-items:center;justify-content:center;gap:.3rem;
  padding:.45rem .6rem;border-radius:var(--radius-sm);
  border:1px solid transparent;background:transparent;color:var(--text);
  font-size:.78rem;line-height:1.45;text-align:center;
  transition:background-color .2s ease,color .2s ease,border-color .2s ease;
}
.q-segment:hover{border-color:var(--accent);color:var(--accent)}
.q-segment[aria-pressed="true"]{
  background:var(--accent);border-color:var(--accent);color:var(--on-accent);font-weight:600;
}
.q-segment[aria-pressed="true"]:hover{background:var(--accent);color:var(--on-accent);opacity:.9}
.q-seg-mark{flex:none;min-width:.72rem;font-size:.72rem;line-height:1;text-align:center}
.start-panel{
  padding:1rem;margin-top:1rem;border:1px solid var(--border);border-radius:16px;
  background:linear-gradient(180deg,rgba(23,107,82,.045),transparent 9rem),var(--surface-soft-grad);
}
.start-panel-head{padding-bottom:.8rem;border-bottom:1px solid var(--border)}
.start-panel-head .q-hint{margin-top:.3rem}
.q-mode-card{
  align-items:flex-start;justify-content:flex-start;gap:.65rem;
  min-height:4.75rem;padding:.8rem;text-align:left;
}
.q-mode-card .q-seg-mark{
  display:inline-flex;align-items:center;justify-content:center;flex:none;
  width:1.8rem;height:1.8rem;border-radius:50%;font-size:1rem;
  background:var(--accent-soft);color:var(--accent);border:1px solid rgba(23,107,82,.18);
}
.q-mode-card[aria-pressed="true"] .q-seg-mark{background:rgba(255,255,255,.2);color:var(--on-accent);border-color:currentColor}
.q-seg-copy{display:flex;flex-direction:column;gap:.2rem;min-width:0}
.q-seg-title{font-size:.86rem;line-height:1.45}
.q-seg-desc{font-size:.7rem;font-weight:400;line-height:1.65;opacity:.86}
.q-segment[aria-pressed="true"] .q-seg-desc{color:var(--on-accent);opacity:.82}

/* ===== 按占比：实时预览 ===== */
.q-total{
  font-size:.76rem;color:var(--text);line-height:1.7;
  font-variant-numeric:tabular-nums;overflow-wrap:anywhere;
}
.q-total.is-warn{color:var(--warn);font-weight:600}
.q-hint.is-warn{color:var(--warn)}
.ratio-preview{
  margin-top:.55rem;padding:.6rem .75rem;min-width:0;
  border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg);
}
.ratio-preview-line{
  font-size:.8rem;line-height:1.75;color:var(--text-strong);
  font-variant-numeric:tabular-nums;overflow-wrap:anywhere;
}
.ratio-preview-warn{
  margin:.3rem 0 0 1.1rem;font-size:.74rem;line-height:1.7;color:var(--warn);
}
.ratio-preview-warn li{overflow-wrap:anywhere}

/* ===== 按题型题量：选题量表（默认方式，一行一个题型）=====
   一行 = 题型名 + 可用题量 + − / 数值 / ＋ + 全部；下面单独一行放该行的文字警示。
   桌面两列（信息 / 控件），窄屏改单列自动换行，390px 不横向溢出。 */
.type-rows{display:flex;flex-direction:column;gap:.5rem;margin-top:.35rem}
.type-row{
  display:grid;grid-template-columns:minmax(0,1fr) auto;gap:.15rem .7rem;align-items:center;
  border:1px solid var(--border);border-radius:var(--radius-md);
  padding:.5rem .7rem;background:var(--bg-soft);min-width:0;
}
.type-row.is-disabled{opacity:.72}
.type-row-info{display:flex;flex-wrap:wrap;gap:.1rem .6rem;align-items:baseline;min-width:0}
.type-row-name{font-size:.88rem;font-weight:600;color:var(--text-strong)}
.type-row-avail{font-size:.72rem;color:var(--muted);font-variant-numeric:tabular-nums}
.type-row-ctrl{display:flex;align-items:center;gap:.35rem;flex:none;min-width:0}
.type-row-ctrl input[type="number"]{
  width:4.5rem;text-align:center;background:var(--bg);border:1px solid var(--border);
  border-radius:var(--radius-sm);padding:.32rem .4rem;outline:none;
  font-variant-numeric:tabular-nums;
}
.type-row-ctrl input[type="number"]:focus{border-color:var(--accent)}
.type-row-ctrl input[type="number"]:disabled{opacity:.6;cursor:not-allowed}
.type-row-warn{grid-column:1 / -1}
/* 步进按钮：到边界时禁用（不只靠颜色，disabled 属性 + 原生禁用样式） */
.q-step{
  flex:none;width:1.9rem;height:1.9rem;padding:0;
  display:inline-flex;align-items:center;justify-content:center;
  border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--card);
  color:var(--text-strong);font-size:1rem;line-height:1;
}
.q-step:hover{border-color:var(--accent);color:var(--accent)}
.q-step:disabled{opacity:.45;cursor:not-allowed;border-color:var(--border);color:var(--muted)}
.q-step:disabled:hover{border-color:var(--border);color:var(--muted)}
.type-row-all{flex:none;white-space:nowrap}
/* 合计 + 清空：底部一行，合计加粗突出 */
.type-total-row{
  display:flex;flex-wrap:wrap;gap:.4rem .7rem;align-items:center;
  justify-content:space-between;margin-top:.2rem;
}
.type-total-row .q-total{font-weight:600}
/* 可视化分布条：三段宽度由 app.js 用 style.width 写入（纯 CSS，不拼 HTML） */
.type-dist{margin-top:.1rem;min-width:0}
.type-dist-bar{
  display:flex;height:.7rem;border-radius:var(--radius-pill);overflow:hidden;
  background:var(--bg);border:1px solid var(--border);min-width:0;
}
.type-dist-seg{display:block;height:100%;width:0}
.type-dist-judge{background:var(--accent)}
.type-dist-single{background:var(--ok)}
.type-dist-multiple{background:var(--warn)}
.type-dist-bar.is-empty{opacity:.55}

/* ===== 组卷提示（非阻塞，服务端 warnings 原样展示）===== */
.q-notice{
  margin-top:.9rem;padding:.6rem .8rem;border-radius:var(--radius-md);
  border:1px solid var(--warn-soft);background:var(--warn-soft);color:var(--warn);
  font-size:.76rem;line-height:1.7;
}
.q-notice-title{font-weight:600}
.q-notice-list{margin:.25rem 0 0 1.1rem}
.q-notice-list li{overflow-wrap:anywhere}

/* ===== 答题卡（题目导航栏，sticky + 独立滚动区）===== */
.q-navpanel{
  position:sticky;top:3.1rem;z-index:15;
  margin-top:.9rem;padding:.6rem .7rem;min-width:0;
  background:var(--card);border:1px solid var(--border);border-radius:var(--radius-md);
}
.q-navpanel-head{
  display:flex;flex-wrap:wrap;gap:.2rem .8rem;
  align-items:baseline;justify-content:space-between;
}
.q-navpanel-title{font-size:.8rem;font-weight:600;color:var(--text-strong)}
.q-navpanel-summary{
  font-size:.74rem;color:var(--muted);
  font-variant-numeric:tabular-nums;overflow-wrap:anywhere;
}
/* 100 题也要可用：自动换行 + 自己的纵向滚动区，绝不横向溢出 */
.q-navgrid{
  display:flex;flex-wrap:wrap;gap:.3rem;margin-top:.5rem;
  max-height:9.5rem;overflow-y:auto;overscroll-behavior:contain;padding:.1rem;
}
.nav-btn{
  position:relative;flex:0 0 auto;min-width:2.1rem;height:2.1rem;padding:0 .3rem;
  display:inline-flex;align-items:center;justify-content:center;gap:.1rem;
  border:1px solid var(--border);border-radius:var(--radius-sm);
  background:var(--bg-soft);color:var(--text);
  font-size:.76rem;line-height:1;font-variant-numeric:tabular-nums;
}
.nav-btn:hover{border-color:var(--accent);color:var(--accent)}
/* 状态不只靠颜色：边线样式（实线/虚线）+ 图标（● ✓ ○ ✕ —）+ aria-label */
.nav-btn.is-answered{border-color:var(--ok);background:var(--ok-soft);color:var(--text-strong)}
.nav-btn.is-empty{border-style:dashed;color:var(--muted)}
.nav-btn.is-correct{border-color:var(--ok);background:var(--ok-soft)}
.nav-btn.is-wrong{border-color:var(--danger);background:var(--danger-soft)}
.nav-btn.is-miss{border-style:dashed;color:var(--muted)}
.nav-btn.is-current{outline:2px solid var(--accent);outline-offset:1px;font-weight:700}
.nav-mark{font-size:.6rem;line-height:1;opacity:.85}

/* ===== 卡片轮播：一屏一张卡，横向 translate 切换 ===== */
.q-carousel{
  margin-top:.9rem;overflow:hidden;border-radius:var(--radius-md);
  touch-action:pan-y;   /* 横向手势交给 JS，竖向滚动照常交给浏览器 */
  cursor:grab;
  /* 高度由 JS 按"当前这一题"实测高度设置（见 syncCarouselHeight）：
     轨道高度天然等于全套卷最高的卡，短题下方会空一大片。 */
  transition:height .26s var(--ease-out);
}
.q-carousel:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.q-carousel.is-dragging{cursor:grabbing}
.q-carousel.is-dragging *{user-select:none}
/* 轨道宽度恒等于视口宽：translateX(-N*100%) 才正好是一张卡的宽度；
   flex 子项 flex:0 0 100% 会溢出轨道，由 .q-carousel 的 overflow:hidden 裁掉 */
.q-track{
  display:flex;width:100%;align-items:stretch;
  transition:transform .26s var(--ease-out);will-change:transform;
}
.q-slide{flex:0 0 100%;min-width:0;display:flex}
.q-slide>*{flex:1;min-width:0}

/* 上一题 / 下一题 + 滑动提示 */
.q-swipe-row{
  display:flex;flex-wrap:wrap;gap:.5rem;align-items:center;
  justify-content:space-between;margin-top:.7rem;
}

/* ===== 窄屏微调 ===== */
@media (max-width:480px){
  .q-wrap{padding:.9rem .7rem 5.5rem}
  .q-panel{padding:.9rem .8rem}
  .q-title{font-size:1.25rem}
  .q-actionbar{padding:.6rem 0}
  .q-btn{padding:.45rem .8rem}
  .q-navpanel{top:2.9rem;padding:.5rem .55rem}
  .q-navgrid{max-height:7.5rem}
  .nav-btn{min-width:1.9rem;height:1.9rem;font-size:.7rem}
  /* 提示换到按钮下一行，避免两个按钮被挤成两行 */
  .q-swipe-row .q-hint{order:3;flex:1 1 100%;text-align:center}
  /* 组卷方式：窄屏每段独占一行，更好点 */
  .q-segment{flex:1 1 100%;justify-content:flex-start;text-align:left}
  /* 选题量表：窄屏单列，控件行自己换行，绝不给 390px 添横向滚动 */
  .type-row{grid-template-columns:minmax(0,1fr)}
  .type-row-ctrl{flex-wrap:wrap}
  .type-row-ctrl input[type="number"]{flex:1 1 3.5rem;width:auto;min-width:3.5rem}
  .type-total-row .q-total{flex:1 1 100%}
}

/* 专注模式：只收起页头/页脚与浏览框架，答题卡、题号和退出入口都保留。
   提示条不属于装饰 chrome：断网/鉴权/草稿冲突必须继续可见，不能一起隐藏。
   透明度偏好由首段 @media 统一关闭临时材质层，不影响信息与操作。 */
body.is-focus-mode .q-top,
body.is-focus-mode .q-footer,
body.is-focus-mode .q-page-intro,
body.is-focus-mode #resumeNote,
body.is-focus-mode #loginGate,
body.is-focus-mode .q-note{display:none!important}
body.is-focus-mode .q-wrap{max-width:1020px;padding-top:1rem}
body.is-focus-mode #banner{margin:0 0 .75rem}
body.is-focus-mode #practiceView{border-radius:20px}
body.is-focus-mode #practiceView .q-panel-head{padding-bottom:.55rem;border-bottom:1px solid var(--border)}
body.is-focus-mode #practiceSidebar{top:1rem}
body.is-exam .q-wrap{padding-top:.75rem}
body.is-exam #practiceView,
body.is-exam #resultView{margin-top:0}
body.is-exam .q-footer{display:none}
body.is-exam #practiceView .q-panel-head .q-section-title,
body.is-exam #resultView .q-panel-head .q-section-title{font-size:1.05rem}
@media (max-width:820px){
  body.is-focus-mode #practiceSidebar{top:auto}
}

/* 系统设置要求透明/减少动效时，玻璃退成近实色；不支持 backdrop-filter 时同理。
   近实色不是视觉遗憾，而是答题正文可读性的底线。 */
@media (prefers-reduced-transparency:reduce){
  :root{--glass-bg:var(--card);--glass-border:var(--border)}
  .q-top,.q-actionbar{-webkit-backdrop-filter:none!important;backdrop-filter:none!important;background:var(--card)!important}
}
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){
  .q-top,.q-actionbar{background:var(--card)!important}
}

/* ===== 页内确认框（替代 window.confirm；练习页与管理页共用） =====
   <dialog> + showModal()：不是原生模态，不阻塞渲染线程，沙箱 iframe 里也能显示。
   宽度用 min(94vw,26rem)，390px 窄屏不会横向溢出；颜色沿用主题令牌。 */
.q-confirm{
  width:min(94vw,26rem);max-width:100%;max-height:85vh;overflow:auto;
  padding:1rem 1.1rem 1.1rem;border:1px solid var(--border);border-radius:var(--radius-md);
  background:var(--card);color:var(--text);box-shadow:var(--shadow);
  /* 顶层的全局 reset 是 *{margin:0}，它会把 UA 给模态 dialog 的 margin:auto 覆盖掉，
     于是 showModal() 之后弹窗贴在左上角（而不是居中）。这里显式恢复居中。 */
  position:fixed;inset:0;margin:auto;height:fit-content;
}
.q-confirm::backdrop{background:rgba(0,0,0,.45)}
.q-confirm-title{
  font-family:var(--font-serif);font-size:1.02rem;line-height:1.5;
  color:var(--text-strong);margin-bottom:.45rem;
}
.q-confirm-message{font-size:.85rem;color:var(--text)}
.q-confirm-actions{display:flex;flex-wrap:wrap;gap:.5rem;justify-content:flex-end;margin-top:.95rem}

/* ===== 减少动态效果：关掉滑动动画与悬浮位移 ===== */
@media (prefers-reduced-motion:reduce){
  .q-track{transition:none}
  .q-btn,.bank-card,.skip-link{transition:none}
  .bank-card:hover{translate:0 0}
  .q-seg-copy,.q-seg-title,.q-seg-desc{transition:none!important}
}

/* ===================== 学习账号（架构 v1 A5） ===================== */

/* 页头的账号区：显示名 + 改密码 / 退出，或一个「登录」入口 */
.q-account{display:flex;align-items:center;gap:.4rem;flex-wrap:wrap}
.q-account-name{font-size:.86rem;color:var(--muted);max-width:10rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.q-account-btn{
  font:inherit;font-size:.82rem;line-height:1;
  padding:.42rem .6rem;border:1px solid var(--border);border-radius:.5rem;
  background:var(--card);color:var(--text);cursor:pointer;
}
.q-account-btn:hover{border-color:var(--accent);color:var(--accent)}
.q-account-btn:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
a.q-account-btn{text-decoration:none;display:inline-flex;align-items:center}
.q-account-login{border-color:var(--accent);color:var(--accent)}

/* 登录门禁：说明为什么不能直接开始 */
.q-gate{border-color:var(--accent);background:var(--card)}
.q-note{margin:.6rem 0 0}

/* 登录页：表单更紧凑，首屏就能看到按钮 */
#loginForm .field,#passwordForm .field{margin-top:.7rem}
#loginForm .field:first-child,#passwordForm .field:first-child{margin-top:0}
.q-actions-inline{display:flex;gap:.5rem;flex-wrap:wrap;margin-top:1rem;align-items:center}
.q-account-line{margin:.2rem 0 .6rem}
.q-foot-note{margin:1.2rem 0 0;font-size:.86rem;color:var(--muted)}
.q-foot-note a{color:var(--accent)}

/* 一次性临时密码：必须足够显眼，且明确"只显示这一次" */
.q-secret{
  margin-top:1rem;padding:.9rem 1rem;border:1px dashed var(--accent);
  border-radius:.6rem;background:var(--card);
}
.q-secret-title{margin:0 0 .4rem;font-weight:600}
.q-secret-value{margin:0 0 .5rem;font-size:1.05rem;word-break:break-all}
.q-secret-value code{
  display:inline-block;padding:.3rem .5rem;border-radius:.4rem;
  background:rgba(127,127,127,.14);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
}
.q-secret .q-btn{margin-top:.2rem}

/* 账号列表项要能换行：窄屏不允许横向溢出 */
.q-list-item{min-width:0}
.q-list-item .q-list-head{min-width:0}
.q-list-item .q-row{flex-wrap:wrap}

@media (max-width:480px){
  .q-account{width:100%;justify-content:flex-start}
  .q-account-name{max-width:100%}
  .q-secret{padding:.8rem}
}

/* ===================== 草稿状态与版本冲突（架构 v1 A4） ===================== */
#draftStatus{margin:.1rem 0 .4rem}
/* 草稿状态文字会从空→保存中→已保存反复变化；固定占位高度，
   避免它在自动保存时把下面的按钮行顶来顶去（真实用户点击会因此落空）。 */
#draftStatus{min-height:1.35em}
.q-notice.is-conflict{margin:.4rem 0 .6rem}
.q-notice.is-conflict .q-row{gap:.5rem;flex-wrap:wrap;margin-top:.5rem}

/* ===================== 「我的学习」进度与错题页（架构 v1 A3/A6） =====================
   本段是追加区：只新增 .pg-* 类，供 /quiz/progress.html 使用，不改动上面任何既有规则。
   390px 目标：一切都能换行、min-width:0，绝不产生横向滚动。 */

/* 题库选择：标签在上，下拉占满整行 */
.pg-bank-field{margin-top:.6rem}
.pg-bank-field select{width:100%}

/* 状态筛选：可换行的按钮组；选中态不只靠颜色（实心高亮 + 加粗 + aria-pressed） */
.pg-filters{display:flex;flex-wrap:wrap;gap:.35rem;margin-top:.8rem;min-width:0}
.pg-filter{
  flex:1 1 8rem;min-width:0;overflow-wrap:anywhere;
  padding:.4rem .6rem;border:1px solid var(--border);border-radius:var(--radius-sm);
  background:var(--bg-soft);color:var(--text);font-size:.76rem;line-height:1.5;text-align:center;
  transition:background-color .2s ease,color .2s ease,border-color .2s ease;
}
.pg-filter:hover{border-color:var(--accent);color:var(--accent)}
.pg-filter[aria-pressed="true"]{background:var(--accent);border-color:var(--accent);color:var(--on-accent);font-weight:600}
.pg-filter[aria-pressed="true"]:hover{background:var(--accent);color:var(--on-accent);opacity:.9}

/* 概览：五个状态 + 已发布题目总数（总数用强调边框，避免看漏对照项） */
.pg-stat-total{border-color:var(--accent);background:var(--accent-soft)}
.pg-stat-total .summary-val{color:var(--accent)}
.summary-item .summary-val{color:var(--text-strong)}
.summary-item.pg-stat-total .summary-val{color:var(--accent)}
.pg-val-ok{color:var(--ok)}
.pg-val-err{color:var(--danger)}
.pg-val-warn{color:var(--warn)}
.pg-sum{
  margin-top:.7rem;padding:.5rem .7rem;min-width:0;overflow-wrap:anywhere;
  border:1px dashed var(--border);border-radius:var(--radius-sm);background:var(--bg);
  font-size:.78rem;line-height:1.7;color:var(--text-strong);font-variant-numeric:tabular-nums;
}
.pg-sum.is-warn{border-color:var(--warn);color:var(--warn)}

/* 列表工具条：说明 + 每页数量，窄屏自动换行 */
.pg-listbar{
  display:flex;flex-wrap:wrap;gap:.4rem .8rem;align-items:flex-end;
  justify-content:space-between;margin-top:.7rem;
}
.pg-listbar .q-hint{flex:1 1 12rem;min-width:0;margin:0}
.pg-limit-field{flex:0 1 6rem;min-width:5rem}

/* 题目行：题干最多三行（复用 .stem-clamp），完整题干挂在 title 上 */
.pg-item{margin-top:0}
.pg-item .q-list-title{margin-top:.35rem}

@media (max-width:480px){
  .pg-filter{flex:1 1 100%;text-align:left}
  .pg-listbar{align-items:stretch}
  .pg-limit-field{flex:1 1 100%}
}

@media (prefers-reduced-motion:reduce){
  .pg-filter{transition:none}
}

/* 未完成练习提示（不打断题库列表） */
.q-resume{display:flex;gap:.6rem;align-items:center;flex-wrap:wrap;margin:.2rem 0 .8rem}

/* ===================== 两种作答模式 ===================== */

/* 刷题练习：确认后锁定并就地展示这一题的答案与解析 */
.q-feedback{display:flex;flex-wrap:wrap;gap:.5rem;align-items:center;margin-top:.6rem;padding:.6rem .75rem;border-radius:.5rem;border:1px solid currentColor}
.q-feedback-ok{color:var(--q-ok,#1a7f37);background:rgba(26,127,55,.08)}
.q-feedback-bad{color:var(--q-err,#b42318);background:rgba(180,35,24,.08)}
.q-feedback-answer{font-weight:600}
.q-explanation{margin:.5rem 0 0;padding:.55rem .7rem;border-left:3px solid currentColor;background:rgba(127,127,127,.08);white-space:pre-wrap}

/* 刷题结束页：只有结束说明，不给任何统计与分数 */
.practice-done{margin:.4rem 0 1rem;padding:1rem;border:1px solid rgba(127,127,127,.35);border-radius:.6rem;text-align:center}
.practice-done-line{margin:0 0 .35rem;font-size:1.15rem;font-weight:600}

/* ===== 我的套卷（005） ===== */
#paperSetsSection .q-list-item{align-items:flex-start}
#paperSetsSection .fieldset-reset{margin-bottom:.9rem}
#paperSetTypeRow input{max-width:5rem}
#paperSetCount,#paperSetTotal{max-width:6rem}
#paperSetPrefix{width:100%;max-width:24rem}
#paperSetList .q-list-sub{margin-top:.15rem}

/* ===== 答题页两栏布局：侧边栏（答题卡）+ 主区 =====
   目的：答题卡独立成栏，不再压在题目上方；题目区始终是视觉主角。
   窄屏（<=820px）自动折成一栏，答题卡变成题目上方的紧凑横条，
   仍然不遮挡答题区。 */
.q-quiz-layout{
  display:grid;gap:1rem;margin-top:.9rem;
  /* 列顺序必须与 DOM 顺序对齐：DOM 里 aside（答题卡）在前，所以窄列写在前。
     曾经把 1fr 写在前，结果答题卡吃掉 580px、题目只剩 232px（比例颠倒）。 */
  grid-template-columns:13.5rem minmax(0,1fr);
  align-items:start;
}
/* 短题（只有两个选项的判断题）也给一点体量，别让卡片缩成一小条 */
.q-quiz-main .q-question{min-height:17rem}
.q-quiz-main{min-width:0;display:flex;flex-direction:column}
/* 侧栏跟随滚动：长题也能随时跳题，而不必滚回顶部 */
.q-sidebar{
  position:sticky;top:3.4rem;min-width:0;
  background:var(--bg-soft);border:1px solid var(--border);
  border-radius:var(--radius-md);padding:.7rem .75rem;
}
.q-sidebar-title{
  font-size:.8rem;font-weight:600;color:var(--text-strong);
  margin:0 0 .1rem;font-family:var(--font-serif);
}
.q-sidebar-legend{font-size:.68rem;color:var(--muted);margin-top:.45rem;line-height:1.6}
/* 侧栏里的答题卡不再自己 sticky、也不重复画边框（已在侧栏内） */
.q-sidebar .q-navpanel{
  position:static;top:auto;z-index:auto;margin-top:.5rem;padding:0;
  background:transparent;border:none;border-radius:0;
}
/* 侧栏更窄，题号网格排得更密；100 题时给足纵向空间 */
/* 题号固定 5 列：flex 换行会因按钮宽 1px 之差掉到 4 列，33 题就从 7 行变 9 行、
   侧栏反而比题目还高。网格列数写死，行列都可预期。 */
.q-sidebar .q-navgrid{
  display:grid;grid-template-columns:repeat(5,minmax(0,1fr));
  gap:.28rem;margin-top:.5rem;max-height:min(52vh,26rem);overflow-y:auto;
}
.q-sidebar .nav-btn{min-width:0;width:100%;height:2rem;padding:0;font-size:.76rem;white-space:nowrap}

/* 主区里的轮播与操作条：去掉原先为「上方答题卡」留的顶边距 */
.q-quiz-main .q-carousel{margin-top:0}
/* 卡片按内容高度排布，不被网格行高拉长（否则题目下方会出现一大片空白） */
.q-quiz-main .q-track{align-items:flex-start}
.q-quiz-main .q-slide{align-items:flex-start}
.q-quiz-main .q-actionbar{margin-top:.8rem}

/* 中等宽度及以下：折成一栏，答题卡作为紧凑横条放在题目上方（横向滚动，不占竖向空间） */
@media (max-width:820px){
  .q-quiz-layout{grid-template-columns:minmax(0,1fr);gap:.75rem}
  .q-sidebar{position:static;top:auto;padding:.55rem .6rem}
  .q-sidebar .q-navgrid{
    display:grid;grid-auto-flow:column;grid-template-columns:none;grid-template-rows:1fr;
    grid-auto-columns:2.1rem;
    overflow-x:auto;overflow-y:hidden;
    max-height:none;padding-bottom:.2rem;margin-top:.4rem;
  }
  .q-sidebar .q-sidebar-legend{display:none}   /* 窄屏省一行高度，图例在题号上是自解释的 */
}

/* ============================================================================
   视觉升级（材质 / 玻璃 / 微动效）
   ----------------------------------------------------------------------------
   设计原则（和博客站保持同一套语言）：
   1. 表面分两级：面板用「渐变 + 三层阴影 + 内高光」，让卡片有厚度；
   2. 玻璃只用在**吸顶/吸底**这类固定层（模糊有成本，不能到处用；
      博客实测 blur(14px) 会把掉帧拉到 3.8%，所以仅在固定层开小半径模糊）；
   3. 动效只动 transform / opacity / box-shadow，时长 120–320ms，
      并遵守 prefers-reduced-motion；
   4. 所有装饰性伪元素都 pointer-events:none，不影响点击命中。
   ========================================================================== */

/* ---------- 全局：字体渲染 / 背景氛围 / 选区 / 滚动条 ---------- */
html{-webkit-text-size-adjust:100%;text-size-adjust:100%}
body{
  -webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;
  text-rendering:optimizeLegibility;
  /* 背景氛围光：三团极淡的径向渐变，给纯色底一点深度（纯 CSS，不加载图片） */
  background:
    radial-gradient(58rem 30rem at 12% -8%, var(--halo-1), transparent 62%),
    radial-gradient(46rem 26rem at 92% 2%, var(--halo-2), transparent 60%),
    radial-gradient(52rem 34rem at 50% 108%, var(--halo-3), transparent 66%),
    var(--bg);
  background-attachment:fixed;
}
::selection{background:var(--accent-soft);color:var(--text-strong)}
/* 细滚动条：桌面端不再出现一条醒目的系统滚动条 */
@supports (scrollbar-width:thin){
  *{scrollbar-width:thin;scrollbar-color:var(--border-strong) transparent}
}
.q-navgrid::-webkit-scrollbar,.q-confirm::-webkit-scrollbar{width:6px;height:6px}
.q-navgrid::-webkit-scrollbar-thumb,.q-confirm::-webkit-scrollbar-thumb{
  background:var(--border-strong);border-radius:999px;
}
.q-navgrid::-webkit-scrollbar-track,.q-confirm::-webkit-scrollbar-track{background:transparent}

/* 键盘焦点：统一光圈，鼠标点击不出现 */
:where(.q-wrap a,.q-wrap button,.q-wrap input,.q-wrap select,.q-wrap textarea,.q-wrap [tabindex]):focus-visible,
.q-confirm button:focus-visible{
  outline:none;box-shadow:var(--focus-ring);border-color:var(--accent);
}

/* ---------- 页头：玻璃吸顶 + 发丝线 ---------- */
.q-top{
  background:var(--glass-bg);
  border-bottom:1px solid var(--glass-border);
  box-shadow:var(--raise-1);
  padding-top:calc(.6rem + env(safe-area-inset-top,0px));
  transition:box-shadow var(--dur-2) var(--ease-out),background-color var(--dur-2) var(--ease-out);
}
@supports ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){
  .q-top{
    -webkit-backdrop-filter:blur(var(--glass-blur)) saturate(1.5);
    backdrop-filter:blur(var(--glass-blur)) saturate(1.5);
  }
}
.q-brand{
  display:inline-flex;align-items:center;gap:.3rem;
  padding:.3rem .55rem;margin-left:-.55rem;border-radius:var(--radius-pill);
  transition:background-color var(--dur-2) var(--ease-out),color var(--dur-2) var(--ease-out);
}
.q-brand:hover{background:var(--accent-soft)}
.q-nav{gap:.25rem;padding:.2rem;border-radius:var(--radius-pill);background:var(--surface-soft-grad);border:1px solid var(--border)}
.q-nav-link{
  padding:.34rem .85rem;font-weight:500;
  transition:color var(--dur-2) var(--ease-out),background-color var(--dur-2) var(--ease-out),box-shadow var(--dur-2) var(--ease-out);
}
.q-nav-link:hover{background:var(--card);border-color:transparent;box-shadow:var(--raise-1)}
.q-nav-link.is-active{
  background:var(--accent-grad);color:var(--on-accent);
  box-shadow:var(--accent-glow),var(--inner-light);
}

/* ---------- 标题区 ---------- */
.q-title{letter-spacing:-.01em}
.q-lead{line-height:1.75}

/* ---------- 面板：渐变表面 + 三层阴影 + 内高光 ---------- */
.q-panel{
  position:relative;overflow:hidden;
  background:var(--surface-grad);
  border:1px solid var(--border);
  border-radius:20px;
  box-shadow:var(--raise-2),var(--inner-light);
  transition:box-shadow var(--dur-3) var(--ease-out),transform var(--dur-3) var(--ease-out);
}
.q-panel::before{
  content:"";position:absolute;inset:0;pointer-events:none;border-radius:inherit;
  background:radial-gradient(18rem 12rem at var(--sheen-x,50%) var(--sheen-y,0%),
    rgba(255,255,255,.34),transparent 68%);
  opacity:0;transition:opacity var(--dur-3) var(--ease-out);
}
@media (hover:hover) and (pointer:fine){.q-panel:hover::before{opacity:.55}}
.q-panel::before{mix-blend-mode:soft-light}
@media (prefers-reduced-motion:reduce),(prefers-reduced-transparency:reduce){
  .q-panel::before{display:none}
}
.q-panel:hover{box-shadow:var(--raise-3),var(--inner-light)}
.q-card{
  background:var(--surface-soft-grad);
  box-shadow:var(--inner-hair),var(--raise-1);
  transition:box-shadow var(--dur-2) var(--ease-out),border-color var(--dur-2) var(--ease-out);
}
.q-section-title{letter-spacing:.01em}
.q-section-title::after{background:linear-gradient(90deg,var(--border),transparent)}

/* ---------- 按钮：渐变主按钮 + 抬升/按下 + 光晕 ---------- */
.q-btn{
  display:inline-flex;align-items:center;justify-content:center;gap:.35rem;
  font-weight:500;border-radius:12px;cursor:pointer;
  background:var(--surface-grad);
  box-shadow:var(--raise-1),var(--inner-light);
  transition:transform var(--dur-1) var(--ease-out),box-shadow var(--dur-2) var(--ease-out),
             background-color var(--dur-2) var(--ease-out),border-color var(--dur-2) var(--ease-out),color var(--dur-2) var(--ease-out);
}
.q-btn:hover:not(:disabled){transform:translateY(-1px);box-shadow:var(--raise-2),var(--inner-light)}
.q-btn:active:not(:disabled){transform:translateY(0) scale(.985);box-shadow:var(--raise-1)}
.q-btn:disabled{box-shadow:none;background:var(--card-hover);transform:none}
.q-btn:hover:not(:disabled){transform:translateY(-1px);box-shadow:var(--raise-2),var(--inner-light)}
.q-btn:active:not(:disabled){transform:translateY(0) scale(.985);box-shadow:var(--raise-1)}
.q-btn-primary{
  background:var(--accent-grad);border-color:transparent;color:var(--on-accent);
  box-shadow:var(--accent-glow),var(--inner-light);
}
.q-btn-primary:hover:not(:disabled){background:var(--accent-grad);color:var(--on-accent);opacity:1;box-shadow:var(--accent-glow),var(--raise-2)}
.q-btn-primary:disabled{background:var(--accent);color:var(--on-accent)}
.q-btn-danger:hover:not(:disabled){background:var(--danger);border-color:var(--danger);color:var(--on-danger);box-shadow:0 8px 20px -8px rgba(230,57,70,.6)}
.q-btn-sm{padding:.3rem .7rem}
.q-btn-quiet{background:transparent;box-shadow:none;border-color:var(--border)}
.q-btn-quiet:hover:not(:disabled){background:var(--card);box-shadow:var(--raise-1)}

/* ---------- 分段控件：像卡片一样可点，激活时带渐变与光晕 ---------- */
.q-segment{
  border-radius:12px;background:var(--surface-grad);box-shadow:var(--inner-light);
  transition:transform var(--dur-1) var(--ease-out),box-shadow var(--dur-2) var(--ease-out),
             border-color var(--dur-2) var(--ease-out),background-color var(--dur-2) var(--ease-out);
}
.q-segment:hover:not(:disabled){transform:translateY(-1px);border-color:var(--accent);box-shadow:var(--raise-1),var(--inner-light)}
/* 选中态使用 --on-accent：浅色主题白字，深色主题浅翡翠底改用深墨绿字。 */
.q-segment[aria-pressed="true"],.q-segment.is-active{
  background:var(--accent-grad);border-color:transparent;color:var(--on-accent);font-weight:600;
  box-shadow:var(--accent-glow),var(--inner-light);
}
.q-segment[aria-pressed="true"]:hover{background:var(--accent-grad);color:var(--on-accent);opacity:1}
.q-seg-mark{font-weight:700}

/* ---------- 表单控件 ---------- */
.q-wrap input[type="number"],.q-wrap input[type="text"],.q-wrap input[type="password"],
.q-wrap input[type="search"],.q-wrap select,.q-wrap textarea{
  background:var(--surface-grad);border:1px solid var(--border);border-radius:10px;
  box-shadow:var(--inner-hair);
  transition:border-color var(--dur-2) var(--ease-out),box-shadow var(--dur-2) var(--ease-out),background-color var(--dur-2) var(--ease-out);
}
.q-wrap input:hover:not(:disabled),.q-wrap select:hover:not(:disabled),.q-wrap textarea:hover:not(:disabled){border-color:var(--border-strong)}
.q-wrap input:focus,.q-wrap select:focus,.q-wrap textarea:focus{outline:none;border-color:var(--accent);box-shadow:var(--focus-ring)}

/* ---------- 学习概况：数字有分量 ---------- */
.summary-item{
  background:var(--surface-grad);border:1px solid var(--border);border-radius:14px;
  box-shadow:var(--raise-1),var(--inner-light);
  transition:transform var(--dur-2) var(--ease-out),box-shadow var(--dur-2) var(--ease-out);
}
.summary-item:hover{transform:translateY(-1px);box-shadow:var(--raise-2),var(--inner-light)}
.summary-val{font-variant-numeric:tabular-nums;letter-spacing:-.01em}
.summary-lbl{letter-spacing:.06em;text-transform:none}

/* ---------- 题库卡片：hover 抬升 + 光晕 + 右侧箭头 ---------- */
.bank-card{
  position:relative;overflow:hidden;
  background:var(--surface-grad);border:1px solid var(--border);border-radius:16px;
  box-shadow:var(--raise-1),var(--inner-light);
  transition:transform var(--dur-2) var(--ease-out),box-shadow var(--dur-2) var(--ease-out),border-color var(--dur-2) var(--ease-out);
}
.bank-card::after{
  content:"";position:absolute;inset:0;pointer-events:none;border-radius:inherit;
  background:radial-gradient(22rem 12rem at 100% 0%,var(--accent-soft),transparent 60%);
  opacity:0;transition:opacity var(--dur-3) var(--ease-out);
}
.bank-card:hover{transform:translateY(-2px);border-color:var(--accent);box-shadow:var(--raise-2),var(--inner-light)}
.bank-card:hover::after{opacity:1}
.bank-card-title{letter-spacing:.005em}

/* ---------- 提示条：左色条 + 轻微入场 ---------- */
.q-banner{
  border-left:3px solid var(--accent);
  background:var(--surface-grad);box-shadow:var(--raise-1),var(--inner-light);
  animation:q-fade-down var(--dur-3) var(--ease-out) both;
}
.q-banner-ok{border-left-color:var(--ok)}
.q-banner-warn{border-left-color:var(--warn)}
.q-banner-error{border-left-color:var(--danger)}

/* ---------- 答题页：玻璃侧栏 / 题目卡材质 / 选项交互 ---------- */
.q-sidebar{
  background:var(--surface-grad);
  border:1px solid var(--border);
  border-radius:16px;
  box-shadow:var(--raise-2),var(--inner-light);
}
.q-question{
  background:var(--surface-grad);
  border:1px solid var(--border);
  border-radius:18px;
  box-shadow:var(--raise-2),var(--inner-light);
  transition:box-shadow var(--dur-3) var(--ease-out);
}
.q-legend{
  padding-bottom:.15rem;
  border-bottom:1px dashed var(--border);
  border-radius:0;
}
.q-num{font-variant-numeric:tabular-nums}
.q-stem{text-wrap:pretty}
.q-opt{
  background:var(--surface-grad);
  border:1px solid var(--border);
  border-radius:12px;
  box-shadow:var(--inner-light);
  transition:transform var(--dur-1) var(--ease-out),box-shadow var(--dur-2) var(--ease-out),
             border-color var(--dur-2) var(--ease-out),background-color var(--dur-2) var(--ease-out);
}
.q-opt:hover{border-color:var(--accent);transform:translateY(-1px);box-shadow:var(--raise-1),var(--inner-light)}
.q-opt:active{transform:translateY(0) scale(.996)}
.q-opt:has(input:checked){
  background:linear-gradient(180deg,var(--accent-soft),color-mix(in srgb,var(--accent) 14%,transparent));
  border-color:var(--accent);
  box-shadow:var(--inner-light),inset 0 0 0 1px var(--accent),0 6px 16px -10px rgba(23,107,82,.42);
}
/* 选中时选项字母加一个轻微弹跳，给"点到了"的确定感 */
.q-opt:has(input:checked) .q-opt-key{animation:q-pop var(--dur-3) var(--ease-spring) both}
.q-opt-key{
  display:inline-flex;align-items:center;justify-content:center;
  width:1.45rem;height:1.45rem;border-radius:999px;
  background:var(--accent-soft);color:var(--accent);
  font-size:.8rem;transition:background-color var(--dur-2) var(--ease-out),color var(--dur-2) var(--ease-out);
}
.q-opt:has(input:checked) .q-opt-key{background:var(--accent);color:var(--on-accent)}
.q-opt.is-answer{box-shadow:var(--inner-light),inset 0 0 0 1px var(--ok)}
.q-opt.is-wrong{box-shadow:var(--inner-light),inset 0 0 0 1px var(--danger)}
.q-opt-mark{
  font-size:.68rem;padding:.12rem .45rem;border-radius:999px;
  background:var(--card);border:1px solid currentColor;color:inherit;
}
.q-feedback{
  border-radius:12px;box-shadow:var(--inner-hair);
  animation:q-fade-up var(--dur-3) var(--ease-out) both;
}
.q-feedback::before{font-weight:700}
.q-feedback-ok::before{content:"✓";color:var(--ok)}
.q-feedback-bad::before{content:"×";color:var(--danger)}
.q-explanation{
  border-left:2px solid var(--border);padding-left:.7rem;line-height:1.8;
}

/* 答题卡题号：状态更清楚，当前题有光晕 */
.q-sidebar .nav-btn{
  border-radius:9px;background:var(--surface-grad);box-shadow:var(--inner-light);
  transition:transform var(--dur-1) var(--ease-out),box-shadow var(--dur-2) var(--ease-out),
             border-color var(--dur-2) var(--ease-out),background-color var(--dur-2) var(--ease-out);
}
.q-sidebar .nav-btn:hover{transform:translateY(-1px);box-shadow:var(--raise-1),var(--inner-light)}
.nav-btn.is-answered{background:var(--ok-soft);border-color:var(--ok);color:var(--text-strong)}
.nav-btn.is-correct{background:var(--ok-soft);border-color:var(--ok)}
.nav-btn.is-wrong{background:var(--danger-soft);border-color:var(--danger)}
.nav-btn.is-current{
  outline:none;border-color:transparent;color:var(--on-accent);
  background:var(--accent-grad);
  box-shadow:var(--accent-glow),var(--inner-light);
  transform:translateY(-1px);
}

/* 操作条：玻璃吸底 */
.q-actionbar{
  background:var(--glass-bg);
  border-top:1px solid var(--glass-border);
  box-shadow:0 -8px 24px -18px rgba(20,18,12,.4);
  border-radius:12px;
  padding-bottom:calc(.7rem + env(safe-area-inset-bottom,0px));
}
@supports ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){
  .q-actionbar{
    -webkit-backdrop-filter:blur(var(--glass-blur)) saturate(1.4);
    backdrop-filter:blur(var(--glass-blur)) saturate(1.4);
  }
}
.q-progress{letter-spacing:.01em}

/* 当前这一题：换页时轻微上浮淡入（只动 opacity/transform） */
.q-quiz-main .q-slide.is-current .q-question{animation:q-card-in var(--dur-3) var(--ease-out) both}
.q-quiz-main .q-slide.is-current .q-feedback{animation:q-fade-up var(--dur-3) var(--ease-out) both}

/* ---------- 结果页：分数区有仪式感 ---------- */
/* 分数条做成一条"英雄卡"：渐变光晕 + 材质底 + 大号数字 */
#resultScoreHead{
  position:relative;overflow:hidden;
  margin-top:.95rem;padding:.95rem 1.15rem;border-radius:16px;
  background:
    radial-gradient(34rem 12rem at 4% -30%, var(--accent-soft), transparent 72%),
    var(--surface-soft-grad);
  border:1px solid var(--border);
  box-shadow:var(--raise-1),var(--inner-light);
  gap:.85rem;
}
#resultScoreHead::after{
  content:"";position:absolute;inset:0;pointer-events:none;border-radius:inherit;
  background:linear-gradient(120deg,transparent 55%,rgba(255,255,255,.35) 78%,transparent 95%);
  opacity:.6;
}
#resultScoreHead .result-score{font-size:2.35rem;line-height:1.05}
#resultScoreHead .q-meta{margin-left:auto}
.result-score{
  background:var(--accent-grad);-webkit-background-clip:text;background-clip:text;color:transparent;
  font-size:1.9rem;letter-spacing:-.02em;
  filter:drop-shadow(0 6px 14px rgba(23,107,82,.24));
}
.ans-line{
  padding:.35rem .6rem;border-radius:8px;background:var(--surface-soft-grad);
  box-shadow:var(--inner-hair);
}

/* ---------- 结果可视化：服务端交卷后返回的数据才画 ---------- */
.result-viz{
  display:grid;grid-template-columns:minmax(7rem,8.5rem) minmax(0,1fr);gap:1rem;align-items:center;
  margin-top:.75rem;padding:.9rem 1rem;border:1px solid var(--border);border-radius:16px;
  background:var(--surface-soft-grad);box-shadow:var(--inner-hair);
}
.result-ring{
  --result-percent:0;
  width:7rem;height:7rem;justify-self:center;display:grid;place-items:center;border-radius:50%;
  background:conic-gradient(var(--accent) calc(var(--result-percent) * 1%),var(--border) 0);
  position:relative;
}
.result-ring::before{content:"";position:absolute;inset:.5rem;border-radius:50%;background:var(--card);box-shadow:var(--inner-light)}
.result-ring-inner{position:relative;display:flex;flex-direction:column;align-items:center;gap:.1rem;text-align:center}
.result-ring-inner strong{font-family:var(--font-serif);font-size:1.35rem;color:var(--text-strong);font-variant-numeric:tabular-nums}
.result-ring-inner span{font-size:.62rem;color:var(--muted)}
.result-legend{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:.45rem}
.result-legend-row{
  display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:.25rem .4rem;
  padding:.5rem .6rem;border:1px solid var(--border);border-radius:10px;background:var(--card);min-width:0;
}
.result-legend-dot{width:.48rem;height:.48rem;border-radius:50%;background:var(--muted)}
.result-legend-row.is-correct .result-legend-dot{background:var(--ok)}
.result-legend-row.is-wrong .result-legend-dot{background:var(--danger)}
.result-legend-row.is-missed .result-legend-dot{background:var(--champagne)}
.result-legend-label{font-size:.7rem;color:var(--muted);white-space:nowrap}
.result-legend-value{font-family:var(--font-serif);font-size:1rem;color:var(--text-strong);font-variant-numeric:tabular-nums}
.result-legend-share{grid-column:2 / -1;font-family:var(--mono);font-size:.62rem;color:var(--muted)}
.result-dist-bar{display:flex;height:.45rem;margin-top:.6rem;border-radius:999px;overflow:hidden;background:var(--border)}
.result-dist-seg{display:block;height:100%}
.result-dist-seg.is-correct{background:var(--ok)}
.result-dist-seg.is-wrong{background:var(--danger)}
.result-dist-seg.is-missed{background:var(--champagne)}

/* ---------- 列表项 / 套卷 ---------- */
.q-list-item{
  background:var(--surface-grad);border:1px solid var(--border);border-radius:14px;
  box-shadow:var(--raise-1),var(--inner-light);
  transition:transform var(--dur-2) var(--ease-out),box-shadow var(--dur-2) var(--ease-out),border-color var(--dur-2) var(--ease-out);
}
.q-list-item:hover{transform:translateY(-1px);border-color:var(--border-strong);box-shadow:var(--raise-2),var(--inner-light)}

/* ---------- 徽章 / 标签：小而有质感 ---------- */
.q-badge{
  display:inline-flex;align-items:center;gap:.2rem;
  padding:.14rem .5rem;border-radius:999px;
  background:var(--surface-soft-grad);border:1px solid var(--border);
  box-shadow:var(--inner-light);
  font-size:.7rem;color:var(--muted);white-space:nowrap;
}
.q-badge-accent{
  color:var(--accent);border-color:color-mix(in srgb,var(--accent) 30%,var(--border));
  background:var(--accent-soft);
}

/* ---------- 确认框：材质 + 入场 ---------- */
.q-confirm{
  border-radius:18px;box-shadow:var(--raise-3),var(--inner-light);
  animation:q-dialog-in var(--dur-3) var(--ease-out) both;
}
.q-confirm::backdrop{background:rgba(18,16,12,.42);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}

/* ---------- 动效关键帧 ---------- */
@keyframes q-card-in{
  from{opacity:0;transform:translateY(8px) scale(.998)}
  to{opacity:1;transform:none}
}
@keyframes q-fade-up{
  from{opacity:0;transform:translateY(6px)}
  to{opacity:1;transform:none}
}
@keyframes q-fade-down{
  from{opacity:0;transform:translateY(-6px)}
  to{opacity:1;transform:none}
}
@keyframes q-pop{
  0%{transform:scale(.82)}
  60%{transform:scale(1.08)}
  100%{transform:scale(1)}
}
@keyframes q-dialog-in{
  from{opacity:0;transform:translateY(8px) scale(.985)}
  to{opacity:1;transform:none}
}
@keyframes q-pulse{
  0%,100%{opacity:.45;transform:scale(.85)}
  50%{opacity:1;transform:scale(1)}
}

/* ---------- 响应式微调 ---------- */
/* 只在"中等桌面宽度"收窄侧栏；≤820 已经折成单栏，这里如果写成 max-width:1024
   会连手机宽度一起命中，把手机又拉回两栏（实测 390px 会被挤成一条窄缝）。 */
@media (min-width:821px) and (max-width:1024px){
  .q-quiz-layout{grid-template-columns:12.5rem minmax(0,1fr)}
}
@media (max-width:820px){
  .q-wrap{padding:1.25rem 1rem 5.5rem}
  .q-workbench{grid-template-columns:minmax(0,1fr)}
  .q-panel.q-overview{position:static}
  .q-overview .summary-grid{grid-template-columns:repeat(auto-fit,minmax(min(7.5rem,100%),1fr))}
  .q-overview .summary-item:first-child{grid-column:auto}
  .q-panel{border-radius:16px}
  .q-question{border-radius:16px}
  .q-top{padding:.55rem .7rem calc(.55rem + env(safe-area-inset-top,0px))}
  /* 移动端触控目标放大到 44px 级别 */
  .q-sidebar .nav-btn{height:2.4rem}
  .q-btn{min-height:2.5rem}
  .q-btn-sm{min-height:2rem}
  .q-opt{padding:.75rem .85rem}
  .q-actionbar{border-radius:0;padding-bottom:calc(.6rem + env(safe-area-inset-bottom,0px))}
}
@media (max-width:520px){
  .q-wrap{padding:.85rem .75rem 5.5rem}
  .q-top{min-height:0;padding:.4rem .75rem;gap:.25rem .5rem}
  .q-brand{font-size:.76rem;min-height:2.75rem;padding:.3rem .4rem}
  .q-theme-toggle{width:2.75rem;height:2.75rem}
  .q-nav{order:3;width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));padding:.18rem}
  .q-nav-link{min-height:2.75rem;display:inline-flex;align-items:center;justify-content:center;padding:.3rem .25rem;text-align:center;white-space:nowrap}
  .q-top-actions{gap:.25rem}
  .q-account{gap:.25rem}
  .q-account-name{font-size:.74rem;max-width:5.5rem}
  .q-account-btn,.q-account-login{
    min-height:2.75rem;display:inline-flex;align-items:center;justify-content:center;
    padding:.4rem .55rem;font-size:.75rem;
  }
  .q-page-intro{padding-bottom:1rem}
  .q-title{font-size:1.65rem}
  .q-lead{font-size:.78rem}
  .q-library-head{align-items:flex-start}
  .bank-toolbar{gap:.4rem}
  .bank-search{flex:1 1 100%;height:2.75rem}
  .bank-result-count{margin-left:auto}
  .bank-list{grid-template-columns:minmax(0,1fr)}
  .bank-card{min-height:0}
  .q-mode-card{min-height:4.5rem;padding:.75rem}
  .q-head-actions{width:100%;justify-content:space-between}
  .q-focus-hint{margin-top:.4rem}
  .result-viz{grid-template-columns:4.6rem minmax(0,1fr);gap:.65rem;padding:.7rem .75rem}
  .result-ring{width:4.5rem;height:4.5rem}
  .result-ring::before{inset:.32rem}
  .result-ring-inner strong{font-size:1rem}
  .result-ring-inner span{font-size:.55rem}
  .result-legend{gap:.3rem}
  .result-legend-row{padding:.38rem .35rem;gap:.15rem .2rem}
  .result-legend-label{font-size:.6rem;white-space:normal;overflow-wrap:anywhere}
  .result-legend-value{font-size:.86rem}
  .result-legend-share{display:none}
  .result-dist-bar{margin-top:.4rem}
  .q-opt-key{width:1.35rem;height:1.35rem}
  .q-opt-shortcut{display:none}
  .q-actionbar{gap:.45rem}
  .q-actionbar>.q-row{width:100%;justify-content:flex-end}
}
@media (max-width:420px){
  .q-title{font-size:1.45rem}
  .q-nav-link{padding:.32rem .6rem;font-size:.78rem}
  .q-panel{padding:.85rem .75rem}
  .summary-item{padding:.55rem .6rem}
  .q-segment{flex:1 1 100%}
  .q-btn{padding:.45rem .7rem}
  .q-actionbar>.q-row{justify-content:stretch}
  .q-actionbar>.q-row .q-btn{flex:1 1 auto;min-width:0}
  .q-target-min{min-height:2.75rem}
  .q-keyhint{display:none}
  .q-session-strip{min-height:1.35rem}
}
/* 触摸设备不要 hover 抬升（会粘住） */
@media (hover:none){
  .q-btn:hover:not(:disabled),.q-opt:hover,.bank-card:hover,.q-list-item:hover,.summary-item:hover,.q-segment:hover:not(:disabled){transform:none}
}
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation:none!important;transition:none!important}
  .q-btn:hover:not(:disabled),.q-segment:hover:not(:disabled),.bank-card:hover,.q-list-item:hover,.summary-item:hover,.q-opt:hover{transform:none}
}

/* ---------- 文件选择：把浏览器原生的"选择文件"按钮换成设计系统里的按钮 ---------- */
.q-wrap input[type="file"]{
  font-size:.78rem;color:var(--muted);padding:.35rem .45rem;
  border:1px dashed var(--border-strong);border-radius:10px;background:var(--surface-soft-grad);
  cursor:pointer;transition:border-color var(--dur-2) var(--ease-out),background-color var(--dur-2) var(--ease-out);
}
.q-wrap input[type="file"]:hover{border-color:var(--accent);color:var(--text)}
.q-wrap input[type="file"]:focus-visible{outline:none;border-color:var(--accent);box-shadow:var(--focus-ring)}
.q-wrap input[type="file"]::file-selector-button{
  font:inherit;font-weight:500;margin-right:.8rem;padding:.42rem .95rem;
  border-radius:9px;border:1px solid var(--border);color:var(--text);background:var(--surface-grad);
  box-shadow:var(--raise-1),var(--inner-light);cursor:pointer;
  transition:transform var(--dur-1) var(--ease-out),box-shadow var(--dur-2) var(--ease-out),border-color var(--dur-2) var(--ease-out);
}
.q-wrap input[type="file"]::file-selector-button:hover{
  transform:translateY(-1px);border-color:var(--accent);color:var(--accent);box-shadow:var(--raise-2),var(--inner-light);
}
/* 桌面端下拉框 hover 时给一点边框反馈（移动端原生弹层不受影响） */
.q-wrap select{cursor:pointer}

/* ---------- 登录 / 改密：居中聚焦卡片（入口页也要有质感） ---------- */
#loginMain{max-width:34rem}
#progressMain,#adminMain{max-width:1060px}
#loginCard,#passwordCard,#accountCard,#disabledCard{
  position:relative;overflow:hidden;border-radius:20px;
  box-shadow:var(--raise-3),var(--inner-light);
}
#loginCard::before,#passwordCard::before{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:
    radial-gradient(26rem 11rem at 100% -12%, var(--accent-soft), transparent 70%),
    radial-gradient(22rem 10rem at -10% 110%, var(--halo-2), transparent 72%);
}
#loginCard>*,#passwordCard>*{position:relative}
#loginCard .q-section-title,#passwordCard .q-section-title{font-size:1.2rem;letter-spacing:.01em}
#loginCard form,#passwordCard form{display:flex;flex-direction:column;gap:.85rem;margin-top:1rem}
#loginCard .field input,#passwordCard .field input{
  height:2.85rem;font-size:.95rem;border-radius:10px;padding:0 .85rem;
}
#loginCard .q-actions-inline,#passwordCard .q-actions-inline{margin-top:.3rem}
#loginCard .q-btn-primary,#passwordCard .q-btn-primary{width:100%;min-height:2.85rem;font-size:.92rem}
#accountCard .q-actions-inline{gap:.6rem}
.q-foot-note a{text-decoration:none;border-bottom:1px solid transparent;transition:border-color var(--dur-2) var(--ease-out)}
.q-foot-note a:hover{border-bottom-color:var(--accent)}
/* 一次性临时密码：更像"凭证" */
.q-secret{
  border-style:solid;border-color:color-mix(in srgb,var(--accent) 35%,var(--border));
  background:
    radial-gradient(18rem 8rem at 100% 0%, var(--accent-soft), transparent 70%),
    var(--surface-soft-grad);
  box-shadow:var(--raise-1),var(--inner-light);
}
.q-secret-value code{
  font-family:var(--mono);letter-spacing:.04em;
  background:var(--card);border:1px solid var(--border);border-radius:8px;padding:.15rem .45rem;
}

/* ---------- 操作条上的细进度条（比例由 JS 写入 --ratio） ---------- */
.q-progress{
  position:relative;display:inline-flex;align-items:center;
  padding-bottom:.55rem;font-variant-numeric:tabular-nums;
}
.q-progress::before,.q-progress::after{
  content:"";position:absolute;left:0;right:0;bottom:0;height:3px;border-radius:999px;
}
.q-progress::before{background:var(--border)}
.q-progress::after{
  background:var(--accent-grad);
  transform:scaleX(var(--ratio,0));transform-origin:left center;
  transition:transform var(--dur-3) var(--ease-out);
  box-shadow:0 0 8px -2px rgba(23,107,82,.46);
}

/* ==========================================================================
   阅读与答题体验 V2：作答界面与自测复盘
   只增强 #practiceView / #resultView，不改变登录、进度和后台的共用组件。
   ========================================================================== */

#practiceView,
#resultView{overflow:visible}

/* 紧凑会话头：题库、模式、当前题与真实草稿状态都在首屏可见。 */
#practiceView .practice-session-head{
  display:grid;
  grid-template-columns:minmax(0,1fr) auto auto;
  gap:.55rem 1rem;
  align-items:center;
}
#practiceView .practice-session-title{min-width:0}
#practiceView .practice-session-title .q-kicker{margin-bottom:.1rem}
#practiceView .practice-session-title .q-section-title{font-size:1.08rem}
#practiceView .practice-session-title .q-section-title::after{display:none}
.practice-bank{
  margin-top:.16rem;color:var(--muted);font-size:.73rem;line-height:1.5;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.practice-session-state{display:flex;align-items:center;gap:.45rem;flex-wrap:wrap;justify-content:flex-end;min-width:0}
.practice-mode-badge{
  display:inline-flex;align-items:center;min-height:1.75rem;padding:.15rem .58rem;
  border:1px solid color-mix(in srgb,var(--accent) 32%,var(--border));border-radius:999px;
  background:var(--accent-soft);color:var(--accent);font-size:.7rem;font-weight:600;
  line-height:1.35;white-space:nowrap;
}
.practice-mode-badge.is-test{
  border-color:color-mix(in srgb,var(--champagne) 50%,var(--border));
  background:color-mix(in srgb,var(--champagne) 12%,var(--card));
  color:var(--text-strong);
}
.practice-position{
  color:var(--text-strong);font-family:var(--font-serif);font-size:1rem;
  font-variant-numeric:tabular-nums;white-space:nowrap;
}
.practice-mode-hint{
  margin:.35rem 0 0;color:var(--muted);font-size:.73rem;line-height:1.6;
}
#practiceView .q-session-strip{margin:.35rem 0 .15rem;min-height:1.35rem}
#practiceView .q-focus-toggle{min-height:2.25rem}
#practiceView .practice-meta-fold{margin:.45rem 0 .1rem;padding:.38rem .65rem}
#practiceView .practice-meta-fold summary{
  min-height:2.2rem;display:flex;align-items:center;justify-content:space-between;gap:.75rem;
  cursor:pointer;list-style:none;
}
#practiceView .practice-meta-fold summary::-webkit-details-marker{display:none}
#practiceView .practice-meta-fold summary::after{
  content:"";width:.5rem;height:.5rem;flex:none;margin-right:.2rem;
  border-right:2px solid currentColor;border-bottom:2px solid currentColor;
  transform:rotate(45deg);transition:transform var(--dur-2) var(--ease-out);
}
#practiceView .practice-meta-fold[open] summary::after{transform:rotate(225deg)}
#practiceView .practice-meta-fold summary:hover{color:var(--accent)}
#practiceView .practice-meta-fold .q-meta{margin-top:.35rem;line-height:1.65}

/* 宽屏保留原 aside 节点，窄屏由同一个 details 折叠，不复制题号与事件。 */
.practice-nav-fold{border:0}
.practice-nav-fold>.practice-nav-summary{display:none}
.practice-nav-fold>.q-sidebar{display:block}
#practiceView .q-quiz-layout{grid-template-columns:14rem minmax(0,1fr);gap:1rem}
#practiceView .q-sidebar{
  position:sticky;top:3.4rem;padding:.7rem .75rem;
  border-radius:16px;background:var(--surface-grad);
  box-shadow:var(--raise-2),var(--inner-light);
}
#practiceView .q-sidebar .q-navgrid{max-height:min(55vh,30rem)}
#practiceView .q-sidebar .nav-btn{height:2.35rem;font-size:.78rem}

/* 题库/题号摘要里的状态与当前题叠加：当前高亮不抹掉“待确认/已确认”。 */
#practiceView .nav-btn.is-pending{
  border-color:color-mix(in srgb,var(--accent) 58%,var(--border));
  border-style:dashed;background:var(--accent-soft);color:var(--text-strong);
}
#practiceView .nav-btn.is-confirmed{
  border-color:var(--ok);border-style:solid;background:var(--ok-soft);color:var(--text-strong);
}
#practiceView .nav-btn.is-unselected{border-style:dashed;color:var(--muted)}
#practiceView .nav-btn.is-current.is-pending{box-shadow:inset 0 0 0 2px var(--champagne),var(--accent-glow),var(--inner-light)}
#practiceView .nav-btn.is-current.is-confirmed{box-shadow:inset 0 0 0 2px var(--ok),var(--accent-glow),var(--inner-light)}
#practiceView .nav-btn.is-current.is-unselected{box-shadow:inset 0 0 0 2px color-mix(in srgb,var(--muted) 55%,transparent),var(--accent-glow),var(--inner-light)}

/* 题目与选项使用稳定实底；题干、指令、选项建立清楚的阅读层级。 */
#practiceView .q-question,#resultView .q-card{
  background:var(--card);
}
#practiceView .q-question{padding:1.05rem 1.15rem 1.15rem;min-height:0}
#practiceView .q-legend{
  gap:.38rem;padding:0 0 .55rem;border-bottom:1px solid var(--border);
}
#practiceView .q-num{font-size:.86rem}
#practiceView .q-stem{
  margin:.85rem 0 .55rem;font-size:1.125rem;line-height:1.82;color:var(--text-strong);
}
.q-instruction{
  margin:0 0 .9rem;padding:.48rem .7rem;border-left:2px solid var(--champagne);
  border-radius:0 8px 8px 0;background:color-mix(in srgb,var(--champagne) 9%,var(--card));
  color:var(--text);font-size:.78rem;line-height:1.65;
}
#practiceView .q-options{gap:.55rem}
#practiceView .q-opt{
  min-height:2.9rem;padding:.72rem .85rem;background:var(--card);
}
#practiceView .q-opt-text{font-size:1rem;line-height:1.72}
#practiceView .q-opt input{
  width:1.08rem;height:1.08rem;margin-top:.34rem;
}
#practiceView .q-opt:has(input:disabled){cursor:wait}
#practiceView .q-question.is-reveal-locked .q-opt{
  background:var(--card-hover);box-shadow:none;transform:none;
}
#practiceView .q-question.is-reveal-locked .q-opt:has(input:checked){
  border-color:var(--accent);background:var(--accent-soft);
}
.q-lock-note{
  margin:.65rem 0 0;padding:.5rem .65rem;border-radius:9px;
  border:1px dashed var(--accent);background:var(--accent-soft);color:var(--accent);
  font-size:.74rem;line-height:1.6;
}
#practiceView .q-feedback{
  margin-top:.8rem;padding:.72rem .8rem;background:var(--card);
}
#practiceView .q-explanation{
  margin-top:.65rem;padding:.65rem .75rem;border-left:3px solid var(--champagne);
  background:var(--surface-soft-grad);font-size:.84rem;line-height:1.82;
}

/* 单一任务动作区：原有按钮节点整体迁入；桌面一排，移动两排。 */
#practiceView .practice-actionbar{
  position:sticky;bottom:0;z-index:12;display:grid;grid-template-columns:minmax(0,1fr);gap:.55rem;
  margin-top:.8rem;padding:.65rem .7rem calc(.65rem + env(safe-area-inset-bottom,0px));
  border:1px solid var(--glass-border);border-radius:14px;
  background:var(--glass-bg);
  box-shadow:0 -10px 28px -22px rgba(20,18,12,.48),var(--inner-light);
}
.practice-action-progress{
  display:flex;align-items:center;gap:.55rem 1rem;flex-wrap:wrap;min-width:0;
}
.practice-action-progress .q-progress{flex:none}
.practice-action-progress .q-hint{min-width:0;margin-left:auto;text-align:right}
.practice-action-grid{
  display:flex;align-items:center;gap:.55rem;flex-wrap:wrap;min-width:0;
}
.practice-step-actions,.practice-finish-actions{
  display:flex;align-items:center;gap:.45rem;flex-wrap:wrap;min-width:0;
}
.practice-finish-actions{margin-left:auto}
#practiceView .practice-actionbar .q-btn{min-height:2.75rem}
#practiceView .q-next-action.q-btn-primary,
#practiceView .q-reveal-action.q-btn-primary{
  min-width:9.5rem;
}
#resultView .result-review{
  display:flex;align-items:center;gap:.8rem 1.2rem;flex-wrap:wrap;
  margin-top:.75rem;padding:.8rem .9rem;border:1px solid var(--border);border-radius:14px;
  background:var(--surface-soft-grad);box-shadow:var(--inner-hair);
}
.result-review-copy{flex:1 1 17rem;min-width:0}
.result-review-copy .q-kicker{margin-bottom:.15rem}
.result-review-text{margin:0;color:var(--text);font-size:.78rem;line-height:1.65}
.result-review-actions{display:flex;gap:.45rem;flex-wrap:wrap;margin-left:auto}
.result-review-actions .q-btn{min-height:2.75rem}

@media (min-width:960px){
  .practice-nav-fold{display:block}
  .practice-nav-fold>.practice-nav-summary{display:none}
}

@media (max-width:959px){
  #practiceView .practice-session-head{grid-template-columns:minmax(0,1fr) auto}
  #practiceView .practice-session-head .q-head-actions{grid-column:1 / -1;justify-content:flex-start}
  #practiceView .q-quiz-layout{grid-template-columns:minmax(0,1fr);gap:.65rem}
  .practice-nav-fold{
    display:block;border:1px solid var(--border);border-radius:14px;
    background:var(--surface-soft-grad);box-shadow:var(--inner-hair);
  }
  .practice-nav-fold>.practice-nav-summary{
    display:flex;align-items:center;gap:.55rem;min-height:2.75rem;padding:.55rem .75rem;
    cursor:pointer;list-style:none;color:var(--text-strong);font-size:.8rem;font-weight:600;
  }
  .practice-nav-fold>.practice-nav-summary::-webkit-details-marker{display:none}
  .practice-nav-summary-count{
    min-width:0;color:var(--muted);font-size:.72rem;font-weight:400;
    font-variant-numeric:tabular-nums;
  }
  .practice-nav-summary-toggle{
    width:.55rem;height:.55rem;margin-left:auto;border-right:2px solid currentColor;
    border-bottom:2px solid currentColor;transform:rotate(45deg);transition:transform var(--dur-2) var(--ease-out);
  }
  .practice-nav-fold[open] .practice-nav-summary-toggle{transform:rotate(225deg)}
  .practice-nav-fold:not([open])>.q-sidebar{display:none}
  .practice-nav-fold[open]>.q-sidebar{margin:.15rem .55rem .55rem}
  #practiceView .q-sidebar{position:static;top:auto;padding:.5rem .55rem;box-shadow:none;background:transparent;border:0}
  #practiceView .q-sidebar .q-navpanel{margin-top:0}
  #practiceView .q-sidebar .q-navgrid{
    display:grid;grid-auto-flow:column;grid-template-columns:none;grid-template-rows:1fr;
    grid-auto-columns:2.75rem;max-height:none;overflow-x:auto;overflow-y:hidden;
    padding-bottom:.2rem;
  }
  #practiceView .q-sidebar .nav-btn{height:2.75rem}
}

@media (max-width:639px){
  #practiceView{padding:.78rem .72rem 0}
  #practiceView .practice-session-head{
    grid-template-columns:minmax(0,1fr);gap:.45rem;align-items:start;
  }
  #practiceView .practice-session-state{justify-content:flex-start}
  #practiceView .practice-session-head .q-head-actions{grid-column:auto}
  #practiceView .practice-session-title .q-section-title{font-size:1rem}
  #practiceView .q-focus-toggle{min-height:2.75rem}
  .practice-bank{white-space:normal;overflow-wrap:anywhere}
  .practice-mode-hint{font-size:.7rem}
  #practiceView .q-keyhint{display:none}
  #practiceView .practice-meta-fold{margin-top:.2rem}
  #practiceView .q-question{padding:.88rem .82rem .95rem}
  #practiceView .q-stem{font-size:1.125rem;line-height:1.8;margin-top:.7rem}
  .q-instruction{font-size:.74rem;padding:.42rem .55rem}
  #practiceView .q-opt{min-height:2.75rem;padding:.68rem .7rem}
  #practiceView .q-opt-text{font-size:1rem}
  #practiceView .q-opt-key{width:1.35rem;height:1.35rem}
  #practiceView .q-opt-shortcut{display:none}
  #practiceView .practice-actionbar{
    bottom:0;margin-top:.7rem;padding:.55rem .58rem calc(.55rem + env(safe-area-inset-bottom,0px));
    border-radius:14px;
  }
  .practice-action-progress .q-hint{display:none}
  .practice-action-progress .q-progress{width:100%}
  .practice-action-grid{display:grid;grid-template-columns:minmax(0,1fr);gap:.45rem}
  .practice-step-actions,.practice-finish-actions{width:100%;margin-left:0}
  .practice-step-actions>.q-btn{flex:1 1 0}
  .practice-finish-actions{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.55fr)}
  .practice-finish-actions .q-reveal-action{grid-column:2}
  .practice-finish-actions .q-submit-action{grid-column:2}
  .practice-finish-actions:has(.q-reveal-action:not([hidden])) .q-submit-action{grid-column:1 / -1}
  .practice-finish-actions .q-back-action{grid-column:1}
  #practiceView .practice-actionbar .q-btn{min-height:2.75rem;padding:.5rem .65rem}
  #practiceView .q-next-action.q-btn-primary,
  #practiceView .q-reveal-action.q-btn-primary{min-width:0;width:100%}
  #resultView .result-review{padding:.7rem .75rem;align-items:stretch}
  .result-review-actions{width:100%;margin-left:0}
  .result-review-actions .q-btn{flex:1 1 9rem;min-width:0}
}

@media (prefers-reduced-transparency:reduce){
  #practiceView .practice-actionbar{background:var(--card)}
  .practice-mode-badge,.q-instruction,.q-lock-note{background:var(--card)}
}

/* ===== 跨文档过渡：刷题页之间/与博客之间不再硬切（Chromium 渐进增强） ===== */
@view-transition{navigation:auto}
@media (prefers-reduced-motion:reduce){
  @view-transition{navigation:none}
}

/* =====================================================================
   V3 统一材质与动效：与博客同一套"纸面 + 颗粒 + 内高光 + 扫光"语言
   （只加视觉层，不改 DOM 结构与交互状态机，205 项浏览器套件可回归）
   ===================================================================== */
:root{
  --grain:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.82' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23g)' opacity='.05'/%3E%3C/svg%3E");
  --ease-out-expo:cubic-bezier(.16,1,.3,1);
  --sheen:linear-gradient(115deg,transparent 38%,rgba(255,255,255,.4) 50%,transparent 62%);
}
[data-theme="dark"]{
  --grain:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.82' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23g)' opacity='.085'/%3E%3C/svg%3E");
  --sheen:linear-gradient(115deg,transparent 38%,rgba(255,255,255,.14) 50%,transparent 62%);
}
/* 面板：纸面颗粒 + 内高光，浮起阴影更接近摄影打光 */
.q-panel{background-image:var(--grain),var(--surface-grad);background-size:160px 160px,auto}
.q-panel:hover{box-shadow:var(--raise-2),var(--inner-light)}
/* 题库卡：悬浮抬升 + 扫光 */
.bank-card{position:relative;overflow:hidden;background-image:var(--grain),var(--surface-grad);background-size:160px 160px,auto;
  transition:transform .45s var(--ease-out-expo),box-shadow .45s var(--ease-out-expo),border-color .3s}
.bank-card::after{content:"";position:absolute;inset:0;background:var(--sheen);transform:translateX(-130%);transition:transform .9s var(--ease-out-expo);pointer-events:none}
.bank-card:hover::after{transform:translateX(130%)}
.bank-card:hover{transform:translateY(-3px);box-shadow:var(--raise-3),var(--inner-light)}
/* 主按钮：扫光 + 按压回弹 */
.q-btn-primary{position:relative;overflow:hidden;box-shadow:var(--accent-glow),var(--inner-light);
  transition:transform .32s var(--ease-spring),box-shadow .3s var(--ease-out),background .2s,color .2s,opacity .2s}
.q-btn-primary::after{content:"";position:absolute;inset:-30% -50%;background:var(--sheen);transform:translateX(-130%);transition:transform .85s var(--ease-out-expo);pointer-events:none}
.q-btn-primary:hover:not(:disabled)::after{transform:translateX(130%)}
.q-btn-primary:active:not(:disabled){transform:scale(.972)}
/* 题干/会话卡：颗粒纸面 */
.q-question{background-image:var(--grain),var(--surface-grad);background-size:160px 160px,auto;box-shadow:var(--raise-2),var(--inner-light)}
.practice-session-head{background-image:var(--grain),var(--surface-soft-grad);background-size:160px 160px,auto}
/* 顶栏：底部极光细线 */
.q-top{position:relative}
.q-top::after{content:"";position:absolute;left:0;right:0;bottom:-1px;height:1px;pointer-events:none;
  background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--accent) 32%,transparent),color-mix(in srgb,var(--champagne) 32%,transparent),transparent);opacity:.8}
/* 页面标题区：逐层入场（与博客首屏同一编排语言） */
.q-page-intro .q-eyebrow,.q-page-intro .q-title,.q-page-intro .q-lead{animation:q-intro-in .85s var(--ease-out-expo) both}
.q-page-intro .q-title{animation-delay:.08s}
.q-page-intro .q-lead{animation-delay:.2s}
@keyframes q-intro-in{from{opacity:0;transform:translate3d(0,18px,0);filter:blur(6px)}to{opacity:1;transform:none;filter:blur(0)}}
/* 结果环/分数：入场时轻微聚焦 */
.result-ring{transition:transform .5s var(--ease-out-expo)}
.result-viz{animation:q-intro-in .6s var(--ease-out-expo) both}
/* 导航当前项：细光晕 */
.q-nav-link.is-active{box-shadow:var(--accent-glow),var(--inner-light)}
/* 减少动效/透明度：全部降级 */
@media (prefers-reduced-motion:reduce){
  .q-page-intro .q-eyebrow,.q-page-intro .q-title,.q-page-intro .q-lead,.result-viz{animation:none!important;opacity:1!important;transform:none!important;filter:none!important}
  .bank-card::after,.q-btn-primary::after{display:none!important}
  .bank-card:hover{transform:none!important}
  .q-btn-primary:active:not(:disabled){transform:none!important}
}
@media (prefers-reduced-transparency:reduce){
  .q-panel,.bank-card,.q-question,.practice-session-head{background-image:none!important;background-color:var(--card)!important}
}

/* 作答记录 / 试卷回顾（避免用 window.alert：沙箱 iframe 里会被静默拦截） */
.practice-done .q-btn{margin-top:.75rem}
.q-records{width:min(560px,calc(100vw - 2rem))}
.q-records-list{display:flex;flex-direction:column;gap:.55rem;max-height:min(60vh,420px);overflow:auto;margin:.2rem 0 .9rem;text-align:left}
.q-record-row{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.6rem .75rem;border:1px solid var(--line);border-radius:10px;background:color-mix(in srgb,var(--paper-solid) 82%,transparent)}
.q-record-info{min-width:0}
.q-record-title{font-size:.8rem;font-weight:600;color:var(--ink)}
.q-record-sub{font-size:.68rem;color:var(--ink-faint);margin-top:.15rem;font-family:var(--font-mono)}
.q-record-row .q-btn{flex:none}

/* ---------- 题目勾选与组卷 ---------- */
.q-pickbar{
  display:flex;align-items:center;gap:.6rem;flex-wrap:wrap;
  margin:0 0 .6rem;padding:.55rem .7rem;
  border:1px solid var(--border);border-radius:var(--radius-md);
  background:var(--bg-soft);position:sticky;top:0;z-index:6;
}
.q-pickcount{font-size:.8rem;font-weight:600;color:var(--text-strong);white-space:nowrap}
.q-pickname{
  flex:1 1 180px;min-height:34px;padding:0 .6rem;
  border:1px solid var(--border);border-radius:8px;background:#fff;
  font:inherit;font-size:.8rem;color:inherit;
}
.q-pick-wrap{display:flex;align-items:center;flex:none;padding-right:.1rem}
.q-pick{width:18px;height:18px;accent-color:var(--accent,#176b52);cursor:pointer}
.q-pick:focus-visible{outline:2px solid var(--accent,#176b52);outline-offset:2px}
