/* 雅思刷题 · 注入层样式（原 index.html 里 44 个 <style id="kz*">）
   顺序 = 原文件顺序，层叠关系不变；因此放在 <head> 末尾即可覆盖原站样式。
   改完把 index.html 里引用的 ?v= 换成新值（否则浏览器吃旧缓存）。 */
/* ===== kzUxStyle ===== */
  /* ===== 全站按钮微交互层（kz-ux）=====
     依据业界共识：hover 上浮 150-200ms ease-out；按下缩放 50-100ms；
     点击涟漪；focus-visible 焦点环；prefers-reduced-motion 全关。 */
  button,.btn,[role="button"]{
    -webkit-tap-highlight-color:transparent;
    transition:transform .18s cubic-bezier(.4,0,.2,1),box-shadow .18s cubic-bezier(.4,0,.2,1),
               background-color .18s ease,color .18s ease,border-color .18s ease,opacity .18s ease;
  }
  button:hover:not(:disabled):not([disabled]),.btn:hover:not(:disabled),[role="button"]:hover{
    transform:translateY(-1px);
  }
  button:active:not(:disabled):not([disabled]),.btn:active:not(:disabled),[role="button"]:active{
    transform:translateY(0) scale(.96);
    transition-duration:.07s;
  }
  button:focus-visible,.btn:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible{
    outline:2px solid rgba(79,70,229,.55);outline-offset:2px;border-radius:8px;
  }
  button:disabled,button[disabled]{opacity:.55;cursor:not-allowed}
  .kz-rip{position:absolute;border-radius:50%;background:currentColor;opacity:.15;
          pointer-events:none;transform:scale(0);animation:kzRip .55s cubic-bezier(.2,.6,.3,1) forwards}
  @keyframes kzRip{to{transform:scale(2.4);opacity:0}}
  /* 卡片与列表行的轻反馈 */
  .card{transition:transform .2s cubic-bezier(.4,0,.2,1),box-shadow .2s ease}
  .card:hover{transform:translateY(-2px);box-shadow:0 16px 34px -24px rgba(28,33,48,.45)}
  .row{transition:background-color .15s ease}
  /* 迷你播放器按钮 */
  .kz-a-play{border-radius:50%}
  .kz-a-bar{transition:height .15s ease}
  .kz-a-bar:hover{height:8px}
  /* 系统开了「减少动态」就全部关掉 */
  @media (prefers-reduced-motion:reduce){
    *,*::before,*::after{animation:none!important;transition:none!important}
  }
/* ===== kzSpaFx ===== */
  /* 科目标签页：悬浮轻浮 */
  .tabs .tab{transition:transform .18s cubic-bezier(.4,0,.2,1),color .18s ease,background-color .18s ease}
  .tabs .tab:hover{transform:translateY(-2px)}
  /* 搜索框：输入区自己带底色，和外层圆角框叠成「框里有框」，去掉只留外圈（客户 2026-11-05）
     站点主题里 `html[data-kz-theme] body.kz-libui :is(input,textarea,select){background:…!important}`
     压着，这里必须同样带 html/body 前缀才盖得住 */
  html[data-kz-theme] body.kz-libui .kz-ps .kz-ps-in input,
  html[data-kz-theme] body.kz-libui .kz-ps .kz-ps-in input:focus,
  html[data-kz-theme] body.kz-libui .kz-ps .kz-ps-in input:hover{
    background:transparent!important;border:0!important;box-shadow:none!important;outline:0!important}
  /* 目标分胶囊：外层边框 + 内层高光叠成双层，收成一层描边（客户 2026-11-05） */
  html[data-kz-theme] body.kz-libui .goal-wrap,
  html[data-kz-theme] body.kz-libui .goal-wrap.g-chip{
    background:var(--kz-surface-2)!important;
    border:1px solid var(--kz-line)!important;
    box-shadow:none!important}
  html[data-kz-theme] body.kz-libui .goal-wrap .goal-trigger,
  html[data-kz-theme] body.kz-libui .goal-wrap.g-chip .goal-trigger{
    background:transparent!important;border:0!important;box-shadow:none!important}
  /* 主页搜索框：聚焦品牌色光晕，图标变色微放大 */
  .kz-ps-in{transition:border-color .2s ease,box-shadow .25s ease}
  .kz-ps-in svg{transition:stroke .2s ease,transform .2s ease}
  .kz-ps-in:focus-within{border-color:rgba(79,70,229,.5);box-shadow:0 14px 32px -20px rgba(79,70,229,.55)}
  .kz-ps-in:focus-within svg{stroke:#4f46e5;transform:scale(1.1)}
  /* 列表行与搜索结果 */
  .row{transition:background-color .15s ease}
  .row:hover{background:#f8f9ff}
  .kz-ps-item{transition:background-color .15s ease}
  /* 题库卡片内容切换时不生硬 */
  .glass.lib{transition:opacity .35s ease}
/* ===== kzSpaFx2 ===== */
  /* 卡片入场：首次进入与切换科目时轻浮入 */
  /* 客户 2026-11-07：退出口语/刷新时内容会「往上顶一下」——入场动画带 translateY(10px)。
     去掉位移，只留很短的淡入；行级延迟也去掉，避免一行行「冒出来」。 */
  @keyframes kzFadeUp{from{opacity:0}to{opacity:1}}
  .glass{animation:kzFadeUp .18s ease both}
  /* 搜索下拉弹出 */
  @keyframes kzDropIn{from{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:none}}
  .kz-ps-drop.on{animation:kzDropIn .16s ease}
/* ===== kzSpaFx3 ===== */
  /* 列表行瀑布式入场：切换科目时依次浮现 */
  .row{animation:kzFadeUp .16s ease both}



  /* 答题区进入/切 Part 时轻淡入 */
  .ex-body{animation:kzFadeUp .18s ease both}
  /* 交卷确认弹窗：缩放弹出 */
  .cf-mask{animation:kzFade .15s ease both}
  .cf-mask>div{animation:kzPop .22s cubic-bezier(.2,.7,.3,1.2) both}
  /* 被踢下线弹窗同款 */
  #kzKick{animation:kzFade .15s ease both}
  #kzKick>div{animation:kzPop .25s cubic-bezier(.2,.7,.3,1.25) both}
  @keyframes kzFade{from{opacity:0}to{opacity:1}}
  @keyframes kzPop{from{opacity:0;transform:scale(.92) translateY(8px)}to{opacity:1;transform:none}}
  /* 迷你播放器进度条悬浮加粗已在；播放键按下回缩由全局层覆盖 */
  /* 科目标签激活态微浮 */
  .tabs .tab.on{transform:translateY(-1px)}
/* ===== kzSpaFx4 ===== */
  /* 机考做题界面：零动效（客户要求一点不改），exam 路由时 html 挂 kz-no-motion 全部关掉 */
  html.kz-no-motion *{animation:none!important;transition:none!important}
  /* 题库列表行：悬浮右滑 */
  .row{transition:background-color .15s ease,transform .18s cubic-bezier(.4,0,.2,1)!important}
  .row:hover{background:#f8f9ff;transform:translateX(3px)}
/* ===== kzSpaScroll ===== */
  #kzProg{position:fixed;top:0;left:0;right:0;height:2px;z-index:80;transform-origin:0 50%;
    transform:scaleX(0);background:linear-gradient(90deg,#4f46e5,#8b5cf6);pointer-events:none;
    transition:transform .12s linear}
/* ===== kzTheme ===== */

  /* ============================================================
     主题令牌 —— 6 套皮肤，全部只改颜色/图案，不改布局
     ============================================================ */

  /* 1. 霓虹午夜（默认） */
  html[data-kz-theme="neon"]{
    color-scheme:dark;
    --kz-base:#06080f;
    --kz-bg-img:
      radial-gradient(980px 640px at 12% -8%, rgba(79,70,229,.42), transparent 60%),
      radial-gradient(820px 560px at 92% 0%, rgba(34,211,238,.24), transparent 62%),
      radial-gradient(900px 700px at 52% 112%, rgba(139,92,246,.32), transparent 66%),
      #06080f;
    --kz-pat:
      linear-gradient(rgba(255,255,255,.085) 1px,transparent 1px),
      linear-gradient(90deg,rgba(255,255,255,.085) 1px,transparent 1px),
      radial-gradient(rgba(255,255,255,.72) 1px,transparent 1.8px);
    --kz-pat-size:64px 64px,64px 64px,150px 150px;
    --kz-pat-op:.85;
    --kz-g1:rgba(99,91,255,.40);--kz-g2:rgba(34,211,238,.22);--kz-g3:rgba(217,70,239,.20);
    --kz-surface:linear-gradient(180deg,rgba(20,24,42,.76),rgba(10,14,24,.72));
    --kz-surface-2:rgba(255,255,255,.05);
    --kz-surface-3:rgba(255,255,255,.09);
    --kz-glass-sheen-blend:soft-light;--kz-glass-grain:.10;
    --kz-glass-blur:0px;
    --kz-glass-a:rgba(255,255,255,.035);--kz-glass-b:rgba(255,255,255,.008);
    --kz-glass-c:rgba(255,255,255,.018);--kz-glass-d:rgba(255,255,255,.045);
    --kz-glass-bright:.92;--kz-glass-glow:rgba(255,255,255,.04);--kz-glass-sheen:.10;
    --kz-on-acc:#ffffff;
    --kz-err:#ff8fa3;--kz-ok:#7ee2a8;
    --kz-tabbar:rgba(255,255,255,.045);--kz-tabon:rgba(255,255,255,.13);
    --kz-warn-bg:rgba(234,179,8,.13);--kz-warn-ink:#fcd34d;--kz-warn-line:rgba(234,179,8,.30);
    --kz-wash:rgba(6,8,15,.92);--kz-wash-2:rgba(6,8,15,.55);
    --kz-fill:#0e1220;
    --kz-line:rgba(255,255,255,.09);
    --kz-line-2:rgba(255,255,255,.16);
    --kz-t1:#eef1f8;--kz-t2:#aab3c8;--kz-t3:#7c869c;
    --kz-acc:#6366f1;--kz-acc2:#a855f7;--kz-acc3:#22d3ee;
    --kz-acc-soft:rgba(99,91,255,.20);
    --kz-acc-line:rgba(139,92,246,.50);
    --kz-acc-text:#c9c4ff;
    --kz-glow:0 0 60px -34px rgba(99,91,255,.55);
    --kz-shadow:0 50px 90px -60px #000;
    --kz-sheen:.5;
    --kz-scroll:#2b3350;
  }

  /* 2. 月白（浅色玻璃，靛蓝） */
  html[data-kz-theme="moonlit"]{
    color-scheme:light;
    --kz-base:#f2f5fb;
    --kz-bg-img:
      radial-gradient(1000px 640px at 10% -8%, rgba(99,91,255,.14), transparent 62%),
      radial-gradient(880px 580px at 94% 2%, rgba(56,189,248,.13), transparent 64%),
      radial-gradient(860px 640px at 50% 112%, rgba(236,72,153,.08), transparent 70%),
      linear-gradient(180deg,#f6f8fc,#eef2fa 60%,#f5f7fc);
    --kz-pat:
      linear-gradient(rgba(28,33,48,.055) 1px,transparent 1px),
      linear-gradient(90deg,rgba(28,33,48,.055) 1px,transparent 1px),
      radial-gradient(rgba(28,33,48,.10) .9px,transparent 1.5px);
    --kz-pat-size:52px 52px,52px 52px,104px 104px;
    --kz-pat-op:.55;
    --kz-g1:rgba(129,140,248,.24);--kz-g2:rgba(56,189,248,.16);--kz-g3:rgba(244,114,182,.12);
    --kz-surface:linear-gradient(180deg,rgba(255,255,255,.90),rgba(255,255,255,.74));
    --kz-surface-2:rgba(255,255,255,.80);
    --kz-surface-3:rgba(79,70,229,.09);
    --kz-glass-sheen-blend:screen;--kz-glass-grain:.3;
    --kz-glass-blur:30px;
    --kz-glass-a:rgba(255,255,255,.26);--kz-glass-b:rgba(255,255,255,.10);
    --kz-glass-c:rgba(255,255,255,.18);--kz-glass-d:rgba(255,255,255,.28);
    --kz-glass-bright:1.03;--kz-glass-glow:rgba(255,255,255,.30);--kz-glass-sheen:.9;
    --kz-on-acc:#ffffff;
    --kz-err:#d92d3f;--kz-ok:#12864a;
    --kz-tabbar:rgba(28,33,48,.055);--kz-tabon:rgba(255,255,255,.94);
    --kz-warn-bg:#fff7e3;--kz-warn-ink:#8a5b0a;--kz-warn-line:rgba(180,120,10,.20);
    --kz-wash:rgba(255,255,255,.94);--kz-wash-2:rgba(255,255,255,.58);
    --kz-fill:#ffffff;
    --kz-line:rgba(28,33,48,.09);
    --kz-line-2:rgba(28,33,48,.17);
    --kz-t1:#1c2130;--kz-t2:#4b5468;--kz-t3:#7b8494;
    --kz-acc:#4f46e5;--kz-acc2:#8b5cf6;--kz-acc3:#22d3ee;
    --kz-acc-soft:rgba(79,70,229,.10);
    --kz-acc-line:rgba(79,70,229,.28);
    --kz-acc-text:#4f46e5;
    --kz-glow:0 20px 52px -40px rgba(79,70,229,.55);
    --kz-shadow:0 40px 80px -56px rgba(28,33,48,.42);
    --kz-sheen:.22;
    --kz-scroll:#c9d2e6;
  }

  /* 3. 猫布奇诺 · Catppuccin Mocha（catppuccin/catppuccin） */
  html[data-kz-theme="mocha"]{
    color-scheme:dark;
    --kz-base:#1e1e2e;
    --kz-glass-a:rgba(255,255,255,.035);--kz-glass-b:rgba(255,255,255,.008);
    --kz-glass-c:rgba(255,255,255,.018);--kz-glass-d:rgba(255,255,255,.045);
    --kz-glass-bright:.92;--kz-glass-glow:rgba(255,255,255,.04);--kz-glass-sheen:.10;
    --kz-glass-sheen-blend:soft-light;--kz-glass-grain:.10;
    --kz-glass-blur:0px;
    --kz-on-acc:#1e1e2e;
    --kz-err:#ff8fa3;--kz-ok:#7ee2a8;
    --kz-tabbar:rgba(255,255,255,.045);--kz-tabon:rgba(255,255,255,.13);
    --kz-warn-bg:rgba(234,179,8,.13);--kz-warn-ink:#fcd34d;--kz-warn-line:rgba(234,179,8,.30);
    --kz-wash:rgba(24,24,37,.92);--kz-wash-2:rgba(24,24,37,.55);
    --kz-bg-img:
      radial-gradient(980px 640px at 12% -10%, rgba(203,166,247,.24), transparent 60%),
      radial-gradient(840px 580px at 92% 2%, rgba(137,180,250,.20), transparent 62%),
      radial-gradient(900px 700px at 50% 114%, rgba(245,194,231,.14), transparent 68%),
      linear-gradient(180deg,#1e1e2e,#181825 56%,#1e1e2e);
    --kz-pat:
      radial-gradient(rgba(205,214,244,.32) 1px,transparent 1.6px),
      radial-gradient(rgba(203,166,247,.28) 2.2px,transparent 3px);
    --kz-pat-size:36px 36px,120px 120px;
    --kz-pat-op:.55;
    --kz-g1:rgba(203,166,247,.26);--kz-g2:rgba(137,180,250,.20);--kz-g3:rgba(245,194,231,.16);
    --kz-surface:linear-gradient(180deg,rgba(49,50,68,.80),rgba(30,30,46,.84));
    --kz-surface-2:rgba(205,214,244,.055);
    --kz-surface-3:rgba(205,214,244,.11);
    --kz-fill:#181825;
    --kz-line:rgba(205,214,244,.13);
    --kz-line-2:rgba(205,214,244,.24);
    --kz-t1:#cdd6f4;--kz-t2:#a6adc8;--kz-t3:#7f849c;
    --kz-acc:#cba6f7;--kz-acc2:#f5c2e7;--kz-acc3:#89b4fa;
    --kz-acc-soft:rgba(203,166,247,.16);
    --kz-acc-line:rgba(203,166,247,.42);
    --kz-acc-text:#ddc2ff;
    --kz-glow:0 0 60px -34px rgba(203,166,247,.52);
    --kz-shadow:0 50px 90px -58px #11111b;
    --kz-sheen:.38;
    --kz-scroll:#45475a;
  }

  /* 4. 东京夜（Tokyo Night） */
  html[data-kz-theme="tokyo"]{
    color-scheme:dark;
    --kz-base:#16161e;
    --kz-bg-img:
      radial-gradient(980px 640px at 12% -10%, rgba(122,162,247,.26), transparent 60%),
      radial-gradient(840px 580px at 92% 2%, rgba(187,154,247,.20), transparent 62%),
      radial-gradient(900px 700px at 50% 114%, rgba(125,207,255,.14), transparent 68%),
      linear-gradient(180deg,#16161e,#1a1b26 56%,#14141b);
    --kz-pat:
      radial-gradient(rgba(192,202,245,.42) 1px,transparent 1.6px),
      repeating-linear-gradient(90deg,rgba(122,162,247,.05) 0 1px,transparent 1px 64px);
    --kz-pat-size:40px 40px,100% 100%;
    --kz-pat-op:.6;
    --kz-g1:rgba(122,162,247,.28);--kz-g2:rgba(187,154,247,.22);--kz-g3:rgba(125,207,255,.16);
    --kz-surface:linear-gradient(180deg,rgba(26,27,38,.84),rgba(22,22,30,.80));
    --kz-surface-2:rgba(122,162,247,.07);
    --kz-surface-3:rgba(122,162,247,.15);
    --kz-glass-sheen-blend:soft-light;--kz-glass-grain:.10;
    --kz-glass-blur:0px;
    --kz-glass-a:rgba(255,255,255,.035);--kz-glass-b:rgba(255,255,255,.008);
    --kz-glass-c:rgba(255,255,255,.018);--kz-glass-d:rgba(255,255,255,.045);
    --kz-glass-bright:.92;--kz-glass-glow:rgba(255,255,255,.04);--kz-glass-sheen:.10;
    --kz-on-acc:#1a1b26;
    --kz-err:#ff8fa3;--kz-ok:#7ee2a8;
    --kz-tabbar:rgba(255,255,255,.045);--kz-tabon:rgba(255,255,255,.13);
    --kz-warn-bg:rgba(234,179,8,.13);--kz-warn-ink:#fcd34d;--kz-warn-line:rgba(234,179,8,.30);
    --kz-wash:rgba(22,22,30,.92);--kz-wash-2:rgba(22,22,30,.55);
    --kz-fill:#1a1b26;
    --kz-line:rgba(122,162,247,.16);
    --kz-line-2:rgba(122,162,247,.30);
    --kz-t1:#c0caf5;--kz-t2:#9aa5ce;--kz-t3:#7d89bd;
    --kz-acc:#7aa2f7;--kz-acc2:#bb9af7;--kz-acc3:#7dcfff;
    --kz-acc-soft:rgba(122,162,247,.16);
    --kz-acc-line:rgba(122,162,247,.42);
    --kz-acc-text:#a9c2ff;
    --kz-glow:0 0 60px -34px rgba(122,162,247,.55);
    --kz-shadow:0 50px 90px -58px #000;
    --kz-sheen:.4;
    --kz-scroll:#2a2e42;
  }

  /* 5. 樱雾漫游（浅色） */
  html[data-kz-theme="sakura"]{
    color-scheme:light;
    --kz-base:#fff2f7;
    --kz-bg-img:
      radial-gradient(920px 640px at 10% -10%, #ffe1ee, transparent 60%),
      radial-gradient(860px 580px at 94% 0%, #ffeaf5, transparent 62%),
      radial-gradient(940px 720px at 52% 114%, #fbe3f4, transparent 66%),
      linear-gradient(180deg,#fff8fb,#fff1f7 58%,#fff7fb);
    --kz-pat:
      radial-gradient(circle at 50% 50%, rgba(244,63,94,.26) 1.8px, transparent 2.4px),
      radial-gradient(circle at 50% 50%, rgba(251,113,133,.16) 3.6px, transparent 4.3px),
      repeating-linear-gradient(45deg,rgba(244,63,94,.05) 0 1px,transparent 1px 22px);
    --kz-pat-size:28px 28px,84px 84px,100% 100%;
    --kz-pat-op:.9;
    --kz-g1:rgba(255,183,206,.55);--kz-g2:rgba(255,214,232,.55);--kz-g3:rgba(240,171,252,.30);
    --kz-surface:linear-gradient(180deg,rgba(255,255,255,.90),rgba(255,250,252,.78));
    --kz-surface-2:rgba(255,255,255,.78);
    --kz-surface-3:rgba(244,63,94,.08);
    --kz-glass-sheen-blend:screen;--kz-glass-grain:.3;
    --kz-glass-blur:30px;
    --kz-glass-a:rgba(255,255,255,.26);--kz-glass-b:rgba(255,255,255,.10);
    --kz-glass-c:rgba(255,255,255,.18);--kz-glass-d:rgba(255,255,255,.28);
    --kz-glass-bright:1.03;--kz-glass-glow:rgba(255,255,255,.30);--kz-glass-sheen:.9;
    --kz-on-acc:#ffffff;
    --kz-err:#d92d3f;--kz-ok:#12864a;
    --kz-tabbar:rgba(28,33,48,.055);--kz-tabon:rgba(255,255,255,.94);
    --kz-warn-bg:#fff7e3;--kz-warn-ink:#8a5b0a;--kz-warn-line:rgba(180,120,10,.20);
    --kz-wash:rgba(255,255,255,.94);--kz-wash-2:rgba(255,255,255,.58);
    --kz-fill:#fffafc;
    --kz-line:rgba(244,63,94,.14);
    --kz-line-2:rgba(244,63,94,.24);
    --kz-t1:#3d2130;--kz-t2:#7d5a68;--kz-t3:#8f6b7b;
    --kz-acc:#f43f5e;--kz-acc2:#fb7185;--kz-acc3:#c026d3;
    --kz-acc-soft:rgba(244,63,94,.10);
    --kz-acc-line:rgba(244,63,94,.30);
    --kz-acc-text:#e11d48;
    --kz-glow:0 24px 60px -40px rgba(190,60,100,.55);
    --kz-shadow:0 40px 80px -56px rgba(150,60,90,.45);
    --kz-sheen:.2;
    --kz-scroll:#f0c9d7;
  }

  /* 6. 星图夜航（三色星点 + 金） */
  html[data-kz-theme="celestial"]{
    color-scheme:dark;
    --kz-base:#050b1c;
    --kz-bg-img:
      radial-gradient(1000px 700px at 50% -16%, rgba(59,130,246,.30), transparent 62%),
      radial-gradient(820px 640px at 4% 104%, rgba(234,179,8,.14), transparent 66%),
      radial-gradient(760px 560px at 96% 96%, rgba(129,140,248,.16), transparent 68%),
      linear-gradient(180deg,#040a1a,#03060f 58%,#050916);
    --kz-pat:
      radial-gradient(rgba(255,255,255,.92) 1.1px,transparent 1.7px),
      radial-gradient(rgba(255,255,255,.55) .8px,transparent 1.3px),
      radial-gradient(rgba(234,179,8,.78) 1.3px,transparent 2px);
    --kz-pat-size:170px 170px,90px 90px,280px 280px;
    --kz-pat-op:.78;
    --kz-g1:rgba(59,130,246,.30);--kz-g2:rgba(234,179,8,.14);--kz-g3:rgba(129,140,248,.22);
    --kz-surface:linear-gradient(180deg,rgba(12,20,44,.78),rgba(6,10,24,.74));
    --kz-surface-2:rgba(255,255,255,.05);
    --kz-surface-3:rgba(234,179,8,.10);
    --kz-glass-sheen-blend:soft-light;--kz-glass-grain:.10;
    --kz-glass-blur:0px;
    --kz-glass-a:rgba(255,255,255,.035);--kz-glass-b:rgba(255,255,255,.008);
    --kz-glass-c:rgba(255,255,255,.018);--kz-glass-d:rgba(255,255,255,.045);
    --kz-glass-bright:.92;--kz-glass-glow:rgba(255,255,255,.04);--kz-glass-sheen:.10;
    --kz-on-acc:#0a1330;
    --kz-err:#ff8fa3;--kz-ok:#7ee2a8;
    --kz-tabbar:rgba(255,255,255,.045);--kz-tabon:rgba(255,255,255,.13);
    --kz-warn-bg:rgba(234,179,8,.13);--kz-warn-ink:#fcd34d;--kz-warn-line:rgba(234,179,8,.30);
    --kz-wash:rgba(5,11,28,.92);--kz-wash-2:rgba(5,11,28,.55);
    --kz-fill:#080e22;
    --kz-line:rgba(191,210,255,.13);
    --kz-line-2:rgba(191,210,255,.26);
    --kz-t1:#eef3ff;--kz-t2:#a9b6d6;--kz-t3:#77839f;
    --kz-acc:#eab308;--kz-acc2:#f59e0b;--kz-acc3:#60a5fa;
    --kz-acc-soft:rgba(234,179,8,.12);
    --kz-acc-line:rgba(234,179,8,.40);
    --kz-acc-text:#f6d465;
    --kz-glow:0 0 60px -34px rgba(234,179,8,.42);
    --kz-shadow:0 48px 88px -58px #000;
    --kz-sheen:.4;
    --kz-scroll:#243257;
  }

  /* ============================================================
     背景层：图案 + 柔光（替代原来的 .bare::before/::after）
     ============================================================ */
  #kzTbg{position:fixed;inset:0;z-index:1;pointer-events:none;overflow:hidden;transform:translateZ(0);transition:opacity .4s ease}
  #kzTbg .t-pat{position:absolute;inset:0;z-index:1;
    background-image:var(--kz-pat);background-size:var(--kz-pat-size);
    opacity:var(--kz-pat-op);transform:translateZ(0);
    transition:opacity .5s ease}
  #kzTbg .t-glow{position:absolute;inset:-22%;z-index:0;will-change:transform}
  #kzTbg .t-glow i{position:absolute;border-radius:50%;display:block}
  #kzTbg .t-glow i:nth-child(1){left:4%;top:10%;width:46%;height:42%;
    background:radial-gradient(closest-side,var(--kz-g1),transparent 74%);
    animation:kzDrift1 26s ease-in-out infinite alternate}
  #kzTbg .t-glow i:nth-child(2){right:2%;top:26%;width:40%;height:40%;
    background:radial-gradient(closest-side,var(--kz-g2),transparent 74%);
    animation:kzDrift2 31s ease-in-out infinite alternate}
  #kzTbg .t-glow i:nth-child(3){left:26%;bottom:4%;width:44%;height:38%;
    background:radial-gradient(closest-side,var(--kz-g3),transparent 74%);
    animation:kzDrift3 36s ease-in-out infinite alternate}
  @keyframes kzDrift1{from{transform:translate3d(-3%,-2%,0) scale(1)}to{transform:translate3d(4%,3%,0) scale(1.1)}}
  @keyframes kzDrift2{from{transform:translate3d(2%,3%,0) scale(1.06)}to{transform:translate3d(-4%,-2%,0) scale(.98)}}
  @keyframes kzDrift3{from{transform:translate3d(2%,2%,0) scale(.98)}to{transform:translate3d(-3%,-4%,0) scale(1.08)}}

  /* 主题接管后关闭旧背景层 */
  html[data-kz-theme] body.kz-libui .bare::before,
  html[data-kz-theme] body.kz-libui .bare::after{display:none!important}
  html[data-kz-theme] body.kz-libui .bare{background:var(--kz-bg-img)!important}

  /* ============================================================
     组件映射：把原皮肤里写死的深色值换成主题令牌
     ============================================================ */
  html[data-kz-theme] body.kz-libui{color:var(--kz-t2);background:var(--kz-base)!important;
    scrollbar-color:var(--kz-scroll) var(--kz-base)}
  html[data-kz-theme] body.kz-libui ::-webkit-scrollbar-thumb{background:var(--kz-scroll)!important;border-color:transparent}
  html[data-kz-theme] body.kz-libui ::-webkit-scrollbar-thumb:hover{background:var(--kz-acc-line)!important}
  html[data-kz-theme] body.kz-libui .atlas{color:var(--kz-t2)}
  html[data-kz-theme] body.kz-libui .atlas{position:relative;z-index:3}
  html[data-kz-theme] body.kz-libui .page{position:relative;z-index:4}

  /* 顶栏 */
  html[data-kz-theme] body.kz-libui .ahd{
    background:var(--kz-surface)!important;border-color:var(--kz-line)!important;
    box-shadow:inset 0 1px 0 var(--kz-line-2),0 30px 60px -40px rgba(0,0,0,.55),var(--kz-glow)!important}
  html[data-kz-theme] body.kz-libui .ahd::before{
    background:linear-gradient(118deg,var(--kz-acc-line),transparent 38%,var(--kz-acc-line) 68%,var(--kz-acc-line))!important;
    opacity:.7!important}
  html[data-kz-theme] body.kz-libui .ahd::after{opacity:var(--kz-sheen)!important}
  html[data-kz-theme] body.kz-libui .ahd-t b{
    background:linear-gradient(180deg,var(--kz-t1),var(--kz-t2))!important;
    -webkit-background-clip:text!important;background-clip:text!important;-webkit-text-fill-color:transparent!important}
  html[data-kz-theme] body.kz-libui .ahd-t em{color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-libui .ahd-sub{color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-libui .ahd-logo{
    box-shadow:0 0 0 1px var(--kz-line-2),0 0 26px -8px var(--kz-acc2)!important}
  html[data-kz-theme] body.kz-libui .goal-wrap{
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important;
    box-shadow:inset 0 1px 0 var(--kz-line-2)!important}
  html[data-kz-theme] body.kz-libui .goal-trigger,
  html[data-kz-theme] body.kz-libui .goal-trigger:hover{background:transparent!important;
    border-color:transparent!important;color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-libui .goal-trigger b{color:var(--kz-acc-text)!important}
  html[data-kz-theme] body.kz-libui :is(.ahd-btn.solid,.btn.primary,.btn.solid,
    .pcard .pacts button:first-child,.sk.on){
    background:linear-gradient(135deg,var(--kz-acc),var(--kz-acc2))!important;
    border-color:transparent!important;color:var(--kz-on-acc,#fff)!important;
    box-shadow:0 14px 30px -14px var(--kz-acc2),inset 0 1px 0 rgba(255,255,255,.28)!important}
  html[data-kz-theme] body.kz-libui .ahd-ava{
    color:var(--kz-on-acc,#fff)!important;
    background:linear-gradient(135deg,var(--kz-acc),var(--kz-acc2))!important;
    box-shadow:0 0 0 3px var(--kz-acc-soft),0 0 26px -8px var(--kz-acc2)!important}

  /* 科目栏 */
  html[data-kz-theme] body.kz-libui .tabs{
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important;
    box-shadow:inset 0 1px 0 var(--kz-line-2),0 20px 40px -34px rgba(0,0,0,.5)!important}
  html[data-kz-theme] body.kz-libui .tabs .tab{color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-libui .tabs .tab .ti{color:var(--kz-t3)!important;opacity:1!important}
  html[data-kz-theme] body.kz-libui .tabs .tab:hover{background:var(--kz-surface-3)!important;color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui .tabs .tab.on{
    background:linear-gradient(135deg,var(--kz-acc),var(--kz-acc2))!important;color:var(--kz-on-acc,#fff)!important;
    box-shadow:0 12px 30px -14px var(--kz-acc2),inset 0 1px 0 rgba(255,255,255,.3)!important}
  html[data-kz-theme] body.kz-libui .tabs .tab.on .ti{color:var(--kz-on-acc,#fff)!important}
  html[data-kz-theme] body.kz-libui .tabs .tab.on::after{
    background:linear-gradient(90deg,var(--kz-acc3),var(--kz-acc2))!important;
    box-shadow:0 0 14px var(--kz-acc2)!important}

  /* 搜索 */
  html[data-kz-theme] body.kz-libui .kz-ps-in{
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important;
    box-shadow:inset 0 1px 0 var(--kz-line-2),0 24px 44px -38px rgba(0,0,0,.55)!important}
  html[data-kz-theme] body.kz-libui .kz-ps-in svg{stroke:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-libui .kz-ps-in input{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui .kz-ps-in input::placeholder{color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-libui .kz-ps-in:focus-within{
    border-color:var(--kz-acc-line)!important;
    box-shadow:0 0 0 4px var(--kz-acc-soft),0 0 34px -12px var(--kz-acc2)!important}
  html[data-kz-theme] body.kz-libui .kz-ps-drop{
    background:var(--kz-fill)!important;border-color:var(--kz-line)!important;
    box-shadow:0 30px 60px -30px rgba(0,0,0,.7),0 0 0 1px var(--kz-line)!important}
  html[data-kz-theme] body.kz-libui .kz-ps-item:hover{background:var(--kz-surface-2)!important}
  html[data-kz-theme] body.kz-libui .kz-ps-item b{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui .kz-ps-item .m,
  html[data-kz-theme] body.kz-libui .kz-ps-empty{color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-libui .kz-ps-item mark{background:var(--kz-acc-soft)!important;color:var(--kz-acc-text)!important}

  /* 题库卡 / 列表 */
  html[data-kz-theme] body.kz-libui :is(.glass,.glass.lib){
    background:var(--kz-surface)!important;border-color:var(--kz-line)!important;
    box-shadow:inset 0 1px 0 var(--kz-line-2),var(--kz-shadow),var(--kz-glow)!important}
  html[data-kz-theme] body.kz-libui .glass.lib::before{
    background:linear-gradient(90deg,transparent,var(--kz-acc) 18%,var(--kz-acc3) 52%,var(--kz-acc2) 82%,transparent)!important;
    box-shadow:0 0 18px var(--kz-acc-line)!important}
  html[data-kz-theme] body.kz-libui .glass.lib::after{background:radial-gradient(closest-side,var(--kz-acc-soft),transparent 72%)!important}
  html[data-kz-theme] body.kz-libui .lib .g-hd b{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui .lib .g-hd b.kz-lib-t::before{
    background:linear-gradient(180deg,var(--kz-acc),var(--kz-acc2))!important}
  html[data-kz-theme] body.kz-libui .lib .g-c{color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-libui :is(.lib .chip,.chip,.pill){
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important;color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-libui :is(.lib .chip,.chip,.pill):hover{
    background:var(--kz-surface-3)!important;border-color:var(--kz-line-2)!important;color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui :is(.lib .chip.on,.chip.on,.pill.on){
    background:var(--kz-acc-soft)!important;border-color:var(--kz-acc-line)!important;
    color:var(--kz-acc-text)!important;box-shadow:0 0 18px -8px var(--kz-acc2)!important}
  html[data-kz-theme] body.kz-libui .libbar{background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important}
  html[data-kz-theme] body.kz-libui .libbar .srch-wrap{
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important}
  html[data-kz-theme] body.kz-libui .libbar .srch-wrap input{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui .parts .part{color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-libui .parts .part em{color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-libui .parts .part:hover{background:var(--kz-surface-2)!important;color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui .parts .part.on{
    background:var(--kz-acc-soft)!important;color:var(--kz-acc-text)!important;
    box-shadow:inset 0 0 0 1px var(--kz-acc-line)!important}
  html[data-kz-theme] body.kz-libui .parts .part.on em{color:var(--kz-acc-text)!important}
  html[data-kz-theme] body.kz-libui .parts .stf{background:var(--kz-tabbar)!important}
  html[data-kz-theme] body.kz-libui .parts .stf button{color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-libui .parts .stf button.on{
    background:var(--kz-tabon)!important;color:var(--kz-t1)!important;box-shadow:0 2px 8px -4px rgba(0,0,0,.5)!important}
  html[data-kz-theme] body.kz-libui .rows{background:transparent!important}
  html[data-kz-theme] body.kz-libui .rows .row:hover{
    background:var(--kz-surface-2)!important;border-color:var(--kz-line-2)!important;
    box-shadow:0 18px 40px -30px rgba(0,0,0,.5),0 0 30px -18px var(--kz-acc2)!important}
  html[data-kz-theme] body.kz-libui .rows .row::before{
    background:linear-gradient(180deg,var(--kz-acc),var(--kz-acc2))!important}
  html[data-kz-theme] body.kz-libui .c-t b{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui .c-t em{color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-libui .c-stat em{color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-libui .c-stat b{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui .c-stat .bar{background:var(--kz-surface-3)!important}
  html[data-kz-theme] body.kz-libui .c-stat .bar u{
    background:linear-gradient(90deg,var(--kz-acc),var(--kz-acc3))!important}
  html[data-kz-theme] body.kz-libui .rows .go{background:var(--kz-acc-soft)!important;color:var(--kz-acc-text)!important}
  html[data-kz-theme] body.kz-libui .rows .go:hover{
    background:linear-gradient(135deg,var(--kz-acc),var(--kz-acc2))!important;color:var(--kz-on-acc,#fff)!important;
    box-shadow:0 0 26px -8px var(--kz-acc2)!important}

  /* 通用卡片（记录 / 错题 / 总览） */
  html[data-kz-theme] body.kz-libui :is(.card,.pcard,.dcard){
    background:linear-gradient(180deg,var(--kz-surface-2),transparent)!important;
    border-color:var(--kz-line)!important;color:var(--kz-t2)!important;
    box-shadow:0 20px 44px -38px rgba(0,0,0,.55)!important}
  html[data-kz-theme] body.kz-libui :is(.card,.pcard,.dcard):hover{
    border-color:var(--kz-acc-line)!important;box-shadow:0 0 34px -18px var(--kz-acc2)!important}
  html[data-kz-theme] body.kz-libui :is(.card,.pcard,.dcard) :is(h1,h2,h3,h4,b,.d-hd,.pt b){
    color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui :is(.card,.pcard,.dcard) :is(p,em,small,.pt em,.d-note){
    color:var(--kz-t3)!important}
  /* 空状态块（「还没有阅读错题」那类）：原站硬编码白底，深色主题下是一整块刺眼的白板
     （客户 2026-11-05 截图报的）。它可能出现在错题 / 记录 / 课包 / 口语任一页，统一按主题上色 */
  html[data-kz-theme] body.kz-libui .empty,
  html[data-kz-theme] body.kz-papers .empty,
  html[data-kz-theme] body.kz-speak .empty{
    background:var(--kz-surface-2)!important;
    border:1px solid var(--kz-line)!important;
    box-shadow:none!important}
  html[data-kz-theme] body.kz-libui .empty :is(.e1,b,strong,h3),
  html[data-kz-theme] body.kz-papers .empty :is(.e1,b,strong,h3){
    color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui .empty :is(.e2, p:not(.e1)),
  html[data-kz-theme] body.kz-papers .empty :is(.e2, p:not(.e1)){
    color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-libui .empty .btn.primary,
  html[data-kz-theme] body.kz-papers .empty .btn.primary{
    background:linear-gradient(135deg,var(--kz-acc),var(--kz-acc2))!important;
    border-color:transparent!important;color:var(--kz-on-acc,#fff)!important;
    box-shadow:0 12px 26px -14px var(--kz-acc2)!important}
  html[data-kz-theme] body.kz-libui .pcard .pi{
    background:var(--kz-acc-soft)!important;color:var(--kz-acc-text)!important;border-color:var(--kz-acc-line)!important}
  html[data-kz-theme] body.kz-libui .pcard .pacts button{
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important;color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui .pcard .pacts button:hover{
    background:var(--kz-surface-3)!important;color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui .pcard .pacts button:disabled{
    opacity:.45!important;color:var(--kz-t3)!important;background:var(--kz-surface-2)!important}

  /* 错题本 / 总览：原来保持纯白的块（统计卡、分段、盒子标签、跳过提示、推荐区） */
  html[data-kz-theme] body.kz-libui .stats .stat{
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important;
    box-shadow:inset 0 1px 0 var(--kz-line-2),0 14px 34px -28px rgba(0,0,0,.55)!important}
  html[data-kz-theme] body.kz-libui .stats .stat.due{
    background:linear-gradient(180deg,var(--kz-acc-soft),transparent)!important;
    border-color:var(--kz-acc-line)!important;
    box-shadow:inset 0 1px 0 var(--kz-line-2),0 0 30px -18px var(--kz-acc2)!important}
  html[data-kz-theme] body.kz-libui .stats .stat b,
  html[data-kz-theme] body.kz-libui .stats .stat strong{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui .stats .stat :is(span,em,small){
    color:var(--kz-t3)!important;background:transparent!important}
  html[data-kz-theme] body.kz-libui .seg{
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important;
    color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-libui .seg:hover{background:var(--kz-surface-3)!important}
  html[data-kz-theme] body.kz-libui .seg.on{
    background:var(--kz-tabon)!important;border-color:var(--kz-line-2)!important;
    color:var(--kz-t1)!important;box-shadow:0 2px 8px -4px rgba(0,0,0,.5)!important}
  html[data-kz-theme] body.kz-libui .box{
    background:var(--kz-surface-3)!important;border-color:var(--kz-line)!important;
    color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-libui .skiphint{
    background:var(--kz-warn-bg)!important;border-color:var(--kz-warn-line)!important;
    color:var(--kz-warn-ink)!important}
  html[data-kz-theme] body.kz-libui .d-weak span{
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important;
    color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-libui .d-weak span em{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui .reco{
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important;
    box-shadow:inset 0 1px 0 var(--kz-line-2),0 20px 44px -38px rgba(0,0,0,.55)!important}
  html[data-kz-theme] body.kz-libui .reco :is(.r-hd2,.r-chips,.r-chips span,.r-chips button){
    color:var(--kz-t2)!important}
  /* 客户 2026-11-07 19:1x：「还没开始 N 套可练」那排卡片原来是 #fff 实底，
     深色主题下标题被刷成白字 → 白底白字。整块统一压成主题玻璃底，子元素背景一律清掉。 */
  html[data-kz-theme] body.kz-libui .reco *{
    background-image:none!important}
  html[data-kz-theme] body.kz-libui .reco .r-chips > *{
    background:var(--kz-surface-3)!important;
    border:1px solid var(--kz-line)!important;
    border-radius:8px!important}
  html[data-kz-theme] body.kz-libui .reco .r-chips > *:hover{
    background:var(--kz-surface-2)!important;border-color:var(--kz-acc-line)!important}
  html[data-kz-theme] body.kz-libui .reco .r-chips b{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui .reco .r-chips span{color:var(--kz-t3)!important}

  /* 导入向导（/import）：整页的浅色设计令牌直接换成主题令牌，
     这样 SPA 内部所有用 var(--pri/--line/--ink...) 的地方自动跟随主题 */
  html[data-kz-theme] body.kz-libui .wrap{
    --pri:var(--kz-acc);
    --pri-l:var(--kz-acc-soft);
    --pri-ll:var(--kz-acc-soft);
    --line:var(--kz-line);
    --line2:var(--kz-line);
    --ink:var(--kz-t1);
    --ink2:var(--kz-t2);
    --ink3:var(--kz-t2);
    --mut:var(--kz-t3);
    --bg:var(--kz-base);
    --paper:var(--kz-fill);
  }
  html[data-kz-theme] body.kz-libui .steps li{
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important;
    color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-libui .steps li.on{
    background:linear-gradient(135deg,var(--kz-acc),var(--kz-acc2))!important;
    border-color:transparent!important;color:var(--kz-on-acc,#fff)!important;
    box-shadow:0 10px 24px -14px var(--kz-acc2)!important}
  html[data-kz-theme] body.kz-libui .steps li :is(b,span,i,em){color:inherit!important}
  html[data-kz-theme] body.kz-libui .drop{
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important;
    box-shadow:inset 0 1px 0 var(--kz-line-2)!important}
  html[data-kz-theme] body.kz-libui .drop :is(h3,h4,b,strong){color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui .drop :is(p,span,em,small,li){color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-libui .drop :is(label,button){
    background:var(--kz-surface-3)!important;border-color:var(--kz-line)!important;
    color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui .drop :is(label,button).primary,
  html[data-kz-theme] body.kz-libui .drop label:first-of-type{
    background:linear-gradient(135deg,var(--kz-acc),var(--kz-acc2))!important;
    border-color:transparent!important;color:var(--kz-on-acc,#fff)!important}
  html[data-kz-theme] body.kz-libui .formats{
    background:var(--kz-surface)!important;border-color:var(--kz-line)!important;
    box-shadow:inset 0 1px 0 var(--kz-line-2),var(--kz-shadow)!important}
  html[data-kz-theme] body.kz-libui .formats .fm{
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important}
  html[data-kz-theme] body.kz-libui .formats .fm :is(h4,h3,b){color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui .formats .fm :is(p,span,em,small,li){color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-libui .formats :is(.hint,.rule,p){color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-libui .runbar :is(label,button){
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important;
    color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-libui .runbar :is(label.on,label:has(input:checked),button.on){
    background:var(--kz-tabon)!important;border-color:var(--kz-acc-line)!important;
    color:var(--kz-t1)!important;
    box-shadow:inset 0 0 0 1px var(--kz-acc-line)!important}
  html[data-kz-theme] body.kz-libui .runbar :is(button.primary,.primary){
    background:linear-gradient(135deg,var(--kz-acc),var(--kz-acc2))!important;
    border-color:transparent!important;color:var(--kz-on-acc,#fff)!important}
  /* 没选文件时按钮是 disabled：不用半透明主色，改成明确的中性禁用态 */
  html[data-kz-theme] body.kz-libui .runbar .btn:disabled,
  html[data-kz-theme] body.kz-libui .runbar .btn.primary:disabled{
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important;
    color:var(--kz-t3)!important;box-shadow:none!important;opacity:1!important;
    cursor:not-allowed!important;background-image:none!important}
  html[data-kz-theme] body.kz-libui .runbar > span{color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-libui .runbar > span em{color:var(--kz-t2)!important}
  /* 已导入列表的每一行：原站写死 background:#fff */
  html[data-kz-theme] body.kz-libui .librow{
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important;
    color:var(--kz-t2)!important;box-shadow:inset 0 1px 0 var(--kz-line-2)!important}
  html[data-kz-theme] body.kz-libui .librow:hover{border-color:var(--kz-acc-line)!important}
  html[data-kz-theme] body.kz-libui .librow :is(b,strong){color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui .librow .dim{color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-libui .librow span{color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-libui .librow .btn{
    background:var(--kz-surface-3)!important;border-color:var(--kz-line)!important;
    color:var(--kz-t2)!important;padding:2px 8px!important;font-size:12px!important}
  html[data-kz-theme] body.kz-libui .librow .btn:hover{
    background:var(--kz-acc-soft)!important;border-color:var(--kz-acc-line)!important;
    color:var(--kz-acc-text)!important}
  html[data-kz-theme] body.kz-libui .lib h3{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui .lib h3 :is(em,span,small){color:var(--kz-t3)!important}
  /* 解析方式单选：原站白底 + 选中近白底 */
  html[data-kz-theme] body.kz-libui .engine label{
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important;
    color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-libui .engine label:hover{
    background:var(--kz-surface-3)!important;border-color:var(--kz-line-2)!important;
    color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui .engine label.on{
    background:var(--kz-tabon)!important;border-color:var(--kz-acc-line)!important;
    color:var(--kz-t1)!important;
    box-shadow:inset 0 0 0 1px var(--kz-acc-line),0 0 20px -14px var(--kz-acc2)!important}
  html[data-kz-theme] body.kz-libui .engine label :is(b,em,span){color:inherit!important}
  html[data-kz-theme] body.kz-libui .engine label em{color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-libui .engine label.on b{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui .engine input{accent-color:var(--kz-acc)!important}
  /* 页头「看示例」 */
  html[data-kz-theme] body.kz-libui .pghd .btn{
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important;
    color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-libui .pghd .btn:hover{
    background:var(--kz-surface-3)!important;color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui .llm label{color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-libui .llm :is(select,input){
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important;color:var(--kz-t1)!important}

  /* 页级兜底：原站浅色硬编码兜住（记录/错题/总览） */
  html[data-kz-theme] body.kz-libui .page{color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-libui .page :is(b,strong,h1,h2,h3,h4){color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui .page .pghd{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui .page .pghd :is(em,span,small){color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-libui .page .pghd b{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui .page .tbl{border-color:var(--kz-line)!important}
  html[data-kz-theme] body.kz-libui .page .tbl th{
    background:var(--kz-surface-2)!important;color:var(--kz-t3)!important;
    border-color:var(--kz-line)!important}
  html[data-kz-theme] body.kz-libui .page .tbl td{
    border-color:var(--kz-line)!important;color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-libui .page .tbl tbody tr:hover{background:var(--kz-surface-2)!important}
  html[data-kz-theme] body.kz-libui .page .tbl td b{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui .page .tbl td :is(span,em,small){color:var(--kz-t2)!important}

  /* 统计 / 分段 / 按钮 / 表单 */
  html[data-kz-theme] body.kz-libui :is(.sk,.secs,.stats){
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important;color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-libui .sec{color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-libui .sec.on{background:var(--kz-surface-3)!important;color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui .stats b{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui :is(.stats em,.stats span,.stats .k,.stats .label,.stats .sub){color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-libui .btn{
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important;color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui .btn:hover{background:var(--kz-surface-3)!important}
  html[data-kz-theme] body.kz-libui :is(input,textarea,select){
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important;color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui input::placeholder{color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-libui :is(.page h1,.page h2,.page h3,.page h4,
    .page .title,.page .sec-title,.page .d-big,.page [class*="num"],.page [class*="count"]){
    color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui :is(.page .muted,.page .d-note,.page .r-b){color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-libui .page .d-cta{color:var(--kz-acc-text)!important}
  html[data-kz-theme] body.kz-libui .page .d-row{color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-libui .page .d-row b{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui .dcard .p-n{color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-libui .dcard .p-v{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui .dcard .p-bar{background:var(--kz-surface-3)!important}
  html[data-kz-theme] body.kz-libui .dcard .p-bar i{
    background:linear-gradient(90deg,var(--kz-acc),var(--kz-acc3))!important}
  html[data-kz-theme] body.kz-libui .recent .r-row{color:var(--kz-t2)!important;border-color:var(--kz-line)!important}
  html[data-kz-theme] body.kz-libui .recent .r-t{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui .recent .r-row:hover{background:var(--kz-surface-2)!important}
  html[data-kz-theme] body.kz-libui .atlas a{color:var(--kz-acc-text)!important}
  html[data-kz-theme] body.kz-libui .atlas a:hover{color:var(--kz-t1)!important}

  /* ============================================================
     课包页（/papers）映射：类名与主站不同，单独一套
     ============================================================ */
  html[data-kz-theme] body.kz-papers{background:var(--kz-base)!important;color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-papers .gbg{display:none!important}
  html[data-kz-theme] body.kz-papers .nav{
    background:var(--kz-surface)!important;border-bottom-color:var(--kz-line)!important;
    -webkit-backdrop-filter:blur(20px) saturate(160%);backdrop-filter:blur(20px) saturate(160%)}
  html[data-kz-theme] body.kz-papers .brand{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-papers .brand i{
    background:linear-gradient(135deg,var(--kz-acc),var(--kz-acc2))!important;
    box-shadow:0 6px 16px -10px var(--kz-acc2)}
  html[data-kz-theme] body.kz-papers .btn{
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important;color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-papers .btn:hover{background:var(--kz-surface-3)!important}
  html[data-kz-theme] body.kz-papers .btn.primary{
    background:linear-gradient(135deg,var(--kz-acc),var(--kz-acc2))!important;
    border-color:transparent!important;color:var(--kz-on-acc,#fff)!important;
    box-shadow:0 12px 26px -14px var(--kz-acc2)}
  html[data-kz-theme] body.kz-papers .head h1{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-papers .head p{color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-papers .search input{
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important;color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-papers .search input:focus{border-color:var(--kz-acc-line)!important;
    box-shadow:0 0 0 3px var(--kz-acc-soft)}
  html[data-kz-theme] body.kz-papers .search svg{opacity:.55;color:var(--kz-t3)}
  html[data-kz-theme] body.kz-papers .filters{
    background:var(--kz-surface)!important;border-color:var(--kz-line)!important;
    box-shadow:inset 0 1px 0 var(--kz-line-2)}
  html[data-kz-theme] body.kz-papers .frow .k{color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-papers .chip{
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important;color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-papers .chip:hover{color:var(--kz-t1)!important;border-color:var(--kz-line-2)!important}
  html[data-kz-theme] body.kz-papers .chip.on{
    background:var(--kz-acc-soft)!important;border-color:var(--kz-acc-line)!important;
    color:var(--kz-acc-text)!important}
  html[data-kz-theme] body.kz-papers .card{
    background:var(--kz-surface)!important;border-color:var(--kz-line)!important;
    box-shadow:inset 0 1px 0 var(--kz-line-2),var(--kz-shadow)!important}
  html[data-kz-theme] body.kz-papers .card:hover{
    border-color:var(--kz-acc-line)!important;box-shadow:inset 0 1px 0 var(--kz-line-2),0 20px 44px -28px rgba(0,0,0,.6),var(--kz-glow)!important}
  html[data-kz-theme] body.kz-papers .card h3{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-papers .card .meta{color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-papers .tg{background:var(--kz-surface-3)!important;color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-papers .tg.hot{background:var(--kz-acc-soft)!important;color:var(--kz-acc-text)!important}
  html[data-kz-theme] body.kz-papers .tg.attr{background:rgba(194,65,12,.16)!important;color:#fb923c!important}
  html[data-kz-theme] body.kz-papers .res .item{
    background:var(--kz-surface)!important;border-color:var(--kz-line)!important}
  html[data-kz-theme] body.kz-papers .res .item:hover{border-color:var(--kz-acc-line)!important}
  html[data-kz-theme] body.kz-papers .res .item b{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-papers .res .item .snip{color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-papers .res .item mark{
    background:var(--kz-acc-soft)!important;color:var(--kz-acc-text)!important}
  html[data-kz-theme] body.kz-papers .empty{color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-papers .empty b{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-papers .toast{
    background:var(--kz-fill)!important;color:var(--kz-t1)!important;border:1px solid var(--kz-line)}
  html[data-kz-theme] body.kz-papers .wrap{position:relative;z-index:4}
  html[data-kz-theme] body.kz-papers ::-webkit-scrollbar-thumb{background:var(--kz-scroll)!important}

  /* ============================================================
     口语页（/speak）映射：绿系浅色页，复用其自带 :root 变量
     ============================================================ */
  /* 独立页：根元素也要给底色，避免 canvas 露出默认白 */
  html[data-kz-theme]:has(body.kz-speak),
  html[data-kz-theme]:has(body.kz-landing),
  html[data-kz-theme]:has(body.kz-papers){background:var(--kz-base)!important}
  html[data-kz-theme] body.kz-speak{
    --card:var(--kz-surface);
    --ink:var(--kz-t1);
    --muted:var(--kz-t3);
    --green:var(--kz-acc-text);
    --green-d:var(--kz-acc);
    --tint:var(--kz-acc-soft);
    --line:var(--kz-line);
    --chip:var(--kz-surface-3);
    --chip-blue:var(--kz-surface-3);
    --chip-blue-ink:var(--kz-acc-text);
    background:var(--kz-base)!important;color:var(--kz-t2)!important;
    scrollbar-color:var(--kz-scroll) var(--kz-base)}
  html[data-kz-theme] body.kz-speak ::-webkit-scrollbar-thumb{background:var(--kz-scroll)!important}
  html[data-kz-theme] body.kz-speak a{color:var(--kz-acc-text)!important}
  html[data-kz-theme] body.kz-speak :is(h1,h2,h3,b,strong){color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-speak :is(.list-head p,.topic .en,.cn-lb,.dur,.hintline,.pager .pos,
    .pagebar,.rec .tip,.card-hd .sub,.cn-text){color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-speak .qcard{
    background:var(--kz-surface)!important;border-color:var(--kz-line)!important;
    box-shadow:inset 0 1px 0 var(--kz-line-2),var(--kz-shadow)!important}
  html[data-kz-theme] body.kz-speak .qcard .hint{color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-speak :is(.topic,.card){
    background:var(--kz-surface)!important;border-color:var(--kz-line)!important;
    box-shadow:inset 0 1px 0 var(--kz-line-2),var(--kz-shadow)!important}
  html[data-kz-theme] body.kz-speak :is(.topic,.card):hover{border-color:var(--kz-acc-line)!important}
  html[data-kz-theme] body.kz-speak .card-hd .ic{
    background:var(--kz-acc-soft)!important;color:var(--kz-acc-text)!important}
  html[data-kz-theme] body.kz-speak :is(.nav a.back,.search input,.chip.part,.tabs button.on,
    .pagebar button,.pagebar .jump,select){
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important;color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-speak .nav a.back:hover{color:var(--kz-acc-text)!important}
  html[data-kz-theme] body.kz-speak .search input::placeholder{color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-speak .chip{background:var(--kz-surface-3)!important;color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-speak :is(.chip.green,.chip.blue){
    background:var(--kz-acc-soft)!important;color:var(--kz-acc-text)!important}
  html[data-kz-theme] body.kz-speak .btn{
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important;color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-speak .btn:hover{border-color:var(--kz-acc-line)!important}
  html[data-kz-theme] body.kz-speak :is(.btn.primary,.toggle.on){
    background:linear-gradient(135deg,var(--kz-acc),var(--kz-acc2))!important;
    border-color:transparent!important;color:var(--kz-on-acc,#fff)!important;
    box-shadow:0 10px 24px -14px var(--kz-acc2)}
  html[data-kz-theme] body.kz-speak :is(.btn.done,.toggle){
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important;color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-speak .answer{background:var(--kz-surface-2)!important;color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-speak .tabs{background:var(--kz-tabbar)!important}
  html[data-kz-theme] body.kz-speak .tabs button{color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-speak .tabs button.on{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-speak :is(.play,.rec .right .btn.primary,.mic){
    background:linear-gradient(135deg,var(--kz-acc),var(--kz-acc2))!important;color:var(--kz-on-acc,#fff)!important}
  html[data-kz-theme] body.kz-speak .wave i{background:var(--kz-acc-line)!important}
  html[data-kz-theme] body.kz-speak .wave.playing i{background:var(--kz-acc)!important}
  html[data-kz-theme] body.kz-speak .divider{background:var(--kz-line)!important}
  html[data-kz-theme] body.kz-speak :is(.wrap,#app){position:relative;z-index:4}

  /* ============================================================
     官网（/landing）映射：整页磨砂玻璃背板
     ============================================================ */
  html[data-kz-theme] body.kz-landing{background:var(--kz-bg-img)!important;color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-landing .gbg{background:var(--kz-bg-img)!important}
  html[data-kz-theme] body.kz-landing .gbg .b1{
    background:radial-gradient(closest-side,var(--kz-g1),transparent 72%)!important}
  html[data-kz-theme] body.kz-landing .gbg .b2{
    background:radial-gradient(closest-side,var(--kz-g2),transparent 72%)!important}
  html[data-kz-theme] body.kz-landing .gbg::after{background:
    radial-gradient(820px 520px at 50% 30%,var(--kz-wash),var(--kz-wash-2) 56%,transparent 80%),
    radial-gradient(940px 620px at 50% 82%,var(--kz-wash-2),transparent 76%)!important}
  html[data-kz-theme] body.kz-landing .glass{
    background:linear-gradient(168deg,var(--kz-glass-a) 0%,var(--kz-glass-b) 30%,
      var(--kz-glass-c) 66%,var(--kz-glass-d) 100%)!important;
    -webkit-backdrop-filter:blur(var(--kz-glass-blur,30px)) saturate(180%) brightness(var(--kz-glass-bright))!important;
    backdrop-filter:blur(var(--kz-glass-blur,30px)) saturate(180%) brightness(var(--kz-glass-bright))!important;
    box-shadow:inset 0 0 0 1px var(--kz-line-2),inset 0 2px 0 var(--kz-line-2),
      inset 0 -2px 0 var(--kz-line),inset 0 0 36px var(--kz-glass-glow),
      inset 0 0 160px var(--kz-glass-glow),0 0 0 1px var(--kz-line)!important}
  html[data-kz-theme] body.kz-landing .glass .sheen{
    opacity:var(--kz-glass-sheen)!important;mix-blend-mode:var(--kz-glass-sheen-blend,normal)!important}
  html[data-kz-theme] body.kz-landing .glass::before{
    background:linear-gradient(90deg,transparent,var(--kz-line-2) 22%,var(--kz-line-2) 78%,transparent)!important}
  html[data-kz-theme] body.kz-landing .glass::after{opacity:var(--kz-glass-grain,.3)!important}
  html[data-kz-theme] body.kz-landing .side-tag{color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-landing .topnav.scrolled{
    background:var(--kz-surface)!important;box-shadow:0 10px 30px -22px rgba(0,0,0,.35)!important;
    -webkit-backdrop-filter:blur(18px) saturate(170%);backdrop-filter:blur(18px) saturate(170%)}
  html[data-kz-theme] body.kz-landing .topnav .brand b{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-landing .topnav nav a{color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-landing .topnav nav a:hover{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-landing .topnav nav a::after{background:var(--kz-acc)!important}
  html[data-kz-theme] body.kz-landing :is(.topnav .mark,.topnav .pass,.bigbtn){
    background:linear-gradient(135deg,var(--kz-acc),var(--kz-acc2))!important;color:var(--kz-on-acc,#fff)!important;
    box-shadow:0 14px 30px -14px var(--kz-acc2)!important}
  html[data-kz-theme] body.kz-landing .announce{
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important;color:var(--kz-t2)!important;
    box-shadow:inset 0 1px 0 var(--kz-line-2),0 10px 24px -18px rgba(0,0,0,.3)!important}
  html[data-kz-theme] body.kz-landing .announce b{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-landing .announce .lnk{color:var(--kz-acc-text)!important}
  html[data-kz-theme] body.kz-landing h1.hero-t{
    background:linear-gradient(180deg,var(--kz-t1) 52%,var(--kz-t3))!important;
    -webkit-background-clip:text!important;background-clip:text!important;-webkit-text-fill-color:transparent!important}
  html[data-kz-theme] body.kz-landing h1.hero-t .dim{
    color:var(--kz-t3)!important;-webkit-text-fill-color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-landing :is(.hero-s,.hero-note,.deck-hint){color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-landing .bigbtn .arr{background:rgba(255,255,255,.24)!important}
  html[data-kz-theme] body.kz-landing .kcard{
    background:var(--kz-fill)!important;border-color:var(--kz-line)!important;
    box-shadow:0 18px 40px -24px rgba(0,0,0,.55),inset 0 0 0 1px var(--kz-line)!important}
  html[data-kz-theme] body.kz-landing .kc-photo::after{background:
    linear-gradient(180deg,rgba(0,0,0,.06) 0%,transparent 38%,var(--kz-fill) 84%)!important}
  html[data-kz-theme] body.kz-landing :is(.kc-name,.kc-r b){color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-landing :is(.kc-name small,.kc-r){color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-landing .kc-rows{border-top-color:var(--kz-line)!important}
  html[data-kz-theme] body.kz-landing .kc-r .sep{color:var(--kz-line-2)!important}
  html[data-kz-theme] body.kz-landing .swiper-slide-active .kcard{
    border-color:var(--kz-acc-line)!important;
    box-shadow:0 26px 52px -24px rgba(0,0,0,.55),0 0 0 1px var(--kz-acc-line)!important}
  html[data-kz-theme] body.kz-landing .swiper-pagination-bullet{background:var(--kz-line-2)!important}
  html[data-kz-theme] body.kz-landing .swiper-pagination-bullet-active{background:var(--kz-acc)!important}
  html[data-kz-theme] body.kz-landing .marquee{
    border-color:var(--kz-line)!important;
    -webkit-mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent);
    mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent)}
  html[data-kz-theme] body.kz-landing .marquee::before,
  html[data-kz-theme] body.kz-landing .marquee::after{display:none}
  html[data-kz-theme] body.kz-landing .marquee span{color:var(--kz-t3)!important;opacity:.55}
  html[data-kz-theme] body.kz-landing .marquee em{color:var(--kz-acc)!important;opacity:.8}
  html[data-kz-theme] body.kz-landing .sec-kick{color:var(--kz-acc-text)!important}
  html[data-kz-theme] body.kz-landing .sec-kick::before{
    background:linear-gradient(90deg,transparent,var(--kz-acc-line))!important}
  html[data-kz-theme] body.kz-landing .sec-kick::after{
    background:linear-gradient(90deg,var(--kz-acc-line),transparent)!important}
  html[data-kz-theme] body.kz-landing .sec-head h2{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-landing .sec-head p{color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-landing .dcard{
    background:var(--kz-surface)!important;border-color:var(--kz-line)!important;
    box-shadow:inset 0 1px 0 var(--kz-line-2),var(--kz-shadow)!important}
  html[data-kz-theme] body.kz-landing .dcard:hover{border-color:var(--kz-acc-line)!important}
  html[data-kz-theme] body.kz-landing .dcard .ico{
    background:var(--kz-acc-soft)!important;border-color:var(--kz-acc-line)!important}
  html[data-kz-theme] body.kz-landing .dcard h3{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-landing .dcard p{color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-landing .dcard .idx{color:var(--kz-t3)!important;opacity:.7}
  html[data-kz-theme] body.kz-landing .stat{
    background:var(--kz-surface)!important;border-color:var(--kz-line)!important;
    box-shadow:inset 0 1px 0 var(--kz-line-2),var(--kz-shadow)!important}
  html[data-kz-theme] body.kz-landing .stat b{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-landing .stat span{color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-landing .trial{
    background:linear-gradient(135deg,var(--kz-acc-soft),transparent)!important;
    border-color:var(--kz-acc-line)!important}
  html[data-kz-theme] body.kz-landing .trial h2{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-landing .trial p{color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-landing .trial-tag{
    color:var(--kz-acc-text)!important;background:var(--kz-acc-soft)!important;
    border-color:var(--kz-acc-line)!important}
  html[data-kz-theme] body.kz-landing .about .prose{color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-landing .about dt{color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-landing .about dd{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-landing .faq details{border-color:var(--kz-line)!important}
  html[data-kz-theme] body.kz-landing .faq summary{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-landing .faq summary::after{color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-landing .faq details p{color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-landing footer{border-color:var(--kz-line)!important}
  html[data-kz-theme] body.kz-landing footer .inner{color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-landing footer a:hover{color:var(--kz-acc-text)!important}
  html[data-kz-theme] body.kz-landing #kzProg{
    background:linear-gradient(90deg,var(--kz-acc),var(--kz-acc2))!important}
  html[data-kz-theme] body.kz-landing #kzCur{background:var(--kz-acc)!important}
  html[data-kz-theme] body.kz-landing #kzCurRing{
    border-color:var(--kz-acc-line)!important;background:transparent}
  html[data-kz-theme] body.kz-landing .scroll-hint{color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-landing .scroll-hint i{
    background:linear-gradient(180deg,var(--kz-line-2),transparent)!important}

  /* ============================================================
     登录页（/login）映射：复用官网同一套背景层
     ============================================================ */
  html[data-kz-theme]:has(body.kz-login){background:var(--kz-base)!important}
  html[data-kz-theme] body.kz-login{
    --panel:var(--kz-fill);
    --line:var(--kz-line);
    --text:var(--kz-t1);
    --muted:var(--kz-t3);
    --brand:var(--kz-acc);
    --brand-weak:var(--kz-acc-soft);
    background:var(--kz-base)!important;color:var(--kz-t1)!important;
    scrollbar-color:var(--kz-scroll) var(--kz-base)}
  html[data-kz-theme] body.kz-login ::-webkit-scrollbar-thumb{background:var(--kz-scroll)!important}
  /* 旧的四团模糊光斑交给 #kzTbg，背景与官网完全一致 */
  html[data-kz-theme] body.kz-login .gbg{display:none!important}
  html[data-kz-theme] body.kz-login .card{
    position:relative;z-index:2;
    background:var(--kz-surface)!important;border-color:var(--kz-line)!important;
    box-shadow:inset 0 1px 0 var(--kz-line-2),var(--kz-shadow)!important}
  html[data-kz-theme] body.kz-login .logo{
    background:linear-gradient(135deg,var(--kz-acc),var(--kz-acc2))!important;
    color:var(--kz-on-acc,#fff)!important;
    box-shadow:0 8px 18px -12px var(--kz-acc2)}
  html[data-kz-theme] body.kz-login .brand h1{color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-login .brand p{color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-login .tabs{background:var(--kz-tabbar)!important}
  html[data-kz-theme] body.kz-login .tabs button{color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-login .tabs button.on{
    background:var(--kz-tabon)!important;color:var(--kz-t1)!important;
    box-shadow:0 2px 6px -3px rgba(0,0,0,.4)!important}
  html[data-kz-theme] body.kz-login .field label{color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-login .field input{
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important;color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-login .field input::placeholder{color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-login .field input:focus{
    background:var(--kz-surface-3)!important;border-color:var(--kz-acc-line)!important;
    box-shadow:0 0 0 3px var(--kz-acc-soft)!important}
  html[data-kz-theme] body.kz-login .btn{
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important;color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-login .btn:hover{background:var(--kz-surface-3)!important}
  html[data-kz-theme] body.kz-login .btn.primary{
    background:linear-gradient(135deg,var(--kz-acc),var(--kz-acc2))!important;
    border-color:transparent!important;color:var(--kz-on-acc,#fff)!important;
    box-shadow:0 12px 26px -14px var(--kz-acc2)!important}
  html[data-kz-theme] body.kz-login .btn.primary:hover{filter:brightness(1.05)!important}
  html[data-kz-theme] body.kz-login :is(.link,.switchlink){color:var(--kz-acc-text)!important}
  html[data-kz-theme] body.kz-login .switchlink:hover{background:var(--kz-acc-soft)!important}
  html[data-kz-theme] body.kz-login .switchlink.back{color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-login :is(.remember,.hint,.footbar,.foot){color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-login .remember input{accent-color:var(--kz-acc)!important}
  html[data-kz-theme] body.kz-login .err{color:var(--kz-err)!important}
  html[data-kz-theme] body.kz-login .ok{color:var(--kz-ok)!important}
  html[data-kz-theme] body.kz-login #kzThemeFab{bottom:22px}

  /* 已登录时 /login 显示的是「账号卡」(.lg-card)，body 带的是 kz-libui 而不是 kz-login，
     上面那套规则一套都命中不了 → 卡片还是原站的白色 66% 玻璃，文字却已经是浅色，白底白字。
     客户 2026-11-07 19:1x：这类「浅色底 + 主题浅字」一律改成主题玻璃底。 */
  html[data-kz-theme] .lg-card{
    background:var(--kz-surface)!important;
    border-color:var(--kz-line)!important;
    box-shadow:var(--kz-shadow)!important;
    backdrop-filter:blur(18px)!important;
    -webkit-backdrop-filter:blur(18px)!important}
  html[data-kz-theme] .lg-card .brand h1{color:var(--kz-t1)!important}
  html[data-kz-theme] .lg-card .brand p{color:var(--kz-t3)!important}
  /* logo 是透明底 webp，原站给它垫了白方块，深色卡上就是一块白斑 */
  html[data-kz-theme] .lg-card .logo-img{background:transparent!important;border-color:var(--kz-line)!important}
  html[data-kz-theme] .lg-card .who{
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important}
  html[data-kz-theme] .lg-card .who b{color:var(--kz-t1)!important}
  html[data-kz-theme] .lg-card .who span{color:var(--kz-t3)!important}
  html[data-kz-theme] .lg-card .btn.block:not(.primary){
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important;color:var(--kz-t2)!important}
  html[data-kz-theme] .lg-card .btn.block:not(.primary):hover{
    background:var(--kz-surface-3)!important;color:var(--kz-t1)!important}
  html[data-kz-theme] .lg-card p.note{color:var(--kz-t3)!important}
  html[data-kz-theme] .lg-card .acts .btn.primary{
    background:linear-gradient(135deg,var(--kz-acc),var(--kz-acc2))!important;
    border-color:transparent!important;color:var(--kz-on-acc,#fff)!important}

  /* ============================================================
     切换器：浮球 + 面板
     ============================================================ */
  #kzThemeFab[data-kz-hidden],#kzThemePanel[data-kz-hidden]{display:none!important}
  #kzThemeFab{position:fixed;right:22px;bottom:78px;z-index:71;
    width:44px;height:44px;border-radius:50%;display:grid;place-items:center;cursor:pointer;
    background:var(--kz-surface-2);border:1px solid var(--kz-line-2);color:var(--kz-t1);
    -webkit-backdrop-filter:blur(16px) saturate(170%);backdrop-filter:blur(16px) saturate(170%);
    box-shadow:0 14px 34px -22px rgba(0,0,0,.4),inset 0 1px 0 var(--kz-line-2),var(--kz-glow);
    transition:transform .3s cubic-bezier(.22,.61,.24,1),box-shadow .28s ease,border-color .28s ease;
    animation:kzFabIn .55s cubic-bezier(.22,.61,.24,1) both}
  #kzThemeFab:hover{transform:translateY(-3px) scale(1.06);border-color:var(--kz-acc-line);
    box-shadow:0 20px 44px -20px rgba(0,0,0,.5),0 0 28px -10px var(--kz-acc2)}
  #kzThemeFab:active{transform:scale(.93)}
  #kzThemeFab svg{width:20px;height:20px;transition:transform .5s cubic-bezier(.22,.61,.24,1)}
  #kzThemeFab:hover svg{transform:rotate(-14deg)}
  #kzThemeFab .kz-fab-dot{position:absolute;right:4px;bottom:4px;width:9px;height:9px;border-radius:50%;
    background:linear-gradient(135deg,var(--kz-acc),var(--kz-acc2));
    box-shadow:0 0 10px var(--kz-acc2),0 0 0 2px var(--kz-fill)}
  @keyframes kzFabIn{from{opacity:0;transform:translateY(14px) scale(.8)}to{opacity:1;transform:none}}

  #kzThemePanel{position:fixed;right:22px;bottom:138px;z-index:72;width:312px;padding:14px;
    max-height:calc(100vh - 190px);display:flex;flex-direction:column;
    border-radius:20px;background:var(--kz-surface);border:1px solid var(--kz-line);
    box-shadow:var(--kz-shadow),inset 0 1px 0 var(--kz-line-2),var(--kz-glow);
    -webkit-backdrop-filter:blur(28px) saturate(175%);backdrop-filter:blur(28px) saturate(175%);
    opacity:0;transform:translateY(12px) scale(.95);transform-origin:100% 100%;pointer-events:none;
    transition:opacity .26s ease,transform .34s cubic-bezier(.22,.61,.24,1)}
  #kzThemePanel.on{opacity:1;transform:none;pointer-events:auto}
  .th-hd{display:flex;align-items:baseline;gap:8px;padding:2px 4px 12px}
  .th-hd b{font-size:14px;font-weight:700;color:var(--kz-t1);letter-spacing:-.01em}
  .th-hd em{font-size:10.5px;font-style:normal;color:var(--kz-t3);letter-spacing:.02em}
  .th-hd .th-x{margin-left:auto;width:24px;height:24px;border-radius:50%;border:1px solid var(--kz-line);
    background:transparent;color:var(--kz-t3);font-size:13px;line-height:1;cursor:pointer;
    transition:background .18s,color .18s,transform .2s}
  .th-hd .th-x:hover{background:var(--kz-surface-3);color:var(--kz-t1);transform:rotate(90deg)}
  .th-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px;
    overflow-y:auto;min-height:0;padding-right:3px;
    scrollbar-width:thin;scrollbar-color:var(--kz-line-2) transparent}
  .th-card{position:relative;padding:0;border-radius:13px;overflow:hidden;cursor:pointer;text-align:left;
    border:1px solid var(--kz-line);background:var(--kz-surface-2);
    transition:transform .22s cubic-bezier(.22,.61,.24,1),border-color .22s,box-shadow .24s;
    animation:kzCardIn .4s cubic-bezier(.22,.61,.24,1) backwards;
    animation-delay:calc(var(--i,0) * 38ms)}
  .th-card:hover{transform:translateY(-3px);border-color:var(--kz-line-2);
    box-shadow:0 14px 28px -18px rgba(0,0,0,.6)}
  .th-card.on{border-color:var(--kz-acc);box-shadow:0 0 0 1px var(--kz-acc),0 12px 28px -14px var(--kz-acc2)}
  @keyframes kzCardIn{from{opacity:0;transform:translateY(8px) scale(.96)}to{opacity:1;transform:none}}
  .th-grid::-webkit-scrollbar{width:4px}
  .th-grid::-webkit-scrollbar-thumb{background:var(--kz-line-2);border-radius:4px}
  .th-grid::-webkit-scrollbar-track{background:transparent}
  .th-pv{position:relative;display:block;height:48px;overflow:hidden}
  .th-pv .th-pat{position:absolute;inset:0;opacity:.85}
  .th-pv::after{content:"";position:absolute;inset:0;
    background:linear-gradient(180deg,transparent 40%,rgba(0,0,0,.16))}
  .th-meta{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:5px 8px 6px}
  .th-meta b{font-size:11px;font-weight:600;color:var(--kz-t1);letter-spacing:.01em}
  .th-meta em{font-size:8px;font-style:normal;color:var(--kz-t3);letter-spacing:.10em;text-transform:uppercase}
  .th-ck{position:absolute;right:6px;top:6px;width:17px;height:17px;border-radius:50%;
    background:var(--kz-acc);color:#fff;display:grid;place-items:center;
    opacity:0;transform:scale(.4) rotate(-30deg);
    transition:opacity .2s ease,transform .3s cubic-bezier(.34,1.56,.64,1);
    box-shadow:0 4px 10px -4px rgba(0,0,0,.6)}
  .th-card.on .th-ck{opacity:1;transform:none}
  .th-ck svg{width:10px;height:10px}
  .th-ft{display:flex;align-items:center;justify-content:space-between;padding:11px 4px 1px;margin-top:2px}
  .th-ft span{font-size:10.5px;color:var(--kz-t3)}
  .th-ft button{border:0;background:transparent;color:var(--kz-t3);font-size:10.5px;cursor:pointer;
    padding:2px 0;border-bottom:1px dashed var(--kz-line-2);transition:color .18s}
  .th-ft button:hover{color:var(--kz-acc-text)}

  /* 六个预览的图案（迷你版） */
  .th-pat.p-neon{background-image:linear-gradient(rgba(255,255,255,.14) 1px,transparent 1px),
    linear-gradient(90deg,rgba(255,255,255,.14) 1px,transparent 1px);background-size:13px 13px}
  .th-pat.p-sakura{background-image:radial-gradient(circle,rgba(255,255,255,.62) 1.4px,transparent 1.9px);
    background-size:12px 12px}
  .th-pat.p-celestial{background-image:radial-gradient(rgba(255,255,255,.95) 1px,transparent 1.5px),
    radial-gradient(rgba(255,255,255,.5) .7px,transparent 1.2px);background-size:26px 26px,13px 13px}
  .th-pat.p-moonlit{background-image:linear-gradient(rgba(80,80,140,.30) 1px,transparent 1px),
    linear-gradient(90deg,rgba(80,80,140,.30) 1px,transparent 1px);background-size:12px 12px}
  .th-pat.p-tokyo{background-image:radial-gradient(rgba(220,228,255,.85) 1px,transparent 1.5px),
    repeating-linear-gradient(90deg,rgba(122,162,247,.35) 0 1px,transparent 1px 14px);
    background-size:13px 13px,100% 100%}
  .th-pat.p-mocha{background-image:radial-gradient(rgba(205,214,244,.5) 1px,transparent 1.5px),
    radial-gradient(rgba(203,166,247,.55) 2px,transparent 2.8px);background-size:12px 12px,40px 40px}

  /* 主题切换：圆形揭示（View Transitions） */
  ::view-transition-old(root),::view-transition-new(root){animation:none;mix-blend-mode:normal}
  ::view-transition-old(root){z-index:1}
  ::view-transition-new(root){z-index:2}

  @media (max-width:760px){
    #kzTbg .t-glow i{animation:none!important}
    #kzThemeFab{right:16px;bottom:74px;width:42px;height:42px}
    #kzThemePanel{right:12px;left:12px;width:auto;bottom:126px;padding:12px;border-radius:18px}
    .th-grid{grid-template-columns:1fr 1fr 1fr;gap:7px}
    .th-pv{height:44px}
    .th-meta{padding:6px 7px;flex-direction:column;align-items:flex-start;gap:1px}
    .th-meta em{display:none}
  }
  @media (prefers-reduced-motion:reduce){
    #kzTbg .t-glow i{animation:none!important}
    #kzThemeFab,#kzThemePanel,.th-card{animation:none!important;transition:none!important}
  }
  /* 原生下拉的选项弹层由系统绘制，不继承页面配色（客户 2026-11-07 21:31：
     导入页「服务商」下拉展开后是白底浅字，几乎看不见；选中项还是系统蓝）。
     这里统一改成主题实色底 + 主题文字，选中项用主题色。
     ⚠️ option 背景必须不透明——弹层不叠在页面玻璃上，半透明会透出系统白底。 */
  select option{
    background-color:#fff;
    color:#1c2130;
  }
  html[data-kz-theme] select option{
    background-color:var(--kz-fill,#14182a);
    color:var(--kz-t1,#eef1f8);
  }
  html[data-kz-theme] select option:checked{
    background-color:var(--kz-acc,#6366f1);
    color:var(--kz-on-acc,#fff);
  }
  html[data-kz-theme] select option:disabled{color:var(--kz-t3,#7c869c)}
/* ===== kzCriticalCss ===== */
/* 2026-11-08：新版题库/首页的样式原本全写在 <body> 里，浏览器会先用默认（原站浅色）样式画一遍，等解析到那些 <style> 才变深色 —— 客户看到的「闪回老版本」就是这一下。这里把关键样式复制进 <head>，让首帧就是新版；原位置的副本保留，层叠结果不变。 */

  /* ================= 题库页重做（只在非答题页生效） ================= */
  body.kz-libui .bare{background:
    radial-gradient(1000px 620px at 10% -8%, rgba(99,91,255,.12), transparent 62%),
    radial-gradient(880px 560px at 94% 2%, rgba(56,189,248,.11), transparent 64%),
    radial-gradient(820px 620px at 50% 112%, rgba(236,72,153,.07), transparent 70%),
    linear-gradient(180deg,#f6f8fc,#f2f5fb 60%,#f6f8fc)}
  /* 旧光斑压淡，只当环境色 */
  body.kz-libui .gbg{opacity:.45}

  /* ---------- 顶部：一块悬浮玻璃 ---------- */
  body.kz-libui .ahd{display:flex;align-items:center;gap:12px;
    margin:0 0 14px;padding:14px 16px;border-radius:18px;
    background:linear-gradient(180deg,rgba(255,255,255,.88),rgba(255,255,255,.72));
    border:1px solid rgba(255,255,255,.92);
    box-shadow:inset 0 1px 0 #fff,0 20px 44px -34px rgba(28,33,48,.5);
    -webkit-backdrop-filter:blur(18px) saturate(150%);backdrop-filter:blur(18px) saturate(150%)}
  body.kz-libui .ahd-logo{width:40px;height:40px;border-radius:12px;object-fit:cover;
    box-shadow:0 8px 18px -12px rgba(28,33,48,.55),0 0 0 1px rgba(28,33,48,.06)}
  body.kz-libui .ahd-t b{font-size:17px;font-weight:700;letter-spacing:-.01em}
  body.kz-libui .ahd-t em{font-size:9.5px;letter-spacing:.18em;color:#9aa2b3;font-style:normal;text-transform:uppercase}
  body.kz-libui .ahd-sub{font-size:12px;color:#8b93a4;letter-spacing:.01em}
  body.kz-libui .goal-wrap{height:34px;display:flex;align-items:center;padding:0 13px;border-radius:999px;
    background:#fff;border:1px solid #e6eaf3;box-shadow:0 4px 12px -10px rgba(28,33,48,.4)}
  body.kz-libui .goal-trigger{font-size:12.5px;color:#6b7280}
  body.kz-libui .goal-trigger b{color:#4f46e5;font-weight:700}
  body.kz-libui .ahd-btn.solid{height:36px;padding:0 16px;border-radius:10px;font-size:13px;font-weight:600;
    color:#fff;border:0;background:linear-gradient(135deg,#4f46e5,#6f66ff);
    box-shadow:0 12px 24px -14px rgba(79,70,229,.7);
    transition:transform .18s cubic-bezier(.22,.61,.24,1),box-shadow .2s ease,filter .2s ease}
  body.kz-libui .ahd-btn.solid::before{content:"＋";margin-right:5px;font-weight:700}
  body.kz-libui .ahd-btn.solid:hover{transform:translateY(-1px);filter:brightness(1.04);
    box-shadow:0 16px 30px -14px rgba(79,70,229,.8)}
  body.kz-libui .ahd-ava{width:36px;height:36px;border-radius:50%;border:0;color:#fff;font-weight:700;
    background:linear-gradient(135deg,#4f46e5,#8b5cf6);
    box-shadow:0 0 0 3px rgba(79,70,229,.12),0 8px 18px -12px rgba(79,70,229,.6)}
  @media (max-width:1180px){body.kz-libui .ahd-sub{display:none!important}}

  /* ---------- 科目栏：分段控制 ---------- */
  body.kz-libui .tabs{display:flex;align-items:center;gap:4px;padding:5px;border-radius:14px;
    background:rgba(255,255,255,.72);border:1px solid rgba(255,255,255,.95);
    box-shadow:inset 0 1px 0 #fff,0 12px 28px -26px rgba(28,33,48,.5);
    overflow-x:auto;scrollbar-width:none;margin:0 0 12px}
  body.kz-libui .tabs::-webkit-scrollbar{display:none}
  body.kz-libui .tabs .tab{height:36px;padding:0 14px;border-radius:9px;border:0;background:transparent;
    color:#6b7280;font-size:13px;display:inline-flex;align-items:center;gap:6px;white-space:nowrap;
    transition:background .2s ease,color .18s ease,box-shadow .22s ease,transform .18s cubic-bezier(.22,.61,.24,1)}
  body.kz-libui .tabs .tab .ti{opacity:.75;font-size:13px;display:inline-flex;align-items:center}
  body.kz-libui .tabs .tab:hover{background:rgba(255,255,255,.7);color:#1c2130}
  body.kz-libui .tabs .tab.on{background:#fff;color:#1c2130;font-weight:600;
    box-shadow:0 8px 20px -16px rgba(28,33,48,.55),0 0 0 1px rgba(28,33,48,.04)}
  body.kz-libui .tabs .tab.on .ti{opacity:1;color:#4f46e5}
  body.kz-libui .tabs .tab em{background:#ef4444;color:#fff;font-style:normal;font-size:10px;
    line-height:16px;padding:0 5px;border-radius:999px;margin-left:2px}
  body.kz-libui #kzInk{display:none!important}

  /* ---------- 搜索：大一号，带快捷键提示 ---------- */
  body.kz-libui .kz-ps{margin:0 0 6px}
  body.kz-libui .kz-ps-in{height:52px;padding:0 16px;border-radius:14px;background:#fff;
    border:1px solid #e7eaf3;box-shadow:0 10px 24px -22px rgba(28,33,48,.45);
    transition:border-color .2s ease,box-shadow .22s ease}
  body.kz-libui .kz-ps-in:focus-within{border-color:rgba(79,70,229,.45);
    box-shadow:0 0 0 4px rgba(79,70,229,.10),0 10px 24px -22px rgba(28,33,48,.4)}
  body.kz-libui .kz-ps-in svg{width:17px;height:17px;opacity:.65}
  body.kz-libui .kz-ps-in input{font-size:14px;color:#1c2130}
  body.kz-libui .kz-ps-in input::placeholder{color:#9aa2b3}

  /* ---------- 题库卡：玻璃面板 + 卡片化列表 ---------- */
  body.kz-libui .glass.lib{border-radius:20px;padding:0!important;overflow:hidden;
    background:rgba(255,255,255,.78);border:1px solid rgba(255,255,255,.95);
    box-shadow:inset 0 1px 0 #fff,0 28px 64px -44px rgba(28,33,48,.5);
    -webkit-backdrop-filter:blur(18px) saturate(150%);backdrop-filter:blur(18px) saturate(150%)}
  body.kz-libui .lib .g-hd{padding:18px 22px 14px!important;gap:10px;align-items:center}
  body.kz-libui .lib .g-hd b{font-size:15px;font-weight:700;letter-spacing:-.01em;color:#1c2130;
    display:inline-flex;align-items:center;gap:9px}
  body.kz-libui .lib .g-hd b.kz-lib-t::before{content:"";width:3px;height:15px;border-radius:2px;
    background:linear-gradient(180deg,#4f46e5,#8b5cf6);flex:none}
  @media (min-width:1280px){body.kz-libui .page{max-width:1120px}}
  body.kz-libui .lib .g-c{font-size:12px;color:#8b93a4;letter-spacing:.02em}
  body.kz-libui .lib .chip{height:30px;padding:0 12px;border-radius:999px;border:1px solid #e7eaf3;
    background:#fff;color:#5b6376;font-size:12px;font-weight:500;
    transition:background .18s ease,color .18s ease,border-color .18s ease,transform .16s ease}
  body.kz-libui .lib .chip:hover{transform:translateY(-1px);border-color:#d8deeb;color:#1c2130}
  body.kz-libui .lib .chip.on{background:rgba(79,70,229,.10);border-color:rgba(79,70,229,.26);
    color:#4f46e5;font-weight:600}

  body.kz-libui .libbar{padding:10px 22px!important;gap:10px;align-items:center;
    background:rgba(247,249,253,.92);border-top:1px solid #eef1f7;border-bottom:1px solid #eef1f7}
  body.kz-libui .libbar .srch-wrap{height:34px;border-radius:9px;background:#fff;border:1px solid #e7eaf3}
  body.kz-libui .libbar .srch-wrap input{font-size:12.5px}

  body.kz-libui .parts{padding:10px 22px!important;gap:6px;align-items:center}
  body.kz-libui .parts .part{height:32px;padding:0 12px;border-radius:8px;font-size:12.5px;color:#5b6376;
    background:transparent;border:0;transition:background .18s ease,color .18s ease}
  body.kz-libui .parts .part em{margin-left:6px;font-style:normal;font-size:11px;color:#9aa2b3}
  body.kz-libui .parts .part.on{background:rgba(79,70,229,.10);color:#4f46e5;font-weight:600}
  body.kz-libui .parts .part.on em{color:#6f66ff}
  body.kz-libui .parts .stf{background:#f1f4fa;border-radius:9px;padding:3px}
  body.kz-libui .parts .stf button{height:26px;padding:0 10px;border-radius:6px;border:0;background:transparent;
    font-size:12px;color:#6b7280}
  body.kz-libui .parts .stf button.on{background:#fff;color:#1c2130;font-weight:600;
    box-shadow:0 2px 6px -4px rgba(28,33,48,.45)}

  body.kz-libui .rows{padding:8px 12px 12px;gap:2px}
  body.kz-libui .rows .row{border-radius:12px;border:1px solid transparent;padding:12px 10px!important;
    transition:background .18s ease,border-color .18s ease,box-shadow .22s ease,transform .2s cubic-bezier(.22,.61,.24,1)}
  body.kz-libui .rows .row:hover{background:#fff;border-color:#eaeef7;transform:translateX(2px);
    box-shadow:0 12px 26px -22px rgba(28,33,48,.45)}
  body.kz-libui .c-t b{font-size:14.5px;font-weight:600;letter-spacing:-.005em}
  body.kz-libui .c-t em{font-size:12px;color:#8b93a4}
  body.kz-libui .c-stat em{font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:#a3aab9}
  body.kz-libui .c-stat b{font-size:13px;font-variant-numeric:tabular-nums}
  body.kz-libui .c-stat .bar{height:3px;border-radius:2px}
  body.kz-libui .rows .go{height:30px;border-radius:8px;border:0;background:rgba(79,70,229,.09);
    color:#4f46e5;font-size:12px;font-weight:600;transition:background .18s ease,color .18s ease,transform .16s ease}
  body.kz-libui .rows .go:hover{background:#4f46e5;color:#fff;transform:translateY(-1px)}
  body.kz-libui .kz-tg{height:18px;line-height:18px;padding:0 6px;border-radius:5px;font-size:10.5px;border:1px solid transparent}
  body.kz-libui .kz-tg.attr{background:#fde68a;color:#6b3f0a;border-color:#f0c95f}
  body.kz-libui .kz-tg.hot{background:#fee2e2;color:#b42318;border-color:#f6c2c8}

  /* ---------- 窄屏 ---------- */
  @media (max-width:760px){
    body.kz-libui .ahd{gap:9px;padding:11px 12px;border-radius:16px}
    body.kz-libui .ahd-logo{width:34px;height:34px;border-radius:10px}
    body.kz-libui .ahd-t b{font-size:15px}
    body.kz-libui .ahd-t em{display:block;font-size:11.5px;letter-spacing:.1em}
    body.kz-libui .goal-wrap{height:30px;padding:0 10px}
    body.kz-libui .ahd-btn.solid{height:32px;padding:0 12px;font-size:12px}
    body.kz-libui .ahd-ava{width:32px;height:32px}
    body.kz-libui .tabs{padding:4px;border-radius:12px}
    body.kz-libui .tabs .tab{height:33px;padding:0 11px;font-size:12.5px}
    body.kz-libui .kz-ps-in{height:46px;border-radius:12px}
    body.kz-libui .glass.lib{border-radius:16px}
    body.kz-libui .lib .g-hd,body.kz-libui .libbar,body.kz-libui .parts{padding-left:14px!important;padding-right:14px!important}
    body.kz-libui .rows{padding:6px 8px 10px}
  }


  /* ============ 题库页：光环境 + 渐变描边 + 深度 ============ */
  body.kz-libui .bare{position:relative;background:
    radial-gradient(1200px 720px at 8% -14%, #e2e7ff 0%, rgba(226,231,255,0) 58%),
    radial-gradient(920px 620px at 98% 2%, #d9f1ff 0%, rgba(217,241,255,0) 62%),
    radial-gradient(900px 720px at 62% 112%, #ffe6f4 0%, rgba(255,230,244,0) 64%),
    linear-gradient(180deg,#f5f7fc,#eef2fa 64%,#f4f6fc)}
  /* 极淡网格，只在顶部可见 */
  body.kz-libui .bare::before{content:"";position:fixed;inset:0;z-index:0;pointer-events:none;
    background-image:linear-gradient(rgba(28,33,48,.05) 1px,transparent 1px),
      linear-gradient(90deg,rgba(28,33,48,.05) 1px,transparent 1px);
    background-size:52px 52px;
    -webkit-mask-image:radial-gradient(80% 46% at 50% 0%,#000 18%,transparent 72%);
    mask-image:radial-gradient(80% 46% at 50% 0%,#000 18%,transparent 72%);
    opacity:.45}
  body.kz-libui .atlas{position:relative;z-index:1}

  /* ---------- 页头：渐变描边 + 顶部反光 ---------- */
  body.kz-libui .ahd{position:relative;overflow:hidden}
  body.kz-libui .ahd::before{content:"";position:absolute;inset:0;border-radius:inherit;padding:1px;
    background:linear-gradient(118deg,rgba(79,70,229,.55),rgba(56,189,248,.4) 38%,rgba(236,72,153,.28) 68%,rgba(79,70,229,.5));
    -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
    -webkit-mask-composite:xor;mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
    mask-composite:exclude;pointer-events:none;opacity:.95}
  body.kz-libui .ahd::after{content:"";position:absolute;left:-10%;right:-10%;top:-70%;height:120%;
    background:linear-gradient(112deg,rgba(255,255,255,.9) 0%,rgba(255,255,255,.25) 26%,transparent 46%);
    transform:rotate(-2deg);pointer-events:none;opacity:.5}
  body.kz-libui .ahd > *{position:relative;z-index:1}
  body.kz-libui .ahd{box-shadow:inset 0 1px 0 #fff,0 24px 50px -36px rgba(79,70,229,.5),
    0 20px 44px -34px rgba(28,33,48,.45)}
  body.kz-libui .ahd-t b{background:linear-gradient(180deg,#1c2130,#4b5468);
    -webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
  body.kz-libui .ahd-logo{box-shadow:0 10px 22px -14px rgba(79,70,229,.65),0 0 0 1px rgba(28,33,48,.06),
    inset 0 1px 0 rgba(255,255,255,.6)}

  /* ---------- 科目栏：选中带渐变与光晕 ---------- */
  body.kz-libui .tabs .tab{position:relative}
  body.kz-libui .tabs .tab.on{background:linear-gradient(180deg,#fff,#f7f9ff);
    box-shadow:0 10px 24px -18px rgba(79,70,229,.6),0 0 0 1px rgba(79,70,229,.18)}
  body.kz-libui .tabs .tab.on::after{content:"";position:absolute;left:50%;bottom:-1px;width:20px;height:2px;
    border-radius:2px;background:linear-gradient(90deg,#4f46e5,#8b5cf6);transform:translateX(-50%);
    box-shadow:0 0 10px rgba(79,70,229,.55)}

  /* ---------- 搜索：聚焦渐变边 ---------- */
  body.kz-libui .kz-ps-in{position:relative;background:linear-gradient(180deg,#fff,#fbfcff)}
  body.kz-libui .kz-ps-in:focus-within{border-color:rgba(79,70,229,.35);
    box-shadow:0 0 0 4px rgba(79,70,229,.10),0 16px 34px -26px rgba(79,70,229,.55)}

  /* ---------- 题库卡：顶部渐变细线 + 角光 ---------- */
  body.kz-libui .glass.lib{position:relative;overflow:hidden}
  body.kz-libui .glass.lib::before{content:"";position:absolute;left:0;right:0;top:0;height:2px;z-index:2;
    background:linear-gradient(90deg,transparent 2%,rgba(79,70,229,.65) 22%,rgba(56,189,248,.55) 58%,rgba(236,72,153,.4) 82%,transparent 98%)}
  body.kz-libui .glass.lib::after{content:"";position:absolute;right:-120px;top:-140px;width:340px;height:340px;
    pointer-events:none;border-radius:50%;
    background:radial-gradient(closest-side,rgba(99,91,255,.16),transparent 72%)}

  /* ---------- 列表行：左侧渐变条 + hover 抬升 ---------- */
  body.kz-libui .rows .row{position:relative}
  body.kz-libui .rows .row::before{content:"";position:absolute;left:0;top:16%;bottom:16%;width:2px;
    border-radius:2px;background:linear-gradient(180deg,#4f46e5,#8b5cf6);opacity:0;
    transition:opacity .2s ease}
  body.kz-libui .rows .row:hover::before{opacity:1}
  body.kz-libui .rows .row:hover{box-shadow:0 16px 34px -26px rgba(28,33,48,.5),0 0 0 1px rgba(79,70,229,.06)}

  /* ---------- 练习按钮：hover 渐变填充 + 箭头 ---------- */
  body.kz-libui .rows .go{display:inline-flex;align-items:center;justify-content:center;gap:4px}
  body.kz-libui .rows .go::after{content:"→";opacity:0;transform:translateX(-3px);
    transition:opacity .2s ease,transform .2s ease}
  body.kz-libui .rows .go:hover{background:linear-gradient(135deg,#4f46e5,#6f66ff);
    box-shadow:0 10px 20px -12px rgba(79,70,229,.65)}
  body.kz-libui .rows .go:hover::after{opacity:1;transform:none}

  /* ---------- chip / part 的细节 ---------- */
  body.kz-libui .lib .chip.on{box-shadow:inset 0 0 0 1px rgba(79,70,229,.06),0 6px 14px -12px rgba(79,70,229,.5)}
  body.kz-libui .parts .part.on{box-shadow:inset 0 0 0 1px rgba(79,70,229,.08)}

  @media (prefers-reduced-motion:reduce){
    body.kz-libui .ahd::after{display:none}
  }


  /* ================= 题库页：深色霓虹（答题页不受影响） ================= */
  body.kz-libui .bare{
    background:
      radial-gradient(980px 640px at 12% -8%, rgba(79,70,229,.42), transparent 60%),
      radial-gradient(820px 560px at 92% 0%, rgba(34,211,238,.24), transparent 62%),
      radial-gradient(900px 700px at 52% 112%, rgba(139,92,246,.32), transparent 66%),
      #06080f}
  body.kz-libui .gbg{opacity:0}
  /* 网格 + 星点 */
  body.kz-libui .bare::before{
    background-image:
      linear-gradient(rgba(255,255,255,.05) 1px,transparent 1px),
      linear-gradient(90deg,rgba(255,255,255,.05) 1px,transparent 1px),
      radial-gradient(rgba(255,255,255,.5) 1px,transparent 1.6px);
    background-size:64px 64px,64px 64px,140px 140px;
    -webkit-mask-image:radial-gradient(92% 66% at 50% 0%,#000 26%,transparent 84%);
    mask-image:radial-gradient(92% 66% at 50% 0%,#000 26%,transparent 84%);
    opacity:.55}
  /* 缓慢流动的极光 */
  body.kz-libui .bare::after{content:"";position:fixed;inset:-25%;z-index:0;pointer-events:none;
    background:
      radial-gradient(520px 420px at 28% 32%, rgba(99,91,255,.34), transparent 70%),
      radial-gradient(460px 380px at 72% 58%, rgba(34,211,238,.20), transparent 72%),
      radial-gradient(420px 360px at 52% 84%, rgba(217,70,239,.18), transparent 72%);
    filter:blur(30px);animation:kzAurora 22s ease-in-out infinite alternate}
  @keyframes kzAurora{from{transform:translate3d(-2%,-1%,0) scale(1)}to{transform:translate3d(2.5%,2%,0) scale(1.07)}}
  body.kz-libui .atlas{color:#dbe2f2}

  /* ---------- 页头 ---------- */
  body.kz-libui .ahd{
    background:linear-gradient(180deg,rgba(20,24,42,.82),rgba(12,16,28,.7));
    border:1px solid rgba(255,255,255,.09);
    box-shadow:inset 0 1px 0 rgba(255,255,255,.09),
      0 30px 60px -40px rgba(0,0,0,.9),
      0 0 46px -22px rgba(99,91,255,.55)}
  body.kz-libui .ahd-t b{background:linear-gradient(180deg,#fff,#c7cde2);
    -webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
  body.kz-libui .ahd-t em{color:#7f89a3}
  body.kz-libui .ahd-sub{color:#8b93a4}
  body.kz-libui .goal-wrap{background:rgba(255,255,255,.06);border-color:rgba(255,255,255,.12);
    box-shadow:0 0 0 1px rgba(0,0,0,.2),inset 0 1px 0 rgba(255,255,255,.08)}
  body.kz-libui .goal-trigger{background:rgba(255,255,255,.06)!important;
    border:1px solid rgba(255,255,255,.12)!important;color:#aab3c8}
  body.kz-libui .goal-trigger:hover{background:rgba(255,255,255,.1)!important}
  body.kz-libui .goal-trigger b{color:#a5a0ff}
  body.kz-libui .ahd-btn.solid{background:linear-gradient(135deg,#5b5bff,#a855f7);
    box-shadow:0 14px 30px -12px rgba(99,91,255,.85),inset 0 1px 0 rgba(255,255,255,.28)}
  body.kz-libui .ahd-ava{background:linear-gradient(135deg,#6366f1,#a855f7);
    box-shadow:0 0 0 3px rgba(139,92,246,.18),0 0 26px -6px rgba(139,92,246,.8)}
  body.kz-libui .ahd-logo{box-shadow:0 0 0 1px rgba(255,255,255,.16),0 0 26px -6px rgba(99,91,255,.8)}

  /* ---------- 科目栏 ---------- */
  body.kz-libui .tabs{background:rgba(255,255,255,.045);border-color:rgba(255,255,255,.08);
    box-shadow:inset 0 1px 0 rgba(255,255,255,.06),0 20px 40px -34px #000}
  body.kz-libui .tabs .tab{color:#98a2ba}
  body.kz-libui .tabs .tab .ti{color:#7c879f;opacity:1}
  body.kz-libui .tabs .tab:hover{background:rgba(255,255,255,.06);color:#fff}
  body.kz-libui .tabs .tab.on{background:linear-gradient(135deg,rgba(99,91,255,.95),rgba(168,85,247,.9));
    color:#fff;box-shadow:0 12px 30px -14px rgba(99,91,255,.95),inset 0 1px 0 rgba(255,255,255,.3)}
  body.kz-libui .tabs .tab.on .ti{color:#fff}
  body.kz-libui .tabs .tab.on::after{background:linear-gradient(90deg,#22d3ee,#a855f7);
    box-shadow:0 0 14px rgba(139,92,246,.9)}
  body.kz-libui .tabs .tab em{background:linear-gradient(135deg,#f43f5e,#fb7185);color:#fff}

  /* ---------- 搜索 ---------- */
  body.kz-libui .kz-ps-in{background:rgba(255,255,255,.045);border-color:rgba(255,255,255,.09);
    box-shadow:inset 0 1px 0 rgba(255,255,255,.05),0 24px 44px -38px #000}
  body.kz-libui .kz-ps-in svg{stroke:#8b93a4}
  body.kz-libui .kz-ps-in input{color:#eef1f8}
  body.kz-libui .kz-ps-in input::placeholder{color:#6d778e}
  body.kz-libui .kz-ps-in:focus-within{border-color:rgba(139,92,246,.55);
    box-shadow:0 0 0 4px rgba(99,91,255,.16),0 0 34px -10px rgba(99,91,255,.75)}
  body.kz-libui .kz-ps-drop{background:rgba(14,18,32,.96);border-color:rgba(255,255,255,.1);
    box-shadow:0 30px 60px -30px #000,0 0 0 1px rgba(255,255,255,.04)}
  body.kz-libui .kz-ps-item{border-radius:10px}
  body.kz-libui .kz-ps-item:hover{background:rgba(255,255,255,.06)}
  body.kz-libui .kz-ps-item b{color:#eef1f8}
  body.kz-libui .kz-ps-item .m{color:#8b93a4}
  body.kz-libui .kz-ps-empty{color:#8b93a4}
  body.kz-libui .kz-ps-item mark{background:rgba(251,191,36,.22);color:#fcd34d}

  /* ---------- 题库卡 ---------- */
  body.kz-libui .glass.lib{background:linear-gradient(180deg,rgba(20,24,42,.74),rgba(10,14,24,.7));
    border-color:rgba(255,255,255,.09);
    box-shadow:inset 0 1px 0 rgba(255,255,255,.08),0 50px 90px -60px #000,
      0 0 60px -34px rgba(99,91,255,.5)}
  body.kz-libui .glass.lib::before{background:linear-gradient(90deg,transparent,rgba(99,91,255,.9) 18%,
    rgba(34,211,238,.8) 52%,rgba(217,70,239,.7) 82%,transparent);
    box-shadow:0 0 18px rgba(99,91,255,.55)}
  body.kz-libui .glass.lib::after{background:radial-gradient(closest-side,rgba(99,91,255,.22),transparent 72%)}
  body.kz-libui .lib .g-hd b{color:#f2f5ff}
  body.kz-libui .lib .g-c{color:#8b93a4}
  body.kz-libui .lib .chip{background:rgba(255,255,255,.05);border-color:rgba(255,255,255,.1);color:#aab3c8}
  body.kz-libui .lib .chip:hover{background:rgba(255,255,255,.09);border-color:rgba(255,255,255,.18);color:#fff}
  body.kz-libui .lib .chip.on{background:rgba(99,91,255,.2);border-color:rgba(139,92,246,.5);color:#c9c4ff;
    box-shadow:0 0 18px -6px rgba(99,91,255,.8)}
  body.kz-libui .libbar{background:rgba(255,255,255,.03);border-color:rgba(255,255,255,.06)}
  body.kz-libui .libbar .srch-wrap{background:rgba(255,255,255,.05);border-color:rgba(255,255,255,.1)}
  body.kz-libui .libbar .srch-wrap input{color:#e6ebf7}
  body.kz-libui .parts .part{color:#98a2ba}
  body.kz-libui .parts .part em{color:#6f7a92}
  body.kz-libui .parts .part:hover{background:rgba(255,255,255,.05);color:#fff}
  body.kz-libui .parts .part.on{background:rgba(99,91,255,.2);color:#c9c4ff;
    box-shadow:inset 0 0 0 1px rgba(139,92,246,.35)}
  body.kz-libui .parts .part.on em{color:#a5a0ff}
  body.kz-libui .parts .stf{background:rgba(255,255,255,.05)}
  body.kz-libui .parts .stf button{color:#98a2ba}
  body.kz-libui .parts .stf button.on{background:rgba(255,255,255,.12);color:#fff;
    box-shadow:0 2px 8px -4px #000}

  body.kz-libui .rows{background:transparent!important}
  body.kz-libui .rows .row:hover{background:rgba(255,255,255,.05);border-color:rgba(255,255,255,.1);
    box-shadow:0 18px 40px -30px #000,0 0 30px -18px rgba(99,91,255,.6)}
  body.kz-libui .c-t b{color:#eef1f8}
  body.kz-libui .c-t em{color:#8b93a4}
  body.kz-libui .c-stat em{color:#7c869c}
  body.kz-libui .c-stat b{color:#e6ebf7}
  body.kz-libui .c-stat .bar{background:rgba(255,255,255,.1)}
  body.kz-libui .c-stat .bar u{background:linear-gradient(90deg,#6366f1,#22d3ee)}
  body.kz-libui .rows .go{background:rgba(139,92,246,.16);color:#c9c4ff}
  body.kz-libui .rows .go:hover{background:linear-gradient(135deg,#5b5bff,#a855f7);color:#fff;
    box-shadow:0 0 26px -8px rgba(139,92,246,.9)}
  body.kz-libui .kz-tg.attr{background:#fde68a;color:#6b3f0a;border-color:#f0c95f}
  body.kz-libui .kz-tg.hot{background:#fee2e2;color:#b42318;border-color:#f6c2c8}

  /* 深色滚动条 */
  body.kz-libui{scrollbar-color:#2b3350 transparent}
  body.kz-libui ::-webkit-scrollbar-thumb{background:#2b3350;border-color:transparent}
  body.kz-libui ::-webkit-scrollbar-thumb:hover{background:#3a4468}

  @media (max-width:760px){
    body.kz-libui .bare::after{animation:none;filter:blur(22px);opacity:.8}
  }
  @media (prefers-reduced-motion:reduce){
    body.kz-libui .bare::after{animation:none}
  }


  /* ===== 深色扩展：错题 / 记录 / 总览等页面的卡片与控件 ===== */
  body.kz-libui .glass{background:linear-gradient(180deg,rgba(20,24,42,.72),rgba(10,14,24,.68))!important;
    border-color:rgba(255,255,255,.08)!important;
    box-shadow:inset 0 1px 0 rgba(255,255,255,.07),0 40px 80px -56px #000!important}
  body.kz-libui .card,body.kz-libui .pcard,body.kz-libui .dcard{
    background:linear-gradient(180deg,rgba(255,255,255,.06),rgba(255,255,255,.028))!important;
    border-color:rgba(255,255,255,.09)!important;color:#dbe2f2!important;
    box-shadow:0 20px 44px -38px #000!important}
  body.kz-libui .card:hover,body.kz-libui .pcard:hover,body.kz-libui .dcard:hover{
    border-color:rgba(139,92,246,.4)!important;box-shadow:0 0 34px -18px rgba(99,91,255,.75)!important}
  body.kz-libui .card h1,body.kz-libui .card h2,body.kz-libui .card h3,body.kz-libui .card h4,body.kz-libui .card b,
  body.kz-libui .pcard h1,body.kz-libui .pcard h2,body.kz-libui .pcard h3,body.kz-libui .pcard b,
  body.kz-libui .dcard h1,body.kz-libui .dcard h2,body.kz-libui .dcard h3,body.kz-libui .dcard b{color:#eef1f8!important}
  body.kz-libui .card p,body.kz-libui .card em,body.kz-libui .card small,
  body.kz-libui .pcard p,body.kz-libui .pcard em,body.kz-libui .pcard small,
  body.kz-libui .dcard p,body.kz-libui .dcard em,body.kz-libui .dcard small{color:#8b93a4!important}

  /* 通用胶囊 chip / pill / 科目切换 */
  body.kz-libui .chip,body.kz-libui .pill{
    background:rgba(255,255,255,.06)!important;border-color:rgba(255,255,255,.12)!important;color:#b9c2d6!important}
  body.kz-libui .chip:hover,body.kz-libui .pill:hover{background:rgba(255,255,255,.1)!important;color:#fff!important}
  body.kz-libui .chip.on,body.kz-libui .pill.on{
    background:rgba(99,91,255,.22)!important;border-color:rgba(139,92,246,.5)!important;color:#c9c4ff!important;
    box-shadow:0 0 18px -8px rgba(99,91,255,.8)}
  body.kz-libui .sk{background:rgba(255,255,255,.05)!important;border-color:rgba(255,255,255,.1)!important;color:#aab3c8!important}
  body.kz-libui .sk.on{background:linear-gradient(135deg,rgba(99,91,255,.9),rgba(168,85,247,.85))!important;
    border-color:transparent!important;color:#fff!important;box-shadow:0 10px 26px -14px rgba(99,91,255,.9)}
  body.kz-libui .secs,body.kz-libui .stats{background:rgba(255,255,255,.045)!important;
    border-color:rgba(255,255,255,.08)!important}
  body.kz-libui .sec{color:#98a2ba!important}
  body.kz-libui .sec.on{background:rgba(255,255,255,.12)!important;color:#fff!important}
  body.kz-libui .stats b{color:#fff!important}
  body.kz-libui .stats em,body.kz-libui .stats span{color:#8b93a4!important}

  /* 按钮 */
  body.kz-libui .btn{background:rgba(255,255,255,.06)!important;border-color:rgba(255,255,255,.12)!important;
    color:#dbe2f2!important}
  body.kz-libui .btn:hover{background:rgba(255,255,255,.1)!important}
  body.kz-libui .btn.primary,body.kz-libui .btn.solid{
    background:linear-gradient(135deg,#5b5bff,#a855f7)!important;border-color:transparent!important;color:#fff!important;
    box-shadow:0 12px 26px -14px rgba(99,91,255,.85)}
  body.kz-libui .btn:disabled{opacity:.45}

  /* 表单/输入 */
  body.kz-libui input,body.kz-libui textarea,body.kz-libui select{
    background:rgba(255,255,255,.05)!important;border-color:rgba(255,255,255,.12)!important;color:#eef1f8!important}
  body.kz-libui input::placeholder{color:#77829a!important}

  /* 链接 */
  body.kz-libui .atlas a{color:#a5a0ff}
  body.kz-libui .atlas a:hover{color:#c9c4ff}


  /* ===== 深色细节：错题卡 / 进度 / 最近练习 / 通用文字 ===== */
  body.kz-libui .pcard .pi{background:rgba(99,91,255,.16)!important;color:#a5a0ff!important;
    border:1px solid rgba(139,92,246,.3)!important}
  body.kz-libui .pcard .pt b{color:#eef1f8!important}
  body.kz-libui .pcard .pt em{color:#8b93a4!important}
  body.kz-libui .pcard .pacts button{background:rgba(255,255,255,.06)!important;
    border:1px solid rgba(255,255,255,.12)!important;color:#dbe2f2!important}
  body.kz-libui .pcard .pacts button:hover{background:rgba(255,255,255,.12)!important;color:#fff!important}
  body.kz-libui .pcard .pacts button:first-child{background:linear-gradient(135deg,rgba(99,91,255,.9),rgba(168,85,247,.85))!important;
    border-color:transparent!important;color:#fff!important;
    box-shadow:0 10px 22px -14px rgba(99,91,255,.9)}
  body.kz-libui .pcard .pacts button:disabled{opacity:.45!important;color:#8b93a4!important;
    background:rgba(255,255,255,.04)!important}

  body.kz-libui .dcard .d-hd{color:#eef1f8!important}
  body.kz-libui .dcard .p-n{color:#aab3c8!important}
  body.kz-libui .dcard .p-v{color:#fff!important}
  body.kz-libui .dcard .p-bar{background:rgba(255,255,255,.1)!important}
  body.kz-libui .dcard .p-bar i{background:linear-gradient(90deg,#6366f1,#22d3ee)!important}

  body.kz-libui .recent .r-row{color:#c7cfe2!important;border-color:rgba(255,255,255,.07)!important}
  body.kz-libui .recent .r-t{color:#eef1f8!important}
  body.kz-libui .recent .r-row:hover{background:rgba(255,255,255,.05)!important}
  body.kz-libui .recent .muted,body.kz-libui .page .muted{color:#8b93a4!important}
  body.kz-libui .page h1,body.kz-libui .page h2,body.kz-libui .page h3,body.kz-libui .page h4,
  body.kz-libui .page .title,body.kz-libui .page .sec-title{color:#f2f5ff!important}
  body.kz-libui .stats .k,body.kz-libui .stats .label,body.kz-libui .stats .sub{color:#8b93a4!important}
  body.kz-libui .goal-trigger b{color:#a5a0ff!important}
  body.kz-libui .glass .g-hd b{color:#f2f5ff!important}
  body.kz-libui .page .r-b,body.kz-libui .page .d-cta{color:#a5a0ff!important}
  body.kz-libui .page .d-note{color:#7c869c!important}
  body.kz-libui .page .d-hd{color:#eef1f8!important}
  body.kz-libui .page [class*="num"],body.kz-libui .page [class*="count"]{color:#fff!important}
  body.kz-libui .page .tag,body.kz-libui .page .badge,
  body.kz-libui .page [class*="chip"],body.kz-libui .page [class*="pill"],body.kz-libui .page [class*="tag"]{
    background:rgba(255,255,255,.06)!important;border-color:rgba(255,255,255,.12)!important;color:#b9c2d6!important}
  body.kz-libui .page .d-big{color:#fff!important}
  body.kz-libui .page .d-row{color:#9aa4bd!important}
  body.kz-libui .page .d-row b{color:#e6ebf7!important}


  /* 首页「听力 / 阅读」页签下的全部题库列表（客户 2026-11-05：导入即全部可见） */
  .kz-ll{margin:2px 0 4px}
  .kz-ll-hd{display:flex;align-items:baseline;gap:8px;margin:0 2px 10px}
  .kz-ll-hd b{font-size:15px;font-weight:800;color:var(--kz-t1)}
  .kz-ll-hd em{font-style:normal;font-size:12px;color:var(--kz-t3)}
  .kz-ll-hd .kz-ll-n{font-size:12px;color:var(--kz-t3);margin-left:auto}
  .kz-ll-list{display:flex;flex-direction:column;gap:0}
  /* 分页（客户 2026-11-06：一页 10 套，多的翻页） */
  .kz-ll-pager{display:flex;align-items:center;justify-content:center;gap:7px;padding:16px 0 6px}
  .kz-ll-pg{margin:0;min-width:34px;height:34px;padding:0 10px;border-radius:9px;border:1px solid var(--kz-line);
    background:var(--kz-surface-2);color:var(--kz-t2);font:inherit;font-size:13px;font-weight:700;
    cursor:pointer;transition:background .14s ease,border-color .14s ease,color .14s ease}
  .kz-ll-pg:hover:not(:disabled):not(.on){border-color:var(--kz-acc-line);color:var(--kz-acc-text)}
  .kz-ll-pg.on{background:var(--kz-acc);border-color:var(--kz-acc);color:#fff}
  .kz-ll-pg.arw{font-size:17px;line-height:1;padding:0 9px}
  .kz-ll-pg:disabled{opacity:.38;cursor:default}
  /* 客户 2026-11-05：每套一个独立圆角框反而看不清是一列列表 → 改成连续列表 + 分隔线，悬停才亮 */
  .kz-ll-i{
    display:flex;align-items:center;gap:12px;width:100%;text-align:left;
    padding:14px 12px;cursor:pointer;
    background:transparent;border:0;border-bottom:1px solid var(--kz-line);border-radius:0;
    color:var(--kz-t2);font:inherit;
    transition:background .16s ease,border-radius .16s ease;
  }
  .kz-ll-i:last-child{border-bottom:0}
  .kz-ll-i:hover{background:var(--kz-surface-2);border-radius:10px}
  /* 客户 2026-11-07：听力/阅读列表平铺看不出每套是哪个 Part → 按 Part 分组，组名单独一行 */
  .kz-ll-grp{display:flex;align-items:center;gap:9px;padding:16px 12px 7px}
  .kz-ll-grp:first-child{padding-top:2px}
  .kz-ll-grp b{font-size:12.5px;font-weight:800;color:var(--kz-t1);letter-spacing:.02em}
  .kz-ll-grp i{font-style:normal;font-size:11.5px;font-weight:600;color:var(--kz-t3)}
  .kz-ll-grp em{font-style:normal;font-size:11px;color:var(--kz-t3);
    border:1px solid var(--kz-line);border-radius:5px;padding:0 5px;line-height:16px}
  .kz-ll-grp::after{content:'';flex:1 1 auto;height:1px;background:var(--kz-line)}
  /* 客户 2026-11-07：听力/阅读列表顶部的 Part 单选条 —— 点哪个 Part 就只列哪个 Part */
  .kz-ll-parts{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:2px 2px 13px}
  .kz-ll-plab{font-size:12px;font-weight:700;color:var(--kz-t3,#64748b);margin-right:2px}
  .kz-ll-pt{display:inline-flex;align-items:center;gap:5px;height:32px;padding:0 13px;border-radius:999px;
    border:1px solid var(--kz-line,rgba(15,23,42,.14));background:var(--kz-surface-2,rgba(15,23,42,.04));
    color:var(--kz-t2,#475569);
    font:inherit;font-size:12.5px;font-weight:700;line-height:1;cursor:pointer;white-space:nowrap;
    transition:background .14s ease,border-color .14s ease,color .14s ease}
  .kz-ll-pt:hover{border-color:var(--kz-acc-line,rgba(99,102,241,.5));color:var(--kz-acc-text,#4338ca)}
  .kz-ll-pt i{font-style:normal;font-size:11px;font-weight:600;opacity:.72;font-variant-numeric:tabular-nums}
  .kz-ll-pt.on{background:linear-gradient(135deg,var(--kz-acc,#7aa2f7),var(--kz-acc2,#bb9af7))!important;
    border-color:transparent!important;color:#fff!important;box-shadow:none!important}
  .kz-ll-pt.on i{opacity:.85}
  .kz-ll-i:active{background:var(--kz-surface-3)}
  .kz-ll-dot{flex:0 0 auto;width:26px;height:26px;border-radius:50%;display:grid;place-items:center;
    background:var(--kz-acc-soft);color:var(--kz-acc-text);font-size:12px;font-weight:800}
  .kz-ll-b{flex:1 1 auto;min-width:0}
  .kz-ll-t{display:block;font-size:14.5px;font-weight:700;color:var(--kz-t1);
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  /* 英文名后面的中文名（客户 2026-11-06）：小一号、浅一点，仍然同一行 */
  .kz-ll-zh{font-style:normal;margin-left:8px;font-size:12.5px;font-weight:600;color:var(--kz-t3)}
  .kz-ll-m{display:block;margin-top:3px;font-size:12px;color:var(--kz-t3);
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  /* 客户 2026-11-06：高频=红色，必考题=黄色底（两个地方统一：行内标签 + 右上筛选按钮） */
  .kz-ll-tg{display:inline-block;margin-right:6px;padding:0 6px;border-radius:5px;font-size:11px;
    line-height:17px;border:1px solid #f0c95f;color:#6b3f0a;background:#fde68a}
  .kz-ll-tg.hot{border-color:#f6c2c8;color:#b42318;background:#fee2e2}
  .kz-ll-go{flex:0 0 auto;font-size:12.5px;font-weight:700;color:var(--kz-acc-text)}
  .kz-prep-tip{flex:none;margin-left:10px;font-size:11.5px;font-weight:700;color:var(--kz-acc-text);
    background:var(--kz-acc-soft);border:1px solid var(--kz-acc-line);border-radius:6px;padding:2px 8px}
  .kz-ll-empty{padding:22px 16px;text-align:center;color:var(--kz-t2);font-size:13px;
    border:1px dashed var(--kz-line);border-radius:12px}
  .kz-ll-empty .kz-qf-clear{display:inline-flex;align-items:center;height:28px;margin-left:10px;
    padding:0 11px;border-radius:7px;border:1px solid var(--kz-acc-line);
    background:var(--kz-acc-soft);color:var(--kz-acc-text);font-size:12.5px;font-weight:600;
    text-decoration:none;vertical-align:middle;cursor:pointer}
  .kz-ll-empty .kz-qf-clear:hover{filter:brightness(1.06)}

  /* —— 快捷筛选：搜索框左侧的「高频 / 必考题」（客户 2026-11-05） —— */
  .kz-qf{display:flex;align-items:center;gap:8px;flex:0 0 auto;flex-wrap:nowrap}
  .kz-qf-b{
    display:inline-flex;align-items:center;gap:6px;height:36px;padding:0 12px;
    border-radius:9px;border:1px solid transparent;background:transparent;
    color:var(--kz-t2);font:inherit;font-size:13px;font-weight:600;line-height:1;cursor:pointer;
    white-space:nowrap;transition:background .16s ease,color .16s ease;
  }
  .kz-qf-b:hover{background:transparent}
  .kz-qf-b em{font-style:normal;font-size:11.5px;font-weight:700;color:var(--kz-t3);
    font-variant-numeric:tabular-nums}
  /* 客户 2026-11-07 二次调整：常态**完全透明底、无边框无外框**，只留彩色文字；
     点击后仅把底色填成该按钮的专属色（不描边、不加框）。听力和阅读共用这一套。 */
  .kz-qf-b[data-kz-qf="hot"]{
    background:transparent;border-color:var(--qf-edge,rgba(225,29,74,.38));outline:none;box-shadow:none;
    color:var(--qf-ink,#e8a0b2);
    --qf-fill:rgba(225,29,74,.62);--qf-on-ink:#fff2f5}
  .kz-qf-b[data-kz-qf="hot"] em{color:inherit;opacity:.8}
  .kz-qf-b[data-kz-qf="must"]{
    background:transparent;border-color:var(--qf-edge,rgba(240,180,41,.42));outline:none;box-shadow:none;
    color:var(--qf-ink,#d9bd77);
    --qf-fill:rgba(240,180,41,.62);--qf-on-ink:#3d2c00}
  .kz-qf-b[data-kz-qf="must"] em{color:inherit;opacity:.8}
  /* 浅粉主题（客户常用）：白底上选中色降一档，边框压淡、文字压深保证对比 */
  html[data-kz-theme="sakura"] .kz-qf-b[data-kz-qf="hot"]{
    --qf-ink:#b06a80;--qf-edge:rgba(225,29,74,.3);
    --qf-fill:rgba(225,29,74,.18);--qf-on-ink:#8f1234}
  html[data-kz-theme="sakura"] .kz-qf-b[data-kz-qf="must"]{
    --qf-ink:#9a7c33;--qf-edge:rgba(240,180,41,.36);
    --qf-fill:rgba(240,180,41,.26);--qf-on-ink:#634600}
  /* 选中：只换底色与文字色；常驻的 1px 细框保持原样，不再额外加外框/内框 */
  .kz-qf-b.on,.kz-qf-b.on:hover{
    background:var(--qf-fill);color:var(--qf-on-ink);
    outline:none;box-shadow:none}
  .kz-qf-b.on em{opacity:1}
  .kz-qf-clear{border:0;background:transparent;color:var(--kz-acc-text);font:inherit;font-size:12.5px;
    cursor:pointer;padding:0;text-decoration:underline}
  @media (max-width:900px){
    .kz-qf{gap:6px}
    .kz-qf-b{height:32px;padding:0 9px;font-size:12px}
    .kz-qf-b em{font-size:11px}
  }
  @media (max-width:640px){
    /* 窄屏搜索框会独占一行，两个按钮跟在它下面，不挤标题 */
    .kz-qf-b{height:30px}
  }
  @media (max-width:640px){
    .kz-ll-i{padding:11px 12px;gap:10px}
    .kz-ll-pager{gap:6px;padding:14px 0 4px}
    .kz-ll-pg{min-width:32px;height:32px;padding:0 8px;font-size:12.5px}
    .kz-ll-go{display:none}
    .kz-ll-t{font-size:13.5px}
  }


  /* ============ 首页：品牌区去底框 + logo 放大 ============ */
  html[data-kz-theme] body.kz-libui .page > .ahd{
    background:none!important;
    background-image:none!important;
    border:0!important;
    box-shadow:none!important;
    border-radius:0!important;
    padding:4px 2px 18px!important;
    margin-bottom:2px!important;
    display:flex;align-items:center;gap:14px;
    overflow:visible!important;
    /* 背景本来就透明，backdrop-filter 只会把 header 拉成一个合成层，
       从而让里面的动画 webp logo 被画在白底上（深色主题露白方块，2026-11-05 客户报） */
    -webkit-backdrop-filter:none!important;
    backdrop-filter:none!important;
  }
  html[data-kz-theme] body.kz-libui .page > .ahd::before,
  html[data-kz-theme] body.kz-libui .page > .ahd::after{display:none!important}
  /* 客户 2026-11-05：删掉顶栏的「目标 9.0」胶囊（连同它的弹层一起不显示） */
  html[data-kz-theme] body.kz-libui .page > .ahd .goal-wrap{display:none!important}
  /* 动态 logo：客户 2026-11-05「大大大大」→ 54px 放大到 80px（手机 62px） */
  html[data-kz-theme] body.kz-libui .page > .ahd .ahd-logo{
    width:92px!important;height:92px!important;border-radius:0!important;flex:none;
    box-shadow:none!important}
  /* 品牌两行：英文 IELTS ATLAS 在上、中文「浣熊雅思」在下，两行互相对齐居中 */
  html[data-kz-theme] body.kz-libui .page > .ahd .ahd-t{
    display:flex;flex-direction:column;gap:3px;min-width:0;flex:none;
    align-items:center!important;text-align:center!important}
  html[data-kz-theme] body.kz-libui .page > .ahd .ahd-t > b,
  html[data-kz-theme] body.kz-libui .page > .ahd .ahd-t > em{white-space:nowrap}
  html[data-kz-theme] body.kz-libui .page > .ahd .ahd-t b{
    order:2;font-size:22px!important;font-weight:800!important;line-height:1.15;letter-spacing:-.01em}
  html[data-kz-theme] body.kz-libui .page > .ahd .ahd-t em{
    order:1;font-size:14px!important;font-weight:800!important;font-style:normal!important;
    line-height:1.2!important;letter-spacing:.12em!important;text-transform:uppercase;
    color:var(--kz-t1,#1c2130)!important;opacity:1!important}
  /* 品牌副标题：两行卖点文案，第一行渐变强调、第二行淡色（客户 2026-11-04 放大+艺术字） */
  html[data-kz-theme] body.kz-libui .page > .ahd .ahd-sub{
    display:flex!important;flex-direction:column!important;gap:3px!important;
    font-size:0!important;line-height:1.5!important;
    flex:1 1 auto!important;max-width:none!important;margin:0 20px!important;
    white-space:normal;text-align:center!important;align-items:center!important;opacity:1!important}
  html[data-kz-theme] body.kz-libui .page > .ahd .ahd-sub i{
    display:block!important;font-style:normal!important;font-size:15px!important;
    font-weight:800!important;letter-spacing:.01em!important;line-height:1.35!important;
    background:linear-gradient(100deg,var(--kz-acc,#6d28d9),var(--kz-acc2,#db2777))!important;
    -webkit-background-clip:text!important;background-clip:text!important;
    -webkit-text-fill-color:transparent!important;color:transparent!important}
  html[data-kz-theme] body.kz-libui .page > .ahd .ahd-sub em{
    display:block!important;font-style:normal!important;font-size:13px!important;
    font-weight:500!important;letter-spacing:.02em!important;line-height:1.5!important;
    color:var(--kz-t3,#8b93a4)!important;opacity:.9!important}
  /* 副标题占满标题与右侧按钮之间的空间并居中，原来的 .sp 弹性占位就让出来 */
  html[data-kz-theme] body.kz-libui .page > .ahd > .sp{flex:0 0 0!important;width:0!important;min-width:0!important}

  /* ============ 科目栏独占一行（客户：比原版还要大） ============ */
  html[data-kz-theme] body.kz-libui .page > .tabs{
    margin:2px 0 16px!important;padding:6px!important;gap:6px!important;border-radius:16px!important}
  html[data-kz-theme] body.kz-libui .page > .tabs .tab{
    height:44px!important;padding:0 19px!important;font-size:15px!important;gap:8px!important;border-radius:11px!important}
  html[data-kz-theme] body.kz-libui .page > .tabs .tab .ti{font-size:15px!important}
  html[data-kz-theme] body.kz-libui .page > .tabs .tab em{font-size:11px!important;line-height:18px!important;padding:0 6px!important}

  /* ============ 搜索框下移：与「听力 / 阅读 / 写作」那行同一水平线 ============ */
  html[data-kz-theme] body.kz-libui .page > .glass > .skills{
    display:flex!important;align-items:center;gap:10px;flex-wrap:wrap}
  /* 客户 2026-11-05：主页科目行里的「写作 Writing」是禁用态，直接去掉 */
  html[data-kz-theme] body.kz-libui .page > .glass > .skills > .sk.writing{
    display:none!important}
  html[data-kz-theme] body.kz-libui .page > .glass > .skills > .kz-ps{
    margin:0 0 0 auto!important;flex:0 0 auto;width:min(340px,32vw)!important;
    position:relative;z-index:6}
  html[data-kz-theme] body.kz-libui .page > .glass > .skills > .kz-ps .kz-ps-in{
    height:40px!important;border-radius:10px!important}
  html[data-kz-theme] body.kz-libui .page > .glass > .skills > .kz-ps .kz-ps-drop{
    top:46px!important}
  /* 没有科目行时（个别页签）：搜索框绝对定位到右上角，大小按主页 40px；
     内容区上移，让「听力/阅读题库」标题与搜索框同一水平线（客户 2026-11-04）
     top 由 204 → 217：标题行高 57、搜索框 40，要让两者垂直中心对齐得下移 13px */
  html[data-kz-theme] body.kz-libui .page > .kz-ps{
    position:absolute!important;top:217px!important;right:0!important;
    width:min(340px,32vw)!important;margin:0!important;z-index:6}
  html[data-kz-theme] body.kz-libui .page > .kz-ps .kz-ps-in{
    height:40px!important;border-radius:10px!important}
  html[data-kz-theme] body.kz-libui .page > .kz-ps .kz-ps-drop{top:46px!important}

  /* ============ 题型区：去掉外层大底框，卡片直接浮在页面上 ============ */
  html[data-kz-theme] body.kz-libui .page > .glass{
    background:transparent!important;
    background-image:none!important;
    border:0!important;
    box-shadow:none!important;
    border-radius:0!important;
    padding:0!important;
    margin-bottom:8px!important;
    /* 毛玻璃会把背景（星空/渐变）糊掉，看起来像盖了一层雾；
       客户 2026-11-05：要和下方统计区一样，背景原样透出来 */
    -webkit-backdrop-filter:none!important;
    backdrop-filter:none!important;
  }
  /* 原包的顶部高光线与右上角光斑，去框后不再需要 */
  html[data-kz-theme] body.kz-libui .page > .glass::before,
  html[data-kz-theme] body.kz-libui .page > .glass::after{display:none!important}
  /* 去框后用间距和细线分出层次 */
  html[data-kz-theme] body.kz-libui .page > .glass > * + *{margin-top:18px}
  html[data-kz-theme] body.kz-libui .page > .glass .subj-tabs,
  html[data-kz-theme] body.kz-libui .page > .glass .stf{
    margin-bottom:2px}

  /* 列表行：原站 active/hover 是浅色硬编码，深色主题下会变白板 */
  html[data-kz-theme] body.kz-libui .rows .row.active,
  html[data-kz-theme] body.kz-libui .rows .row.on{
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important}
  html[data-kz-theme] body.kz-libui .rows .row:hover{
    background:var(--kz-surface-3)!important;border-color:var(--kz-line-2)!important}
  html[data-kz-theme] body.kz-libui .rows .row.active:hover{
    background:var(--kz-surface-3)!important}

  /* ============ 板块与统计：整体放大一档 ============ */
  /* 卡片底框全透明，直接露出页面背景（客户 2026-11-05：底框全透明直接显示背景）
     注意只清容器本身，卡片里的按钮/输入框保持原样，否则控件会看不见 */
  html[data-kz-theme] body.kz-libui .page :is(.card,.pcard,.dcard),
  body.kz-libui .page :is(.card,.pcard,.dcard){
    background:none!important;background-image:none!important;
    border-color:transparent!important;box-shadow:none!important}
  html[data-kz-theme] body.kz-libui .page > .tabs{
    background:none!important;background-image:none!important;
    border-color:transparent!important;box-shadow:none!important;
    /* 同上：不要毛玻璃，让背景原样透出 */
    -webkit-backdrop-filter:none!important;backdrop-filter:none!important}
  body.kz-libui .page .pcard,
  body.kz-libui .page .gcard{
    border-radius:14px!important;
    padding:18px 20px!important}
  /* 卡片左上角那枚小图标是绝对定位的，顶部必须留出它的位置，否则会压住标题 */
  body.kz-libui .page .pcard{padding-top:46px!important}
  html[data-kz-theme] body.kz-libui .pcard .pi{
    left:20px!important;top:16px!important;
    width:24px;height:24px;min-width:24px;display:flex;align-items:center;justify-content:center;
    border-radius:7px;font-size:13px;line-height:1;box-sizing:border-box}
  body.kz-libui .page .pcard h3,
  body.kz-libui .page .gcard h3{font-size:17px!important}
  body.kz-libui .page .pcard .m,
  body.kz-libui .page .gcard .m{font-size:13px!important}

  body.kz-libui .page .dash .dcard b,
  body.kz-libui .page .dash2 .dcard b{font-size:34px!important;line-height:1.1}
  body.kz-libui .page .dash .dcard h4,
  body.kz-libui .page .dash2 .dcard h4{font-size:14.5px!important}
  body.kz-libui .page .dash .dcard span,
  body.kz-libui .page .dash2 .dcard span{font-size:13px!important}
  body.kz-libui .page .dash .dcard{padding:20px 22px!important}
  body.kz-libui .page .dash2 .dcard{padding:20px 22px!important}

  /* ============ 全局字号上调一档（标题 / 数字 / 按钮 / 列表） ============ */
  html[data-kz-theme] body.kz-libui .tabs .tab{font-size:14px!important}
  html[data-kz-theme] body.kz-libui .rows .row .c-t b{font-size:15.5px!important}
  html[data-kz-theme] body.kz-libui .rows .row .c-t em{font-size:12.5px!important}
  html[data-kz-theme] body.kz-libui .rows .row .c-stat b{font-size:14px!important}
  html[data-kz-theme] body.kz-libui .rows .row .c-stat em{font-size:10.5px!important}
  html[data-kz-theme] body.kz-libui .rows .row .go{font-size:13px!important;height:32px!important}
  html[data-kz-theme] body.kz-libui .page .pghd b{font-size:18px!important}
  html[data-kz-theme] body.kz-libui .page .pghd em{font-size:12.5px!important}
  html[data-kz-theme] body.kz-libui .page .pcard .pacts button{font-size:13px!important}
  html[data-kz-theme] body.kz-libui :is(.seg,.box,.sk){font-size:13px!important}
  html[data-kz-theme] body.kz-libui .ahd-btn.solid{height:38px!important;font-size:13.5px!important}
  html[data-kz-theme] body.kz-libui .goal-trigger{font-size:13px!important}
  html[data-kz-theme] body.kz-libui .kz-ps-in input{font-size:15px!important}

  @media (max-width:760px){
    body.kz-libui .page > .ahd{padding:2px 0 14px!important;gap:11px}
    html[data-kz-theme] body.kz-libui .page > .ahd .ahd-logo{width:66px!important;height:66px!important;border-radius:13px!important}
    html[data-kz-theme] body.kz-libui .page > .ahd .ahd-t b{font-size:19px!important}
    html[data-kz-theme] body.kz-libui .page > .ahd .ahd-t em{font-size:11.5px!important;letter-spacing:.1em!important}
    html[data-kz-theme] body.kz-libui .page > .ahd .ahd-sub{display:none!important}
    html[data-kz-theme] body.kz-libui .page > .tabs{padding:5px!important;gap:4px!important}
    html[data-kz-theme] body.kz-libui .page > .tabs .tab{height:38px!important;padding:0 12px!important;font-size:13.5px!important;gap:6px!important}
    html[data-kz-theme] body.kz-libui .page > .tabs .tab .ti{font-size:13.5px!important}
    /* 手机端科目行放不下就换行，搜索整行铺满 */
    html[data-kz-theme] body.kz-libui .page > .glass > .skills > .kz-ps{
      width:100%!important;margin:8px 0 0!important;order:9}
    html[data-kz-theme] body.kz-libui .page > .kz-ps{width:100%!important;margin:0 0 16px!important;
      position:static!important;top:auto!important;right:auto!important}
    body.kz-libui .page .dash .dcard b,
    body.kz-libui .page .dash2 .dcard b{font-size:28px!important}
  }
  /* ≤1180 收起副标题，把横向空间让给品牌名和右侧按钮
     （上面 .ahd-sub 是 flex!important，旧规则特异性不够压不住，这里用同等特异性覆盖） */
  @media (max-width:1180px){
    html[data-kz-theme] body.kz-libui .page > .ahd .ahd-sub{display:none!important}
    /* 副标题收了以后，让 .sp 重新撑开，右侧按钮才能靠右（否则一片空白挤在左边） */
    html[data-kz-theme] body.kz-libui .page > .ahd > .sp{
      flex:1 1 auto!important;width:auto!important;min-width:0!important}
  }


  :root{
    --kz-ease:cubic-bezier(.22,.61,.24,1);
    --kz-ease-out:cubic-bezier(.16,1,.3,1);
    --kz-shadow-1:0 1px 2px rgba(28,33,48,.04),0 10px 24px -18px rgba(28,33,48,.30);
    --kz-shadow-2:0 2px 5px rgba(28,33,48,.05),0 24px 48px -28px rgba(28,33,48,.38);
  }
  html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;
    text-rendering:optimizeLegibility}
  ::selection{background:rgba(79,70,229,.16);color:#1c2130}
  /* 滚动条：细、圆、低对比 */
  *{scrollbar-width:thin;scrollbar-color:#c6ccdb transparent}
  ::-webkit-scrollbar{width:10px;height:10px}
  ::-webkit-scrollbar-track{background:transparent}
  ::-webkit-scrollbar-thumb{background:#c6ccdb;border-radius:999px;
    border:3px solid transparent;background-clip:content-box}
  ::-webkit-scrollbar-thumb:hover{background:#aeb6cc;background-clip:content-box}
  /* 键盘焦点统一：只在键盘操作时出现 */
  a:focus-visible,button:focus-visible,input:focus-visible,textarea:focus-visible,select:focus-visible,
  [tabindex]:focus-visible{outline:2px solid rgba(79,70,229,.55);outline-offset:3px;border-radius:10px}
  @media (prefers-reduced-motion:reduce){*{scroll-behavior:auto!important}}


  /* 列表行：hover 更轻更贵 */
  .lib .row{transition:transform .22s var(--kz-ease),box-shadow .24s ease,background-color .2s ease}
  .lib .row:hover{box-shadow:0 10px 24px -20px rgba(28,33,48,.38)}
  /* 计时/统计数字等宽 */
  .hd-timer b,.hd-v,.stat b,.kz-qb-time{font-variant-numeric:tabular-nums}
  /* 输入框聚焦统一 */
  input:focus,textarea:focus{border-color:rgba(79,70,229,.45)!important;
    box-shadow:0 0 0 3px rgba(79,70,229,.10)!important;transition:border-color .2s ease,box-shadow .2s ease}


  /* 首页「听力 / 阅读」页签下的全部题库列表（客户 2026-11-05：导入即全部可见） */
  .kz-ll{margin:2px 0 4px}
  .kz-ll-hd{display:flex;align-items:baseline;gap:8px;margin:0 2px 10px}
  .kz-ll-hd b{font-size:15px;font-weight:800;color:var(--kz-t1)}
  .kz-ll-hd em{font-style:normal;font-size:12px;color:var(--kz-t3)}
  .kz-ll-hd .kz-ll-n{font-size:12px;color:var(--kz-t3);margin-left:auto}
  .kz-ll-list{display:flex;flex-direction:column;gap:0}
  /* 分页（客户 2026-11-06：一页 10 套，多的翻页） */
  .kz-ll-pager{display:flex;align-items:center;justify-content:center;gap:7px;padding:16px 0 6px}
  .kz-ll-pg{margin:0;min-width:34px;height:34px;padding:0 10px;border-radius:9px;border:1px solid var(--kz-line);
    background:var(--kz-surface-2);color:var(--kz-t2);font:inherit;font-size:13px;font-weight:700;
    cursor:pointer;transition:background .14s ease,border-color .14s ease,color .14s ease}
  .kz-ll-pg:hover:not(:disabled):not(.on){border-color:var(--kz-acc-line);color:var(--kz-acc-text)}
  .kz-ll-pg.on{background:var(--kz-acc);border-color:var(--kz-acc);color:#fff}
  .kz-ll-pg.arw{font-size:17px;line-height:1;padding:0 9px}
  .kz-ll-pg:disabled{opacity:.38;cursor:default}
  /* 客户 2026-11-05：每套一个独立圆角框反而看不清是一列列表 → 改成连续列表 + 分隔线，悬停才亮 */
  .kz-ll-i{
    display:flex;align-items:center;gap:12px;width:100%;text-align:left;
    padding:14px 12px;cursor:pointer;
    background:transparent;border:0;border-bottom:1px solid var(--kz-line);border-radius:0;
    color:var(--kz-t2);font:inherit;
    transition:background .16s ease,border-radius .16s ease;
  }
  .kz-ll-i:last-child{border-bottom:0}
  .kz-ll-i:hover{background:var(--kz-surface-2);border-radius:10px}
  /* 客户 2026-11-07：听力/阅读列表平铺看不出每套是哪个 Part → 按 Part 分组，组名单独一行 */
  .kz-ll-grp{display:flex;align-items:center;gap:9px;padding:16px 12px 7px}
  .kz-ll-grp:first-child{padding-top:2px}
  .kz-ll-grp b{font-size:12.5px;font-weight:800;color:var(--kz-t1);letter-spacing:.02em}
  .kz-ll-grp i{font-style:normal;font-size:11.5px;font-weight:600;color:var(--kz-t3)}
  .kz-ll-grp em{font-style:normal;font-size:11px;color:var(--kz-t3);
    border:1px solid var(--kz-line);border-radius:5px;padding:0 5px;line-height:16px}
  .kz-ll-grp::after{content:'';flex:1 1 auto;height:1px;background:var(--kz-line)}
  /* 客户 2026-11-07：听力/阅读列表顶部的 Part 单选条 —— 点哪个 Part 就只列哪个 Part */
  .kz-ll-parts{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:2px 2px 13px}
  .kz-ll-plab{font-size:12px;font-weight:700;color:var(--kz-t3,#64748b);margin-right:2px}
  .kz-ll-pt{display:inline-flex;align-items:center;gap:5px;height:32px;padding:0 13px;border-radius:999px;
    border:1px solid var(--kz-line,rgba(15,23,42,.14));background:var(--kz-surface-2,rgba(15,23,42,.04));
    color:var(--kz-t2,#475569);
    font:inherit;font-size:12.5px;font-weight:700;line-height:1;cursor:pointer;white-space:nowrap;
    transition:background .14s ease,border-color .14s ease,color .14s ease}
  .kz-ll-pt:hover{border-color:var(--kz-acc-line,rgba(99,102,241,.5));color:var(--kz-acc-text,#4338ca)}
  .kz-ll-pt i{font-style:normal;font-size:11px;font-weight:600;opacity:.72;font-variant-numeric:tabular-nums}
  .kz-ll-pt.on{background:linear-gradient(135deg,var(--kz-acc,#7aa2f7),var(--kz-acc2,#bb9af7))!important;
    border-color:transparent!important;color:#fff!important;box-shadow:none!important}
  .kz-ll-pt.on i{opacity:.85}
  .kz-ll-i:active{background:var(--kz-surface-3)}
  .kz-ll-dot{flex:0 0 auto;width:26px;height:26px;border-radius:50%;display:grid;place-items:center;
    background:var(--kz-acc-soft);color:var(--kz-acc-text);font-size:12px;font-weight:800}
  .kz-ll-b{flex:1 1 auto;min-width:0}
  .kz-ll-t{display:block;font-size:14.5px;font-weight:700;color:var(--kz-t1);
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  /* 英文名后面的中文名（客户 2026-11-06）：小一号、浅一点，仍然同一行 */
  .kz-ll-zh{font-style:normal;margin-left:8px;font-size:12.5px;font-weight:600;color:var(--kz-t3)}
  .kz-ll-m{display:block;margin-top:3px;font-size:12px;color:var(--kz-t3);
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  /* 客户 2026-11-06：高频=红色，必考题=黄色底（两个地方统一：行内标签 + 右上筛选按钮） */
  .kz-ll-tg{display:inline-block;margin-right:6px;padding:0 6px;border-radius:5px;font-size:11px;
    line-height:17px;border:1px solid #f0c95f;color:#6b3f0a;background:#fde68a}
  .kz-ll-tg.hot{border-color:#f6c2c8;color:#b42318;background:#fee2e2}
  .kz-ll-go{flex:0 0 auto;font-size:12.5px;font-weight:700;color:var(--kz-acc-text)}
  .kz-prep-tip{flex:none;margin-left:10px;font-size:11.5px;font-weight:700;color:var(--kz-acc-text);
    background:var(--kz-acc-soft);border:1px solid var(--kz-acc-line);border-radius:6px;padding:2px 8px}
  .kz-ll-empty{padding:22px 16px;text-align:center;color:var(--kz-t2);font-size:13px;
    border:1px dashed var(--kz-line);border-radius:12px}
  .kz-ll-empty .kz-qf-clear{display:inline-flex;align-items:center;height:28px;margin-left:10px;
    padding:0 11px;border-radius:7px;border:1px solid var(--kz-acc-line);
    background:var(--kz-acc-soft);color:var(--kz-acc-text);font-size:12.5px;font-weight:600;
    text-decoration:none;vertical-align:middle;cursor:pointer}
  .kz-ll-empty .kz-qf-clear:hover{filter:brightness(1.06)}

  /* —— 快捷筛选：搜索框左侧的「高频 / 必考题」（客户 2026-11-05） —— */
  .kz-qf{display:flex;align-items:center;gap:8px;flex:0 0 auto;flex-wrap:nowrap}
  .kz-qf-b{
    display:inline-flex;align-items:center;gap:6px;height:36px;padding:0 12px;
    border-radius:9px;border:1px solid transparent;background:transparent;
    color:var(--kz-t2);font:inherit;font-size:13px;font-weight:600;line-height:1;cursor:pointer;
    white-space:nowrap;transition:background .16s ease,color .16s ease;
  }
  .kz-qf-b:hover{background:transparent}
  .kz-qf-b em{font-style:normal;font-size:11.5px;font-weight:700;color:var(--kz-t3);
    font-variant-numeric:tabular-nums}
  /* 客户 2026-11-07 二次调整：常态**完全透明底、无边框无外框**，只留彩色文字；
     点击后仅把底色填成该按钮的专属色（不描边、不加框）。听力和阅读共用这一套。 */
  .kz-qf-b[data-kz-qf="hot"]{
    background:transparent;border-color:var(--qf-edge,rgba(225,29,74,.38));outline:none;box-shadow:none;
    color:var(--qf-ink,#e8a0b2);
    --qf-fill:rgba(225,29,74,.62);--qf-on-ink:#fff2f5}
  .kz-qf-b[data-kz-qf="hot"] em{color:inherit;opacity:.8}
  .kz-qf-b[data-kz-qf="must"]{
    background:transparent;border-color:var(--qf-edge,rgba(240,180,41,.42));outline:none;box-shadow:none;
    color:var(--qf-ink,#d9bd77);
    --qf-fill:rgba(240,180,41,.62);--qf-on-ink:#3d2c00}
  .kz-qf-b[data-kz-qf="must"] em{color:inherit;opacity:.8}
  /* 浅粉主题（客户常用）：白底上选中色降一档，边框压淡、文字压深保证对比 */
  html[data-kz-theme="sakura"] .kz-qf-b[data-kz-qf="hot"]{
    --qf-ink:#b06a80;--qf-edge:rgba(225,29,74,.3);
    --qf-fill:rgba(225,29,74,.18);--qf-on-ink:#8f1234}
  html[data-kz-theme="sakura"] .kz-qf-b[data-kz-qf="must"]{
    --qf-ink:#9a7c33;--qf-edge:rgba(240,180,41,.36);
    --qf-fill:rgba(240,180,41,.26);--qf-on-ink:#634600}
  /* 选中：只换底色与文字色；常驻的 1px 细框保持原样，不再额外加外框/内框 */
  .kz-qf-b.on,.kz-qf-b.on:hover{
    background:var(--qf-fill);color:var(--qf-on-ink);
    outline:none;box-shadow:none}
  .kz-qf-b.on em{opacity:1}
  .kz-qf-clear{border:0;background:transparent;color:var(--kz-acc-text);font:inherit;font-size:12.5px;
    cursor:pointer;padding:0;text-decoration:underline}
  @media (max-width:900px){
    .kz-qf{gap:6px}
    .kz-qf-b{height:32px;padding:0 9px;font-size:12px}
    .kz-qf-b em{font-size:11px}
  }
  @media (max-width:640px){
    /* 窄屏搜索框会独占一行，两个按钮跟在它下面，不挤标题 */
    .kz-qf-b{height:30px}
  }
  @media (max-width:640px){
    .kz-ll-i{padding:11px 12px;gap:10px}
    .kz-ll-pager{gap:6px;padding:14px 0 4px}
    .kz-ll-pg{min-width:32px;height:32px;padding:0 8px;font-size:12.5px}
    .kz-ll-go{display:none}
    .kz-ll-t{font-size:13.5px}
  }
/* ===== kzGoCss ===== */
/* 错题本：每道题右上角的「去原篇」入口（2026-11-08） */
a.kz-go{margin-left:10px;font-size:12px;font-weight:600;color:#7c5cff;text-decoration:none;
  white-space:nowrap;padding:2px 9px;border:1px solid rgba(124,92,255,.45);border-radius:999px;
  cursor:pointer;vertical-align:middle}
a.kz-go:hover{background:rgba(124,92,255,.12)}
/* 跳到原卷后，目标题目闪一下 */
.kz-qflash{outline:2px solid #7c5cff!important;outline-offset:6px;border-radius:8px;
  background:rgba(124,92,255,.10)!important;transition:background .25s ease}
/* 客户 2026-11-08：错题卡片的「第 N 盒」标签不显示。
   它是 Leitner 排期（答对进一格 1→2→4→7→15 天，答错回今天）的进度标记，纯展示、点不动；
   排期本身照旧生效，只是不再露盒子号。选择器限死在 article.card > header.hd 里，避免误伤别处同名 .box。 */
article.card > header.hd > span.box{display:none!important}
/* ===== kzFx5 ===== */
  /* tab 指示条 */
  .tabs{position:relative}
  #kzInk{position:absolute;left:0;bottom:2px;height:2px;width:0;border-radius:2px;
    background:linear-gradient(90deg,#4f46e5,#8b5cf6);opacity:0;pointer-events:none;
    transition:transform .38s cubic-bezier(.22,.61,.24,1),width .38s cubic-bezier(.22,.61,.24,1),opacity .2s ease}
  /* 列表逐行浮现 */
  @keyframes kzRowIn{from{opacity:0;transform:translateY(9px)}to{opacity:1;transform:none}}
  .lib .row{animation:kzRowIn .42s cubic-bezier(.22,.61,.24,1) backwards}
  /* 标签微交互 */
  .kz-tg{transition:transform .2s cubic-bezier(.22,.61,.24,1),box-shadow .2s ease}
  .kz-tg:hover{transform:translateY(-1px) scale(1.04)}
  /* 搜索下拉逐条 */
  @keyframes kzItemIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
  .kz-ps-item{animation:kzItemIn .3s cubic-bezier(.22,.61,.24,1) backwards}
  .kz-ps-item:nth-child(1){animation-delay:.01s}
  .kz-ps-item:nth-child(2){animation-delay:.04s}
  .kz-ps-item:nth-child(3){animation-delay:.07s}
  .kz-ps-item:nth-child(4){animation-delay:.10s}
  .kz-ps-item:nth-child(5){animation-delay:.13s}
  .kz-ps-item:nth-child(6){animation-delay:.16s}
  .kz-ps-item:nth-child(n+7){animation-delay:.19s}
  /* 回到顶部 */
  #kzTop{position:fixed;right:22px;bottom:26px;z-index:70;width:40px;height:40px;border-radius:50%;
    border:1px solid rgba(28,33,48,.10);background:rgba(255,255,255,.92);color:#3f4759;
    display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:15px;
    box-shadow:0 12px 28px -16px rgba(28,33,48,.45);opacity:0;transform:translateY(10px) scale(.94);
    pointer-events:none;transition:opacity .26s ease,transform .26s cubic-bezier(.22,.61,.24,1),background .2s ease}
  #kzTop.on{opacity:1;transform:none;pointer-events:auto}
  #kzTop:hover{background:#fff;transform:translateY(-2px)}
/* ===== kzFx6 ===== */
  /* ---------- 光标聚光卡片（galaxy / Uiverse 卡片改造，MIT） ---------- */
  .kz-spot{position:relative;overflow:hidden;isolation:isolate}
  .kz-spot::before{content:"";position:absolute;inset:0;z-index:0;pointer-events:none;opacity:0;
    border-radius:inherit;transition:opacity .35s ease;
    background:radial-gradient(240px circle at var(--mx,50%) var(--my,50%),rgba(79,70,229,.16),rgba(139,92,246,.08) 42%,transparent 72%)}
  .kz-spot:hover::before{opacity:1}

  /* ---------- tooltip（galaxy tooltip 改造） ---------- */
  [data-tip]{position:relative}
  [data-tip]::after{content:attr(data-tip);position:absolute;left:50%;bottom:calc(100% + 9px);
    transform:translate(-50%,4px) scale(.96);transform-origin:50% 100%;
    background:rgba(24,28,42,.94);color:#fff;font-size:11.5px;line-height:1;letter-spacing:.02em;
    padding:7px 10px;border-radius:8px;white-space:nowrap;opacity:0;pointer-events:none;z-index:90;
    box-shadow:0 10px 24px -12px rgba(16,20,32,.6);
    transition:opacity .18s ease,transform .22s cubic-bezier(.22,.61,.24,1)}
  [data-tip]:hover::after,[data-tip]:focus-visible::after{opacity:1;transform:translate(-50%,0) scale(1)}
  @media (hover:none){[data-tip]::after{display:none}}
/* ===== kzCraft ===== */
  :root{
    --kz-ease:cubic-bezier(.22,.61,.24,1);
    --kz-ease-out:cubic-bezier(.16,1,.3,1);
    --kz-shadow-1:0 1px 2px rgba(28,33,48,.04),0 10px 24px -18px rgba(28,33,48,.30);
    --kz-shadow-2:0 2px 5px rgba(28,33,48,.05),0 24px 48px -28px rgba(28,33,48,.38);
  }
  html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;
    text-rendering:optimizeLegibility}
  ::selection{background:rgba(79,70,229,.16);color:#1c2130}
  /* 滚动条：细、圆、低对比 */
  *{scrollbar-width:thin;scrollbar-color:#c6ccdb transparent}
  ::-webkit-scrollbar{width:10px;height:10px}
  ::-webkit-scrollbar-track{background:transparent}
  ::-webkit-scrollbar-thumb{background:#c6ccdb;border-radius:999px;
    border:3px solid transparent;background-clip:content-box}
  ::-webkit-scrollbar-thumb:hover{background:#aeb6cc;background-clip:content-box}
  /* 键盘焦点统一：只在键盘操作时出现 */
  a:focus-visible,button:focus-visible,input:focus-visible,textarea:focus-visible,select:focus-visible,
  [tabindex]:focus-visible{outline:2px solid rgba(79,70,229,.55);outline-offset:3px;border-radius:10px}
  @media (prefers-reduced-motion:reduce){*{scroll-behavior:auto!important}}
/* ===== kzCraft2 ===== */
  /* 列表行：hover 更轻更贵 */
  .lib .row{transition:transform .22s var(--kz-ease),box-shadow .24s ease,background-color .2s ease}
  .lib .row:hover{box-shadow:0 10px 24px -20px rgba(28,33,48,.38)}
  /* 计时/统计数字等宽 */
  .hd-timer b,.hd-v,.stat b,.kz-qb-time{font-variant-numeric:tabular-nums}
  /* 输入框聚焦统一 */
  input:focus,textarea:focus{border-color:rgba(79,70,229,.45)!important;
    box-shadow:0 0 0 3px rgba(79,70,229,.10)!important;transition:border-color .2s ease,box-shadow .2s ease}
/* ===== kzLibUi ===== */
  /* ================= 题库页重做（只在非答题页生效） ================= */
  body.kz-libui .bare{background:
    radial-gradient(1000px 620px at 10% -8%, rgba(99,91,255,.12), transparent 62%),
    radial-gradient(880px 560px at 94% 2%, rgba(56,189,248,.11), transparent 64%),
    radial-gradient(820px 620px at 50% 112%, rgba(236,72,153,.07), transparent 70%),
    linear-gradient(180deg,#f6f8fc,#f2f5fb 60%,#f6f8fc)}
  /* 旧光斑压淡，只当环境色 */
  body.kz-libui .gbg{opacity:.45}

  /* ---------- 顶部：一块悬浮玻璃 ---------- */
  body.kz-libui .ahd{display:flex;align-items:center;gap:12px;
    margin:0 0 14px;padding:14px 16px;border-radius:18px;
    background:linear-gradient(180deg,rgba(255,255,255,.88),rgba(255,255,255,.72));
    border:1px solid rgba(255,255,255,.92);
    box-shadow:inset 0 1px 0 #fff,0 20px 44px -34px rgba(28,33,48,.5);
    -webkit-backdrop-filter:blur(18px) saturate(150%);backdrop-filter:blur(18px) saturate(150%)}
  body.kz-libui .ahd-logo{width:40px;height:40px;border-radius:12px;object-fit:cover;
    box-shadow:0 8px 18px -12px rgba(28,33,48,.55),0 0 0 1px rgba(28,33,48,.06)}
  body.kz-libui .ahd-t b{font-size:17px;font-weight:700;letter-spacing:-.01em}
  body.kz-libui .ahd-t em{font-size:9.5px;letter-spacing:.18em;color:#9aa2b3;font-style:normal;text-transform:uppercase}
  body.kz-libui .ahd-sub{font-size:12px;color:#8b93a4;letter-spacing:.01em}
  body.kz-libui .goal-wrap{height:34px;display:flex;align-items:center;padding:0 13px;border-radius:999px;
    background:#fff;border:1px solid #e6eaf3;box-shadow:0 4px 12px -10px rgba(28,33,48,.4)}
  body.kz-libui .goal-trigger{font-size:12.5px;color:#6b7280}
  body.kz-libui .goal-trigger b{color:#4f46e5;font-weight:700}
  body.kz-libui .ahd-btn.solid{height:36px;padding:0 16px;border-radius:10px;font-size:13px;font-weight:600;
    color:#fff;border:0;background:linear-gradient(135deg,#4f46e5,#6f66ff);
    box-shadow:0 12px 24px -14px rgba(79,70,229,.7);
    transition:transform .18s cubic-bezier(.22,.61,.24,1),box-shadow .2s ease,filter .2s ease}
  body.kz-libui .ahd-btn.solid::before{content:"＋";margin-right:5px;font-weight:700}
  body.kz-libui .ahd-btn.solid:hover{transform:translateY(-1px);filter:brightness(1.04);
    box-shadow:0 16px 30px -14px rgba(79,70,229,.8)}
  body.kz-libui .ahd-ava{width:36px;height:36px;border-radius:50%;border:0;color:#fff;font-weight:700;
    background:linear-gradient(135deg,#4f46e5,#8b5cf6);
    box-shadow:0 0 0 3px rgba(79,70,229,.12),0 8px 18px -12px rgba(79,70,229,.6)}
  @media (max-width:1180px){body.kz-libui .ahd-sub{display:none!important}}

  /* ---------- 科目栏：分段控制 ---------- */
  body.kz-libui .tabs{display:flex;align-items:center;gap:4px;padding:5px;border-radius:14px;
    background:rgba(255,255,255,.72);border:1px solid rgba(255,255,255,.95);
    box-shadow:inset 0 1px 0 #fff,0 12px 28px -26px rgba(28,33,48,.5);
    overflow-x:auto;scrollbar-width:none;margin:0 0 12px}
  body.kz-libui .tabs::-webkit-scrollbar{display:none}
  body.kz-libui .tabs .tab{height:36px;padding:0 14px;border-radius:9px;border:0;background:transparent;
    color:#6b7280;font-size:13px;display:inline-flex;align-items:center;gap:6px;white-space:nowrap;
    transition:background .2s ease,color .18s ease,box-shadow .22s ease,transform .18s cubic-bezier(.22,.61,.24,1)}
  body.kz-libui .tabs .tab .ti{opacity:.75;font-size:13px;display:inline-flex;align-items:center}
  body.kz-libui .tabs .tab:hover{background:rgba(255,255,255,.7);color:#1c2130}
  body.kz-libui .tabs .tab.on{background:#fff;color:#1c2130;font-weight:600;
    box-shadow:0 8px 20px -16px rgba(28,33,48,.55),0 0 0 1px rgba(28,33,48,.04)}
  body.kz-libui .tabs .tab.on .ti{opacity:1;color:#4f46e5}
  body.kz-libui .tabs .tab em{background:#ef4444;color:#fff;font-style:normal;font-size:10px;
    line-height:16px;padding:0 5px;border-radius:999px;margin-left:2px}
  body.kz-libui #kzInk{display:none!important}

  /* ---------- 搜索：大一号，带快捷键提示 ---------- */
  body.kz-libui .kz-ps{margin:0 0 6px}
  body.kz-libui .kz-ps-in{height:52px;padding:0 16px;border-radius:14px;background:#fff;
    border:1px solid #e7eaf3;box-shadow:0 10px 24px -22px rgba(28,33,48,.45);
    transition:border-color .2s ease,box-shadow .22s ease}
  body.kz-libui .kz-ps-in:focus-within{border-color:rgba(79,70,229,.45);
    box-shadow:0 0 0 4px rgba(79,70,229,.10),0 10px 24px -22px rgba(28,33,48,.4)}
  body.kz-libui .kz-ps-in svg{width:17px;height:17px;opacity:.65}
  body.kz-libui .kz-ps-in input{font-size:14px;color:#1c2130}
  body.kz-libui .kz-ps-in input::placeholder{color:#9aa2b3}

  /* ---------- 题库卡：玻璃面板 + 卡片化列表 ---------- */
  body.kz-libui .glass.lib{border-radius:20px;padding:0!important;overflow:hidden;
    background:rgba(255,255,255,.78);border:1px solid rgba(255,255,255,.95);
    box-shadow:inset 0 1px 0 #fff,0 28px 64px -44px rgba(28,33,48,.5);
    -webkit-backdrop-filter:blur(18px) saturate(150%);backdrop-filter:blur(18px) saturate(150%)}
  body.kz-libui .lib .g-hd{padding:18px 22px 14px!important;gap:10px;align-items:center}
  body.kz-libui .lib .g-hd b{font-size:15px;font-weight:700;letter-spacing:-.01em;color:#1c2130;
    display:inline-flex;align-items:center;gap:9px}
  body.kz-libui .lib .g-hd b.kz-lib-t::before{content:"";width:3px;height:15px;border-radius:2px;
    background:linear-gradient(180deg,#4f46e5,#8b5cf6);flex:none}
  @media (min-width:1280px){body.kz-libui .page{max-width:1120px}}
  body.kz-libui .lib .g-c{font-size:12px;color:#8b93a4;letter-spacing:.02em}
  body.kz-libui .lib .chip{height:30px;padding:0 12px;border-radius:999px;border:1px solid #e7eaf3;
    background:#fff;color:#5b6376;font-size:12px;font-weight:500;
    transition:background .18s ease,color .18s ease,border-color .18s ease,transform .16s ease}
  body.kz-libui .lib .chip:hover{transform:translateY(-1px);border-color:#d8deeb;color:#1c2130}
  body.kz-libui .lib .chip.on{background:rgba(79,70,229,.10);border-color:rgba(79,70,229,.26);
    color:#4f46e5;font-weight:600}

  body.kz-libui .libbar{padding:10px 22px!important;gap:10px;align-items:center;
    background:rgba(247,249,253,.92);border-top:1px solid #eef1f7;border-bottom:1px solid #eef1f7}
  body.kz-libui .libbar .srch-wrap{height:34px;border-radius:9px;background:#fff;border:1px solid #e7eaf3}
  body.kz-libui .libbar .srch-wrap input{font-size:12.5px}

  body.kz-libui .parts{padding:10px 22px!important;gap:6px;align-items:center}
  body.kz-libui .parts .part{height:32px;padding:0 12px;border-radius:8px;font-size:12.5px;color:#5b6376;
    background:transparent;border:0;transition:background .18s ease,color .18s ease}
  body.kz-libui .parts .part em{margin-left:6px;font-style:normal;font-size:11px;color:#9aa2b3}
  body.kz-libui .parts .part.on{background:rgba(79,70,229,.10);color:#4f46e5;font-weight:600}
  body.kz-libui .parts .part.on em{color:#6f66ff}
  body.kz-libui .parts .stf{background:#f1f4fa;border-radius:9px;padding:3px}
  body.kz-libui .parts .stf button{height:26px;padding:0 10px;border-radius:6px;border:0;background:transparent;
    font-size:12px;color:#6b7280}
  body.kz-libui .parts .stf button.on{background:#fff;color:#1c2130;font-weight:600;
    box-shadow:0 2px 6px -4px rgba(28,33,48,.45)}

  body.kz-libui .rows{padding:8px 12px 12px;gap:2px}
  body.kz-libui .rows .row{border-radius:12px;border:1px solid transparent;padding:12px 10px!important;
    transition:background .18s ease,border-color .18s ease,box-shadow .22s ease,transform .2s cubic-bezier(.22,.61,.24,1)}
  body.kz-libui .rows .row:hover{background:#fff;border-color:#eaeef7;transform:translateX(2px);
    box-shadow:0 12px 26px -22px rgba(28,33,48,.45)}
  body.kz-libui .c-t b{font-size:14.5px;font-weight:600;letter-spacing:-.005em}
  body.kz-libui .c-t em{font-size:12px;color:#8b93a4}
  body.kz-libui .c-stat em{font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:#a3aab9}
  body.kz-libui .c-stat b{font-size:13px;font-variant-numeric:tabular-nums}
  body.kz-libui .c-stat .bar{height:3px;border-radius:2px}
  body.kz-libui .rows .go{height:30px;border-radius:8px;border:0;background:rgba(79,70,229,.09);
    color:#4f46e5;font-size:12px;font-weight:600;transition:background .18s ease,color .18s ease,transform .16s ease}
  body.kz-libui .rows .go:hover{background:#4f46e5;color:#fff;transform:translateY(-1px)}
  body.kz-libui .kz-tg{height:18px;line-height:18px;padding:0 6px;border-radius:5px;font-size:10.5px;border:1px solid transparent}
  body.kz-libui .kz-tg.attr{background:#fde68a;color:#6b3f0a;border-color:#f0c95f}
  body.kz-libui .kz-tg.hot{background:#fee2e2;color:#b42318;border-color:#f6c2c8}

  /* ---------- 窄屏 ---------- */
  @media (max-width:760px){
    body.kz-libui .ahd{gap:9px;padding:11px 12px;border-radius:16px}
    body.kz-libui .ahd-logo{width:34px;height:34px;border-radius:10px}
    body.kz-libui .ahd-t b{font-size:15px}
    body.kz-libui .ahd-t em{display:block;font-size:11.5px;letter-spacing:.1em}
    body.kz-libui .goal-wrap{height:30px;padding:0 10px}
    body.kz-libui .ahd-btn.solid{height:32px;padding:0 12px;font-size:12px}
    body.kz-libui .ahd-ava{width:32px;height:32px}
    body.kz-libui .tabs{padding:4px;border-radius:12px}
    body.kz-libui .tabs .tab{height:33px;padding:0 11px;font-size:12.5px}
    body.kz-libui .kz-ps-in{height:46px;border-radius:12px}
    body.kz-libui .glass.lib{border-radius:16px}
    body.kz-libui .lib .g-hd,body.kz-libui .libbar,body.kz-libui .parts{padding-left:14px!important;padding-right:14px!important}
    body.kz-libui .rows{padding:6px 8px 10px}
  }
/* ===== kzLibUi2 ===== */
  /* ============ 题库页：光环境 + 渐变描边 + 深度 ============ */
  body.kz-libui .bare{position:relative;background:
    radial-gradient(1200px 720px at 8% -14%, #e2e7ff 0%, rgba(226,231,255,0) 58%),
    radial-gradient(920px 620px at 98% 2%, #d9f1ff 0%, rgba(217,241,255,0) 62%),
    radial-gradient(900px 720px at 62% 112%, #ffe6f4 0%, rgba(255,230,244,0) 64%),
    linear-gradient(180deg,#f5f7fc,#eef2fa 64%,#f4f6fc)}
  /* 极淡网格，只在顶部可见 */
  body.kz-libui .bare::before{content:"";position:fixed;inset:0;z-index:0;pointer-events:none;
    background-image:linear-gradient(rgba(28,33,48,.05) 1px,transparent 1px),
      linear-gradient(90deg,rgba(28,33,48,.05) 1px,transparent 1px);
    background-size:52px 52px;
    -webkit-mask-image:radial-gradient(80% 46% at 50% 0%,#000 18%,transparent 72%);
    mask-image:radial-gradient(80% 46% at 50% 0%,#000 18%,transparent 72%);
    opacity:.45}
  body.kz-libui .atlas{position:relative;z-index:1}

  /* ---------- 页头：渐变描边 + 顶部反光 ---------- */
  body.kz-libui .ahd{position:relative;overflow:hidden}
  body.kz-libui .ahd::before{content:"";position:absolute;inset:0;border-radius:inherit;padding:1px;
    background:linear-gradient(118deg,rgba(79,70,229,.55),rgba(56,189,248,.4) 38%,rgba(236,72,153,.28) 68%,rgba(79,70,229,.5));
    -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
    -webkit-mask-composite:xor;mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
    mask-composite:exclude;pointer-events:none;opacity:.95}
  body.kz-libui .ahd::after{content:"";position:absolute;left:-10%;right:-10%;top:-70%;height:120%;
    background:linear-gradient(112deg,rgba(255,255,255,.9) 0%,rgba(255,255,255,.25) 26%,transparent 46%);
    transform:rotate(-2deg);pointer-events:none;opacity:.5}
  body.kz-libui .ahd > *{position:relative;z-index:1}
  body.kz-libui .ahd{box-shadow:inset 0 1px 0 #fff,0 24px 50px -36px rgba(79,70,229,.5),
    0 20px 44px -34px rgba(28,33,48,.45)}
  body.kz-libui .ahd-t b{background:linear-gradient(180deg,#1c2130,#4b5468);
    -webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
  body.kz-libui .ahd-logo{box-shadow:0 10px 22px -14px rgba(79,70,229,.65),0 0 0 1px rgba(28,33,48,.06),
    inset 0 1px 0 rgba(255,255,255,.6)}

  /* ---------- 科目栏：选中带渐变与光晕 ---------- */
  body.kz-libui .tabs .tab{position:relative}
  body.kz-libui .tabs .tab.on{background:linear-gradient(180deg,#fff,#f7f9ff);
    box-shadow:0 10px 24px -18px rgba(79,70,229,.6),0 0 0 1px rgba(79,70,229,.18)}
  body.kz-libui .tabs .tab.on::after{content:"";position:absolute;left:50%;bottom:-1px;width:20px;height:2px;
    border-radius:2px;background:linear-gradient(90deg,#4f46e5,#8b5cf6);transform:translateX(-50%);
    box-shadow:0 0 10px rgba(79,70,229,.55)}

  /* ---------- 搜索：聚焦渐变边 ---------- */
  body.kz-libui .kz-ps-in{position:relative;background:linear-gradient(180deg,#fff,#fbfcff)}
  body.kz-libui .kz-ps-in:focus-within{border-color:rgba(79,70,229,.35);
    box-shadow:0 0 0 4px rgba(79,70,229,.10),0 16px 34px -26px rgba(79,70,229,.55)}

  /* ---------- 题库卡：顶部渐变细线 + 角光 ---------- */
  body.kz-libui .glass.lib{position:relative;overflow:hidden}
  body.kz-libui .glass.lib::before{content:"";position:absolute;left:0;right:0;top:0;height:2px;z-index:2;
    background:linear-gradient(90deg,transparent 2%,rgba(79,70,229,.65) 22%,rgba(56,189,248,.55) 58%,rgba(236,72,153,.4) 82%,transparent 98%)}
  body.kz-libui .glass.lib::after{content:"";position:absolute;right:-120px;top:-140px;width:340px;height:340px;
    pointer-events:none;border-radius:50%;
    background:radial-gradient(closest-side,rgba(99,91,255,.16),transparent 72%)}

  /* ---------- 列表行：左侧渐变条 + hover 抬升 ---------- */
  body.kz-libui .rows .row{position:relative}
  body.kz-libui .rows .row::before{content:"";position:absolute;left:0;top:16%;bottom:16%;width:2px;
    border-radius:2px;background:linear-gradient(180deg,#4f46e5,#8b5cf6);opacity:0;
    transition:opacity .2s ease}
  body.kz-libui .rows .row:hover::before{opacity:1}
  body.kz-libui .rows .row:hover{box-shadow:0 16px 34px -26px rgba(28,33,48,.5),0 0 0 1px rgba(79,70,229,.06)}

  /* ---------- 练习按钮：hover 渐变填充 + 箭头 ---------- */
  body.kz-libui .rows .go{display:inline-flex;align-items:center;justify-content:center;gap:4px}
  body.kz-libui .rows .go::after{content:"→";opacity:0;transform:translateX(-3px);
    transition:opacity .2s ease,transform .2s ease}
  body.kz-libui .rows .go:hover{background:linear-gradient(135deg,#4f46e5,#6f66ff);
    box-shadow:0 10px 20px -12px rgba(79,70,229,.65)}
  body.kz-libui .rows .go:hover::after{opacity:1;transform:none}

  /* ---------- chip / part 的细节 ---------- */
  body.kz-libui .lib .chip.on{box-shadow:inset 0 0 0 1px rgba(79,70,229,.06),0 6px 14px -12px rgba(79,70,229,.5)}
  body.kz-libui .parts .part.on{box-shadow:inset 0 0 0 1px rgba(79,70,229,.08)}

  @media (prefers-reduced-motion:reduce){
    body.kz-libui .ahd::after{display:none}
  }
/* ===== kzLibUi3 ===== */
  /* ================= 题库页：深色霓虹（答题页不受影响） ================= */
  body.kz-libui .bare{
    background:
      radial-gradient(980px 640px at 12% -8%, rgba(79,70,229,.42), transparent 60%),
      radial-gradient(820px 560px at 92% 0%, rgba(34,211,238,.24), transparent 62%),
      radial-gradient(900px 700px at 52% 112%, rgba(139,92,246,.32), transparent 66%),
      #06080f}
  body.kz-libui .gbg{opacity:0}
  /* 网格 + 星点 */
  body.kz-libui .bare::before{
    background-image:
      linear-gradient(rgba(255,255,255,.05) 1px,transparent 1px),
      linear-gradient(90deg,rgba(255,255,255,.05) 1px,transparent 1px),
      radial-gradient(rgba(255,255,255,.5) 1px,transparent 1.6px);
    background-size:64px 64px,64px 64px,140px 140px;
    -webkit-mask-image:radial-gradient(92% 66% at 50% 0%,#000 26%,transparent 84%);
    mask-image:radial-gradient(92% 66% at 50% 0%,#000 26%,transparent 84%);
    opacity:.55}
  /* 缓慢流动的极光 */
  body.kz-libui .bare::after{content:"";position:fixed;inset:-25%;z-index:0;pointer-events:none;
    background:
      radial-gradient(520px 420px at 28% 32%, rgba(99,91,255,.34), transparent 70%),
      radial-gradient(460px 380px at 72% 58%, rgba(34,211,238,.20), transparent 72%),
      radial-gradient(420px 360px at 52% 84%, rgba(217,70,239,.18), transparent 72%);
    filter:blur(30px);animation:kzAurora 22s ease-in-out infinite alternate}
  @keyframes kzAurora{from{transform:translate3d(-2%,-1%,0) scale(1)}to{transform:translate3d(2.5%,2%,0) scale(1.07)}}
  body.kz-libui .atlas{color:#dbe2f2}

  /* ---------- 页头 ---------- */
  body.kz-libui .ahd{
    background:linear-gradient(180deg,rgba(20,24,42,.82),rgba(12,16,28,.7));
    border:1px solid rgba(255,255,255,.09);
    box-shadow:inset 0 1px 0 rgba(255,255,255,.09),
      0 30px 60px -40px rgba(0,0,0,.9),
      0 0 46px -22px rgba(99,91,255,.55)}
  body.kz-libui .ahd-t b{background:linear-gradient(180deg,#fff,#c7cde2);
    -webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
  body.kz-libui .ahd-t em{color:#7f89a3}
  body.kz-libui .ahd-sub{color:#8b93a4}
  body.kz-libui .goal-wrap{background:rgba(255,255,255,.06);border-color:rgba(255,255,255,.12);
    box-shadow:0 0 0 1px rgba(0,0,0,.2),inset 0 1px 0 rgba(255,255,255,.08)}
  body.kz-libui .goal-trigger{background:rgba(255,255,255,.06)!important;
    border:1px solid rgba(255,255,255,.12)!important;color:#aab3c8}
  body.kz-libui .goal-trigger:hover{background:rgba(255,255,255,.1)!important}
  body.kz-libui .goal-trigger b{color:#a5a0ff}
  body.kz-libui .ahd-btn.solid{background:linear-gradient(135deg,#5b5bff,#a855f7);
    box-shadow:0 14px 30px -12px rgba(99,91,255,.85),inset 0 1px 0 rgba(255,255,255,.28)}
  body.kz-libui .ahd-ava{background:linear-gradient(135deg,#6366f1,#a855f7);
    box-shadow:0 0 0 3px rgba(139,92,246,.18),0 0 26px -6px rgba(139,92,246,.8)}
  body.kz-libui .ahd-logo{box-shadow:0 0 0 1px rgba(255,255,255,.16),0 0 26px -6px rgba(99,91,255,.8)}

  /* ---------- 科目栏 ---------- */
  body.kz-libui .tabs{background:rgba(255,255,255,.045);border-color:rgba(255,255,255,.08);
    box-shadow:inset 0 1px 0 rgba(255,255,255,.06),0 20px 40px -34px #000}
  body.kz-libui .tabs .tab{color:#98a2ba}
  body.kz-libui .tabs .tab .ti{color:#7c879f;opacity:1}
  body.kz-libui .tabs .tab:hover{background:rgba(255,255,255,.06);color:#fff}
  body.kz-libui .tabs .tab.on{background:linear-gradient(135deg,rgba(99,91,255,.95),rgba(168,85,247,.9));
    color:#fff;box-shadow:0 12px 30px -14px rgba(99,91,255,.95),inset 0 1px 0 rgba(255,255,255,.3)}
  body.kz-libui .tabs .tab.on .ti{color:#fff}
  body.kz-libui .tabs .tab.on::after{background:linear-gradient(90deg,#22d3ee,#a855f7);
    box-shadow:0 0 14px rgba(139,92,246,.9)}
  body.kz-libui .tabs .tab em{background:linear-gradient(135deg,#f43f5e,#fb7185);color:#fff}

  /* ---------- 搜索 ---------- */
  body.kz-libui .kz-ps-in{background:rgba(255,255,255,.045);border-color:rgba(255,255,255,.09);
    box-shadow:inset 0 1px 0 rgba(255,255,255,.05),0 24px 44px -38px #000}
  body.kz-libui .kz-ps-in svg{stroke:#8b93a4}
  body.kz-libui .kz-ps-in input{color:#eef1f8}
  body.kz-libui .kz-ps-in input::placeholder{color:#6d778e}
  body.kz-libui .kz-ps-in:focus-within{border-color:rgba(139,92,246,.55);
    box-shadow:0 0 0 4px rgba(99,91,255,.16),0 0 34px -10px rgba(99,91,255,.75)}
  body.kz-libui .kz-ps-drop{background:rgba(14,18,32,.96);border-color:rgba(255,255,255,.1);
    box-shadow:0 30px 60px -30px #000,0 0 0 1px rgba(255,255,255,.04)}
  body.kz-libui .kz-ps-item{border-radius:10px}
  body.kz-libui .kz-ps-item:hover{background:rgba(255,255,255,.06)}
  body.kz-libui .kz-ps-item b{color:#eef1f8}
  body.kz-libui .kz-ps-item .m{color:#8b93a4}
  body.kz-libui .kz-ps-empty{color:#8b93a4}
  body.kz-libui .kz-ps-item mark{background:rgba(251,191,36,.22);color:#fcd34d}

  /* ---------- 题库卡 ---------- */
  body.kz-libui .glass.lib{background:linear-gradient(180deg,rgba(20,24,42,.74),rgba(10,14,24,.7));
    border-color:rgba(255,255,255,.09);
    box-shadow:inset 0 1px 0 rgba(255,255,255,.08),0 50px 90px -60px #000,
      0 0 60px -34px rgba(99,91,255,.5)}
  body.kz-libui .glass.lib::before{background:linear-gradient(90deg,transparent,rgba(99,91,255,.9) 18%,
    rgba(34,211,238,.8) 52%,rgba(217,70,239,.7) 82%,transparent);
    box-shadow:0 0 18px rgba(99,91,255,.55)}
  body.kz-libui .glass.lib::after{background:radial-gradient(closest-side,rgba(99,91,255,.22),transparent 72%)}
  body.kz-libui .lib .g-hd b{color:#f2f5ff}
  body.kz-libui .lib .g-c{color:#8b93a4}
  body.kz-libui .lib .chip{background:rgba(255,255,255,.05);border-color:rgba(255,255,255,.1);color:#aab3c8}
  body.kz-libui .lib .chip:hover{background:rgba(255,255,255,.09);border-color:rgba(255,255,255,.18);color:#fff}
  body.kz-libui .lib .chip.on{background:rgba(99,91,255,.2);border-color:rgba(139,92,246,.5);color:#c9c4ff;
    box-shadow:0 0 18px -6px rgba(99,91,255,.8)}
  body.kz-libui .libbar{background:rgba(255,255,255,.03);border-color:rgba(255,255,255,.06)}
  body.kz-libui .libbar .srch-wrap{background:rgba(255,255,255,.05);border-color:rgba(255,255,255,.1)}
  body.kz-libui .libbar .srch-wrap input{color:#e6ebf7}
  body.kz-libui .parts .part{color:#98a2ba}
  body.kz-libui .parts .part em{color:#6f7a92}
  body.kz-libui .parts .part:hover{background:rgba(255,255,255,.05);color:#fff}
  body.kz-libui .parts .part.on{background:rgba(99,91,255,.2);color:#c9c4ff;
    box-shadow:inset 0 0 0 1px rgba(139,92,246,.35)}
  body.kz-libui .parts .part.on em{color:#a5a0ff}
  body.kz-libui .parts .stf{background:rgba(255,255,255,.05)}
  body.kz-libui .parts .stf button{color:#98a2ba}
  body.kz-libui .parts .stf button.on{background:rgba(255,255,255,.12);color:#fff;
    box-shadow:0 2px 8px -4px #000}

  body.kz-libui .rows{background:transparent!important}
  body.kz-libui .rows .row:hover{background:rgba(255,255,255,.05);border-color:rgba(255,255,255,.1);
    box-shadow:0 18px 40px -30px #000,0 0 30px -18px rgba(99,91,255,.6)}
  body.kz-libui .c-t b{color:#eef1f8}
  body.kz-libui .c-t em{color:#8b93a4}
  body.kz-libui .c-stat em{color:#7c869c}
  body.kz-libui .c-stat b{color:#e6ebf7}
  body.kz-libui .c-stat .bar{background:rgba(255,255,255,.1)}
  body.kz-libui .c-stat .bar u{background:linear-gradient(90deg,#6366f1,#22d3ee)}
  body.kz-libui .rows .go{background:rgba(139,92,246,.16);color:#c9c4ff}
  body.kz-libui .rows .go:hover{background:linear-gradient(135deg,#5b5bff,#a855f7);color:#fff;
    box-shadow:0 0 26px -8px rgba(139,92,246,.9)}
  body.kz-libui .kz-tg.attr{background:#fde68a;color:#6b3f0a;border-color:#f0c95f}
  body.kz-libui .kz-tg.hot{background:#fee2e2;color:#b42318;border-color:#f6c2c8}

  /* 深色滚动条 */
  body.kz-libui{scrollbar-color:#2b3350 transparent}
  body.kz-libui ::-webkit-scrollbar-thumb{background:#2b3350;border-color:transparent}
  body.kz-libui ::-webkit-scrollbar-thumb:hover{background:#3a4468}

  @media (max-width:760px){
    body.kz-libui .bare::after{animation:none;filter:blur(22px);opacity:.8}
  }
  @media (prefers-reduced-motion:reduce){
    body.kz-libui .bare::after{animation:none}
  }
/* ===== kzLibUi4 ===== */
  /* ===== 深色扩展：错题 / 记录 / 总览等页面的卡片与控件 ===== */
  body.kz-libui .glass{background:linear-gradient(180deg,rgba(20,24,42,.72),rgba(10,14,24,.68))!important;
    border-color:rgba(255,255,255,.08)!important;
    box-shadow:inset 0 1px 0 rgba(255,255,255,.07),0 40px 80px -56px #000!important}
  body.kz-libui .card,body.kz-libui .pcard,body.kz-libui .dcard{
    background:linear-gradient(180deg,rgba(255,255,255,.06),rgba(255,255,255,.028))!important;
    border-color:rgba(255,255,255,.09)!important;color:#dbe2f2!important;
    box-shadow:0 20px 44px -38px #000!important}
  body.kz-libui .card:hover,body.kz-libui .pcard:hover,body.kz-libui .dcard:hover{
    border-color:rgba(139,92,246,.4)!important;box-shadow:0 0 34px -18px rgba(99,91,255,.75)!important}
  body.kz-libui .card h1,body.kz-libui .card h2,body.kz-libui .card h3,body.kz-libui .card h4,body.kz-libui .card b,
  body.kz-libui .pcard h1,body.kz-libui .pcard h2,body.kz-libui .pcard h3,body.kz-libui .pcard b,
  body.kz-libui .dcard h1,body.kz-libui .dcard h2,body.kz-libui .dcard h3,body.kz-libui .dcard b{color:#eef1f8!important}
  body.kz-libui .card p,body.kz-libui .card em,body.kz-libui .card small,
  body.kz-libui .pcard p,body.kz-libui .pcard em,body.kz-libui .pcard small,
  body.kz-libui .dcard p,body.kz-libui .dcard em,body.kz-libui .dcard small{color:#8b93a4!important}

  /* 通用胶囊 chip / pill / 科目切换 */
  body.kz-libui .chip,body.kz-libui .pill{
    background:rgba(255,255,255,.06)!important;border-color:rgba(255,255,255,.12)!important;color:#b9c2d6!important}
  body.kz-libui .chip:hover,body.kz-libui .pill:hover{background:rgba(255,255,255,.1)!important;color:#fff!important}
  body.kz-libui .chip.on,body.kz-libui .pill.on{
    background:rgba(99,91,255,.22)!important;border-color:rgba(139,92,246,.5)!important;color:#c9c4ff!important;
    box-shadow:0 0 18px -8px rgba(99,91,255,.8)}
  body.kz-libui .sk{background:rgba(255,255,255,.05)!important;border-color:rgba(255,255,255,.1)!important;color:#aab3c8!important}
  body.kz-libui .sk.on{background:linear-gradient(135deg,rgba(99,91,255,.9),rgba(168,85,247,.85))!important;
    border-color:transparent!important;color:#fff!important;box-shadow:0 10px 26px -14px rgba(99,91,255,.9)}
  body.kz-libui .secs,body.kz-libui .stats{background:rgba(255,255,255,.045)!important;
    border-color:rgba(255,255,255,.08)!important}
  body.kz-libui .sec{color:#98a2ba!important}
  body.kz-libui .sec.on{background:rgba(255,255,255,.12)!important;color:#fff!important}
  body.kz-libui .stats b{color:#fff!important}
  body.kz-libui .stats em,body.kz-libui .stats span{color:#8b93a4!important}

  /* 按钮 */
  body.kz-libui .btn{background:rgba(255,255,255,.06)!important;border-color:rgba(255,255,255,.12)!important;
    color:#dbe2f2!important}
  body.kz-libui .btn:hover{background:rgba(255,255,255,.1)!important}
  body.kz-libui .btn.primary,body.kz-libui .btn.solid{
    background:linear-gradient(135deg,#5b5bff,#a855f7)!important;border-color:transparent!important;color:#fff!important;
    box-shadow:0 12px 26px -14px rgba(99,91,255,.85)}
  body.kz-libui .btn:disabled{opacity:.45}

  /* 表单/输入 */
  body.kz-libui input,body.kz-libui textarea,body.kz-libui select{
    background:rgba(255,255,255,.05)!important;border-color:rgba(255,255,255,.12)!important;color:#eef1f8!important}
  body.kz-libui input::placeholder{color:#77829a!important}

  /* 链接 */
  body.kz-libui .atlas a{color:#a5a0ff}
  body.kz-libui .atlas a:hover{color:#c9c4ff}
/* ===== kzLibUi5 ===== */
  /* ===== 深色细节：错题卡 / 进度 / 最近练习 / 通用文字 ===== */
  body.kz-libui .pcard .pi{background:rgba(99,91,255,.16)!important;color:#a5a0ff!important;
    border:1px solid rgba(139,92,246,.3)!important}
  body.kz-libui .pcard .pt b{color:#eef1f8!important}
  body.kz-libui .pcard .pt em{color:#8b93a4!important}
  body.kz-libui .pcard .pacts button{background:rgba(255,255,255,.06)!important;
    border:1px solid rgba(255,255,255,.12)!important;color:#dbe2f2!important}
  body.kz-libui .pcard .pacts button:hover{background:rgba(255,255,255,.12)!important;color:#fff!important}
  body.kz-libui .pcard .pacts button:first-child{background:linear-gradient(135deg,rgba(99,91,255,.9),rgba(168,85,247,.85))!important;
    border-color:transparent!important;color:#fff!important;
    box-shadow:0 10px 22px -14px rgba(99,91,255,.9)}
  body.kz-libui .pcard .pacts button:disabled{opacity:.45!important;color:#8b93a4!important;
    background:rgba(255,255,255,.04)!important}

  body.kz-libui .dcard .d-hd{color:#eef1f8!important}
  body.kz-libui .dcard .p-n{color:#aab3c8!important}
  body.kz-libui .dcard .p-v{color:#fff!important}
  body.kz-libui .dcard .p-bar{background:rgba(255,255,255,.1)!important}
  body.kz-libui .dcard .p-bar i{background:linear-gradient(90deg,#6366f1,#22d3ee)!important}

  body.kz-libui .recent .r-row{color:#c7cfe2!important;border-color:rgba(255,255,255,.07)!important}
  body.kz-libui .recent .r-t{color:#eef1f8!important}
  body.kz-libui .recent .r-row:hover{background:rgba(255,255,255,.05)!important}
  body.kz-libui .recent .muted,body.kz-libui .page .muted{color:#8b93a4!important}
  body.kz-libui .page h1,body.kz-libui .page h2,body.kz-libui .page h3,body.kz-libui .page h4,
  body.kz-libui .page .title,body.kz-libui .page .sec-title{color:#f2f5ff!important}
  body.kz-libui .stats .k,body.kz-libui .stats .label,body.kz-libui .stats .sub{color:#8b93a4!important}
  body.kz-libui .goal-trigger b{color:#a5a0ff!important}
  body.kz-libui .glass .g-hd b{color:#f2f5ff!important}
  body.kz-libui .page .r-b,body.kz-libui .page .d-cta{color:#a5a0ff!important}
  body.kz-libui .page .d-note{color:#7c869c!important}
  body.kz-libui .page .d-hd{color:#eef1f8!important}
  body.kz-libui .page [class*="num"],body.kz-libui .page [class*="count"]{color:#fff!important}
  body.kz-libui .page .tag,body.kz-libui .page .badge,
  body.kz-libui .page [class*="chip"],body.kz-libui .page [class*="pill"],body.kz-libui .page [class*="tag"]{
    background:rgba(255,255,255,.06)!important;border-color:rgba(255,255,255,.12)!important;color:#b9c2d6!important}
  body.kz-libui .page .d-big{color:#fff!important}
  body.kz-libui .page .d-row{color:#9aa4bd!important}
  body.kz-libui .page .d-row b{color:#e6ebf7!important}
/* ===== kzHideImportCss ===== */
  /* 导入入口只给管理员（客户 2026-11-05：学员端不要导入按钮，只有管理者登录可以导入）。
     判据挂在 <html> 的 .kz-noadmin 上，**不用**给按钮打 data 属性：
     Vue 重渲染会重建这两个按钮，属性会丢，脚本下一轮再补 → 中间的几百毫秒按钮可见 = 跳。
     - 顶栏那颗「导入题库」是 .ahd 里唯一的 .ahd-btn.solid
     - 导航里「导入」是最后一个 tab 按钮（末尾那个 <i id="kzInk"> 是指示条，不是 button）
     2026-11-07 22:22 客户要求：顶栏这颗「＋ 导入题库」直接删掉 ——
     导航最右边已经有「⇧导入」页签能进，顶栏再来一颗是重复入口。改成对所有角色都不渲染。 */
  .page > .ahd .ahd-btn.solid{display:none!important}
  /* 导航里的「导入」不能按位置写死（:last-of-type 在学员端会误伤「记录」，因为学员端本来就不渲染导入、只有 7 个页签）。
     实际位置由脚本按文案测出来，再注入一条一次性规则；非管理员且没这个页签时什么也不做。 */
/* ===== kzBrandCss ===== */
  /* ① 目标分胶囊：只保留外层一层描边（客户 2026-11-04：内层内框不要显示） */
  html[data-kz-theme] body.kz-libui .goal-wrap{
    background:var(--kz-surface-2)!important;
    border:1px solid var(--kz-line)!important;
    border-radius:999px!important;
    box-shadow:inset 0 1px 0 var(--kz-line-2)!important}
  /* 客户 2026-11-05：内层按钮任何状态下都不许再画自己的框/底，否则小屏时它会顶破外框、看起来"断层"。
     高度也锁死在外框里（基础样式在 ≤900px 给了 40px，比 34/30 的胶囊还高）。 */
  html[data-kz-theme] body.kz-libui .goal-trigger,
  html[data-kz-theme] body.kz-libui .goal-trigger:hover,
  html[data-kz-theme] body.kz-libui .goal-trigger:active,
  html[data-kz-theme] body.kz-libui .goal-trigger:focus,
  html[data-kz-theme] body.kz-libui .goal-trigger[aria-expanded="true"],
  html[data-kz-theme] body.kz-libui .goal-trigger:focus-visible{
    background:transparent!important;background-image:none!important;
    border:0!important;border-color:transparent!important;
    box-shadow:none!important;outline:none!important;
    padding:0!important;margin:0!important;border-radius:999px!important;color:var(--kz-t2)!important;
    height:100%!important;max-height:100%!important;min-height:0!important;
    display:flex!important;align-items:center!important;justify-content:center!important;
    -webkit-tap-highlight-color:transparent}
  html[data-kz-theme] body.kz-libui .goal-trigger::before,
  html[data-kz-theme] body.kz-libui .goal-trigger::after{content:none!important;display:none!important}
  /* ② 目标分弹层跟随主题，选中档位用主题色（原来固定蓝色） */
  html[data-kz-theme] body.kz-libui .pop{
    background:var(--kz-surface)!important;border:1px solid var(--kz-line)!important;
    box-shadow:0 26px 50px -26px rgba(0,0,0,.42)!important}
  html[data-kz-theme] body.kz-libui .pop-hd{color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-libui .pop-ft{color:var(--kz-t3)!important}
  html[data-kz-theme] body.kz-libui .gopt{
    background:var(--kz-surface-2)!important;border:1px solid var(--kz-line)!important;color:var(--kz-t2)!important}
  html[data-kz-theme] body.kz-libui .gopt:hover{border-color:var(--kz-acc-line)!important;color:var(--kz-t1)!important}
  html[data-kz-theme] body.kz-libui .gopt.on{
    background:linear-gradient(135deg,var(--kz-acc),var(--kz-acc2))!important;
    border-color:transparent!important;color:var(--kz-on-acc,#fff)!important;
    box-shadow:0 10px 22px -14px var(--kz-acc2)!important}
  html[data-kz-theme] body.kz-libui .gopt:focus-visible,
  html[data-kz-theme] body.kz-libui .goal-trigger:focus-visible{outline-color:var(--kz-acc)!important}
  /* ③ 动态 logo：透明底圆形徽章，去掉白色玻璃底板（客户 2026-11-04：不要背板，直接浮在背景上）
       ⚠️ filter 必须 none：动画 webp 一旦被 filter 拉进合成层，Chrome 会把每帧画在不透明白底上，
          深色主题下就露出一个浅色方块（2026-11-05 客户报的 bug，宣传页同样原因） */
  html[data-kz-theme] body.kz-libui .ahd-logo,
  body.kz-libui .ahd-logo{
    object-fit:contain!important;background:transparent!important;padding:0!important;
    border:0!important;box-shadow:none!important;border-radius:0!important;
    filter:none!important;image-rendering:auto}
  /* ④ 目标分弹窗：让整个 header 形成高层级，弹窗（.goal-wrap 的 .pop）才能盖住标签栏
       （客户 2026-11-04：弹层被「错题/记录」栏遮挡。根因是 .ahd 是 z-auto 不形成层叠上下文，
         .goal-wrap 的 z-index 在 .page 里被后序的 .tabs 盖住，必须给 .ahd 抬 z-index） */
  html[data-kz-theme] body.kz-libui .page > .ahd,
  body.kz-libui .page > .ahd{position:relative!important;z-index:30!important}
  /* ⑤ 题目列表容器：去掉原站带的圆角外框（客户 2026-11-04：不要底部那个底框） */
  html[data-kz-theme] body.kz-libui .lib .rows,
  body.kz-libui .lib .rows{border:0!important;border-radius:0!important;
    box-shadow:none!important;background:transparent!important}
/* ===== kzExitCss ===== */
  /* 交卷后（解析模式）原站会把底栏整个删掉，连带「退出」按钮一起没了，
     导致做完只能靠浏览器后退。这里在顶栏右侧补一个「退出」，
     点击直接回登录后的题库首页（客户 2026-11-04）。 */
  .ex-hd .hd-r{flex-wrap:wrap;gap:6px}
  /* 客户 2026-11-05：退出按钮和 A−/A+ 用同一套框（同高、同圆角、同描边、同浅底） */
  .ex-hd .hd-r .kz-exit{
    font:inherit;font-size:13px;font-weight:700;line-height:1;height:28px;
    padding:0 12px;border-radius:8px;cursor:pointer;white-space:nowrap;box-sizing:border-box;
    display:inline-flex;align-items:center;text-decoration:none;
    border:1px solid #d5d9e3;background:#f5f7fb;color:#3f4759;
    box-shadow:0 1px 2px rgba(28,33,48,.06);
    transition:background .16s ease,color .16s ease,border-color .16s ease;
  }
  .ex-hd .hd-r .kz-exit:hover{background:#eef2fa;color:#1c2130;border-color:#b9bfcf}
  .ex-hd .hd-r .kz-exit:active{transform:scale(.97)}
  @media (max-width:760px){
    .ex-hd .hd-r .kz-exit{height:26px;padding:0 10px;font-size:12px}
  }
/* ===== kzTrHlCss ===== */
  /* 复盘页：点哪道题，就在原文里标出「答案所在的那一句」。
     优先走 CSS Custom Highlight API（Range + ::highlight()，Baseline 2026：
     Chrome/Edge 105+、Safari 17.2+、Firefox 140+）—— 它是纯 Range 绘制，不改 DOM，
     所以切题不用还原节点、也不会被 Vue 重渲染冲掉；不支持时退回 span/mark 包裹。
     两层：命中句 → 答案词。不再给整行/整段刷底色（客户 2026-11-08：那个大底框不要）。 */
  ::highlight(kz-sent){ background-color:#fde68a; }
  ::highlight(kz-word){ background-color:#f59e0b; color:#fff; }
  /* 我们自己已经画了更准的一层（答案词 + 所在句/整段）时，把平台按「原文 X 段」
     猜出来的整段 pale yellow 压掉：两段一起亮会让人以为高亮了错误段落。 */
  /* 平台给 mark.hit 挂了 box-shadow: rgba(253,230,138,.55) 0 0 0 3px（黄色光圈）。
     只压 background 不够：跨行的 inline 元素每行都带一圈 3px 阴影，叠起来就是「整段涂黄」。
     2026-11-09 客户截图就是这个，必须连 box-shadow 一起压掉。 */
  .doccol.kz-hl-own mark.hit{ background:transparent!important; box-shadow:none!important; color:inherit!important; }
  /* 段落匹配题（答案 = Paragraph D）：客户明确不要整段铺色（黄底、蓝底都被否了）。
     这里只留一条左侧竖条标「是哪一段」，文字背景保持原样；真要高亮的是段内某一句，
     由 JS 用解析里的英文证据短语定位后单独上色。 */
  .doccol .para.kz-para-mark, .doccol .tr-line.kz-para-mark{
    box-shadow:inset 3px 0 0 #7c6cff!important;
  }
  /* 降级方案（老浏览器）用到的两种包裹 */
  .kz-hl-s{
    background:#fde68a;border-radius:3px;padding:1px 3px;
    -webkit-box-decoration-break:clone;box-decoration-break:clone;
  }
  mark.kz-hlm{background:#f59e0b;color:#fff;font-weight:700;border-radius:3px;padding:0 2px}
/* ===== kzOneScrollCss =====
   客户 2026-11-09：新导入的题复盘页左栏出现两条竖向拖拉条，已有题库只有一条。
   复盘态左栏只该由 .doccol 自己滚；新导入卷若残留 paragraphs / 超长录音稿，
   模板会在里面再套一层 .tr-body / .ap-script / 阅读式 .passage（各自带滚动条）。
   首帧就用 CSS 摊平，JS 的 kzOneScrollJs 再做运行时兜底。 */
  .ex:has(.revdock) .doccol .tr-body,
  .ex:has(.revdock) .doccol .ap-script,
  .ex:has(.revdock) .doccol .passage,
  .ex:has(.revdock) .doccol .tr-panel{
    max-height:none!important;overflow-y:visible!important;overflow:visible!important;
  }
  /* 同一栏里同时出现「录音稿」和阅读式「原文」时只留录音稿 */
  .ex:has(.revdock) .doccol.review-doc:has(.tr-panel) .passage{display:none!important}
/* ===== kzDstatCss ===== */
  /* 顶部「正确 0 · 错误 10」和下面的四指标重复，客户 2026-11-04 要求删掉 */
  .ex:has(.revdock) .hd-r .hd-score{display:none!important}

  /* 解析正文：客户 2026-11-05 要求「六个部分分别加框」——
     三行各一张浅底卡片，行首标签再各套一个小胶囊，共六个框 */
  /* 客户 2026-11-05：一共六个**独立**的框（3 个标签 + 3 段正文），不要「框套框」。
     所以正文那张卡片里不再放标签：标签用绝对定位挪到卡片左侧外面，两者并排、各自成框。 */
  .ex .revdock,
  .ex .revdock > .dk-body{background:#fff!important}
  .ex .revdock > .dk-body{padding:8px 10px 2px 66px!important}
  /* 客户 2026-11-05：三行各用一套颜色（答案蓝 / 解析绿 / 干扰琥珀），靠 CSS 变量分派 */
  .ex .dk-body > .rv-sec{
    position:relative!important;
    --kz-accent:#1a7fc0;--kz-chip-bg:#edf7fe;--kz-chip-bd:#d2e8f9;
    --kz-card-bg:#fbfdff;--kz-card-bd:#e0ebf7;
    background:var(--kz-card-bg)!important;background-image:none!important;
    border:1px solid var(--kz-card-bd)!important;
    border-radius:10px!important;
    padding:10px 12px!important;margin:0 0 9px!important;
    gap:12px!important;align-items:flex-start!important;
    font-size:13px!important}
  .ex .dk-body > .rv-sec:nth-of-type(2){
    --kz-accent:#0f8268;--kz-chip-bg:#eafaf3;--kz-chip-bd:#c6ebdc;
    --kz-card-bg:#fbfefc;--kz-card-bd:#d8eee6}
  .ex .dk-body > .rv-sec:nth-of-type(3){
    --kz-accent:#b45309;--kz-chip-bg:#fff6e9;--kz-chip-bd:#f6e0bb;
    --kz-card-bg:#fffdf8;--kz-card-bd:#f1e2ca}
  .ex .dk-body > .rv-sec:last-of-type{margin-bottom:2px!important}
  .ex .dk-body > .rv-sec > b{
    position:absolute!important;left:-58px!important;top:9px!important;
    display:block!important;width:48px!important;min-width:0!important;box-sizing:border-box!important;
    text-align:center!important;
    background:var(--kz-chip-bg)!important;border:1px solid var(--kz-chip-bd)!important;
    border-radius:7px!important;
    padding:3px 0!important;
    font-size:12px!important;font-weight:700!important;color:var(--kz-accent)!important}
  @media (max-width:760px){
    .ex .revdock > .dk-body{padding-left:58px!important}
    .ex .dk-body > .rv-sec > b{left:-50px!important;width:42px!important;font-size:11.5px!important}
  }
  .ex .dk-body > .rv-sec > .rv-answer{
    color:#0f172a!important;font-size:14px!important;font-weight:800!important}
  .ex .dk-body > .rv-sec > span:not(.rv-answer){
    color:#475569!important;font-size:13px!important;line-height:1.75!important}
  /* 写笔记：白底 + 浅蓝描边的胶囊按钮 */
  .ex .dk-tabs .dk-note{
    border:1px solid #a8d5f2!important;background:#fff!important;color:#1a7fc0!important;
    border-radius:6px!important;padding:5px 12px!important;font-weight:600!important}
  .ex .dk-tabs .dk-note:hover{background:#f2f9ff!important;border-color:#7fc1ea!important}

  /* 解析面板底部：本套四指标，放在「干扰」下面那块空白里 */
  /* 客户 2026-11-05：这块太高，压成一半高（上下内边距、字号、间距一起收） */
  /* 客户 2026-11-05：这块原来的米黄底和上方「干扰」的琥珀卡片撞色，改成中性冷灰蓝 */
  .ex .kz-dstat{
    margin:6px 0 4px;padding:5px;border-radius:10px;
    background:#e9f2ff;border:1px solid #d2e3fb}
  /* 挂在滚动区外时贴面板底部，始终可见 */
  .ex .revdock > .kz-dstat{
    flex:0 0 auto!important;
    margin:5px 16px 7px!important}
  /* 面板不再固定 38% 高：默认按内容收紧，避免点「下一题」后下面留一大片空白
     （客户 2026-11-05）；内容太长时最多占 76%，其余在面板内滚动。
     手动拖过分隔条的话，行内 !important 高度会盖过这条。 */
  .ex .revdock,
  .ex .revdock:has(> .kz-notebar),
  .ex .revdock:has(> .kz-notebar.open){
    height:auto!important;min-height:0!important;max-height:76vh!important}
  .ex .revdock > .dk-body{flex:0 1 auto!important;overflow:auto!important}
  .ex .kz-dstat .kz-ds-row{
    display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px}
  .ex .kz-ds{
    background:#fff;border-radius:8px;padding:3px 6px 4px;text-align:center;
    box-shadow:0 1px 2px rgba(20,26,40,.06);
    display:flex;flex-direction:column;gap:1px;min-width:0}
  .ex .kz-ds em{
    font-style:normal;font-size:10.5px;line-height:1.1;color:#8b93a4;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .ex .kz-ds i{
    font-style:normal;font-size:17px;font-weight:800;line-height:1.1;
    font-variant-numeric:tabular-nums;letter-spacing:-.02em}
  .ex .kz-ds.ok i{color:#6b7280}
  .ex .kz-ds.rate i{color:#d9466b}
  .ex .kz-ds.avg i{color:#3f4652}
  .ex .kz-ds.score i{color:#e11d48}
  /* 客户 2026-11-05：写笔记上移后底部空出一条，四指标拉高占满这块，四张卡也撑满 */
  @media (min-width:761px){
    .ex .revdock > .kz-dstat{min-height:86px!important}
    .ex .revdock > .kz-dstat .kz-ds-row{height:100%!important}
    .ex .revdock > .kz-dstat .kz-ds{justify-content:center!important;gap:2px!important}
    .ex .revdock > .kz-dstat .kz-ds i{font-size:19px}
  }
  @media (max-width:760px){
    .ex .kz-dstat{padding:6px;margin-top:6px}
    .ex .kz-dstat .kz-ds-row{grid-template-columns:1fr 1fr;gap:6px}
    .ex .kz-ds i{font-size:16px}
  }
/* ===== kzQNotesCss ===== */
  /* 复盘页精简：去掉「答案与解析」标题；顶部试卷标题由 KZ_FRAME 在复盘时隐藏。 */
  .ex .dk-tabs > .rv-lb{display:none!important}
  /* 原笔记只写 localStorage，且不同 Part 的同题号会串；入口换成下方云笔记栏。 */
  .ex .dk-tabs > .dk-note{display:none!important}

  /* 「‹ 上一题 / 下一题 ›」不再单独占一行：面板顶部收成 0 高，
     两个按钮浮在「答案」那一行的最右边（客户 2026-11-04 参考图）。 */
  .ex .revdock > .dk-tabs{
    position:relative;z-index:4;
    height:0!important;min-height:0!important;padding:0 16px 0 0!important;margin:0!important;
    border:0!important;overflow:visible!important;justify-content:flex-end!important;gap:12px!important}
  .ex .revdock > .dk-tabs > .sp{display:none!important}
  /* 「上一题 / 下一题」：客户 2026-11-05 要求各自加框、底色加重、字放大 */
  .ex .revdock > .dk-tabs .dk-step{
    position:relative;top:32px;flex:none;
    border:1px solid #cfe3f4!important;
    background:#eef6fd!important;
    box-shadow:0 1px 2px rgba(15,23,42,.05)!important;
    color:#1a7fc0!important;font-size:13.5px!important;font-weight:700!important;
    padding:5px 12px!important;line-height:1.2!important;border-radius:8px!important;
    transition:background-color .15s ease,border-color .15s ease,color .15s ease}
  .ex .revdock > .dk-tabs .dk-step:disabled{
    color:#b6c4d4!important;background:#f6f8fc!important;
    border-color:#e7edf5!important;box-shadow:none!important}
  .ex .revdock > .dk-tabs .dk-step:hover:not(:disabled){
    color:#0f6da8!important;background:#e2f0fb!important;border-color:#a9d4f0!important}
  /* 给按钮让位，长答案不会钻到按钮底下 */
  .ex .revdock > .dk-body > .rv-sec:first-of-type{padding-right:216px!important}
  /* 客户 2026-11-05：把「写笔记」提到「答案」卡片右上角、翻页按钮右边；
     翻页按钮整体左移，给写笔记让出位置（桌面端；手机上仍是各自一行） */
  @media (min-width:761px){
    .ex .revdock{position:relative!important}
    /* 89 = 原来的 16 + 写笔记按钮 62 + 间距 11 */
    .ex .revdock > .dk-tabs{padding-right:89px!important}
    .ex .revdock > .kz-notebar:not(.open){
      position:absolute!important;top:26px!important;right:28px!important;
      margin:0!important;padding:0!important;width:auto!important;
      background:transparent!important;border:0!important;
      z-index:9}
    /* 和翻页按钮同高（28px），三个按钮在同一条线上 */
    .ex .revdock > .kz-notebar:not(.open) .kz-note-open{padding:6px 12px!important}
    .ex .revdock > .kz-notebar:not(.open) .kz-note-head{
      min-height:0!important;justify-content:flex-end!important}
    .ex .revdock > .kz-notebar:not(.open) .kz-note-status{display:none!important}
    /* 按钮左移后，答案文字要让到「上一题」左边，别被压住 */
    .ex .revdock > .dk-body > .rv-sec:first-of-type{padding-right:252px!important}
    /* 编辑器展开时那一格是空的，翻页按钮回到最右边 */
    .ex .revdock:has(> .kz-notebar.open) > .dk-tabs{padding-right:16px!important}
    .ex .revdock:has(> .kz-notebar.open) > .dk-body > .rv-sec:first-of-type{padding-right:216px!important}
  }
  /* 游客没有写笔记入口，别留那块空位（只在桌面端，手机端本来就各占一行） */
  @media (min-width:761px){
    html.kz-guest .ex .revdock > .dk-tabs{padding-right:16px!important}
    html.kz-guest .ex .revdock > .dk-body > .rv-sec:first-of-type{padding-right:216px!important}
  }
  /* 手机上挤不下：把两个按钮放回自己一行，答案恢复整行宽度 */
  @media (max-width:760px){
    .ex .revdock > .dk-tabs{
      height:auto!important;padding:8px 12px 0!important;gap:10px!important}
    .ex .revdock > .dk-tabs .dk-step{top:0!important;font-size:12.5px!important;padding:5px 11px!important}
    .ex .revdock > .dk-body > .rv-sec:first-of-type{padding-right:16px!important}
  }

  /* 写笔记固定在「干扰」之后、四指标之前，入口与答案正文右缘对齐。 */
  .ex .revdock > .kz-notebar{
    flex:0 0 auto!important;margin:0 16px!important;padding:7px 0 0!important;
    box-sizing:border-box;min-width:0}
  .ex .kz-note-head{display:flex;align-items:center;justify-content:flex-end;gap:10px;min-height:30px}
  .ex .kz-note-status{margin-right:auto;font-size:12px;line-height:1.4;color:#94a3b8;min-width:0}
  .ex .kz-note-status.bad{color:#dc2626}
  .ex .kz-note-open{
    flex:none;border:1px solid #a8d5f2;background:#fff;color:#1a7fc0;
    border-radius:6px;padding:5px 12px;font-size:12px;font-weight:600;line-height:1.2;
    cursor:pointer}
  .ex .kz-note-open:hover{background:#f2f9ff;border-color:#7fc1ea}
  .ex .kz-note-editor{display:none;padding-top:9px}
  .ex .kz-notebar.open .kz-note-editor{display:block}
  .ex .kz-note-editor textarea{
    display:block;width:100%;height:82px;box-sizing:border-box;resize:vertical;
    border:1px solid #d7e3ed;border-radius:8px;background:#fff;color:#0f172a;
    padding:9px 11px;font:13px/1.65 -apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;
    outline:none}
  .ex .kz-note-editor textarea:focus{border-color:#7fc1ea;box-shadow:0 0 0 3px rgba(26,127,192,.10)}
  .ex .kz-note-actions{display:flex;align-items:center;justify-content:flex-end;gap:8px;margin-top:8px}
  .ex .kz-note-actions button{
    border:1px solid #d7e3ed;border-radius:6px;background:#fff;color:#475569;
    padding:5px 12px;font-size:12px;line-height:1.2;cursor:pointer}
  .ex .kz-note-actions .kz-note-save{background:#1a7fc0;border-color:#1a7fc0;color:#fff;font-weight:700}
  .ex .kz-note-actions .kz-note-del{margin-right:auto;color:#dc2626;border-color:#fecaca}
  .ex .kz-note-actions button:disabled{opacity:.55;cursor:not-allowed}
  /* 面板已改为按内容自适应（见 kzDstatCss），这里不再钉最小高度，否则又会出现大片空白 */
  .ex .revdock:has(> .kz-notebar){min-height:0!important}
  .ex .revdock:has(> .kz-notebar.open){min-height:0!important}

  /* 题目上方的便签：按参考稿用米黄色底、细描边、小笔记图标。 */
  .ex .q > .kz-qnote{
    display:flex;align-items:flex-start;gap:6px;width:fit-content;max-width:100%;
    box-sizing:border-box;margin:0 0 7px!important;padding:4px 9px!important;
    border:1px solid #f0dfb5!important;border-radius:7px!important;background:#fff8e9!important;
    color:#bd8b32!important;font-size:12px!important;font-weight:500!important;line-height:1.55!important;
    text-align:left;white-space:pre-wrap;overflow-wrap:anywhere;box-shadow:none!important}
  .ex .q > .kz-qnote svg{flex:none;width:13px;height:13px;margin-top:2px;stroke:currentColor}
  .ex .q > .kz-qnote span{min-width:0;color:inherit!important;font:inherit!important}
  /* 笔记条本身可点：点一下就改这条笔记 */
  .ex .q > .kz-qnote{cursor:pointer;transition:border-color .15s ease}
  .ex .q > .kz-qnote:hover{border-color:#e6cd93!important}

  /* 填空题：便签贴在该空格答题框的正上方、右对齐，太长省略（客户 2026-11-05 参考图） */
  .ex .blank-wrap{position:relative}
  .ex .blank-wrap > .kz-qnote{
    position:absolute;left:auto;top:auto;right:-4px;bottom:100%;
    display:flex!important;align-items:center;
    margin:0!important;padding:1px 7px!important;gap:4px!important;
    width:max-content;max-width:260px;
    background:#fff8e9!important;border:1px solid #f0dfb5!important;border-radius:6px!important;
    color:#bd8b32!important;font-size:11px!important;font-weight:500!important;line-height:1.45!important;
    white-space:nowrap!important;overflow:hidden;box-sizing:border-box;
    z-index:6;box-shadow:0 4px 12px -8px rgba(15,23,42,.45)!important}
  .ex .blank-wrap > .kz-qnote:hover{border-color:#e6cd93!important;cursor:pointer}
  /* 有便签的那一行往下让一点，便签就落在空隙里，不压到上一行文字 */
  .ex .q:has(.blank-wrap > .kz-qnote){padding-top:14px!important}
  .ex .blank-wrap > .kz-qnote svg{flex:none;width:11px;height:11px;stroke:currentColor}
  .ex .blank-wrap > .kz-qnote span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  @media (max-width:760px){
    .ex .blank-wrap > .kz-qnote{max-width:170px;font-size:11px!important}
  }

  /* 客户 2026-11-10：笔记只在答案解析（复盘）界面出现，做题页面一律不显示。
     复盘标志 .revdock 与 kzExitJs 一致；JS 在答题态也不会插入这些节点，
     这里再用 !important 兜住 SPA 重渲染那一帧，避免闪一下就露出自己记的答案提示。 */
  .ex:not(:has(.revdock)) .kz-qnote,
  .ex:not(:has(.revdock)) .q-hd > .kz-qbtn,
  .ex:not(:has(.revdock)) .kz-qedit{display:none!important}

  /* 每题行尾的小笔记按钮：答题中也能按题记笔记，已有笔记时变琥珀色。
     和 .stem 并排（.q-hd 是 flex），只占 20px，不压正文。 */
  .ex .q-hd > .kz-qbtn{
    flex:0 0 20px;width:20px;height:20px;margin-left:8px;padding:0;
    display:inline-flex;align-items:center;justify-content:center;
    border:0;border-radius:5px;background:transparent;color:#b9c4d1;
    cursor:pointer;opacity:0;transition:opacity .15s ease,color .15s ease,background .15s ease}
  .ex .q:hover > .q-hd > .kz-qbtn,
  .ex .q-hd > .kz-qbtn.has,
  .ex .q-hd > .kz-qbtn:focus-visible{opacity:1}
  .ex .q-hd > .kz-qbtn:hover{color:#1a7fc0;background:#eaf6ff}
  .ex .q-hd > .kz-qbtn.has{color:#c08a2e}
  .ex .q-hd > .kz-qbtn svg{width:14px;height:14px;stroke:currentColor;fill:none}

  /* 行内编辑器：直接长在题目上方，保存后收起、换成米黄便签 */
  .ex .q > .kz-qedit{
    margin:0 0 8px!important;padding:8px 8px 7px;box-sizing:border-box;
    border:1px solid #cfe4f3;border-radius:9px;background:#fbfdff;
    box-shadow:0 8px 22px -18px rgba(15,23,42,.55)}
  .ex .q > .kz-qedit textarea{
    display:block;width:100%;height:66px;box-sizing:border-box;resize:vertical;
    border:1px solid #d7e3ed;border-radius:7px;background:#fff;color:#0f172a;
    padding:7px 9px;font:13px/1.6 -apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;
    outline:none}
  .ex .q > .kz-qedit textarea:focus{border-color:#7fc1ea;box-shadow:0 0 0 3px rgba(26,127,192,.10)}
  .ex .kz-qedit .kz-ea{display:flex;align-items:center;gap:8px;margin-top:6px}
  .ex .kz-qedit .kz-est{margin-right:auto;font-size:11.5px;color:#94a3b8;min-width:0}
  .ex .kz-qedit .kz-est.bad{color:#dc2626}
  .ex .kz-qedit button{
    border:1px solid #d7e3ed;border-radius:6px;background:#fff;color:#475569;
    padding:4px 11px;font-size:12px;line-height:1.2;cursor:pointer}
  .ex .kz-qedit .kz-esave{background:#1a7fc0;border-color:#1a7fc0;color:#fff;font-weight:700}
  .ex .kz-qedit .kz-edel{color:#dc2626;border-color:#fecaca}
  .ex .kz-qedit button:disabled{opacity:.55;cursor:not-allowed}
  @media (max-width:760px){
    .ex .revdock:has(> .kz-notebar){min-height:0!important}
    .ex .revdock:has(> .kz-notebar.open){min-height:0!important}
    .ex .revdock > .kz-notebar{margin:0 12px!important}
    .ex .q > .kz-qnote{font-size:11.5px!important}
    /* 触屏没有 hover，按钮常显 */
    .ex .q-hd > .kz-qbtn{opacity:1;flex:0 0 18px;width:18px;height:18px;margin-left:6px}
    .ex .q > .kz-qedit textarea{height:60px;font-size:12.5px}
  }
/* ===== kzWEntryCss ===== */
  /* 写作板块目前没有题库数据，这里给一个「写作 AI 批改」入口（客户 2026-11-04） */
  .kz-wentry{
    margin:14px 0 4px;padding:20px 22px;border-radius:16px;
    background:var(--kz-surface,#fff);
    border:1px solid var(--kz-line,rgba(127,140,170,.28));
    display:flex;align-items:center;gap:16px;flex-wrap:wrap;
    box-shadow:0 18px 44px -34px rgba(0,0,0,.75);
  }
  .kz-we-badge{
    flex:none;width:44px;height:44px;border-radius:13px;
    background:linear-gradient(135deg,#635bff,#8b5cf6);
    display:flex;align-items:center;justify-content:center;
    color:#fff;font-weight:800;font-size:13px;letter-spacing:.03em;
    box-shadow:0 12px 24px -16px rgba(99,91,255,.95);
  }
  .kz-we-txt{flex:1 1 260px;min-width:0}
  .kz-we-txt b{display:block;font-size:16px;color:var(--kz-t1,#141a28);margin-bottom:4px;letter-spacing:.01em}
  .kz-we-txt span{display:block;font-size:13px;color:var(--kz-t2,#4b5567);line-height:1.65}
  .kz-we-btn{
    flex:none;display:inline-flex;align-items:center;gap:8px;
    padding:11px 20px;border-radius:12px;text-decoration:none;
    background:linear-gradient(135deg,#635bff,#8b5cf6);color:#fff!important;
    font-size:14px;font-weight:700;white-space:nowrap;
    box-shadow:0 16px 30px -18px rgba(99,91,255,.95);
    transition:transform .16s ease,filter .16s ease;
  }
  .kz-we-btn:hover{filter:brightness(1.06);transform:translateY(-1px)}
  /* 有入口卡时，原站那句「写作还没有内容，去导入题库」对学员没意义 */
  .page > .glass:has(.kz-wentry) > .empty{display:none!important}
  @media (max-width:760px){
    .kz-wentry{padding:16px 16px;gap:12px}
    .kz-we-btn{width:100%;justify-content:center}
  }
/* ===== kzWCardCss ===== */
  /* 写作题卡：第三方组件把背景写死成白色，深色主题下变成「白底浅字」看不见
     （客户 2026-11-04 自检发现）。这里统一走主题变量。 */
  html[data-kz-theme] body.kz-libui .wgrid .wcard{
    background:var(--kz-surface-2,rgba(255,255,255,.06))!important;
    border:1px solid var(--kz-line,rgba(255,255,255,.10))!important;
    color:var(--kz-t1,#eef1f8)!important;
    box-shadow:0 14px 34px -28px rgba(0,0,0,.8)}
  html[data-kz-theme] body.kz-libui .wgrid .wcard:hover{
    border-color:var(--kz-line-2,rgba(255,255,255,.18))!important}
  html[data-kz-theme] body.kz-libui .wgrid .wcard .wblank{
    background:var(--kz-surface-3,rgba(255,255,255,.08))!important;
    color:var(--kz-t2,#aab3c8)!important}
  html[data-kz-theme] body.kz-libui .wgrid .wcard b,
  html[data-kz-theme] body.kz-libui .wgrid .wcard strong{
    color:var(--kz-t1,#eef1f8)!important}
  html[data-kz-theme] body.kz-libui .wgrid .wcard span,
  html[data-kz-theme] body.kz-libui .wgrid .wcard em,
  html[data-kz-theme] body.kz-libui .wgrid .wcard small{
    color:var(--kz-t2,#aab3c8)!important}
  html[data-kz-theme] body.kz-libui .wgrid .wcard .wblank,
  html[data-kz-theme] body.kz-libui .wgrid .wcard .wblank *{
    color:var(--kz-t2,#aab3c8)!important}
/* ===== kzHomeCss ===== */
  /* ============ 首页：品牌区去底框 + logo 放大 ============ */
  html[data-kz-theme] body.kz-libui .page > .ahd{
    background:none!important;
    background-image:none!important;
    border:0!important;
    box-shadow:none!important;
    border-radius:0!important;
    padding:4px 2px 18px!important;
    margin-bottom:2px!important;
    display:flex;align-items:center;gap:14px;
    overflow:visible!important;
    /* 背景本来就透明，backdrop-filter 只会把 header 拉成一个合成层，
       从而让里面的动画 webp logo 被画在白底上（深色主题露白方块，2026-11-05 客户报） */
    -webkit-backdrop-filter:none!important;
    backdrop-filter:none!important;
  }
  html[data-kz-theme] body.kz-libui .page > .ahd::before,
  html[data-kz-theme] body.kz-libui .page > .ahd::after{display:none!important}
  /* 客户 2026-11-05：删掉顶栏的「目标 9.0」胶囊（连同它的弹层一起不显示） */
  html[data-kz-theme] body.kz-libui .page > .ahd .goal-wrap{display:none!important}
  /* 动态 logo：客户 2026-11-05「大大大大」→ 54px 放大到 80px（手机 62px） */
  html[data-kz-theme] body.kz-libui .page > .ahd .ahd-logo{
    width:92px!important;height:92px!important;border-radius:0!important;flex:none;
    box-shadow:none!important}
  /* 品牌两行：英文 IELTS ATLAS 在上、中文「浣熊雅思」在下，两行互相对齐居中 */
  html[data-kz-theme] body.kz-libui .page > .ahd .ahd-t{
    display:flex;flex-direction:column;gap:3px;min-width:0;flex:none;
    align-items:center!important;text-align:center!important}
  html[data-kz-theme] body.kz-libui .page > .ahd .ahd-t > b,
  html[data-kz-theme] body.kz-libui .page > .ahd .ahd-t > em{white-space:nowrap}
  html[data-kz-theme] body.kz-libui .page > .ahd .ahd-t b{
    order:2;font-size:22px!important;font-weight:800!important;line-height:1.15;letter-spacing:-.01em}
  html[data-kz-theme] body.kz-libui .page > .ahd .ahd-t em{
    order:1;font-size:14px!important;font-weight:800!important;font-style:normal!important;
    line-height:1.2!important;letter-spacing:.12em!important;text-transform:uppercase;
    color:var(--kz-t1,#1c2130)!important;opacity:1!important}
  /* 品牌副标题：两行卖点文案，第一行渐变强调、第二行淡色（客户 2026-11-04 放大+艺术字） */
  html[data-kz-theme] body.kz-libui .page > .ahd .ahd-sub{
    display:flex!important;flex-direction:column!important;gap:3px!important;
    font-size:0!important;line-height:1.5!important;
    flex:1 1 auto!important;max-width:none!important;margin:0 20px!important;
    white-space:normal;text-align:center!important;align-items:center!important;opacity:1!important}
  html[data-kz-theme] body.kz-libui .page > .ahd .ahd-sub i{
    display:block!important;font-style:normal!important;font-size:15px!important;
    font-weight:800!important;letter-spacing:.01em!important;line-height:1.35!important;
    background:linear-gradient(100deg,var(--kz-acc,#6d28d9),var(--kz-acc2,#db2777))!important;
    -webkit-background-clip:text!important;background-clip:text!important;
    -webkit-text-fill-color:transparent!important;color:transparent!important}
  html[data-kz-theme] body.kz-libui .page > .ahd .ahd-sub em{
    display:block!important;font-style:normal!important;font-size:13px!important;
    font-weight:500!important;letter-spacing:.02em!important;line-height:1.5!important;
    color:var(--kz-t3,#8b93a4)!important;opacity:.9!important}
  /* 副标题占满标题与右侧按钮之间的空间并居中，原来的 .sp 弹性占位就让出来 */
  html[data-kz-theme] body.kz-libui .page > .ahd > .sp{flex:0 0 0!important;width:0!important;min-width:0!important}

  /* ============ 科目栏独占一行（客户：比原版还要大） ============ */
  html[data-kz-theme] body.kz-libui .page > .tabs{
    margin:2px 0 16px!important;padding:6px!important;gap:6px!important;border-radius:16px!important}
  html[data-kz-theme] body.kz-libui .page > .tabs .tab{
    height:44px!important;padding:0 19px!important;font-size:15px!important;gap:8px!important;border-radius:11px!important}
  html[data-kz-theme] body.kz-libui .page > .tabs .tab .ti{font-size:15px!important}
  html[data-kz-theme] body.kz-libui .page > .tabs .tab em{font-size:11px!important;line-height:18px!important;padding:0 6px!important}

  /* ============ 搜索框下移：与「听力 / 阅读 / 写作」那行同一水平线 ============ */
  html[data-kz-theme] body.kz-libui .page > .glass > .skills{
    display:flex!important;align-items:center;gap:10px;flex-wrap:wrap}
  /* 客户 2026-11-05：主页科目行里的「写作 Writing」是禁用态，直接去掉 */
  html[data-kz-theme] body.kz-libui .page > .glass > .skills > .sk.writing{
    display:none!important}
  html[data-kz-theme] body.kz-libui .page > .glass > .skills > .kz-ps{
    margin:0 0 0 auto!important;flex:0 0 auto;width:min(340px,32vw)!important;
    position:relative;z-index:6}
  html[data-kz-theme] body.kz-libui .page > .glass > .skills > .kz-ps .kz-ps-in{
    height:40px!important;border-radius:10px!important}
  html[data-kz-theme] body.kz-libui .page > .glass > .skills > .kz-ps .kz-ps-drop{
    top:46px!important}
  /* 没有科目行时（个别页签）：搜索框绝对定位到右上角，大小按主页 40px；
     内容区上移，让「听力/阅读题库」标题与搜索框同一水平线（客户 2026-11-04）
     top 由 204 → 217：标题行高 57、搜索框 40，要让两者垂直中心对齐得下移 13px */
  html[data-kz-theme] body.kz-libui .page > .kz-ps{
    position:absolute!important;top:217px!important;right:0!important;
    width:min(340px,32vw)!important;margin:0!important;z-index:6}
  html[data-kz-theme] body.kz-libui .page > .kz-ps .kz-ps-in{
    height:40px!important;border-radius:10px!important}
  html[data-kz-theme] body.kz-libui .page > .kz-ps .kz-ps-drop{top:46px!important}

  /* ============ 题型区：去掉外层大底框，卡片直接浮在页面上 ============ */
  html[data-kz-theme] body.kz-libui .page > .glass{
    background:transparent!important;
    background-image:none!important;
    border:0!important;
    box-shadow:none!important;
    border-radius:0!important;
    padding:0!important;
    margin-bottom:8px!important;
    /* 毛玻璃会把背景（星空/渐变）糊掉，看起来像盖了一层雾；
       客户 2026-11-05：要和下方统计区一样，背景原样透出来 */
    -webkit-backdrop-filter:none!important;
    backdrop-filter:none!important;
  }
  /* 原包的顶部高光线与右上角光斑，去框后不再需要 */
  html[data-kz-theme] body.kz-libui .page > .glass::before,
  html[data-kz-theme] body.kz-libui .page > .glass::after{display:none!important}
  /* 去框后用间距和细线分出层次 */
  html[data-kz-theme] body.kz-libui .page > .glass > * + *{margin-top:18px}
  html[data-kz-theme] body.kz-libui .page > .glass .subj-tabs,
  html[data-kz-theme] body.kz-libui .page > .glass .stf{
    margin-bottom:2px}

  /* 列表行：原站 active/hover 是浅色硬编码，深色主题下会变白板 */
  html[data-kz-theme] body.kz-libui .rows .row.active,
  html[data-kz-theme] body.kz-libui .rows .row.on{
    background:var(--kz-surface-2)!important;border-color:var(--kz-line)!important}
  html[data-kz-theme] body.kz-libui .rows .row:hover{
    background:var(--kz-surface-3)!important;border-color:var(--kz-line-2)!important}
  html[data-kz-theme] body.kz-libui .rows .row.active:hover{
    background:var(--kz-surface-3)!important}

  /* ============ 板块与统计：整体放大一档 ============ */
  /* 卡片底框全透明，直接露出页面背景（客户 2026-11-05：底框全透明直接显示背景）
     注意只清容器本身，卡片里的按钮/输入框保持原样，否则控件会看不见 */
  html[data-kz-theme] body.kz-libui .page :is(.card,.pcard,.dcard),
  body.kz-libui .page :is(.card,.pcard,.dcard){
    background:none!important;background-image:none!important;
    border-color:transparent!important;box-shadow:none!important}
  html[data-kz-theme] body.kz-libui .page > .tabs{
    background:none!important;background-image:none!important;
    border-color:transparent!important;box-shadow:none!important;
    /* 同上：不要毛玻璃，让背景原样透出 */
    -webkit-backdrop-filter:none!important;backdrop-filter:none!important}
  body.kz-libui .page .pcard,
  body.kz-libui .page .gcard{
    border-radius:14px!important;
    padding:18px 20px!important}
  /* 卡片左上角那枚小图标是绝对定位的，顶部必须留出它的位置，否则会压住标题 */
  body.kz-libui .page .pcard{padding-top:46px!important}
  html[data-kz-theme] body.kz-libui .pcard .pi{
    left:20px!important;top:16px!important;
    width:24px;height:24px;min-width:24px;display:flex;align-items:center;justify-content:center;
    border-radius:7px;font-size:13px;line-height:1;box-sizing:border-box}
  body.kz-libui .page .pcard h3,
  body.kz-libui .page .gcard h3{font-size:17px!important}
  body.kz-libui .page .pcard .m,
  body.kz-libui .page .gcard .m{font-size:13px!important}

  body.kz-libui .page .dash .dcard b,
  body.kz-libui .page .dash2 .dcard b{font-size:34px!important;line-height:1.1}
  body.kz-libui .page .dash .dcard h4,
  body.kz-libui .page .dash2 .dcard h4{font-size:14.5px!important}
  body.kz-libui .page .dash .dcard span,
  body.kz-libui .page .dash2 .dcard span{font-size:13px!important}
  body.kz-libui .page .dash .dcard{padding:20px 22px!important}
  body.kz-libui .page .dash2 .dcard{padding:20px 22px!important}

  /* ============ 全局字号上调一档（标题 / 数字 / 按钮 / 列表） ============ */
  html[data-kz-theme] body.kz-libui .tabs .tab{font-size:14px!important}
  html[data-kz-theme] body.kz-libui .rows .row .c-t b{font-size:15.5px!important}
  html[data-kz-theme] body.kz-libui .rows .row .c-t em{font-size:12.5px!important}
  html[data-kz-theme] body.kz-libui .rows .row .c-stat b{font-size:14px!important}
  html[data-kz-theme] body.kz-libui .rows .row .c-stat em{font-size:10.5px!important}
  html[data-kz-theme] body.kz-libui .rows .row .go{font-size:13px!important;height:32px!important}
  html[data-kz-theme] body.kz-libui .page .pghd b{font-size:18px!important}
  html[data-kz-theme] body.kz-libui .page .pghd em{font-size:12.5px!important}
  html[data-kz-theme] body.kz-libui .page .pcard .pacts button{font-size:13px!important}
  html[data-kz-theme] body.kz-libui :is(.seg,.box,.sk){font-size:13px!important}
  html[data-kz-theme] body.kz-libui .ahd-btn.solid{height:38px!important;font-size:13.5px!important}
  html[data-kz-theme] body.kz-libui .goal-trigger{font-size:13px!important}
  html[data-kz-theme] body.kz-libui .kz-ps-in input{font-size:15px!important}

  @media (max-width:760px){
    body.kz-libui .page > .ahd{padding:2px 0 14px!important;gap:11px}
    html[data-kz-theme] body.kz-libui .page > .ahd .ahd-logo{width:66px!important;height:66px!important;border-radius:13px!important}
    html[data-kz-theme] body.kz-libui .page > .ahd .ahd-t b{font-size:19px!important}
    html[data-kz-theme] body.kz-libui .page > .ahd .ahd-t em{font-size:11.5px!important;letter-spacing:.1em!important}
    html[data-kz-theme] body.kz-libui .page > .ahd .ahd-sub{display:none!important}
    html[data-kz-theme] body.kz-libui .page > .tabs{padding:5px!important;gap:4px!important}
    html[data-kz-theme] body.kz-libui .page > .tabs .tab{height:38px!important;padding:0 12px!important;font-size:13.5px!important;gap:6px!important}
    html[data-kz-theme] body.kz-libui .page > .tabs .tab .ti{font-size:13.5px!important}
    /* 手机端科目行放不下就换行，搜索整行铺满 */
    html[data-kz-theme] body.kz-libui .page > .glass > .skills > .kz-ps{
      width:100%!important;margin:8px 0 0!important;order:9}
    html[data-kz-theme] body.kz-libui .page > .kz-ps{width:100%!important;margin:0 0 16px!important;
      position:static!important;top:auto!important;right:auto!important}
    body.kz-libui .page .dash .dcard b,
    body.kz-libui .page .dash2 .dcard b{font-size:28px!important}
  }
  /* ≤1180 收起副标题，把横向空间让给品牌名和右侧按钮
     （上面 .ahd-sub 是 flex!important，旧规则特异性不够压不住，这里用同等特异性覆盖） */
  @media (max-width:1180px){
    html[data-kz-theme] body.kz-libui .page > .ahd .ahd-sub{display:none!important}
    /* 副标题收了以后，让 .sp 重新撑开，右侧按钮才能靠右（否则一片空白挤在左边） */
    html[data-kz-theme] body.kz-libui .page > .ahd > .sp{
      flex:1 1 auto!important;width:auto!important;min-width:0!important}
  }
/* ===== kzWLibCss ===== */
  /* 客户 2026-11-06：写作页改成「左侧专辑 + 右侧分类卡片墙」。
     原站那套写作网格（.glass 里的 .wgrid）先整块藏掉，改由下面这套渲染，避免两套 UI 打架。 */
  body.kz-wlib .page > .glass{display:none!important}
  body.kz-wlib #kzLibList{display:none!important}

  #kzWLib{display:flex;gap:18px;align-items:flex-start;margin:2px 0 18px}

  /* —— 左：专辑 —— */
  .kz-wl-side{flex:0 0 226px;width:226px;display:flex;flex-direction:column;gap:9px}
  .kz-wl-side-t{font-size:12px;font-weight:700;letter-spacing:.08em;color:var(--kz-t3);padding:0 4px 2px}
  .kz-wl-g{
    display:flex;align-items:center;gap:11px;width:100%;text-align:left;cursor:pointer;
    padding:12px 13px;border-radius:14px;font:inherit;
    background:var(--kz-surface-2);border:1px solid var(--kz-line);color:var(--kz-t2);
    transition:background .16s ease,border-color .16s ease,color .16s ease;
  }
  .kz-wl-g:hover{background:var(--kz-surface-3);color:var(--kz-t1)}
  .kz-wl-g.on{background:var(--kz-acc-soft);border-color:var(--kz-acc-line);color:var(--kz-acc-text)}
  .kz-wl-gi{flex:none;width:30px;height:30px;border-radius:9px;display:grid;place-items:center;
    font-size:12px;font-weight:800;background:var(--kz-surface);border:1px solid var(--kz-line);color:var(--kz-t2)}
  .kz-wl-g.on .kz-wl-gi{background:var(--kz-acc-text);border-color:transparent;color:var(--kz-on-acc,#fff)}
  .kz-wl-gn{min-width:0}
  .kz-wl-gn b{display:block;font-size:13.5px;font-weight:700;color:var(--kz-t1);
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .kz-wl-g.on .kz-wl-gn b{color:var(--kz-acc-text)}
  .kz-wl-gn em{display:block;margin-top:2px;font-style:normal;font-size:11.5px;color:var(--kz-t3)}

  /* —— 右：分类 + 卡片 —— */
  .kz-wl-main{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;gap:12px}
  .kz-wl-bar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;min-height:34px}
  .kz-wl-cats{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
  /* 参考平台是「文字 + 数量」，选中态用下划线，不是胶囊按钮 */
  .kz-wl-c{
    display:inline-flex;align-items:baseline;gap:6px;height:28px;padding:0 2px 6px;
    border:0;border-bottom:2px solid transparent;border-radius:0;background:none;
    color:var(--kz-t2);font:inherit;font-size:13px;font-weight:600;cursor:pointer;white-space:nowrap;
    transition:color .16s ease,border-color .16s ease;
  }
  .kz-wl-c:hover{color:var(--kz-t1)}
  /* 全站 UX 层给所有 button 加了 hover 上浮 1px；分类/分组按钮很矮，鼠标停在边缘时
     会「浮起来→离开→落回去」无限循环，看起来就是一直闪。这里把这两类按钮的位移关掉。 */
  #kzWLib .kz-wl-c:hover,#kzWLib .kz-wl-c:active,
  #kzWLib .kz-wl-g:hover,#kzWLib .kz-wl-g:active{transform:none!important}
  .kz-wl-c em{font-style:normal;font-size:11px;color:var(--kz-t3);font-variant-numeric:tabular-nums;font-weight:500}
  .kz-wl-c.on{color:var(--kz-acc-text);border-bottom-color:var(--kz-acc-text);background:none}
  .kz-wl-c.on em{color:var(--kz-acc-text);opacity:.75}
  .kz-wl-note{margin-left:auto;display:flex;align-items:center;gap:8px;font-size:12px;color:var(--kz-t3);
    min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .kz-wl-note b{color:var(--kz-acc-text);font-weight:700;cursor:pointer}
  .kz-wl-note .kz-wl-tip{cursor:default;font-weight:600;opacity:.9}
  .kz-wl-note b:hover{text-decoration:underline}

  .kz-wl-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(198px,1fr));gap:14px}
  .kz-wl-card{
    display:flex;flex-direction:column;align-items:stretch;gap:9px;text-align:left;cursor:pointer;
    padding:10px;border-radius:14px;font:inherit;
    background:var(--kz-surface);border:1px solid var(--kz-line);
    transition:transform .18s ease,border-color .18s ease,box-shadow .18s ease;
  }
  .kz-wl-card:hover{transform:translateY(-2px);border-color:var(--kz-acc-line);
    box-shadow:0 18px 34px -28px var(--kz-acc2)}
  .kz-wl-thumb{
    display:block;position:relative;border-radius:10px;overflow:hidden;
    background:#fff;border:1px solid rgba(20,26,40,.08);aspect-ratio:16/10;
  }
  .kz-wl-thumb .kz-wl-svg{display:block;width:100%;height:100%}
  /* PDF 导入的图片题：整张图缩进缩略框，别按原始像素撑爆 */
  .kz-wl-thumb .kz-wl-img{display:block;width:100%;height:100%;object-fit:contain;background:#fff}
  .kz-wl-fig{position:absolute;inset:0;background:#f5f6fa}
  .kz-wl-blank{position:absolute;inset:0;display:grid;place-items:center;
    font-size:13px;font-weight:800;letter-spacing:.06em;color:#7a72b8;
    background:radial-gradient(120% 100% at 50% 0%,#f7f5ff 0%,#efedfb 100%)}
  /* 大作文封面卡（客户 2026-11-08）：缩略图里不再写「议论文」，直接放这道题的题名，
     底色按主题换色相（健康偏绿、家庭偏粉、科技偏蓝…），首字做一层大水印压底。
     题名带括号的（如「教育观点题（线上教学）」）拆成主标题 + 小字副题，两行更整齐。 */
  .kz-wl-poster{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;
    justify-content:center;gap:2px;padding:10px 12px;text-align:center;overflow:hidden}
  .kz-wl-poster b{position:relative;font-weight:800;letter-spacing:.03em;line-height:1.28;
    text-shadow:0 1px 0 hsla(0,0%,100%,.6);word-break:break-word}
  .kz-wl-poster em{position:relative;font-style:normal;font-size:10px;font-weight:700;
    letter-spacing:.04em;line-height:1.25;opacity:.92}
  .kz-wl-poster .kz-wl-wm{position:absolute;right:-6px;bottom:-26px;font-style:normal;
    font-size:74px;font-weight:800;line-height:1;opacity:.13;pointer-events:none;user-select:none}
  .kz-wl-poster .kz-wl-kind{position:absolute;left:11px;top:9px;font-size:8.5px;font-weight:800;
    letter-spacing:.18em;opacity:.5;line-height:1}
  .kz-wl-card.is-essay .kz-wl-pill{display:none}
  .kz-wl-tbl{width:100%;height:100%;border-collapse:collapse;table-layout:fixed;font-size:9px;color:#3f4759}
  .kz-wl-tbl th{background:#eef1f8;color:#4b5468;font-weight:700}
  .kz-wl-tbl th,.kz-wl-tbl td{padding:3px 4px;border:1px solid #e3e7f0;text-align:left;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  /* 参考平台：缩略图下面先是橙色中文标签，再一行灰字题面 */
  .kz-wl-pill{display:inline-block;align-self:flex-start;margin:2px 0 0;padding:1px 8px;
    border-radius:5px;font-size:11.5px;font-weight:700;line-height:18px;
    color:#c2410c;background:rgba(234,88,12,.10);border:1px solid rgba(234,88,12,.35)}
  html[data-kz-theme="neon"] .kz-wl-pill,
  html[data-kz-theme="tokyo"] .kz-wl-pill,
  html[data-kz-theme="celestial"] .kz-wl-pill,
  html[data-kz-theme="mocha"] .kz-wl-pill{color:#ffb27a;background:rgba(234,88,12,.16);border-color:rgba(255,178,122,.4)}
  .kz-wl-t{display:block;font-size:12px;line-height:1.5;font-weight:500;color:var(--kz-t3);
    display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden}
  .kz-wl-sec{display:flex;align-items:baseline;gap:8px;margin:2px 0 2px}
  .kz-wl-sec b{font-size:14px;font-weight:800;color:var(--kz-t1)}
  .kz-wl-sec em{font-style:normal;font-size:12px;color:var(--kz-t3)}
  .kz-wl-empty{grid-column:1/-1;padding:40px 16px;text-align:center;color:var(--kz-t3);font-size:13px;
    border:1px dashed var(--kz-line);border-radius:14px}
  .kz-wl-empty a{color:var(--kz-acc-text);font-weight:700;text-decoration:none}

  @media (max-width:980px){
    #kzWLib{flex-direction:column;gap:12px}
    .kz-wl-side{flex:none;width:100%;flex-direction:row;overflow-x:auto;padding-bottom:2px}
    .kz-wl-side-t{display:none}
    .kz-wl-g{flex:0 0 auto;width:auto;min-width:180px}
    .kz-wl-main{width:100%}
  }
  @media (max-width:640px){
    .kz-wl-grid{grid-template-columns:repeat(auto-fill,minmax(158px,1fr));gap:10px}
    .kz-wl-note{display:none}
    .kz-wl-t{font-size:12.5px}
  }
/* ===== kzWExamCss ===== */
  /* 客户 2026-11-06：写作答题页按参考图排成机考样子：
     顶部指令条 / 左题面+图表 / 右作答区 / 底部 Part + Finish section + Exit */
  body.kz-wexam .ex{background:#fff}
  body.kz-wexam .ex .kz-frame{display:none!important}
  body.kz-wexam .ex .kz-partbar{display:none!important}
  /* 顶栏只留 IELTS 标识 + 考号 + 计时（Task 1 那截跟底部条重复） */
  body.kz-wexam .ex-hd .hd-unit{display:none!important}

  /* 参考平台：指令条两行 —— 第一行 Part N，第二行 You should spend about… */
  .kz-wbar{
    display:block;
    margin:10px 16px 0;padding:9px 16px;border-radius:8px;
    background:#f5f6f9;border:1px solid #e7e9f0;
    font-size:13px;line-height:1.65;color:#475467;
  }
  .kz-wbar b{display:block;color:#101828;font-weight:800;margin-bottom:1px}
  .kz-wbar span{display:block;color:#475467}
  /* 回顾页：Task 1 和题目排在同一行（客户 2026-11-08），不再上下两行 */
  .kz-wbar.kz-wbar-rev{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 10px;padding:10px 16px}
  .kz-wbar-rev b{display:inline;margin:0;font-size:13.5px;white-space:nowrap}
  .kz-wbar-rev .kz-wbar-tag{display:inline-block;font-style:normal;font-size:11px;font-weight:700;
    line-height:18px;padding:0 8px;border-radius:6px;color:#4338ca;background:#eef0fe;
    border:1px solid #d9dcfb;white-space:nowrap}
  .kz-wbar-rev .kz-wbar-p{display:inline;flex:1 1 420px;min-width:240px;font-size:13px;
    line-height:1.75;color:#344054}
  .kz-wbar-rev .kz-wbar-meta{margin-left:auto;font-style:normal;font-size:11.5px;color:#98a2b3;white-space:nowrap}

  /* 客户 2026-11-08：这一页「框」太多 —— 参照阅读答题页，只留左右两栏 + 一条细分隔线，
     题面 / 图表 / 作答区都不再各自套一层盒子。 */
  body.kz-wexam .ex-body.split.wr{margin:0!important;border:0!important;
    border-radius:0!important;background:#fff!important;overflow:visible}
  body.kz-wexam .ex-body.split.wr .doccol{padding:22px 30px 28px!important;border-right:1px solid #eef0f4}
  body.kz-wexam .ex-body.split.wr .part-tabs{
    display:flex;gap:8px;margin:0 0 14px!important;padding:0!important;
    position:static!important;background:transparent!important;border:0!important}
  body.kz-wexam .ex-body.split.wr .part-tabs button{
    height:30px!important;padding:0 12px!important;border-radius:8px!important;
    border:1px solid #e2e6ef!important;background:#fff!important;color:#475467!important;
    font-size:12.5px!important;font-weight:700!important}
  body.kz-wexam .ex-body.split.wr .part-tabs button.on{
    background:#eef0fe!important;border-color:#d9dcfb!important;color:#4338ca!important}
  body.kz-wexam .ex-body.split.wr .part-tabs button em{font-style:normal;opacity:.75;margin-left:4px}

  body.kz-wexam .prompt-hd{margin:0 0 12px!important;gap:10px}
  body.kz-wexam .prompt-hd .pill{
    font-size:11.5px!important;font-weight:700;padding:3px 9px!important;border-radius:6px!important;
    background:#eef0fe!important;color:#4338ca!important;border:1px solid #d9dcfb!important}
  body.kz-wexam .prompt-hd .pw{font-size:12px!important;color:#98a2b3!important}
  body.kz-wexam .prompt-t{
    margin:0 0 14px!important;font-size:calc(15px * var(--kz-ts, 1))!important;line-height:1.75!important;
    font-weight:700!important;color:#101828!important}
  body.kz-wexam .ex-body.split.wr .chart{
    margin:2px 0 0!important;padding:0!important;border:0!important;
    border-radius:0!important;background:transparent!important;box-shadow:none!important}
  body.kz-wexam .chart .ch-title{font-size:12.5px!important;font-weight:800;color:#344054!important;margin-bottom:8px}
  body.kz-wexam .chart .bar-g em{font-size:10.5px!important;color:#8b93a4!important}
  body.kz-wexam .chart .bar em{font-size:10px!important;color:#667085!important}
  body.kz-wexam .chart .legend span{font-size:11px!important;color:#667085!important}

  /* 题面里的图表也别再套白卡片边框（阅读页的图都是净图） */
  body.kz-wexam .ex-body.split.wr .kz-wfig img{border:0!important;border-radius:0!important;background:transparent!important}
  body.kz-wexam .ex-body.split.wr .kz-wfig-open{font-size:11.5px!important;color:#4f46e5!important}
  /* 右栏：作答区（不要输入框的边框，直接写在纸面上，和阅读页一致） */
  body.kz-wexam .ex-body.split.wr .edcol{padding:22px 26px 16px!important;background:#fff}
  body.kz-wexam .ex-body.split.wr .edcol .ed-hd{display:none!important}
  body.kz-wexam .ex-body.split.wr textarea.editor{
    width:100%!important;min-height:calc(100vh - 330px)!important;height:auto!important;
    padding:0!important;border:0!important;border-radius:0!important;background:transparent!important;
    color:#101828!important;font-size:calc(14.5px * var(--kz-ts, 1))!important;line-height:1.85!important;
    resize:none!important;box-shadow:none!important;outline:0!important}
  body.kz-wexam .ex-body.split.wr textarea.editor:focus{
    border:0!important;box-shadow:none!important;outline:0!important}
  /* 底部统计只留字数：段落/句数/平均句长这些在「写」的时候是噪音 */
  body.kz-wexam .ex-body.split.wr .ed-ft{
    display:flex;align-items:center;justify-content:flex-end!important;gap:0!important;
    margin-top:10px!important;font-size:11.5px!important;color:#98a2b3!important;
    border:0!important;padding:0!important}
  body.kz-wexam .ex-body.split.wr .ed-ft > *:not(.wc){display:none!important}
  body.kz-wexam .ex-body.split.wr .ed-ft .wc{margin-left:auto!important;color:#475467!important;font-weight:700}
  body.kz-wexam .ex-body.split.wr .ed-ft .wc::before{
    content:"Word count: ";color:#98a2b3;font-weight:600}

  /* 计时：参考平台是「剩余时间倒计时」，原站写作页给的是「用时」在涨，
     这里把它藏掉，自己按每道题的建议时长倒计时（暂停时冻住）。 */
  body.kz-wexam .ex-hd .hd-timer > b:not(.kz-wclock){display:none!important}
  body.kz-wexam .ex-hd .hd-timer > .tl:not(.kz-wlbl){display:none!important}
  body.kz-wexam .ex-hd .hd-timer{font-variant-numeric:tabular-nums}
  .kz-wclock{font-weight:800}

  /* 底部只留操作按钮（客户 2026-11-08：Part 徽标 + 「Writing 题库 · 页面状态正常」整条删掉） */
  .kz-wfoot{
    display:flex;align-items:center;gap:14px;margin:2px 30px 18px;padding:0;
    background:transparent;border:0;border-radius:0;font-size:12.5px;color:#475467}
  .kz-wf-btns{margin-left:auto;display:flex;align-items:center;gap:10px}
  .kz-wf-btns button{height:30px;padding:0 14px;border-radius:8px;font-size:12.5px;font-weight:700;cursor:pointer}
  .kz-wf-fin{background:#4338ca;border:1px solid #4338ca;color:#fff}
  .kz-wf-fin:hover{filter:brightness(1.06)}
  .kz-wf-exit{background:#fff;border:1px solid #e2e6ef;color:#475467}

  /* ===== AI 写作批改弹窗（客户 2026-11-06）=====
     考试页本身是白底（机考样式），弹窗也走白底，别跟着站点深色主题漂。 */
  .kz-gr-mask{position:fixed;inset:0;z-index:9998;display:flex;align-items:center;justify-content:center;
    padding:20px;background:rgba(15,23,42,.55);backdrop-filter:blur(2px)}
  .kz-gr{width:min(780px,94vw);max-height:88vh;display:flex;flex-direction:column;background:#fff;
    border-radius:16px;box-shadow:0 28px 70px rgba(15,23,42,.35);color:#101828;font-size:13.5px;overflow:hidden}
  .kz-gr-hd{display:flex;align-items:center;gap:10px;padding:14px 18px;border-bottom:1px solid #eef0f5}
  .kz-gr-hd b{font-size:15px;font-weight:800}
  .kz-gr-hd em{font-style:normal;font-size:12px;color:#667085;font-weight:600}
  .kz-gr-x{margin-left:auto;width:28px;height:28px;border:1px solid #e8ebf2;background:#f8f9fc;border-radius:8px;
    color:#475467;font-size:15px;line-height:1;cursor:pointer}
  .kz-gr-body{padding:16px 18px;overflow:auto}
  .kz-gr-ft{display:flex;align-items:center;gap:10px;padding:12px 18px;border-top:1px solid #eef0f5;background:#fcfcfe}
  .kz-gr-ft .sp{flex:1 1 auto}
  .kz-gr-btn{height:32px;padding:0 16px;border-radius:8px;font-size:12.5px;font-weight:700;cursor:pointer;
    border:1px solid #e2e6ef;background:#fff;color:#475467}
  .kz-gr-btn.primary{background:#4338ca;border-color:#4338ca;color:#fff}
  .kz-gr-btn.primary:hover{filter:brightness(1.06)}
  .kz-gr-btn:disabled{opacity:.6;cursor:default}
  .kz-gr-hint{color:#475467;line-height:1.85;font-size:13px}
  .kz-gr-hint b{color:#101828}
  .kz-gr-warn{margin-top:10px;padding:8px 10px;border-radius:8px;background:#fffaeb;border:1px solid #fdecc8;color:#b54708;font-size:12.5px}
  .kz-gr-load{display:flex;flex-direction:column;align-items:center;gap:12px;padding:36px 10px;color:#475467}
  .kz-gr-spin{width:26px;height:26px;border-radius:50%;border:3px solid #e4e7f0;border-top-color:#4338ca;animation:kz-gr-spin .9s linear infinite}
  @keyframes kz-gr-spin{to{transform:rotate(360deg)}}
  .kz-gr-top{display:flex;align-items:flex-end;gap:14px;padding:2px 0 12px;border-bottom:1px dashed #eef0f5}
  .kz-gr-band{font-size:42px;line-height:.95;font-weight:900;color:#4338ca}
  /* 9 分范文（PDF 导入的写作题，交卷批改后展示） */
  .kz-gr-sam{margin:2px 0 4px}
  .kz-gr-sam summary{cursor:pointer;font-size:13px;color:#4f46e5;padding:6px 0;list-style:none}
  .kz-gr-sam summary::-webkit-details-marker{display:none}
  .kz-gr-sam summary::before{content:'▸ ';font-size:12px}
  .kz-gr-sam[open] summary::before{content:'▾ '}
  .kz-gr-samtxt{margin-top:8px;padding:12px 14px;background:#f7f9fc;border:1px solid #e6ebf2;
    border-radius:10px;font-size:13.5px;line-height:1.85;color:#344054}
  .kz-gr-samtxt p{margin:0 0 10px}
  .kz-gr-samtxt p:last-child{margin-bottom:0}
  /* 图片型图表：PDF 导入的 Task 1（饼图/地图/流程图用数据画不出来） */
  .kz-wfig{margin:14px 0 4px;max-width:560px}
  .kz-wfig img{display:block;width:100%;height:auto;border:1px solid #e3e8ef;border-radius:10px;background:#fff}
  .kz-wfig-open{display:inline-block;margin-top:6px;font-size:12px;color:#4f46e5;text-decoration:none}
  .kz-wfig-open:hover{text-decoration:underline}
  @media (max-width:760px){.kz-wfig{max-width:100%}}
  /* ===== kzWRevCss ===== */
  /* 作文回顾（客户 2026-11-08）：左边题目+图表（和答题页一样），右上满分范文、右下自己写的，
     中间一根上下拖拉条（同阅读答案页的 ⇕ 手柄）。原来的「题目原文」折叠块被拆进左栏。 */
  .ex-body.rev .revwrap.kz-wrev-on{
    max-width:none;width:100%;height:100%;margin:0;padding:12px 14px 14px;
    display:flex;min-height:0;overflow:hidden;
  }
  .kz-wrev{flex:1;display:grid;grid-template-columns:minmax(0,1.05fr) minmax(0,1fr);
    gap:14px;min-height:0;min-width:0}
  .kz-wrev-l,.kz-wrev-r{min-width:0;min-height:0;display:flex;flex-direction:column;overflow:hidden}
  .kz-wrev-l{background:var(--paper,#fff);border:1px solid var(--line,#e7eaf3);border-radius:10px}
  .kz-wrev-r{gap:0}
  /* 客户 2026-11-09：左栏永远是「题目」——大作文没有图表也要留着，不能把整栏收掉
     （收掉之后范文和自己的作文各占一整行，看着就不像作文页了）。
     旧的那行「Task 1 图表描述 我的 0 词 范文 165 词 建议 ≥ 150」仍然不显示，
     Task / 题型 / 建议 都在顶栏，这里只留一个「题目」小标题 + 题面 + 图表。 */
  .kz-wrev-lhd{display:flex;align-items:center;gap:8px;flex:none;
    padding:12px 14px 0;font-size:12.5px;font-weight:800;color:var(--ink,#101828)}
  .kz-wrev-lhd .cmp-hd{display:none!important}
  .kz-wrev-lbody{flex:1;min-height:0;overflow:auto;padding:8px 14px 14px}
  .kz-wrev-p{margin:0;font-size:calc(13.5px * var(--read-scale,1));line-height:1.85;
    color:var(--t1,#101828);white-space:pre-wrap}
  .kz-wrev-p:empty{display:none}
  /* 大作文没有图表：只是左右比例调整，左栏（题目）照旧显示 */
  .kz-wrev.kz-wrev-nol{grid-template-columns:minmax(0,.82fr) minmax(0,1.18fr)}
  .kz-wrev-fig{margin:12px 0 0}
  .kz-wrev-fig img{display:block;width:100%;height:auto;border:1px solid var(--line2,#eef1f6);
    border-radius:8px;background:#fff}
  .kz-wrev-fig a{display:inline-block;margin-top:8px;font-size:11.5px;font-weight:700;
    color:var(--pri,#4f46e5);text-decoration:none}
  .kz-wrev-fig a:hover{text-decoration:underline}
  .kz-wrev-figl{font-size:12px;color:var(--mut,#8b93a4)}
  .kz-wrev-pane{min-height:0;overflow:auto;background:var(--paper,#fff);
    border:1px solid var(--line,#e7eaf3);border-radius:10px}
  .kz-wrev-pane.model{flex:0 0 var(--kz-wh,50%)}
  .kz-wrev-pane.mine{flex:1 1 0}
  .kz-wrev-pane .col{padding:12px 14px 14px!important}
  .kz-wrev-pane .col.mine{border-right:0!important;background:transparent!important}
  .kz-wrev-pane .col.model{background:transparent!important}
  /* 正文不再套一层带边框的盒子：面板自己就是盒子，文字从上往下流，滚动交给面板 */
  .kz-wrev-pane .text{max-height:none!important;background:transparent!important;
    border:0!important;border-radius:0!important;padding:0!important;margin:0 0 12px!important;
    font-size:calc(13px * var(--read-scale,1))!important}
  .kz-wrev-bar{position:relative;flex:none;height:12px;margin:6px 0;border-radius:6px;
    background:var(--line2,#e6eaf3);cursor:row-resize;transition:background-color .12s ease}
  .kz-wrev-bar::after{content:"⇕";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);
    width:30px;height:16px;border-radius:5px;background:#fff;border:1px solid var(--line,#dfe4ee);
    box-shadow:0 1px 2px rgba(28,33,48,.18);
    color:var(--ink3,#6b7280);font-size:11px;line-height:14px;text-align:center}
  .kz-wrev-bar:hover,.kz-wrev-bar:active{background:var(--pri,#4f46e5)}
  @media (max-width:900px){
    .ex-body.rev .revwrap.kz-wrev-on{padding:10px;overflow:auto;display:block}
    /* 选择器要和桌面端的 .kz-wrev.kz-wrev-nol 同权重，否则窄屏还分成两栏（文字被挤成一条） */
    .kz-wrev,.kz-wrev.kz-wrev-nol{grid-template-columns:1fr;grid-template-rows:auto auto;gap:12px}
    /* 手机上别在每块里面再套一层滚动条：三块按内容高度排开，整页往下滚 */
    .kz-wrev-l{max-height:none}
    .kz-wrev-pane.model{flex:0 0 auto;max-height:none}
    .kz-wrev-pane.mine{flex:0 0 auto;max-height:none}
    .kz-wrev-bar{display:none}
  }
  .kz-gr-band span{font-size:13px;font-weight:700;color:#98a2b3;margin-left:2px}
  .kz-gr-top em{font-style:normal;font-size:12px;color:#667085;line-height:1.7}
  .kz-gr-sec{margin-top:16px}
  .kz-gr-sec>h4{margin:0 0 8px;font-size:12.5px;font-weight:800;color:#344054}
  .kz-gr-crit{display:grid;grid-template-columns:128px 46px 1fr;gap:10px;align-items:start;
    padding:9px 0;border-bottom:1px solid #f4f6fa}
  .kz-gr-crit:last-child{border-bottom:0}
  .kz-gr-crit b{font-size:12.5px;color:#101828}
  .kz-gr-crit i{font-style:normal;font-weight:900;color:#4338ca;font-size:14px}
  .kz-gr-crit p{margin:0;color:#475467;line-height:1.7;font-size:12.5px}
  .kz-gr-p{margin:0 0 8px;color:#344054;line-height:1.8}
  .kz-gr-li{margin:0 0 6px;padding-left:16px;color:#344054;line-height:1.7;position:relative}
  .kz-gr-li::before{content:"";position:absolute;left:4px;top:9px;width:5px;height:5px;border-radius:50%;background:#b9c0ff}
  .kz-gr-fix{padding:8px 10px;border-radius:8px;background:#f8f9fc;border:1px solid #eef0f5;margin-bottom:8px;line-height:1.7}
  .kz-gr-fix s{color:#b42318;text-decoration-color:rgba(180,35,24,.35)}
  .kz-gr-fix u{color:#027a48;text-decoration-color:rgba(2,122,72,.35)}
  .kz-gr-fix em{font-style:normal;display:block;margin-top:3px;color:#667085;font-size:12px}
  .kz-gr-err{padding:10px 12px;border-radius:8px;background:#fef3f2;border:1px solid #fee4e2;color:#b42318;line-height:1.7}
  @media (max-width:560px){
    .kz-gr-mask{padding:10px}
    .kz-gr{max-height:92vh;border-radius:14px;font-size:13px}
    .kz-gr-hd{padding:12px 14px}
    .kz-gr-body{padding:12px 14px}
    .kz-gr-ft{padding:10px 14px;gap:8px}
    .kz-gr-band{font-size:34px}
    .kz-gr-crit{grid-template-columns:1fr 40px;grid-template-areas:"l s" "c c";row-gap:4px}
    .kz-gr-crit b{grid-area:l}
    .kz-gr-crit i{grid-area:s;text-align:right}
    .kz-gr-crit p{grid-area:c}
  }
  .kz-wf-exit:hover{background:#f7f8fb}
  @media (max-width:760px){
    .kz-wbar{margin:8px 10px 0}
    body.kz-wexam .ex-body.split.wr{margin:8px 10px 0!important}
    .kz-wfoot{margin:2px 16px 16px;flex-wrap:wrap;gap:8px}
    body.kz-wexam .ex-body.split.wr textarea.editor{min-height:46vh!important}
  }
/* ===== kzOptCss ===== */
  /* 客户 2026-11-07 20:40：选择题点选后只有 15px 的小圆点变色，整行几乎看不出变化，
     鼠标一挪开就不知道选了哪个（复盘态的红/绿不受影响）。
     这里给「作答中已选中」补一条常驻整行高亮：浅蓝底 + 细边框 + 文字加粗。 */
  .q .opt.on:not(.right):not(.wrong):not(.hit){
    background:rgba(42,85,188,.11);
    border-color:rgba(42,85,188,.40)}
  .q .opt.on:not(.right):not(.wrong):not(.hit) .t{font-weight:600}
  .q .opt.on:not(.right):not(.wrong):not(.hit):hover{
    background:rgba(42,85,188,.17);
    border-color:rgba(42,85,188,.55)}
  /* 键盘 Tab 过去也要能看出焦点（点击时不加外框，避免鼠标用户觉得脏） */
  .q .opt:focus-visible{outline:2px solid rgba(42,85,188,.55);outline-offset:2px}
/* ===== kzLmapCss ===== */
  /* 听力地图题：原站不渲染题面图，这里补一张（客户 2026-11-06 第二批听力） */
  .kz-lfig{margin:0 auto 16px;max-width:620px;padding:8px;border:1px solid #e7e9f0;border-radius:12px;background:#fff}
  .kz-lfig img{display:block;width:100%;height:auto;border-radius:6px}
  .kz-lfig figcaption{margin-top:6px;font-size:12px;color:#667085;text-align:center}
  @media (max-width:760px){.kz-lfig{max-width:100%;padding:6px}}
/* ===== kzNoDictCss ===== */
  /* 客户 2026-11-06：录音稿不要「逐句听写」了 —— 输入框、得分、再听全部去掉；
     切到「隐藏原文」时这一句就留一块空白（还能播、还能点句子跳转）。 */
  .tr-line.dict{padding:2px 0 !important;min-height:9px;border:0 !important;background:none !important}
  .tr-line.dict .dict-in,
  .tr-line.dict .dict-sc,
  .tr-line.dict .dict-replay,
  .tr-line.dict > span{display:none !important}
/* ===== kzBuildCss ===== */
  /* 新老版本冲突（客户 2026-11-07 反馈「所有页面都有」）：
     老标签页不会自己更新，跑的是旧壳层，界面就跟刚刷新的人对不上。
     做法照业界通用方案（入口不缓存 + 版本号轮询 + chunk 失败自愈 + 多标签同步）：
       - /api/version 每 30s 查一次，切回标签页也查
       - 发现新版本：非答题页自动刷新（倒计时可取消），答题页只提示不打断
       - BroadcastChannel 让同一浏览器的所有标签一起切版本
       - 动态 chunk 加载失败（Loading chunk / dynamically imported module）自动刷一次 */
  #kzNewBar{position:fixed;left:50%;transform:translateX(-50%);bottom:18px;z-index:99999;
    display:none;align-items:center;gap:10px;max-width:92vw;padding:11px 15px;border-radius:12px;
    background:var(--kz-surface,#fff);border:1px solid var(--kz-line,#e4e8f0);
    box-shadow:0 14px 34px -12px rgba(15,23,42,.5);color:var(--kz-t1,#1c2130);
    font-size:13px;font-weight:600;line-height:1.45}
  #kzNewBar.on{display:flex}
  #kzNewBar b{font-weight:800}
  #kzNewBar span{color:var(--kz-t2,#41506b);font-weight:600}
  #kzNewBar button{height:29px;padding:0 13px;border-radius:8px;border:0;cursor:pointer;
    background:var(--kz-acc,#4f46e5);color:#fff;font:inherit;font-size:12.5px;font-weight:700}
  #kzNewBar i{font-style:normal;font-size:12px;color:var(--kz-t3,#7b8494);cursor:pointer;padding:2px 4px}
  @media (max-width:520px){#kzNewBar{left:8px;right:8px;transform:none;max-width:none;font-size:12px}}
/* ===== kzFix3Css ===== */
  /* 客户 2026-11-05（三条一起提的） */
  /* 1) 首页各模块恢复玻璃背板：.glass 的背景此前丢了，Part 卡片/最近练习/周统计全裸在背景上。
        原规则写在 kzTheme 里但没进 CSSOM（被丢弃），这里用最朴素的后代选择器重新写一遍。 */
  html[data-kz-theme] body.kz-libui .page > .glass,
  html[data-kz-theme] body.kz-libui .page > .glass.lib{
    background:var(--kz-surface)!important;
    border:1px solid var(--kz-line)!important;
    box-shadow:inset 0 1px 0 var(--kz-line-2),var(--kz-shadow)!important;
  }
  /* 1b) 首页下面那几块统计（本周练习 / 待复习错题 / 薄弱题型 / 近 7 天节奏 / 科目进度）
        用的是 .dcard，原来只给 5% 白（--kz-surface-2），在浅色主题上几乎看不见 → 也换成实心玻璃背板 */
  html[data-kz-theme] body.kz-libui .page > :is(.dash,.dash2) > .dcard{
    background:var(--kz-surface)!important;
    border:1px solid var(--kz-line)!important;
    box-shadow:inset 0 1px 0 var(--kz-line-2),var(--kz-shadow)!important;
    border-radius:16px!important;
  }
  /* 1c) Part 1/2/3/4 卡片：之前完全裸在玻璃背板上（同 .glass 的问题，规则没进 CSSOM）。
        给每块单独的浅色卡面 + 悬停上浮，四个 Part 才像四张卡而不是四列文字 */
  html[data-kz-theme] body.kz-libui .page > .glass .cards > .pcard{
    background:var(--kz-surface-2)!important;
    border:1px solid var(--kz-line)!important;
    border-radius:16px!important;
    box-shadow:inset 0 1px 0 var(--kz-line-2)!important;
    transition:background .18s ease,border-color .18s ease,transform .18s ease,box-shadow .18s ease;
  }
  html[data-kz-theme] body.kz-libui .page > .glass .cards > .pcard:hover{
    background:var(--kz-surface-3)!important;
    border-color:var(--kz-acc-line)!important;
    transform:translateY(-2px);
    box-shadow:inset 0 1px 0 var(--kz-line-2),0 18px 34px -26px var(--kz-acc2)!important;
  }
  html[data-kz-theme] body.kz-libui .page > .glass .cards > .pcard .pi{
    border-radius:9px!important;
    background:linear-gradient(135deg,var(--kz-acc),var(--kz-acc2))!important;
    color:var(--kz-on-acc,#fff)!important;
    box-shadow:0 8px 16px -10px var(--kz-acc2);
  }
  /* 1d) 顶部导航条：加一条玻璃背板，把七个页签收进一个胶囊（客户 2026-11-05） */
  html[data-kz-theme] body.kz-libui .page > .tabs{
    background:var(--kz-surface)!important;
    border:1px solid var(--kz-line)!important;
    border-radius:16px!important;
    box-shadow:inset 0 1px 0 var(--kz-line-2),0 18px 40px -34px rgba(0,0,0,.6)!important;
  }
  /* 1e) 首页内容容器：之前圆角 0、padding 0，四角尖且内容贴着边框 → 给圆角 + 内边距。
         注意同一个容器在「科目页签 + 有题库」时会多一个 .lib 类（原站题库视图），
         旧规则 `body.kz-libui .glass.lib{padding:0!important}` 会把它压平，所以这里不加 :not(.lib)，
         靠更高的特异性统一覆盖。 */
  html[data-kz-theme] body.kz-libui .page > .glass{
    border-radius:18px!important;
    padding:14px 16px 16px!important;
  }
  /* 1f) 科目页签下的搜索框：原站把它绝对定位（top/left 写死像素）浮在导航条和内容容器之间，
         加了背板之后看起来像从卡片外面粘上来，右侧还溢出圆角。改成正常文档流 + 右对齐，
         单独占一行、落在导航条下方（客户 2026-11-05 截图反馈"除了主页其他都是这样"）。
         注意只选 `.page` 的直接子元素：总览页那个搜索框已经被 kzNavRow 搬进 .glass > .skills，不受影响。 */
  html[data-kz-theme] body.kz-libui .page > .kz-ps{
    position:relative!important;
    left:auto!important;right:auto!important;top:auto!important;bottom:auto!important;
    width:340px!important;
    margin:14px 0 0 auto!important;
  }
  /* 1g) 搜索框挂进标题行（.g-hd）后：跟「听力题库 · Part 1 · 2 套」同一行、靠右、垂直居中，
         高度收一点免得把标题行撑太高（客户 2026-11-05 要求与标题平行，各科目页签一致） */
  html[data-kz-theme] body.kz-libui .page > .glass > .g-hd{
    display:flex!important;align-items:center!important;gap:10px!important;flex-wrap:wrap!important;
  }
  html[data-kz-theme] body.kz-libui .page > .glass > .g-hd > .kz-ps{
    position:relative!important;
    left:auto!important;right:auto!important;top:auto!important;bottom:auto!important;
    margin:0 0 0 auto!important;
    width:300px!important;flex:0 0 auto!important;
  }
  html[data-kz-theme] body.kz-libui .page > .glass > .g-hd > .kz-ps .kz-ps-in{
    height:36px!important;
  }
  @media (max-width:760px){
    html[data-kz-theme] body.kz-libui .page > .glass > .g-hd > .kz-ps{
      width:100%!important;margin:8px 0 0!important;
    }
  }
  /* 1h) 题库列表行：原站每套题一个独立的圆角块（还有 2px 间距），连着几套就看不清是一列列表。
         改成「连续列表 + 行分隔线」，悬停才亮起（客户 2026-11-05：每套都带框难以分辨） */
  html[data-kz-theme] body.kz-libui .page > .glass .rows{
    display:flex!important;flex-direction:column!important;gap:0!important;
  }
  html[data-kz-theme] body.kz-libui .page > .glass .rows > .row{
    background:transparent!important;
    border:0!important;
    border-bottom:1px solid var(--kz-line)!important;
    border-radius:0!important;
    box-shadow:none!important;
    transition:background .16s ease;
  }
  html[data-kz-theme] body.kz-libui .page > .glass .rows > .row:last-child{
    border-bottom:0!important;
  }
  html[data-kz-theme] body.kz-libui .page > .glass .rows > .row:hover{
    background:var(--kz-surface-2)!important;
    border-radius:10px!important;
  }
  /* 1i) 总览页标题行右侧那三个按钮（继续上次 / 练习记录 / 浏览题库）去掉。
         ⚠️ 必须用 CSS，不能像第一版那样在 MutationObserver 里反复设 style.display：
         Vue 每次重渲染都会重建这几个 button（inline style 丢失）→ 脚本异步再隐藏，
         中间的几十毫秒按钮可见，重渲染一频繁就"一跳一跳"。CSS 是元素一出生就生效，没有中间态。
         区分方式：科目页签的标题行首元素是 b.kz-lib-t，总览页的不是（两边按钮都叫 .chip，不能按类名挑） */
  html[data-kz-theme] body.kz-libui.kz-overview .page > .glass > .g-hd > button.chip{
    display:none!important;
  }
  /* 1j) 客户 2026-11-05：总览页「▮ 学习总览 / 听力 · 2 套」整行去掉，内容直接从科目切换行开始。
         顺带把下面几块重新排一遍：科目行作为首行收掉多余上边距；
         Part 卡片改成按数量自适应等分（原来固定 4 列，只有 3 个 Part 时右边空一列）；
         「最近练习」加一条分隔线，跟上面的卡片区分开 */
  /* 判据用 body.kz-overview（页签状态），不要再用 :has(> .kz-lib-t)：
     那个类是我们自己后加的，Vue 重渲染后要等 1.2s 才补回来，中间整行（含搜索框）会消失 → 闪。 */
  html[data-kz-theme] body.kz-libui.kz-overview .page > .glass > .g-hd{
    display:none!important;
  }
  /* 公共题库列表铺开时（body.kz-haslist），把原站那套重复的列表/筛选收起来 */
  html[data-kz-theme] body.kz-haslist .page > .glass .rows,
  html[data-kz-theme] body.kz-haslist .page > .glass nav.parts,
  html[data-kz-theme] body.kz-haslist .page > .glass .empty,
  html[data-kz-theme] body.kz-haslist .page > .glass .cards,
  /* 客户 2026-11-06：我们自己的列表分页后，原站那个 pager 会多出一排页码，一起收起来 */
  html[data-kz-theme] body.kz-haslist .page > .glass .pager,
  html[data-kz-theme] body.kz-haslist .page > .glass .pagebar,
  html[data-kz-theme] body.kz-haslist .page > .glass > .g-hd .chip{
    display:none!important;
  }
  html[data-kz-theme] body.kz-libui .page > .glass > .skills{
    margin-top:0!important;
  }
  html[data-kz-theme] body.kz-libui .page > .glass .cards{
    grid-template-columns:repeat(auto-fit,minmax(0,1fr))!important;
    gap:12px!important;
  }
  html[data-kz-theme] body.kz-libui .page > .glass .recent{
    margin-top:16px!important;
    padding-top:14px!important;
    border-top:1px solid var(--kz-line)!important;
  }
  /* 2) 解析面板底部四指标：外层那块浅蓝底框改成跟背景同色，只留四个白块 */
  .ex .kz-dstat{
    background:transparent!important;
    border-color:transparent!important;
  }
/* ===== kzImpCss ===== */
  .kz-impbar{
    display:flex;align-items:center;gap:12px;flex-wrap:wrap;
    margin:0 0 14px;padding:12px 14px;border-radius:12px;
    background:var(--kz-acc-soft,rgba(122,162,247,.12));
    border:1px solid var(--kz-acc-line,rgba(122,162,247,.32));
    color:var(--kz-t2,#dbe2f0);font-size:13px;line-height:1.5;
  }
  .kz-impbar .kz-imp-txt{flex:1 1 320px;min-width:220px}
  /* 本地一套卷子都没有（都删掉了）→ 整条发布栏收起来；一导入就会自动回来
     （客户 2026-11-08：下面点删除后，上面不要还留着这根发布条） */
  .kz-impbar.kz-impbar-off{display:none!important}
  .kz-impbar b{color:var(--kz-t1,#fff);font-weight:700}
  .kz-impbar .kz-impdiag{margin-left:6px;font-size:12px;color:var(--kz-t3,#98a2b8);text-decoration:underline;cursor:pointer}
  /* 手动配对：现在是导入页**唯一**的入口（客户 2026-11-08 13:48「只保留手动配对这个，把之前的删了」）。
     section.drop 本身必须留着 —— 「开始解析」要靠它把合成 drop 派发给 SPA，
     所以是「隐藏里面的旧内容」，不是删掉 section。 */
  .drop.kz-drop-manual > *:not(#kzManualInline),
  .drop:has(> #kzManualInline) > *:not(#kzManualInline){display:none!important}
  .drop.kz-drop-manual{padding:18px 16px 14px}
  .kz-mn-inline{margin:0 auto;padding-top:0;border-top:0;
    width:100%;max-width:660px;text-align:center}
  .kz-mn-inline .kz-mn-hd{font-size:15.5px;font-weight:800;color:var(--kz-t1,#111827);margin-bottom:5px}
  .kz-mn-inline .kz-mn-sub{font-size:12px;color:var(--kz-t3,#98a2b8);margin-bottom:11px;line-height:1.6}
  .kz-mn-inline .kz-mn-row{display:flex;align-items:center;justify-content:center;gap:8px;flex-wrap:wrap}
  .kz-mn-inline .kz-mn-pick{display:inline-flex;align-items:center;padding:6px 14px;border-radius:999px;
    border:1px solid var(--kz-acc-line,rgba(122,162,247,.45));cursor:pointer;font-size:12.5px;font-weight:600;
    color:var(--kz-acc,#7aa2f7);
    background:var(--kz-acc-soft,rgba(122,162,247,.06))}
  .kz-mn-inline .kz-mn-pick:hover{background:var(--kz-acc-line,rgba(122,162,247,.18))}
  .kz-mn-inline .kz-mn-pick.kz-hot{border-color:var(--kz-acc,#7aa2f7);background:var(--kz-acc-line,rgba(122,162,247,.24));
    box-shadow:0 0 0 3px var(--kz-acc-soft,rgba(122,162,247,.18))}
  .kz-mn-inline .kz-mn-hd em{font-style:normal;color:var(--kz-acc,#7aa2f7);font-weight:700}
  .kz-mn-inline .kz-mn-go{padding:7px 16px;border-radius:999px;border:0;cursor:pointer;
    font:inherit;font-weight:700;font-size:12.5px;color:#fff;
    background:linear-gradient(135deg,var(--kz-acc,#7aa2f7),var(--kz-acc2,#bb9af7))}
  .kz-mn-inline .kz-mn-go:disabled{opacity:.45;cursor:not-allowed}
  .kz-mn-inline .kz-mn-list{margin-top:9px;font-size:12px;color:var(--kz-t3,#98a2b8);word-break:break-all}
  .kz-mn-inline .kz-mn-list:empty{display:none}
  /* ---- 写作 PDF 直导：解析预览（题面 + 图表 + 9 分范文） ---- */
  .kz-wi[hidden]{display:none!important}
  .kz-wi{margin-top:12px;text-align:left}
  .kz-wi-card{border:1px solid var(--kz-line,#e7eaf3);border-radius:12px;
    background:var(--kz-surface,#fff);padding:12px 14px;
    box-shadow:0 10px 26px -22px rgba(16,24,40,.45)}
  .kz-wi-hd{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:10px}
  .kz-wi-hd b{font-size:13px;font-weight:800;color:var(--kz-t1,#101828)}
  .kz-wi-hd em{font-style:normal;font-size:12px;font-weight:700;color:var(--kz-acc-text,#4338ca)}
  .kz-wi-page{margin-left:auto;font-style:normal;font-size:11.5px;font-weight:700;
    color:var(--kz-acc-text,#4338ca)}
  .kz-wi-tag{font-style:normal;font-size:11px;font-weight:700;line-height:18px;
    padding:0 8px;border-radius:999px;color:var(--kz-t2,#4b5468);
    background:var(--kz-surface-3,rgba(28,33,48,.05));border:1px solid var(--kz-line,#e7eaf3)}
  .kz-wi-body{display:flex;gap:12px;align-items:flex-start;flex-wrap:wrap}
  .kz-wi-fig{flex:0 0 auto;max-width:340px;max-height:230px;width:auto;height:auto;
    border-radius:8px;border:1px solid var(--kz-line,#e7eaf3);background:#fff}
  .kz-wi-txt{flex:1 1 260px;min-width:0}
  .kz-wi-prompt{margin:0 0 8px;font-size:12.5px;line-height:1.75;color:var(--kz-t2,#475467);
    max-height:170px;overflow:auto}
  .kz-wi-sam summary{cursor:pointer;font-size:12px;font-weight:700;color:var(--kz-acc-text,#4338ca)}
  .kz-wi-sam pre{margin:8px 0 0;padding:10px 12px;max-height:150px;overflow:auto;white-space:pre-wrap;
    font-size:12px;line-height:1.75;color:var(--kz-t2,#475467);
    background:var(--kz-surface-3,rgba(28,33,48,.04));border-radius:8px}
  .kz-wi-ft{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:10px;padding-top:10px;
    border-top:1px solid var(--kz-line-2,#eef1f6)}
  .kz-wi-note{flex:1 1 220px;font-size:11.5px;line-height:1.6;color:var(--kz-t3,#98a2b3)}
  .kz-wi-btn{padding:6px 14px;border-radius:999px;cursor:pointer;font:inherit;font-size:12.5px;
    font-weight:700;border:1px solid var(--kz-line,#e7eaf3);color:var(--kz-t2,#475467);
    background:var(--kz-surface,#fff)}
  .kz-wi-btn:hover{border-color:var(--kz-acc-line,rgba(122,162,247,.45))}
  .kz-wi-btn.primary{border:0;color:#fff;
    background:linear-gradient(135deg,var(--kz-acc,#7aa2f7),var(--kz-acc2,#bb9af7))}
  .kz-wi-btn:disabled{opacity:.55;cursor:not-allowed}
  .kz-wi-load{padding:8px 2px;text-align:center;font-size:13px;color:var(--kz-t2,#475467)}
  .kz-wi-dim{margin-top:4px;font-size:11.5px;color:var(--kz-t3,#98a2b3)}
  .kz-wi-spin{display:inline-block;width:16px;height:16px;margin-bottom:8px;border-radius:50%;
    border:2px solid var(--kz-acc-line,rgba(122,162,247,.35));border-top-color:var(--kz-acc,#7aa2f7);
    animation:kzWiSpin .8s linear infinite}
  @keyframes kzWiSpin{to{transform:rotate(360deg)}}
  .kz-wi-ok{padding:8px 2px;font-size:13px;font-weight:700;color:var(--kz-ok,#0f9d58)}
  .kz-wi-err{margin-bottom:8px;padding:8px 12px;border-radius:8px;font-size:12.5px;line-height:1.7;
    color:#b42318;background:#fef3f2;border:1px solid #fecdca}
  .kz-wi-warn{margin-top:6px;font-size:11.5px;line-height:1.6;color:#b54708}
  @media (max-width:640px){.kz-wi-fig{max-width:100%}}
  /* 深色主题里「.drop label:first-of-type」是给原生「选试卷」做渐变主按钮的，
     现在第一个 label 变成了我们的「选文章」，会把三个槽拉成不一致，这里拉回统一外观。 */
  html[data-kz-theme] body.kz-libui .drop .kz-mn-inline .kz-mn-pick{
    background:var(--kz-acc-soft,rgba(122,162,247,.10))!important;
    border:1px solid var(--kz-acc-line,rgba(122,162,247,.45))!important;
    color:var(--kz-acc,#8fb3ff)!important}
  html[data-kz-theme] body.kz-libui .drop .kz-mn-inline .kz-mn-pick:hover{
    background:var(--kz-acc-line,rgba(122,162,247,.20))!important}
  /* 写作预览卡在深色主题下要有一点底色，否则和页面糊在一起 */
  html[data-kz-theme] body.kz-libui .drop .kz-wi-card{
    background:var(--kz-surface-2,rgba(255,255,255,.045))!important;
    border-color:var(--kz-line,rgba(255,255,255,.10))!important;box-shadow:none!important}
  html[data-kz-theme] body.kz-libui .drop .kz-wi-ft{border-top-color:var(--kz-line-2,rgba(255,255,255,.08))!important}
  html[data-kz-theme] body.kz-libui .drop .kz-mn-inline .kz-mn-pick.kz-hot{
    background:var(--kz-acc-line,rgba(122,162,247,.28))!important;border-color:var(--kz-acc,#7aa2f7)!important}
  html[data-kz-theme] body.kz-libui .drop .kz-mn-inline .kz-mn-go{
    background:linear-gradient(135deg,var(--kz-acc,#7aa2f7),var(--kz-acc2,#bb9af7))!important;
    border:0!important;color:#fff!important}
  .kz-impbar em{font-style:normal;color:var(--kz-acc,#7aa2f7);font-weight:700}
  .kz-pub-btn{
    flex:none;cursor:pointer;font:inherit;font-weight:700;font-size:13.5px;
    padding:9px 18px;border-radius:999px;border:0;color:#fff;
    background:linear-gradient(135deg,var(--kz-acc,#7aa2f7),var(--kz-acc2,#bb9af7));
    box-shadow:0 10px 22px -12px var(--kz-acc2,#bb9af7);
    transition:transform .16s ease,filter .16s ease;
  }
  .kz-pub-btn:hover{transform:translateY(-1px);filter:brightness(1.06)}
  .kz-pub-btn:disabled{opacity:.55;cursor:default;transform:none;filter:none}
  .kz-pubrow{display:flex;align-items:center;gap:8px;flex-wrap:wrap;flex:1 1 100%}
  .kz-publab{font-size:12.5px;color:var(--kz-t3,#98a2b8);font-weight:700;letter-spacing:.02em}
  .kz-sel{
    font:inherit;font-size:12.5px;padding:5px 10px;border-radius:999px;cursor:pointer;
    background:var(--kz-surface-2,rgba(255,255,255,.08));
    border:1px solid var(--kz-line,rgba(255,255,255,.18));
    color:var(--kz-t1,#fff);
  }
  .kz-sel:focus{outline:none;border-color:var(--kz-acc,#7aa2f7)}
  /* 客户 2026-11-07 18:36：原生下拉展开后的选项列表要跟主题走。
     之前 option 没写样式 → 弹层是系统白底，文字继承 select 的浅色，等于白底白字看不见。
     ⚠️ option 背景必须是**不透明**色：弹层不叠在页面玻璃上，半透明会透出系统白底。
     选中项高亮 Chromium 会读 option:checked 的 background-color。 */
  .kz-sel option{
    background-color:var(--kz-fill,#14182a);
    color:var(--kz-t1,#eef1f8);
  }
  /* 选中项同样要实色：半透明会透出弹层的系统白底 */
  .kz-sel option:checked{
    background-color:var(--kz-acc,#6366f1);
    color:var(--kz-on-acc,#fff);
  }
  .kz-sel option:disabled{color:var(--kz-t3,#7c869c)}
  /* 客户 2026-11-07 22:10：下拉展开后要「选中的那个颜色深一点、鼠标悬停的那个是同色淡版」。
     Windows 上原生下拉的弹层是系统画的，option:hover / option:checked 的底色根本改不动，
     选中和悬停永远撞同一个系统浅蓝，分不出来。
     Chrome 135+ 的 `appearance: base-select` 能把弹层改成页面内渲染（::picker(select)），
     从此想怎么上色就怎么上色。不支持的浏览器（旧 X5 / 老 Safari）自动退回原生，行为不变；
     触屏设备也保持原生选择器（手机上的原生滚轮比自绘列表好用）。
     颜色规则：选中 = 主题强调色实底，悬停 = 同色兑 22% 到主题底色里（明显浅一档）。 */
  @media (hover:hover) and (pointer:fine){
    @supports (appearance: base-select){
      /* 覆盖**所有** select，不只是 .kz-sel —— 导入页那个「服务商 / 模型」下拉是原站的，
         没有 class，只改 .kz-sel 会漏掉它（客户原话「把导入页其他所有的都改成这样」）。
         只动弹层（::picker）和选项，按钮本身的背景/边框/圆角仍由各页原有 CSS 决定。 */
      select,select::picker(select){appearance:base-select}
      select::picker-icon{color:var(--kz-t2,#9aa4bf)}
      select::picker(select){
        background:var(--kz-fill,#14182a);
        border:1px solid var(--kz-line,rgba(255,255,255,.18));
        border-radius:14px;margin-top:8px;padding:6px;
        box-shadow:0 16px 40px rgba(0,0,0,.45);
      }
      select option{
        background:var(--kz-fill,#14182a);color:var(--kz-t1,#eef1f8);
        padding:7px 14px;border-radius:9px;font-size:12.5px;
      }
      /* 悬停：主题色兑 22% 进底色，明显比选中浅一档 */
      select option:hover{
        background:color-mix(in srgb,var(--kz-acc,#6366f1) 22%,var(--kz-fill,#14182a));
        color:var(--kz-t1,#eef1f8);
      }
      /* 选中：主题强调色实底 + 反白字 + 加粗，比悬停深 */
      select option:checked{
        background:var(--kz-acc,#6366f1);color:var(--kz-on-acc,#fff);font-weight:700;
      }
      select option:disabled{color:var(--kz-t3,#7c869c);background:var(--kz-fill,#14182a)}
      /* 没有 class 的原生 select（导入页那个「模型解析 deepseek-chat」、后台的角色/状态筛选）
         原本靠系统外观撑出边框，切成 base-select 后边框就没了，看着像一行普通文字。
         这里补一套和 .kz-sel 同款的主题外观；有 class 的下拉不受影响。 */
      select:not([class]){
        background:var(--kz-surface-2,rgba(255,255,255,.08));
        border:1px solid var(--kz-line,rgba(255,255,255,.18));
        color:var(--kz-t1,#eef1f8);
        border-radius:999px;padding:5px 10px;font-size:12.5px;cursor:pointer;
      }
      select:not([class]):focus{outline:none;border-color:var(--kz-acc,#6366f1)}
    }
  }
  .kz-pubpick{
    font:inherit;font-size:12.5px;padding:5px 12px;border-radius:999px;cursor:pointer;
    background:transparent;border:1px solid var(--kz-line,rgba(255,255,255,.18));
    color:var(--kz-t2,#c7d0e2);transition:background .14s ease,color .14s ease,border-color .14s ease;
  }
  .kz-pubpick:hover{border-color:var(--kz-acc-line,rgba(122,162,247,.5))}
  .kz-pubpick.on{
    background:linear-gradient(135deg,var(--kz-acc,#7aa2f7),var(--kz-acc2,#bb9af7))!important;
    border-color:transparent!important;color:#fff!important;font-weight:700!important;
  }
  /* 客户 2026-11-07 18:2x：标签分两套，按导入科目自动切换
     听力/阅读/写作 → 高频 + 必考题；口语 → 当季新题 + 必考题 */
  .kz-tagset{display:inline-flex;align-items:center;gap:8px}
  .kz-tagset[hidden]{display:none!important}
  .kz-sel[hidden]{display:none!important}
  /* 客户 2026-11-07 18:33：写作卷没有高频/必考这类标签 → 整行（含逐题标记入口）收起来 */
  .kz-impbar.is-wr .kz-tagrow{display:none!important}
  .kz-impbar.is-wr .kz-qbox{display:none!important}
  .kz-pubhint{font-size:12px;color:var(--kz-t3,#8e98ab)}
  .kz-pub-msg{flex:1 1 100%;font-size:12.5px;color:var(--kz-t3,#98a2b8);min-height:1em}
  .kz-pub-msg.err{color:#f87171}
  .kz-pub-msg.ok{color:#4ade80}
  /* 全部发完：这条不该再像「有一堆待办」那样顶着 → 收成一行淡状态 + 重发入口
     （客户 2026-11-06：都发布过了，别再把已导入的套数当待办挂出来） */
  .kz-donetxt{display:none;flex:1 1 auto;font-size:12.5px;color:var(--kz-t3,#98a2b8)}
  .kz-donetxt b{color:var(--kz-t2,#c7d0e2);font-weight:600}
  .kz-impbar.is-done{
    padding:8px 14px;border-radius:10px;
    background:var(--kz-surface-2,rgba(255,255,255,.05));
    border-color:var(--kz-line,rgba(255,255,255,.14));
    font-size:12.5px;
  }
  .kz-impbar.is-done:not(.kz-open) .kz-donetxt{display:block}
  .kz-impbar.is-done:not(.kz-open) .kz-imp-txt,
  .kz-impbar.is-done:not(.kz-open) .kz-pubrow:not(.kz-tagrow),
  .kz-impbar.is-done:not(.kz-open) .kz-qbox{display:none}
  /* 客户 2026-11-07：标签（高频 / 必考题…）那一行要一直看得到，
     不然「全部发布完」时它跟着收起，找不到勾选的地方。 */
  .kz-impbar.is-done:not(.kz-open) .kz-tagrow{display:flex}
  .kz-impbar.is-done:not(.kz-open) .kz-qtoggle{display:none}
  .kz-impbar.is-done:not(.kz-open) .kz-pub-msg{min-height:0}
  .kz-impbar.is-done:not(.kz-open) .kz-pub-msg:empty{display:none}
  /* 客户 2026-11-07：全部发过了就别再挂一个「重新发布」按钮——容易手滑整份覆盖。
     有新导入（出现待发）时 is-done 会撤掉，按钮自动回来。 */
  .kz-impbar.is-done:not(.kz-open) .kz-pub-btn{display:none}
  /* 导入前的「科目 / Part」设置条：必须在解析之前就能设，所以单独一条放在最上面 */
  .kz-impopt{
    display:flex;align-items:center;gap:8px;flex-wrap:wrap;
    margin:0 0 12px;padding:10px 14px;border-radius:12px;
    background:var(--kz-surface-2,rgba(255,255,255,.06));
    border:1px solid var(--kz-line,rgba(255,255,255,.16));
    font-size:12.5px;color:var(--kz-t2,#c7d0e2);line-height:1.6;
  }
  .kz-impopt .kz-optlab{font-weight:700;color:var(--kz-t3,#98a2b8)}
  .kz-impopt .kz-optsep{width:1px;height:16px;background:var(--kz-line,rgba(255,255,255,.16));margin:0 4px}
  .kz-impopt .kz-optnote{font-size:12px;color:var(--kz-t3,#8e98ab)}
  .kz-impopt .kz-optnote b{color:var(--kz-acc,#7aa2f7)}
  /* 客户 2026-11-07：导入区「选试卷」原来带主色渐变，和「选音频 / 选答案表 / 选文件夹」不一致。
     只锁导入区这四个按钮，别影响交卷等主按钮。 */
  /* 主题里有条同样带 !important 的规则（html[data-kz-theme] body.kz-libui .drop :is(label,button).primary），
     这里必须把特异性抬到比它更高，否则压不住那层主色渐变 */
  html[data-kz-theme] body.kz-libui section.drop :is(label,button).btn.primary,
  html[data-kz-theme] body.kz-libui section.drop :is(label,button).btn.primary:hover,
  html[data-kz-theme] body.kz-libui section.drop :is(label,button).btn.primary:focus{
    background:var(--kz-surface-3,rgba(255,255,255,.09))!important;
    background-image:none!important;
    border:1px solid var(--kz-line,rgba(255,255,255,.09))!important;
    color:var(--kz-t1,#eef1f8)!important;
    box-shadow:none!important;
  }
  /* 逐题标记面板：默认收起，点「逐题标记」才展开 */
  .kz-qtoggle{
    font:inherit;font-size:12.5px;padding:5px 12px;border-radius:999px;cursor:pointer;
    background:transparent;border:1px dashed var(--kz-line,rgba(255,255,255,.24));
    color:var(--kz-t3,#98a2b8);
  }
  .kz-qtoggle:hover{color:var(--kz-t1,#fff);border-color:var(--kz-acc-line,rgba(122,162,247,.5))}
  .kz-qbox{
    flex:1 1 100%;display:none;max-height:320px;overflow:auto;
    margin-top:6px;padding:10px 12px;border-radius:10px;
    background:var(--kz-surface-2,rgba(255,255,255,.05));
    border:1px solid var(--kz-line,rgba(255,255,255,.14));
  }
  .kz-qbox.open{display:block}
  .kz-qbox .kz-qempty{font-size:12.5px;color:var(--kz-t3,#8e98ab)}
  .kz-qbox .kz-qph{font-size:12.5px;font-weight:700;color:var(--kz-t1,#fff);margin:6px 0 4px}
  .kz-qbox .kz-qpub{
    margin-left:6px;padding:0 6px;border-radius:999px;font-size:11px;font-weight:700;
    color:#4ade80;border:1px solid rgba(74,222,128,.45);background:rgba(74,222,128,.12);
  }
  .kz-qbox .kz-qpub.wait{color:#fbbf24;border-color:rgba(251,191,36,.45);background:rgba(251,191,36,.12)}
  .kz-qbox .kz-qpart{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin:2px 0 6px}
  .kz-qbox .kz-qplab{font-size:12px;color:var(--kz-t3,#8e98ab);min-width:96px}
  .kz-qbox .kz-qq{
    display:inline-flex;align-items:center;gap:4px;
    padding:2px 6px;border-radius:8px;
    background:var(--kz-surface,rgba(255,255,255,.06));
    border:1px solid var(--kz-line,rgba(255,255,255,.12));
  }
  .kz-qbox .kz-qn{font-size:11.5px;color:var(--kz-t2,#c7d0e2);min-width:16px;text-align:center}
  .kz-qbox .kz-qt{
    font:inherit;font-size:11px;line-height:1.4;padding:1px 6px;border-radius:999px;cursor:pointer;
    background:transparent;border:1px solid var(--kz-line,rgba(255,255,255,.16));color:var(--kz-t3,#98a2b8);
  }
  .kz-qbox .kz-qt.on{
    background:var(--kz-acc,#7aa2f7);border-color:transparent;color:#fff;font-weight:700;
  }
/* ===== kzGateCss ===== */
  /* 客户 2026-11-07：导入页那块「导入格式 / 兼容 PDF·Word·音频·视频·图片」的说明卡片不要了
     （以后只走 PDF + 音频，固定格式，不需要每次看这段提示）。
     这块（含底部「识别规则」那行）是原站 Import 页独有的 section.formats，只在导入页隐藏。 */
  .page .wrap > section.formats{display:none!important}
  /* 导入门禁：文件不够就不让点「开始解析」 */
  .kz-needbar{
    display:flex;align-items:center;gap:8px;flex-wrap:wrap;
    margin:10px 0 0;padding:9px 14px;border-radius:12px;font-size:12.5px;line-height:1.6;
    background:var(--kz-surface-2,rgba(255,255,255,.06));
    border:1px solid var(--kz-line,rgba(255,255,255,.16));
    color:var(--kz-t2,#c7d0e2);
    transition:border-color .2s,background .2s;
  }
  .kz-needbar.ready{border-color:rgba(74,222,128,.45);background:rgba(74,222,128,.08)}
  .kz-needbar.warn{border-color:rgba(248,113,113,.6);background:rgba(248,113,113,.10)}
  .kz-needbar .kz-ndreq{font-weight:700;color:var(--kz-t3,#98a2b8)}
  .kz-needbar .kz-nd{
    display:inline-flex;align-items:center;gap:4px;
    padding:2px 9px;border-radius:999px;font-size:12px;font-weight:700;
  }
  .kz-needbar .kz-nd.ok{color:#4ade80;background:rgba(74,222,128,.14);border:1px solid rgba(74,222,128,.4)}
  .kz-needbar .kz-nd.no{color:#f87171;background:rgba(248,113,113,.14);border:1px solid rgba(248,113,113,.4)}
  /* 可选槽位（阅读的答案）：不算缺，用琥珀色提醒，不能用红色吓人 */
  .kz-needbar .kz-nd.soft{color:#fbbf24;background:rgba(251,191,36,.14);border:1px solid rgba(251,191,36,.38)}
  .kz-needbar .kz-ndtips{color:var(--kz-t3,#98a2b8);font-size:12px}
  .kz-needbar .kz-ndreset{
    margin-left:auto;font-size:12px;color:var(--kz-t3,#98a2b8);cursor:pointer;
    text-decoration:underline;text-underline-offset:3px;
  }
  .kz-needbar .kz-ndreset:hover{color:var(--kz-t1,#fff)}
  /* Vue 每次重渲染都会把 disabled 复位，所以用样式+点击拦截双重挡 */
  button.kz-gate-off{
    opacity:.42!important;cursor:not-allowed!important;filter:grayscale(.35);
  }
/* ===== kzImplistCss ===== */
  /* 客户 2026-11-07：导入页「已导入 N 套」列表一屏拉不完（46 套 × 50px ≈ 2300px）。
     改成和题库列表一样的分页：一页 10 套，底部页码器（沿用 .kz-ll-pager / .kz-ll-pg 样式，视觉统一）。 */
  .kz-imp-pagefoot{display:flex;align-items:center;justify-content:space-between;gap:12px;
    flex-wrap:wrap;margin-top:10px;padding:10px 8px 4px;border-top:1px solid var(--kz-line,rgba(28,33,48,.10))}
  .kz-imp-pagefoot .kz-ll-pager{padding:0;margin:0}
  .kz-imp-pginfo{font-size:12px;font-weight:600;color:var(--kz-t3,#7b8494);white-space:nowrap}
  .kz-librow-off{display:none!important}
/* ===== kzImpHistCss ===== */
  /* 客户 2026-11-08：导入页下面那块「已导入 N 套」原本把全部历史都摊在页面上（44 套、5 页）。
     现在默认只显示**本次导入**的套卷，历史收进「过往导入」按钮后面：
       · 折叠态：h3（已导入 N 套 / 已用…）和所有历史行都不显示，一套新的都没有时整块收掉
       · 展开态：和以前一样全部列出（分页也回来） */
  .kz-imphist{
    display:flex;align-items:center;gap:10px;flex-wrap:wrap;
    margin:0 0 10px;padding:8px 13px;border-radius:10px;
    background:var(--kz-surface-2,rgba(255,255,255,.06));
    border:1px solid var(--kz-line,rgba(255,255,255,.16));
    font-size:12.5px;color:var(--kz-t3,#98a2b8);line-height:1.6;
  }
  .kz-imphist .kz-ih-t{font-weight:700;color:var(--kz-t2,#c7d0e2)}
  .kz-imphist .kz-ih-t b{color:var(--kz-acc,#7aa2f7);font-weight:800}
  .kz-imphist .kz-ih-empty{font-weight:600;color:var(--kz-t3,#98a2b8)}
  .kz-imphist .kz-ih-q{font-size:12px;color:var(--kz-t3,#8e98ab)}
  .kz-imphist .kz-ih-btn{
    margin-left:auto;cursor:pointer;font:inherit;font-size:12px;font-weight:700;
    padding:5px 12px;border-radius:999px;white-space:nowrap;
    color:var(--kz-t2,#c7d0e2);background:transparent;
    border:1px solid var(--kz-line,rgba(255,255,255,.22));
  }
  .kz-imphist .kz-ih-btn:hover:not(:disabled){
    border-color:var(--kz-acc,#7aa2f7);color:var(--kz-acc,#7aa2f7);
    background:var(--kz-acc-soft,rgba(122,162,247,.10));
  }
  .kz-imphist .kz-ih-btn:disabled{opacity:.4;cursor:default}
  section.lib.imp-list:not(.kz-hist-on) > h3{display:none!important}
  section.lib.imp-list:not(.kz-hist-on) > .kz-librow-hist{display:none!important}
  section.lib.imp-list.kz-hist-empty:not(.kz-hist-on){display:none!important}
  section.lib.imp-list.kz-hist-on > .kz-librow-hist{opacity:.72}
/* ===== kzLlmKeyCss ===== */
  /* 客户 2026-11-07：模型接入的 API Key 不想每次重输，但要有「切换」按钮。
     Key 其实一直存在服务器（data/settings.json），只是原站输入框永远留空、看着像没保存。
     这里：
       已保存 → 输入框收起，显示「已保存 sk-d0••••500d」+【更换】（和旁边字段同高，不挤行）
       点更换 → 输入框出来、右侧浮出【取消】，行高不变（按钮绝对定位，不占位）
     留空点「保存并测试」＝沿用原来的 Key，不会被清掉。 */
  .llm label.kz-keywired{position:relative}
  .kz-keyline{display:flex;align-items:center;gap:8px;margin:0}
  .kz-keyline[hidden]{display:none!important}
  .kz-keyshow{
    flex:1 1 auto;min-width:0;height:32px;display:flex;align-items:center;gap:7px;
    padding:0 10px;border-radius:6px;box-sizing:border-box;
    border:1px dashed var(--kz-line,rgba(28,33,48,.22));
    background:var(--kz-surface-2,rgba(28,33,48,.035));
    color:var(--kz-t3,#7b8494);font-size:12.5px;line-height:1;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .kz-keyshow b{
    font-weight:700;color:var(--kz-t1,#1c2130);overflow:hidden;text-overflow:ellipsis;
    font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;letter-spacing:.2px}
  .kz-keyshow .kz-ok{
    flex:0 0 auto;padding:2px 7px;border-radius:999px;font-size:10.5px;font-weight:800;line-height:1.5;
    color:#0f7a45;background:rgba(34,197,94,.14);border:1px solid rgba(34,197,94,.35)}
  .kz-keybtn{
    flex:0 0 auto;height:30px;padding:0 11px;border-radius:6px;cursor:pointer;
    border:1px solid var(--kz-line,rgba(28,33,48,.18));background:transparent;
    color:var(--kz-t2,#41506b);font:inherit;font-size:12px;font-weight:700;
    transition:border-color .15s,color .15s,background .15s}
  .kz-keybtn:hover{border-color:var(--kz-acc,#4f46e5);color:var(--kz-acc-text,#4f46e5);
    background:var(--kz-surface-3,rgba(79,70,229,.06))}
  /* 已保存且没在编辑时，把那个永远空的密码框收起来 */
  .llm label.kz-keyed > input[type=password]{display:none!important}
  /* 编辑态：取消按钮浮在输入框右侧，不额外占一行，行高和其它字段保持一致 */
  .llm label.kz-editing > .kz-keyline{
    position:absolute;right:0;bottom:0;height:32px;margin:0;gap:0}
  .llm label.kz-editing > .kz-keyline .kz-keyshow{display:none}
  .llm label.kz-editing > input[type=password]{padding-right:62px}
/* ===== kzNoShiftCss ===== */
  /* 客户 2026-11-07：切到听力/阅读/写作时，原站的「听力题库 共 N 套」会先露一帧，看着闪。
     点标签的瞬间先把原站内容藏住，等「标题和当前标签对上、行也渲染出来」再放开
     （实测内容 60~80ms 就绪，不会出现长时间空白）。
     开关放在 <html> 的 data 属性上——body 的 class 会被原站整块重写，加在 body 上会被冲掉。 */
  html[data-kz-await] .page > .glass{visibility:hidden!important}
/* ===== kzFrameCss ===== */
  /* ================= 答题页统一框架（听力 / 阅读同一套） ================= */
  .ex{
    --kz-f-radius:14px;
    --kz-f-gap:12px;
    --kz-f-line:rgba(28,33,48,.10);
    --kz-f-bg:#fff;
    --kz-f-soft:#f6f8fc;
  }

  /* —— 去线条：题目间横线、顶栏底部横线、左右栏大边框都去掉（客户 2026-11-04：不要这么多框/线） —— */
  .ex .qpanel .q{border-bottom:0!important}
  .ex .ex-hd{border-bottom:0!important}
  .ex .ex-body{border:0!important;box-shadow:none!important}
  /* 填空输入框：去掉粉色描边，改成极淡下划线式（保留可填写的辨识度但不那么"框"） */
  .ex .blank-wrap{border:0!important;border-bottom:1px solid #e3e6ee!important;border-radius:0!important}
  /* 客户 2026-11-05：空格「内框」（input 自身）原来是琥珀色描边，看着像警告；
     换成白底 + 蓝描边。
     客户 2026-11-09：默认**不给任何空格画框** —— 原站按「滚动到哪题」加 .current，
     经常框在根本没点的那题上（截图里第 1 题）。这里把 .current 的框抹平，
     只保留「真正点进去 / 聚焦」的那个空格的蓝框。 */
  .ex .blank-wrap.current .blank{
    background:transparent!important;
    border-color:transparent!important;
    box-shadow:none!important}
  .ex .blank-wrap .blank:focus{
    background:#fff!important;
    border-color:#5b8fc9!important;
    box-shadow:none!important;
    outline:0!important}
  /* 客户 2026-11-10：复盘页（做完听力/阅读看解析）也要「点哪一题，哪个空带框」。
     复盘时原站本来就会把 .current 同步到点的那道题（点题号 / 点题卡都行），
     但上面那条规则把所有 .current 的框都抹平了，而复盘里的输入框是 disabled、
     永远聚焦不到，于是看起来完全没反应。这里只对复盘（.q.review）恢复蓝框，
     样式与作答页聚焦时保持一致。 */
  .ex .q.review .blank-wrap.current .blank{
    background:#fff!important;
    border-color:#5b8fc9!important;
    box-shadow:0 0 0 2px rgba(91,143,201,.14)!important}
  .ex .q.review .blank-wrap.current{border-bottom-color:transparent!important}
  /* 复盘：当前题卡统一淡蓝底（选择题 / 判断题 / 填空都有，不再只有填空题有反应）。
     客户 2026-11-10：左边那条竖条看着像「半个框」，删掉，只留淡蓝底。 */
  .ex .q.review.kz-rev-cur{
    background:#eef4ff!important;
    border-radius:8px}
  .ex .q.review.kz-rev-cur .qno{color:#1d4ed8!important}
  /* 去掉 SPA 给「当前空格」加的那圈琥珀色光晕 */
  .ex .blank-wrap:focus-within{box-shadow:none!important}
  /* 聚焦的空格有了自己的框，底部那条下划线就不再画，避免「框下面还拖一条线」 */
  .ex .blank-wrap:focus-within{border-bottom-color:transparent!important}

  /* —— 上框：Part + 英文标题 + 中文 + 说明 —— */
  .ex .kz-frame{
    margin:10px 16px 0;padding:16px 20px 15px;
    background:var(--kz-f-bg);border:1px solid var(--kz-f-line);
    border-radius:var(--kz-f-radius) var(--kz-f-radius) 0 0;
    box-sizing:border-box;position:relative;
  }
  .ex .kz-frame.no-audio{border-radius:var(--kz-f-radius);margin-bottom:var(--kz-f-gap)}
  .ex .kz-f-en{
    display:block;margin:0;font-size:22px;line-height:1.35;font-weight:800;
    letter-spacing:-.01em;color:#101828;word-break:break-word;
  }
  .ex .kz-f-en:empty{display:none}
  .ex .kz-f-zh{
    display:block;margin:4px 0 0;font-size:14.5px;line-height:1.6;font-weight:500;
    color:#667085;word-break:break-word;
  }
  .ex .kz-f-zh:empty{display:none}

  /* 客户 2026-11-05：答题页顶部那张「英文标题 + 中文标题」卡整行删掉，直接进题目/音频条 */
  .ex .kz-frame{display:none!important}

  /* —— 音频条：紧贴上框下沿，占满宽度，语速固定右侧 —— */
  .ex .ap-file{
    margin:10px 16px 0!important;padding:11px 20px!important;
    border:1px solid var(--kz-f-line)!important;
    border-radius:var(--kz-f-radius)!important;
    background:var(--kz-f-soft)!important;box-sizing:border-box;
    display:flex!important;align-items:center;gap:14px;
  }
  .ex .ap.exam .ap-file .af-l{display:none!important}
  /* 客户 2026-11-05 15:05：听力复盘页的音频条要和答题页完全一致 —— 通栏、顶栏下方、两栏之上。
     SPA 进复盘会把 .ap 藏起来并塞进左栏，kzAudioLift 每 600ms 把它搬回 .ex（.ex-body 之前）。 */
  .ex > .ap{display:block!important}
  .ex .ap-file .af-l b{
    font-size:12.5px!important;font-weight:700;color:#475467!important;
    background:#fff;border:1px solid var(--kz-f-line);border-radius:7px;padding:4px 9px}
  .ex .ap-file .af-l span{display:none!important}
  /* 客户 2026-11-04：上轮铺满整行太大，改回原版紧凑条再放大一点点；靠右（客户要求放最右） */
  .ex .ap-file .kz-audio{
    flex:0 0 auto!important;width:auto!important;margin:0 0 0 auto!important;
    background:#fff!important;border:1px solid var(--kz-f-line);
    height:36px!important;padding:0 10px!important;gap:9px!important;
    border-radius:9px!important;box-shadow:none!important;
    position:static!important;transform:none!important;left:auto!important;bottom:auto!important;
  }
  .ex .ap-file .kz-audio .kz-a-play{font-size:13px!important;width:18px!important}
  .ex .ap-file .kz-audio .kz-a-time{font-size:12px!important;min-width:36px!important}
  .ex .ap-file .kz-audio .kz-a-bar{
    flex:0 0 auto!important;width:210px!important;height:6px!important;border-radius:3px!important}
  .ex .ap-file .kz-audio .kz-a-rate{
    flex:0 0 auto;height:26px!important;min-width:50px!important;min-height:0!important;
    box-sizing:border-box!important;align-self:center!important;
    border-radius:7px;background:#eef0fe;color:#4338ca}
  @media (max-width:760px){
    .ex .ap-file .kz-audio{height:34px!important;padding:0 8px!important;gap:7px!important}
    .ex .ap-file .kz-audio .kz-a-bar{flex:1 1 auto!important;width:auto!important;min-width:70px}
    .ex .ap-file .kz-audio .kz-a-time{min-width:30px!important;font-size:11.5px!important}
  }

  /* —— 下框：题目区 —— */
  .ex-body{
    margin:var(--kz-f-gap) 16px 0!important;border-radius:var(--kz-f-radius)!important;
    overflow:hidden;background:var(--kz-f-bg);
    border:1px solid var(--kz-f-line);box-sizing:border-box}

  /* —— 底栏：两页同一套 —— */
  .ex .ex-ft{
    margin:var(--kz-f-gap) 16px 14px!important;border:1px solid var(--kz-f-line)!important;
    border-radius:var(--kz-f-radius)!important;background:var(--kz-f-bg)!important;
    padding:9px 14px!important;box-sizing:border-box;
  }
  .ex .ex-ft .ft-part,
  .ex .rb-part{
    font-size:12.5px!important;font-weight:700;color:#475467!important;
    background:var(--kz-f-soft);border:1px solid var(--kz-f-line);
    border-radius:7px;padding:5px 10px;margin-right:10px;
  }
  .ex .ex-ft .ftn{border-radius:7px!important;font-size:12.5px!important;font-weight:600}
  .ex .ex-ft .ft-arrow{border-radius:7px!important}

  .ex .doccol .doc-top .part-tabs{display:none!important}
  .ex .kz-partbar{display:none!important}

  /* 客户 2026-11-05：阅读和听力都在正文上方显示「考试指导语 + 文章标题」
     阅读：指导语在上、标题居中、下面是分段原文；听力没有原文栏，用 qp-hd 顶在题目上方 */
  .ex .doccol .doc-ins{
    display:block!important;
    margin:12px 0 8px!important;
    font-size:12.5px!important;line-height:1.65!important;color:#8b93a4!important}
  .ex .doccol .passage > h1{
    display:block!important;
    margin:0 0 14px!important;text-align:center;
    font-size:21px!important;line-height:1.35!important;font-weight:800!important;
    color:#101828!important;letter-spacing:.01em}
  /* 客户 2026-11-05 14:38：听力的大标题保留（顶栏那个小的才不要），
     指导语那一行仍然隐藏（题目列表里本来就有「Questions 1–10…」） */
  .ex .qpanel .qp-hd{
    display:flex!important;flex-direction:column-reverse!important;
    height:auto!important;min-height:0!important;margin:0!important;
    padding:12px 16px 10px!important;
    border-bottom:0!important}
  .ex .qpanel .qp-hd > span{display:none!important}
  .ex .qpanel .qp-hd > h2{
    display:block!important;margin:0!important;text-align:center;
    font-size:20px!important;line-height:1.35!important;font-weight:800!important;
    color:#101828!important;letter-spacing:.01em}
  /* 手机宽度放不下 20px 的中英双标题（会折成两行），缩到 16.5px 一行放完 */
  @media (max-width:760px){
    .ex .qpanel .qp-hd{padding:10px 14px 8px!important}
    .ex .qpanel .qp-hd > h2{font-size:16.5px!important;line-height:1.45!important}
  }

  /* 解析模式下音频条只剩半栏宽，和上框对不齐；交卷后也不再需要播放 */
  .ex:has(.revdock) .ap{display:none!important}
  .ex:has(.revdock) .doccol{padding-top:4px!important}
  /* 解析模式下顶部标题框是多余的（解析面板自带「答案与解析」标题） */
  .ex:has(.revdock) .kz-frame{display:none!important}

  /* 阅读页原文列顶到上框下面，去掉重复留白 */
  .ex-body.split{padding:0!important}
  .ex .doccol{padding-top:0!important}

  @media (max-width:760px){
    .ex .kz-frame,.ex .ap-file{margin-left:10px!important;margin-right:10px!important}
    .ex .kz-frame{padding:13px 14px 12px}
    .ex .kz-f-en{font-size:18px}
    .ex .kz-f-zh{font-size:13.5px}
    .ex .kz-f-part{font-size:12px;padding:6px 10px}
    .ex-body{margin-left:10px!important;margin-right:10px!important}
    .ex .ex-ft{margin-left:10px!important;margin-right:10px!important}
  }
/* ===== kzTrialCss ===== */
  /* 体验卷（宣传页「开始体验」进来的那套）：不需要「记录」按钮，也不做正确率统计
     （客户 2026-11-05）。标记由下面的脚本按 sessionStorage['kz.trial.src'] 打上。 */
  html.kz-trial .ex-hd .hd-r .kz-trial-hide{display:none!important}
  html.kz-trial .kz-dstat{display:none!important}
  /* 没了四指标，面板不用再留固定高度，按内容收紧、把空间让给题目区 */
  html.kz-trial .ex .revdock,
  html.kz-trial .ex .revdock:has(> .kz-notebar),
  html.kz-trial .ex .revdock:has(> .kz-notebar.open){
    height:auto!important;min-height:0!important}
  /* 游客（临时体验账号）不保存任何东西：写笔记入口一并收掉 */
  html.kz-guest .ex .kz-notebar,
  html.kz-guest .ex .q-hd > .kz-qbtn{display:none!important}
/* ===== kzSplitCss ===== */
  /* 复盘面板上沿那条分隔：原来只有 row-resize 光标，拖不动（拖的时候还会把文字选中成蓝色）。
     客户 2026-11-05 要「可以拖」。这里给它一条看得见的小握把，并接管拖拽。 */
  .ex .split-h{cursor:row-resize!important;touch-action:none;position:relative}
  .ex .split-h::before{content:'';position:absolute;left:0;right:0;top:-5px;bottom:-5px}
  .ex .split-h::after{
    content:'';position:absolute;left:50%;top:50%;width:46px;height:4px;
    transform:translate(-50%,-50%);border-radius:3px;
    background:rgba(99,102,241,.30);transition:background .15s ease}
  .ex .split-h:hover::after,body.kz-splitting .ex .split-h::after{
    background:#fff;box-shadow:0 0 0 1px rgba(15,23,42,.10)}
  body.kz-splitting,body.kz-splitting *{cursor:row-resize!important;user-select:none!important}
/* ===== kzHdTitleCss ===== */
  /* 客户 2026-11-05：试卷题目要显示出来，位置放在左上「计时」右边。
     标题卡删掉之后，题目名只在解析面板里能看到，答题时看不到。 */
  .ex .ex-hd .hd-timer .kz-hd-title{
    display:inline-block!important;margin-left:10px;
    font-style:normal;font-size:13px;font-weight:600;line-height:1.3;
    color:#334155;vertical-align:middle;
    max-width:46vw;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  @media (max-width:760px){.ex .ex-hd .hd-timer .kz-hd-title{display:none!important}}

/* ===== 答题页 A−/A+ 字号 =====
   kzExamZoomJs 把系数写到 .ex-body 的 --read-scale / --kz-ts / --fs-* 上；
   题面和题干/选项由 App 自己的 CSS 消费这些变量，只有写作页的题面与输入框是写死 px，
   这里补一条让它们也跟随同一系数（不改外框尺寸，避免影响交卷）。 */
.ex .ex-body article.prompt{font-size:calc(14px * var(--kz-ts, 1))}
.ex .ex-body article.prompt .prompt-t{font-size:calc(15px * var(--kz-ts, 1))}
.ex .ex-body .edcol textarea.editor{font-size:calc(14.5px * var(--kz-ts, 1))!important}

/* ===== kzLFigDockCss =====
   客户 2026-11-09：听力带图卷（Bike / Fitchton / Gym / Zoo）按题库格式排版 ——
   左半栏上半是录音稿（原文音频）、下半是题面图，右半栏仍是题目 + 答案解析；
   体验卷和题库卷同一套。图绝不能作为 .ex-body 的第 4 个 grid 子项：那样 qpanel
   会被挤到左栏、图跑到右栏，就是「左右颠倒」。 */
.ex .ex-body.split > .kz-lfig{display:none!important}
.ex .ex-body.split .doccol.kz-lfig-on{
  display:flex!important;flex-direction:column!important;
  min-height:0!important;height:100%!important;overflow:hidden!important}
.ex .ex-body.split .doccol.kz-lfig-on > .tr-panel{
  flex:1 1 auto!important;min-height:0!important;max-height:none!important;
  overflow-y:auto!important;overflow-x:hidden!important;overscroll-behavior:contain}
/* 答案速查是原站功能，保留但收紧成一条，别把上半区的录音稿挤没了 */
.ex .ex-body.split .doccol.kz-lfig-on > .kz-docans{
  flex:0 0 auto!important;margin:6px 12px 4px!important;padding:6px 10px!important;
  border-radius:8px!important}
.ex .ex-body.split .doccol.kz-lfig-on > .kz-docans h4{margin:0 0 4px!important;font-size:12px!important}
.ex .ex-body.split .doccol.kz-lfig-on > .kz-docans li{line-height:1.45!important;font-size:12px!important}
.ex .ex-body.split .doccol.kz-lfig-on > .kz-lfig{
  flex:0 0 46%!important;min-height:0!important;max-height:46%!important;
  margin:0!important;padding:8px 12px 10px!important;max-width:none!important;
  border:0!important;border-top:1px solid #e7e9f0!important;border-radius:0!important;
  background:#fff!important;box-sizing:border-box;
  overflow-y:auto!important;overflow-x:hidden!important;overscroll-behavior:contain}
/* 地图题要一眼看全 A-H，按容器高度等比缩放、居中，不裁掉半张图 */
.ex .ex-body.split .doccol.kz-lfig-on > .kz-lfig img{
  display:block!important;width:auto!important;max-width:100%!important;
  height:auto!important;max-height:100%!important;margin:0 auto!important}
.ex .ex-body.split .doccol.kz-lfig-on > .kz-lfig figcaption{margin-top:6px}
@media (max-width:760px){
  .ex .ex-body.split .doccol.kz-lfig-on{height:auto!important;max-height:none!important}
  .ex .ex-body.split .doccol.kz-lfig-on > .tr-panel{max-height:38vh!important}
  .ex .ex-body.split .doccol.kz-lfig-on > .kz-lfig{flex:0 0 auto!important;max-height:38vh!important}
}
/* 复盘左栏「原文待导入」空框：原站只在 aria-label 里写了原因，视觉上就是一块空白，
   客户以为页面坏了。这里补一句能看见的说明。 */
.ex .doccol .tr-blank{display:flex;align-items:center;justify-content:center;padding:18px}
.ex .doccol .tr-blank::after{
  content:'这套听力还没有录音稿 —— 重新导入时把 PDF 里的原文页一起放进来';
  color:var(--kz-t3,#98a2b8);font-size:12.5px;line-height:1.7;text-align:center;max-width:280px
}

/* ---- 口语三件套直导：预览表单（题目 / 回答 / 分类） ---- */
.kz-sp-l{display:block;margin:8px 0 4px;font-size:12px;font-weight:700;color:var(--kz-t2,#475467)}
.kz-sp-in,.kz-sp-ta{width:100%;box-sizing:border-box;border:1px solid var(--kz-line,#e7eaf3);border-radius:8px;
  padding:8px 10px;font:inherit;font-size:13px;color:var(--kz-t1,#101828);background:var(--kz-surface,#fff)}
.kz-sp-ta{min-height:110px;resize:vertical;line-height:1.6}
.kz-sp-meta{margin:8px 0 0;font-size:11.5px;color:var(--kz-t3,#98a2b8);word-break:break-all}

/* ---- 宣传页「进入模考」：复盘页底部的继续按钮 ---- */
.kz-flow{position:fixed;right:20px;bottom:96px;z-index:2147483000}
.kz-flow-btn{display:inline-flex;align-items:center;gap:8px;padding:11px 22px;border:0;border-radius:999px;
  cursor:pointer;font:inherit;font-size:14px;font-weight:700;color:#fff;
  background:linear-gradient(135deg,#635bff,#8b5cf6);box-shadow:0 14px 32px -14px rgba(99,91,255,.7)}
.kz-flow-btn i{font-style:normal;font-size:13px;opacity:.9}

/* 一键导入（客户 2026-11-10）：解析 + 体检 + 发布一条龙。
   它是主操作，用深色实心；「开始解析」保持原来的浅渐变，两者一眼能分开。 */
.kz-mn-inline .kz-mn-one{
  padding:8px 18px;border-radius:999px;border:0;cursor:pointer;
  font:inherit;font-weight:700;font-size:12.5px;color:#fff;
  background:linear-gradient(135deg,#4c6ef5,#7048e8);
  box-shadow:0 8px 20px -14px rgba(76,110,245,.9);
  transition:filter .15s ease,opacity .15s ease}
.kz-mn-inline .kz-mn-one:hover{filter:brightness(1.07)}
.kz-mn-inline .kz-mn-one:disabled{opacity:.6;cursor:progress;filter:none}
html[data-kz-theme] body.kz-libui .drop .kz-mn-inline .kz-mn-one{
  background:linear-gradient(135deg,#4c6ef5,#7048e8)!important;
  border:0!important;color:#fff!important}
